jruby-parser 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/lib/jruby-parser.jar +0 -0
  3. data/lib/jruby-parser/util/coercer.rb +22 -16
  4. data/lib/jruby-parser/version.rb +1 -1
  5. data/spec/ast/node/array_spec.rb +24 -0
  6. data/spec/ast/node/break_spec.rb +19 -0
  7. data/spec/ast/node/comments_spec.rb +59 -0
  8. data/spec/{jruby-parser → ast/node}/find_scopes_spec.rb +4 -7
  9. data/spec/ast/node/get_declaration_spec.rb +50 -0
  10. data/spec/ast/node/get_defined_scope_spec.rb +89 -0
  11. data/spec/{jruby-parser → ast/node}/get_node_at_spec.rb +3 -7
  12. data/spec/ast/node/get_occurences_spec.rb +87 -0
  13. data/spec/{jruby-parser → ast/node}/is_block_parameter_spec.rb +4 -8
  14. data/spec/{jruby-parser → ast/node}/is_method_parameter_spec.rb +4 -8
  15. data/spec/ast/node/next_spec.rb +19 -0
  16. data/spec/ast/node/op_element_asgn_and_spec.rb +11 -0
  17. data/spec/ast/node/op_element_asgn_or_spec.rb +11 -0
  18. data/spec/ast/node/op_element_asgn_spec.rb +11 -0
  19. data/spec/ast/node/return_spec.rb +19 -0
  20. data/spec/ast/node_path.rb +1 -5
  21. data/spec/helpers.rb +4 -0
  22. data/spec/helpers/node_helpers.rb +17 -6
  23. data/spec/helpers/parser_helpers.rb +84 -8
  24. data/spec/jruby-parser/find_spec.rb +2 -6
  25. data/spec/jruby-parser/parse_spec.rb +17 -0
  26. data/spec/jruby-parser/rewriting_spec.rb +27 -12
  27. data/spec/jruby-parser/static_analysis_spec.rb +51 -48
  28. data/spec/parser/alias_spec.rb +2 -6
  29. data/spec/parser/broken_spec.rb +2 -6
  30. data/spec/parser/calls_spec.rb +100 -0
  31. data/spec/positions/alias_spec.rb +23 -0
  32. data/spec/positions/arg_spec.rb +2 -6
  33. data/spec/positions/attr_asgn_spec.rb +2 -6
  34. data/spec/positions/call_spec.rb +2 -10
  35. data/spec/positions/conditionals_spec.rb +2 -6
  36. data/spec/positions/hash_spec.rb +2 -6
  37. data/spec/positions/heredoc_spec.rb +2 -6
  38. data/spec/positions/name_spec.rb +56 -0
  39. data/spec/positions/op_asgn_or_spec.rb +15 -0
  40. data/spec/positions/str_spec.rb +2 -6
  41. metadata +51 -21
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1a8e7fce9790155c3de58d121b229d94dae09c80
4
+ data.tar.gz: 29e91b679491ee3e139e57cb68a3a0679367c045
5
+ SHA512:
6
+ metadata.gz: 23453af440f18474847c8ac0ee69cecec9dd82fa6c70b481349e73636a9b31d8af718fd5a1e9f457487d0b5f5a2cfa5e299229ff79a5d41e115d3a7f8db8ce33
7
+ data.tar.gz: 9ff515f22b2116e0d03702612308fa3748ad5e5c84ddf3e37a552c81626973a4f326cca65da0f797ab1ff11d7290d0f53ce5272e25407fc835b49041e7f41768
data/lib/jruby-parser.jar CHANGED
Binary file
@@ -3,10 +3,11 @@ module JRubyParser
3
3
  def self.included(cls)
4
4
  cls.class_eval do
5
5
  def receiver=(value)
6
- value = value.to_ast_node if value.respond_to? :to_ast_node
7
- old_value = getReceiver
8
- value.position = old_value.position unless value.position
9
- setReceiver(value)
6
+ old_value = getReceiver
7
+ if value.respond_to? :to_ast_node
8
+ value = value.to_ast_node(old_value.position)
9
+ end
10
+ setReceiver(value)
10
11
  end
11
12
  end
12
13
  end
@@ -16,10 +17,12 @@ module JRubyParser
16
17
  def self.included(cls)
17
18
  cls.class_eval do
18
19
  def value=(value)
19
- value = value.to_ast_node if value.respond_to? :to_ast_node
20
- old_value = getValue
21
- value.position = old_value.position unless value.position
22
- setValue(value)
20
+ old_value = getValue
21
+ if value.respond_to? :to_ast_node
22
+ value = value.to_ast_node(old_value.position)
23
+ end
24
+
25
+ setValue(value)
23
26
  end
