solargraph 0.26.1 → 0.27.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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/lib/solargraph.rb +5 -2
  3. data/lib/solargraph/api_map.rb +236 -234
  4. data/lib/solargraph/api_map/store.rb +18 -53
  5. data/lib/solargraph/bundle.rb +22 -0
  6. data/lib/solargraph/complex_type.rb +9 -5
  7. data/lib/solargraph/complex_type/type_methods.rb +113 -0
  8. data/lib/solargraph/complex_type/unique_type.rb +35 -0
  9. data/lib/solargraph/core_fills.rb +1 -0
  10. data/lib/solargraph/diagnostics.rb +6 -4
  11. data/lib/solargraph/diagnostics/base.rb +3 -0
  12. data/lib/solargraph/diagnostics/require_not_found.rb +2 -1
  13. data/lib/solargraph/diagnostics/rubocop.rb +21 -6
  14. data/lib/solargraph/diagnostics/type_not_defined.rb +4 -3
  15. data/lib/solargraph/diagnostics/update_errors.rb +18 -0
  16. data/lib/solargraph/language_server/host.rb +90 -222
  17. data/lib/solargraph/language_server/host/cataloger.rb +68 -0
  18. data/lib/solargraph/language_server/host/diagnoser.rb +85 -0
  19. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +35 -24
  20. data/lib/solargraph/language_server/message/text_document/completion.rb +6 -8
  21. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +1 -1
  22. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +0 -1
  23. data/lib/solargraph/language_server/transport/socket.rb +4 -6
  24. data/lib/solargraph/language_server/transport/stdio.rb +4 -6
  25. data/lib/solargraph/library.rb +152 -99
  26. data/lib/solargraph/live_map.rb +1 -1
  27. data/lib/solargraph/location.rb +28 -0
  28. data/lib/solargraph/pin.rb +2 -0
  29. data/lib/solargraph/pin/attribute.rb +26 -12
  30. data/lib/solargraph/pin/base.rb +15 -35
  31. data/lib/solargraph/pin/base_variable.rb +7 -15
  32. data/lib/solargraph/pin/block.rb +5 -9
  33. data/lib/solargraph/pin/block_parameter.rb +9 -7
  34. data/lib/solargraph/pin/conversions.rb +5 -5
  35. data/lib/solargraph/pin/duck_method.rb +1 -1
  36. data/lib/solargraph/pin/instance_variable.rb +0 -4
  37. data/lib/solargraph/pin/keyword.rb +4 -0
  38. data/lib/solargraph/pin/localized.rb +5 -3
  39. data/lib/solargraph/pin/method.rb +11 -0
  40. data/lib/solargraph/pin/namespace.rb +7 -3
  41. data/lib/solargraph/pin/proxy_type.rb +3 -7
  42. data/lib/solargraph/pin/reference.rb +2 -2
  43. data/lib/solargraph/pin/symbol.rb +1 -1
  44. data/lib/solargraph/pin/yard_pin/method.rb +2 -2
  45. data/lib/solargraph/pin/yard_pin/namespace.rb +16 -7
  46. data/lib/solargraph/position.rb +103 -0
  47. data/lib/solargraph/range.rb +70 -0
  48. data/lib/solargraph/source.rb +159 -328
  49. data/lib/solargraph/source/chain.rb +38 -55
  50. data/lib/solargraph/source/chain/call.rb +47 -29
  51. data/lib/solargraph/source/chain/class_variable.rb +2 -2
  52. data/lib/solargraph/source/chain/constant.rb +3 -3
  53. data/lib/solargraph/source/chain/definition.rb +7 -3
  54. data/lib/solargraph/source/chain/global_variable.rb +1 -1
  55. data/lib/solargraph/source/chain/head.rb +22 -9
  56. data/lib/solargraph/source/chain/instance_variable.rb +2 -2
  57. data/lib/solargraph/source/chain/link.rb +4 -4
  58. data/lib/solargraph/source/chain/literal.rb +1 -1
  59. data/lib/solargraph/source/chain/variable.rb +2 -2
  60. data/lib/solargraph/source/change.rb +0 -6
  61. data/lib/solargraph/source/cursor.rb +161 -0
  62. data/lib/solargraph/source/encoding_fixes.rb +1 -1
  63. data/lib/solargraph/source/node_chainer.rb +28 -21
  64. data/lib/solargraph/source/node_methods.rb +1 -1
  65. data/lib/solargraph/source/source_chainer.rb +217 -0
  66. data/lib/solargraph/source_map.rb +138 -0
  67. data/lib/solargraph/source_map/clip.rb +123 -0
  68. data/lib/solargraph/{source → source_map}/completion.rb +3 -3
  69. data/lib/solargraph/{source → source_map}/mapper.rb +143 -41
  70. data/lib/solargraph/version.rb +1 -1
  71. data/lib/solargraph/workspace.rb +13 -20
  72. data/lib/solargraph/yard_map.rb +77 -48
  73. metadata +17 -11
  74. data/lib/solargraph/basic_type.rb +0 -33
  75. data/lib/solargraph/basic_type_methods.rb +0 -111
  76. data/lib/solargraph/source/call_chainer.rb +0 -273
  77. data/lib/solargraph/source/fragment.rb +0 -342
  78. data/lib/solargraph/source/location.rb +0 -23
  79. data/lib/solargraph/source/position.rb +0 -95
  80. data/lib/solargraph/source/range.rb +0 -64
