solargraph 0.39.15 → 0.40.2
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/.travis.yml +4 -8
- data/CHANGELOG.md +992 -0
- data/Rakefile +12 -1
- data/SPONSORS.md +1 -0
- data/lib/.rubocop.yml +2 -2
- data/lib/solargraph.rb +2 -4
- data/lib/solargraph/api_map.rb +75 -74
- data/lib/solargraph/api_map/cache.rb +2 -2
- data/lib/solargraph/api_map/store.rb +4 -8
- data/lib/solargraph/{bundle.rb → bench.rb} +6 -2
- data/lib/solargraph/compat.rb +14 -0
- data/lib/solargraph/complex_type.rb +2 -2
- data/lib/solargraph/convention.rb +13 -4
- data/lib/solargraph/convention/base.rb +16 -8
- data/lib/solargraph/convention/gemfile.rb +2 -5
- data/lib/solargraph/convention/gemspec.rb +3 -6
- data/lib/solargraph/convention/rspec.rb +3 -6
- data/lib/solargraph/environ.rb +11 -6
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +6 -1
- data/lib/solargraph/language_server/message/text_document/definition.rb +1 -1
- data/lib/solargraph/language_server/message/text_document/formatting.rb +17 -19
- data/lib/solargraph/library.rb +6 -8
- data/lib/solargraph/parser/legacy/node_methods.rb +9 -0
- data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +1 -1
- data/lib/solargraph/parser/legacy/node_processors/send_node.rb +36 -23
- data/lib/solargraph/parser/node_processor/base.rb +3 -0
- data/lib/solargraph/parser/rubyvm/node_methods.rb +18 -1
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +1 -1
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +1 -1
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +40 -29
- data/lib/solargraph/pin.rb +0 -3
- data/lib/solargraph/pin/common.rb +1 -1
- data/lib/solargraph/pin/conversions.rb +3 -4
- data/lib/solargraph/pin/documenting.rb +3 -9
- data/lib/solargraph/pin/method.rb +141 -7
- data/lib/solargraph/pin/method_alias.rb +1 -1
- data/lib/solargraph/position.rb +2 -14
- data/lib/solargraph/source.rb +10 -6
- data/lib/solargraph/source/chain.rb +18 -5
- data/lib/solargraph/source_map.rb +4 -1
- data/lib/solargraph/source_map/clip.rb +3 -2
- data/lib/solargraph/source_map/mapper.rb +10 -6
- data/lib/solargraph/type_checker.rb +27 -24
- data/lib/solargraph/type_checker/param_def.rb +1 -1
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/yard_map.rb +40 -47
- data/lib/solargraph/yard_map/core_fills.rb +185 -0
- data/lib/solargraph/yard_map/helpers.rb +16 -0
- data/lib/solargraph/yard_map/mapper.rb +14 -8
- data/lib/solargraph/{pin/yard_pin/constant.rb → yard_map/mapper/to_constant.rb} +6 -6
- data/lib/solargraph/yard_map/mapper/to_method.rb +78 -0
- data/lib/solargraph/{pin/yard_pin/namespace.rb → yard_map/mapper/to_namespace.rb} +6 -6
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +1 -1
- data/lib/solargraph/yard_map/stdlib_fills.rb +43 -0
- data/lib/solargraph/yard_map/to_method.rb +79 -0
- data/solargraph.gemspec +5 -5
- metadata +22 -36
- data/lib/solargraph/core_fills.rb +0 -160
- data/lib/solargraph/pin/attribute.rb +0 -49
- data/lib/solargraph/pin/base_method.rb +0 -141
- data/lib/solargraph/pin/yard_pin.rb +0 -12
- data/lib/solargraph/pin/yard_pin/method.rb +0 -80
- data/lib/solargraph/pin/yard_pin/yard_mixin.rb +0 -20
- data/lib/solargraph/stdlib_fills.rb +0 -40
- data/travis-bundler.rb +0 -11
@@ -4,18 +4,22 @@ module Solargraph
|
|
4
4
|
# An aggregation of a workspace and additional sources to be cataloged in an
|
5
5
|
# ApiMap.
|
6
6
|
#
|
7
|
-
class
|
7
|
+
class Bench
|
8
8
|
# @return [Workspace]
|
9
9
|
attr_reader :workspace
|
10
10
|
|
11
11
|
# @return [Array<Source>]
|
12
12
|
attr_reader :opened
|
13
13
|
|
14
|
+
# @return [Array<Pin::Base>]
|
15
|
+
attr_reader :pins
|
16
|
+
|
14
17
|
# @param workspace [Workspace]
|
15
18
|
# @param opened [Array<Source>]
|
16
|
-
def initialize workspace: Workspace.new, opened: []
|
19
|
+
def initialize workspace: Workspace.new, opened: [], pins: []
|
17
20
|
@workspace = workspace
|
18
21
|
@opened = opened
|
22
|
+
@pins = pins
|
19
23
|
end
|
20
24
|
|
21
25
|
# @return [Array<Source>]
|
data/lib/solargraph/compat.rb
CHANGED
@@ -12,7 +12,7 @@ module Solargraph
|
|
12
12
|
|
13
13
|
# @param types [Array<UniqueType>]
|
14
14
|
def initialize types = [UniqueType::UNDEFINED]
|
15
|
-
@items = types
|
15
|
+
@items = types.uniq(&:to_s)
|
16
16
|
end
|
17
17
|
|
18
18
|
# @param api_map [ApiMap]
|
@@ -113,7 +113,7 @@ module Solargraph
|
|
113
113
|
#
|
114
114
|
# @param *strings [Array<String>] The type definitions to parse
|
115
115
|
# @param partial [Boolean] True if the string is part of a another type
|
116
|
-
# @return [ComplexType]
|
116
|
+
# @return [ComplexType, Array, nil]
|
117
117
|
def parse *strings, partial: false
|
118
118
|
@cache ||= {}
|
119
119
|
unless partial
|
@@ -20,13 +20,22 @@ module Solargraph
|
|
20
20
|
@@conventions.add convention.new
|
21
21
|
end
|
22
22
|
|
23
|
-
# @param
|
23
|
+
# @param source_map [SourceMap]
|
24
24
|
# @return [Environ]
|
25
|
-
def self.
|
25
|
+
def self.for_local(source_map)
|
26
26
|
result = Environ.new
|
27
|
-
return result if source.filename.nil? || source.filename.empty?
|
28
27
|
@@conventions.each do |conv|
|
29
|
-
result.merge conv.
|
28
|
+
result.merge conv.local(source_map)
|
29
|
+
end
|
30
|
+
result
|
31
|
+
end
|
32
|
+
|
33
|
+
# @param yard_map [YardMap]
|
34
|
+
# @return [Environ]
|
35
|
+
def self.for_global(yard_map)
|
36
|
+
result = Environ.new
|
37
|
+
@@conventions.each do |conv|
|
38
|
+
result.merge conv.global(yard_map)
|
30
39
|
end
|
31
40
|
result
|
32
41
|
end
|
@@ -2,22 +2,30 @@
|
|
2
2
|
|
3
3
|
module Solargraph
|
4
4
|
module Convention
|
5
|
+
# The base class for Conventions.
|
6
|
+
#
|
7
|
+
# A Convention provides Environs that customize ApiMaps with additional
|
8
|
+
# pins and other information. Subclasses should implement the `local` and
|
9
|
+
# `global` methods as necessary.
|
10
|
+
#
|
5
11
|
class Base
|
6
12
|
EMPTY_ENVIRON = Environ.new
|
7
13
|
|
8
|
-
#
|
9
|
-
# Subclasses
|
14
|
+
# The Environ for a source map.
|
15
|
+
# Subclasses can override this method.
|
10
16
|
#
|
11
|
-
# @param
|
12
|
-
|
13
|
-
|
17
|
+
# @param source_map [SourceMap]
|
18
|
+
# @return [Environ]
|
19
|
+
def local source_map
|
20
|
+
EMPTY_ENVIRON
|
14
21
|
end
|
15
22
|
|
16
|
-
# The Environ for
|
17
|
-
# Subclasses
|
23
|
+
# The Environ for a YARD map.
|
24
|
+
# Subclasses can override this method.
|
18
25
|
#
|
26
|
+
# @param yard_map [YardMap]
|
19
27
|
# @return [Environ]
|
20
|
-
def
|
28
|
+
def global yard_map
|
21
29
|
EMPTY_ENVIRON
|
22
30
|
end
|
23
31
|
end
|
@@ -3,11 +3,8 @@
|
|
3
3
|
module Solargraph
|
4
4
|
module Convention
|
5
5
|
class Gemfile < Base
|
6
|
-
def
|
7
|
-
File.basename(
|
8
|
-
end
|
9
|
-
|
10
|
-
def environ
|
6
|
+
def local source_map
|
7
|
+
return EMPTY_ENVIRON unless File.basename(source_map.filename) == 'Gemfile'
|
11
8
|
@environ ||= Environ.new(
|
12
9
|
requires: ['bundler'],
|
13
10
|
domains: ['Bundler::Dsl']
|
@@ -3,14 +3,11 @@
|
|
3
3
|
module Solargraph
|
4
4
|
module Convention
|
5
5
|
class Gemspec < Base
|
6
|
-
def
|
7
|
-
File.basename(
|
8
|
-
end
|
9
|
-
|
10
|
-
def environ
|
6
|
+
def local source_map
|
7
|
+
return EMPTY_ENVIRON unless File.basename(source_map.filename).end_with?('.gemspec')
|
11
8
|
@environ ||= Environ.new(
|
12
9
|
requires: ['rubygems'],
|
13
|
-
|
10
|
+
pins: [
|
14
11
|
Solargraph::Pin::Reference::Override.from_comment(
|
15
12
|
'Gem::Specification.new',
|
16
13
|
%(
|
@@ -3,18 +3,15 @@
|
|
3
3
|
module Solargraph
|
4
4
|
module Convention
|
5
5
|
class Rspec < Base
|
6
|
-
def
|
7
|
-
File.basename(
|
8
|
-
end
|
9
|
-
|
10
|
-
def environ
|
6
|
+
def local source_map
|
7
|
+
return EMPTY_ENVIRON unless File.basename(source_map.filename) =~ /_spec\.rb$/
|
11
8
|
@environ ||= Environ.new(
|
12
9
|
requires: ['rspec'],
|
13
10
|
domains: ['RSpec::Matchers', 'RSpec::ExpectationGroups'],
|
14
11
|
# This override is necessary due to an erroneous @return tag in
|
15
12
|
# rspec's YARD documentation.
|
16
13
|
# @todo The return types have been fixed (https://github.com/rspec/rspec-expectations/pull/1121)
|
17
|
-
|
14
|
+
pins: [
|
18
15
|
Solargraph::Pin::Reference::Override.method_return('RSpec::Matchers#expect', 'RSpec::Expectations::ExpectationTarget')
|
19
16
|
]
|
20
17
|
)
|
data/lib/solargraph/environ.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Solargraph
|
4
|
+
# A collection of additional data, such as map pins and required paths, that
|
5
|
+
# can be added to an ApiMap.
|
6
|
+
#
|
7
|
+
# Conventions are used to add Environs.
|
8
|
+
#
|
4
9
|
class Environ
|
5
10
|
# @return [Array<String>]
|
6
11
|
attr_reader :requires
|
@@ -9,22 +14,22 @@ module Solargraph
|
|
9
14
|
attr_reader :domains
|
10
15
|
|
11
16
|
# @return [Array<Pin::Reference::Override>]
|
12
|
-
attr_reader :
|
17
|
+
attr_reader :pins
|
13
18
|
|
14
19
|
# @param requires [Array<String>]
|
15
20
|
# @param domains [Array<String>]
|
16
|
-
# @param
|
17
|
-
def initialize requires: [], domains: [],
|
21
|
+
# @param pins [Array<Pin::Base>]
|
22
|
+
def initialize requires: [], domains: [], pins: []
|
18
23
|
@requires = requires
|
19
24
|
@domains = domains
|
20
|
-
@
|
25
|
+
@pins = pins
|
21
26
|
end
|
22
27
|
|
23
28
|
# @return [self]
|
24
29
|
def clear
|
25
30
|
domains.clear
|
26
31
|
requires.clear
|
27
|
-
|
32
|
+
pins.clear
|
28
33
|
self
|
29
34
|
end
|
30
35
|
|
@@ -33,7 +38,7 @@ module Solargraph
|
|
33
38
|
def merge other
|
34
39
|
domains.concat other.domains
|
35
40
|
requires.concat other.requires
|
36
|
-
|
41
|
+
pins.concat other.pins
|
37
42
|
self
|
38
43
|
end
|
39
44
|
end
|
@@ -34,7 +34,12 @@ module Solargraph
|
|
34
34
|
LanguageServer::MessageTypes::INFO,
|
35
35
|
['Update now'] do |result|
|
36
36
|
next unless result == 'Update now'
|
37
|
-
|
37
|
+
cmd = if host.options['useBundler']
|
38
|
+
'bundle update solargraph'
|
39
|
+
else
|
40
|
+
'gem update solargraph'
|
41
|
+
end
|
42
|
+
o, s = Open3.capture2(cmd)
|
38
43
|
if s == 0
|
39
44
|
host.show_message 'Successfully updated the Solargraph gem.', LanguageServer::MessageTypes::INFO
|
40
45
|
host.send_notification '$/solargraph/restart', {}
|
@@ -13,7 +13,7 @@ module Solargraph::LanguageServer::Message::TextDocument
|
|
13
13
|
def code_location
|
14
14
|
suggestions = host.definitions_at(params['textDocument']['uri'], @line, @column)
|
15
15
|
return nil if suggestions.empty?
|
16
|
-
suggestions.reject{|pin| pin.location.nil?}.map do |pin|
|
16
|
+
suggestions.reject { |pin| pin.location.nil? || pin.location.filename.nil? }.map do |pin|
|
17
17
|
{
|
18
18
|
uri: file_to_uri(pin.location.filename),
|
19
19
|
range: pin.location.range.to_hash
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'rubocop'
|
4
4
|
require 'securerandom'
|
5
|
+
require 'tmpdir'
|
5
6
|
|
6
7
|
module Solargraph
|
7
8
|
module LanguageServer
|
@@ -12,25 +13,22 @@ module Solargraph
|
|
12
13
|
|
13
14
|
def process
|
14
15
|
filename = uri_to_file(params['textDocument']['uri'])
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
set_error(Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}")
|
32
|
-
ensure
|
33
|
-
File.unlink tempfile
|
16
|
+
Dir.mktmpdir do |tempdir|
|
17
|
+
tempfile = File.join(tempdir, File.basename(filename))
|
18
|
+
rubocop_file = Diagnostics::RubocopHelpers.find_rubocop_file(filename)
|
19
|
+
original = host.read_text(params['textDocument']['uri'])
|
20
|
+
File.write tempfile, original
|
21
|
+
begin
|
22
|
+
args = ['-a', '-f', 'fi', tempfile]
|
23
|
+
args.unshift('-c', fix_drive_letter(rubocop_file)) unless rubocop_file.nil?
|
24
|
+
options, paths = RuboCop::Options.new.parse(args)
|
25
|
+
store = RuboCop::ConfigStore.new
|
26
|
+
redirect_stdout { RuboCop::Runner.new(options, store).run(paths) }
|
27
|
+
result = File.read(tempfile)
|
28
|
+
format original, result
|
29
|
+
rescue RuboCop::ValidationError, RuboCop::ConfigNotFoundError => e
|
30
|
+
set_error(Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}")
|
31
|
+
end
|
34
32
|
end
|
35
33
|
end
|
36
34
|
|
data/lib/solargraph/library.rb
CHANGED
@@ -20,7 +20,7 @@ module Solargraph
|
|
20
20
|
def initialize workspace = Solargraph::Workspace.new, name = nil
|
21
21
|
@workspace = workspace
|
22
22
|
@name = name
|
23
|
-
api_map.catalog
|
23
|
+
api_map.catalog bench
|
24
24
|
@synchronized = true
|
25
25
|
@catalog_mutex = Mutex.new
|
26
26
|
end
|
@@ -209,7 +209,6 @@ module Solargraph
|
|
209
209
|
# @return [Array<Solargraph::Range>]
|
210
210
|
# @todo Take a Location instead of filename/line/column
|
211
211
|
def references_from filename, line, column, strip: false
|
212
|
-
# checkout filename
|
213
212
|
cursor = api_map.cursor_at(filename, Position.new(line, column))
|
214
213
|
clip = api_map.clip(cursor)
|
215
214
|
pins = clip.define
|
@@ -222,7 +221,7 @@ module Solargraph
|
|
222
221
|
referenced = definitions_at(loc.filename, loc.range.ending.line, loc.range.ending.character)
|
223
222
|
# HACK: The additional location comparison is necessary because
|
224
223
|
# Clip#define can return proxies for parameter pins
|
225
|
-
referenced.any?{|r| r == pin || r.location == pin.location}
|
224
|
+
referenced.any? { |r| r == pin || r.location == pin.location }
|
226
225
|
end
|
227
226
|
# HACK: for language clients that exclude special characters from the start of variable names
|
228
227
|
if strip && match = cursor.word.match(/^[^a-z0-9_]+/i)
|
@@ -290,7 +289,6 @@ module Solargraph
|
|
290
289
|
# @param filename [String]
|
291
290
|
# @return [Array<Solargraph::Pin::Base>]
|
292
291
|
def document_symbols filename
|
293
|
-
# checkout filename
|
294
292
|
api_map.document_symbols(filename)
|
295
293
|
end
|
296
294
|
|
@@ -351,7 +349,7 @@ module Solargraph
|
|
351
349
|
@catalog_mutex.synchronize do
|
352
350
|
break if synchronized?
|
353
351
|
logger.info "Cataloging #{workspace.directory.empty? ? 'generic workspace' : workspace.directory}"
|
354
|
-
api_map.catalog
|
352
|
+
api_map.catalog bench
|
355
353
|
@synchronized = true
|
356
354
|
logger.info "Catalog complete (#{api_map.source_maps.length} files, #{api_map.pins.length} pins)" if logger.info?
|
357
355
|
end
|
@@ -403,9 +401,9 @@ module Solargraph
|
|
403
401
|
@api_map ||= Solargraph::ApiMap.new
|
404
402
|
end
|
405
403
|
|
406
|
-
# @return [
|
407
|
-
def
|
408
|
-
|
404
|
+
# @return [Bench]
|
405
|
+
def bench
|
406
|
+
Bench.new(
|
409
407
|
workspace: workspace,
|
410
408
|
opened: @current ? [@current] : []
|
411
409
|
)
|
@@ -98,6 +98,7 @@ module Solargraph
|
|
98
98
|
|
99
99
|
def convert_hash node
|
100
100
|
return {} unless Parser.is_ast_node?(node) && node.type == :hash
|
101
|
+
return convert_hash(node.children[0].children[0]) if splatted_hash?(node)
|
101
102
|
result = {}
|
102
103
|
node.children.each do |pair|
|
103
104
|
result[pair.children[0].children[0]] = Solargraph::Parser.chain(pair.children[1])
|
@@ -118,6 +119,14 @@ module Solargraph
|
|
118
119
|
result
|
119
120
|
end
|
120
121
|
|
122
|
+
def splatted_hash? node
|
123
|
+
Parser.is_ast_node?(node.children[0]) && node.children[0].type == :kwsplat
|
124
|
+
end
|
125
|
+
|
126
|
+
def splatted_call? node
|
127
|
+
Parser.is_ast_node?(node.children[0]) && node.children[0].type == :kwsplat && node.children[0].children[0].type != :hash
|
128
|
+
end
|
129
|
+
|
121
130
|
# @todo Temporarily here for testing. Move to Solargraph::Parser.
|
122
131
|
def call_nodes_from node
|
123
132
|
return [] unless node.is_a?(::Parser::AST::Node)
|
@@ -19,7 +19,7 @@ module Solargraph
|
|
19
19
|
if region.visibility == :module_function
|
20
20
|
here = get_node_start_position(node)
|
21
21
|
named_path = named_path_pin(here)
|
22
|
-
if named_path.is_a?(Pin::
|
22
|
+
if named_path.is_a?(Pin::Method)
|
23
23
|
pins.push Solargraph::Pin::InstanceVariable.new(
|
24
24
|
location: loc,
|
25
25
|
closure: Pin::Namespace.new(type: :module, closure: region.closure.closure, name: region.closure.name),
|
@@ -10,20 +10,7 @@ module Solargraph
|
|
10
10
|
def process
|
11
11
|
if node.children[0].nil?
|
12
12
|
if [:private, :public, :protected].include?(node.children[1])
|
13
|
-
|
14
|
-
node.children[2..-1].each do |child|
|
15
|
-
next unless child.is_a?(AST::Node) && (child.type == :sym || child.type == :str)
|
16
|
-
name = child.children[0].to_s
|
17
|
-
matches = pins.select{ |pin| pin.is_a?(Pin::BaseMethod) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance)}
|
18
|
-
matches.each do |pin|
|
19
|
-
# @todo Smelly instance variable access
|
20
|
-
pin.instance_variable_set(:@visibility, node.children[1])
|
21
|
-
end
|
22
|
-
end
|
23
|
-
else
|
24
|
-
# @todo Smelly instance variable access
|
25
|
-
region.instance_variable_set(:@visibility, node.children[1])
|
26
|
-
end
|
13
|
+
process_visibility
|
27
14
|
elsif node.children[1] == :module_function
|
28
15
|
process_module_function
|
29
16
|
elsif [:attr_reader, :attr_writer, :attr_accessor].include?(node.children[1])
|
@@ -54,6 +41,27 @@ module Solargraph
|
|
54
41
|
|
55
42
|
private
|
56
43
|
|
44
|
+
# @return [void]
|
45
|
+
def process_visibility
|
46
|
+
if (node.children.length > 2)
|
47
|
+
node.children[2..-1].each do |child|
|
48
|
+
if child.is_a?(AST::Node) && (child.type == :sym || child.type == :str)
|
49
|
+
name = child.children[0].to_s
|
50
|
+
matches = pins.select{ |pin| pin.is_a?(Pin::Method) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance)}
|
51
|
+
matches.each do |pin|
|
52
|
+
# @todo Smelly instance variable access
|
53
|
+
pin.instance_variable_set(:@visibility, node.children[1])
|
54
|
+
end
|
55
|
+
else
|
56
|
+
process_children region.update(visibility: node.children[1])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
else
|
60
|
+
# @todo Smelly instance variable access
|
61
|
+
region.instance_variable_set(:@visibility, node.children[1])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
57
65
|
# @return [void]
|
58
66
|
def process_attribute
|
59
67
|
node.children[2..-1].each do |a|
|
@@ -61,26 +69,30 @@ module Solargraph
|
|
61
69
|
clos = region.closure
|
62
70
|
cmnt = comments_for(node)
|
63
71
|
if node.children[1] == :attr_reader || node.children[1] == :attr_accessor
|
64
|
-
pins.push Solargraph::Pin::
|
72
|
+
pins.push Solargraph::Pin::Method.new(
|
65
73
|
location: loc,
|
66
74
|
closure: clos,
|
67
75
|
name: a.children[0].to_s,
|
68
76
|
comments: cmnt,
|
69
|
-
access: :reader,
|
70
77
|
scope: region.scope || :instance,
|
71
|
-
visibility: region.visibility
|
78
|
+
visibility: region.visibility,
|
79
|
+
attribute: true
|
72
80
|
)
|
73
81
|
end
|
74
82
|
if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
|
75
|
-
pins.push Solargraph::Pin::
|
83
|
+
pins.push Solargraph::Pin::Method.new(
|
76
84
|
location: loc,
|
77
85
|
closure: clos,
|
78
86
|
name: "#{a.children[0]}=",
|
79
87
|
comments: cmnt,
|
80
|
-
access: :writer,
|
81
88
|
scope: region.scope || :instance,
|
82
|
-
visibility: region.visibility
|
89
|
+
visibility: region.visibility,
|
90
|
+
attribute: true
|
83
91
|
)
|
92
|
+
pins.last.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last)
|
93
|
+
if pins.last.return_type.defined?
|
94
|
+
pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.to_s.split(', '), 'value')
|
95
|
+
end
|
84
96
|
end
|
85
97
|
end
|
86
98
|
end
|
@@ -90,7 +102,8 @@ module Solargraph
|
|
90
102
|
if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
|
91
103
|
cp = region.closure
|
92
104
|
node.children[2..-1].each do |i|
|
93
|
-
|
105
|
+
type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
|
106
|
+
pins.push type.new(
|
94
107
|
location: get_node_location(i),
|
95
108
|
closure: cp,
|
96
109
|
name: unpack_name(i)
|
@@ -156,7 +169,7 @@ module Solargraph
|
|
156
169
|
elsif node.children[2].type == :sym || node.children[2].type == :str
|
157
170
|
node.children[2..-1].each do |x|
|
158
171
|
cn = x.children[0].to_s
|
159
|
-
ref = pins.select{|p|
|
172
|
+
ref = pins.select{ |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }.first
|
160
173
|
unless ref.nil?
|
161
174
|
pins.delete ref
|
162
175
|
mm = Solargraph::Pin::Method.new(
|
@@ -228,7 +241,7 @@ module Solargraph
|
|
228
241
|
# @return [Boolean]
|
229
242
|
def process_private_class_method
|
230
243
|
if node.children[2].type == :sym || node.children[2].type == :str
|
231
|
-
ref = pins.select{|p|
|
244
|
+
ref = pins.select { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == node.children[2].children[0].to_s }.first
|
232
245
|
# HACK: Smelly instance variable access
|
233
246
|
ref.instance_variable_set(:@visibility, :private) unless ref.nil?
|
234
247
|
false
|