solargraph 0.32.5 → 0.33.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.md +2 -11
  4. data/lib/solargraph.rb +1 -2
  5. data/lib/solargraph/api_map.rb +93 -63
  6. data/lib/solargraph/api_map/cache.rb +16 -1
  7. data/lib/solargraph/api_map/source_to_yard.rb +16 -7
  8. data/lib/solargraph/api_map/store.rb +55 -12
  9. data/lib/solargraph/complex_type.rb +58 -14
  10. data/lib/solargraph/complex_type/type_methods.rb +2 -2
  11. data/lib/solargraph/complex_type/unique_type.rb +33 -4
  12. data/lib/solargraph/core_fills.rb +40 -12
  13. data/lib/solargraph/diagnostics.rb +4 -3
  14. data/lib/solargraph/diagnostics/base.rb +6 -0
  15. data/lib/solargraph/diagnostics/require_not_found.rb +17 -10
  16. data/lib/solargraph/diagnostics/rubocop_helpers.rb +2 -0
  17. data/lib/solargraph/diagnostics/type_check.rb +51 -0
  18. data/lib/solargraph/diagnostics/update_errors.rb +1 -0
  19. data/lib/solargraph/language_server/host.rb +55 -25
  20. data/lib/solargraph/language_server/host/diagnoser.rb +1 -2
  21. data/lib/solargraph/language_server/host/dispatch.rb +4 -8
  22. data/lib/solargraph/language_server/host/sources.rb +1 -1
  23. data/lib/solargraph/language_server/message.rb +1 -0
  24. data/lib/solargraph/language_server/message/completion_item/resolve.rb +4 -2
  25. data/lib/solargraph/language_server/message/initialize.rb +9 -0
  26. data/lib/solargraph/language_server/message/initialized.rb +1 -0
  27. data/lib/solargraph/language_server/message/text_document.rb +1 -0
  28. data/lib/solargraph/language_server/message/text_document/code_action.rb +15 -0
  29. data/lib/solargraph/language_server/message/text_document/completion.rb +1 -1
  30. data/lib/solargraph/language_server/message/text_document/definition.rb +25 -5
  31. data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
  32. data/lib/solargraph/language_server/message/text_document/signature_help.rb +4 -0
  33. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +8 -4
  34. data/lib/solargraph/language_server/transport/adapter.rb +12 -15
  35. data/lib/solargraph/library.rb +23 -6
  36. data/lib/solargraph/location.rb +4 -0
  37. data/lib/solargraph/pin.rb +7 -3
  38. data/lib/solargraph/pin/attribute.rb +14 -13
  39. data/lib/solargraph/pin/base.rb +56 -43
  40. data/lib/solargraph/pin/base_method.rb +41 -18
  41. data/lib/solargraph/pin/base_variable.rb +17 -15
  42. data/lib/solargraph/pin/block.rb +22 -4
  43. data/lib/solargraph/pin/closure.rb +28 -0
  44. data/lib/solargraph/pin/common.rb +59 -0
  45. data/lib/solargraph/pin/constant.rb +4 -4
  46. data/lib/solargraph/pin/conversions.rb +8 -8
  47. data/lib/solargraph/pin/duck_method.rb +3 -3
  48. data/lib/solargraph/pin/instance_variable.rb +30 -0
  49. data/lib/solargraph/pin/keyword.rb +1 -1
  50. data/lib/solargraph/pin/local_variable.rb +3 -3
  51. data/lib/solargraph/pin/localized.rb +9 -5
  52. data/lib/solargraph/pin/method.rb +26 -40
  53. data/lib/solargraph/pin/method_alias.rb +9 -6
  54. data/lib/solargraph/pin/namespace.rb +33 -10
  55. data/lib/solargraph/pin/parameter.rb +150 -0
  56. data/lib/solargraph/pin/proxy_type.rb +8 -8
  57. data/lib/solargraph/pin/reference.rb +1 -12
  58. data/lib/solargraph/pin/reference/override.rb +18 -0
  59. data/lib/solargraph/pin/reference/require.rb +2 -1
  60. data/lib/solargraph/pin/singleton.rb +9 -0
  61. data/lib/solargraph/pin/symbol.rb +9 -4
  62. data/lib/solargraph/pin/yard_pin/constant.rb +12 -3
  63. data/lib/solargraph/pin/yard_pin/method.rb +18 -6
  64. data/lib/solargraph/pin/yard_pin/namespace.rb +13 -1
  65. data/lib/solargraph/position.rb +1 -1
  66. data/lib/solargraph/range.rb +4 -0
  67. data/lib/solargraph/shell.rb +83 -4
  68. data/lib/solargraph/source.rb +32 -12
  69. data/lib/solargraph/source/chain.rb +48 -28
  70. data/lib/solargraph/source/chain/call.rb +37 -38
  71. data/lib/solargraph/source/chain/constant.rb +1 -1
  72. data/lib/solargraph/source/chain/head.rb +2 -8
  73. data/lib/solargraph/source/chain/instance_variable.rb +1 -1
  74. data/lib/solargraph/source/chain/link.rb +2 -0
  75. data/lib/solargraph/source/cursor.rb +59 -24
  76. data/lib/solargraph/source/node_chainer.rb +0 -2
  77. data/lib/solargraph/source/node_methods.rb +12 -6
  78. data/lib/solargraph/source/source_chainer.rb +38 -44
  79. data/lib/solargraph/source_map.rb +11 -18
  80. data/lib/solargraph/source_map/clip.rb +13 -15
  81. data/lib/solargraph/source_map/mapper.rb +37 -26
  82. data/lib/solargraph/source_map/node_processor.rb +13 -8
  83. data/lib/solargraph/source_map/node_processor/alias_node.rb +8 -8
  84. data/lib/solargraph/source_map/node_processor/args_node.rb +10 -16
  85. data/lib/solargraph/source_map/node_processor/base.rb +47 -4
  86. data/lib/solargraph/source_map/node_processor/block_node.rb +9 -4
  87. data/lib/solargraph/source_map/node_processor/casgn_node.rb +7 -2
  88. data/lib/solargraph/source_map/node_processor/cvasgn_node.rb +8 -3
  89. data/lib/solargraph/source_map/node_processor/def_node.rb +45 -38
  90. data/lib/solargraph/source_map/node_processor/defs_node.rb +16 -6
  91. data/lib/solargraph/source_map/node_processor/gvasgn_node.rb +8 -1
  92. data/lib/solargraph/source_map/node_processor/ivasgn_node.rb +20 -6
  93. data/lib/solargraph/source_map/node_processor/lvasgn_node.rb +10 -4
  94. data/lib/solargraph/source_map/node_processor/namespace_node.rb +18 -12
  95. data/lib/solargraph/source_map/node_processor/orasgn_node.rb +1 -1
  96. data/lib/solargraph/source_map/node_processor/resbody_node.rb +30 -0
  97. data/lib/solargraph/source_map/node_processor/sclass_node.rb +7 -1
  98. data/lib/solargraph/source_map/node_processor/send_node.rb +102 -52
  99. data/lib/solargraph/source_map/node_processor/sym_node.rb +4 -1
  100. data/lib/solargraph/source_map/region.rb +9 -8
  101. data/lib/solargraph/type_checker.rb +282 -0
  102. data/lib/solargraph/type_checker/param_def.rb +47 -0
  103. data/lib/solargraph/type_checker/problem.rb +25 -0
  104. data/lib/solargraph/version.rb +1 -1
  105. data/lib/solargraph/views/environment.erb +1 -1
  106. data/lib/solargraph/workspace.rb +2 -2
  107. data/lib/solargraph/workspace/config.rb +0 -8
  108. data/lib/solargraph/yard_map.rb +25 -69
  109. data/lib/solargraph/yard_map/core_docs.rb +8 -3
  110. data/lib/solargraph/yard_map/core_gen.rb +1 -3
  111. data/lib/solargraph/yard_map/mapper.rb +85 -0
  112. data/lib/yard-solargraph.rb +2 -0
  113. metadata +14 -14
  114. data/lib/solargraph/diagnostics/type_not_defined.rb +0 -108
  115. data/lib/solargraph/live_map.rb +0 -126
  116. data/lib/solargraph/live_map/cache.rb +0 -38
  117. data/lib/solargraph/pin/block_parameter.rb +0 -103
  118. data/lib/solargraph/pin/method_parameter.rb +0 -40
  119. data/lib/solargraph/pin/plugin/method.rb +0 -25
  120. data/lib/solargraph/plugin.rb +0 -8
  121. data/lib/solargraph/plugin/base.rb +0 -41
  122. data/lib/solargraph/plugin/canceler.rb +0 -11
  123. data/lib/solargraph/plugin/process.rb +0 -172
  124. data/lib/solargraph/plugin/runtime.rb +0 -134
  125. data/lib/yard-coregen.rb +0 -16