@@ -1,3 +1,3 @@
1
1
  module Solargraph
2
- VERSION = '0.26.1'
2
+ VERSION = '0.27.0'
3
3
  end
@@ -10,7 +10,7 @@ module Solargraph
10
10
  attr_reader :directory
11
11
 
12
12
  # @param directory [String]
13
- def initialize directory, config = nil
13
+ def initialize directory = nil, config = nil
14
14
  # @todo Convert to an absolute path?
15
15
  @directory = directory
16
16
  @directory = nil if @directory == ''
@@ -48,12 +48,11 @@ module Solargraph
48
48
  # Remove a source from the workspace. The source will not be removed if
49
49
  # its file exists and the workspace is configured to include it.
50
50
  #
51
- # @param source [Solargraph::Source]
51
+ # @param filename [String]
52
52
  # @return [Boolean] True if the source was removed from the workspace
53
- def remove source
54
- return false if config(true).calculated.include?(source.filename)
55
- # @todo This method PROBABLY doesn't care if the file is actually here
56
- source_hash.delete source.filename
53
+ def remove filename
54
+ return false if config(true).calculated.include?(filename)
55
+ source_hash.delete filename
57
56
  true
58
57
  end
59
58
 
@@ -67,11 +66,6 @@ module Solargraph
67
66
  source_hash.values
68
67
  end
69
68
 
70
- # @return [Boolean]
71
- def has_source? source
72
- source_hash.has_value?(source)
73
- end
74
-
75
69
  # @return [Boolean]
76
70
  def has_file? filename
77
71
  source_hash.has_key?(filename)
@@ -84,14 +78,6 @@ module Solargraph
84
78
  source_hash[filename]
85
79
  end
86
80
 
87
- # The time of the last workspace synchronization.
88
- #
89
- # @return [Time]
90
- def stime
91
- return @stime if source_hash.empty?
92
- @stime = source_hash.values.sort{|a, b| a.stime <=> b.stime}.last.stime
93
- end
94
-
95
81
  # The require paths associated with the workspace.
96
82
  #
97
83
  # @return [Array<String>]
@@ -125,6 +111,14 @@ module Solargraph
125
111
  @gemspecs ||= Dir[File.join(directory, '**/*.gemspec')]
126
112
  end
127
113
 
