solargraph 0.39.0 → 0.40.0

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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -7
  3. data/CHANGELOG.md +984 -0
  4. data/Rakefile +12 -1
  5. data/SPONSORS.md +6 -0
  6. data/lib/.rubocop.yml +21 -0
  7. data/lib/solargraph/api_map/cache.rb +4 -0
  8. data/lib/solargraph/api_map/store.rb +35 -51
  9. data/lib/solargraph/api_map.rb +94 -87
  10. data/lib/solargraph/{bundle.rb → bench.rb} +6 -2
  11. data/lib/solargraph/compat.rb +23 -0
  12. data/lib/solargraph/complex_type.rb +2 -2
  13. data/lib/solargraph/convention/base.rb +16 -8
  14. data/lib/solargraph/convention/gemfile.rb +2 -5
  15. data/lib/solargraph/convention/gemspec.rb +3 -6
  16. data/lib/solargraph/convention/rspec.rb +3 -6
  17. data/lib/solargraph/convention.rb +14 -5
  18. data/lib/solargraph/diagnostics/rubocop.rb +2 -1
  19. data/lib/solargraph/diagnostics/rubocop_helpers.rb +4 -1
  20. data/lib/solargraph/documentor.rb +4 -0
  21. data/lib/solargraph/environ.rb +11 -6
  22. data/lib/solargraph/language_server/host.rb +1 -1
  23. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +6 -1
  24. data/lib/solargraph/language_server/message/text_document/definition.rb +1 -1
  25. data/lib/solargraph/language_server/message/text_document/formatting.rb +7 -3
  26. data/lib/solargraph/language_server/uri_helpers.rb +23 -3
  27. data/lib/solargraph/library.rb +22 -8
  28. data/lib/solargraph/parser/legacy/class_methods.rb +4 -0
  29. data/lib/solargraph/parser/legacy/node_chainer.rb +10 -7
  30. data/lib/solargraph/parser/legacy/node_methods.rb +16 -3
  31. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +1 -1
  32. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +48 -23
  33. data/lib/solargraph/parser/node_processor/base.rb +3 -0
  34. data/lib/solargraph/parser/rubyvm/class_methods.rb +6 -2
  35. data/lib/solargraph/parser/rubyvm/node_chainer.rb +11 -9
  36. data/lib/solargraph/parser/rubyvm/node_methods.rb +6 -1
  37. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +35 -11
  38. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +1 -1
  39. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +6 -1
  40. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +6 -1
  41. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +52 -67
  42. data/lib/solargraph/parser/rubyvm/node_processors.rb +2 -0
  43. data/lib/solargraph/pin/base.rb +2 -2
  44. data/lib/solargraph/pin/base_variable.rb +1 -1
  45. data/lib/solargraph/pin/block.rb +28 -14
  46. data/lib/solargraph/pin/closure.rb +1 -1
  47. data/lib/solargraph/pin/common.rb +1 -1
  48. data/lib/solargraph/pin/constant.rb +1 -1
  49. data/lib/solargraph/pin/conversions.rb +3 -4
  50. data/lib/solargraph/pin/documenting.rb +6 -11
  51. data/lib/solargraph/pin/local_variable.rb +1 -1
  52. data/lib/solargraph/pin/method.rb +143 -9
  53. data/lib/solargraph/pin/method_alias.rb +2 -2
  54. data/lib/solargraph/pin/namespace.rb +1 -1
  55. data/lib/solargraph/pin/parameter.rb +2 -2
  56. data/lib/solargraph/pin/proxy_type.rb +1 -1
  57. data/lib/solargraph/pin.rb +0 -3
  58. data/lib/solargraph/position.rb +2 -14
  59. data/lib/solargraph/shell.rb +2 -1
  60. data/lib/solargraph/source/chain/call.rb +9 -0
  61. data/lib/solargraph/source/chain/head.rb +14 -8
  62. data/lib/solargraph/source/chain/z_super.rb +30 -0
  63. data/lib/solargraph/source/chain.rb +19 -36
  64. data/lib/solargraph/source/source_chainer.rb +2 -1
  65. data/lib/solargraph/source.rb +24 -9
  66. data/lib/solargraph/source_map/clip.rb +78 -44
  67. data/lib/solargraph/source_map/mapper.rb +41 -21
  68. data/lib/solargraph/source_map.rb +20 -2
  69. data/lib/solargraph/type_checker/param_def.rb +1 -1
  70. data/lib/solargraph/type_checker.rb +61 -42
  71. data/lib/solargraph/version.rb +1 -1
  72. data/lib/solargraph/views/_name_type_tag.erb +1 -1
  73. data/lib/solargraph/workspace.rb +1 -1
  74. data/lib/solargraph/yard_map/core_fills.rb +185 -0
  75. data/lib/solargraph/yard_map/helpers.rb +16 -0
  76. data/lib/solargraph/{pin/yard_pin/constant.rb → yard_map/mapper/to_constant.rb} +6 -6
  77. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -0
  78. data/lib/solargraph/{pin/yard_pin/namespace.rb → yard_map/mapper/to_namespace.rb} +6 -6
  79. data/lib/solargraph/yard_map/mapper.rb +17 -8
  80. data/lib/solargraph/yard_map/rdoc_to_yard.rb +26 -15
  81. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -0
  82. data/lib/solargraph/yard_map/to_method.rb +79 -0
  83. data/lib/solargraph/yard_map.rb +140 -92
  84. data/lib/solargraph.rb +5 -4
  85. data/solargraph.gemspec +5 -5
  86. data/yardoc/2.2.2.tar.gz +0 -0
  87. metadata +29 -41
  88. data/.rubocop.yml +0 -6
  89. data/lib/solargraph/core_fills.rb +0 -159
  90. data/lib/solargraph/pin/attribute.rb +0 -49
  91. data/lib/solargraph/pin/base_method.rb +0 -141
  92. data/lib/solargraph/pin/yard_pin/method.rb +0 -65
  93. data/lib/solargraph/pin/yard_pin/yard_mixin.rb +0 -26
  94. data/lib/solargraph/pin/yard_pin.rb +0 -12
  95. data/lib/solargraph/stdlib_fills.rb +0 -32
  96. data/travis-bundler.rb +0 -11
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.39.0
4
+ version: 0.40.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fred Snyder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-26 00:00:00.000000000 Z
11
+ date: 2020-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backport
@@ -81,45 +81,33 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.5'
83
83
  - !ruby/object:Gem::Dependency
