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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -8
  3. data/CHANGELOG.md +992 -0
  4. data/Rakefile +12 -1
  5. data/SPONSORS.md +1 -0
  6. data/lib/.rubocop.yml +2 -2
  7. data/lib/solargraph.rb +2 -4
  8. data/lib/solargraph/api_map.rb +75 -74
  9. data/lib/solargraph/api_map/cache.rb +2 -2
  10. data/lib/solargraph/api_map/store.rb +4 -8
  11. data/lib/solargraph/{bundle.rb → bench.rb} +6 -2
  12. data/lib/solargraph/compat.rb +14 -0
  13. data/lib/solargraph/complex_type.rb +2 -2
  14. data/lib/solargraph/convention.rb +13 -4
  15. data/lib/solargraph/convention/base.rb +16 -8
  16. data/lib/solargraph/convention/gemfile.rb +2 -5
  17. data/lib/solargraph/convention/gemspec.rb +3 -6
  18. data/lib/solargraph/convention/rspec.rb +3 -6
  19. data/lib/solargraph/environ.rb +11 -6
  20. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +6 -1
  21. data/lib/solargraph/language_server/message/text_document/definition.rb +1 -1
  22. data/lib/solargraph/language_server/message/text_document/formatting.rb +17 -19
  23. data/lib/solargraph/library.rb +6 -8
  24. data/lib/solargraph/parser/legacy/node_methods.rb +9 -0
  25. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +1 -1
  26. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +36 -23
  27. data/lib/solargraph/parser/node_processor/base.rb +3 -0
  28. data/lib/solargraph/parser/rubyvm/node_methods.rb +18 -1
  29. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +1 -1
  30. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +1 -1
  31. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +40 -29
  32. data/lib/solargraph/pin.rb +0 -3
  33. data/lib/solargraph/pin/common.rb +1 -1
  34. data/lib/solargraph/pin/conversions.rb +3 -4
  35. data/lib/solargraph/pin/documenting.rb +3 -9
  36. data/lib/solargraph/pin/method.rb +141 -7
  37. data/lib/solargraph/pin/method_alias.rb +1 -1
  38. data/lib/solargraph/position.rb +2 -14
  39. data/lib/solargraph/source.rb +10 -6
  40. data/lib/solargraph/source/chain.rb +18 -5
  41. data/lib/solargraph/source_map.rb +4 -1
  42. data/lib/solargraph/source_map/clip.rb +3 -2
  43. data/lib/solargraph/source_map/mapper.rb +10 -6
  44. data/lib/solargraph/type_checker.rb +27 -24
  45. data/lib/solargraph/type_checker/param_def.rb +1 -1
  46. data/lib/solargraph/version.rb +1 -1
  47. data/lib/solargraph/yard_map.rb +40 -47
  48. data/lib/solargraph/yard_map/core_fills.rb +185 -0
  49. data/lib/solargraph/yard_map/helpers.rb +16 -0
  50. data/lib/solargraph/yard_map/mapper.rb +14 -8
  51. data/lib/solargraph/{pin/yard_pin/constant.rb → yard_map/mapper/to_constant.rb} +6 -6
  52. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -0
  53. data/lib/solargraph/{pin/yard_pin/namespace.rb → yard_map/mapper/to_namespace.rb} +6 -6
  54. data/lib/solargraph/yard_map/rdoc_to_yard.rb +1 -1
  55. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -0
  56. data/lib/solargraph/yard_map/to_method.rb +79 -0
  57. data/solargraph.gemspec +5 -5
  58. metadata +22 -36
  59. data/lib/solargraph/core_fills.rb +0 -160
  60. data/lib/solargraph/pin/attribute.rb +0 -49
  61. data/lib/solargraph/pin/base_method.rb +0 -141
  62. data/lib/solargraph/pin/yard_pin.rb +0 -12
  63. data/lib/solargraph/pin/yard_pin/method.rb +0 -80
  64. data/lib/solargraph/pin/yard_pin/yard_mixin.rb +0 -20
  65. data/lib/solargraph/stdlib_fills.rb +0 -40
  66. 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 Bundle
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>]
@@ -7,3 +7,17 @@ unless Hash.method_defined?(:transform_values)
7
7
  end
