yoda-language-server 0.7.1 → 0.7.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a1135858460f719a79d288fd6210011d1380f39ecedf817b06277aa400277e79
4
- data.tar.gz: 5fa3c98c453be13419c9e3225d5cbeea81ee1103e77812a1097f251f29c4a39d
3
+ metadata.gz: 715586351d4d461d35dd89cd858dcc1f886508e7b8ed1f8ba82c071130ecb7d7
4
+ data.tar.gz: 932d126f234752431363cabdc461c8c2abfc7546293134074986e08678427914
5
5
  SHA512:
6
- metadata.gz: 6dffa44d4bb6dbe751fdb34c0f47ea2b371deae46e22b85da27dc0c2c57938d8203f593b0990cea379dc708d34c060173dff6c512e2603edc98808d9131b9026
7
- data.tar.gz: 2df74769182891b2ef9926a89abf8e8487e4a734a87719ead05374c3bc6b52db53ec4b3f01186de03af60bbf5f54bb1a323a3803a908d78f106fbd3a3d874b90
6
+ metadata.gz: 57e1304da036c27fc3f945c92cfe4bb7ac7d9c0d22f30cf4b6664bf647e833f62c6df31cb5618094c63824b58769648739bcd7771ffb7163310c017f9fbb9604
7
+ data.tar.gz: 6c76098551ddcd5be50d022ba649acc527bc0c173fbc49322add37914e91cc12fc479c928fabb43d7f2954dd94fab0c7d3660fdf2ce485f6d863fe9af7619ba5
@@ -4,7 +4,7 @@ module Yoda
4
4
  include Comparable
5
5
 
6
6
  # @todo Make this 0-indexed.
7
- # @return [Integer] 0-indexed column number.
7
+ # @return [Integer] 1-indexed column number.
8
8
  attr_reader :row
9
9
 
10
10
  # @return [Integer] 0-indexed column number.
@@ -2,7 +2,7 @@ module Yoda
2
2
  module Store
3
3
  module Objects
4
4
  class ClassObject < NamespaceObject
5
- # @return [ScopedPath, nil]
5
+ # @return [Path, nil]
6
6
  attr_reader :superclass_path
7
7
 
8
8
  # @return [Array<Symbol>]
@@ -15,7 +15,7 @@ module Yoda
15
15
  def initialize(superclass_path: nil, **kwargs)
16
16
  super(kwargs)
17
17
 
18
- @superclass_path = Model::ScopedPath.new(Objects.lexical_scopes_of(path), superclass_path) if superclass_path
18
+ @superclass_path = Model::Path.new(superclass_path) if superclass_path
19
19
  end
20
20
 
21
21
  def kind
@@ -23,7 +23,7 @@ module Yoda
23
23
  end
24
24
 
25
25
  def to_h
26
- super.merge(superclass_path: superclass_path&.path&.to_s)
26
+ super.merge(superclass_path: superclass_path&.to_s)
27
27
  end
28
28
 
29
29
  private
@@ -32,14 +32,14 @@ module Yoda
32
32
  # @return [Hash]
33
33
  def merge_attributes(another)
34
34
  super.merge(
35
- superclass_path: select_superclass(another.superclass_path)&.path&.to_s,
35
+ superclass_path: select_superclass(another.superclass_path)&.to_s,
36
36
  )
37
37
  end
38
38
 
39
39
  # @param another [ScopedPath]
40
- # @return [ScopedPath]
40
+ # @return [Path]
41
41
  def select_superclass(another)
42
- if %w(Object Exception).include?(another&.path&.to_s)
42
+ if %w(Object Exception).include?(another&.to_s)
43
43
  superclass_path || another
44
44
  else
45
45
  another || superclass_path
@@ -5,7 +5,12 @@ module Yoda
5
5
  module Query
6
6
  module Associators
7
7
  class AssociateAncestors