84
- name: maruku
84
+ name: kramdown
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.7'
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- version: 0.7.3
89
+ version: '2.3'
93
90
  type: :runtime
94
91
  prerelease: false
95
92
  version_requirements: !ruby/object:Gem::Requirement
96
93
  requirements:
97
94
  - - "~>"
98
95
  - !ruby/object:Gem::Version
99
- version: '0.7'
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: 0.7.3
96
+ version: '2.3'
103
97
  - !ruby/object:Gem::Dependency
104
- name: nokogiri
98
+ name: kramdown-parser-gfm
105
99
  requirement: !ruby/object:Gem::Requirement
106
100
  requirements:
107
101
  - - "~>"
108
102
  - !ruby/object:Gem::Version
109
- version: '1.9'
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- version: 1.9.1
103
+ version: '1.1'
113
104
  type: :runtime
114
105
  prerelease: false
115
106
  version_requirements: !ruby/object:Gem::Requirement
116
107
  requirements:
117
108
  - - "~>"
118
109
  - !ruby/object:Gem::Version
119
- version: '1.9'
120
- - - ">="
121
- - !ruby/object:Gem::Version
122
- version: 1.9.1
110
+ version: '1.1'
123
111
  - !ruby/object:Gem::Dependency
124
112
  name: parser
125
113
  requirement: !ruby/object:Gem::Requirement
@@ -138,34 +126,34 @@ dependencies:
138
126
  name: reverse_markdown
139
127
  requirement: !ruby/object:Gem::Requirement
140
128
  requirements:
141
- - - "~>"
142
- - !ruby/object:Gem::Version
143
- version: '1.0'
144
129
  - - ">="
145
130
  - !ruby/object:Gem::Version
146
131
  version: 1.0.5
132
+ - - "<"
133
+ - !ruby/object:Gem::Version
134
+ version: '3'
147
135
  type: :runtime
148
136
  prerelease: false