114
+ # Synchronize the workspace from the provided updater.
115
+ #
116
+ # @param [Source::Updater]
117
+ # @return [void]
118
+ def synchronize! updater
119
+ source_hash[updater.filename] = source_hash[updater.filename].synchronize(updater)
120
+ end
121
+
128
122
  private
129
123
 
130
124
  # @return [Hash<String, Solargraph::Source>]
@@ -142,7 +136,6 @@ module Solargraph
142
136
  source_hash[filename] = Solargraph::Source.load(filename)
143
137
  end
144
138
  end
145
- @stime = Time.now
146
139
  end
147
140
 
148
141
  def generate_require_paths
@@ -20,24 +20,18 @@ module Solargraph
20
20
  @@stdlib_paths[path].push ns
21
21
  end
22
22
 
23
- # @return [Solargraph::Workspace]
24
- attr_reader :workspace
25
-
26
23
  # @return [Array<String>]
27
24
  attr_reader :required
28
25
 
29
26
  # @param required [Array<String>]
30
27
  # @param workspace [Solargraph::Workspace, nil]
31
- def initialize(required: [], workspace: nil)
32
- @workspace = workspace
28
+ def initialize(required: [])
33
29
  # HACK: YardMap needs its own copy of this array
34
30
  @required = required.clone
35
31
  @gem_paths = {}
36
32
  @stdlib_namespaces = []
37
33
  process_requires
38
- # yardocs.push CoreDocs.yardoc_file
39
34
  yardocs.uniq!
40
- yardocs.delete_if{ |y| y.start_with? workspace.directory } unless workspace.nil? or workspace.directory.nil?
41
35
  end
42
36
 
43
37
  # @return [Array<Solargraph::Pin::Base>]
@@ -45,6 +39,19 @@ module Solargraph
45
39
  @pins ||= []
46
40
  end
47
41
 
42
+ # @param new_requires [Array<String>]
43
+ # @return [Boolean]
44
+ def change new_requires
45
+ if new_requires.uniq.sort == required.uniq.sort
46
+ false
47
+ else
48
+ required.clear
49
+ required.concat new_requires
50
+ process_requires
51
+ true
52
+ end
53
+ end
54
+
48
55
  # @return [Array<String>]
49
56
  def yardocs
50
57
  @yardocs ||= []
@@ -71,31 +78,24 @@ module Solargraph
71
78
  end
72
79
  end
73
80
 
74
- # @param new_requires [Array<String>]
75
- # @return [Boolean]
76
- def change new_requires
77
- if new_requires.uniq.sort == required.uniq.sort
78
- false
79
- else
80
- required.clear
81
- required.concat new_requires
82
- process_requires
83
- true
84
- end
85
- end
86
-
87
81
  # @return [Array<Solargraph::Pin::Base>]
88
82
  def core_pins
89
83
  @@core_pins ||= begin
90
84
  result = []
91
85
  load_yardoc CoreDocs.yardoc_file
92
86
  YARD::Registry.each do |o|
93
- result.push generate_pin(o)
87
+ result.concat generate_pins(o)
94
88
  end
95
89
  result
96
90
  end
97
91
  end
98
92
 
93
+ # @param path [String]
94
+ # @return [Pin::Base]
95
+ def path_pin path
96
+ pins.select{ |p| p.path == path }.first
97
+ end
98
+
99
99
  private
100
100
 
101
101
  # @return [YardMap::Cache]
@@ -108,7 +108,7 @@ module Solargraph
108
108
  def recurse_namespace_object ns
109
109
  result = []
110
110
  ns.children.each do |c|
111
- result.push generate_pin(c)
111
+ result.concat generate_pins(c)
112
112
  result.concat recurse_namespace_object(c) if c.respond_to?(:children)
113
113
  end
114
114
  result
@@ -116,17 +116,23 @@ module Solargraph
116
116
 
117
117
  # @param code_object [YARD::CodeObjects::Base]
118
118
  # @return [Solargraph::Pin::Base]
