solargraph 0.21.1 → 0.22.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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/solargraph.rb +0 -1
  3. data/lib/solargraph/api_map.rb +40 -23
  4. data/lib/solargraph/api_map/completion.rb +3 -0
  5. data/lib/solargraph/api_map/probe.rb +16 -19
  6. data/lib/solargraph/api_map/store.rb +6 -2
  7. data/lib/solargraph/diagnostics/rubocop.rb +6 -0
  8. data/lib/solargraph/language_server/host.rb +9 -1
  9. data/lib/solargraph/language_server/message.rb +3 -0
  10. data/lib/solargraph/language_server/message/extended.rb +1 -0
  11. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +1 -1
  12. data/lib/solargraph/language_server/message/extended/download_core.rb +25 -0
  13. data/lib/solargraph/language_server/message/initialize.rb +3 -1
  14. data/lib/solargraph/language_server/message/text_document.rb +13 -11
  15. data/lib/solargraph/language_server/message/text_document/definition.rb +1 -1
  16. data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
  17. data/lib/solargraph/language_server/message/text_document/references.rb +14 -0
  18. data/lib/solargraph/language_server/message/text_document/rename.rb +17 -0
  19. data/lib/solargraph/language_server/uri_helpers.rb +2 -0
  20. data/lib/solargraph/library.rb +37 -0
  21. data/lib/solargraph/live_map.rb +8 -2
  22. data/lib/solargraph/live_map/cache.rb +7 -0
  23. data/lib/solargraph/pin.rb +1 -0
  24. data/lib/solargraph/pin/attribute.rb +5 -1
  25. data/lib/solargraph/pin/namespace.rb +0 -2
  26. data/lib/solargraph/pin/proxy_method.rb +31 -0
  27. data/lib/solargraph/plugin/process.rb +1 -1
  28. data/lib/solargraph/plugin/runtime.rb +0 -1
  29. data/lib/solargraph/shell.rb +0 -1
  30. data/lib/solargraph/source.rb +31 -1
  31. data/lib/solargraph/source/fragment.rb +12 -15
  32. data/lib/solargraph/source/location.rb +3 -0
  33. data/lib/solargraph/source/mapper.rb +20 -10
  34. data/lib/solargraph/source/node_methods.rb +111 -0
  35. data/lib/solargraph/version.rb +1 -1
  36. data/lib/solargraph/workspace.rb +7 -1
  37. data/lib/solargraph/workspace/config.rb +6 -2
  38. data/lib/solargraph/yard_map.rb +12 -1
  39. metadata +25 -7
  40. data/lib/solargraph/node_methods.rb +0 -101