@@ -8,6 +8,7 @@ module Solargraph
8
8
  autoload :Cache, 'solargraph/yard_map/cache'
9
9
  autoload :CoreDocs, 'solargraph/yard_map/core_docs'
10
10
  autoload :CoreGen, 'solargraph/yard_map/core_gen'
11
+ autoload :Mapper, 'solargraph/yard_map/mapper'
11
12
 
12
13
  CoreDocs.require_minimum
13
14
  @@stdlib_yardoc = CoreDocs.yardoc_stdlib_file
@@ -88,12 +89,8 @@ module Solargraph
88
89
  # @return [Array<Solargraph::Pin::Base>]
89
90
  def core_pins
90
91
  @@core_pins ||= begin
91
- result = []
92
92
  load_yardoc CoreDocs.yardoc_file
93
- YARD::Registry.each do |o|
94
- result.concat generate_pins(o)
95
- end
96
- result
93
+ Mapper.new(YARD::Registry.all).map
97
94
  end
98
95
  end
99
96
 
@@ -103,6 +100,23 @@ module Solargraph
103
100
  pins.select{ |p| p.path == path }.first
104
101
  end
105
102
 
103
+ # Get the location of a file referenced by a require path.
104
+ #
105
+ # @param path [String]
106
+ # @return [Location]
107
+ def require_reference path
108
+ # @type [Gem::Specification]
109
+ spec = Gem::Specification.find_by_path(path) || Gem::Specification.find_by_name(path.split('/').first)
110
+ spec.full_require_paths.each do |rp|
111
+ file = File.join(rp, "#{path}.rb")
112
+ next unless File.file?(file)
113
+ return Solargraph::Location.new(file, Solargraph::Range.from_to(0, 0, 0, 0))
114
+ end
115
+ nil
116
+ rescue Gem::LoadError
117
+ nil
118
+ end
119
+
106
120
  private