119
- def generate_pin code_object
119
+ def generate_pins code_object
120
+ result = []
120
121
  location = object_location(code_object)
121
122
  if code_object.is_a?(YARD::CodeObjects::NamespaceObject)
122
- Solargraph::Pin::YardPin::Namespace.new(code_object, location)
123
+ result.push Solargraph::Pin::YardPin::Namespace.new(code_object, location)
123
124
  elsif code_object.is_a?(YARD::CodeObjects::MethodObject)
124
- Solargraph::Pin::YardPin::Method.new(code_object, location)
125
+ if code_object.name == :initialize && code_object.scope == :instance
126
+ # @todo Check the visibility of <Class>.new
127
+ result.push Solargraph::Pin::YardPin::Method.new(code_object, location, 'new', :class, :public)
128
+ result.push Solargraph::Pin::YardPin::Method.new(code_object, location, 'initialize', :instance, :private)
129
+ else
130
+ result.push Solargraph::Pin::YardPin::Method.new(code_object, location)
131
+ end
125
132
  elsif code_object.is_a?(YARD::CodeObjects::ConstantObject)
126
- Solargraph::Pin::YardPin::Constant.new(code_object, location)
127
- else
128
- nil
133
+ result.push Solargraph::Pin::YardPin::Constant.new(code_object, location)
129
134
  end
135
+ result
130
136
  end
131
137
 
132
138
  # @return [void]
@@ -136,7 +142,6 @@ module Solargraph
136
142
  stdnames = {}
137
143
  required.each do |r|
138
144
  next if r.nil? or r.empty?
139
- next if !workspace.nil? and workspace.would_require?(r)
140
145
  cached = cache.get_path_pins(r)
141
146
  unless cached.nil?
142
147
  pins.concat cached
@@ -147,8 +152,6 @@ module Solargraph
147
152
  spec = Gem::Specification.find_by_path(r) || Gem::Specification.find_by_name(r.split('/').first)
148
153
  ver = spec.version.to_s
149
154
  ver = ">= 0" if ver.empty?
150
- # @todo Ignoring dependencies for now
151
- # add_gem_dependencies spec
152
155
  yd = YARD::Registry.yardoc_file_for_gem(spec.name, ver)
153
156
  @gem_paths[spec.name] = spec.full_gem_path
154
157
  if yd.nil?
@@ -156,18 +159,15 @@ module Solargraph
156
159
  else
157
160
  unless yardocs.include?(yd)
158
161
  yardocs.unshift yd
159
- # @todo Generate the pins
160
- load_yardoc yd
161
- YARD::Registry.each do |o|
162
- result.push generate_pin(o)
163
- end
162
+ result.concat process_yardoc yd
163
+ # @todo Testing performance
164
+ # result.concat add_gem_dependencies spec
164
165
  end
165
166
  end
166
167
  rescue Gem::LoadError => e
167
- next if !workspace.nil? and workspace.would_require?(r)
168
168
  stdtmp = []
169
169
  @@stdlib_paths.each_pair do |path, objects|
170
- stdtmp.concat objects if path == r or path.start_with?("#{r}/")
170
+ stdtmp.concat objects if path == r || path.start_with?("#{r}/")
171
171
  end
172
172
  if stdtmp.empty?
173
173
  unresolved_requires.push r
@@ -197,7 +197,7 @@ module Solargraph
197
197
  objects.each do |ns|
198
198
  next if done.include?(ns.path)
199
199
  done.push ns.path
200
- result.push generate_pin(ns)
200
+ result.concat generate_pins(ns)
201
201
  result.concat recurse_namespace_object(ns)
202
202
  end
203
203
  result.delete_if(&:nil?)
@@ -211,25 +211,54 @@ module Solargraph
211
211
  # @param spec [Gem::Specification]
212
212
  # @return [void]
213
213
  def add_gem_dependencies spec
214
+ result = []
214
215
  (spec.dependencies - spec.development_dependencies).each do |dep|