149
137
  version_requirements: !ruby/object:Gem::Requirement
150
138
  requirements:
151
- - - "~>"
152
- - !ruby/object:Gem::Version
153
- version: '1.0'
154
139
  - - ">="
155
140
  - !ruby/object:Gem::Version
156
141
  version: 1.0.5
142
+ - - "<"
143
+ - !ruby/object:Gem::Version
144
+ version: '3'
157
145
  - !ruby/object:Gem::Dependency
158
146
  name: rubocop
159
147
  requirement: !ruby/object:Gem::Requirement
160
148
  requirements:
161
- - - "~>"
149
+ - - ">="
162
150
  - !ruby/object:Gem::Version
163
151
  version: '0.52'
164
152
  type: :runtime
165
153
  prerelease: false
166
154
  version_requirements: !ruby/object:Gem::Requirement
167
155
  requirements:
168
- - - "~>"
156
+ - - ">="
169
157
  - !ruby/object:Gem::Version
170
158
  version: '0.52'
171
159
  - !ruby/object:Gem::Dependency
@@ -301,22 +289,24 @@ extra_rdoc_files: []
301
289
  files:
302
290
  - ".gitignore"
303
291
  - ".rspec"
304
- - ".rubocop.yml"
305
292
  - ".travis.yml"
306
293
  - ".yardopts"
294
+ - CHANGELOG.md
307
295
  - Gemfile
308
296
  - LICENSE
309
297
  - README.md
310
298
  - Rakefile
311
299
  - SPONSORS.md
312
300
  - bin/solargraph
301
+ - lib/.rubocop.yml
313
302
  - lib/solargraph.rb
314
303
  - lib/solargraph/api_map.rb
315
304
  - lib/solargraph/api_map/bundler_methods.rb
316
305
  - lib/solargraph/api_map/cache.rb
317
306
  - lib/solargraph/api_map/source_to_yard.rb
318
307
  - lib/solargraph/api_map/store.rb
319
- - lib/solargraph/bundle.rb
308
+ - lib/solargraph/bench.rb
309
+ - lib/solargraph/compat.rb
320
310
  - lib/solargraph/complex_type.rb
321
311
  - lib/solargraph/complex_type/type_methods.rb
322
312
  - lib/solargraph/complex_type/unique_type.rb
@@ -329,7 +319,6 @@ files:
329
319
  - lib/solargraph/converters/dl.rb
330
320
  - lib/solargraph/converters/dt.rb
331
321
  - lib/solargraph/converters/misc.rb
332
- - lib/solargraph/core_fills.rb
333
322
  - lib/solargraph/diagnostics.rb
334
323
  - lib/solargraph/diagnostics/base.rb
335
324
  - lib/solargraph/diagnostics/require_not_found.rb
@@ -459,9 +448,7 @@ files:
459
448
  - lib/solargraph/parser/rubyvm/node_processors/sym_node.rb
460
449
  - lib/solargraph/parser/snippet.rb
461
450
  - lib/solargraph/pin.rb
462
- - lib/solargraph/pin/attribute.rb
463
451
  - lib/solargraph/pin/base.rb
464
- - lib/solargraph/pin/base_method.rb
465
452
  - lib/solargraph/pin/base_variable.rb
466
453
  - lib/solargraph/pin/block.rb
467
454
  - lib/solargraph/pin/class_variable.rb
@@ -491,11 +478,6 @@ files:
491
478
  - lib/solargraph/pin/reference/superclass.rb
492
479
  - lib/solargraph/pin/singleton.rb
493
480
  - lib/solargraph/pin/symbol.rb
494
- - lib/solargraph/pin/yard_pin.rb
495
- - lib/solargraph/pin/yard_pin/constant.rb
496
- - lib/solargraph/pin/yard_pin/method.rb
497
- - lib/solargraph/pin/yard_pin/namespace.rb
498
- - lib/solargraph/pin/yard_pin/yard_mixin.rb
499
481
  - lib/solargraph/position.rb
500
482
  - lib/solargraph/range.rb
501
483
  - lib/solargraph/server_methods.rb
@@ -513,6 +495,7 @@ files:
513
495
  - lib/solargraph/source/chain/literal.rb
514
496
  - lib/solargraph/source/chain/or.rb
