solargraph 0.28.1 → 0.28.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d39e4aebe3e312f765cc5e4d00e7d1f5322732f680ec12f5c4e84fb96c83d6a9
4
- data.tar.gz: 010fb32febe1de5ade25857c023efd821b5ae2db3d64ec7941d1f987b24720b1
3
+ metadata.gz: 99d55308f8ad7a0f73c4432cf08789471b46a60df7db0cc59a4ca8ef6dd9360f
4
+ data.tar.gz: 8b81acc2451105bb669fbaa0eb215f27ef6f32306b354683c0c045374317e4f8
5
5
  SHA512:
6
- metadata.gz: ce1e56113f3c61ac8af9fc3d68edb676f23655ea2cbbab4f612088bff67a29abfdee671bd4644bb31864b52e3b8f28b67dc8c1009c998525eb231239517ffed6
7
- data.tar.gz: e4d80e8e3a2d7d6bbc040482ad7a75796dffe98006c67ba59748eb2c3fd70ba5876ffff1f886d92c13404f5b5a9f49e2875d671ebea166bd824f0de48afb65c7
6
+ metadata.gz: 482e84a980ef3385ee1f182c17681bdd97912b84055b017dd5821641a82a240945c1e080bbd11dee0a32df520069318aafef85687a24d801089574fb88154f2f
7
+ data.tar.gz: 14cf67e4029a2f1fcc8fdbccfd521f7db6776d010d2f4681c77db56b5f5da0a4ebdc51499ef60c5ff5fcd6fa031ab054f250491b71a2ac4394feef4b8aeaa9c5
@@ -334,10 +334,10 @@ module Solargraph
334
334
  # @return [Array<Solargraph::Pin::Base>]
335
335
  def get_method_stack fqns, name, scope: :instance
336
336
  # @todo This cache is still causing problems.
337
- # cached = cache.get_method_stack(fqns, name, scope)
338
- # return cached unless cached.nil?
337
+ cached = cache.get_method_stack(fqns, name, scope)
338
+ return cached unless cached.nil?
339
339
  result = get_methods(fqns, scope: scope, visibility: [:private, :protected, :public]).select{|p| p.name == name}
340
- # cache.set_method_stack(fqns, name, scope, result)
340
+ cache.set_method_stack(fqns, name, scope, result)
341
341
  result
342
342
  end
343
343
 
@@ -2,34 +2,12 @@ module Solargraph
2
2
  class ApiMap
3
3
  class Cache
4
4
  def initialize
5
- @signature_types = {}
6
- @assignment_node_types = {}
7
5
  @methods = {}
8
6
  @method_stacks = {}
9
7
  @constants = {}
10
8
  @qualified_namespaces = {}
11
9
  end
12
10
 
13
- def get_signature_type signature, namespace, scope
14
- @signature_types[[signature, namespace, scope]]
15
- end
16
-
17
- def has_signature_type?(signature, namespace, scope)
18
- @signature_types.has_key?([signature, namespace, scope])
19
- end
20
-
21
- def set_signature_type signature, namespace, scope, value
22
- @signature_types[[signature, namespace, scope]] = value
23
- end
24
-
25
- def get_assignment_node_type node, namespace
26
- @assignment_node_types[[node, namespace]]
27
- end
28
-
29
- def set_assignment_node_type node, namespace, value
30
- @assignment_node_types[[node, namespace]] = value
31
- end
32
-
33
11
  def get_methods fqns, scope, visibility, deep
34
12
  @methods[[fqns, scope, visibility.sort, deep]]
35
13
  end
@@ -64,8 +42,6 @@ module Solargraph
64
42
 
65
43
  # @return [void]
66
44
  def clear
67
- @signature_types.clear
68
- @assignment_node_types.clear
69
45
  @methods.clear
70
46
  @method_stacks.clear
71
47
  @constants.clear
@@ -74,9 +50,7 @@ module Solargraph
74
50
 
75
51
  # @return [Boolean]
76
52
  def empty?
77
- @signature_types.empty? &&
78
- @assignment_node_types.empty? &&
79
- @methods.empty? &&
53
+ @methods.empty? &&
80
54
  @method_stacks.empty? &&
81
55
  @constants.empty? &&
82
56
  @qualified_namespaces.empty?