8
- class CircularReferenceError < StandardError; end
8
+ class CircularReferenceError < StandardError
9
+ # @param circular_scope [Objects::NamespaceObject, nil]
10
+ def initialize(circular_scope)
11
+ super("#{circular_scope&.path} appears twice")
12
+ end
13
+ end
9
14
 
10
15
  # @return [Registry]
11
16
  attr_reader :registry
@@ -16,11 +21,14 @@ module Yoda
16
21
  end
17
22
 
18
23
  # @param obj [Objects::Base]
24
+ # @return [Enumerator<Objects::NamespaceObject>]
19
25
  def associate(obj)
20
26
  if obj.is_a?(Objects::NamespaceObject)
21
- obj.ancestors = Enumerator.new do |yielder|
27
+ Enumerator.new do |yielder|
22
28
  Processor.new(registry).process(obj).each { |klass| yielder << klass }
23
29
  end
30
+ else
31
+ []
24
32
  end
25
33
  end
26
34
 
@@ -12,23 +12,26 @@ module Yoda
12
12
  end
13
13
 
14
14
  # @param obj [Object::Base]
15
+ # @return [Enumerator<Objects::MethodObject>]
15
16
  def associate(obj)
16
17
  if obj.is_a?(Objects::NamespaceObject)
17
- AssociateMethods.new(registry).associate(obj)
18
- obj.methods = Enumerator.new do |yielder|
18
+ Enumerator.new do |yielder|
19
19
  name_set = Set.new
20
20
 
21
- obj.ancestors.each do |ancestor|
21
+ AssociateAncestors.new(registry).associate(obj).each do |ancestor|
22
22
  ancestor.instance_method_addresses.each do |method_address|
23
23
  method_name = Objects::MethodObject.name_of_path(method_address)
24
- next name_set.has_key?(method_name)
25
- name_set.add(method_name)
26
- if el = registry.find(method_address)
27
- yielder << el
24
+ if !name_set.member?(method_name)
25
+ name_set.add(method_name)
26
+ if el = registry.find(method_address)
27
+ yielder << el
28
+ end
28
29
  end
29
30
  end
30
31
  end
31
32
  end
33
+ else
34
+ []
32
35
  end
33
36
  end
34
37
  end
@@ -78,8 +78,7 @@ module Yoda
78
78
  Enumerator.new do |yielder|
79
79
  met = Set.new
80
80
 
81
- Associators::AssociateAncestors.new(registry).associate(scope)
82
- scope.ancestors.each do |ancestor|
81
+ Associators::AssociateAncestors.new(registry).associate(scope).each do |ancestor|
83
82
  select_child_constants(ancestor, name).each do |obj|
84
83
  next if met.include?(obj.name)
85
84
  met.add(obj.name)
@@ -27,29 +27,9 @@ module Yoda
27
27
  def lazy_select(namespace, expected, visibility: nil)
28
28
  visibility ||= %i(public private protected)
29
29
  Enumerator.new do |yielder|
30
- met = Set.new
31
-
32
- all_method_addresses(namespace).each do |address|
33
- name = Objects::MethodObject.name_of_path(address)
34
- if match_name?(name, expected)
35
- next if met.include?(name)
36
- if el = registry.find(address)
37
- met.add(name)
38
- yielder << el if visibility.include?(el.visibility)
39
- end
40
- end
41
- end
42
- end
43
- end
44
-
45
- # @param namespace [Objects::Namespace]
46
- # @return [Enumerator<Objects::MethodObject>]
47
- def all_method_addresses(namespace)
48
- Enumerator.new do |yielder|
49
- Associators::AssociateAncestors.new(registry).associate(namespace)
50
- namespace.ancestors.each do |ancestor|
51
- ancestor.instance_method_addresses.each do |address|
52
- yielder << address
30
+ Associators::AssociateMethods.new(registry).associate(namespace).each do |method|
31
+ if match_name?(method.name, expected) && visibility.include?(method.visibility)
32
+ yielder << method
53
33
  end
54
34
  end
55
35
  end