515
497
  - lib/solargraph/source/chain/variable.rb
498
+ - lib/solargraph/source/chain/z_super.rb
516
499
  - lib/solargraph/source/change.rb
517
500
  - lib/solargraph/source/cursor.rb
518
501
  - lib/solargraph/source/encoding_fixes.rb
@@ -522,7 +505,6 @@ files:
522
505
  - lib/solargraph/source_map/clip.rb
523
506
  - lib/solargraph/source_map/completion.rb
524
507
  - lib/solargraph/source_map/mapper.rb
525
- - lib/solargraph/stdlib_fills.rb
526
508
  - lib/solargraph/type_checker.rb
527
509
  - lib/solargraph/type_checker/checks.rb
528
510
  - lib/solargraph/type_checker/param_def.rb
@@ -541,12 +523,18 @@ files:
541
523
  - lib/solargraph/yard_map.rb
542
524
  - lib/solargraph/yard_map/cache.rb
543
525
  - lib/solargraph/yard_map/core_docs.rb
526
+ - lib/solargraph/yard_map/core_fills.rb
544
527
  - lib/solargraph/yard_map/core_gen.rb
528
+ - lib/solargraph/yard_map/helpers.rb
545
529
  - lib/solargraph/yard_map/mapper.rb
530
+ - lib/solargraph/yard_map/mapper/to_constant.rb
531
+ - lib/solargraph/yard_map/mapper/to_method.rb
532
+ - lib/solargraph/yard_map/mapper/to_namespace.rb
546
533
  - lib/solargraph/yard_map/rdoc_to_yard.rb
534
+ - lib/solargraph/yard_map/stdlib_fills.rb
535
+ - lib/solargraph/yard_map/to_method.rb
547
536
  - lib/yard-solargraph.rb
548
537
  - solargraph.gemspec
549
- - travis-bundler.rb
550
538
  - yardoc/2.2.2.tar.gz
551
539
  homepage: http://solargraph.org
552
540
  licenses:
@@ -560,7 +548,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
560
548
  requirements:
561
549
  - - ">="
562
550
  - !ruby/object:Gem::Version
563
- version: '2.1'
551
+ version: '2.4'
564
552
  required_rubygems_version: !ruby/object:Gem::Requirement
565
553
  requirements:
566
554
  - - ">="