107
121
 
108
122
  # @return [YardMap::Cache]
@@ -111,54 +125,16 @@ module Solargraph
111
125
  end
112
126
 
113
127
  # @param ns [YARD::CodeObjects::Namespace]
114
- # @return [Array<Solargraph::Pin::Base>]
128
+ # @return [Array<YARD::CodeObjects::Base>]
115
129
  def recurse_namespace_object ns
116
130
  result = []
117
131
  ns.children.each do |c|
118
- result.concat generate_pins(c)
132
+ result.push c
119
133
  result.concat recurse_namespace_object(c) if c.respond_to?(:children)
120
134
  end
121
135
  result
122
136
  end
123
137
 
124
- # @param code_object [YARD::CodeObjects::Base]
125
- # @return [Solargraph::Pin::Base]
126
- def generate_pins code_object, spec = nil
127
- result = []
128
- location = object_location(code_object, spec)
129
- if code_object.is_a?(YARD::CodeObjects::NamespaceObject)
130
- result.push Solargraph::Pin::YardPin::Namespace.new(code_object, location)
131
- if code_object.is_a?(YARD::CodeObjects::ClassObject) and !code_object.superclass.nil?
132
- # @todo This method of superclass detection is a bit of a hack. If
133
- # the superclass is a Proxy, it is assumed to be undefined in its
134
- # yardoc and converted to a fully qualified namespace.
135
- if code_object.superclass.is_a?(YARD::CodeObjects::Proxy)
136
- superclass = "::#{code_object.superclass}"
137
- else
138
- superclass = code_object.superclass.to_s
139
- end
140
- result.push Solargraph::Pin::Reference::Superclass.new(location, code_object.path, superclass)
141
- end
142
- code_object.class_mixins.each do |m|
143
- result.push Solargraph::Pin::Reference::Extend.new(location, code_object.path, m.path)
144
- end
145
- code_object.instance_mixins.each do |m|
146
- result.push Solargraph::Pin::Reference::Include.new(location, code_object.path, m.path)
147
- end
148
- elsif code_object.is_a?(YARD::CodeObjects::MethodObject)
149
- if code_object.name == :initialize && code_object.scope == :instance
150
- # @todo Check the visibility of <Class>.new
151
- result.push Solargraph::Pin::YardPin::Method.new(code_object, location, 'new', :class, :public)
152
- result.push Solargraph::Pin::YardPin::Method.new(code_object, location, 'initialize', :instance, :private)
153
- else
154
- result.push Solargraph::Pin::YardPin::Method.new(code_object, location)
155
- end
156
- elsif code_object.is_a?(YARD::CodeObjects::ConstantObject)
157
- result.push Solargraph::Pin::YardPin::Constant.new(code_object, location)
158
- end
159
- result
160
- end
161
-
162
138
  # @return [void]