24
27
  end
25
28
  end
@@ -29,16 +32,19 @@ module JRubyParser
29
32
  def self.included(cls)
30
33
  cls.class_eval do
31
34
  def args=(value)
32
- value = value.to_ast_node if value.respond_to? :to_ast_node
33
- old_value = getArgs
34
- unless value.position
35
- value.position = old_value.position
36
- value.each { |e| e.position = old_value.position } #if value.respond_to? :each
37
- end
35
+ old_value = getArgs
36
+ if value.respond_to? :to_ast_node
37
+ value = value.to_ast_node(old_value.position)
38
+ end
39
+
40
+ unless value.position
41
+ value.position = old_value.position
42
+ value.each { |e| e.position = old_value.position } #if value.respond_to? :each
43
+ end
38
44
 
39
- setArgs(value)
45
+ setArgs(value)
40
46
  end
41
47
  end
42
48
  end
43
49
  end
44
- end
50
+ end
@@ -1,3 +1,3 @@
1
1
  module JRubyParser
2
- VERSION = "0.4.2"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -0,0 +1,24 @@
1
+ require_relative '../../helpers'
2
+
3
+ tnode, fnode = org.jrubyparser.ast.TrueNode, org.jrubyparser.ast.FalseNode
4
+ inil = org.jrubyparser.ast.ImplicitNilNode
5
+
6
+ describe org.jrubyparser.ast.ArrayNode do
7
+ VERSIONS.each do |v|
8
+ it "can have multiple elements [#{v}]" do
9
+ parse("[true, false]", v).find_node(:array).tap do |list|
10
+ list.should have_position(0, 0, 0, 13)
11
+ list.size.should == 2
12
+ list.child_nodes.to_a.map(&:class).should == [tnode, fnode]
13
+ end
14
+ end
15
+
16
+ it "can have nasty implcit nil elements [#{v}]" do
17
+ parse("[()]", v).find_node(:array).tap do |list|
18
+ list.should have_position(0, 0, 0, 4)
19
+ list.size.should == 1
20
+ list.child_nodes.to_a.map(&:class).should == [inil]
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ require_relative '../../helpers'
2
+
3
+ describe org.jrubyparser.ast.BreakNode do
4
+ VERSIONS.each do |v|
5
+ it "can accept a single value [#{v}]" do
6
+ rparse("break true", v).find_node(:break).tap do |b|
7
+ b.should have_position(0, 0, 0, 10)
8
+ b.value_node.class.should == org.jrubyparser.ast.TrueNode
9
+ end
10
+ end
11
+
12
+ it "can accept no value [#{v}]" do
13
+ rparse("break", v).find_node(:break).tap do |b|
14
+ b.should have_position(0, 0, 0, 5)
15
+ b.value_node.should == nil
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,59 @@
1
+ require_relative '../../helpers'
2
+
3
+ describe org.jrubyparser.ast.Node do
4
+ VERSIONS.each do |v|
5
+ it "can see a single previous comment [#{v}]" do
6
+ rparse("# c1\ndef foo; end", v).find_node(:defn).tap do |defn|
7
+ defn.previous_comments.to_a.map(&:content).should =~ ["# c1"]
8
+ end
9
+
10
+ rparse("# c1\ndef foo; end\nfoo\n", v).find_node(:defn).tap do |defn|
11
+ defn.previous_comments.to_a.map(&:content).should =~ ["# c1"]
12
+ end
13
+
14
+ rparse("# c1\ndef self.[]\nend", v).find_node(:defs).tap do |defs|
15
+ defs.previous_comments.to_a.map(&:content).should =~ ["# c1"]
16
+ end
17
+
18
+ rparse("# c1\nclass Foo\nend", v).find_node(:class).tap do |defn|
19
+ defn.previous_comments.to_a.map(&:content).should =~ ["# c1"]
20
+ end
21
+
22
+ rparse("# c1\nif 1; end", v).find_node(:if).tap do |ifn|
23
+ ifn.previous_comments.to_a.map(&:content).should =~ ["# c1"]
24
+ end
25
+ end
26
+
27
+ it "can see a multiple previous comments [#{v}]" do
28
+ rparse("# c1\n# c2\ndef foo; end", v).find_node(:defn).tap do |defn|
29
+ defn.previous_comments.to_a.map(&:content).should =~ ["# c1", "# c2"]
30
+ end
31
+
32
+ rparse("# c1\n# c2\nclass Foo\nend", v).find_node(:class).tap do |defn|
33
+ defn.previous_comments.to_a.map(&:content).should =~ ["# c1", "# c2"]
34
+ end
35
+
36
+ rparse("# c1\n# c2\nif 1\nend", v).find_node(:if).tap do |ifn|
37
+ ifn.previous_comments.to_a.map(&:content).should =~ ["# c1", "# c2"]
38
+ end
39
+ end
40
+
41
+ it "can see an inline comment [#{v}]" do
42
+ rparse("1 + 2 # inline").find_node(:call).tap do |call|
43
+ call.inline_comment.content.should == "# inline"
44
+ end
45
+ end
46
+
47
+ it "places trailing comments as last element in root [#{v}]" do
48
+ rparse("def foo\n end\n #trailing").child_nodes.to_a.last.tap do |child|
49
+ child.content.should =~ /#trailing/
50
+ end
51
+ end
52
+
53
+ it "handles a lone comment [#{v}]" do
54
+ rparse("#trailing").child_nodes.to_a.last.tap do |child|
55
+ child.content.should =~ /#trailing/
56
+ end
57
+ end
58
+ end
59
+ end
@@ -1,11 +1,8 @@
1
- $LOAD_PATH.unshift File.dirname(__FILE__) + "/../../lib"
2
- $LOAD_PATH.unshift File.dirname(__FILE__) + "/../helpers"
3
- require 'java'
4
- require 'jruby-parser'
5
- require 'parser_helpers'
1
+ require_relative '../../helpers'
6
2
 
