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
@@ -13,17 +13,17 @@ module Solargraph
|
|
13
13
|
begin
|
14
14
|
cmd = "rubocop -f j -s #{Shellwords.escape(filename)}"
|
15
15
|
o, e, s = Open3.capture3(cmd, stdin_data: text)
|
16
|
-
|
16
|
+
raise DiagnosticsError, "RuboCop is not available" if e.include?('Gem::Exception')
|
17
|
+
raise DiagnosticsError, "RuboCop returned empty data" if o.empty?
|
18
|
+
make_array JSON.parse(o)
|
17
19
|
rescue JSON::ParserError
|
18
20
|
raise DiagnosticsError, 'RuboCop returned invalid data'
|
19
|
-
rescue Exception => e
|
20
|
-
raise DiagnosticsError, 'An internal error occurred while running diagnostics'
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
25
25
|
|
26
|
-
def make_array
|
26
|
+
def make_array resp
|
27
27
|
severities = {
|
28
28
|
'refactor' => 4,
|
29
29
|
'convention' => 3,
|
@@ -24,7 +24,7 @@ module Solargraph
|
|
24
24
|
|
25
25
|
# @param update [Hash]
|
26
26
|
def configure update
|
27
|
-
options.merge! update
|
27
|
+
options.merge! update unless update.nil?
|
28
28
|
end
|
29
29
|
|
30
30
|
# @return [Hash]
|
@@ -51,15 +51,17 @@ module Solargraph
|
|
51
51
|
begin
|
52
52
|
message.process
|
53
53
|
rescue Exception => e
|
54
|
+
STDERR.puts e.message
|
55
|
+
STDERR.puts e.backtrace
|
54
56
|
message.set_error Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}"
|
55
57
|
end
|
56
58
|
message
|
57
59
|
end
|
58
60
|
|
59
61
|
def create uri
|
62
|
+
filename = uri_to_file(uri)
|
60
63
|
@change_semaphore.synchronize do
|
61
|
-
filename
|
62
|
-
library.create filename, File.read(filename)
|
64
|
+
library.create_from_disk filename
|
63
65
|
end
|
64
66
|
end
|
65
67
|
|
@@ -142,7 +144,15 @@ module Solargraph
|
|
142
144
|
path = nil
|
143
145
|
path = normalize_separators(directory) unless directory.nil?
|
144
146
|
@change_semaphore.synchronize do
|
145
|
-
|
147
|
+
begin
|
148
|
+
@library = Solargraph::Library.load(path)
|
149
|
+
rescue WorkspaceTooLargeError => e
|
150
|
+
send_notification 'window/showMessage', {
|
151
|
+
'type' => Solargraph::LanguageServer::MessageTypes::WARNING,
|
152
|
+
'message' => "The workspace is too large to index (#{e.size} files, max #{Workspace::MAX_WORKSPACE_SIZE})"
|
153
|
+
}
|
154
|
+
@library = Solargraph::Library.load(nil)
|
155
|
+
end
|
146
156
|
end
|
147
157
|
end
|
148
158
|
|
@@ -195,34 +205,46 @@ module Solargraph
|
|
195
205
|
end
|
196
206
|
|
197
207
|
def completions_at filename, line, column
|
198
|
-
|
208
|
+
result = nil
|
199
209
|
@change_semaphore.synchronize do
|
200
|
-
|
210
|
+
result = library.completions_at filename, line, column
|
201
211
|
end
|
202
|
-
|
212
|
+
result
|
203
213
|
end
|
204
214
|
|
205
215
|
# @return [Array<Solargraph::Pin::Base>]
|
206
216
|
def definitions_at filename, line, column
|
207
|
-
|
217
|
+
result = []
|
208
218
|
@change_semaphore.synchronize do
|
209
|
-
|
219
|
+
result = library.definitions_at(filename, line, column)
|
210
220
|
end
|
211
|
-
|
221
|
+
result
|
212
222
|
end
|
213
223
|
|
214
224
|
def signatures_at filename, line, column
|
215
|
-
|
225
|
+
result = nil
|
216
226
|
@change_semaphore.synchronize do
|
217
|
-
|
227
|
+
result = library.signatures_at(filename, line, column)
|
218
228
|
end
|
219
|
-
|
229
|
+
result
|
220
230
|
end
|
221
231
|
|
222
232
|
def query_symbols query
|
223
|
-
|
224
|
-
@change_semaphore.synchronize {
|
225
|
-
|
233
|
+
result = nil
|
234
|
+
@change_semaphore.synchronize { result = library.query_symbols(query) }
|
235
|
+
result
|
236
|
+
end
|
237
|
+
|
238
|
+
def search query
|
239
|
+
result = nil
|
240
|
+
@change_semaphore.synchronize { result = library.search(query) }
|
241
|
+
result
|
242
|
+
end
|
243
|
+
|
244
|
+
def document query
|
245
|
+
result = nil
|
246
|
+
@change_semaphore.synchronize { result = library.document(query) }
|
247
|
+
result
|
226
248
|
end
|
227
249
|
|
228
250
|
def file_symbols uri
|
@@ -323,8 +345,20 @@ module Solargraph
|
|
323
345
|
}
|
324
346
|
end
|
325
347
|
end
|
326
|
-
rescue
|
327
|
-
STDERR.puts "Error in diagnostics: #{e.
|
348
|
+
rescue DiagnosticsError => e
|
349
|
+
STDERR.puts "Error in diagnostics: #{e.message}"
|
350
|
+
options['diagnostics'] = false
|
351
|
+
send_notification 'window/showMessage', {
|
352
|
+
type: LanguageServer::MessageTypes::ERROR,
|
353
|
+
message: "Error in diagnostics: #{e.message}"
|
354
|
+
}
|
355
|
+
rescue Errno::ENOENT => e
|
356
|
+
STDERR.puts "Error in diagnostics: RuboCop could not be found"
|
357
|
+
options['diagnostics'] = false
|
358
|
+
send_notification 'window/showMessage', {
|
359
|
+
type: LanguageServer::MessageTypes::ERROR,
|
360
|
+
message: "Error in diagnostics: RuboCop could not be found"
|
361
|
+
}
|
328
362
|
end
|
329
363
|
end
|
330
364
|
end
|
@@ -340,7 +374,7 @@ module Solargraph
|
|
340
374
|
params['contentChanges'].each do |chng|
|
341
375
|
changes.push Solargraph::Source::Change.new(
|
342
376
|
(chng['range'].nil? ?
|
343
|
-
nil :
|
377
|
+
nil :
|
344
378
|
Solargraph::Source::Range.from_to(chng['range']['start']['line'], chng['range']['start']['character'], chng['range']['end']['line'], chng['range']['end']['character'])
|
345
379
|
),
|
346
380
|
chng['text']
|
@@ -4,7 +4,7 @@ module Solargraph
|
|
4
4
|
module Extended
|
5
5
|
class Document < Base
|
6
6
|
def process
|
7
|
-
objects = host.
|
7
|
+
objects = host.document(params['query'])
|
8
8
|
page = Solargraph::Page.new(host.options['viewsPath'])
|
9
9
|
content = page.render('document', locals: {objects: objects})
|
10
10
|
set_result(
|
@@ -4,7 +4,7 @@ module Solargraph
|
|
4
4
|
module Extended
|
5
5
|
class Search < Base
|
6
6
|
def process
|
7
|
-
results = host.
|
7
|
+
results = host.search(params['query'])
|
8
8
|
page = Solargraph::Page.new(host.options['viewsPath'])
|
9
9
|
content = page.render('search', locals: {query: params['query'], results: results})
|
10
10
|
set_result(
|
@@ -13,22 +13,9 @@ module Solargraph::LanguageServer::Message::TextDocument
|
|
13
13
|
suggestions = host.definitions_at(filename, line, col)
|
14
14
|
locations = suggestions.map do |pin|
|
15
15
|
unless pin.location.nil?
|
16
|
-
parts = pin.location.split(':')
|
17
|
-
char = parts.pop.to_i
|
18
|
-
line = parts.pop.to_i
|
19
|
-
filename = parts.join(':')
|
20
16
|
{
|
21
|
-
uri: file_to_uri(filename),
|
22
|
-
range:
|
23
|
-
start: {
|
24
|
-
line: line,
|
25
|
-
character: char
|
26
|
-
},
|
27
|
-
end: {
|
28
|
-
line: line,
|
29
|
-
character: char
|
30
|
-
}
|
31
|
-
}
|
17
|
+
uri: file_to_uri(pin.location.filename),
|
18
|
+
range: pin.location.range.to_hash
|
32
19
|
}
|
33
20
|
end
|
34
21
|
end
|
@@ -4,25 +4,12 @@ class Solargraph::LanguageServer::Message::TextDocument::DocumentSymbol < Solarg
|
|
4
4
|
def process
|
5
5
|
pins = host.file_symbols params['textDocument']['uri']
|
6
6
|
info = pins.map do |pin|
|
7
|
-
parts = pin.location.split(':')
|
8
|
-
char = parts.pop.to_i
|
9
|
-
line = parts.pop.to_i
|
10
|
-
filename = parts.join(':')
|
11
7
|
{
|
12
8
|
name: pin.path,
|
13
9
|
kind: Solargraph::LanguageServer::SymbolKinds::NAMESPACE,
|
14
10
|
location: {
|
15
|
-
uri: file_to_uri(filename),
|
16
|
-
range:
|
17
|
-
start: {
|
18
|
-
line: line,
|
19
|
-
character: char
|
20
|
-
},
|
21
|
-
end: {
|
22
|
-
line: line,
|
23
|
-
character: char
|
24
|
-
}
|
25
|
-
}
|
11
|
+
uri: file_to_uri(pin.location.filename),
|
12
|
+
range: pin.location.range.to_hash
|
26
13
|
}
|
27
14
|
}
|
28
15
|
end
|
@@ -4,25 +4,13 @@ class Solargraph::LanguageServer::Message::Workspace::WorkspaceSymbol < Solargra
|
|
4
4
|
def process
|
5
5
|
pins = host.query_symbols(params['query'])
|
6
6
|
info = pins.map do |pin|
|
7
|
-
|
8
|
-
char = parts.pop.to_i
|
9
|
-
line = parts.pop.to_i
|
10
|
-
filename = parts.join(':')
|
7
|
+
uri = file_to_uri(pin.location.filename)
|
11
8
|
{
|
12
9
|
name: pin.path,
|
13
10
|
kind: Solargraph::LanguageServer::SymbolKinds::NAMESPACE,
|
14
11
|
location: {
|
15
|
-
uri:
|
16
|
-
range:
|
17
|
-
start: {
|
18
|
-
line: line,
|
19
|
-
character: char
|
20
|
-
},
|
21
|
-
end: {
|
22
|
-
line: line,
|
23
|
-
character: char
|
24
|
-
}
|
25
|
-
}
|
12
|
+
uri: uri,
|
13
|
+
range: pin.location.range.to_hash
|
26
14
|
}
|
27
15
|
}
|
28
16
|
end
|
@@ -8,5 +8,6 @@ module Solargraph
|
|
8
8
|
autoload :Message, 'solargraph/language_server/message'
|
9
9
|
autoload :Transport, 'solargraph/language_server/transport'
|
10
10
|
autoload :UriHelpers, 'solargraph/language_server/uri_helpers'
|
11
|
+
autoload :MessageTypes, 'solargraph/language_server/message_types'
|
11
12
|
end
|
12
13
|
end
|
data/lib/solargraph/library.rb
CHANGED
@@ -45,6 +45,14 @@ module Solargraph
|
|
45
45
|
true
|
46
46
|
end
|
47
47
|
|
48
|
+
def create_from_disk filename
|
49
|
+
return if File.directory?(filename) or !File.exist?(filename)
|
50
|
+
return unless workspace.would_merge?(filename)
|
51
|
+
source = Solargraph::Source.load_string(File.read(filename), filename)
|
52
|
+
workspace.merge(source)
|
53
|
+
api_map.refresh
|
54
|
+
end
|
55
|
+
|
48
56
|
# Delete a file from the library. Deleting a file will make it unavailable
|
49
57
|
# for checkout and optionally remove it from the workspace unless the
|
50
58
|
# workspace configuration determines that it should still exist.
|
@@ -57,6 +57,9 @@ module Solargraph
|
|
57
57
|
return 'Float'
|
58
58
|
elsif node.type == :sym
|
59
59
|
return 'Symbol'
|
60
|
+
# @todo Maybe ignore nils
|
61
|
+
# elsif node.type == :nil
|
62
|
+
# return 'NilClass'
|
60
63
|
end
|
61
64
|
nil
|
62
65
|
end
|
@@ -67,7 +70,9 @@ module Solargraph
|
|
67
70
|
#
|
68
71
|
# @return [String]
|
69
72
|
def resolve_node_signature node
|
70
|
-
drill_signature node, ''
|
73
|
+
result = drill_signature node, ''
|
74
|
+
return nil if result.empty?
|
75
|
+
result
|
71
76
|
end
|
72
77
|
|
73
78
|
private
|
data/lib/solargraph/page.rb
CHANGED
@@ -41,7 +41,8 @@ module Solargraph
|
|
41
41
|
end
|
42
42
|
private_constant :Binder
|
43
43
|
|
44
|
-
def initialize directory
|
44
|
+
def initialize directory = VIEWS_PATH
|
45
|
+
directory = VIEWS_PATH if directory.nil? or !File.directory?(directory)
|
45
46
|
@render_method = proc { |template, layout: false, locals: {}|
|
46
47
|
binder = Binder.new(locals, @render_method)
|
47
48
|
if layout
|
@@ -4,14 +4,18 @@ module Solargraph
|
|
4
4
|
# @return [Symbol] :reader or :writer
|
5
5
|
attr_reader :access
|
6
6
|
|
7
|
-
def initialize
|
8
|
-
super(
|
7
|
+
def initialize location, namespace, name, docstring, access
|
8
|
+
super(location, namespace, name, docstring)
|
9
9
|
@access = access
|
10
10
|
@docstring = docstring
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
|
13
|
+
def kind
|
14
|
+
Solargraph::Pin::ATTRIBUTE
|
15
|
+
end
|
16
|
+
|
17
|
+
def completion_item_kind
|
18
|
+
Solargraph::LanguageServer::CompletionItemKinds::PROPERTY
|
15
19
|
end
|
16
20
|
|
17
21
|
def path
|
@@ -25,14 +29,6 @@ module Solargraph
|
|
25
29
|
end
|
26
30
|
@return_type
|
27
31
|
end
|
28
|
-
|
29
|
-
def completion_item_kind
|
30
|
-
Solargraph::LanguageServer::CompletionItemKinds::PROPERTY
|
31
|
-
end
|
32
|
-
|
33
|
-
def method?
|
34
|
-
true
|
35
|
-
end
|
36
32
|
end
|
37
33
|
end
|
38
34
|
end
|
data/lib/solargraph/pin/base.rb
CHANGED
@@ -4,126 +4,51 @@ module Solargraph
|
|
4
4
|
module Pin
|
5
5
|
class Base
|
6
6
|
include Conversions
|
7
|
+
include Documenting
|
7
8
|
|
8
|
-
|
9
|
-
attr_reader :source
|
10
|
-
|
11
|
-
# @return [Parser::AST::Node]
|
12
|
-
attr_reader :node
|
9
|
+
attr_reader :location
|
13
10
|
|
14
11
|
# @return [String]
|
15
12
|
attr_reader :namespace
|
16
13
|
|
17
|
-
|
18
|
-
@source = source
|
19
|
-
@node = node
|
20
|
-
@namespace = namespace
|
21
|
-
end
|
14
|
+
attr_reader :name
|
22
15
|
|
23
|
-
|
24
|
-
if index >= node.loc.expression.begin_pos
|
25
|
-
if node.respond_to?(:end)
|
26
|
-
if index < node.end.end_pos
|
27
|
-
return true
|
28
|
-
end
|
29
|
-
elsif index < node.loc.expression.end_pos
|
30
|
-
return true
|
31
|
-
end
|
32
|
-
end
|
33
|
-
false
|
34
|
-
end
|
35
|
-
|
36
|
-
# @return [YARD::Docstring]
|
37
|
-
def docstring
|
38
|
-
@docstring ||= source.docstring_for(node) unless source.nil?
|
39
|
-
@docstring
|
40
|
-
end
|
16
|
+
attr_reader :docstring
|
41
17
|
|
42
18
|
# @return [String]
|
43
|
-
|
44
|
-
nil
|
45
|
-
end
|
46
|
-
|
47
|
-
# @return [String]
|
48
|
-
def path
|
49
|
-
nil
|
50
|
-
end
|
19
|
+
attr_reader :return_type
|
51
20
|
|
52
|
-
|
53
|
-
def completion_item_kind
|
54
|
-
end
|
21
|
+
attr_reader :kind
|
55
22
|
|
56
|
-
|
57
|
-
def symbol_kind
|
58
|
-
end
|
23
|
+
attr_reader :path
|
59
24
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
# @return [String]
|
66
|
-
def return_type
|
67
|
-
nil
|
68
|
-
end
|
69
|
-
|
70
|
-
# @return [String]
|
71
|
-
def signature
|
72
|
-
nil
|
73
|
-
end
|
74
|
-
|
75
|
-
# @return [String]
|
76
|
-
def value
|
77
|
-
nil
|
78
|
-
end
|
79
|
-
|
80
|
-
# @return [Array<String>]
|
81
|
-
def parameters
|
82
|
-
[]
|
83
|
-
end
|
84
|
-
|
85
|
-
def arguments
|
86
|
-
parameters
|
25
|
+
def initialize location, namespace, name, docstring
|
26
|
+
@location = location
|
27
|
+
@namespace = namespace
|
28
|
+
@name = name
|
29
|
+
@docstring = docstring
|
87
30
|
end
|
88
31
|
|
89
|
-
# @return [String]
|
90
32
|
def filename
|
91
|
-
|
92
|
-
end
|
93
|
-
|
94
|
-
def location
|
95
|
-
"#{source.filename}:#{node.location.expression.line - 1}:#{node.location.expression.column}" unless source.nil? or node.nil?
|
33
|
+
location.filename
|
96
34
|
end
|
97
35
|
|
98
36
|
# @return [String]
|
99
|
-
def
|
100
|
-
if @documentation.nil? and !docstring.nil?
|
101
|
-
@documentation = ReverseMarkdown.convert(helper.html_markup_rdoc(docstring), github_flavored: true)
|
102
|
-
@documentation.strip!
|
103
|
-
end
|
104
|
-
@documentation
|
37
|
+
def path
|
105
38
|
end
|
106
39
|
|
107
|
-
#
|
108
|
-
|
109
|
-
# path to retrieve more information about it.
|
110
|
-
#
|
111
|
-
# @return [Boolean]
|
112
|
-
def has_doc?
|
113
|
-
!docstring.nil? and !docstring.all.empty?
|
40
|
+
# @return [Integer]
|
41
|
+
def kind
|
114
42
|
end
|
115
43
|
|
116
|
-
def
|
117
|
-
|
44
|
+
def completion_item_kind
|
45
|
+
LanguageServer::CompletionItemKinds::KEYWORD
|
118
46
|
end
|
119
47
|
|
120
48
|
def to_s
|
121
49
|
name.to_s
|
122
50
|
end
|
123
51
|
|
124
|
-
def resolve api_map
|
125
|
-
end
|
126
|
-
|
127
52
|
def identifier
|
128
53
|
@identifier ||= "#{path}|#{name}"
|
129
54
|
end
|
@@ -132,8 +57,8 @@ module Solargraph
|
|
132
57
|
false
|
133
58
|
end
|
134
59
|
|
135
|
-
def
|
136
|
-
|
60
|
+
def named_context
|
61
|
+
namespace
|
137
62
|
end
|
138
63
|
end
|
139
64
|
end
|
@@ -1,16 +1,19 @@
|
|
1
1
|
module Solargraph
|
2
2
|
module Pin
|
3
3
|
class BaseVariable < Base
|
4
|
-
|
4
|
+
attr_reader :signature
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
attr_reader :context
|
7
|
+
|
8
|
+
def initialize location, namespace, name, docstring, signature, literal, context
|
9
|
+
super(location, namespace, name, docstring)
|
10
|
+
@signature = signature
|
11
|
+
@literal = literal
|
12
|
+
@context = context
|
10
13
|
end
|
11
14
|
|
12
|
-
def
|
13
|
-
|
15
|
+
def scope
|
16
|
+
@scope ||= (context.kind == Pin::METHOD and context.scope == :instance ? :instance : :class)
|
14
17
|
end
|
15
18
|
|
16
19
|
def completion_item_kind
|
@@ -18,86 +21,24 @@ module Solargraph
|
|
18
21
|
end
|
19
22
|
|
20
23
|
def return_type
|
21
|
-
if @return_type.nil?
|
22
|
-
|
23
|
-
if docstring.nil?
|
24
|
-
@return_type ||= infer_literal_node_type(assignment_node)
|
25
|
-
else
|
24
|
+
if @return_type.nil?
|
25
|
+
if !docstring.nil?
|
26
26
|
tag = docstring.tag(:type)
|
27
27
|
@return_type = tag.types[0] unless tag.nil?
|
28
|
+
else
|
29
|
+
@return_type = @literal
|
28
30
|
end
|
29
31
|
end
|
30
32
|
@return_type
|
31
33
|
end
|
32
34
|
|
33
|
-
def assignment_node
|
34
|
-
@assignment_node ||= node.children[(node.type == :casgn ? 2 : 1)]
|
35
|
-
end
|
36
|
-
|
37
35
|
def nil_assignment?
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
def signature
|
42
|
-
@signature ||= resolve_node_signature(assignment_node)
|
43
|
-
end
|
44
|
-
|
45
|
-
def calculated_signature
|
46
|
-
if @calculated_signature.nil?
|
47
|
-
if signature.empty?
|
48
|
-
type = infer_literal_node_type(assignment_node)
|
49
|
-
@calculated_signature = "#{type}.new" unless type.nil?
|
50
|
-
end
|
51
|
-
@calculated_signature ||= signature
|
52
|
-
end
|
53
|
-
@calculated_signature
|
54
|
-
end
|
55
|
-
|
56
|
-
# @param api_map [Solargraph::ApiMap]
|
57
|
-
def resolve api_map
|
58
|
-
if return_type.nil? and !@tried_to_resolve_return_type
|
59
|
-
@tried_to_detect_return_type = true
|
60
|
-
return nil if signature.nil? or signature.empty? or signature == name or signature.split('.').first.strip == name
|
61
|
-
# @todo This should be able to resolve signatures that start with local variables
|
62
|
-
macro_type = nil
|
63
|
-
# pin = api_map.tail_pin(signature, namespace, :class, [:public, :private, :protected])
|
64
|
-
# unless pin.nil? or !pin.method?
|
65
|
-
# macro_type = get_return_type_from_macro(pin, assignment_node)
|
66
|
-
# end
|
67
|
-
@return_type = macro_type || api_map.infer_type(signature, namespace, scope: :class)
|
68
|
-
end
|
36
|
+
return_type == 'NilClass'
|
69
37
|
end
|
70
38
|
|
71
39
|
def variable?
|
72
40
|
true
|
73
41
|
end
|
74
|
-
|
75
|
-
private
|
76
|
-
|
77
|
-
def get_call_arguments node
|
78
|
-
return get_call_arguments(node.children[1]) if [:ivasgn, :cvasgn, :lvasgn].include?(node.type)
|
79
|
-
return [] unless node.type == :send
|
80
|
-
result = []
|
81
|
-
node.children[2..-1].each do |c|
|
82
|
-
result.push unpack_name(c)
|
83
|
-
end
|
84
|
-
result
|
85
|
-
end
|
86
|
-
|
87
|
-
def get_return_type_from_macro method_pin, call_node
|
88
|
-
return nil if method_pin.docstring.nil?
|
89
|
-
type = nil
|
90
|
-
all = YARD::Docstring.parser.parse(method_pin.docstring.all).directives
|
91
|
-
macro = all.select{|m| m.tag.tag_name == 'macro'}.first
|
92
|
-
return nil if macro.nil?
|
93
|
-
macstring = YARD::Docstring.parser.parse(macro.tag.text).to_docstring
|
94
|
-
rt = macstring.tag(:return)
|
95
|
-
unless rt.nil? or rt.types.nil?
|
96
|
-
args = get_call_arguments(call_node)
|
97
|
-
type = "#{args[rt.types[0][1..-1].to_i-1]}"
|
98
|
-
end
|
99
|
-
type
|
100
|
-
end
|
101
42
|
end
|
102
43
|
end
|
103
44
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Solargraph
|
2
|
+
module Pin
|
3
|
+
class Block < Base
|
4
|
+
attr_reader :receiver
|
5
|
+
attr_reader :parameters
|
6
|
+
|
7
|
+
def initialize location, namespace, name, docstring, receiver
|
8
|
+
super(location, namespace, name, docstring)
|
9
|
+
@receiver = receiver
|
10
|
+
end
|
11
|
+
|
12
|
+
def kind
|
13
|
+
Pin::BLOCK
|
14
|
+
end
|
15
|
+
|
16
|
+
def parameters
|
17
|
+
@parameters ||= []
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|