163
139
  def process_requires
164
140
  pins.clear
@@ -222,8 +198,9 @@ module Solargraph
222
198
  objects.each do |ns|
223
199
  next if done.include?(ns.path)
224
200
  done.push ns.path
225
- result.concat generate_pins(ns)
226
- result.concat recurse_namespace_object(ns)
201
+ all = [ns]
202
+ all.concat recurse_namespace_object(ns)
203
+ result.concat Mapper.new(all).map
227
204
  end
228
205
  result.delete_if(&:nil?)
229
206
  cache.set_path_pins(r, result) unless result.empty?
@@ -270,29 +247,8 @@ module Solargraph
270
247
  Solargraph::Logging.logger.warn "Yardoc at #{y} is too large to process (#{size} bytes)"
271
248
  return []
272
249
  end
273
- result = []
274
250
  load_yardoc y
275
- YARD::Registry.each do |o|
276
- result.concat generate_pins(o, spec)
277
- end
278
- result
279
- end
280
-
281
- # @param obj [YARD::CodeObjects::Base]
282
- # @return [Solargraph::Location]
283
- def object_location obj, spec = nil
284
- @object_file_cache ||= {}
285
- return nil if spec.nil? || obj.file.nil? || obj.line.nil?
286
- file = nil
287
- if @object_file_cache.key?(obj.file)
288
- file = @object_file_cache[obj.file]
289
- else
290
- tmp = File.join(spec.full_gem_path, obj.file)
291
- file = tmp if File.exist?(tmp)
292
- @object_file_cache[obj.file] = file
293
- end
294
- return nil if file.nil?
295
- Solargraph::Location.new(file, Solargraph::Range.from_to(obj.line - 1, 0, obj.line - 1, 0))
251
+ Mapper.new(YARD::Registry.all, spec).map
296
252
  end
297
253
  end
298
254
  end
@@ -122,10 +122,15 @@ module Solargraph
122
122
  def download version
123
123
  FileUtils.mkdir_p cache_dir
124
124
  uri = URI.parse("#{SOURCE}/#{version}.tar.gz")
125
+ # @type [Net::HTTPResponse]
125
126
  response = Net::HTTP.get_response(uri)