@@ -0,0 +1,111 @@
1
+ module Solargraph
2
+ class Source
3
+ module NodeMethods
4
+ module_function
5
+
6
+ # @return [String]
7
+ def unpack_name(node)
8
+ pack_name(node).join("::")
9
+ end
10
+
11
+ # @return [Array<String>]
12
+ def pack_name(node)
13
+ parts = []
14
+ if node.kind_of?(AST::Node)
15
+ node.children.each { |n|
16
+ if n.kind_of?(AST::Node)
17
+ if n.type == :cbase
18
+ parts = pack_name(n)
19
+ else
20
+ parts += pack_name(n)
21
+ end
22
+ else
23
+ parts.push n unless n.nil?
24
+ end
25
+ }
26
+ end
27
+ parts
28
+ end
29
+
30
+ # @return [String]
31
+ def const_from node
32
+ if node.kind_of?(AST::Node) and node.type == :const
33
+ result = ''
34
+ unless node.children[0].nil?
35
+ result = const_from(node.children[0])
36
+ end
37
+ if result == ''
38
+ result = node.children[1].to_s
39
+ else
40
+ result = result + '::' + node.children[1].to_s
41
+ end
42
+ result
43
+ else
44
+ nil
45
+ end
46
+ end
47
+
48
+ # @return [String]
49
+ def infer_literal_node_type node
50
+ return nil unless node.kind_of?(AST::Node)
51
+ if node.type == :str or node.type == :dstr
52
+ return 'String'
53
+ elsif node.type == :array
54
+ return 'Array'
55
+ elsif node.type == :hash
56
+ return 'Hash'
57
+ elsif node.type == :int
58
+ return 'Integer'
59
+ elsif node.type == :float
60
+ return 'Float'
61
+ elsif node.type == :sym
62
+ return 'Symbol'
63
+ # @todo Maybe ignore nils
64
+ # elsif node.type == :nil
65
+ # return 'NilClass'
66
+ end
67
+ nil
68
+ end
69
+
70
+ # Get a call signature from a node.
71
+ # The result should be a string in the form of a method path, e.g.,
72
+ # String.new or variable.method.
73
+ #
74
+ # @return [String]
75
+ def resolve_node_signature node
76
+ result = drill_signature node, ''
77
+ return nil if result.empty?
78
+ result
79
+ end
80
+
81
+ def get_node_start_position(node)
82
+ Position.new(node.loc.line - 1, node.loc.column)
83
+ end
84
+
85
+ def get_node_end_position(node)
86
+ Position.new(node.loc.last_line - 1, node.loc.last_column)
87
+ end
88
+
89
+ def drill_signature node, signature
90
+ return signature unless node.kind_of?(AST::Node)
91
+ if node.type == :const or node.type == :cbase
92
+ unless node.children[0].nil?
93
+ signature += drill_signature(node.children[0], signature)
94
+ end
95
+ signature += '::' unless signature.empty?
96
+ signature += node.children[1].to_s
97
+ elsif node.type == :lvar or node.type == :ivar or node.type == :cvar
98
+ signature += '.' unless signature.empty?
99
+ signature += node.children[0].to_s
100
+ elsif node.type == :send
101
+ unless node.children[0].nil?
102
+ signature += drill_signature(node.children[0], signature)
103
+ end
104
+ signature += '.' unless signature.empty?
105
+ signature += node.children[1].to_s
106
+ end
107
+ signature
108
+ end
109
+ end
110
+ end
111
+ end
@@ -1,3 +1,3 @@
1
1
  module Solargraph
2
- VERSION = '0.21.1'
2
+ VERSION = '0.22.0'
3
3
  end
@@ -132,15 +132,21 @@ module Solargraph
132
132
 
133
133
  def generate_require_paths
134
134
  return [] if directory.nil?
135
- return [File.join(directory, 'lib')] unless gemspec?
135
+ return configured_require_paths unless gemspec?
136
136
  result = []
137
137
  gemspecs.each do |file|
138
138
  spec = Gem::Specification.load(file)
139
139
  base = File.dirname(file)
140
140
  result.concat spec.require_paths.map{ |path| File.join(base, path) } unless spec.nil?
141
141
  end
142
+ result.concat config.require_paths
142
143
  result.push File.join(directory, 'lib') if result.empty?
143
144
  result
144
145
  end
146
+
147
+ def configured_require_paths
148
+ return [File.join(directory, 'lib')] if config.require_paths.empty?
149
+ config.require_paths.map{|p| File.join(directory, p)}
150
+ end
145
151
  end
146
152
  end
@@ -13,7 +13,7 @@ module Solargraph
13
13
  def initialize workspace = nil
14
14
  @workspace = workspace
15
15
  include_globs = ['**/*.rb']
16
- exclude_globs = ['spec/**/*', 'test/**/*', 'vendor/**/*']
16
+ exclude_globs = ['spec/**/*', 'test/**/*', 'vendor/**/*', '.bundle/**/*']
17
17
  unless @workspace.nil?
18
18
  sfile = File.join(@workspace, '.solargraph.yml')
19
19
  if File.file?(sfile)
@@ -44,7 +44,7 @@ module Solargraph
44
44
  end
45
45
 
46
46
  # An array of files excluded from the workspace.
47
- #
47
+ #
48
48
  # @return [Array<String>]
49
49
  def excluded
50
50
  return [] if workspace.nil?
@@ -67,6 +67,10 @@ module Solargraph
67
67
  raw_data['require']
68
68
  end
69
69
 
70
+ def require_paths
71
+ raw_data['require_paths'] || []
72
+ end
73
+
70
74
  def plugins
71
75
  raw_data['plugins']
72
76
  end
@@ -152,9 +152,20 @@ module Solargraph
152
152
  ns = nil
153
153
  ns = find_first_resolved_object(yard, namespace, scope)
154
154
  unless ns.nil?
155
+ has_new = false
155
156
  ns.meths(scope: :class, visibility: visibility).each { |m|
157
+ has_new = true if m.name == 'new'
156
158
  meths.push Pin::YardObject.new(m, object_location(m))
157
159
  }