215
- depspec = Gem::Specification.find_by_name(dep.name)
216
- @gem_paths[spec.name] = depspec.full_gem_path unless depspec.nil?
217
- gy = YARD::Registry.yardoc_file_for_gem(dep.name)
218
- if gy.nil?
219
- unresolved_requires.push dep.name
220
- else
221
- yardocs.unshift gy unless yardocs.include?(gy)
216
+ begin
217
+ depspec = Gem::Specification.find_by_name(dep.name)
218
+ @gem_paths[depspec.name] = depspec.full_gem_path unless depspec.nil?
219
+ gy = YARD::Registry.yardoc_file_for_gem(dep.name)
220
+ if gy.nil?
221
+ unresolved_requires.push dep.name
222
+ else
223
+ unless yardocs.include?(gy)
224
+ yardocs.unshift gy
225
+ result.concat process_yardoc gy
226
+ # @todo Trying only one level of dependencies
227
+ # result.concat add_gem_dependencies(depspec)
228
+ end
229
+ end
230
+ rescue Gem::LoadError
231
+ # This error probably indicates a bug in an installed gem
232
+ STDERR.puts "Warning: failed to resolve #{dep.name} gem dependency for #{spec.name}"
222
233
  end
223
234
  end
235
+ result
236
+ end
237
+
238
+ def process_yardoc y
239
+ return [] if y.nil?
240
+ size = Dir.glob(File.join(y, '**', '*'))
241
+ .map{ |f| File.size(f) }
242
+ .inject(:+)
243
+ if !size.nil? && size > 20_000_000
244
+ STDERR.puts "Warning: yardoc at #{y} is too large to process (#{size} bytes)"
245
+ return []
246
+ end
247
+ result = []
248
+ load_yardoc y
249
+ YARD::Registry.each do |o|
250
+ result.concat generate_pins(o)
251
+ end
252
+ result
224
253
  end
225
254
 
226
255
  # @param obj [YARD::CodeObjects::Base]
227
- # @return [Solargraph::Source::Location]
256
+ # @return [Solargraph::Location]
228
257
  def object_location obj
229
258
  return nil if obj.file.nil? or obj.line.nil?
230
259
  @gem_paths.values.each do |path|
231
260
  file = File.join(path, obj.file)
232
- return Solargraph::Source::Location.new(file, Solargraph::Source::Range.from_to(obj.line, 0, obj.line, 0)) if File.exist?(file)
261
+ return Solargraph::Location.new(file, Solargraph::Range.from_to(obj.line, 0, obj.line, 0)) if File.exist?(file)
233
262
  end
234
263
  nil
235
264
  end
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.26.1
4
+ version: 0.27.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: 2018-08-31 00:00:00.000000000 Z
11
+ date: 2018-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -238,9 +238,10 @@ files:
238
238
  - lib/solargraph/api_map/cache.rb
239
239
  - lib/solargraph/api_map/source_to_yard.rb
240
240
  - lib/solargraph/api_map/store.rb
241
- - lib/solargraph/basic_type.rb
242
- - lib/solargraph/basic_type_methods.rb
241
+ - lib/solargraph/bundle.rb
243
242
  - lib/solargraph/complex_type.rb
243
+ - lib/solargraph/complex_type/type_methods.rb
244
+ - lib/solargraph/complex_type/unique_type.rb
244
245
  - lib/solargraph/core_fills.rb
245
246
  - lib/solargraph/diagnostics.rb
246
247
  - lib/solargraph/diagnostics/base.rb
@@ -248,10 +249,13 @@ files:
248
249
  - lib/solargraph/diagnostics/rubocop.rb
249
250
  - lib/solargraph/diagnostics/severities.rb
250
251
  - lib/solargraph/diagnostics/type_not_defined.rb
252
+ - lib/solargraph/diagnostics/update_errors.rb
251
253
  - lib/solargraph/language_server.rb