126
- zipfile = File.join(cache_dir, "#{version}.tar.gz")
127
- File.binwrite zipfile, response.body
128
- install_archive zipfile
127
+ if response.code == '404'
128
+ raise ArgumentError, "Version #{version} is not available from #{SOURCE}"
129
+ else
130
+ zipfile = File.join(cache_dir, "#{version}.tar.gz")
131
+ File.binwrite zipfile, response.body
132
+ install_archive zipfile
133
+ end
129
134
  end
130
135
 
131
136
  # Reset the core documentation cache to the minimum requirement.
@@ -19,12 +19,10 @@ module Solargraph
19
19
  path_name = Pathname.new(Dir.pwd).join(dest_dir).to_s
20
20
  FileUtils.mkdir_p path_name
21
21
  Dir.chdir(ruby_dir) do
22
- `yardoc --plugin coregen -b "#{File.join(path_name, 'yardoc')}" -n *.c`
22
+ `yardoc -b "#{File.join(path_name, 'yardoc')}" -n *.c`
23
23
  raise 'An error occurred generating the core yardoc.' unless $?.success?
24
- # YARD::CLI::Yardoc.run('--plugin', 'coregen', '-b', "#{File.join(path_name, 'yardoc')}", '-n', File.join(ruby_dir, '*.c'))
25
24
  `yardoc -b "#{File.join(path_name, 'yardoc-stdlib')}" -n lib ext`
26
25
  raise 'An error occurred generating the stdlib yardoc.' unless $?.success?
27
- # YARD::CLI::Yardoc.run('-b', "#{File.join(path_name, 'yardoc-stdlib')}", '-n', File.join(ruby_dir, 'lib', '**', '*.rb'), File.join(ruby_dir, 'ext', '**', '*.c'), File.join(ruby_dir, 'ext', '**', '*.rb'))
28
26
  end
29
27
  end
30
28
 
@@ -0,0 +1,85 @@
1
+ module Solargraph
2
+ class YardMap
3
+ class Mapper
4
+ # @param code_objects [Array<YARD::CodeObject::Base>]
5
+ # @param spec [Gem::Specification]
6
+ def initialize code_objects, spec = nil
7
+ @code_objects = code_objects
8
+ @spec = spec
9
+ @pins = []
10
+ @namespace_pins = {}
11
+ end
12
+
13
+ # @return [Array<Pin::Base>]
14
+ def map
15
+ @code_objects.each do |co|
16
+ @pins.concat generate_pins co
17
+ end
18
+ @pins
19
+ end
20
+
21
+ # @param code_object [YARD::CodeObjects::Base]
22
+ # @return [Array<Pin::Base>]
23
+ def generate_pins code_object
24
+ result = []
25
+ location = object_location(code_object, @spec)
26
+ if code_object.is_a?(YARD::CodeObjects::NamespaceObject)
27
+ nspin = Solargraph::Pin::YardPin::Namespace.new(code_object, location)
28
+ @namespace_pins[code_object.path] = nspin
29
+ result.push nspin
30
+ if code_object.is_a?(YARD::CodeObjects::ClassObject) and !code_object.superclass.nil?
31
+ # This method of superclass detection is a bit of a hack. If
32
+ # the superclass is a Proxy, it is assumed to be undefined in its
33
+ # yardoc and converted to a fully qualified namespace.
34
+ if code_object.superclass.is_a?(YARD::CodeObjects::Proxy)
35
+ superclass = "::#{code_object.superclass}"
36
+ else
37
+ superclass = code_object.superclass.to_s
38
+ end
39
+ result.push Solargraph::Pin::Reference::Superclass.new(location: location, name: superclass, closure: nspin)
40
+ end
41
+ code_object.class_mixins.each do |m|
42
+ result.push Solargraph::Pin::Reference::Extend.new(location: location, closure: nspin, name: m.path)
43
+ end
44
+ code_object.instance_mixins.each do |m|
45
+ result.push Solargraph::Pin::Reference::Include.new(
46
+ location: location,
47
+ closure: nspin, # @todo Fix this
48
+ name: m.path
49
+ )
50
+ end
51
+ elsif code_object.is_a?(YARD::CodeObjects::MethodObject)
52
+ closure = @namespace_pins[code_object.namespace.to_s]
53
+ if code_object.name == :initialize && code_object.scope == :instance
54
+ # @todo Check the visibility of <Class>.new
55
+ result.push Solargraph::Pin::YardPin::Method.new(code_object, location, 'new', :class, :public, closure)
56
+ result.push Solargraph::Pin::YardPin::Method.new(code_object, location, 'initialize', :instance, :private, closure)
57
+ else
58
+ result.push Solargraph::Pin::YardPin::Method.new(code_object, location, nil, nil, nil, closure)
59
+ end
60
+ elsif code_object.is_a?(YARD::CodeObjects::ConstantObject)
61
+ closure = @namespace_pins[code_object.namespace]
62
+ result.push Solargraph::Pin::YardPin::Constant.new(code_object, location, closure)
63
+ end
64
+ result
65
+ end
66
+
67
+ # @param obj [YARD::CodeObjects::Base]
68
+ # @return [Solargraph::Location, nil]
69
+ def object_location obj, spec = nil
70
+ @object_file_cache ||= {}
71
+ return nil if spec.nil? || obj.file.nil? || obj.line.nil?
72
+ file = nil
73
+ if @object_file_cache.key?(obj.file)
74
+ file = @object_file_cache[obj.file]
75
+ else
76
+ tmp = File.join(spec.full_gem_path, obj.file)
77
+ file = tmp if File.exist?(tmp)
78
+ @object_file_cache[obj.file] = file
79
+ end
80
+ return nil if file.nil?
81
+ Solargraph::Location.new(file, Solargraph::Range.from_to(obj.line - 1, 0, obj.line - 1, 0))
82
+ end
83
+ end
84
+ end
85
+ end
@@ -16,3 +16,5 @@ YARD::Tags::Library.define_tag("Yieldself", :yieldself, :with_types)
16
16
  YARD::Tags::Library.define_tag("Yieldpublic", :yieldpublic, :with_types)