data/.rubocop.yml DELETED
@@ -1,6 +0,0 @@
1
- Layout/EndOfLine:
2
- EnforcedStyle: lf
3
- Style/MethodDefParentheses:
4
- Enabled: false
5
- Layout/EmptyLineAfterGuardClause:
6
- Enabled: false
@@ -1,159 +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
-
70
- Override.from_comment('BasicObject#==', %(
71
- @param other [BasicObject]
72
- @return [Boolean]
73
- )),
74
- Override.method_return('BasicObject#initialize', 'void'),
75
-
76
- Override.method_return('Class#new', 'self'),
77
- Override.method_return('Class.new', 'Class<Object>'),
78
- Override.method_return('Class#allocate', 'self'),
79
- Override.method_return('Class.allocate', 'Class<Object>'),
80
-
81
- Override.method_return('Enumerable#select', 'self'),
82
-
83
- Override.method_return('File.absolute_path', 'String'),
84
- Override.method_return('File.basename', 'String'),
85
- Override.method_return('File.dirname', 'String'),
86
- Override.method_return('File.extname', 'String'),
87
- Override.method_return('File.join', 'String'),
88
-
89
- Override.from_comment('Float#+', %(
90
- @param y [Numeric]
91
- @return [Numeric]
92
- )),
93
-
94
- Override.from_comment('Hash#[]', %(
95
- @return_value_parameter
96
- )),
97
-
98
- # @todo This override isn't robust enough. It needs to allow for
99
- # parameterized Hash types, e.g., [Hash{Symbol => String}].
100
- Override.from_comment('Hash#[]=', %(
101
- @param_tuple
102
- )),
103
-
104
- Override.from_comment('Integer#+', %(
105
- @param y [Numeric]
106
- @return [Numeric]
107
- )),
108
-
109
- Override.method_return('Kernel#puts', 'nil'),
110
-
111
- # Override.method_return('Module#attr_reader', 'void'),
112
- # Override.method_return('Module#attr_writer', 'void'),
113
- # Override.method_return('Module#attr_accessor', 'void'),
114
-
115
- Override.from_comment('Numeric#+', %(
116
- @param y [Numeric]
117
- @return [Numeric]
118
- )),
119
-
120
- Override.method_return('Object#!', 'Boolean'),
121
- Override.method_return('Object#clone', 'self', delete: [:overload]),
122
- Override.method_return('Object#dup', 'self', delete: [:overload]),
123
- Override.method_return('Object#freeze', 'self', delete: [:overload]),
124
- Override.method_return('Object#inspect', 'String'),
125
- Override.method_return('Object#taint', 'self'),
126
- Override.method_return('Object#to_s', 'String'),
127
- Override.method_return('Object#untaint', 'self'),
128
- Override.from_comment('Object#tap', %(
129
- @return [self]
130
- @yieldparam [self]
131
- )),
132
-
133
- Override.from_comment('STDERR', %(
134
- @type [IO]
135
- )),
136
-
137
- Override.from_comment('STDIN', %(
138
- @type [IO]
139
- )),
140
-
141
- Override.from_comment('STDOUT', %(
142
- @type [IO]
143
- )),
144
-
145
- Override.method_return('String#freeze', 'self'),
146
- Override.method_return('String#split', 'Array<String>'),
147
- Override.method_return('String#lines', 'Array<String>'),
148
- Override.from_comment('String#each_line', %(
149
- @yieldparam [String]
150
- ))
151
- ].concat(
152
- methods_with_yieldparam_subtypes.map do |path|
153
- Override.from_comment(path, %(
154
- @yieldparam_single_parameter
155
- ))
156
- end
157
- )
158
- end
159
- 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,65 +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
- def initialize code_object, name = nil, scope = nil, visibility = nil, closure = nil, spec = nil
10
- closure ||= Solargraph::Pin::Namespace.new(
11
- name: code_object.namespace.to_s,
12
- gates: [code_object.namespace.to_s]
13
- )
14
- super(
15
- location: object_location(code_object, spec),
16
- closure: closure,
17
- name: name || code_object.name.to_s,
18
- comments: code_object.docstring ? code_object.docstring.all.to_s : '',
19
- scope: scope || code_object.scope,
20
- visibility: visibility || code_object.visibility,
21
- parameters: get_parameters(code_object),
22
- explicit: code_object.is_explicit?
23
- )
24
- end
25
-
26
- private
27
-
28
- def get_parameters code_object
29
- return [] unless code_object.is_a?(YARD::CodeObjects::MethodObject)
30
- code_object.parameters.map do |a|
31
- Solargraph::Pin::Parameter.new(
32
- location: location,
33
- closure: self,
34
- comments: comments,
35
- name: arg_name(a),
36
- presence: nil,
37
- decl: arg_type(a),
38
- asgn_code: a[1]
39
- )
40
- end
41
- end
42
-
43
- def arg_name a
44
- a[0].match(/[A-Za-z0-9_]*/)[0]
45
- end
46
-
47
- def arg_type a
48
- if a[0].start_with?('**')
49
- :kwrestarg
50
- elsif a[0].start_with?('*')
51
- :restarg
52
- elsif a[0].start_with?('&')
53
- :blockarg
54
- elsif a[1]
55
- :optarg
56
- elsif a[0].end_with?(':')
57
- a[1] ? :kwarg : :kwoptarg
58
- else
59
- :arg
60
- end
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- module YardPin
6
- module YardMixin
7
- attr_reader :code_object
8
-
9
- attr_reader :spec
10
-
11
- attr_reader :location
12
-
13
- @@gate_cache ||= {}
14
-
15
- private
16
-
17
- # @return [Solargraph::Location, nil]
18
- def object_location code_object, spec
19
- return nil if spec.nil? || code_object.nil? || code_object.file.nil? || code_object.line.nil?
20
- file = File.join(spec.full_gem_path, code_object.file)
21
- Solargraph::Location.new(file, Solargraph::Range.from_to(code_object.line - 1, 0, code_object.line - 1, 0))
22
- end
23
- end
24
- end
25
- end
26
- 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