252
254
  - lib/solargraph/language_server/completion_item_kinds.rb
253
255
  - lib/solargraph/language_server/error_codes.rb
254
256
  - lib/solargraph/language_server/host.rb
257
+ - lib/solargraph/language_server/host/cataloger.rb
258
+ - lib/solargraph/language_server/host/diagnoser.rb
255
259
  - lib/solargraph/language_server/message.rb
256
260
  - lib/solargraph/language_server/message/base.rb
257
261
  - lib/solargraph/language_server/message/cancel_request.rb
@@ -301,6 +305,7 @@ files:
301
305
  - lib/solargraph/library.rb
302
306
  - lib/solargraph/live_map.rb
303
307
  - lib/solargraph/live_map/cache.rb
308
+ - lib/solargraph/location.rb
304
309
  - lib/solargraph/page.rb
305
310
  - lib/solargraph/pin.rb
306
311
  - lib/solargraph/pin/attribute.rb
@@ -336,10 +341,11 @@ files:
336
341
  - lib/solargraph/plugin/canceler.rb
337
342
  - lib/solargraph/plugin/process.rb
338
343
  - lib/solargraph/plugin/runtime.rb
344
+ - lib/solargraph/position.rb
345
+ - lib/solargraph/range.rb
339
346
  - lib/solargraph/server_methods.rb
340
347
  - lib/solargraph/shell.rb
341
348
  - lib/solargraph/source.rb
342
- - lib/solargraph/source/call_chainer.rb
343
349
  - lib/solargraph/source/chain.rb
344
350
  - lib/solargraph/source/chain/call.rb
345
351
  - lib/solargraph/source/chain/class_variable.rb
@@ -352,17 +358,17 @@ files:
352
358
  - lib/solargraph/source/chain/literal.rb
353
359
  - lib/solargraph/source/chain/variable.rb
354
360
  - lib/solargraph/source/change.rb
355
- - lib/solargraph/source/completion.rb
361
+ - lib/solargraph/source/cursor.rb
356
362
  - lib/solargraph/source/encoding_fixes.rb
357
363
  - lib/solargraph/source/flawed_builder.rb
358
- - lib/solargraph/source/fragment.rb
359
- - lib/solargraph/source/location.rb
360
- - lib/solargraph/source/mapper.rb
361
364
  - lib/solargraph/source/node_chainer.rb
362
365
  - lib/solargraph/source/node_methods.rb
363
- - lib/solargraph/source/position.rb
364
- - lib/solargraph/source/range.rb
366
+ - lib/solargraph/source/source_chainer.rb
365
367
  - lib/solargraph/source/updater.rb
368
+ - lib/solargraph/source_map.rb
369
+ - lib/solargraph/source_map/clip.rb
370
+ - lib/solargraph/source_map/completion.rb
371
+ - lib/solargraph/source_map/mapper.rb
366
372
  - lib/solargraph/version.rb
367
373
  - lib/solargraph/views/_method.erb
368
374
  - lib/solargraph/views/_name_type_tag.erb