7
- describe JRubyParser do
8
- [JRubyParser::Compat::RUBY1_8, JRubyParser::Compat::RUBY1_9].each do |v|
3
+ # FIXME: Move each of these methods into their respective spec files (e.g method_for_spec.rb)
4
+ describe org.jrubyparser.ast.Node do
5
+ VERSIONS.each do |v|
9
6
  it "children can ask for the method it is contained in [#{v}]" do
10
7
  parse("def foo; true if false; end").find_node(:defn) do |defn|
11
8
  defn.find_node(:true).method_for.should == defn
@@ -0,0 +1,50 @@
1
+ require_relative '../../helpers'
2
+
3
+ describe org.jrubyparser.ast.Node do
4
+ VERSIONS.each do |v|
5
+ it "finds a variable's parameter declaration via get_declaration [#{v}]" do
6
+ carets_parse("def foo(^a); ^a; end", v).tap do |_, caret_nodes|
7
+ caret_nodes[1].declaration.should == caret_nodes[0]
8
+ end
9
+ carets_parse("def foo(^a); a = 1; ^a; end", v).tap do |_, caret_nodes|
10
+ caret_nodes[1].declaration.should == caret_nodes[0]
11
+ end
12
+ carets_parse("def foo(*^a); a = 1; ^a; end", v).tap do |_, caret_nodes|
13
+ caret_nodes[1].declaration.should == caret_nodes[0]
14
+ end
15
+ carets_parse("def foo(&^a); a = 1; ^a; end", v).tap do |_, caret_nodes|
16
+ caret_nodes[1].declaration.should == caret_nodes[0]
17
+ end
18
+ carets_parse("def foo(^a=1); a = 1; ^a; end", v).tap do |_, caret_nodes|
19
+ caret_nodes[1].declaration.should == caret_nodes[0]
20
+ end
21
+ end
22
+ it "finds a variable's lvar declaration via get_declaration [#{v}]" do
23
+ carets_parse("def foo; ^a = 1; ^a; end", v).tap do |_, caret_nodes|
24
+ caret_nodes[1].declaration.should == caret_nodes[0]
25
+ end
26
+ carets_parse("def foo; ^a = 1; a = 2; ^a; end", v).tap do |_, caret_nodes|
27
+ caret_nodes[1].declaration.should == caret_nodes[0]
28
+ end
29
+ end
30
+ it "finds a variable's parameter declaration via get_declaration [#{v}]" do
31
+ carets_parse("proc {|^a| ^a}", v).tap do |_, caret_nodes|
32
+ caret_nodes[1].declaration.should == caret_nodes[0]
33
+ end
34
+ carets_parse("proc {|^a| a = 1; ^a}", v).tap do |_, caret_nodes|
35
+ caret_nodes[1].declaration.should == caret_nodes[0]
36
+ end
37
+ carets_parse("proc {|*^a| a = 1; ^a}", v).tap do |_, caret_nodes|
38
+ caret_nodes[1].declaration.should == caret_nodes[0]
39
+ end
40
+ carets_parse("proc {|&^a| a = 1; ^a}", v).tap do |_, caret_nodes|
41
+ caret_nodes[1].declaration.should == caret_nodes[0]
42
+ end
43
+ if v != 1.8
44
+ carets_parse("proc {|^a=1| a = 1; ^a}", v).tap do |_, caret_nodes|
45
+ caret_nodes[1].declaration.should == caret_nodes[0]
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,89 @@
1
+ require_relative '../../helpers'
2
+
3
+ describe org.jrubyparser.ast.Node do
4
+ VERSIONS.each do |v|
5
+ it "finds method via get_defined_scope [#{v}]" do
6
+ caret_parse("def foo(^a); end", v).tap do |root, caret_node|
7
+ caret_node.defined_scope.should == root.find_node(:defn)
8
+ end
9
+ caret_parse("def foo(); ^a = 1; end", v).tap do |root, caret_node|
10
+ caret_node.defined_scope.should == root.find_node(:defn)
11
+ end
12
+ caret_parse("def foo(a); ^a; end", v).tap do |root, caret_node|
13
+ caret_node.defined_scope.should == root.find_node(:defn)
14
+ end
15
+ caret_parse("def foo(*^a); end", v).tap do |root, caret_node|
16
+ caret_node.defined_scope.should == root.find_node(:defn)
17
+ end
18
+ caret_parse("def foo(&^a); end", v).tap do |root, caret_node|
19
+ caret_node.defined_scope.should == root.find_node(:defn)
20
+ end
21
+ caret_parse("def foo(^a=1); end", v).tap do |root, caret_node|
22
+ caret_node.defined_scope.should == root.find_node(:defn)
23
+ end
24
+
25
+ caret_parse("def foo(a); proc { ^a }end", v).tap do |root, caret_node|
26
+ caret_node.defined_scope.should == root.find_node(:defn)
27
+ end
28
+ caret_parse("def foo(a);proc{proc{^a}};end", v).tap do |root, caret_node|
29
+ caret_node.defined_scope.should == root.find_node(:defn)
30
+ end
31
+ caret_parse("def foo(a);proc{proc{^a=1}};end", v).tap do |root, caret_node|
32
+ caret_node.defined_scope.should == root.find_node(:defn)
33
+ end
34
+ end
35
+
36
+ it "finds iter via get_defined_scope [#{v}]" do
37
+ caret_parse("proc { |^a| }", v).tap do |root, caret_node|
38
+ caret_node.defined_scope.should == root.find_node(:iter)
39
+ end
40
+ caret_parse("proc { || ^a=1}", v).tap do |root, caret_node|
41
+ caret_node.defined_scope.should == root.find_node(:iter)
42
+ end
43
+ caret_parse("proc { |a| ^a}", v).tap do |root, caret_node|
44
+ caret_node.defined_scope.should == root.find_node(:iter)
45
+ end
46
+ caret_parse("proc { |*^a| }", v).tap do |root, caret_node|
47
+ caret_node.defined_scope.should == root.find_node(:iter)
48
+ end
49
+ caret_parse("proc { |&^a| }", v).tap do |root, caret_node|
50
+ caret_node.defined_scope.should == root.find_node(:iter)
51
+ end
52
+ if v != 1.8
53
+ caret_parse("proc { |^a=1| }", v).tap do |root, caret_node|
54
+ caret_node.defined_scope.should == root.find_node(:iter)
55
+ end
56
+ end
57
+ caret_parse("proc { |a| lambda { ^a }}", v).tap do |root, caret_node|
58
+ caret_node.defined_scope.parent.name.should == root.find_node(:iter).parent.name
59
+ end
60
+ end
61
+
62
+ it "finds root via get_defined_scope [#{v}]" do
63
+ caret_parse("^a = 1", v).tap do |root, caret_node|
64
+ caret_node.defined_scope.should == root
65
+ end
66
+ caret_parse("a = 1; ^a", v).tap do |root, caret_node|
67
+ caret_node.defined_scope.should == root
68
+ end
69
+ caret_parse("a = 1; proc { ^a }", v).tap do |root, caret_node|
70
+ caret_node.defined_scope.should == root
71
+ end
72
+ end
73
+
74
+ it "finds proper scope per 1.8/1.9 rules for block vars [#{v}]" do
75
+ if v == 1.8
76
+ caret_parse("a = 1; proc { |a| ^a }", v).tap do |root, caret_node|
77
+ caret_node.defined_scope.should == root
78
+ end
79
+ else # 1.9+
80
+ caret_parse("a = 1; proc { |a| ^a }", v).tap do |root, caret_node|
81
+ caret_node.defined_scope.should == root.find_node(:iter)
82
+ end
83
+ caret_parse("a = 1; proc { |;a| ^a }", v).tap do |root, caret_node|
84
+ caret_node.defined_scope.should == root.find_node(:iter)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,11 +1,7 @@
1
- $LOAD_PATH.unshift File.dirname(__FILE__) + "/../../lib"
2
- $LOAD_PATH.unshift File.dirname(__FILE__) + "/../helpers"
3
- require 'java'
4
- require 'jruby-parser'
5
- require 'parser_helpers'
1
+ require_relative '../../helpers'
6
2
 
