solargraph 0.39.14 → 0.40.1

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -8
  3. data/CHANGELOG.md +988 -0
  4. data/Rakefile +12 -1
  5. data/SPONSORS.md +1 -0
  6. data/lib/solargraph.rb +2 -4
  7. data/lib/solargraph/api_map.rb +75 -74
  8. data/lib/solargraph/api_map/cache.rb +2 -2
  9. data/lib/solargraph/api_map/store.rb +4 -8
  10. data/lib/solargraph/{bundle.rb → bench.rb} +6 -2
  11. data/lib/solargraph/compat.rb +14 -0
  12. data/lib/solargraph/complex_type.rb +2 -2
  13. data/lib/solargraph/convention.rb +13 -4
  14. data/lib/solargraph/convention/base.rb +16 -8
  15. data/lib/solargraph/convention/gemfile.rb +2 -5
  16. data/lib/solargraph/convention/gemspec.rb +3 -6
  17. data/lib/solargraph/convention/rspec.rb +3 -6
  18. data/lib/solargraph/documentor.rb +2 -0
  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 +8 -10
  24. data/lib/solargraph/parser/legacy/node_chainer.rb +7 -7
  25. data/lib/solargraph/parser/legacy/node_methods.rb +5 -0
  26. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +1 -1
  27. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +36 -23
  28. data/lib/solargraph/parser/node_processor/base.rb +3 -0
  29. data/lib/solargraph/parser/rubyvm/node_chainer.rb +9 -9
  30. data/lib/solargraph/parser/rubyvm/node_methods.rb +11 -1
  31. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +1 -1
  32. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +1 -1
  33. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +40 -29
  34. data/lib/solargraph/pin.rb +0 -3
  35. data/lib/solargraph/pin/common.rb +1 -1
  36. data/lib/solargraph/pin/conversions.rb +3 -4
  37. data/lib/solargraph/pin/documenting.rb +3 -9
  38. data/lib/solargraph/pin/method.rb +141 -7
  39. data/lib/solargraph/pin/method_alias.rb +1 -1
  40. data/lib/solargraph/position.rb +2 -14
  41. data/lib/solargraph/shell.rb +1 -1
  42. data/lib/solargraph/source.rb +10 -6
  43. data/lib/solargraph/source/chain.rb +18 -5
  44. data/lib/solargraph/source_map.rb +4 -1
  45. data/lib/solargraph/source_map/clip.rb +3 -2
  46. data/lib/solargraph/source_map/mapper.rb +10 -6
  47. data/lib/solargraph/type_checker.rb +35 -39
  48. data/lib/solargraph/type_checker/param_def.rb +1 -1
  49. data/lib/solargraph/version.rb +1 -1
  50. data/lib/solargraph/yard_map.rb +40 -47
  51. data/lib/solargraph/yard_map/core_fills.rb +185 -0
  52. data/lib/solargraph/yard_map/helpers.rb +16 -0
  53. data/lib/solargraph/yard_map/mapper.rb +14 -8
  54. data/lib/solargraph/{pin/yard_pin/constant.rb → yard_map/mapper/to_constant.rb} +6 -6
  55. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -0
  56. data/lib/solargraph/{pin/yard_pin/namespace.rb → yard_map/mapper/to_namespace.rb} +6 -6
  57. data/lib/solargraph/yard_map/rdoc_to_yard.rb +1 -1
  58. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -0
  59. data/lib/solargraph/yard_map/to_method.rb +79 -0
  60. data/solargraph.gemspec +4 -4
  61. metadata +20 -34
  62. data/lib/solargraph/core_fills.rb +0 -160
  63. data/lib/solargraph/pin/attribute.rb +0 -49
  64. data/lib/solargraph/pin/base_method.rb +0 -141
  65. data/lib/solargraph/pin/yard_pin.rb +0 -12
  66. data/lib/solargraph/pin/yard_pin/method.rb +0 -80
  67. data/lib/solargraph/pin/yard_pin/yard_mixin.rb +0 -20
  68. data/lib/solargraph/stdlib_fills.rb +0 -40
  69. data/travis-bundler.rb +0 -11
