@@ -5,12 +5,13 @@ module LanguageServer
5
5
class Project
6
6
class Parser < Ripper
7
7
class Result
8
- attr_reader :constants , :classes , :modules
8
+ attr_reader :constants , :classes , :modules , :refs
9
9
10
10
def initialize
11
11
@constants = [ ]
12
12
@classes = [ ]
13
13
@modules = [ ]
14
+ @refs = [ ]
14
15
end
15
16
end
16
17
@@ -40,10 +41,34 @@ def lineno
40
41
super - 1
41
42
end
42
43
44
+ def on_var_ref ( node )
45
+ if node . instance_of? ( Constant )
46
+ build_node ( VarRef , node : node ) . tap do |n |
47
+ result . refs << n
48
+ end
49
+ else
50
+ node
51
+ end
52
+ end
53
+
54
+ def on_const_path_ref ( *nodes )
55
+ if nodes . all? { |n | [ Constant , ConstPathRef , VarRef ] . include? ( n . class ) }
56
+ build_node ( ConstPathRef , nodes : nodes ) . tap do |n |
57
+ result . refs << n
58
+ end
59
+ else
60
+ nodes
61
+ end
62
+ end
63
+
43
64
def on_const ( name )
44
65
build_node ( Constant , namespaces : [ ] , name : name , value : nil )
45
66
end
46
67
68
+ def on_def ( *args )
69
+ args . flatten . compact
70
+ end
71
+
47
72
def on_int ( value )
48
73
build_node ( LiteralValue , value : value . to_i )
49
74
end
@@ -60,15 +85,17 @@ def on_assign(left, right)
60
85
end
61
86
62
87
def on_module ( constant , children )
63
- cn = children . select { |child | child . instance_of? ( Constant ) || child . instance_of? ( Module ) || child . instance_of? ( Class ) }
88
+ cn = children . select { |child | child . respond_to? ( :unshift_namespace ) }
89
+
64
90
build_node ( Module , constant : constant , children : cn ) . tap do |m |
65
91
result . modules << m
66
92
cn . each { |child | child . unshift_namespace ( m ) }
67
93
end
68
94
end
69
95
70
96
def on_class ( constant , superclass , children )
71
- cn = children . select { |child | child . instance_of? ( Constant ) || child . instance_of? ( Module ) || child . instance_of? ( Class ) }
97
+ cn = children . select { |child | child . respond_to? ( :unshift_namespace ) }
98
+
72
99
build_node ( Class , constant : constant , superclass : superclass , children : cn ) . tap do |c |
73
100
result . classes << c
74
101
cn . each { |child | child . unshift_namespace ( c ) }
0 commit comments