17
17
  # Define a @!domain directive for documenting DSLs
18
18
  YARD::Tags::Library.define_directive("domain", :with_types, Solargraph::DomainDirective)
19
+ # Define an @!override directive for overriding method tags
20
+ YARD::Tags::Library.define_directive("override", :with_name, Solargraph::DomainDirective)
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.32.5
4
+ version: 0.33.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: 2019-05-31 00:00:00.000000000 Z
11
+ date: 2019-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backport
@@ -269,7 +269,7 @@ files:
269
269
  - lib/solargraph/diagnostics/rubocop.rb
270
270
  - lib/solargraph/diagnostics/rubocop_helpers.rb
271
271
  - lib/solargraph/diagnostics/severities.rb
272
- - lib/solargraph/diagnostics/type_not_defined.rb
272
+ - lib/solargraph/diagnostics/type_check.rb
273
273
  - lib/solargraph/diagnostics/update_errors.rb
274
274
  - lib/solargraph/language_server.rb
275
275
  - lib/solargraph/language_server/completion_item_kinds.rb
@@ -301,6 +301,7 @@ files:
301
301
  - lib/solargraph/language_server/message/shutdown.rb
302
302
  - lib/solargraph/language_server/message/text_document.rb
303
303
  - lib/solargraph/language_server/message/text_document/base.rb
304
+ - lib/solargraph/language_server/message/text_document/code_action.rb
304
305
  - lib/solargraph/language_server/message/text_document/completion.rb
305
306
  - lib/solargraph/language_server/message/text_document/definition.rb
306
307
  - lib/solargraph/language_server/message/text_document/did_change.rb
@@ -329,8 +330,6 @@ files:
329
330
  - lib/solargraph/language_server/transport/data_reader.rb
330
331
  - lib/solargraph/language_server/uri_helpers.rb
331
332
  - lib/solargraph/library.rb