@@ -1,160 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- # Overrides for the Ruby core.
5
- #
6
- # The YardMap uses this module to add type information to core methods.
7
- #
8
- module CoreFills
9
- Override = Pin::Reference::Override
10
-
11
- KEYWORDS = [
12
- '__ENCODING__', '__LINE__', '__FILE__', 'BEGIN', 'END', 'alias', 'and',
13
- 'begin', 'break', 'case', 'class', 'def', 'defined?', 'do', 'else',
14
- 'elsif', 'end', 'ensure', 'false', 'for', 'if', 'in', 'module', 'next',
15
- 'nil', 'not', 'or', 'redo', 'rescue', 'retry', 'return', 'self', 'super',
16
- 'then', 'true', 'undef', 'unless', 'until', 'when', 'while', 'yield'
17
- ].freeze
18
-
19
- methods_with_yieldparam_subtypes = %w[
20
- Array#each Array#map Array#map! Array#any? Array#all? Array#index
21
- Array#keep_if Array#delete_if
22
- Enumerable#each_entry Enumerable#map Enumerable#any? Enumerable#all?
23
- Enumerable#select Enumerable#reject
24
- Set#each
25
- ]
26
-
27
- OVERRIDES = [
28
- Override.method_return('Array#keep_if', 'self'),
29
- Override.method_return('Array#delete_if', 'self'),
30
- Override.from_comment('Array#reject', %(
31
- @overload reject(&block)
32
- @return [self]
33
- @overload reject()
34
- @return [Enumerator]
35
- )),
36
- Override.method_return('Array#reverse', 'self', delete: ['overload']),
37
- Override.from_comment('Array#select', %(
38
- @overload select(&block)
39
- @return [self]
40
- @overload select()
41
- @return [Enumerator]
42
- )),
43
- Override.from_comment('Array#[]', %(
44
- @overload [](range)
45
- @param range [Range]
46
- @return [self]
47
- @overload [](num1, num2)
48
- @param num1 [Integer]
49
- @param num2 [Integer]
50
- @return [self]
51
- @overload [](num)
52
- @param num [Integer]
53
- @return_single_parameter
54
- @return_single_parameter
55
- )),
56
- Override.from_comment('Array#first', %(
57
- @overload first(num)
58
- @param num [Integer]
59
- @return [self]
60
- @return_single_parameter
61
- )),
62
- Override.from_comment('Array#last', %(
63
- @overload last(num)
64
- @param num [Integer]
65
- @return [self]
66
- @return_single_parameter
67
- )),
68
- Override.method_return('Array#uniq', 'self'),
69
- Override.method_return('Array#zip', 'Array, nil'),
70
-
71
- Override.from_comment('BasicObject#==', %(
72
- @param other [BasicObject]
73
- @return [Boolean]
74
- )),
75
- Override.method_return('BasicObject#initialize', 'void'),
76
-
77
- Override.method_return('Class#new', 'self'),
78
- Override.method_return('Class.new', 'Class<Object>'),
79
- Override.method_return('Class#allocate', 'self'),
80
- Override.method_return('Class.allocate', 'Class<Object>'),
81
-
82
- Override.method_return('Enumerable#select', 'self'),
83
-
84
- Override.method_return('File.absolute_path', 'String'),
85
- Override.method_return('File.basename', 'String'),
86
- Override.method_return('File.dirname', 'String'),
87
- Override.method_return('File.extname', 'String'),
88
- Override.method_return('File.join', 'String'),
89
-
90
- Override.from_comment('Float#+', %(
91
- @param y [Numeric]
92
- @return [Numeric]
93
- )),
94
-
95
- Override.from_comment('Hash#[]', %(
96
- @return_value_parameter
97
- )),
98
-
99
- # @todo This override isn't robust enough. It needs to allow for
100
- # parameterized Hash types, e.g., [Hash{Symbol => String}].
101
- Override.from_comment('Hash#[]=', %(
102
- @param_tuple
103
- )),
104
-
105
- Override.from_comment('Integer#+', %(
106
- @param y [Numeric]
107
- @return [Numeric]
108
- )),
109
-
110
- Override.method_return('Kernel#puts', 'nil'),
111
-
112
- # Override.method_return('Module#attr_reader', 'void'),
113
- # Override.method_return('Module#attr_writer', 'void'),
114
- # Override.method_return('Module#attr_accessor', 'void'),
115
-
116
- Override.from_comment('Numeric#+', %(
117
- @param y [Numeric]
118
- @return [Numeric]
119
- )),
120
-
121
- Override.method_return('Object#!', 'Boolean'),
122
- Override.method_return('Object#clone', 'self', delete: [:overload]),
123
- Override.method_return('Object#dup', 'self', delete: [:overload]),
124
- Override.method_return('Object#freeze', 'self', delete: [:overload]),
125
- Override.method_return('Object#inspect', 'String'),
126
- Override.method_return('Object#taint', 'self'),
127
- Override.method_return('Object#to_s', 'String'),
128
- Override.method_return('Object#untaint', 'self'),
129
- Override.from_comment('Object#tap', %(
130
- @return [self]
131
- @yieldparam [self]
132
- )),
133
-
134
- Override.from_comment('STDERR', %(
135
- @type [IO]
136
- )),
137
-
138
- Override.from_comment('STDIN', %(
139
- @type [IO]
140
- )),
141
-
142
- Override.from_comment('STDOUT', %(
143
- @type [IO]
144
- )),
145
-
146
- Override.method_return('String#freeze', 'self'),
147
- Override.method_return('String#split', 'Array<String>'),
148
- Override.method_return('String#lines', 'Array<String>'),
149
- Override.from_comment('String#each_line', %(
150
- @yieldparam [String]
151
- ))
152
- ].concat(
153
- methods_with_yieldparam_subtypes.map do |path|
154
- Override.from_comment(path, %(
155
- @yieldparam_single_parameter
156
- ))
157
- end
158
- )
159
- end
160
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Attribute < BaseMethod
6
- # @return [::Symbol] :reader or :writer
7
- attr_reader :access
8
-
9
- # @param access [::Symbol] :reader or :writer
10
- def initialize access: :reader, **splat
11
- super(**splat)
12
- @access = access
13
- if access == :writer
14
- parameters.push(
15
- Pin::Parameter.new(name: 'value', decl: :arg, closure: self)
16
- )
17
- if return_type.defined?
18
- docstring.add_tag YARD::Tags::Tag.new(:param, '', return_type.to_s.split(', '), 'value')
19
- end
20
- end
21
- end
22
-
23
- def completion_item_kind
24
- Solargraph::LanguageServer::CompletionItemKinds::PROPERTY
25
- end
26
-
27
- def symbol_kind
28
- Solargraph::LanguageServer::SymbolKinds::PROPERTY
29
- end
30
-
31
- def path
32
- @path ||= namespace + (scope == :instance ? '#' : '.') + name
33
- end
34
-
35
- def probe api_map
36
- types = []
37
- varname = "@#{name.gsub(/=$/, '')}"
38
- pins = api_map.get_instance_variable_pins(binder.namespace, binder.scope).select { |iv| iv.name == varname }
39
- pins.each do |pin|
40
- type = pin.typify(api_map)
41
- type = pin.probe(api_map) if type.undefined?
42
- types.push type if type.defined?
43
- end
44
- return ComplexType::UNDEFINED if types.empty?
45
- ComplexType.try_parse(*types.map(&:tag).uniq)
46
- end
47
- end
48
- end
49
- end
@@ -1,141 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- # The base class for method and attribute pins.
6
- #
7
- class BaseMethod < Closure
8
- # @return [::Symbol] :public, :private, or :protected
9
- attr_reader :visibility
10
-
11
- # @return [Parser::AST::Node]
12
- attr_reader :node
13
-
14
- # @param visibility [::Symbol] :public, :protected, or :private
15
- # @param explicit [Boolean]
16
- def initialize visibility: :public, explicit: true, **splat
17
- super(**splat)
18
- @visibility = visibility
19
- @explicit = explicit
20
- end
21
-
22
- def return_type
23
- @return_type ||= generate_complex_type
24
- end
25
-
26
- def path
27
- @path ||= "#{namespace}#{(scope == :instance ? '#' : '.')}#{name}"
28
- end
29
-
30
- def typify api_map
31
- decl = super
32
- return decl unless decl.undefined?
33
- type = see_reference(api_map) || typify_from_super(api_map)
34
- return type.qualify(api_map, namespace) unless type.nil?
35
- name.end_with?('?') ? ComplexType::BOOLEAN : ComplexType::UNDEFINED
36
- end
37
-
38
- # @return [Array<Pin::Parameter>]
39
- def parameters
40
- @parameters ||= []
41
- end
42
-
43
- # @return [Array<String>]
44
- def parameter_names
45
- parameters.map(&:name)
46
- end
47
-
48
- def documentation
49
- if @documentation.nil?
50
- @documentation ||= super || ''
51
- param_tags = docstring.tags(:param)
52
- unless param_tags.nil? or param_tags.empty?
53
- @documentation += "\n\n" unless @documentation.empty?
54
- @documentation += "Params:\n"
55
- lines = []
56
- param_tags.each do |p|
57
- l = "* #{p.name}"
58
- l += " [#{escape_brackets(p.types.join(', '))}]" unless p.types.nil? or p.types.empty?
59
- l += " #{p.text}"
60
- lines.push l
61
- end
62
- @documentation += lines.join("\n")
63
- end
64
- return_tags = docstring.tags(:return)
65
- unless return_tags.empty?
66
- @documentation += "\n\n" unless @documentation.empty?
67
- @documentation += "Returns:\n"
68
- lines = []
69
- return_tags.each do |r|
70
- l = "*"
71
- l += " [#{escape_brackets(r.types.join(', '))}]" unless r.types.nil? or r.types.empty?
72
- l += " #{r.text}"
73
- lines.push l
74
- end
75
- @documentation += lines.join("\n")
76
- end
77
- @documentation += "\n\n" unless @documentation.empty?
78
- @documentation += "Visibility: #{visibility}"
79
- end
80
- @documentation.to_s
81
- end
82
-
83
- def explicit?
84
- @explicit
85
- end
86
-
87
- private
88
-
89
- # @return [ComplexType]
90
- def generate_complex_type
91
- tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
92
- return ComplexType::UNDEFINED if tags.empty?
93
- ComplexType.try_parse *tags
94
- end
95
-
96
- # @param api_map [ApiMap]
97
- # @return [ComplexType, nil]
98
- def see_reference api_map
99
- docstring.ref_tags.each do |ref|
100
- next unless ref.tag_name == 'return' && ref.owner
101
- result = resolve_reference(ref.owner.to_s, api_map)
102
- return result unless result.nil?
103
- end
104
- match = comments.match(/^[ \t]*\(see (.*)\)/m)
105
- return nil if match.nil?
106
- resolve_reference match[1], api_map
107
- end
108
-
109
- # @param api_map [ApiMap]
110
- # @return [ComplexType, nil]
111
- def typify_from_super api_map
112
- stack = api_map.get_method_stack(namespace, name, scope: scope).reject { |pin| pin.path == path }
113
- return nil if stack.empty?
114
- stack.each do |pin|
115
- return pin.return_type unless pin.return_type.undefined?
116
- end
117
- nil
118
- end
119
-
120
- # @param ref [String]
121
- # @param api_map [ApiMap]
122
- # @return [ComplexType]
123
- def resolve_reference ref, api_map
124
- parts = ref.split(/[\.#]/)
125
- if parts.first.empty? || parts.one?
126
- path = "#{namespace}#{ref}"
127
- else
128
- fqns = api_map.qualify(parts.first, namespace)
129
- return ComplexType::UNDEFINED if fqns.nil?
130
- path = fqns + ref[parts.first.length] + parts.last
131
- end
132
- pins = api_map.get_path_pins(path)
133
- pins.each do |pin|
134
- type = pin.typify(api_map)
135
- return type unless type.undefined?
136
- end
137
- nil
138
- end
139
- end
140
- end
141
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- module YardPin
6
- autoload :YardMixin, 'solargraph/pin/yard_pin/yard_mixin'
7
- autoload :Constant, 'solargraph/pin/yard_pin/constant'
8
- autoload :Method, 'solargraph/pin/yard_pin/method'
9
- autoload :Namespace, 'solargraph/pin/yard_pin/namespace'
10
- end
11
- end
12
- end
@@ -1,80 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- module YardPin
6
- class Method < Pin::Method
7
- include YardMixin
8
-
9
- # @param code_object [YARD::CodeObjects::Base]
10
- # @param name [String, nil]
11
- # @param scope [Symbol, nil]
12
- # @param visibility [Symbol, nil]
13
- # @param closure [Solargraph::Pin::Closure, nil]
14
- # @param spec [Gem::Specification]
15
- def initialize code_object, name = nil, scope = nil, visibility = nil, closure = nil, spec = nil
16
- closure ||= Solargraph::Pin::Namespace.new(
17
- name: code_object.namespace.to_s,
18
- gates: [code_object.namespace.to_s]
19
- )
20
- super(
21
- location: object_location(code_object, spec),
22
- closure: closure,
23
- name: name || code_object.name.to_s,
24
- comments: code_object.docstring ? code_object.docstring.all.to_s : '',
25
- scope: scope || code_object.scope,
26
- visibility: visibility || code_object.visibility,
27
- parameters: get_parameters(code_object),
28
- explicit: code_object.is_explicit?
29
- )
30
- end
31
-
32
- private
33
-
34
- # @param code_object [YARD::CodeObjects::Base]
35
- # @return [Array<Solargraph::Pin::Parameter>]
36
- def get_parameters code_object
37
- return [] unless code_object.is_a?(YARD::CodeObjects::MethodObject)
38
- # HACK: Skip `nil` and `self` parameters that are sometimes emitted
39
- # for methods defined in C
40
- # See https://github.com/castwide/solargraph/issues/345
41
- code_object.parameters.select { |a| a[0] && a[0] != 'self' }.map do |a|
42
- Solargraph::Pin::Parameter.new(
43
- location: location,
44
- closure: self,
45
- comments: comments,
46
- name: arg_name(a),
47
- presence: nil,
48
- decl: arg_type(a),
49
- asgn_code: a[1]
50
- )
51
- end
52
- end
53
-
54
- # @param a [Array]
55
- # @return [String]
56
- def arg_name a
57
- a[0].match(/[A-Za-z0-9_]*/)[0]
58
- end
59
-
60
- # @param a [Array]
61
- # @return [Symbol]
62
- def arg_type a
63
- if a[0].start_with?('**')
64
- :kwrestarg
65
- elsif a[0].start_with?('*')
66
- :restarg
67
- elsif a[0].start_with?('&')
68
- :blockarg
69
- elsif a[1]
70
- :optarg
71
- elsif a[0].end_with?(':')
72
- a[1] ? :kwarg : :kwoptarg
73
- else
74
- :arg
75
- end
76
- end
77
- end
78
- end
79
- end
80
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- module YardPin
6
- module YardMixin
7
- private
8
-
9
- # @param code_object [YARD::CodeObjects::Base]
10
- # @param spec [Gem::Specification]
11
- # @return [Solargraph::Location, nil]
12
- def object_location code_object, spec
13
- return nil if spec.nil? || code_object.nil? || code_object.file.nil? || code_object.line.nil?
14
- file = File.join(spec.full_gem_path, code_object.file)
15
- Solargraph::Location.new(file, Solargraph::Range.from_to(code_object.line - 1, 0, code_object.line - 1, 0))
16
- end
17
- end
18
- end
19
- end
20
- end