@@ -27,7 +27,7 @@ module Solargraph
27
27
  # @return [Array<Solargraph::Pin::Base>]
28
28
  def get_methods fqns, scope: :instance, visibility: [:public]
29
29
  namespace_children(fqns).select{ |pin|
30
- [Pin::METHOD, Pin::ATTRIBUTE].include?(pin.kind) and (pin.scope == scope or fqns == '') and visibility.include?(pin.visibility)
30
+ [Pin::METHOD, Pin::ATTRIBUTE].include?(pin.kind) && pin.scope == scope && visibility.include?(pin.visibility)
31
31
  }
32
32
  end
33
33
 
@@ -1,4 +1,6 @@
1
1
  module Solargraph
2
+ # A container for type data based on YARD type tags.
3
+ #
2
4
  class ComplexType < Array
3
5
  # @todo Figure out how to add the basic type methods here without actually
4
6
  # including the module. One possibility:
@@ -8,7 +10,7 @@ module Solargraph
8
10
 
9
11
  autoload :TypeMethods, 'solargraph/complex_type/type_methods'
10
12
  autoload :UniqueType, 'solargraph/complex_type/unique_type'
11
-
13
+
12
14
  # @param types [Array<ComplexType>]
13
15
  def initialize types = [ComplexType::UNDEFINED]
14
16
  super()
@@ -17,6 +19,7 @@ module Solargraph
17
19
 
18
20
  # @param api_map [ApiMap]
19
21
  # @param context [String]
22
+ # @return [ComplexType]
20
23
  def qualify api_map, context = ''
21
24
  types = map do |t|
22
25
  t.qualify api_map, context
@@ -95,7 +98,6 @@ module Solargraph
95
98
  curly_stack -= 1
96
99
  subtype_string += char
97
100
  raise ComplexTypeError, "Invalid close in type #{type_string}" if curly_stack < 0
98
- # types.push ComplexType.parse(subtype_string[1..-2]) if curly_stack == 0
99
101
  next
100
102
  elsif char == '('
101
103
  paren_stack += 1
@@ -1,5 +1,7 @@
1
1
  module Solargraph
2
2
  class ComplexType
3
+ # Methods for accessing type data.
4
+ #
3
5
  module TypeMethods
4
6
  # @return [String]
5
7
  attr_reader :name
@@ -69,13 +71,13 @@ module Solargraph
69
71
  def namespace
70
72
  @namespace ||= 'Object' if duck_type?
71
73
  @namespace ||= 'NilClass' if nil_type?
72
- @namespace ||= ((name == 'Class' or name == 'Module') and !subtypes.empty?) ? subtypes.first.name : name
74
+ @namespace ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
73
75
  end
74
76
 
75
77
  # @return [Symbol] :class or :instance
76
78
  def scope
77
- @scope ||= :instance if duck_type? or nil_type?
78
- @scope ||= ((name == 'Class' or name == 'Module') and !subtypes.empty?) ? :class : :instance
79
+ @scope ||= :instance if duck_type? || nil_type?
80
+ @scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
79
81
  end
80
82
 
81
83
  def == other
@@ -1,11 +1,14 @@
1
1
  module Solargraph
2
2
  class ComplexType
3
+ # An individual type signature. A complex type can consist of multiple
4
+ # unique types.
5
+ #
3
6
  class UniqueType
4
7
  include TypeMethods
5
8
 
6
- # Create a BasicType with the specified name and an optional substring.
7
- # The substring is the parameter section of a parametrized type, e.g., for
8
- # the type `Array<String>`, the name is `Array` and the substring is
9
+ # Create a UniqueType with the specified name and an optional substring.
10
+ # The substring is the parameter section of a parametrized type, e.g.,
11
+ # for the type `Array<String>`, the name is `Array` and the substring is
9
12
  # `<String>`.
10
13
  #
11
14
  # @param name [String] The name of the type
@@ -143,8 +143,22 @@ module Solargraph
143
143
  library.overwrite filename, version
144
144
  end
145
145
 
146
+ # @param uri [String]
146
147
  def diagnose uri
