jruby-parser 0.4.2 → 0.5.0

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.
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