160
+ # HACK: Convert #initialize to .new
161
+ if visibility.include?(:public) and !has_new
162
+ init = ns.meths(scope: :instance).select{|m| m.to_s.split(/[\.#]/).last == 'initialize'}.first
163
+ unless init.nil?
164
+ ip = Solargraph::Pin::YardObject.new(init, object_location(init))
165
+ np = Solargraph::Pin::Method.new(ip.location, ip.namespace, 'new', ip.docstring, :class, :public, ip.parameters)
166
+ meths.push np
167
+ end
168
+ end
158
169
  # Collect superclass methods
159
170
  if ns.kind_of?(YARD::CodeObjects::ClassObject) and !ns.superclass.nil?
160
171
  meths += get_methods ns.superclass.to_s, '', visibility: [:public, :protected] unless ['Object', 'BasicObject', ''].include?(ns.superclass.to_s)
@@ -286,12 +297,12 @@ module Solargraph
286
297
  unresolved_requires.clear
287
298
  required.each do |r|
288
299
  next if r.nil?
300
+ next if !workspace.nil? and workspace.would_require?(r)
289
301
  begin
290
302
  spec = Gem::Specification.find_by_path(r) || Gem::Specification.find_by_name(r.split('/').first)
291
303
  ver = spec.version.to_s
292
304
  ver = ">= 0" if ver.empty?
293
305
  add_gem_dependencies spec
294
- next if !workspace.nil? and workspace.would_require?(r)
295
306
  yd = YARD::Registry.yardoc_file_for_gem(spec.name, ver)
296
307
  @gem_paths[spec.name] = spec.full_gem_path
297
308
  unresolved_requires.push r if yd.nil?
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.21.1
4
+ version: 0.22.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-05-14 00:00:00.000000000 Z
11
+ date: 2018-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -102,16 +102,16 @@ dependencies:
102
102
  name: kramdown
103
103
  requirement: !ruby/object:Gem::Requirement
104
104
  requirements:
105
- - - ">="
105
+ - - "~>"
106
106
  - !ruby/object:Gem::Version
107
- version: '0'
107
+ version: '1.16'
108
108
  type: :runtime
109
109
  prerelease: false
110
110
  version_requirements: !ruby/object:Gem::Requirement
111
111
  requirements:
112
- - - ">="
112
+ - - "~>"
113
113
  - !ruby/object:Gem::Version
114
- version: '0'
114
+ version: '1.16'
115
115
  - !ruby/object:Gem::Dependency
116
116
  name: htmlentities
117
117
  requirement: !ruby/object:Gem::Requirement
@@ -208,6 +208,20 @@ dependencies:
208
208
  - - "~>"
209
209
  - !ruby/object:Gem::Version
210
210
  version: '0.14'
211
+ - !ruby/object:Gem::Dependency
212
+ name: pry
213
+ requirement: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - "~>"
216
+ - !ruby/object:Gem::Version
217
+ version: 0.11.3
218
+ type: :development
219
+ prerelease: false
220
+ version_requirements: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - "~>"
223
+ - !ruby/object:Gem::Version
224
+ version: 0.11.3
211
225
  description: IDE tools for code completion and inline documentation
212
226
  email: admin@castwide.com
213
227
  executables:
@@ -249,6 +263,7 @@ files:
249
263
  - lib/solargraph/language_server/message/extended/check_gem_version.rb
250
264
  - lib/solargraph/language_server/message/extended/document.rb
251
265
  - lib/solargraph/language_server/message/extended/document_gems.rb
266
+ - lib/solargraph/language_server/message/extended/download_core.rb
252
267
  - lib/solargraph/language_server/message/extended/search.rb
253
268
  - lib/solargraph/language_server/message/initialize.rb
254
269
  - lib/solargraph/language_server/message/initialized.rb
@@ -267,6 +282,8 @@ files:
267
282
  - lib/solargraph/language_server/message/text_document/formatting.rb
268
283
  - lib/solargraph/language_server/message/text_document/hover.rb
269
284
  - lib/solargraph/language_server/message/text_document/on_type_formatting.rb
285
+ - lib/solargraph/language_server/message/text_document/references.rb
286
+ - lib/solargraph/language_server/message/text_document/rename.rb
270
287
  - lib/solargraph/language_server/message/text_document/signature_help.rb
271
288
  - lib/solargraph/language_server/message/workspace.rb
272
289
  - lib/solargraph/language_server/message/workspace/did_change_configuration.rb
@@ -282,7 +299,6 @@ files:
282
299
  - lib/solargraph/library.rb
283
300
  - lib/solargraph/live_map.rb
284
301
  - lib/solargraph/live_map/cache.rb
285
- - lib/solargraph/node_methods.rb
286
302
  - lib/solargraph/page.rb
287
303
  - lib/solargraph/pin.rb
288
304
  - lib/solargraph/pin/attribute.rb
@@ -304,6 +320,7 @@ files:
304
320
  - lib/solargraph/pin/method_parameter.rb
305
321
  - lib/solargraph/pin/namespace.rb
306
322
  - lib/solargraph/pin/plugin/method.rb
323
+ - lib/solargraph/pin/proxy_method.rb
307
324
  - lib/solargraph/pin/reference.rb
308
325
  - lib/solargraph/pin/symbol.rb
309
326
  - lib/solargraph/pin/yard_object.rb
@@ -320,6 +337,7 @@ files:
320
337
  - lib/solargraph/source/fragment.rb
321
338
  - lib/solargraph/source/location.rb
322
339
  - lib/solargraph/source/mapper.rb
340
+ - lib/solargraph/source/node_methods.rb
323
341
  - lib/solargraph/source/position.rb
324
342
  - lib/solargraph/source/range.rb
325
343
  - lib/solargraph/source/updater.rb
@@ -1,101 +0,0 @@
1
- module Solargraph
2
- module NodeMethods
3
- # @return [String]
4
- def unpack_name(node)
5
- pack_name(node).join("::")
6
- end
7
-
8
- # @return [Array<String>]
9
- def pack_name(node)
10
- parts = []
11
- if node.kind_of?(AST::Node)
12
- node.children.each { |n|
13
- if n.kind_of?(AST::Node)
14
- if n.type == :cbase
15
- parts = pack_name(n)
16
- else
17
- parts += pack_name(n)
18
- end
19
- else
20
- parts.push n unless n.nil?
21
- end
22
- }
23
- end
24
- parts
25
- end
26
-
27
- # @return [String]
28
- def const_from node
29
- if node.kind_of?(AST::Node) and node.type == :const
30
- result = ''
31
- unless node.children[0].nil?
32
- result = const_from(node.children[0])
33
- end
34
- if result == ''
35
- result = node.children[1].to_s
36
- else
37
- result = result + '::' + node.children[1].to_s
38
- end
39
- result
40
- else
41
- nil
42
- end
43
- end
44
-
45
- # @return [String]
46
- def infer_literal_node_type node
47
- return nil unless node.kind_of?(AST::Node)
48
- if node.type == :str or node.type == :dstr
49
- return 'String'
50
- elsif node.type == :array
51
- return 'Array'
52
- elsif node.type == :hash
53
- return 'Hash'
54
- elsif node.type == :int
55
- return 'Integer'
56
- elsif node.type == :float
57
- return 'Float'
58
- elsif node.type == :sym
59
- return 'Symbol'
60
- # @todo Maybe ignore nils
61
- # elsif node.type == :nil
62
- # return 'NilClass'
63
- end
64
- nil
65
- end
66
-
67
- # Get a call signature from a node.
68
- # The result should be a string in the form of a method path, e.g.,
69
- # String.new or variable.method.
70
- #
71
- # @return [String]
72
- def resolve_node_signature node
73
- result = drill_signature node, ''
74
- return nil if result.empty?
75
- result
76
- end
77
-
78
- private
79
-
80
- def drill_signature node, signature
81
- return signature unless node.kind_of?(AST::Node)
82
- if node.type == :const or node.type == :cbase
83
- unless node.children[0].nil?
84
- signature += drill_signature(node.children[0], signature)
85
- end
86
- signature += '::' unless signature.empty?
87
- signature += node.children[1].to_s
88
- elsif node.type == :lvar or node.type == :ivar or node.type == :cvar
89
- signature += '.' unless signature.empty?
90
- signature += node.children[0].to_s
91
- elsif node.type == :send
92
- unless node.children[0].nil?
93
- signature += drill_signature(node.children[0], signature)
94
- end
95
- signature += '.' unless signature.empty?
96
- signature += node.children[1].to_s
97
- end
98
- signature
99
- end
100
- end
101
- end