farleyknight-ionize 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +59 -0
- data/Rakefile +5 -0
- data/bin/ionize +47 -0
- data/lib/ionize.rb +75 -0
- data/lib/ionize/environment.rb +56 -0
- data/lib/ionize/environment/application.rb +58 -0
- data/lib/ionize/environment/php_array.rb +95 -0
- data/lib/ionize/parser.rb +272 -0
- data/lib/ionize/tokenizer.rb +544 -0
- data/lib/ionize/translate.rb +34 -0
- data/lib/ionize/translate/composite_string_statements.rb +79 -0
- data/lib/ionize/translate/debug.rb +16 -0
- data/lib/ionize/translate/ext.rb +47 -0
- data/lib/ionize/translate/function_args.rb +132 -0
- data/lib/ionize/translate/if_statements.rb +42 -0
- data/lib/ionize/translate/multiple_statements.rb +22 -0
- data/lib/ionize/translate/php_to_ruby.rb +40 -0
- data/lib/ionize/translate/rails_for_php.rb +191 -0
- data/lib/ionize/translate/rewritable.rb +133 -0
- data/lib/ionize/translate/rewrites.rb +51 -0
- data/lib/ionize/translate/statements.rb +622 -0
- data/lib/ionize/translate/switch_case_statements.rb +52 -0
- data/lib/ionize/translate/term_statements.rb +76 -0
- data/lib/ionize/translate/translator.rb +52 -0
- data/lib/ionize/version.rb +9 -0
- data/spec/fixtures/array_lookup.php +10 -0
- data/spec/fixtures/boolean_operators.php +5 -0
- data/spec/fixtures/boolean_operators.rb +6 -0
- data/spec/fixtures/class_def.php +34 -0
- data/spec/fixtures/class_def.rb +34 -0
- data/spec/fixtures/dangling_else.php +8 -0
- data/spec/fixtures/dangling_else.rb +12 -0
- data/spec/fixtures/drupal_1.php +663 -0
- data/spec/fixtures/drupal_2.php +1152 -0
- data/spec/fixtures/empty_string.php +12 -0
- data/spec/fixtures/for_loop.php +17 -0
- data/spec/fixtures/for_loop2.php +13 -0
- data/spec/fixtures/for_loop3.php +16 -0
- data/spec/fixtures/for_loop3.rb +17 -0
- data/spec/fixtures/for_loop4.php +5 -0
- data/spec/fixtures/for_loop4.rb +6 -0
- data/spec/fixtures/foreach.php +9 -0
- data/spec/fixtures/foreach2.php +8 -0
- data/spec/fixtures/foreach3.php +7 -0
- data/spec/fixtures/foreach3.rb +7 -0
- data/spec/fixtures/fun_def.php +9 -0
- data/spec/fixtures/fun_def2.php +30 -0
- data/spec/fixtures/fun_def2.rb +30 -0
- data/spec/fixtures/fun_def3.php +33 -0
- data/spec/fixtures/fun_def4.php +43 -0
- data/spec/fixtures/fun_def4.rb +37 -0
- data/spec/fixtures/fun_def5.php +36 -0
- data/spec/fixtures/fun_with_if.php +6 -0
- data/spec/fixtures/fun_with_if.rb +6 -0
- data/spec/fixtures/fun_with_ifs.php +12 -0
- data/spec/fixtures/fun_with_ifs.rb +14 -0
- data/spec/fixtures/hello_world.php +6 -0
- data/spec/fixtures/heredoc.php +6 -0
- data/spec/fixtures/heredoc.rb +5 -0
- data/spec/fixtures/if.php +6 -0
- data/spec/fixtures/if.rb +7 -0
- data/spec/fixtures/if_boolean.php +5 -0
- data/spec/fixtures/if_boolean.rb +5 -0
- data/spec/fixtures/if_else.php +11 -0
- data/spec/fixtures/if_else1.php +17 -0
- data/spec/fixtures/if_else2.php +8 -0
- data/spec/fixtures/if_else3.php +15 -0
- data/spec/fixtures/if_else_nested.php +14 -0
- data/spec/fixtures/if_else_nested.rb +15 -0
- data/spec/fixtures/if_else_series.php +12 -0
- data/spec/fixtures/if_else_series.rb +12 -0
- data/spec/fixtures/if_not.php +5 -0
- data/spec/fixtures/if_not.rb +5 -0
- data/spec/fixtures/if_with_brackets.php +7 -0
- data/spec/fixtures/if_with_brackets.rb +7 -0
- data/spec/fixtures/long_if_else.php +10 -0
- data/spec/fixtures/long_if_else.rb +9 -0
- data/spec/fixtures/oo.php +16 -0
- data/spec/fixtures/php_nuke/sql_layer.php +527 -0
- data/spec/fixtures/postop.php +3 -0
- data/spec/fixtures/preop.php +7 -0
- data/spec/fixtures/simple_fun_def.php +4 -0
- data/spec/fixtures/switch_case.php +13 -0
- data/spec/fixtures/switch_case.rb +14 -0
- data/spec/fixtures/switch_case2.php +25 -0
- data/spec/fixtures/switch_case3.php +40 -0
- data/spec/fixtures/switch_case3.rb +42 -0
- data/spec/fixtures/switch_case4.php +56 -0
- data/spec/fixtures/switch_case5.php +71 -0
- data/spec/fixtures/switch_case_with_rescue_nil.php +43 -0
- data/spec/fixtures/switch_case_with_rescue_nil.rb +35 -0
- data/spec/fixtures/tertiary.php +3 -0
- data/spec/helper.rb +17 -0
- data/spec/php_environment_spec.rb +83 -0
- data/spec/php_parser_spec.rb +121 -0
- data/spec/php_translator_spec.rb +358 -0
- data/spec/rails_for_php_spec.rb +303 -0
- metadata +191 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
load 'ionize/translate/debug.rb'
|
3
|
+
load 'ionize/translate/ext.rb'
|
4
|
+
load 'ionize/translate/translator.rb'
|
5
|
+
load 'ionize/translate/function_args.rb'
|
6
|
+
load 'ionize/translate/statements.rb'
|
7
|
+
load 'ionize/translate/rewrites.rb'
|
8
|
+
load 'ionize/translate/php_to_ruby.rb'
|
9
|
+
|
10
|
+
module Ionize
|
11
|
+
module Php
|
12
|
+
module Translate
|
13
|
+
def self.flatten(node)
|
14
|
+
if node.is_a? Array
|
15
|
+
node.collect {|n| flatten(n) }
|
16
|
+
elsif node.is_a? Dhaka::ParseSuccessResult
|
17
|
+
flatten(node.child_nodes)
|
18
|
+
elsif node.is_a? Dhaka::ParseTreeCompositeNode
|
19
|
+
{node.production.name.to_sym => flatten(node.child_nodes)}
|
20
|
+
elsif node.is_a? Dhaka::ParseTreeLeafNode
|
21
|
+
flatten(node.token)
|
22
|
+
elsif node.is_a? Dhaka::Token
|
23
|
+
{node.symbol_name.to_sym => node.value}
|
24
|
+
else
|
25
|
+
raise "Cannot handle type #{node.class}!"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.translate(ast)
|
30
|
+
Statements.new(self).transform(flatten(ast)).to_block
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Ionize
|
2
|
+
module Php
|
3
|
+
module Translate
|
4
|
+
module CompositeStringStatements
|
5
|
+
def handle_multiple_nodes(node)
|
6
|
+
debug "Multiple nodes #{node.inspect}"
|
7
|
+
|
8
|
+
first = transform(node.first)
|
9
|
+
second = transform(node.second)
|
10
|
+
|
11
|
+
debug "Multiple nodes results #{first.inspect} #{second.inspect}"
|
12
|
+
|
13
|
+
if second.nil?
|
14
|
+
first
|
15
|
+
elsif second.composite_node?
|
16
|
+
if first.composite_node?
|
17
|
+
first + second
|
18
|
+
else
|
19
|
+
[first] + second
|
20
|
+
end
|
21
|
+
elsif first.composite_node?
|
22
|
+
first + [second]
|
23
|
+
else
|
24
|
+
[first, second]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def handle_open_double_quoted_string(node)
|
29
|
+
node
|
30
|
+
end
|
31
|
+
|
32
|
+
def handle_double_quoted_string_node(node)
|
33
|
+
# puts "double_quoted_string_node #{node.inspect}"
|
34
|
+
# string = eval(node)
|
35
|
+
string = node
|
36
|
+
(string.empty?) ? nil : [:str, string]
|
37
|
+
end
|
38
|
+
|
39
|
+
def handle_single_node(node)
|
40
|
+
transform(node)
|
41
|
+
end
|
42
|
+
|
43
|
+
def handle_double_string_within_string(node)
|
44
|
+
transform(node)
|
45
|
+
end
|
46
|
+
|
47
|
+
def handle_variable_within_string(node)
|
48
|
+
[:evstr, transform(node.first)]
|
49
|
+
end
|
50
|
+
|
51
|
+
def handle_array_lookup_within_string(node)
|
52
|
+
transform(node)
|
53
|
+
end
|
54
|
+
|
55
|
+
def handle_array_lookup_node(node)
|
56
|
+
param = if node =~ /(\$.*?)\[(\$.*)\]/
|
57
|
+
match = node.match(/(\$.*?)\[(\$.*)\]/)
|
58
|
+
[:lvar, match[2].to_s.gsub("$", "").to_sym]
|
59
|
+
elsif node =~ /(\$.*?)\[(.*)\]/
|
60
|
+
match = node.match(/(\$.*?)\[(.*)\]/)
|
61
|
+
[:str, match[2]]
|
62
|
+
end
|
63
|
+
[:evstr, [:call, transform(:variable => match[1]), :[], [:array, param]]]
|
64
|
+
end
|
65
|
+
|
66
|
+
def handle_composite_double_string(node)
|
67
|
+
initial = transform(node.first)
|
68
|
+
body = transform(node.second)
|
69
|
+
|
70
|
+
if body.composite_node?
|
71
|
+
[:dstr, initial] + body
|
72
|
+
else
|
73
|
+
[:dstr, initial, body]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
class Array
|
3
|
+
{:first => 0, :second => 1, :third => 2, :fourth => 3, :fifth => 4, :sixth => 5}.each do |name, value|
|
4
|
+
define_method(name) { self[value] }
|
5
|
+
end
|
6
|
+
|
7
|
+
def rest
|
8
|
+
self[1..-1]
|
9
|
+
end
|
10
|
+
|
11
|
+
def replace_pattern(pattern, value)
|
12
|
+
copy = self.dup
|
13
|
+
(0..copy.length).each do |i|
|
14
|
+
if copy[i] == pattern
|
15
|
+
copy[i] = value
|
16
|
+
elsif copy[i].is_a? Array
|
17
|
+
copy[i] = copy[i].replace_pattern(pattern, value)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
copy
|
21
|
+
end
|
22
|
+
|
23
|
+
def composite_node?
|
24
|
+
self.first.is_a? Array
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_block
|
28
|
+
if self.composite_node?
|
29
|
+
[:block] + self
|
30
|
+
else
|
31
|
+
self
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Symbol
|
37
|
+
def to_global_variable
|
38
|
+
[:gvar, ("$" + self.to_s.gsub("$", "")).to_sym]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Hash
|
43
|
+
def node_type
|
44
|
+
raise "Cannot use hash as node with more than one key!" unless keys.length == 1
|
45
|
+
keys.first
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module Ionize
|
2
|
+
module Php
|
3
|
+
module Translate
|
4
|
+
class FunctionArgs < Translator
|
5
|
+
include Debug
|
6
|
+
|
7
|
+
attr_accessor :assigns
|
8
|
+
|
9
|
+
def handle_term(node)
|
10
|
+
transform(node)
|
11
|
+
end
|
12
|
+
|
13
|
+
def handle_single_arg(node)
|
14
|
+
transform(node)
|
15
|
+
end
|
16
|
+
|
17
|
+
def handle_word(node)
|
18
|
+
node
|
19
|
+
end
|
20
|
+
|
21
|
+
def handle_no_args(node)
|
22
|
+
[:args]
|
23
|
+
end
|
24
|
+
|
25
|
+
def handle_user_constant(node)
|
26
|
+
[:const, transform(node).to_sym]
|
27
|
+
end
|
28
|
+
|
29
|
+
# Perhaps these two can be
|
30
|
+
# cleaned up? Not sure..
|
31
|
+
|
32
|
+
def handle_variable(node)
|
33
|
+
debug "Variable #{node.inspect}"
|
34
|
+
node.first.gsub("$", "").to_sym
|
35
|
+
end
|
36
|
+
|
37
|
+
def handle_a_variable(node)
|
38
|
+
debug "Variable inside function args #{node.inspect}"
|
39
|
+
transform(node.first)
|
40
|
+
end
|
41
|
+
|
42
|
+
def handle_reference_term(node)
|
43
|
+
# For now, I say screw references..
|
44
|
+
transform(node.second)
|
45
|
+
# TODO: But we might change this in the future.. Who knows.
|
46
|
+
end
|
47
|
+
|
48
|
+
################
|
49
|
+
### literals ###
|
50
|
+
################
|
51
|
+
|
52
|
+
def handle_single_quoted_string(node)
|
53
|
+
[:str, node]
|
54
|
+
end
|
55
|
+
|
56
|
+
def handle_double_quoted_string(node)
|
57
|
+
[:str, node]
|
58
|
+
end
|
59
|
+
|
60
|
+
def handle_regular_fun_call(node)
|
61
|
+
debug "Regular fun call #{node.inspect}"
|
62
|
+
name = transform(node.first).to_sym
|
63
|
+
if node.third.keys == [:no_args]
|
64
|
+
[:fcall, name]
|
65
|
+
else
|
66
|
+
args = transform(node.third)
|
67
|
+
if args.nil?
|
68
|
+
[:fcall, name]
|
69
|
+
else
|
70
|
+
[:fcall, name, args]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
############
|
76
|
+
### args ###
|
77
|
+
############
|
78
|
+
|
79
|
+
def handle_fun_args_within_call(node)
|
80
|
+
args = node.first.to_a.first.last
|
81
|
+
result = transform(args)
|
82
|
+
debug "Fun args within call result #{result.inspect}"
|
83
|
+
if result.empty?
|
84
|
+
nil
|
85
|
+
else
|
86
|
+
[:array] + result
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def handle_term_assign(node)
|
91
|
+
term, op, expr = *node
|
92
|
+
debug "Term assign #{node.inspect}"
|
93
|
+
result = transform(expr)
|
94
|
+
variable = transform(term)
|
95
|
+
|
96
|
+
# Okay, so this is kind of crazy but, in Ruby, if you ever use the
|
97
|
+
# assignment operation inside the formal parameters, it creates
|
98
|
+
# a block inside the function header AST. Run a ParseTree on
|
99
|
+
# on a method which has defaults to see what I mean.
|
100
|
+
|
101
|
+
# AFAICT, the most efficient way to handle this crazy *#$@-ing case
|
102
|
+
# is to store the assignments later and only give back just the
|
103
|
+
# variable being assigned. The assignment statements are appended
|
104
|
+
# later in the transform
|
105
|
+
|
106
|
+
self.assigns[variable] = if result.is_a? Array
|
107
|
+
[:lasgn, variable, result]
|
108
|
+
else
|
109
|
+
[:lasgn, variable, [result]]
|
110
|
+
end
|
111
|
+
|
112
|
+
variable
|
113
|
+
end
|
114
|
+
|
115
|
+
def handle_multiple_args(node)
|
116
|
+
debug "Multiple args on FunctionArgs side #{node.inspect}"
|
117
|
+
|
118
|
+
# Clear the assignment statements and perform the transformation
|
119
|
+
self.assigns = {}
|
120
|
+
result = transform(node.select {|c| c.values.first != "," })
|
121
|
+
|
122
|
+
# Append the assignment statements spoken of in "term_assign"
|
123
|
+
unless self.assigns.empty?
|
124
|
+
result.flatten + [[:block, self.assigns.values.first]]
|
125
|
+
else
|
126
|
+
result.flatten
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Ionize
|
2
|
+
module Php
|
3
|
+
module Translate
|
4
|
+
module IfStatements
|
5
|
+
def handle_if_statement0(node)
|
6
|
+
debug "If statement0 #{node.inspect}"
|
7
|
+
condition = transform(node.third)
|
8
|
+
body = transform(node[4]).to_block
|
9
|
+
if condition.first == :not
|
10
|
+
[:if, condition.second, nil, body]
|
11
|
+
else
|
12
|
+
[:if, condition, body, nil]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def handle_if_statement_b(node)
|
17
|
+
condition = transform(node.third)
|
18
|
+
body = transform(node[5]).to_block
|
19
|
+
if condition.first == :not
|
20
|
+
[:if, condition.second, nil, body]
|
21
|
+
else
|
22
|
+
[:if, condition, body, nil]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def handle_if_else_statement1(node)
|
27
|
+
debug "If else statement1 #{node.inspect}"
|
28
|
+
[:if, transform(node.third), transform(node[4]).to_block, transform(node[6]).to_block]
|
29
|
+
end
|
30
|
+
|
31
|
+
def handle_if_else_statement_b(node)
|
32
|
+
[:if, transform(node.third), transform(node[5]).to_block, transform(node[9]).to_block]
|
33
|
+
end
|
34
|
+
|
35
|
+
def handle_if_else_statement_b1(node)
|
36
|
+
debug "If else statement b1 #{node.inspect}"
|
37
|
+
[:if, transform(node.third), transform(node[5]).to_block, transform(node[8]).to_block]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Ionize
|
2
|
+
module Php
|
3
|
+
module Translate
|
4
|
+
module MultipleStatements
|
5
|
+
def level
|
6
|
+
@level ||= 0
|
7
|
+
end
|
8
|
+
|
9
|
+
def level=(other)
|
10
|
+
@level = other
|
11
|
+
end
|
12
|
+
|
13
|
+
def multiple_statements
|
14
|
+
self.level += 1
|
15
|
+
result = yield
|
16
|
+
self.level -= 1
|
17
|
+
result
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
require 'ruby2ruby'
|
3
|
+
|
4
|
+
module Ionize
|
5
|
+
module Php
|
6
|
+
module Translate
|
7
|
+
class Php2Ruby < Ruby2Ruby
|
8
|
+
def process_hash(exp)
|
9
|
+
result = []
|
10
|
+
until exp.empty?
|
11
|
+
result << "#{process(exp.shift)} => #{process(exp.shift)}"
|
12
|
+
end
|
13
|
+
"{#{result.join(', ')}}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def process_php(exp)
|
17
|
+
str = ""
|
18
|
+
until exp.empty?
|
19
|
+
subexp = exp.shift
|
20
|
+
str << process(subexp)
|
21
|
+
end
|
22
|
+
str
|
23
|
+
end
|
24
|
+
|
25
|
+
def process_html(exp)
|
26
|
+
exp.shift
|
27
|
+
end
|
28
|
+
|
29
|
+
def process_erb_start(exp)
|
30
|
+
exp.shift
|
31
|
+
end
|
32
|
+
|
33
|
+
def process_erb_end(exp)
|
34
|
+
exp.shift
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,191 @@
|
|
1
|
+
module Ionize
|
2
|
+
module Php
|
3
|
+
module Translate
|
4
|
+
module RailsForPhp
|
5
|
+
# lasgn rewrites
|
6
|
+
def rewrite_lasgn_preg_match(var, expr)
|
7
|
+
regex, object, matches = *expr.last.rest
|
8
|
+
|
9
|
+
[:masgn,
|
10
|
+
[:array, [:lasgn, var], [:lasgn, matches.last]],
|
11
|
+
[:to_ary, [:call, object, :preg_match, [:array, [:lit, eval(regex.last)]]]]]
|
12
|
+
end
|
13
|
+
|
14
|
+
def rewrite_lasgn_preg_match_all(var, expr)
|
15
|
+
regex, object, matches = *expr.last.rest
|
16
|
+
|
17
|
+
[:masgn,
|
18
|
+
[:array, [:lasgn, var], [:lasgn, matches.last]],
|
19
|
+
[:to_ary, [:call, object, :preg_match_all, [:array, [:lit, eval(regex.last)]]]]]
|
20
|
+
end
|
21
|
+
|
22
|
+
# fcall rewrites..
|
23
|
+
|
24
|
+
def rewrite_fcall_implode(args)
|
25
|
+
[:call, args.third, :join, [:array, args.second]]
|
26
|
+
end
|
27
|
+
|
28
|
+
def rewrite_fcall_explode(args)
|
29
|
+
[:call, args.third, :split, [:array, args.second]]
|
30
|
+
end
|
31
|
+
|
32
|
+
def rewrite_fcall_in_array(args)
|
33
|
+
if args.last == [:true]
|
34
|
+
[:call, args.third, :include?, [:array, args.second]]
|
35
|
+
else
|
36
|
+
raise "Cannot handle non-strict version of in_array!"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# files
|
41
|
+
|
42
|
+
def rewrite_fcall_file(args)
|
43
|
+
[:call, [:const, :File], :readlines, args]
|
44
|
+
end
|
45
|
+
|
46
|
+
# hashing algorithms..
|
47
|
+
|
48
|
+
def rewrite_fcall_md5(args)
|
49
|
+
[:call, [:colon2, [:const, :Digest], :MD5], :hexdigest, [:array, args.second]]
|
50
|
+
end
|
51
|
+
|
52
|
+
def rewrite_fcall_md5_file(args)
|
53
|
+
[:call, [:colon2, [:const, :Digest], :MD5], :hexdigest, [:array, [:call, [:const, :File], :read, [:array, args.second]]]]
|
54
|
+
end
|
55
|
+
|
56
|
+
def rewrite_fcall_sha1(args)
|
57
|
+
[:call, [:colon2, [:const, :Digest], :SHA1], :hexdigest, [:array, args.second]]
|
58
|
+
end
|
59
|
+
|
60
|
+
def rewrite_fcall_sha1_file(args)
|
61
|
+
[:call, [:colon2, [:const, :Digest], :SHA1], :hexdigest, [:array, [:call, [:const, :File], :read, [:array, args.second]]]]
|
62
|
+
end
|
63
|
+
|
64
|
+
# arrays
|
65
|
+
|
66
|
+
def rewrite_fcall_count(args)
|
67
|
+
[:call, args.second, :length]
|
68
|
+
end
|
69
|
+
|
70
|
+
def rewrite_fcall_array_combine(args)
|
71
|
+
[:call, args.second, :combine, [:array, args.third]]
|
72
|
+
end
|
73
|
+
|
74
|
+
def rewrite_fcall_array_merge(args)
|
75
|
+
[:call, args.second, :merge, [:array, args.third]]
|
76
|
+
end
|
77
|
+
|
78
|
+
# strings..
|
79
|
+
|
80
|
+
def rewrite_fcall_strrev(args)
|
81
|
+
[:call, args.second, :reverse]
|
82
|
+
end
|
83
|
+
|
84
|
+
def rewrite_fcall_stripslashes(args)
|
85
|
+
[:call, args.second, :gsub, [:array, [:str, "\\"], [:str, ""]]]
|
86
|
+
end
|
87
|
+
|
88
|
+
def rewrite_fcall_strlen(args)
|
89
|
+
[:call, args.second, :length]
|
90
|
+
end
|
91
|
+
|
92
|
+
def rewrite_fcall_rtrim(args)
|
93
|
+
if args.length == 2
|
94
|
+
[:call, args.second, :rstrip]
|
95
|
+
elsif args.length == 3
|
96
|
+
regex = [:lit, eval(Regexp.new("[#{args.third.last}]+$").inspect)]
|
97
|
+
[:call, args.second, :gsub, [:array, regex, [:str, '']]]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def rewrite_fcall_ltrim(args)
|
102
|
+
if args.length == 2
|
103
|
+
[:call, args.second, :lstrip]
|
104
|
+
elsif args.length == 3
|
105
|
+
regex = [:lit, eval(Regexp.new("^[#{args.third.last}]+").inspect)]
|
106
|
+
[:call, args.second, :gsub, [:array, regex, [:str, '']]]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def rewrite_fcall_trim(args)
|
111
|
+
if args.length == 2
|
112
|
+
[:call, args.second, :strip]
|
113
|
+
elsif args.length == 3
|
114
|
+
regex = [:lit, eval(Regexp.new("^[#{args.third.last}]+|[#{args.third.last}]+$").inspect)]
|
115
|
+
[:call, args.second, :gsub, [:array, regex, [:str, '']]]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def rewrite_fcall_ucfirst(args)
|
120
|
+
[:call, args.second, :capitalize]
|
121
|
+
end
|
122
|
+
|
123
|
+
def rewrite_fcall_strtolower(args)
|
124
|
+
[:call, args.second, :downcase]
|
125
|
+
end
|
126
|
+
|
127
|
+
def rewrite_fcall_strtoupper(args)
|
128
|
+
[:call, args.second, :upcase]
|
129
|
+
end
|
130
|
+
|
131
|
+
def rewrite_fcall_strtr(args)
|
132
|
+
[:call, args.second, :tr, [:array, args.third, args.fourth]]
|
133
|
+
end
|
134
|
+
|
135
|
+
def rewrite_fcall_strpos(args)
|
136
|
+
[:call, args.second, :index, [:array, args.third]]
|
137
|
+
end
|
138
|
+
|
139
|
+
def rewrite_fcall_strrpos(args)
|
140
|
+
[:call, args.second, :rindex, [:array, args.third]]
|
141
|
+
end
|
142
|
+
|
143
|
+
def rewrite_fcall_substr(args)
|
144
|
+
if args.length == 4
|
145
|
+
[:call, args.second, :slice, [:array, args.third, args.fourth]]
|
146
|
+
elsif args.length == 3
|
147
|
+
single_arg = args.third.last
|
148
|
+
if single_arg < 0
|
149
|
+
positive_arg = [:lit, (-single_arg)]
|
150
|
+
[:call, args.second, :slice, [:array, args.third, positive_arg]]
|
151
|
+
else
|
152
|
+
range = [:lit, eval(single_arg.to_s + "..-1")]
|
153
|
+
[:call, args.second, :slice, [:array, range]]
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# string replacement
|
159
|
+
|
160
|
+
def rewrite_fcall_substr_replace(args)
|
161
|
+
if args.length == 5
|
162
|
+
[:attrasgn, args.second, :[]=, [:array, args.fourth, args.fifth, args.third]]
|
163
|
+
elsif args.length == 4
|
164
|
+
single_arg = args.fourth.last
|
165
|
+
range = [:lit, eval(single_arg.to_s + "..-1")]
|
166
|
+
[:attrasgn, args.second, :[]=, [:array, range, args.third]]
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def rewrite_fcall_str_replace(args)
|
171
|
+
[:call, args.fourth, :gsub, [:array, args.second, args.third]]
|
172
|
+
end
|
173
|
+
|
174
|
+
def rewrite_fcall_str_ireplace(args)
|
175
|
+
regex = [:lit, eval(Regexp.new(args.second.last, Regexp::IGNORECASE).inspect)]
|
176
|
+
[:call, args.fourth, :gsub, [:array, regex, args.third]]
|
177
|
+
end
|
178
|
+
|
179
|
+
def rewrite_fcall_preg_replace(args)
|
180
|
+
regex = [:lit, eval(args.second.last)]
|
181
|
+
[:call, args.fourth, :gsub, [:array, regex, args.third]]
|
182
|
+
end
|
183
|
+
|
184
|
+
def rewrite_fcall_preg_split(args)
|
185
|
+
regex = [:lit, eval(args.second.last)]
|
186
|
+
[:call, args.third, :split, [:array, regex]]
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|