solargraph 0.21.1 → 0.22.0

Sign up to get free protection for your applications and to get access to all the features.
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