@@ -5,7 +5,7 @@ module Yoda
5
5
  module Store
6
6
  class Registry
7
7
  # @note This number must be updated when breaking change is added.
8
- REGISTRY_VERSION = 1
8
+ REGISTRY_VERSION = 2
9
9
 
10
10
  PROJECT_STATUS_KEY = '%project_status'
11
11
 
@@ -39,7 +39,7 @@ module Yoda
39
39
  def register(code_object)
40
40
  return if @registered.member?(code_object.path)
41
41
  @registered.add(code_object.path)
42
- register(code_object.parent) if code_object.parent && !code_object.parent.root?
42
+ register(code_object.parent) if code_object.parent
43
43
 
44
44
  new_objects = begin
45
45
  case code_object.type
@@ -64,7 +64,9 @@ module Yoda
64
64
  end
65
65
  end
66
66
 
67
- register_to_parent_proxy(code_object) if code_object.parent && code_object.parent.type == :proxy
67
+ # In YARD, proxy module is undetermined its absolute path and its defined namespace is undetermined.
68
+ # In Yoda, proxy module is assumed to be defined directory under parent namespace.
69
+ register_to_parent(code_object) if code_object.parent && (code_object.type == :proxy || code_object.parent.type == :proxy)
68
70
  [new_objects].flatten.compact.each { |new_object| patch.register(new_object) }
69
71
  end
70
72
 
@@ -79,7 +81,7 @@ module Yoda
79
81
  tag_list: code_object.tags.map { |tag| convert_tag(tag, '') },
80
82
  sources: code_object.files.map(&method(:convert_source)),
81
83
  primary_source: code_object[:current_file_has_comments] ? convert_source(code_object.files.first) : nil,
82
- instance_method_addresses: code_object.meths(included: false, scope: :instance).map(&:path),
84
+ instance_method_addresses: code_object.meths(included: false, scope: :instance).map { |meth| path_to_store(meth) },
83
85
  mixin_addresses: code_object.instance_mixins.map { |mixin| path_to_store(mixin) },
84
86
  constant_addresses: (code_object.children.select{ |child| %i(constant module class).include?(child.type) }.map { |constant| constant.path } + ['Object']).uniq,
85
87
  )
@@ -87,7 +89,7 @@ module Yoda
87
89
  path: path_to_store(code_object),
88
90
  sources: code_object.files.map(&method(:convert_source)),
89
91
  primary_source: code_object[:current_file_has_comments] ? convert_source(code_object.files.first) : nil,
90
- instance_method_addresses: code_object.meths(included: false, scope: :class).map(&:path),
92
+ instance_method_addresses: code_object.meths(included: false, scope: :class).map { |meth| path_to_store(meth) },
91
93
  mixin_addresses: code_object.instance_mixins.map { |mixin| path_to_store(mixin) },
92
94
  )
93
95
  [object_class, object_meta_class]
@@ -149,7 +151,7 @@ module Yoda
149
151
  tag_list: code_object.tags.map { |tag| convert_tag(tag, path_to_store(code_object)) },
150
152
  sources: code_object.files.map(&method(:convert_source)),
151
153
  primary_source: code_object[:current_file_has_comments] ? convert_source(code_object.files.first) : nil,
152
- instance_method_addresses: code_object.meths(included: false, scope: :instance).map(&:path),
154
+ instance_method_addresses: code_object.meths(included: false, scope: :instance).map { |meth| path_to_store(meth) },
153
155
  mixin_addresses: code_object.instance_mixins.map { |mixin| path_to_store(mixin) },
154
156
  constant_addresses: code_object.children.select{ |child| %i(constant module class).include?(child.type) }.map { |constant| constant.path },
155
157
  )
@@ -158,7 +160,7 @@ module Yoda
158
160
  path: path_to_store(code_object),
159
161
  sources: code_object.files.map(&method(:convert_source)),
160
162
  primary_source: code_object[:current_file_has_comments] ? convert_source(code_object.files.first) : nil,
