solargraph 0.18.3 → 0.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/solargraph/api_map/probe.rb +222 -0
- data/lib/solargraph/api_map/source_to_yard.rb +3 -3
- data/lib/solargraph/api_map/store.rb +135 -0
- data/lib/solargraph/api_map.rb +169 -609
- data/lib/solargraph/diagnostics/rubocop.rb +4 -4
- data/lib/solargraph/language_server/host.rb +53 -19
- data/lib/solargraph/language_server/message/extended/document.rb +1 -1
- data/lib/solargraph/language_server/message/extended/search.rb +1 -1
- data/lib/solargraph/language_server/message/method_not_found.rb +1 -1
- data/lib/solargraph/language_server/message/text_document/definition.rb +2 -15
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +2 -15
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +3 -15
- data/lib/solargraph/language_server/message_types.rb +10 -0
- data/lib/solargraph/language_server.rb +1 -0
- data/lib/solargraph/library.rb +8 -0
- data/lib/solargraph/node_methods.rb +6 -1
- data/lib/solargraph/page.rb +2 -1
- data/lib/solargraph/pin/attribute.rb +8 -12
- data/lib/solargraph/pin/base.rb +20 -95
- data/lib/solargraph/pin/base_variable.rb +15 -74
- data/lib/solargraph/pin/block.rb +21 -0
- data/lib/solargraph/pin/block_parameter.rb +30 -44
- data/lib/solargraph/pin/class_variable.rb +3 -0
- data/lib/solargraph/pin/constant.rb +4 -8
- data/lib/solargraph/pin/conversions.rb +4 -3
- data/lib/solargraph/pin/documenting.rb +27 -0
- data/lib/solargraph/pin/global_variable.rb +3 -0
- data/lib/solargraph/pin/instance_variable.rb +5 -4
- data/lib/solargraph/pin/local_variable.rb +8 -15
- data/lib/solargraph/pin/localized.rb +12 -0
- data/lib/solargraph/pin/method.rb +6 -67
- data/lib/solargraph/pin/method_parameter.rb +24 -11
- data/lib/solargraph/pin/namespace.rb +26 -35
- data/lib/solargraph/pin/reference.rb +15 -8
- data/lib/solargraph/pin/symbol.rb +34 -3
- data/lib/solargraph/pin/yard_object.rb +11 -4
- data/lib/solargraph/pin.rb +16 -2
- data/lib/solargraph/server.rb +2 -2
- data/lib/solargraph/source/change.rb +10 -13
- data/lib/solargraph/source/fragment.rb +42 -94
- data/lib/solargraph/source/location.rb +13 -0
- data/lib/solargraph/source/mapper.rb +426 -0
- data/lib/solargraph/source/position.rb +1 -0
- data/lib/solargraph/source/range.rb +11 -3
- data/lib/solargraph/source.rb +93 -284
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/_method.erb +59 -60
- data/lib/solargraph/views/_name_type_tag.erb +10 -0
- data/lib/solargraph/views/_namespace.erb +26 -26
- data/lib/solargraph/views/document.erb +23 -16
- data/lib/solargraph/views/layout.erb +38 -10
- data/lib/solargraph/views/search.erb +12 -11
- data/lib/solargraph/workspace/config.rb +27 -6
- data/lib/solargraph/workspace.rb +10 -2
- data/lib/solargraph.rb +10 -2
- data/lib/yard-solargraph.rb +3 -0
- metadata +25 -20
- data/lib/solargraph/pin/directed/attribute.rb +0 -20
- data/lib/solargraph/pin/directed/method.rb +0 -22
- data/lib/solargraph/pin/directed.rb +0 -9
- data/lib/solargraph/pin/parameter.rb +0 -23
@@ -5,13 +5,13 @@ module Solargraph
|
|
5
5
|
attr_reader :start
|
6
6
|
|
7
7
|
# @return [Position]
|
8
|
-
attr_reader :
|
8
|
+
attr_reader :ending
|
9
9
|
|
10
10
|
# @param start [Position]
|
11
11
|
# @param ending [Position]
|
12
12
|
def initialize start, ending
|
13
13
|
@start = start
|
14
|
-
@
|
14
|
+
@ending = ending
|
15
15
|
end
|
16
16
|
|
17
17
|
# Get a hash of the range. This representation is suitable for use in
|
@@ -20,10 +20,18 @@ module Solargraph
|
|
20
20
|
def to_hash
|
21
21
|
{
|
22
22
|
start: start.to_hash,
|
23
|
-
end:
|
23
|
+
end: ending.to_hash
|
24
24
|
}
|
25
25
|
end
|
26
26
|
|
27
|
+
def contain? position
|
28
|
+
return false if position.line < start.line
|
29
|
+
return false if position.line == start.line and position.character < start.character
|
30
|
+
return false if position.line > ending.line
|
31
|
+
return false if position.line == ending.line and position.character > ending.character
|
32
|
+
true
|
33
|
+
end
|
34
|
+
|
27
35
|
# Create a range from a pair of lines and characters.
|
28
36
|
#
|
29
37
|
# @param l1 [Integer] Starting line
|
data/lib/solargraph/source.rb
CHANGED
@@ -7,8 +7,10 @@ module Solargraph
|
|
7
7
|
autoload :Fragment, 'solargraph/source/fragment'
|
8
8
|
autoload :Position, 'solargraph/source/position'
|
9
9
|
autoload :Range, 'solargraph/source/range'
|
10
|
+
autoload :Location, 'solargraph/source/location'
|
10
11
|
autoload :Updater, 'solargraph/source/updater'
|
11
12
|
autoload :Change, 'solargraph/source/change'
|
13
|
+
autoload :Mapper, 'solargraph/source/mapper'
|
12
14
|
|
13
15
|
# @return [String]
|
14
16
|
attr_reader :code
|
@@ -38,6 +40,12 @@ module Solargraph
|
|
38
40
|
# @return [Time]
|
39
41
|
attr_reader :stime
|
40
42
|
|
43
|
+
attr_reader :pins
|
44
|
+
|
45
|
+
attr_reader :requires
|
46
|
+
|
47
|
+
attr_reader :locals
|
48
|
+
|
41
49
|
include NodeMethods
|
42
50
|
|
43
51
|
def initialize code, filename = nil
|
@@ -57,78 +65,93 @@ module Solargraph
|
|
57
65
|
@path_macros[path]
|
58
66
|
end
|
59
67
|
|
68
|
+
# @todo Temporary blank
|
69
|
+
def path_macros
|
70
|
+
@path_macros ||= {}
|
71
|
+
end
|
72
|
+
|
73
|
+
# @todo Name problem
|
74
|
+
def required
|
75
|
+
requires
|
76
|
+
end
|
77
|
+
|
60
78
|
# @return [Array<String>]
|
61
79
|
def namespaces
|
62
|
-
@namespaces ||= namespace_pin_map.keys
|
63
|
-
|
64
|
-
|
65
|
-
def qualify(signature, fqns)
|
66
|
-
return signature if signature.nil? or signature.empty?
|
67
|
-
base, rest = signature.split('.', 2)
|
68
|
-
parts = fqns.split('::')
|
69
|
-
until parts.empty?
|
70
|
-
here = parts.join('::')
|
71
|
-
parts.pop
|
72
|
-
name = "#{here}::#{base}"
|
73
|
-
next if namespace_pins(name).empty?
|
74
|
-
base = name
|
75
|
-
break
|
76
|
-
end
|
77
|
-
base + (rest.nil? ? '' : ".#{rest}")
|
80
|
+
# @namespaces ||= namespace_pin_map.keys
|
81
|
+
@namespaces ||= pins.select{|pin| pin.kind == Pin::NAMESPACE}.map(&:path)
|
78
82
|
end
|
79
83
|
|
80
84
|
# @param fqns [String] The namespace (nil for all)
|
81
85
|
# @return [Array<Solargraph::Pin::Namespace>]
|
82
86
|
def namespace_pins fqns = nil
|
83
|
-
|
84
|
-
namespace_pin_map[fqns] || []
|
87
|
+
pins.select{|pin| pin.kind == Pin::NAMESPACE}
|
85
88
|
end
|
86
89
|
|
87
90
|
# @param fqns [String] The namespace (nil for all)
|
88
91
|
# @return [Array<Solargraph::Pin::Method>]
|
89
92
|
def method_pins fqns = nil
|
90
|
-
|
91
|
-
method_pin_map[fqns] || []
|
93
|
+
pins.select{|pin| pin.kind == Solargraph::Pin::METHOD}
|
92
94
|
end
|
93
95
|
|
94
96
|
# @return [Array<Solargraph::Pin::Attribute>]
|
95
97
|
def attribute_pins
|
96
|
-
|
98
|
+
pins.select{|pin| pin.kind == Pin::ATTRIBUTE}
|
97
99
|
end
|
98
100
|
|
99
101
|
# @return [Array<Solargraph::Pin::InstanceVariable>]
|
100
102
|
def instance_variable_pins
|
101
|
-
|
103
|
+
pins.select{|pin| pin.kind == Pin::INSTANCE_VARIABLE}
|
102
104
|
end
|
103
105
|
|
104
106
|
# @return [Array<Solargraph::Pin::ClassVariable>]
|
105
107
|
def class_variable_pins
|
106
|
-
|
108
|
+
pins.select{|pin| pin.kind == Pin::CLASS_VARIABLE}
|
107
109
|
end
|
108
110
|
|
109
|
-
|
110
|
-
|
111
|
-
@local_variable_pins ||= []
|
111
|
+
def locals
|
112
|
+
@locals
|
112
113
|
end
|
113
114
|
|
114
115
|
# @return [Array<Solargraph::Pin::GlobalVariable>]
|
115
116
|
def global_variable_pins
|
116
|
-
|
117
|
+
pins.select{|pin| pin.kind == Pin::GLOBAL_VARIABLE}
|
117
118
|
end
|
118
119
|
|
119
120
|
# @return [Array<Solargraph::Pin::Constant>]
|
120
121
|
def constant_pins
|
121
|
-
|
122
|
+
pins.select{|pin| pin.kind == Pin::CONSTANT}
|
122
123
|
end
|
123
124
|
|
124
125
|
# @return [Array<Solargraph::Pin::Symbol>]
|
125
126
|
def symbol_pins
|
126
|
-
@
|
127
|
+
@symbols
|
127
128
|
end
|
128
129
|
|
129
|
-
|
130
|
-
|
131
|
-
|
130
|
+
def symbols
|
131
|
+
symbol_pins
|
132
|
+
end
|
133
|
+
|
134
|
+
def locate_named_path_pin line, character
|
135
|
+
_locate_pin line, character, Pin::NAMESPACE, Pin::METHOD
|
136
|
+
end
|
137
|
+
|
138
|
+
def locate_namespace_pin line, character
|
139
|
+
_locate_pin line, character, Pin::NAMESPACE
|
140
|
+
end
|
141
|
+
|
142
|
+
def locate_block_pin line, character
|
143
|
+
_locate_pin line, character, Pin::NAMESPACE, Pin::METHOD, Pin::BLOCK
|
144
|
+
end
|
145
|
+
|
146
|
+
def _locate_pin line, character, *kinds
|
147
|
+
position = Solargraph::Source::Position.new(line, character)
|
148
|
+
found = nil
|
149
|
+
pins.each do |pin|
|
150
|
+
found = pin if (kinds.empty? or kinds.include?(pin.kind)) and pin.location.range.contain?(position)
|
151
|
+
break if pin.location.range.start.line > line
|
152
|
+
end
|
153
|
+
# @todo Assuming the root pin is always valid
|
154
|
+
found || pins.first
|
132
155
|
end
|
133
156
|
|
134
157
|
# @return [YARD::Docstring]
|
@@ -158,28 +181,35 @@ module Solargraph
|
|
158
181
|
tree_at(line, column).first
|
159
182
|
end
|
160
183
|
|
184
|
+
def string_at?(line, column)
|
185
|
+
node = node_at(line, column)
|
186
|
+
# @todo raise InvalidOffset or InvalidRange or something?
|
187
|
+
return false if node.nil?
|
188
|
+
node.type == :str or node.type == :dstr
|
189
|
+
end
|
190
|
+
|
161
191
|
# Get an array of nodes containing the specified index, starting with the
|
162
192
|
# nearest node and ending with the root.
|
163
193
|
#
|
164
194
|
# @param index [Integer]
|
165
195
|
# @return [Array<AST::Node>]
|
166
196
|
def tree_at(line, column)
|
167
|
-
# offset = get_parsed_offset(line, column)
|
168
197
|
offset = Position.line_char_to_offset(@code, line, column)
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
198
|
+
stack = []
|
199
|
+
inner_tree_at @node, offset, stack
|
200
|
+
stack
|
201
|
+
end
|
202
|
+
|
203
|
+
def inner_tree_at node, offset, stack
|
204
|
+
stack.unshift node
|
205
|
+
node.children.each do |c|
|
206
|
+
next unless c.is_a?(AST::Node)
|
207
|
+
next if c.loc.expression.nil?
|
208
|
+
if offset >= c.loc.expression.begin_pos and offset < c.loc.expression.end_pos
|
209
|
+
inner_tree_at(c, offset, stack)
|
210
|
+
break
|
180
211
|
end
|
181
212
|
end
|
182
|
-
[@node]
|
183
213
|
end
|
184
214
|
|
185
215
|
# Find the nearest parent node from the specified index. If one or more
|
@@ -265,7 +295,7 @@ module Solargraph
|
|
265
295
|
|
266
296
|
# @return [Solargraph::Source::Fragment]
|
267
297
|
def fragment_at line, column
|
268
|
-
Fragment.new(self, line, column
|
298
|
+
Fragment.new(self, line, column)
|
269
299
|
end
|
270
300
|
|
271
301
|
def fragment_for node
|
@@ -283,71 +313,33 @@ module Solargraph
|
|
283
313
|
private
|
284
314
|
|
285
315
|
def parse
|
286
|
-
node, comments =
|
316
|
+
node, comments = inner_parse(@fixed, filename)
|
317
|
+
@node = node
|
318
|
+
@comments = comments
|
287
319
|
process_parsed node, comments
|
288
320
|
@parsed = true
|
289
321
|
end
|
290
322
|
|
291
323
|
def hard_fix_node
|
292
|
-
@fixed = @code.gsub(/[^\s]/, '
|
293
|
-
node, comments =
|
324
|
+
@fixed = @code.gsub(/[^\s]/, '_')
|
325
|
+
node, comments = inner_parse(@fixed, filename)
|
326
|
+
@node = node
|
327
|
+
@comments = comments
|
294
328
|
process_parsed node, comments
|
295
329
|
@parsed = false
|
296
330
|
end
|
297
331
|
|
332
|
+
def inner_parse code, filename
|
333
|
+
parser = Parser::CurrentRuby.new(FlawedBuilder.new)
|
334
|
+
parser.diagnostics.all_errors_are_fatal = true
|
335
|
+
parser.diagnostics.ignore_warnings = true
|
336
|
+
buffer = Parser::Source::Buffer.new(filename, 1)
|
337
|
+
buffer.source = code.force_encoding(Encoding::UTF_8)
|
338
|
+
parser.parse_with_comments(buffer)
|
339
|
+
end
|
340
|
+
|
298
341
|
def process_parsed node, comments
|
299
|
-
|
300
|
-
root = root.append node
|
301
|
-
@node = root
|
302
|
-
@namespaces = nil
|
303
|
-
@comments = comments
|
304
|
-
@directives = {}
|
305
|
-
@path_macros = {}
|
306
|
-
@docstring_hash = associate_comments(node, comments)
|
307
|
-
@mtime = (!filename.nil? and File.exist?(filename) ? File.mtime(filename) : nil)
|
308
|
-
@all_nodes = []
|
309
|
-
@node_stack = []
|
310
|
-
@node_tree = {}
|
311
|
-
namespace_pin_map.clear
|
312
|
-
namespace_pin_map[''] = [Solargraph::Pin::Namespace.new(self, @node, '', :public)]
|
313
|
-
@namespace_pins = nil
|
314
|
-
instance_variable_pins.clear
|
315
|
-
class_variable_pins.clear
|
316
|
-
local_variable_pins.clear
|
317
|
-
symbol_pins.clear
|
318
|
-
constant_pins.clear
|
319
|
-
method_pin_map.clear
|
320
|
-
# namespace_includes.clear
|
321
|
-
attribute_pins.clear
|
322
|
-
@node_object_ids = nil
|
323
|
-
inner_map_node @node
|
324
|
-
@directives.each_pair do |k, v|
|
325
|
-
v.each do |d|
|
326
|
-
ns = namespace_for(k.node)
|
327
|
-
docstring = YARD::Docstring.parser.parse(d.tag.text).to_docstring
|
328
|
-
if d.tag.tag_name == 'attribute'
|
329
|
-
t = (d.tag.types.nil? || d.tag.types.empty?) ? nil : d.tag.types.flatten.join('')
|
330
|
-
if t.nil? or t.include?('r')
|
331
|
-
attribute_pins.push Solargraph::Pin::Directed::Attribute.new(self, k.node, ns, :reader, docstring, d.tag.name)
|
332
|
-
end
|
333
|
-
if t.nil? or t.include?('w')
|
334
|
-
attribute_pins.push Solargraph::Pin::Directed::Attribute.new(self, k.node, ns, :writer, docstring, "#{d.tag.name}=")
|
335
|
-
end
|
336
|
-
elsif d.tag.tag_name == 'method'
|
337
|
-
gen_src = Source.new("def #{d.tag.name};end", filename)
|
338
|
-
gen_pin = gen_src.method_pins.first
|
339
|
-
method_pin_map[ns] ||= []
|
340
|
-
method_pin_map[ns].push Solargraph::Pin::Directed::Method.new(gen_src, gen_pin.node, ns, :instance, :public, docstring, gen_pin.name)
|
341
|
-
elsif d.tag.tag_name == 'macro'
|
342
|
-
# @todo Handle various types of macros (attach, new, whatever)
|
343
|
-
path = path_for(k.node)
|
344
|
-
@path_macros[path] = v
|
345
|
-
else
|
346
|
-
STDERR.puts "Nothing to do for directive: #{d}"
|
347
|
-
end
|
348
|
-
end
|
349
|
-
end
|
350
|
-
@all_pins = namespace_pin_map.values.flatten + instance_variable_pins + class_variable_pins + local_variable_pins + symbol_pins + constant_pins + method_pins + attribute_pins
|
342
|
+
@pins, @locals, @requires, @symbols, @path_macros = Mapper.map filename, code, node, comments
|
351
343
|
@stime = Time.now
|
352
344
|
end
|
353
345
|
|
@@ -383,180 +375,6 @@ module Solargraph
|
|
383
375
|
yard_hash
|
384
376
|
end
|
385
377
|
|
386
|
-
def inner_map_node node, tree = [], visibility = :public, scope = :instance, fqn = '', stack = []
|
387
|
-
stack.push node
|
388
|
-
source = self
|
389
|
-
if node.kind_of?(AST::Node)
|
390
|
-
@all_nodes.push node
|
391
|
-
@node_stack.unshift node
|
392
|
-
if node.type == :class or node.type == :module
|
393
|
-
visibility = :public
|
394
|
-
if node.children[0].kind_of?(AST::Node) and node.children[0].children[0].kind_of?(AST::Node) and node.children[0].children[0].type == :cbase
|
395
|
-
tree = pack_name(node.children[0])
|
396
|
-
else
|
397
|
-
tree = tree + pack_name(node.children[0])
|
398
|
-
end
|
399
|
-
fqn = tree.join('::')
|
400
|
-
sc = nil
|
401
|
-
nspin = Solargraph::Pin::Namespace.new(self, node, tree[0..-2].join('::') || '', :public, sc)
|
402
|
-
if node.type == :class and !node.children[1].nil?
|
403
|
-
nspin.reference_superclass unpack_name(node.children[1])
|
404
|
-
end
|
405
|
-
namespace_pin_map[nspin.path] ||= []
|
406
|
-
namespace_pin_map[nspin.path].push nspin
|
407
|
-
end
|
408
|
-
file = source.filename
|
409
|
-
node.children.each do |c|
|
410
|
-
if c.kind_of?(AST::Node)
|
411
|
-
@node_tree[c.object_id] = @node_stack.clone
|
412
|
-
if c.type == :ivasgn
|
413
|
-
par = find_parent(stack, :class, :module, :def, :defs)
|
414
|
-
local_scope = ( (par.kind_of?(AST::Node) and par.type == :def) ? :instance : :class )
|
415
|
-
if c.children[1].nil?
|
416
|
-
ora = find_parent(stack, :or_asgn)
|
417
|
-
unless ora.nil?
|
418
|
-
u = c.updated(:ivasgn, c.children + ora.children[1..-1], nil)
|
419
|
-
@all_nodes.push u
|
420
|
-
@node_tree[u.object_id] = @node_stack.clone
|
421
|
-
@docstring_hash[u.loc] = docstring_for(ora)
|
422
|
-
instance_variable_pins.push Solargraph::Pin::InstanceVariable.new(self, u, fqn || '', local_scope)
|
423
|
-
end
|
424
|
-
else
|
425
|
-
instance_variable_pins.push Solargraph::Pin::InstanceVariable.new(self, c, fqn || '', local_scope)
|
426
|
-
end
|
427
|
-
elsif c.type == :cvasgn
|
428
|
-
if c.children[1].nil?
|
429
|
-
ora = find_parent(stack, :or_asgn)
|
430
|
-
unless ora.nil?
|
431
|
-
u = c.updated(:cvasgn, c.children + ora.children[1..-1], nil)
|
432
|
-
@node_tree[u.object_id] = @node_stack.clone
|
433
|
-
@all_nodes.push u
|
434
|
-
@docstring_hash[u.loc] = docstring_for(ora)
|
435
|
-
class_variable_pins.push Solargraph::Pin::ClassVariable.new(self, u, fqn || '')
|
436
|
-
end
|
437
|
-
else
|
438
|
-
class_variable_pins.push Solargraph::Pin::ClassVariable.new(self, c, fqn || '')
|
439
|
-
end
|
440
|
-
elsif c.type == :lvasgn
|
441
|
-
if c.children[1].nil?
|
442
|
-
ora = find_parent(stack, :or_asgn)
|
443
|
-
unless ora.nil?
|
444
|
-
u = c.updated(:lvasgn, c.children + ora.children[1..-1], nil)
|
445
|
-
@all_nodes.push u
|
446
|
-
@node_tree[u] = @node_stack.clone
|
447
|
-
@docstring_hash[u.loc] = docstring_for(ora)
|
448
|
-
local_variable_pins.push Solargraph::Pin::LocalVariable.new(self, u, fqn || '', @node_stack.clone)
|
449
|
-
end
|
450
|
-
else
|
451
|
-
@node_tree[c] = @node_stack.clone
|
452
|
-
local_variable_pins.push Solargraph::Pin::LocalVariable.new(self, c, fqn || '', @node_stack.clone)
|
453
|
-
end
|
454
|
-
elsif c.type == :gvasgn
|
455
|
-
global_variable_pins.push Solargraph::Pin::GlobalVariable.new(self, c, fqn || '')
|
456
|
-
elsif c.type == :sym
|
457
|
-
symbol_pins.push Solargraph::Pin::Symbol.new(self, c, fqn)
|
458
|
-
elsif c.type == :casgn
|
459
|
-
constant_pins.push Solargraph::Pin::Constant.new(self, c, fqn, :public)
|
460
|
-
elsif c.type == :def and c.children[0].to_s[0].match(/[a-z]/i)
|
461
|
-
method_pin_map[fqn || ''] ||= []
|
462
|
-
method_pin_map[fqn || ''].push Solargraph::Pin::Method.new(source, c, fqn || '', scope, visibility)
|
463
|
-
elsif c.type == :defs
|
464
|
-
s_visi = visibility
|
465
|
-
s_visi = :public if scope != :class
|
466
|
-
if c.children[0].is_a?(AST::Node) and c.children[0].type == :self
|
467
|
-
dfqn = fqn || ''
|
468
|
-
else
|
469
|
-
dfqn = unpack_name(c.children[0])
|
470
|
-
end
|
471
|
-
unless dfqn.nil?
|
472
|
-
method_pin_map[dfqn] ||= []
|
473
|
-
method_pin_map[dfqn].push Solargraph::Pin::Method.new(source, c, dfqn, :class, s_visi)
|
474
|
-
inner_map_node c, tree, scope, :class, dfqn, stack
|
475
|
-
end
|
476
|
-
next
|
477
|
-
elsif c.type == :send and [:public, :protected, :private].include?(c.children[1])
|
478
|
-
visibility = c.children[1]
|
479
|
-
elsif c.type == :send and [:private_class_method].include?(c.children[1]) and c.children[2].kind_of?(AST::Node)
|
480
|
-
if c.children[2].type == :sym or c.children[2].type == :str
|
481
|
-
ref = method_pins(fqn || '').select{|p| p.name == c.children[2].children[0].to_s}.first
|
482
|
-
unless ref.nil?
|
483
|
-
method_pin_map[fqn || ''].delete ref
|
484
|
-
method_pin_map[fqn || ''].push Solargraph::Pin::Method.new(ref.source, ref.node, ref.namespace, ref.scope, :private)
|
485
|
-
end
|
486
|
-
else
|
487
|
-
inner_map_node c, tree, :private, :class, fqn, stack
|
488
|
-
next
|
489
|
-
end
|
490
|
-
elsif c.type == :send and [:private_constant].include?(c.children[1]) and c.children[2].kind_of?(AST::Node)
|
491
|
-
if c.children[2].type == :sym or c.children[2].type == :str
|
492
|
-
cn = c.children[2].children[0].to_s
|
493
|
-
ref = constant_pins.select{|p| p.name == cn}.first
|
494
|
-
if ref.nil?
|
495
|
-
ref = namespace_pin_map.values.flatten.select{|p| p.name == cn and p.namespace == fqn}.last
|
496
|
-
unless ref.nil?
|
497
|
-
namespace_pin_map[ref.path].delete ref
|
498
|
-
namespace_pin_map[ref.path].push Solargraph::Pin::Namespace.new(ref.source, ref.node, ref.namespace, :private, (ref.superclass_reference.nil? ? nil : ref.superclass_reference.name))
|
499
|
-
end
|
500
|
-
else
|
501
|
-
source.constant_pins.delete ref
|
502
|
-
source.constant_pins.push Solargraph::Pin::Constant.new(ref.source, ref.node, ref.namespace, :private)
|
503
|
-
end
|
504
|
-
end
|
505
|
-
next
|
506
|
-
elsif c.type == :send and c.children[1] == :include and c.children[0].nil?
|
507
|
-
if @node_tree[0].nil? or @node_tree[0].type == :source or @node_tree[0].type == :class or @node_tree[0].type == :module or (@node_tree.length > 1 and @node_tree[0].type == :begin and (@node_tree[1].type == :class or @node_tree[1].type == :module))
|
508
|
-
if c.children[2].kind_of?(AST::Node) and c.children[2].type == :const
|
509
|
-
c.children[2..-1].each do |i|
|
510
|
-
namespace_pins(fqn || '').last.reference_include unpack_name(i)
|
511
|
-
end
|
512
|
-
end
|
513
|
-
end
|
514
|
-
elsif c.type == :send and c.children[1] == :extend and c.children[0].nil?
|
515
|
-
if @node_tree[0].nil? or @node_tree[0].type == :source or @node_tree[0].type == :class or @node_tree[0].type == :module or (@node_tree.length > 1 and @node_tree[0].type == :begin and (@node_tree[1].type == :class or @node_tree[1].type == :module))
|
516
|
-
if c.children[2].kind_of?(AST::Node) and c.children[2].type == :const
|
517
|
-
# namespace_extends[fqn || ''] ||= []
|
518
|
-
c.children[2..-1].each do |i|
|
519
|
-
namespace_pin_map[fqn || ''].last.reference_extend unpack_name(i)
|
520
|
-
end
|
521
|
-
end
|
522
|
-
end
|
523
|
-
elsif c.type == :send and [:attr_reader, :attr_writer, :attr_accessor].include?(c.children[1])
|
524
|
-
c.children[2..-1].each do |a|
|
525
|
-
if c.children[1] == :attr_reader or c.children[1] == :attr_accessor
|
526
|
-
attribute_pins.push Solargraph::Pin::Attribute.new(self, a, fqn || '', :reader, docstring_for(c)) #AttrPin.new(c)
|
527
|
-
end
|
528
|
-
if c.children[1] == :attr_writer or c.children[1] == :attr_accessor
|
529
|
-
attribute_pins.push Solargraph::Pin::Attribute.new(self, a, fqn || '', :writer, docstring_for(c)) #AttrPin.new(c)
|
530
|
-
end
|
531
|
-
end
|
532
|
-
elsif c.type == :sclass and c.children[0].type == :self
|
533
|
-
inner_map_node c, tree, :public, :class, fqn || '', stack
|
534
|
-
next
|
535
|
-
elsif c.type == :send and c.children[1] == :require
|
536
|
-
if c.children[2].kind_of?(AST::Node) and c.children[2].type == :str
|
537
|
-
required.push c.children[2].children[0].to_s
|
538
|
-
end
|
539
|
-
elsif c.type == :args
|
540
|
-
if @node_stack.first.type == :block
|
541
|
-
pi = 0
|
542
|
-
c.children.each do |u|
|
543
|
-
local_variable_pins.push Solargraph::Pin::BlockParameter.new(self, u, fqn || '', @node_stack.clone, pi)
|
544
|
-
pi += 1
|
545
|
-
end
|
546
|
-
else
|
547
|
-
c.children.each do |u|
|
548
|
-
local_variable_pins.push Solargraph::Pin::MethodParameter.new(self, u, fqn || '', @node_stack.clone)
|
549
|
-
end
|
550
|
-
end
|
551
|
-
end
|
552
|
-
inner_map_node c, tree, visibility, scope, fqn, stack
|
553
|
-
end
|
554
|
-
end
|
555
|
-
@node_stack.shift
|
556
|
-
end
|
557
|
-
stack.pop
|
558
|
-
end
|
559
|
-
|
560
378
|
def find_parent(stack, *types)
|
561
379
|
stack.reverse.each { |p|
|
562
380
|
return p if types.include?(p.type)
|
@@ -590,15 +408,6 @@ module Solargraph
|
|
590
408
|
Source.new code, filename
|
591
409
|
end
|
592
410
|
|
593
|
-
def parse code, filename = nil
|
594
|
-
parser = Parser::CurrentRuby.new(FlawedBuilder.new)
|
595
|
-
parser.diagnostics.all_errors_are_fatal = true
|
596
|
-
parser.diagnostics.ignore_warnings = true
|
597
|
-
buffer = Parser::Source::Buffer.new(filename, 1)
|
598
|
-
buffer.source = code.force_encoding(Encoding::UTF_8)
|
599
|
-
parser.parse_with_comments(buffer)
|
600
|
-
end
|
601
|
-
|
602
411
|
def fix code, filename = nil, offset = nil
|
603
412
|
tries = 0
|
604
413
|
offset = Source.get_offset(code, offset[0], offset[1]) if offset.kind_of?(Array)
|
data/lib/solargraph/version.rb
CHANGED
@@ -1,60 +1,59 @@
|
|
1
|
-
<h2>
|
2
|
-
Namespace:
|
3
|
-
</h2>
|
4
|
-
<p>
|
5
|
-
<a href="command:solargraph._openDocument?<%= URI.escape "\"solargraph:/document
|
6
|
-
</p>
|
7
|
-
<h2>
|
8
|
-
Overview:
|
9
|
-
</h2>
|
10
|
-
<%= htmlify object.docstring %>
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
<
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
<%
|
52
|
-
<% examples
|
53
|
-
<%
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
<% end %>
|
1
|
+
<h2>
|
2
|
+
Namespace:
|
3
|
+
</h2>
|
4
|
+
<p>
|
5
|
+
<a href="command:solargraph._openDocument?<%= URI.escape "\"solargraph:/document?query=#{object.namespace}\"" %>"><%= object.namespace %></a>
|
6
|
+
</p>
|
7
|
+
<h2>
|
8
|
+
Overview:
|
9
|
+
</h2>
|
10
|
+
<%= htmlify object.docstring %>
|
11
|
+
<% unless object.tags(:param).empty? %>
|
12
|
+
<h2>
|
13
|
+
Parameters:
|
14
|
+
</h2>
|
15
|
+
<ul>
|
16
|
+
<% object.tags(:param).each do |tag| %>
|
17
|
+
<li>
|
18
|
+
<%= erb :_name_type_tag, layout: false, locals: {tag: tag} %>
|
19
|
+
</li>
|
20
|
+
<% end %>
|
21
|
+
</ul>
|
22
|
+
<% end %>
|
23
|
+
<% unless object.tags(:raise).empty? %>
|
24
|
+
<h2>
|
25
|
+
Raises:
|
26
|
+
</h2>
|
27
|
+
<ul>
|
28
|
+
<% object.tags(:raise).each do |tag| %>
|
29
|
+
<li>
|
30
|
+
<%= erb :_name_type_tag, layout: false, locals: {tag: tag} %>
|
31
|
+
</li>
|
32
|
+
<% end %>
|
33
|
+
</ul>
|
34
|
+
<% end %>
|
35
|
+
<h2>
|
36
|
+
Returns:
|
37
|
+
</h2>
|
38
|
+
<% if object.tag(:return).nil? %>
|
39
|
+
<p>
|
40
|
+
Undefined/unknown
|
41
|
+
</p>
|
42
|
+
<% else %>
|
43
|
+
<ul>
|
44
|
+
<% object.tags(:return).each do |tag| %>
|
45
|
+
<li>
|
46
|
+
<%= erb :_name_type_tag, layout: false, locals: {tag: tag} %>
|
47
|
+
</li>
|
48
|
+
<% end %>
|
49
|
+
</ul>
|
50
|
+
<% end %>
|
51
|
+
<% examples = object.tags(:example) %>
|
52
|
+
<% unless examples.nil? %>
|
53
|
+
<% examples.each do |example| %>
|
54
|
+
<h2>
|
55
|
+
Example: <%= example.name %>
|
56
|
+
</h2>
|
57
|
+
<%= ruby_to_html example.text.strip %>
|
58
|
+
<% end %>
|
59
|
+
<% end %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<%= tag.name %>
|
2
|
+
<% unless tag.types.nil? or tag.types.empty? %>
|
3
|
+
[<%= tag.types.join(', ') %>]
|
4
|
+
<% end %>
|
5
|
+
<% unless tag.text.empty? %>
|
6
|
+
<% unless (tag.name.nil? or tag.name.empty?) and (tag.types.nil? or tag.types.empty?) %>
|
7
|
+
-
|
8
|
+
<% end %>
|
9
|
+
<%= tag.text %>
|
10
|
+
<% end %>
|