332
- - lib/solargraph/live_map.rb
333
- - lib/solargraph/live_map/cache.rb
334
333
  - lib/solargraph/location.rb
335
334
  - lib/solargraph/logging.rb
336
335
  - lib/solargraph/page.rb
@@ -340,8 +339,9 @@ files:
340
339
  - lib/solargraph/pin/base_method.rb
341
340
  - lib/solargraph/pin/base_variable.rb
342
341
  - lib/solargraph/pin/block.rb
343
- - lib/solargraph/pin/block_parameter.rb
344
342
  - lib/solargraph/pin/class_variable.rb
343
+ - lib/solargraph/pin/closure.rb
344
+ - lib/solargraph/pin/common.rb
345
345
  - lib/solargraph/pin/constant.rb
346
346
  - lib/solargraph/pin/conversions.rb
347
347
  - lib/solargraph/pin/documenting.rb
@@ -353,26 +353,22 @@ files:
353
353
  - lib/solargraph/pin/localized.rb
354
354
  - lib/solargraph/pin/method.rb
355
355
  - lib/solargraph/pin/method_alias.rb
356
- - lib/solargraph/pin/method_parameter.rb
357
356
  - lib/solargraph/pin/namespace.rb
358
- - lib/solargraph/pin/plugin/method.rb
357
+ - lib/solargraph/pin/parameter.rb
359
358
  - lib/solargraph/pin/proxy_type.rb
360
359
  - lib/solargraph/pin/reference.rb
361
360
  - lib/solargraph/pin/reference/extend.rb
362
361
  - lib/solargraph/pin/reference/include.rb
362
+ - lib/solargraph/pin/reference/override.rb
363
363
  - lib/solargraph/pin/reference/require.rb
364
364
  - lib/solargraph/pin/reference/superclass.rb
365
+ - lib/solargraph/pin/singleton.rb
365
366
  - lib/solargraph/pin/symbol.rb
366
367
  - lib/solargraph/pin/yard_pin.rb
367
368
  - lib/solargraph/pin/yard_pin/constant.rb
368
369
  - lib/solargraph/pin/yard_pin/method.rb
369
370
  - lib/solargraph/pin/yard_pin/namespace.rb
370
371
  - lib/solargraph/pin/yard_pin/yard_mixin.rb
371
- - lib/solargraph/plugin.rb
372
- - lib/solargraph/plugin/base.rb
373
- - lib/solargraph/plugin/canceler.rb
374
- - lib/solargraph/plugin/process.rb
375
- - lib/solargraph/plugin/runtime.rb
376
372
  - lib/solargraph/position.rb
377
373
  - lib/solargraph/range.rb
378
374
  - lib/solargraph/server_methods.rb
@@ -415,10 +411,14 @@ files:
415
411
  - lib/solargraph/source_map/node_processor/lvasgn_node.rb
416
412
  - lib/solargraph/source_map/node_processor/namespace_node.rb
417
413
  - lib/solargraph/source_map/node_processor/orasgn_node.rb
414
+ - lib/solargraph/source_map/node_processor/resbody_node.rb
418
415
  - lib/solargraph/source_map/node_processor/sclass_node.rb
419
416
  - lib/solargraph/source_map/node_processor/send_node.rb
420
417
  - lib/solargraph/source_map/node_processor/sym_node.rb
421
418
  - lib/solargraph/source_map/region.rb
419
+ - lib/solargraph/type_checker.rb
420
+ - lib/solargraph/type_checker/param_def.rb
421
+ - lib/solargraph/type_checker/problem.rb
422
422
  - lib/solargraph/version.rb
423
423
  - lib/solargraph/views/_method.erb
424
424
  - lib/solargraph/views/_name_type_tag.erb
@@ -433,7 +433,7 @@ files:
433
433
  - lib/solargraph/yard_map/cache.rb
434
434
  - lib/solargraph/yard_map/core_docs.rb
435
435
  - lib/solargraph/yard_map/core_gen.rb