7
- describe JRubyParser do
8
- [1.8, 1.9].each do |v|
3
+ describe org.jrubyparser.ast.Node do
4
+ VERSIONS.each do |v|
9
5
  it "finds fcall via simple getNodeAt search [#{v}]" do
10
6
  caret_parse("b = fo^o(1)", v).tap do |root, caret_node|
11
7
  root.find_node(:fcall).should == caret_node
@@ -0,0 +1,87 @@
1
+ require_relative '../../helpers'
2
+
3
+ describe org.jrubyparser.ast.Node do
4
+ VERSIONS.each do |v|
5
+ it "finds all def variable occurrences via get_occurrences [#{v}]" do
6
+ carets_parse("def foo(^a); ^a; end", v).tap do |_, caret_nodes|
7
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
8
+ end
9
+ carets_parse("def foo(*^a); ^a; end", v).tap do |_, caret_nodes|
10
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
11
+ end
12
+ carets_parse("def foo(^a=1); ^a; end", v).tap do |_, caret_nodes|
13
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
14
+ end
15
+ if v != 1.8
16
+ carets_parse("def foo(a=1, ^b); ^b; end", v).tap do |_, caret_nodes|
17
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
18
+ end
19
+ end
20
+ carets_parse("def foo(&^a); ^a; end", v).tap do |_, caret_nodes|
21
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
22
+ end
23
+ carets_parse("def foo(^a, b); p ^a; end", v).tap do |_, caret_nodes|
24
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
25
+ end
26
+ carets_parse("def foo(^a); proc { ^a }; end", v).tap do |_, caret_nodes|
27
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
28
+ end
29
+ if v == 1.8
30
+ carets_parse("def foo(^a); proc { |^a| ^a } end", v).tap do |_, caret_nodes|
31
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
32
+ end
33
+ else
34
+ carets_parse("def foo(^a); proc { |a| a } end", v).tap do |_, caret_nodes|
35
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
36
+ end
37
+ end
38
+ carets_parse("def foo(^a); ^a[:b] = 1; ^a[:b]; end", v).tap do |_, nodes|
39
+ nodes.first.occurrences.to_a.should =~ nodes
40
+ end
41
+ carets_parse("def foo(^a); b = ^a ? {} : []; end", v).tap do |_, nodes|
42
+ nodes.first.occurrences.to_a.should =~ nodes
43
+ end
44
+ end
45
+
46
+ it "finds all root variable occurrences via get_occurrences [#{v}]" do
47
+ carets_parse("^a=1; ^a; ^a if b", v).tap do |_, caret_nodes|
48
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
49
+ end
50
+ carets_parse("^a=1; def foo; a=1; end", v).tap do |_, caret_nodes|
51
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
52
+ end
53
+ carets_parse("a=1; def foo; ^a=1; end", v).tap do |_, caret_nodes|
54
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
55
+ end
56
+ end
57
+
58
+ it "finds all block variable occurrences via get_occurrences [#{v}]" do
59
+ if v == 1.8
60
+ carets_parse("def foo(^a); proc { |^a| ^a } end", v).tap do |_, caret_nodes|
61
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
62
+ end
63
+ else
64
+ carets_parse("def foo(a); proc { |^a| ^a } end", v).tap do |_, caret_nodes|
65
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
66
+ end
67
+ end
68
+ carets_parse("proc { |^a| ^a }", v).tap do |_, caret_nodes|
69
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
70
+ end
71
+ if v != 1.8
72
+ carets_parse("proc { |^a=1| ^a }", v).tap do |_, caret_nodes|
73
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
74
+ end
75
+ carets_parse("proc { |a=1, ^b| ^b }", v).tap do |_, caret_nodes|
76
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
77
+ end
78
+ end
79
+ carets_parse("proc { |&^a| ^a }", v).tap do |_, caret_nodes|
80
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
81
+ end
82
+ carets_parse("proc { |*^a| ^a }", v).tap do |_, caret_nodes|
83
+ caret_nodes.first.occurrences.to_a.should =~ caret_nodes
84
+ end
85
+ end
86
+ end
87
+ end