@@ -1,33 +0,0 @@
1
- module Solargraph
2
- class BasicType
3
- include BasicTypeMethods
4
-
5
- # Create a BasicType with the specified name and an optional substring.
6
- # The substring is the parameter section of a parametrized type, e.g., for
7
- # the type `Array<String>`, the name is `Array` and the substring is
8
- # `<String>`.
9
- #
10
- # @param name [String] The name of the type
11
- # @param substring [String] The substring of the type
12
- def initialize name, substring = ''
13
- @name = name
14
- @substring = substring
15
- @tag = name + substring
16
- @key_types = []
17
- @subtypes = []
18
- return unless parameters?
19
- subs = ComplexType.parse(substring[1..-2], partial: true)
20
- if hash_parameters?
21
- raise ComplexTypeError, "Bad hash type" unless !subs.is_a?(ComplexType) and subs.length == 2 and !subs[0].is_a?(ComplexType) and !subs[1].is_a?(ComplexType)
22
- @key_types.concat subs[0]
23
- @subtypes.concat subs[1]
24
- else
25
- @subtypes.concat subs
26
- end
27
- end
28
-
29
- def to_s
30
- tag
31
- end
32
- end
33
- end
@@ -1,111 +0,0 @@
1
- module Solargraph
2
- module BasicTypeMethods
3
- # @return [String]
4
- attr_reader :name
5
-
6
- # @return [String]
7
- attr_reader :substring
8
-
9
- # @return [String]
10
- attr_reader :tag
11
-
12
- # @return [Array<ComplexType>]
13
- attr_reader :subtypes
14
-
15
- # @return [Boolean]
16
- def duck_type?
17
- @duck_type ||= name.start_with?('#')
18
- end
19
-
20
- # @return [Boolean]
21
- def nil_type?
22
- @nil_type ||= (name.downcase == 'nil')
23
- end
24
-
25
- # @return [Boolean]
26
- def parameters?
27
- !substring.empty?
28
- end
29
-
30
- def void?
31
- name == 'void'
32
- end
33
-
34
- def defined?
35
- !undefined?
36
- end
37
-
38
- def undefined?
39
- name == 'undefined'
40
- end
41
-
42
- # @return [Boolean]
43
- def list_parameters?
44
- substring.start_with?('<')
45
- end
46
-
47
- # @return [Boolean]
48
- def fixed_parameters?
49
- substring.start_with?('(')
50
- end
51
-
52
- # @return [Boolean]
53
- def hash_parameters?
54
- substring.start_with?('{')
55
- end
56
-
57
- # @return [Array<ComplexType>]
58
- def value_types
59
- @subtypes
60
- end
61
-
62
- # @return [Array<ComplexType>]
63
- def key_types
64
- @key_types
65
- end
66
-
67
- # @return [String]
68
- def namespace
69
- @namespace ||= 'Object' if duck_type?
70
- @namespace ||= 'NilClass' if nil_type?
71
- @namespace ||= ((name == 'Class' or name == 'Module') and !subtypes.empty?) ? subtypes.first.name : name
72
- end
73
-
74
- # @return [Symbol] :class or :instance
75
- def scope
76
- @scope ||= :instance if duck_type? or nil_type?
77
- @scope ||= ((name == 'Class' or name == 'Module') and !subtypes.empty?) ? :class : :instance
78
- end
79
-
80
- def == other
81
- return false unless self.class == other.class
82
- tag == other.tag
83
- end
84
-
85
- # Generate a ComplexType that fully qualifies this type's namespaces.
86
- #
87
- # @param api_map [ApiMap] The ApiMap that performs qualification
88
- # @param context [String] The namespace from which to resolve names
89
- # @return [ComplexType] The generated ComplexType
90
- def qualify api_map, context = ''
91
- return ComplexType.parse(tag) if duck_type? or void? or undefined?
92
- fqns = api_map.qualify(name, context)
93
- return ComplexType::UNDEFINED if fqns.nil?
94
- ltypes = key_types.map do |t|
95
- t.qualify api_map, context
96
- end
97
- rtypes = value_types.map do |t|
98
- t.qualify api_map, context
99
- end
100
- if list_parameters?
101
- Solargraph::ComplexType.parse("#{fqns}<#{rtypes.map(&:tag).join(', ')}>").first
102
- elsif fixed_parameters?
103
- Solargraph::ComplexType.parse("#{fqns}(#{rtypes.map(&:tag).join(', ')})").first
104
- elsif hash_parameters?
105
- Solargraph::ComplexType.parse("#{fqns}{#{ltypes.map(&:tag).join(', ')} => #{rtypes.map(&:tag).join(', ')}}").first
106
- else
107
- Solargraph::ComplexType.parse(fqns).first
108
- end
109
- end
110
- end
111
- end