436
- - lib/yard-coregen.rb
436
+ - lib/solargraph/yard_map/mapper.rb
437
437
  - lib/yard-solargraph.rb
438
438
  - solargraph.gemspec
439
439
  - travis-bundler.rb
@@ -1,108 +0,0 @@
1
- module Solargraph
2
- module Diagnostics
3
- # TypeNotDefined reports methods with undefined return types, untagged
4
- # parameters, and invalid param tags.
5
- #
6
- class TypeNotDefined < Base
7
- def diagnose source, api_map
8
- result = []
9
- api_map.document_symbols(source.filename).each do |pin|
10
- next unless pin.kind == Pin::METHOD or pin.kind == Pin::ATTRIBUTE
11
- result.concat check_return_type(pin, api_map, source)
12
- result.concat check_param_types(pin, api_map, source)
13
- result.concat check_param_tags(pin, api_map, source)
14
- end
15
- result
16
- end
17
-
18
- private
19
-
20
- def check_return_type pin, api_map, source
21
- return [] if (pin.name == 'initialize' && pin.scope == :instance) || (pin.name == 'new' && pin.scope == :class)
22
- result = []
23
- unless defined_return_type?(pin, api_map)
24
- result.push(
25
- range: extract_first_line(pin, source),
26
- severity: Diagnostics::Severities::WARNING,
27
- source: 'Solargraph',
28
- message: "Method `#{pin.name}` has undefined return type."
29
- )
30
- end
31
- result
32
- end
33
-
34
- def check_param_types pin, api_map, source
35
- return [] if pin.name == 'new' and pin.scope == :class
36
- result = []
37
- pin.parameter_names.each do |par|
38
- next if defined_param_type?(pin, par, api_map)
39
- result.push(
40
- range: extract_first_line(pin, source),
41
- severity: Diagnostics::Severities::WARNING,
42
- source: 'Solargraph',
43
- message: "Method `#{pin.name}` has undefined param `#{par}`."
44
- )
45
- end
46
- result
47
- end
48
-
49
- def check_param_tags pin, api_map, source
50
- result = []
51
- pin.docstring.tags(:param).each do |par|
52
- next if pin.parameter_names.include?(par.name)
53
- result.push(
54
- range: extract_first_line(pin, source),
55
- severity: Diagnostics::Severities::WARNING,
56
- source: 'Solargraph',
57
- message: "Method `#{pin.name}` has mistagged param `#{par.name}`."
58
- )
59
- end
60
- result
61
- end
62
-
63
- def extract_first_line pin, source
64
- {
65
- start: {
66
- line: pin.location.range.start.line,
67
- character: pin.location.range.start.character
68
- },
69
- end: {
70
- line: pin.location.range.start.line,
71
- character: last_character(pin.location.range.start, source)
72
- }
73
- }
74
- end
75
-
76
- def defined_return_type? pin, api_map
77
- return true unless pin.return_complex_type.undefined?
78
- matches = api_map.get_method_stack(pin.namespace, pin.name, scope: pin.scope)
79
- matches.shift
80
- matches.any?{|m| !m.return_complex_type.undefined?}
81
- end
82
-
83
- def defined_param_type? pin, param, api_map
84
- return true if param_in_docstring?(param, pin.docstring)
85
- matches = api_map.get_method_stack(pin.namespace, pin.name, scope: pin.scope)
86
- matches.shift
87
- matches.each do |m|
88
- next unless pin.parameter_names == m.parameter_names
89
- return true if param_in_docstring?(param, m.docstring)
90
- end
91
- false
92
- end
93
-
94
- def param_in_docstring? param, docstring
95
- tags = docstring.tags(:param)
96
- tags.any?{|t| t.name == param}
97
- end
98
-
99
- # @param position [Solargraph::Position]
100
- # @param source [Solargraph::Source]
101
- # @return [Integer]
102
- def last_character position, source
103
- cursor = Position.to_offset(source.code, position)
104
- source.code.index(/[\r\n]/, cursor) || source.code.length
105
- end
106
- end
107
- end
108
- end