147
- library.diagnose uri_to_file(uri)
148
+ begin
149
+ results = library.diagnose uri_to_file(uri)
150
+ send_notification "textDocument/publishDiagnostics", {
151
+ uri: uri,
152
+ diagnostics: results
153
+ }
154
+ rescue DiagnosticsError => e
155
+ STDERR.puts "Error in diagnostics: #{e.message}"
156
+ options['diagnostics'] = false
157
+ send_notification 'window/showMessage', {
158
+ type: LanguageServer::MessageTypes::ERROR,
159
+ message: "Error in diagnostics: #{e.message}"
160
+ }
161
+ end
148
162
  end
149
163
 
150
164
  def change params
@@ -45,25 +45,11 @@ module Solargraph
45
45
  mutex.synchronize { queue.clear }
46
46
  next
47
47
  end
48
- begin
49
- current = nil
50
- mutex.synchronize { current = queue.shift }
51
- next if queue.include?(current)
52
- results = []
53
- results.concat host.diagnose(current) if host.open?(current)
54
- host.send_notification "textDocument/publishDiagnostics", {
55
- uri: current,
56
- diagnostics: results
57
- }
58
- sleep 0.5
59
- rescue DiagnosticsError => e
60
- STDERR.puts "Error in diagnostics: #{e.message}"
61
- options['diagnostics'] = false
62
- host.send_notification 'window/showMessage', {
63
- type: LanguageServer::MessageTypes::ERROR,
64
- message: "Error in diagnostics: #{e.message}"
65
- }
66
- end
48
+ current = nil
49
+ mutex.synchronize { current = queue.shift }
50
+ next if queue.include?(current)
51
+ host.diagnose current
52
+ sleep 0.5
67
53
  end
68
54
  end
69
55
  self
@@ -1,5 +1,6 @@
1
1
  module Solargraph
2
-
2
+ # The zero-based line and column numbers of a position in a string.
3
+ #
3
4
  class Position
4
5
  # @return [Integer]
5
6
  attr_reader :line
@@ -7,15 +8,15 @@ module Solargraph
7
8
  # @return [Integer]
8
9
  attr_reader :character
9
10
 
11
+ alias column character
12
+
13
+ # @param line [Integer]
14
+ # @param character [Integer]
10
15
  def initialize line, character
11
16
  @line = line
12
17
  @character = character
13
18
  end
14
19
 
15
- def column
16
- character
17
- end
18
-
19
20
  # Get a hash of the position. This representation is suitable for use in
20
21
  # the language server protocol.
21
22
  #
@@ -42,7 +42,7 @@ module Solargraph
42
42
  node = source.node_at(position.line, position.column)
43
43
  else
44
44
  node = nil
45
- node = source.node_at(fixed_position.line, fixed_position.column) unless source.error_ranges.any?{|r| r.include?(fixed_position)}
45
+ node = source.node_at(fixed_position.line, fixed_position.column) unless source.error_ranges.any?{|r| r.nil? || r.include?(fixed_position)}
46
46
  node = Source.parse(fixed_phrase) if node.nil?
47
47
  end
48
48
  rescue Parser::SyntaxError
@@ -24,10 +24,22 @@ module Solargraph
24
24
  return package_completions(api_map.get_symbols) if cursor.chain.literal? && cursor.chain.links.last.word == '<Symbol>'
25
25
  return Completion.new([], cursor.range) if cursor.chain.literal? || cursor.comment?
26
26
  result = []
27
- type = cursor.chain.base.infer(api_map, context_pin, locals)
28
27
  if cursor.chain.constant? || cursor.start_of_constant?
28
+ if cursor.chain.undefined?
29
+ type = cursor.chain.base.infer(api_map, context_pin, locals)
30
+ else
31
+ full = cursor.chain.links.first.word
32
+ if full.include?('::')
33
+ type = ComplexType.parse(full.split('::')[0..-2].join('::'))
34
+ elsif cursor.chain.links.length > 1
35
+ type = ComplexType.parse(full)
36
+ else
37
+ type = ComplexType::UNDEFINED
38
+ end
39
+ end
29
40
  result.concat api_map.get_constants(type.undefined? ? '' : type.namespace, cursor.start_of_constant? ? '' : context_pin.context.namespace)
30
41
  else
42
+ type = cursor.chain.base.infer(api_map, context_pin, locals)
31
43
  result.concat api_map.get_complex_type_methods(type, context_pin.context.namespace, cursor.chain.links.length == 1)
32
44
  if cursor.chain.links.length == 1