161
- instance_method_addresses: code_object.meths(included: false, scope: :class).map(&:path),
163
+ instance_method_addresses: code_object.meths(included: false, scope: :class).map { |meth| path_to_store(meth) },
162
164
  mixin_addresses: code_object.instance_mixins.map { |mixin| path_to_store(mixin) },
163
165
  )
164
166
 
@@ -174,7 +176,7 @@ module Yoda
174
176
  tag_list: code_object.tags.map { |tag| convert_tag(tag, path_to_store(code_object)) },
175
177
  sources: code_object.files.map(&method(:convert_source)),
176
178
  primary_source: code_object[:current_file_has_comments] ? convert_source(code_object.files.first) : nil,
177
- instance_method_addresses: code_object.meths(included: false, scope: :instance).map(&:path),
179
+ instance_method_addresses: code_object.meths(included: false, scope: :instance).map { |meth| path_to_store(meth) },
178
180
  mixin_addresses: code_object.instance_mixins.map { |mixin| path_to_store(mixin) },
179
181
  constant_addresses: code_object.children.select{ |child| %i(constant module class).include?(child.type) }.map { |constant| path_to_store(constant) },
180
182
  superclass_path: !code_object.superclass || code_object.superclass&.path == 'Qnil' ? nil : path_to_store(code_object.superclass),
@@ -184,7 +186,7 @@ module Yoda
184
186
  path: path_to_store(code_object),
185
187
  sources: code_object.files.map(&method(:convert_source)),
186
188
  primary_source: code_object[:current_file_has_comments] ? convert_source(code_object.files.first) : nil,
187
- instance_method_addresses: code_object.meths(included: false, scope: :class).map(&:path),
189
+ instance_method_addresses: code_object.meths(included: false, scope: :class).map { |meth| path_to_store(meth) },
188
190
  mixin_addresses: code_object.class_mixins.map { |mixin| path_to_store(mixin) },
189
191
  )
190
192
 
@@ -250,10 +252,10 @@ module Yoda
250
252
 
251
253
  # @param code_object [::YARD::CodeObjects::Base]
252
254
  # @return [vaid]
253
- def register_to_parent_proxy(code_object)
254
- proxy_module = patch.find(path_to_store(code_object.parent))
255
- proxy_module.instance_method_addresses.push(path_to_store(code_object)) if code_object.type == :method
256
- proxy_module.constant_addresses.push(path_to_store(code_object)) if [:class, :module, :proxy].include?(code_object.type)
255
+ def register_to_parent(code_object)
256
+ parent_module = patch.find(path_to_store(code_object.parent))
257
+ parent_module.instance_method_addresses.push(path_to_store(code_object)) if code_object.type == :method
258
+ parent_module.constant_addresses.push(path_to_store(code_object)) if [:class, :module, :proxy].include?(code_object.type)
257
259
  end
258
260
 
259
261
  # @param source [(String, Integer)]
@@ -271,13 +273,13 @@ module Yoda
271
273
  end
272
274
 
273
275
  # @param code_object [::YARD::CodeObjects::Base]
274
- # @return [String]
276
+ # @return [String] absolute object path to store.
275
277
  def calc_path_to_store(object)
276
278
  return 'Object' if object.root?
277
279
  parent_path = path_to_store(object.parent)
278
280
 
279
281
  if object.type == :proxy || object.is_a?(YARD::CodeObjects::Proxy)
280
- # For now, we suppose the proxy object exists directly under its lexical namespace.
282
+ # For now, we suppose the proxy object exists directly under its namespace.
281
283
  [path_to_store(object.parent), object.name].join('::')
282
284
  elsif object.parent.path == path_to_store(object.parent)
283
285
  object.path
@@ -1,3 +1,3 @@
1
1
  module Yoda
2
- VERSION = "0.7.1"
2
+ VERSION = "0.7.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yoda-language-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomoya Chiba
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-30 00:00:00.000000000 Z
11
+ date: 2018-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yard