solargraph 0.18.3 → 0.19.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.
- 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 %>
|