solargraph 0.21.0 → 0.21.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/solargraph/api_map.rb +5 -12
- data/lib/solargraph/api_map/probe.rb +9 -30
- data/lib/solargraph/api_map/type_methods.rb +40 -0
- data/lib/solargraph/diagnostics.rb +5 -0
- data/lib/solargraph/diagnostics/require_not_found.rb +5 -0
- data/lib/solargraph/diagnostics/rubocop.rb +3 -0
- data/lib/solargraph/language_server/message/base.rb +1 -8
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +4 -0
- data/lib/solargraph/language_server/request.rb +4 -0
- data/lib/solargraph/language_server/transport/socket.rb +4 -4
- data/lib/solargraph/plugin/runtime.rb +6 -2
- data/lib/solargraph/source/flawed_builder.rb +3 -0
- data/lib/solargraph/source/mapper.rb +42 -10
- data/lib/solargraph/source/position.rb +18 -0
- data/lib/solargraph/source/range.rb +5 -1
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/yard_map.rb +31 -4
- data/lib/solargraph/yard_map/core_docs.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f93d18c2483c24a81693e662698b7d67e86086211608d6f50a0128b95cc817b6
|
4
|
+
data.tar.gz: f0346ff1adf21faebba30306cc2e682cf99d83bcedf66ebfca3029dad4031025
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d87a287c2608cbd7af255684a790ab079b85821a2abf3a6051212b36a156bf3662310bf5e9e7d3857ad89338b81628e94eb270dc74db258c6cb2ff2f4f0bc852
|
7
|
+
data.tar.gz: ad9ae29c4d354588e383fb68926175bad72e419a2ef736f7e9f7069c701d3b94bc5ab784768be4dd1823ef1ac65201bea9e971ea554c6918f2f23d9fd1c42b92
|
data/lib/solargraph/api_map.rb
CHANGED
@@ -9,9 +9,11 @@ module Solargraph
|
|
9
9
|
autoload :Completion, 'solargraph/api_map/completion'
|
10
10
|
autoload :Probe, 'solargraph/api_map/probe'
|
11
11
|
autoload :Store, 'solargraph/api_map/store'
|
12
|
+
autoload :TypeMethods, 'solargraph/api_map/type_methods'
|
12
13
|
|
13
14
|
include Solargraph::ApiMap::SourceToYard
|
14
15
|
include CoreFills
|
16
|
+
include TypeMethods
|
15
17
|
|
16
18
|
# The workspace to analyze and process.
|
17
19
|
#
|
@@ -310,7 +312,8 @@ module Solargraph
|
|
310
312
|
end
|
311
313
|
end
|
312
314
|
end
|
313
|
-
|
315
|
+
frag_start = fragment.word.to_s.downcase
|
316
|
+
filtered = result.uniq(&:identifier).select{|s| s.name.downcase.start_with?(frag_start) and (s.kind != Pin::METHOD or s.name.match(/^[a-z0-9_]*(\!|\?|=)?$/i))}.sort_by.with_index{ |x, idx| [x.name, idx] }
|
314
317
|
Completion.new(filtered, fragment.whole_word_range)
|
315
318
|
end
|
316
319
|
|
@@ -475,7 +478,7 @@ module Solargraph
|
|
475
478
|
result.concat yard_map.get_methods(fqns, '', visibility: visibility)
|
476
479
|
type = get_namespace_type(fqns)
|
477
480
|
result.concat inner_get_methods('Class', :instance, fqns == '' ? [:public] : visibility, deep, skip) if type == :class
|
478
|
-
result.concat inner_get_methods('Module', :instance, fqns == '' ? [:public] : visibility, deep, skip)
|
481
|
+
result.concat inner_get_methods('Module', :instance, fqns == '' ? [:public] : visibility, deep, skip) if type == :module
|
479
482
|
end
|
480
483
|
end
|
481
484
|
result
|
@@ -568,15 +571,5 @@ module Solargraph
|
|
568
571
|
return yard_map.get_namespace_type(fqns) if pin.nil?
|
569
572
|
pin.type
|
570
573
|
end
|
571
|
-
|
572
|
-
def extract_namespace_and_scope type
|
573
|
-
scope = :instance
|
574
|
-
result = type.to_s.gsub(/<.*$/, '')
|
575
|
-
if (result == 'Class' or result == 'Module') and type.include?('<')
|
576
|
-
result = type.match(/<([a-z0-9:_]*)/i)[1]
|
577
|
-
scope = :class
|
578
|
-
end
|
579
|
-
[result, scope]
|
580
|
-
end
|
581
574
|
end
|
582
575
|
end
|
@@ -6,8 +6,13 @@ module Solargraph
|
|
6
6
|
def initialize return_type
|
7
7
|
@return_type = return_type
|
8
8
|
end
|
9
|
+
def namespace
|
10
|
+
@namespace ||= TypeMethods.extract_namespace(@return_type)
|
11
|
+
end
|
9
12
|
end
|
10
13
|
|
14
|
+
include TypeMethods
|
15
|
+
|
11
16
|
# @return [Solargraph::ApiMap]
|
12
17
|
attr_reader :api_map
|
13
18
|
|
@@ -77,8 +82,11 @@ module Solargraph
|
|
77
82
|
end
|
78
83
|
|
79
84
|
# Method name search is external by default
|
85
|
+
# @param method_name [String]
|
86
|
+
# @param context_pin [Solargraph::Pin::Base]
|
80
87
|
def infer_method_name_pins method_name, context_pin, internal = false
|
81
|
-
|
88
|
+
relname, scope = extract_namespace_and_scope(context_pin.return_type)
|
89
|
+
namespace = api_map.qualify(relname, context_pin.namespace)
|
82
90
|
visibility = [:public]
|
83
91
|
visibility.push :protected, :private if internal
|
84
92
|
result = api_map.get_methods(namespace, scope: scope, visibility: visibility).select{|pin| pin.name == method_name}
|
@@ -110,35 +118,6 @@ module Solargraph
|
|
110
118
|
type.sub(/<#{rns}>/, "<#{res}>")
|
111
119
|
end
|
112
120
|
|
113
|
-
# Extract a namespace from a type.
|
114
|
-
#
|
115
|
-
# @example
|
116
|
-
# extract_namespace('String') => 'String'
|
117
|
-
# extract_namespace('Class<String>') => 'String'
|
118
|
-
#
|
119
|
-
# @return [String]
|
120
|
-
def extract_namespace type
|
121
|
-
extract_namespace_and_scope(type)[0]
|
122
|
-
end
|
123
|
-
|
124
|
-
# Extract a namespace and a scope (:instance or :class) from a type.
|
125
|
-
#
|
126
|
-
# @example
|
127
|
-
# extract_namespace('String') #=> ['String', :instance]
|
128
|
-
# extract_namespace('Class<String>') #=> ['String', :class]
|
129
|
-
# extract_namespace('Module<Enumerable') #=> ['Enumberable', :class]
|
130
|
-
#
|
131
|
-
# @return [Array] The namespace (String) and scope (Symbol).
|
132
|
-
def extract_namespace_and_scope type
|
133
|
-
scope = :instance
|
134
|
-
result = type.to_s.gsub(/<.*$/, '')
|
135
|
-
if (result == 'Class' or result == 'Module') and type.include?('<')
|
136
|
-
result = type.match(/<([a-z0-9:_]*)/i)[1]
|
137
|
-
scope = :class
|
138
|
-
end
|
139
|
-
[result, scope]
|
140
|
-
end
|
141
|
-
|
142
121
|
# Extract a namespace and a scope from a pin. For now, the pin must
|
143
122
|
# be either a namespace, a method, or a block.
|
144
123
|
#
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Solargraph
|
2
|
+
class ApiMap
|
3
|
+
# Module functions for processing YARD types.
|
4
|
+
#
|
5
|
+
module TypeMethods
|
6
|
+
module_function
|
7
|
+
|
8
|
+
# Extract a namespace from a type.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# extract_namespace('String') => 'String'
|
12
|
+
# extract_namespace('Class<String>') => 'String'
|
13
|
+
#
|
14
|
+
# @param type [String]
|
15
|
+
# @return [String]
|
16
|
+
def extract_namespace type
|
17
|
+
extract_namespace_and_scope(type)[0]
|
18
|
+
end
|
19
|
+
|
20
|
+
# Extract a namespace and a scope (:instance or :class) from a type.
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
# extract_namespace('String') #=> ['String', :instance]
|
24
|
+
# extract_namespace('Class<String>') #=> ['String', :class]
|
25
|
+
# extract_namespace('Module<Enumerable') #=> ['Enumberable', :class]
|
26
|
+
#
|
27
|
+
# @param type [String]
|
28
|
+
# @return [Array] The namespace (String) and scope (Symbol).
|
29
|
+
def extract_namespace_and_scope type
|
30
|
+
scope = :instance
|
31
|
+
result = type.to_s.gsub(/<.*$/, '')
|
32
|
+
if (result == 'Class' or result == 'Module') and type.include?('<')
|
33
|
+
result = type.match(/<([a-z0-9:_]*)/i)[1]
|
34
|
+
scope = :class
|
35
|
+
end
|
36
|
+
[result, scope]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,10 +1,15 @@
|
|
1
1
|
module Solargraph
|
2
|
+
# The Diagnostics library provides reporters for analyzing problems in code
|
3
|
+
# and providing the results to language server clients.
|
4
|
+
#
|
2
5
|
module Diagnostics
|
3
6
|
autoload :Base, 'solargraph/diagnostics/base'
|
4
7
|
autoload :Severities, 'solargraph/diagnostics/severities'
|
5
8
|
autoload :Rubocop, 'solargraph/diagnostics/rubocop'
|
6
9
|
autoload :RequireNotFound, 'solargraph/diagnostics/require_not_found'
|
7
10
|
|
11
|
+
# Reporters identified by name for activation in .solargraph.yml files.
|
12
|
+
#
|
8
13
|
REPORTERS = {
|
9
14
|
'rubocop' => Rubocop,
|
10
15
|
'require_not_found' => RequireNotFound
|
@@ -1,5 +1,10 @@
|
|
1
1
|
module Solargraph
|
2
2
|
module Diagnostics
|
3
|
+
# RequireNotFound reports required paths that could not be resolved to
|
4
|
+
# either a file in the workspace or a gem.
|
5
|
+
#
|
6
|
+
# @todo Some stdlib paths can result in false positives.
|
7
|
+
#
|
3
8
|
class RequireNotFound < Base
|
4
9
|
def diagnose source, api_map
|
5
10
|
result = []
|
@@ -3,6 +3,8 @@ require 'shellwords'
|
|
3
3
|
|
4
4
|
module Solargraph
|
5
5
|
module Diagnostics
|
6
|
+
# This reporter provides linting through RuboCop.
|
7
|
+
#
|
6
8
|
class Rubocop < Base
|
7
9
|
# The rubocop command
|
8
10
|
#
|
@@ -21,6 +23,7 @@ module Solargraph
|
|
21
23
|
raise DiagnosticsError, 'No command specified' if command.nil? or command.empty?
|
22
24
|
cmd = "#{Shellwords.escape(command)} -f j -s #{Shellwords.escape(filename)}"
|
23
25
|
o, e, s = Open3.capture3(cmd, stdin_data: text)
|
26
|
+
STDERR.puts e unless e.empty?
|
24
27
|
raise DiagnosticsError, "Command '#{command}' is not available (gem exception)" if e.include?('Gem::Exception')
|
25
28
|
raise DiagnosticsError, "RuboCop returned empty data" if o.empty?
|
26
29
|
make_array JSON.parse(o)
|
@@ -37,14 +37,7 @@ module Solargraph
|
|
37
37
|
}
|
38
38
|
end
|
39
39
|
|
40
|
-
def
|
41
|
-
response = {}
|
42
|
-
response[:result] = result
|
43
|
-
response[:error] = error unless error.nil?
|
44
|
-
response
|
45
|
-
end
|
46
|
-
|
47
|
-
def send
|
40
|
+
def send_response
|
48
41
|
unless id.nil? or host.cancel?(id)
|
49
42
|
response = {
|
50
43
|
jsonrpc: "2.0",
|
@@ -18,13 +18,13 @@ module Solargraph
|
|
18
18
|
start_timers
|
19
19
|
end
|
20
20
|
|
21
|
-
def process
|
21
|
+
def process request
|
22
22
|
Thread.new do
|
23
|
-
message = @host.start(
|
24
|
-
message.
|
23
|
+
message = @host.start(request)
|
24
|
+
message.send_response
|
25
25
|
tmp = @host.flush
|
26
26
|
send_data tmp unless tmp.empty?
|
27
|
-
GC.start unless
|
27
|
+
GC.start unless request['method'] == 'textDocument/didChange'
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -53,6 +53,10 @@ module Solargraph
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
+
def stop
|
57
|
+
@io.close
|
58
|
+
end
|
59
|
+
|
56
60
|
protected
|
57
61
|
|
58
62
|
def load_environment
|
@@ -66,8 +70,8 @@ module Solargraph
|
|
66
70
|
|
67
71
|
def start_process
|
68
72
|
dir = Dir.pwd
|
69
|
-
unless api_map.nil? or api_map.workspace.nil?
|
70
|
-
dir = api_map.workspace
|
73
|
+
unless api_map.nil? or api_map.workspace.nil? or api_map.workspace.directory.nil?
|
74
|
+
dir = api_map.workspace.directory
|
71
75
|
end
|
72
76
|
Dir.chdir(dir) do
|
73
77
|
@io = IO.popen(executable, 'r+')
|
@@ -1,11 +1,19 @@
|
|
1
1
|
module Solargraph
|
2
2
|
class Source
|
3
|
+
# The Mapper generates pins and other data for Sources.
|
4
|
+
#
|
5
|
+
# This class is used internally by the Source class on initialization,
|
6
|
+
# e.g., via Source.new or Source.load. Users should not normally need to
|
7
|
+
# call it directly.
|
8
|
+
#
|
3
9
|
class Mapper
|
4
10
|
include NodeMethods
|
5
11
|
|
6
12
|
private_class_method :new
|
7
13
|
|
8
|
-
#
|
14
|
+
# Generate the data.
|
15
|
+
#
|
16
|
+
# @return [Array]
|
9
17
|
def map filename, code, node, comments
|
10
18
|
@filename = filename
|
11
19
|
@code = code
|
@@ -37,7 +45,7 @@ module Solargraph
|
|
37
45
|
end
|
38
46
|
|
39
47
|
class << self
|
40
|
-
# @return [Array
|
48
|
+
# @return [Array]
|
41
49
|
def map filename, code, node, comments
|
42
50
|
new.map filename, code, node, comments
|
43
51
|
end
|
@@ -134,7 +142,6 @@ module Solargraph
|
|
134
142
|
pins.push Solargraph::Pin::GlobalVariable.new(get_node_location(c), fqn, c.children[0].to_s, docstring_for(c), resolve_node_signature(c.children[1]), infer_literal_node_type(c.children[1]), @pins.first)
|
135
143
|
elsif c.type == :sym
|
136
144
|
@symbols.push Solargraph::Pin::Symbol.new(get_node_location(c), ":#{c.children[0]}")
|
137
|
-
|
138
145
|
elsif c.type == :casgn
|
139
146
|
here = get_node_start_position(c)
|
140
147
|
block = get_block_pin(here)
|
@@ -146,12 +153,15 @@ module Solargraph
|
|
146
153
|
# @todo Smelly instance variable access.
|
147
154
|
pins.last.instance_variable_set(:@return_type, methpin.namespace)
|
148
155
|
pins.push Solargraph::Pin::Method.new(methpin.location, methpin.namespace, methpin.name, methpin.docstring, methpin.scope, :private, methpin.parameters)
|
156
|
+
elsif visibility == :module_function
|
157
|
+
pins.push Solargraph::Pin::Method.new(methpin.location, methpin.namespace, methpin.name, methpin.docstring, :class, :public, methpin.parameters)
|
158
|
+
pins.push Solargraph::Pin::Method.new(methpin.location, methpin.namespace, methpin.name, methpin.docstring, :instance, :private, methpin.parameters)
|
149
159
|
else
|
150
160
|
pins.push methpin
|
151
161
|
end
|
152
162
|
elsif c.type == :defs
|
153
163
|
s_visi = visibility
|
154
|
-
s_visi = :public if scope != :class
|
164
|
+
s_visi = :public if s_visi == :module_function or scope != :class
|
155
165
|
if c.children[0].is_a?(AST::Node) and c.children[0].type == :self
|
156
166
|
dfqn = fqn || ''
|
157
167
|
else
|
@@ -191,6 +201,26 @@ module Solargraph
|
|
191
201
|
end
|
192
202
|
end
|
193
203
|
next
|
204
|
+
elsif c.type == :send and c.children[1] == :module_function
|
205
|
+
# @todo Handle module_function
|
206
|
+
if c.children[2].nil?
|
207
|
+
visibility = :module_function
|
208
|
+
elsif c.children[2].type == :sym or c.children[2].type == :str
|
209
|
+
# @todo What to do about references?
|
210
|
+
c.children[2..-1].each do |x|
|
211
|
+
cn = x.children[0].to_s
|
212
|
+
ref = pins.select{|p| p.namespace == (fqn || '') and p.name == cn}.first
|
213
|
+
unless ref.nil?
|
214
|
+
pins.delete ref
|
215
|
+
pins.push Solargraph::Pin::Method.new(ref.location, ref.namespace, ref.name, ref.docstring, :class, :public, ref.parameters)
|
216
|
+
pins.push Solargraph::Pin::Method.new(ref.location, ref.namespace, ref.name, ref.docstring, :instance, :private, ref.parameters)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
elsif c.children[2].type == :def
|
220
|
+
# @todo A single function
|
221
|
+
process c, tree, :module_function, :class, fqn, stack
|
222
|
+
next
|
223
|
+
end
|
194
224
|
elsif c.type == :send and c.children[1] == :include and c.children[0].nil?
|
195
225
|
last_node = get_last_in_stack_not_begin(stack)
|
196
226
|
if last_node.nil? or last_node.type == :class or last_node.type == :module or last_node.type == :source
|
@@ -207,14 +237,16 @@ module Solargraph
|
|
207
237
|
elsif c.type == :send and c.children[1] == :extend and c.children[0].nil?
|
208
238
|
last_node = get_last_in_stack_not_begin(stack)
|
209
239
|
if last_node.nil? or last_node.type == :class or last_node.type == :module or last_node.type == :source
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
240
|
+
c.children[2..-1].each do |i|
|
241
|
+
nspin = @pins.select{|pin| pin.kind == Pin::NAMESPACE and pin.path == fqn}.last
|
242
|
+
unless nspin.nil?
|
243
|
+
ref = nil
|
244
|
+
if i.type == :self
|
245
|
+
ref = Pin::Reference.new(get_node_location(c), nspin.path, nspin.path)
|
246
|
+
elsif i.type == :const
|
215
247
|
ref = Pin::Reference.new(get_node_location(c), nspin.path, unpack_name(i))
|
216
|
-
nspin.extend_references.push(ref)
|
217
248
|
end
|
249
|
+
nspin.extend_references.push(ref) unless ref.nil?
|
218
250
|
end
|
219
251
|
end
|
220
252
|
end
|
@@ -16,6 +16,7 @@ module Solargraph
|
|
16
16
|
# Get a hash of the position. This representation is suitable for use in
|
17
17
|
# the language server protocol.
|
18
18
|
#
|
19
|
+
# @return [Hash]
|
19
20
|
def to_hash
|
20
21
|
{
|
21
22
|
line: line,
|
@@ -23,6 +24,11 @@ module Solargraph
|
|
23
24
|
}
|
24
25
|
end
|
25
26
|
|
27
|
+
# Get a numeric offset for the specified text and position.
|
28
|
+
#
|
29
|
+
# @param text [String]
|
30
|
+
# @param position [Position]
|
31
|
+
# @return [Integer]
|
26
32
|
def self.to_offset text, position
|
27
33
|
result = 0
|
28
34
|
feed = 0
|
@@ -41,10 +47,22 @@ module Solargraph
|
|
41
47
|
result
|
42
48
|
end
|
43
49
|
|
50
|
+
# Get a numeric offset for the specified text and a position identified
|
51
|
+
# by its line and character.
|
52
|
+
#
|
53
|
+
# @param text [String]
|
54
|
+
# @param line [Integer]
|
55
|
+
# @param character [Integer]
|
56
|
+
# @return [Integer]
|
44
57
|
def self.line_char_to_offset text, line, character
|
45
58
|
to_offset(text, Position.new(line, character))
|
46
59
|
end
|
47
60
|
|
61
|
+
# Get a position for the specified text and offset.
|
62
|
+
#
|
63
|
+
# @param text [String]
|
64
|
+
# @param offset [Integer]
|
65
|
+
# @return [Position]
|
48
66
|
def self.from_offset text, offset
|
49
67
|
cursor = 0
|
50
68
|
line = 0
|
@@ -17,6 +17,7 @@ module Solargraph
|
|
17
17
|
# Get a hash of the range. This representation is suitable for use in
|
18
18
|
# the language server protocol.
|
19
19
|
#
|
20
|
+
# @return [Hash<Symbol, Position>]
|
20
21
|
def to_hash
|
21
22
|
{
|
22
23
|
start: start.to_hash,
|
@@ -24,6 +25,9 @@ module Solargraph
|
|
24
25
|
}
|
25
26
|
end
|
26
27
|
|
28
|
+
# True if the specified position is inside the range.
|
29
|
+
#
|
30
|
+
# @return [Boolean]
|
27
31
|
def contain? position
|
28
32
|
return false if position.line < start.line
|
29
33
|
return false if position.line == start.line and position.character < start.character
|
@@ -38,7 +42,7 @@ module Solargraph
|
|
38
42
|
# @param c1 [Integer] Starting character
|
39
43
|
# @param l2 [Integer] Ending line
|
40
44
|
# @param c2 [Integer] Ending character
|
41
|
-
# @return [
|
45
|
+
# @return [Range]
|
42
46
|
def self.from_to l1, c1, l2, c2
|
43
47
|
Range.new(Position.new(l1, c1), Position.new(l2, c2))
|
44
48
|
end
|
data/lib/solargraph/version.rb
CHANGED
data/lib/solargraph/yard_map.rb
CHANGED
@@ -1,16 +1,23 @@
|
|
1
1
|
require 'yard'
|
2
2
|
|
3
3
|
module Solargraph
|
4
|
+
# The YardMap provides access to YARD documentation for the Ruby core, the
|
5
|
+
# stdlib, and gems.
|
6
|
+
#
|
4
7
|
class YardMap
|
5
8
|
autoload :Cache, 'solargraph/yard_map/cache'
|
6
9
|
autoload :CoreDocs, 'solargraph/yard_map/core_docs'
|
7
10
|
|
8
11
|
CoreDocs.require_minimum
|
9
12
|
@@stdlib_yardoc = CoreDocs.yard_stdlib_file
|
10
|
-
@@
|
13
|
+
@@stdlib_paths = {}
|
11
14
|
YARD::Registry.load! @@stdlib_yardoc
|
12
15
|
YARD::Registry.all(:class, :module).each do |ns|
|
13
|
-
|
16
|
+
next if ns.file.nil?
|
17
|
+
path = ns.file.sub(/^(ext|lib)\//, '').sub(/\.(rb|c)$/, '')
|
18
|
+
next if path.start_with?('-')
|
19
|
+
@@stdlib_paths[path] ||= []
|
20
|
+
@@stdlib_paths[path].push ns
|
14
21
|
end
|
15
22
|
|
16
23
|
# @return [Solargraph::Workspace]
|
@@ -25,6 +32,7 @@ module Solargraph
|
|
25
32
|
@required = required.clone
|
26
33
|
@namespace_yardocs = {}
|
27
34
|
@gem_paths = {}
|
35
|
+
@stdlib_namespaces = []
|
28
36
|
process_requires
|
29
37
|
yardocs.push CoreDocs.yardoc_file
|
30
38
|
yardocs.uniq!
|
@@ -99,12 +107,16 @@ module Solargraph
|
|
99
107
|
result = []
|
100
108
|
combined_namespaces(namespace, scope).each do |ns|
|
101
109
|
yardocs_documenting(ns).each do |y|
|
110
|
+
# @todo Getting constants from the stdlib works slightly differently
|
111
|
+
# from methods
|
112
|
+
next if y == @@stdlib_yardoc
|
102
113
|
yard = load_yardoc(y)
|
103
114
|
unless yard.nil?
|
104
115
|
found = yard.at(ns)
|
105
116
|
consts.concat found.children unless found.nil?
|
106
117
|
end
|
107
118
|
end
|
119
|
+
consts.concat @stdlib_namespaces.select{|ns| ns.namespace.path == namespace}
|
108
120
|
end
|
109
121
|
consts.each { |c|
|
110
122
|
detail = nil
|
@@ -170,6 +182,8 @@ module Solargraph
|
|
170
182
|
unless ns.nil?
|
171
183
|
ns.meths(scope: :instance, visibility: visibility).each do |m|
|
172
184
|
n = m.to_s.split(/[\.#]/).last
|
185
|
+
# HACK: Exception for Module#module_function in Class
|
186
|
+
next if ns.name == :Class and m.path == 'Module#module_function'
|
173
187
|
# HACK: Special treatment for #initialize
|
174
188
|
next if n == 'initialize' and !visibility.include?(:private)
|
175
189
|
if (namespace == 'Kernel' or !m.to_s.start_with?('Kernel#')) and !m.docstring.to_s.include?(':nodoc:')
|
@@ -203,10 +217,12 @@ module Solargraph
|
|
203
217
|
while parts.length > 0
|
204
218
|
here = "#{parts.join('::')}::#{namespace}"
|
205
219
|
return here unless yardocs_documenting(here).empty?
|
220
|
+
return here if @stdlib_namespaces.any?{|ns| ns.path == here}
|
206
221
|
parts.pop
|
207
222
|
end
|
208
223
|
end
|
209
224
|
return namespace unless yardocs_documenting(namespace).empty?
|
225
|
+
return namespace if @stdlib_namespaces.any?{|ns| ns.path == namespace}
|
210
226
|
nil
|
211
227
|
end
|
212
228
|
|
@@ -221,6 +237,9 @@ module Solargraph
|
|
221
237
|
end
|
222
238
|
end
|
223
239
|
}
|
240
|
+
@stdlib_namespaces.each do |ns|
|
241
|
+
result.push Pin::YardObject.new(ns, object_location(ns)) if ns.path == path
|
242
|
+
end
|
224
243
|
result
|
225
244
|
end
|
226
245
|
|
@@ -266,6 +285,7 @@ module Solargraph
|
|
266
285
|
tried = []
|
267
286
|
unresolved_requires.clear
|
268
287
|
required.each do |r|
|
288
|
+
next if r.nil?
|
269
289
|
begin
|
270
290
|
spec = Gem::Specification.find_by_path(r) || Gem::Specification.find_by_name(r.split('/').first)
|
271
291
|
ver = spec.version.to_s
|
@@ -278,7 +298,12 @@ module Solargraph
|
|
278
298
|
yardocs.unshift yd unless yd.nil? or yardocs.include?(yd)
|
279
299
|
rescue Gem::LoadError => e
|
280
300
|
next if !workspace.nil? and workspace.would_require?(r)
|
281
|
-
|
301
|
+
stdnames = []
|
302
|
+
@@stdlib_paths.each_pair do |path, objects|
|
303
|
+
stdnames.concat objects if path == r or path.start_with?("#{r}/")
|
304
|
+
end
|
305
|
+
@stdlib_namespaces.concat stdnames
|
306
|
+
unresolved_requires.push r if stdnames.empty?
|
282
307
|
end
|
283
308
|
end
|
284
309
|
end
|
@@ -315,7 +340,9 @@ module Solargraph
|
|
315
340
|
else
|
316
341
|
result.concat @namespace_yardocs[namespace] unless @namespace_yardocs[namespace].nil?
|
317
342
|
end
|
318
|
-
|
343
|
+
if @stdlib_namespaces.map(&:path).include?(namespace)
|
344
|
+
result.push @@stdlib_yardoc
|
345
|
+
end
|
319
346
|
result
|
320
347
|
end
|
321
348
|
|
@@ -77,7 +77,7 @@ module Solargraph
|
|
77
77
|
|
78
78
|
def download version
|
79
79
|
FileUtils.mkdir_p cache_dir
|
80
|
-
uri = URI.parse("
|
80
|
+
uri = URI.parse("#{SOURCE}/#{version}.tar.gz")
|
81
81
|
response = Net::HTTP.get_response(uri)
|
82
82
|
zipfile = File.join(cache_dir, "#{version}.tar.gz")
|
83
83
|
File.binwrite zipfile, response.body
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solargraph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.21.
|
4
|
+
version: 0.21.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fred Snyder
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -226,6 +226,7 @@ files:
|
|
226
226
|
- lib/solargraph/api_map/probe.rb
|
227
227
|
- lib/solargraph/api_map/source_to_yard.rb
|
228
228
|
- lib/solargraph/api_map/store.rb
|
229
|
+
- lib/solargraph/api_map/type_methods.rb
|
229
230
|
- lib/solargraph/core_fills.rb
|
230
231
|
- lib/solargraph/diagnostics.rb
|
231
232
|
- lib/solargraph/diagnostics/base.rb
|
@@ -356,7 +357,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
356
357
|
version: '0'
|
357
358
|
requirements: []
|
358
359
|
rubyforge_project:
|
359
|
-
rubygems_version: 2.
|
360
|
+
rubygems_version: 2.7.6
|
360
361
|
signing_key:
|
361
362
|
specification_version: 4
|
362
363
|
summary: Solargraph for Ruby
|