ripper2ruby 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/README.markdown +10 -0
- data/lib/core_ext/array/flush.rb +5 -0
- data/lib/core_ext/hash/delete_at.rb +5 -0
- data/lib/core_ext/object/meta_class.rb +5 -0
- data/lib/core_ext/object/try.rb +12 -0
- data/lib/erb/stripper.rb +48 -0
- data/lib/highlighters/ansi.rb +29 -0
- data/lib/ripper/event_log.rb +45 -0
- data/lib/ripper/ruby_builder.rb +168 -0
- data/lib/ripper/ruby_builder/buffer.rb +34 -0
- data/lib/ripper/ruby_builder/events/args.rb +40 -0
- data/lib/ripper/ruby_builder/events/array.rb +71 -0
- data/lib/ripper/ruby_builder/events/assignment.rb +55 -0
- data/lib/ripper/ruby_builder/events/block.rb +80 -0
- data/lib/ripper/ruby_builder/events/call.rb +123 -0
- data/lib/ripper/ruby_builder/events/case.rb +17 -0
- data/lib/ripper/ruby_builder/events/const.rb +47 -0
- data/lib/ripper/ruby_builder/events/for.rb +13 -0
- data/lib/ripper/ruby_builder/events/hash.rb +24 -0
- data/lib/ripper/ruby_builder/events/identifier.rb +41 -0
- data/lib/ripper/ruby_builder/events/if.rb +37 -0
- data/lib/ripper/ruby_builder/events/lexer.rb +159 -0
- data/lib/ripper/ruby_builder/events/literal.rb +47 -0
- data/lib/ripper/ruby_builder/events/method.rb +21 -0
- data/lib/ripper/ruby_builder/events/operator.rb +23 -0
- data/lib/ripper/ruby_builder/events/statements.rb +50 -0
- data/lib/ripper/ruby_builder/events/string.rb +117 -0
- data/lib/ripper/ruby_builder/events/symbol.rb +22 -0
- data/lib/ripper/ruby_builder/events/while.rb +27 -0
- data/lib/ripper/ruby_builder/queue.rb +33 -0
- data/lib/ripper/ruby_builder/stack.rb +125 -0
- data/lib/ripper/ruby_builder/token.rb +91 -0
- data/lib/ripper2ruby.rb +1 -0
- data/lib/ruby.rb +28 -0
- data/lib/ruby/aggregate.rb +71 -0
- data/lib/ruby/alternation/args.rb +25 -0
- data/lib/ruby/alternation/hash.rb +25 -0
- data/lib/ruby/alternation/list.rb +19 -0
- data/lib/ruby/args.rb +36 -0
- data/lib/ruby/array.rb +27 -0
- data/lib/ruby/assignment.rb +32 -0
- data/lib/ruby/assoc.rb +17 -0
- data/lib/ruby/block.rb +42 -0
- data/lib/ruby/call.rb +34 -0
- data/lib/ruby/case.rb +30 -0
- data/lib/ruby/const.rb +49 -0
- data/lib/ruby/for.rb +18 -0
- data/lib/ruby/hash.rb +14 -0
- data/lib/ruby/if.rb +35 -0
- data/lib/ruby/list.rb +40 -0
- data/lib/ruby/literal.rb +45 -0
- data/lib/ruby/method.rb +19 -0
- data/lib/ruby/node.rb +47 -0
- data/lib/ruby/node/composite.rb +68 -0
- data/lib/ruby/node/conversions.rb +66 -0
- data/lib/ruby/node/position.rb +35 -0
- data/lib/ruby/node/source.rb +29 -0
- data/lib/ruby/node/text.rb +121 -0
- data/lib/ruby/node/traversal.rb +82 -0
- data/lib/ruby/operator.rb +49 -0
- data/lib/ruby/params.rb +41 -0
- data/lib/ruby/statements.rb +45 -0
- data/lib/ruby/string.rb +40 -0
- data/lib/ruby/symbol.rb +27 -0
- data/lib/ruby/token.rb +51 -0
- data/lib/ruby/while.rb +32 -0
- data/test/all.rb +3 -0
- data/test/builder/stack_test.rb +67 -0
- data/test/builder/text_test.rb +118 -0
- data/test/context_test.rb +54 -0
- data/test/erb_stripper_test.rb +29 -0
- data/test/fixtures/all.rb.src +150 -0
- data/test/fixtures/source_1.rb +16 -0
- data/test/fixtures/source_2.rb +1 -0
- data/test/fixtures/stuff.rb +371 -0
- data/test/fixtures/template.html.erb +22 -0
- data/test/fixtures/tmp.rb +6 -0
- data/test/lib_test.rb +92 -0
- data/test/lib_test_helper.rb +103 -0
- data/test/libs.txt +227 -0
- data/test/nodes/args_test.rb +100 -0
- data/test/nodes/array_test.rb +141 -0
- data/test/nodes/assignment_test.rb +49 -0
- data/test/nodes/block_test.rb +125 -0
- data/test/nodes/call_test.rb +229 -0
- data/test/nodes/case_test.rb +68 -0
- data/test/nodes/comments_test.rb +25 -0
- data/test/nodes/const_test.rb +46 -0
- data/test/nodes/conversions_test.rb +9 -0
- data/test/nodes/for_test.rb +34 -0
- data/test/nodes/hash_test.rb +71 -0
- data/test/nodes/heredoc_test.rb +202 -0
- data/test/nodes/identifier_test.rb +51 -0
- data/test/nodes/if_test.rb +100 -0
- data/test/nodes/literals_test.rb +63 -0
- data/test/nodes/method_test.rb +92 -0
- data/test/nodes/namespaces_test.rb +65 -0
- data/test/nodes/node_test.rb +74 -0
- data/test/nodes/nodes_test.rb +23 -0
- data/test/nodes/operator_test.rb +241 -0
- data/test/nodes/separators_test.rb +97 -0
- data/test/nodes/statements_test.rb +70 -0
- data/test/nodes/string_test.rb +92 -0
- data/test/nodes/symbol_test.rb +57 -0
- data/test/nodes/unless_test.rb +42 -0
- data/test/nodes/until_test.rb +61 -0
- data/test/nodes/while_test.rb +71 -0
- data/test/test_helper.rb +51 -0
- data/test/traversal_test.rb +53 -0
- metadata +163 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class IdentifierTest < Test::Unit::TestCase
|
4
|
+
include TestHelper
|
5
|
+
|
6
|
+
define_method :"test a variable" do
|
7
|
+
src = 'foo'
|
8
|
+
identifier = build(src).first
|
9
|
+
assert_build(src) do |node|
|
10
|
+
assert_equal Ruby::Variable, node.first.class
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
define_method :"test an instance variable" do
|
15
|
+
src = '@foo'
|
16
|
+
assert_build(src) do |node|
|
17
|
+
assert_equal Ruby::Variable, node.first.class
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
define_method :"test a class variable" do
|
22
|
+
src = '@@foo'
|
23
|
+
assert_build(src) do |node|
|
24
|
+
assert_equal Ruby::Variable, node.first.class
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
define_method :"test a global variable" do
|
29
|
+
src = '$foo'
|
30
|
+
assert_build(src) do |node|
|
31
|
+
assert_equal Ruby::Variable, node.first.class
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
define_method :"test keyword __FILE__" do
|
36
|
+
src = '__FILE__'
|
37
|
+
assert_build(src) do |node|
|
38
|
+
assert_equal Ruby::Keyword, node.first.class
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
define_method :"test keyword __LINE__" do
|
43
|
+
src = '__LINE__'
|
44
|
+
assert_build(src)
|
45
|
+
end
|
46
|
+
|
47
|
+
define_method :"test keyword __ENCODING__" do
|
48
|
+
src = '__ENCODING__'
|
49
|
+
assert_build(src)
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class IfTest < Test::Unit::TestCase
|
4
|
+
include TestHelper
|
5
|
+
|
6
|
+
define_method :'test if block, semicolon separated' do
|
7
|
+
src = "if true; false end"
|
8
|
+
assert_build(src)
|
9
|
+
end
|
10
|
+
|
11
|
+
define_method :'test if block, newline separated' do
|
12
|
+
src = "if true\n false\n end"
|
13
|
+
assert_build(src)
|
14
|
+
end
|
15
|
+
|
16
|
+
define_method :'test if block, newline separated' do
|
17
|
+
src = "if true\n false\n end"
|
18
|
+
assert_build(src)
|
19
|
+
end
|
20
|
+
|
21
|
+
define_method :'test if block w/ then, not separated' do
|
22
|
+
src = "if true then false end"
|
23
|
+
assert_build(src)
|
24
|
+
end
|
25
|
+
|
26
|
+
define_method :'test if block w/ else block, semicolon separated' do
|
27
|
+
src = "if true; false; else; true end"
|
28
|
+
assert_build(src)
|
29
|
+
end
|
30
|
+
|
31
|
+
define_method :'test if block w/ else block, newline separated' do
|
32
|
+
src = "if true\n false\n else\n true end"
|
33
|
+
assert_build(src)
|
34
|
+
end
|
35
|
+
|
36
|
+
define_method :'test if block w/ elsif block, semicolon separated' do
|
37
|
+
src = "if true; false; elsif false; true end"
|
38
|
+
assert_build(src)
|
39
|
+
end
|
40
|
+
|
41
|
+
define_method :'test if block w/ elsif block, newline separated' do
|
42
|
+
src = "if true\n false\n elsif false\n true end"
|
43
|
+
assert_build(src)
|
44
|
+
end
|
45
|
+
|
46
|
+
define_method :'test if block w/ then, else block and elsif block, semicolon separated' do
|
47
|
+
src = "if true then false; elsif false then true; else nil end"
|
48
|
+
assert_build(src)
|
49
|
+
end
|
50
|
+
|
51
|
+
define_method :'test if block w/ then, else block and elsif block, newline separated' do
|
52
|
+
src = "if a == 1 then b\nelsif b == c then d\ne\nf\nelse e end"
|
53
|
+
assert_build(src)
|
54
|
+
end
|
55
|
+
|
56
|
+
define_method :'test if modifier' do
|
57
|
+
src = "foo if true"
|
58
|
+
assert_build(src)
|
59
|
+
end
|
60
|
+
|
61
|
+
define_method :'test if modifier after a keyword statement' do
|
62
|
+
src = "return if true"
|
63
|
+
assert_build(src)
|
64
|
+
end
|
65
|
+
|
66
|
+
define_method :'test if modifier after an assignment to call' do
|
67
|
+
src = 'foo.bar += bar if bar'
|
68
|
+
assert_build(src)
|
69
|
+
end
|
70
|
+
|
71
|
+
define_method :'test if modifier after call multiassignment with a splat' do
|
72
|
+
src = 'foo, bar = *baz if bum'
|
73
|
+
assert_build(src)
|
74
|
+
end
|
75
|
+
|
76
|
+
define_method :'test if modifier after call with a splat argument' do
|
77
|
+
src = 'foo *args if bar?'
|
78
|
+
assert_build(src)
|
79
|
+
end
|
80
|
+
|
81
|
+
define_method :'test if modifier after array access' do
|
82
|
+
src = 'pos[1] if pos'
|
83
|
+
assert_build(src)
|
84
|
+
end
|
85
|
+
|
86
|
+
define_method :'test if modifier testing defined?' do
|
87
|
+
src = 'a if (defined? a)'
|
88
|
+
assert_build(src)
|
89
|
+
end
|
90
|
+
|
91
|
+
define_method :'test rescue modifier' do
|
92
|
+
src = 'rescued rescue rescuing'
|
93
|
+
assert_build(src)
|
94
|
+
end
|
95
|
+
|
96
|
+
define_method :'test rescue modifier after assignment' do
|
97
|
+
src = 'rescued = assigned rescue rescueing'
|
98
|
+
assert_build(src)
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class LiteralsTest < Test::Unit::TestCase
|
4
|
+
include TestHelper
|
5
|
+
|
6
|
+
define_method :"test an integer" do
|
7
|
+
src = '1'
|
8
|
+
assert_build(src) do |node|
|
9
|
+
assert_equal Ruby::Integer, node.first.class
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
define_method :"test a float" do
|
14
|
+
src = '1.1'
|
15
|
+
assert_build(src) do |node|
|
16
|
+
assert_equal Ruby::Float, node.first.class
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
define_method :"test nil" do
|
21
|
+
src = 'nil'
|
22
|
+
assert_build(src) do |node|
|
23
|
+
assert_equal Ruby::Nil, node.first.class
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
define_method :"test true" do
|
28
|
+
src = 'true'
|
29
|
+
assert_build(src) do |node|
|
30
|
+
assert_equal Ruby::True, node.first.class
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
define_method :"test false" do
|
35
|
+
src = 'false'
|
36
|
+
assert_build(src) do |node|
|
37
|
+
assert_equal Ruby::False, node.first.class
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
define_method :"test range (..)" do
|
42
|
+
src = '1..2'
|
43
|
+
assert_build(src) do |node|
|
44
|
+
assert_equal Ruby::Range, node.first.class
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
define_method :"test range (..)" do
|
49
|
+
src = '1...2'
|
50
|
+
literal = build(src).first
|
51
|
+
assert literal.is_a?(Ruby::Range)
|
52
|
+
assert_equal 1...2, literal.value
|
53
|
+
assert_equal src, literal.to_ruby
|
54
|
+
end
|
55
|
+
|
56
|
+
define_method :"test character" do
|
57
|
+
src = '?a'
|
58
|
+
literal = build(src).first
|
59
|
+
assert literal.is_a?(Ruby::Char)
|
60
|
+
assert_equal 'a', literal.value
|
61
|
+
assert_equal src, literal.to_ruby
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class MethodTest < Test::Unit::TestCase
|
4
|
+
include TestHelper
|
5
|
+
|
6
|
+
define_method :"test a method definition" do
|
7
|
+
src = "def foo(a, b = nil, c = :foo, *d, &block)\n bar\n baz\n end"
|
8
|
+
assert_build(src)
|
9
|
+
end
|
10
|
+
|
11
|
+
define_method :"test a method definition with an options hash" do
|
12
|
+
src = "def foo(a, b = {})\nend"
|
13
|
+
assert_build(src)
|
14
|
+
end
|
15
|
+
|
16
|
+
define_method :"test a method definition without parentheses" do
|
17
|
+
src = "def foo a, b = nil, c = :foo, *d, &block\n bar\n baz\n end"
|
18
|
+
assert_build(src)
|
19
|
+
end
|
20
|
+
|
21
|
+
define_method :"test a class method definition (using self, keyword)" do
|
22
|
+
src = "def self.for(options)\nend"
|
23
|
+
assert_build(src)
|
24
|
+
end
|
25
|
+
|
26
|
+
define_method :"test method definition: def foo(b = :b, c=:c); end (optional args w/ whitespace differences)" do
|
27
|
+
src = 'def foo(a = 1, b=2); end'
|
28
|
+
assert_build(src)
|
29
|
+
end
|
30
|
+
|
31
|
+
define_method :"test method definition: def t(a = []); end" do
|
32
|
+
src = "def t(a = []) end"
|
33
|
+
assert_build(src)
|
34
|
+
end
|
35
|
+
|
36
|
+
define_method :"test: method definition: def t(*) end (a single splat)" do
|
37
|
+
src = "def t(*) end"
|
38
|
+
assert_build(src)
|
39
|
+
end
|
40
|
+
|
41
|
+
define_method :"test method definition: def <<()" do
|
42
|
+
src = "def <<(arg) end"
|
43
|
+
assert_build(src)
|
44
|
+
end
|
45
|
+
|
46
|
+
define_method :"test method definition: def | " do
|
47
|
+
src = "def | ; end"
|
48
|
+
assert_build(src)
|
49
|
+
end
|
50
|
+
|
51
|
+
define_method :"test method definition: def |(foo) " do
|
52
|
+
src = "class A < B; def |(foo); end; end"
|
53
|
+
assert_build(src)
|
54
|
+
end
|
55
|
+
|
56
|
+
define_method :"test method body w/ statements separated by semicolon" do
|
57
|
+
src = "def <<(arg) foo; bar; end"
|
58
|
+
assert_build(src)
|
59
|
+
end
|
60
|
+
|
61
|
+
define_method :"test method body rescue with error var" do
|
62
|
+
src = "def t\nrescue => e\nend"
|
63
|
+
assert_build(src)
|
64
|
+
end
|
65
|
+
|
66
|
+
define_method :"test method body rescue and ensure block" do
|
67
|
+
src = "def a(b, c)\n d\nrescue A\n e\nensure\nb\nend"
|
68
|
+
assert_build(src)
|
69
|
+
end
|
70
|
+
|
71
|
+
define_method :"test a method definition with a semicolon and a block in the body" do
|
72
|
+
src = "def foo ; bar { |k, v| k } end"
|
73
|
+
assert_build(src)
|
74
|
+
end
|
75
|
+
|
76
|
+
define_method :"test a method definition with an identifier that is also a keyword (?) (class)" do
|
77
|
+
src = "class A\n def class\n end\nend"
|
78
|
+
assert_build(src)
|
79
|
+
end
|
80
|
+
|
81
|
+
define_method :"test a method definition with an identifier that is also a keyword (?) (end)" do
|
82
|
+
src = "def end\nend"
|
83
|
+
assert_build(src)
|
84
|
+
end
|
85
|
+
|
86
|
+
define_method :"test a method definition that returns a number" do
|
87
|
+
src = "def def; 234; end"
|
88
|
+
assert_build(src)
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class NamespacesTest < Test::Unit::TestCase
|
4
|
+
include TestHelper
|
5
|
+
|
6
|
+
define_method :'test method definition and call: def A::foo() B::foo(); end (multiple :: separators)' do
|
7
|
+
src = "def A::foo() B::foo(); end"
|
8
|
+
assert_build(src)
|
9
|
+
end
|
10
|
+
|
11
|
+
define_method :'test method call: A::B::\nfoo() (multiple :: separators)' do
|
12
|
+
src = "C::\nD::foo()"
|
13
|
+
assert_build(src)
|
14
|
+
end
|
15
|
+
|
16
|
+
define_method :"test a const path" do
|
17
|
+
src = 'A::B::C'
|
18
|
+
assert_build(src)
|
19
|
+
end
|
20
|
+
|
21
|
+
define_method :"test a const path" do
|
22
|
+
src = "A::B::C::\nD"
|
23
|
+
assert_build(src)
|
24
|
+
end
|
25
|
+
|
26
|
+
define_method :"test a const path with toplevel const ref" do
|
27
|
+
src = '::A::B'
|
28
|
+
assert_build(src)
|
29
|
+
end
|
30
|
+
|
31
|
+
define_method :"test namespace separator with method call and const argument" do
|
32
|
+
src = 'A::foo(B)'
|
33
|
+
assert_build(src)
|
34
|
+
end
|
35
|
+
|
36
|
+
define_method :"test namespace separator in a method definition" do
|
37
|
+
src = 'def A::foo(); end'
|
38
|
+
assert_build(src)
|
39
|
+
end
|
40
|
+
|
41
|
+
define_method :"test namespaced const after namespace separator in a method definition" do
|
42
|
+
src = "def A::foo(); end\n::B::C"
|
43
|
+
assert_build(src)
|
44
|
+
end
|
45
|
+
|
46
|
+
define_method :"test use const after namespace separator in a method definition" do
|
47
|
+
src = "def A::foo()\n a = B\n end"
|
48
|
+
assert_build(src)
|
49
|
+
end
|
50
|
+
|
51
|
+
define_method :"test a nested namespaced class" do
|
52
|
+
src = "class A < B::C\nclass D\nend\nend"
|
53
|
+
assert_build(src)
|
54
|
+
end
|
55
|
+
|
56
|
+
define_method :"test a class method definition calling a class method (namespace seps)" do
|
57
|
+
src = "def A::foo()\nB::foo()\n end"
|
58
|
+
assert_build(src)
|
59
|
+
end
|
60
|
+
|
61
|
+
define_method :"test a class method definition (using const) containing a class method call (using ::)" do
|
62
|
+
src = "def A.foo(a, b = nil, c = :foo, *d, &block)\n A::B()\n baz\n end"
|
63
|
+
assert_build(src)
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class NodeTest < Test::Unit::TestCase
|
4
|
+
def statements(src)
|
5
|
+
Ripper::RubyBuilder.build(src).statements
|
6
|
+
end
|
7
|
+
|
8
|
+
# def test_src_pos
|
9
|
+
# statements = statements(" aaaaaaa\nbbbbb\ncccc(:c)\nddd\nee\nf")
|
10
|
+
# assert_equal 2, statements[0].src_pos
|
11
|
+
# assert_equal 10, statements[1].src_pos
|
12
|
+
# assert_equal 16, statements[2].src_pos
|
13
|
+
# assert_equal 21, statements[2].arguments.first.src_pos
|
14
|
+
# assert_equal 25, statements[3].src_pos
|
15
|
+
# assert_equal 29, statements[4].src_pos
|
16
|
+
# assert_equal 32, statements[5].src_pos
|
17
|
+
# end
|
18
|
+
|
19
|
+
# def test_update_position
|
20
|
+
# program = Ripper::RubyBuilder.build("a\nb\nc(:c); d(:d); e(:e)\nf")
|
21
|
+
#
|
22
|
+
# b = program.statements[1]
|
23
|
+
# c = program.statements[2]
|
24
|
+
# d = program.statements[3]
|
25
|
+
# e = program.statements[4]
|
26
|
+
# f = program.statements[5]
|
27
|
+
#
|
28
|
+
# assert_equal [1, 0], b.position
|
29
|
+
# assert_equal [2, 0], c.position
|
30
|
+
# assert_equal [2, 7], d.position
|
31
|
+
# assert_equal [2, 14], e.position
|
32
|
+
# assert_equal [3, 0], f.position
|
33
|
+
#
|
34
|
+
# program.send(:update_positions, 2, c.length, 3)
|
35
|
+
#
|
36
|
+
# assert_equal [1, 0], b.position
|
37
|
+
# assert_equal [2, 0], c.position
|
38
|
+
# assert_equal [2, 10], d.position
|
39
|
+
# assert_equal [2, 17], e.position
|
40
|
+
# assert_equal [3, 0], f.position
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# def test_update_children_positions
|
44
|
+
# program = Ripper::RubyBuilder.build("a(:a); b(:b, ['b', 1], { :b => :'b' })")
|
45
|
+
#
|
46
|
+
# a = program.statements.select { |s| s.identifier.token == 'a' if s }.first
|
47
|
+
# b = program.statements.select { |s| s.identifier.token == 'b' if s }.first
|
48
|
+
#
|
49
|
+
# assert_equal [0, 0], a.position
|
50
|
+
# assert_equal [0, 7], b.position
|
51
|
+
# assert_equal [0, 9], b.arguments[0].position
|
52
|
+
# assert_equal [0, 13], b.arguments[1].position
|
53
|
+
# assert_equal [0, 14], b.arguments[1][0].position
|
54
|
+
# assert_equal [0, 19], b.arguments[1][1].position
|
55
|
+
# assert_equal [0, 23], b.arguments[2].position
|
56
|
+
# assert_equal [0, 25], b.arguments[2].assocs[0].position
|
57
|
+
# assert_equal [0, 25], b.arguments[2].assocs[0].key.position
|
58
|
+
# assert_equal [0, 31], b.arguments[2].assocs[0].value.position
|
59
|
+
# v = b.arguments[2].assocs[0].value
|
60
|
+
#
|
61
|
+
# program.send(:update_positions, 0, a.length, 3)
|
62
|
+
#
|
63
|
+
# assert_equal [0, 0], a.position
|
64
|
+
# assert_equal [0, 10], b.position
|
65
|
+
# assert_equal [0, 12], b.arguments[0].position
|
66
|
+
# assert_equal [0, 16], b.arguments[1].position
|
67
|
+
# assert_equal [0, 17], b.arguments[1][0].position
|
68
|
+
# assert_equal [0, 22], b.arguments[1][1].position
|
69
|
+
# assert_equal [0, 26], b.arguments[2].position
|
70
|
+
# assert_equal [0, 28], b.arguments[2].assocs[0].position
|
71
|
+
# assert_equal [0, 28], b.arguments[2].assocs[0].key.position
|
72
|
+
# assert_equal [0, 34], b.arguments[2].assocs[0].value.position
|
73
|
+
# end
|
74
|
+
end
|