8
8
  end
9
9
  end
10
+
11
+ unless Array.method_defined?(:sum)
12
+ class Array
13
+ def sum &block
14
+ inject(0) do |s, x|
15
+ if block
16
+ s + block.call(x)
17
+ else
18
+ s + x
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -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 source [Source]
23
+ # @param source_map [SourceMap]
24
24
  # @return [Environ]
25
- def self.for(source)
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.environ if conv.match?(source)
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
- # True if the source qualifies for this convention.
9
- # Subclasses should override this method.
14
+ # The Environ for a source map.
15
+ # Subclasses can override this method.
10
16
  #
11
- # @param source [Source]
12
- def match? source
13
- false
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 this convention.
17
- # Subclasses should override this method.
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 environ
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 match? source
7
- File.basename(source.filename) == 'Gemfile'
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 match? source
7
- File.basename(source.filename).end_with?('.gemspec')
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
- overrides: [
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 match? source
7
- File.basename(source.filename) =~ /_spec\.rb$/
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
- overrides: [
14
+ pins: [
18
15
  Solargraph::Pin::Reference::Override.method_return('RSpec::Matchers#expect', 'RSpec::Expectations::ExpectationTarget')
19
16
  ]
20
17
  )
@@ -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 :overrides
17
+ attr_reader :pins
13
18
 
14
19
  # @param requires [Array<String>]
15
20
  # @param domains [Array<String>]
16
- # @param overrides [Array<Pin::Reference::Override>]
17
- def initialize requires: [], domains: [], overrides: []
21
+ # @param pins [Array<Pin::Base>]
22
+ def initialize requires: [], domains: [], pins: []
18
23
  @requires = requires
19
24
  @domains = domains
20
- @overrides = overrides
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
- overrides.clear
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
- overrides.concat other.overrides
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
- o, s = Open3.capture2("gem update solargraph")
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
- # Make the temp file in the original file's directory so RuboCop
16
- # detects the correct configuration
17
- # the .rb extension is needed for ruby file without extension, else rubocop won't format
18
- tempfile = File.join(File.dirname(filename), "_tmp_#{SecureRandom.hex(8)}_#{File.basename(filename)}.rb")
19
- rubocop_file = Diagnostics::RubocopHelpers.find_rubocop_file(filename)
20
- original = host.read_text(params['textDocument']['uri'])
21
- File.write tempfile, original
22
- begin
23
- args = ['-a', '-f', 'fi', tempfile]
24
- args.unshift('-c', fix_drive_letter(rubocop_file)) unless rubocop_file.nil?
25
- options, paths = RuboCop::Options.new.parse(args)
26
- store = RuboCop::ConfigStore.new
27
- redirect_stdout { RuboCop::Runner.new(options, store).run(paths) }
28
- result = File.read(tempfile)
29
- format original, result
30
- rescue RuboCop::ValidationError, RuboCop::ConfigNotFoundError => e
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
 
@@ -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 bundle
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 bundle
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 [Bundle]
407
- def bundle
408
- Bundle.new(
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::BaseMethod)
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
- if (node.children.length > 2)
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::Attribute.new(
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::Attribute.new(
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
- pins.push Pin::Reference::Include.new(
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| [Solargraph::Pin::Method, Solargraph::Pin::Attribute].include?(p.class) && p.namespace == region.closure.full_context.namespace && p.name == cn}.first
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| [Solargraph::Pin::Method, Solargraph::Pin::Attribute].include?(p.class) && p.namespace == region.closure.full_context.namespace && p.name == node.children[2].children[0].to_s}.first
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