33
45
  if cursor.word.start_with?('@@')
@@ -279,7 +279,7 @@ module Solargraph
279
279
  end
280
280
  end
281
281
  end
282
- elsif c.type == :send and [:attr_reader, :attr_writer, :attr_accessor].include?(c.children[1])
282
+ elsif c.type == :send && [:attr_reader, :attr_writer, :attr_accessor].include?(c.children[1])
283
283
  c.children[2..-1].each do |a|
284
284
  if c.children[1] == :attr_reader or c.children[1] == :attr_accessor
285
285
  pins.push Solargraph::Pin::Attribute.new(get_node_location(c), fqn || '', "#{a.children[0]}", comments_for(c), :reader, scope, visibility)
@@ -288,10 +288,19 @@ module Solargraph
288
288
  pins.push Solargraph::Pin::Attribute.new(get_node_location(c), fqn || '', "#{a.children[0]}=", comments_for(c), :writer, scope, visibility)
289
289
  end
290
290
  end
291
- elsif c.type == :sclass and c.children[0].type == :self
291
+ elsif c.type == :alias
292
+ pin = pins.select{|p| p.name == c.children[1].children[0].to_s && p.namespace == fqn && p.scope == scope}.first
293
+ unless pin.nil?
294
+ if pin.is_a?(Solargraph::Pin::Method)
295
+ pins.push Solargraph::Pin::Method.new(get_node_location(c), pin.namespace, c.children[0].children[0].to_s, comments_for(c) || pin.comments, pin.scope, pin.visibility, pin.parameters)
296
+ elsif pin.is_a?(Solargraph::Pin::Attribute)
297
+ pins.push Solargraph::Pin::Attribute.new(get_node_location(c), pin.namespace, c.children[0].children[0].to_s, comments_for(c) || pin.comments, pin.access, pin.scope, pin.visibility)
298
+ end
299
+ end
300
+ elsif c.type == :sclass && c.children[0].type == :self
292
301
  process c, tree, :public, :class, fqn || '', stack
293
302
  next
294
- elsif c.type == :send and c.children[1] == :require
303
+ elsif c.type == :send && c.children[1] == :require
295
304
  if c.children[2].kind_of?(AST::Node) and c.children[2].type == :str
296
305
  # @requires.push Solargraph::Pin::Reference.new(get_node_location(c), fqn, c.children[2].children[0].to_s)
297
306
  pins.push Pin::Reference::Require.new(get_node_location(c), c.children[2].children[0].to_s)
@@ -1,3 +1,3 @@
1
1
  module Solargraph
2
- VERSION = '0.28.1'
2
+ VERSION = '0.28.2'
3
3
  end
@@ -122,7 +122,15 @@ module Solargraph
122
122
  if code_object.is_a?(YARD::CodeObjects::NamespaceObject)
123
123
  result.push Solargraph::Pin::YardPin::Namespace.new(code_object, location)
124
124
  if code_object.is_a?(YARD::CodeObjects::ClassObject) and !code_object.superclass.nil?
125
- result.push Solargraph::Pin::Reference::Superclass.new(location, code_object.path, code_object.superclass.path)
125
+ # @todo This method of superclass detection is a bit of a hack. If
126
+ # the superclass is a Proxy, it is assumed to be undefined in its
127
+ # yardoc and converted to a fully qualified namespace.
128
+ if code_object.superclass.is_a?(YARD::CodeObjects::Proxy)
129
+ superclass = "::#{code_object.superclass}"
130
+ else
131
+ superclass = code_object.superclass.to_s
132
+ end
133
+ result.push Solargraph::Pin::Reference::Superclass.new(location, code_object.path, superclass)
126
134
  end
127
135
  code_object.class_mixins.each do |m|
128
136
  result.push Solargraph::Pin::Reference::Extend.new(location, code_object.path, m.path)
@@ -5,8 +5,9 @@ require 'fileutils'
5
5
 
6
6
  module Solargraph
7
7
  class YardMap
8
+ # Tools for managing core documentation.
9
+ #
8
10
  module CoreDocs
9
-
10
11
  SOURCE = 'https://solargraph.org/download'
11
12
 
12
13
  class << self
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.28.1
4
+ version: 0.28.2
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-09-18 00:00:00.000000000 Z
11
+ date: 2018-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser