rucoa 0.8.0 → 0.9.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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/data/definitions_ruby_3_1 +0 -0
  4. data/lib/rucoa/definition_store.rb +114 -54
  5. data/lib/rucoa/definitions/class_definition.rb +70 -4
  6. data/lib/rucoa/definitions/constant_definition.rb +7 -7
  7. data/lib/rucoa/definitions/method_definition.rb +4 -4
  8. data/lib/rucoa/handlers/initialized_handler.rb +33 -5
  9. data/lib/rucoa/handlers/text_document_completion_handler.rb +1 -1
  10. data/lib/rucoa/handlers/text_document_definition_handler.rb +7 -7
  11. data/lib/rucoa/handlers/text_document_did_open_handler.rb +1 -4
  12. data/lib/rucoa/node_concerns/{name_full_qualifiable.rb → name_fully_qualifiable.rb} +2 -2
  13. data/lib/rucoa/node_concerns.rb +1 -1
  14. data/lib/rucoa/node_inspector.rb +18 -17
  15. data/lib/rucoa/nodes/base.rb +30 -5
  16. data/lib/rucoa/nodes/casgn_node.rb +1 -1
  17. data/lib/rucoa/nodes/cbase_node.rb +8 -0
  18. data/lib/rucoa/nodes/class_node.rb +62 -1
  19. data/lib/rucoa/nodes/const_node.rb +46 -5
  20. data/lib/rucoa/nodes/def_node.rb +11 -9
  21. data/lib/rucoa/nodes/defs_node.rb +21 -0
  22. data/lib/rucoa/nodes/lvar_node.rb +2 -1
  23. data/lib/rucoa/nodes/module_node.rb +1 -1
  24. data/lib/rucoa/nodes/send_node.rb +14 -10
  25. data/lib/rucoa/nodes.rb +1 -0
  26. data/lib/rucoa/parse_result.rb +29 -0
  27. data/lib/rucoa/parser.rb +40 -8
  28. data/lib/rucoa/parser_builder.rb +1 -0
  29. data/lib/rucoa/rbs/class_definition_mapper.rb +4 -4
  30. data/lib/rucoa/rbs/constant_definition_mapper.rb +2 -2
  31. data/lib/rucoa/rbs/module_definition_mapper.rb +2 -2
  32. data/lib/rucoa/rubocop/autocorrector.rb +2 -2
  33. data/lib/rucoa/rubocop/investigator.rb +2 -2
  34. data/lib/rucoa/server.rb +1 -1
  35. data/lib/rucoa/source.rb +42 -27
  36. data/lib/rucoa/source_store.rb +0 -13
  37. data/lib/rucoa/version.rb +1 -1
  38. data/lib/rucoa/yard/definitions_loader.rb +308 -59
  39. data/lib/rucoa/yard/type.rb +46 -0
  40. data/lib/rucoa/yard.rb +1 -1
  41. data/lib/rucoa.rb +1 -0
  42. metadata +6 -4
  43. data/lib/rucoa/yard/method_definition_mapper.rb +0 -215
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 26c4a8d526acb34d3722fc4b78e4c8fa0a1bac7bfc11d72af4b5962afdbc01c9
4
- data.tar.gz: b49e5bdca272898e10870fbad7f99b2ba5cf63e0d1acef074d3af1928b69058b
3
+ metadata.gz: 237fa68185426d66437c43fc2a3f34f7f85ee7309eb4ed6bb6ce4e31b5dfbb6e
4
+ data.tar.gz: e9f96daf65c7ccef564b2e06756497fd4d98bd946911487ca2fdd32740436e4b
5
5
  SHA512:
6
- metadata.gz: 4de0736efd9d7b44d7756bfe5aedf6fc60d0b3a9ce9ab55cb0e3c6b83ca0525017e0ddb629d612ec4c05a8cae97f1d902bf33a3090c00570765c344821393bf6
7
- data.tar.gz: 8228a81e3b4408274d2e51f2c339e724e4c4615f4af2a311bad68c48b74d32a09773cf5a0caaa780135780d7510b95aa64579ec6d009bf7fe711cb590660bde8
6
+ metadata.gz: 3698e9db246d46ce64314df9b4a7418278a6e9f65cc2e80dfece624b547c5ab238af42b456370d1096e872f6e30aefdb132b5b2bd435ec03d1e6cccdac0a908a
7
+ data.tar.gz: 5088d4dcc1fa5ad6e053a155246da87602071fa8283b4f42e1b4e9040b222be5f82622343ad2467b5cdf8003b02293e70ea8d391dc99f478ee36a1389311a9d4
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rucoa (0.8.0)
4
+ rucoa (0.9.0)
5
5
  parser
6
6
  rbs
7
7
  rubocop
Binary file
@@ -2,26 +2,69 @@
2
2
 
3
3
  module Rucoa
4
4
  class DefinitionStore
5
- # @return [Array<Rucoa::Definition::Base>]
6
- attr_accessor :definitions
7
-
8
5
  def initialize
9
- @definitions = []
6
+ @definition_by_full_qualified_name = {}
7
+ @fully_qualified_names_by_uri = ::Hash.new { |hash, key| hash[key] = [] }
10
8
  end
11
9
 
12
- # @param source_path [String]
13
- # @return [Array<Rucoa::Definition::Base>]
14
- def update_definitions_defined_in(source_path, definitions:)
15
- delete_definitions_defined_in(source_path)
16
- @definitions += definitions
10
+ # @param definitions [Array<Rucoa::Definition::Base>]
11
+ # @return [void]
12
+ def bulk_add(definitions)
13
+ definitions.each do |definition|
14
+ @fully_qualified_names_by_uri["file://#{definition.source_path}"] << definition.fully_qualified_name
15
+ @definition_by_full_qualified_name[definition.fully_qualified_name] = definition
16
+ end
17
17
  end
18
18
 
19
- # @param full_qualified_name [String]
20
- # @return [Array<Rucoa::Definitions::Base>]
21
- def select_by_full_qualified_name(full_qualified_name)
22
- @definitions.select do |definition|
23
- definition.full_qualified_name == full_qualified_name
19
+ # @param source [Rucoa::Source]
20
+ # @return [void]
21
+ # @example resolves super class name correctly by using existent definitions
22
+ # definition_store = Rucoa::DefinitionStore.new
23
+ # foo = Rucoa::Source.new(
24
+ # content: <<~RUBY,
25
+ # module A
26
+ # class Foo
27
+ # end
28
+ # end
29
+ # RUBY
30
+ # uri: 'file:///path/to/a/foo.rb',
31
+ # )
32
+ # definition_store.update_from(foo)
33
+ # bar = Rucoa::Source.new(
34
+ # content: <<~RUBY,
35
+ # module A
36
+ # class Bar < Foo
37
+ # end
38
+ # end
39
+ # RUBY
40
+ # uri: 'file:///path/to/a/bar.rb',
41
+ # )
42
+ # definition_store.update_from(bar)
43
+ # definition = definition_store.find_definition_by_fully_qualified_name('A::Bar')
44
+ # expect(definition.super_class_fully_qualified_name).to eq('A::Foo')
45
+ def update_from(source)
46
+ delete_definitions_about(source)
47
+
48
+ # Need to store definitions before super class resolution.
49
+ source.definitions.group_by(&:source_path).each do |source_path, definitions|
50
+ @fully_qualified_names_by_uri["file://#{source_path}"] += definitions.map(&:fully_qualified_name)
51
+ definitions.each do |definition|
52
+ @definition_by_full_qualified_name[definition.fully_qualified_name] = definition
53
+ end
24
54
  end
55
+
56
+ source.definitions.each do |definition|
57
+ next unless definition.is_a?(Definitions::ClassDefinition)
58
+ next if definition.super_class_resolved?
59
+
60
+ definition.super_class_fully_qualified_name = resolve_super_class_of(definition)
61
+ end
62
+ end
63
+
64
+ # @param fully_qualified_name [String]
65
+ # @return [Rucoa::Definitions::Base, nil]
66
+ def find_definition_by_fully_qualified_name(fully_qualified_name)
67
+ @definition_by_full_qualified_name[fully_qualified_name]
25
68
  end
26
69
 
27
70
  # @param method_name [String]
@@ -30,20 +73,29 @@ module Rucoa
30
73
  # @return [Rucoa::Definition::MethodDefinition, nil]
31
74
  # @example has the ability to find `IO.write` from `File.write`
32
75
  # definition_store = Rucoa::DefinitionStore.new
33
- # definition_store.definitions += Rucoa::DefinitionArchiver.load
76
+ # definition_store.bulk_add(Rucoa::DefinitionArchiver.load)
34
77
  # subject = definition_store.find_method_definition_by(
35
78
  # method_name: 'write',
36
79
  # namespace: 'File',
37
80
  # singleton: true
38
81
  # )
39
- # expect(subject.full_qualified_name).to eq('IO.write')
82
+ # expect(subject.fully_qualified_name).to eq('IO.write')
40
83
  def find_method_definition_by(method_name:, namespace:, singleton: false)
41
- if singleton
42
- singleton_method_definitions_of(namespace)
43
- else
44
- instance_method_definitions_of(namespace)
45
- end.find do |method_definition|
46
- method_definition.method_name == method_name
84
+ definition = find_definition_by_fully_qualified_name(namespace)
85
+ return unless definition
86
+
87
+ [
88
+ namespace,
89
+ *ancestor_definitions_of(definition).map(&:fully_qualified_name)
90
+ ].find do |fully_qualified_name|
91
+ method_marker = singleton ? '.' : '#'
92
+ fully_qualified_method_name = [
93
+ fully_qualified_name,
94
+ method_marker,
95
+ method_name
96
+ ].join
97
+ definition = find_definition_by_fully_qualified_name(fully_qualified_method_name)
98
+ break definition if definition
47
99
  end
48
100
  end
49
101
 
@@ -51,28 +103,28 @@ module Rucoa
51
103
  # @return [Array<Rucoa::Definitions::MethodDefinition>]
52
104
  # @example includes ancestors' methods
53
105
  # definition_store = Rucoa::DefinitionStore.new
54
- # definition_store.definitions += Rucoa::DefinitionArchiver.load
106
+ # definition_store.bulk_add(Rucoa::DefinitionArchiver.load)
55
107
  # subject = definition_store.instance_method_definitions_of('File')
56
- # expect(subject.map(&:full_qualified_name)).to include('IO#raw')
108
+ # expect(subject.map(&:fully_qualified_name)).to include('IO#raw')
57
109
  # @example responds to `singleton<File>`
58
110
  # definition_store = Rucoa::DefinitionStore.new
59
- # definition_store.definitions += Rucoa::DefinitionArchiver.load
111
+ # definition_store.bulk_add(Rucoa::DefinitionArchiver.load)
60
112
  # subject = definition_store.instance_method_definitions_of('singleton<File>')
61
- # expect(subject.map(&:full_qualified_name)).to include('IO.write')
113
+ # expect(subject.map(&:fully_qualified_name)).to include('IO.write')
62
114
  def instance_method_definitions_of(type)
63
115
  singleton_class_name = singleton_class_name_from(type)
64
116
  return singleton_method_definitions_of(singleton_class_name) if singleton_class_name
65
117
 
66
- class_or_module_definition = find_class_or_module_definition(type)
118
+ class_or_module_definition = find_definition_by_fully_qualified_name(type)
67
119
  return [] unless class_or_module_definition
68
120
 
69
121
  definitions = instance_method_definitions
70
122
  [
71
123
  class_or_module_definition,
72
124
  *ancestor_definitions_of(class_or_module_definition)
73
- ].map(&:full_qualified_name).flat_map do |full_qualified_type_name|
125
+ ].map(&:fully_qualified_name).flat_map do |fully_qualified_type_name|
74
126
  definitions.select do |definition|
75
- definition.namespace == full_qualified_type_name
127
+ definition.namespace == fully_qualified_type_name
76
128
  end
77
129
  end
78
130
  end
@@ -81,29 +133,24 @@ module Rucoa
81
133
  # @return [Array<Rucoa::Definitions::MethodDefinition>]
82
134
  # @example returns singleton method definitions of File
83
135
  # definition_store = Rucoa::DefinitionStore.new
84
- # definition_store.definitions += Rucoa::DefinitionArchiver.load
136
+ # definition_store.bulk_add(Rucoa::DefinitionArchiver.load)
85
137
  # subject = definition_store.singleton_method_definitions_of('File')
86
- # expect(subject.map(&:full_qualified_name)).to include('IO.write')
138
+ # expect(subject.map(&:fully_qualified_name)).to include('IO.write')
87
139
  def singleton_method_definitions_of(type)
88
- class_or_module_definition = find_class_or_module_definition(type)
140
+ class_or_module_definition = find_definition_by_fully_qualified_name(type)
89
141
  return [] unless class_or_module_definition
90
142
 
91
143
  definitions = singleton_method_definitions
92
144
  [
93
145
  class_or_module_definition,
94
146
  *ancestor_definitions_of(class_or_module_definition)
95
- ].map(&:full_qualified_name).flat_map do |full_qualified_type_name|
147
+ ].map(&:fully_qualified_name).flat_map do |fully_qualified_type_name|
96
148
  definitions.select do |definition|
97
- definition.namespace == full_qualified_type_name
149
+ definition.namespace == fully_qualified_type_name
98
150
  end
99
151
  end
100
152
  end
101
153
 
102
- # @return [Array<Rucoa::Definition::ConstantDefinition>]
103
- def constant_definitions
104
- @definitions.grep(Definitions::ConstantDefinition)
105
- end
106
-
107
154
  # @param namespace [String]
108
155
  # @return [Array<Rucoa::Definitions::ConstantDefinition>] e.g. File::Separator, File::SEPARATOR, etc.
109
156
  def constant_definitions_under(namespace)
@@ -114,6 +161,15 @@ module Rucoa
114
161
 
115
162
  private
116
163
 
164
+ # @param source [Rucoa::Source]
165
+ # @return [void]
166
+ def delete_definitions_about(source)
167
+ @fully_qualified_names_by_uri[source.uri].each do |fully_qualified_name|
168
+ @definition_by_full_qualified_name.delete(fully_qualified_name)
169
+ end
170
+ @fully_qualified_names_by_uri.delete(source.uri)
171
+ end
172
+
117
173
  # @param type [String]
118
174
  # @return [String, nil]
119
175
  def singleton_class_name_from(type)
@@ -127,8 +183,8 @@ module Rucoa
127
183
 
128
184
  result = []
129
185
  class_definition = class_or_module_definition
130
- while (super_class_name = class_definition.super_class_name)
131
- class_definition = find_class_or_module_definition(super_class_name)
186
+ while (super_class_fully_qualified_name = class_definition.super_class_fully_qualified_name)
187
+ class_definition = find_definition_by_fully_qualified_name(super_class_fully_qualified_name)
132
188
  break unless class_definition
133
189
 
134
190
  result << class_definition
@@ -136,17 +192,14 @@ module Rucoa
136
192
  result
137
193
  end
138
194
 
139
- # @param type [String]
140
- # @return [Rucoa::Definitions::Class, Rucoa::Definitions::Module, nil]
141
- def find_class_or_module_definition(type)
142
- @definitions.find do |definition|
143
- definition.full_qualified_name == type
144
- end
195
+ # @return [Array<Rucoa::Definitions::Base>]
196
+ def definitions
197
+ @definition_by_full_qualified_name.values
145
198
  end
146
199
 
147
200
  # @return [Array<Rucoa::Definition::MethodDefinition>]
148
201
  def method_definitions
149
- @definitions.grep(Definitions::MethodDefinition)
202
+ definitions.grep(Definitions::MethodDefinition)
150
203
  end
151
204
 
152
205
  # @return [Array<Rucoa::Definition::MethodDefinition>]
@@ -159,12 +212,19 @@ module Rucoa
159
212
  method_definitions.select(&:singleton_method?)
160
213
  end
161
214
 
162
- # @param source_path [String]
163
- # @return [Array<Rucoa::Definition::Base>]
164
- def delete_definitions_defined_in(source_path)
165
- @definitions.delete_if do |definition|
166
- definition.source_path == source_path
167
- end
215
+ # @return [Array<Rucoa::Definition::ConstantDefinition>]
216
+ def constant_definitions
217
+ definitions.grep(Definitions::ConstantDefinition)
218
+ end
219
+
220
+ # @param class_definition [Rucoa::Definitions::ClassDefinition]
221
+ # @return [String]
222
+ def resolve_super_class_of(class_definition)
223
+ return 'Object' unless class_definition.super_class_chained_name
224
+
225
+ class_definition.super_class_candidates.find do |candidate|
226
+ find_definition_by_fully_qualified_name(candidate)
227
+ end || class_definition.super_class_chained_name
168
228
  end
169
229
  end
170
230
  end
@@ -3,13 +3,79 @@
3
3
  module Rucoa
4
4
  module Definitions
5
5
  class ClassDefinition < ModuleDefinition
6
+ # @return [Arra<String>, nil]
7
+ attr_reader :module_nesting
8
+
9
+ # @return [String, nil]
10
+ attr_reader :super_class_chained_name
11
+
6
12
  # @return [String, nil]
7
- attr_reader :super_class_name
13
+ attr_accessor :super_class_fully_qualified_name
8
14
 
9
- # @param super_class_name [String, nil]
10
- def initialize(super_class_name:, **keyword_arguments)
15
+ # @param module_nesting [Array<String>, nil]
16
+ # @param super_class_chained_name [String, nil]
17
+ # @param super_class_fully_qualified_name [String, nil]
18
+ def initialize(
19
+ module_nesting: nil,
20
+ super_class_chained_name: nil,
21
+ super_class_fully_qualified_name: nil,
22
+ **keyword_arguments
23
+ )
11
24
  super(**keyword_arguments)
12
- @super_class_name = super_class_name
25
+ @module_nesting = module_nesting
26
+ @super_class_chained_name = super_class_chained_name
27
+ @super_class_fully_qualified_name = super_class_fully_qualified_name
28
+ end
29
+
30
+ # @return [Boolean]
31
+ # @example returns false on not-resolved case
32
+ # definition = Rucoa::Definitions::ClassDefinition.new(
33
+ # fully_qualified_name: 'Foo',
34
+ # source_path: '/path/to/foo.rb',
35
+ # super_class_chained_name: 'Bar'
36
+ # )
37
+ # expect(definition).not_to be_super_class_resolved
38
+ # @example returns true on resolved case
39
+ # definition = Rucoa::Definitions::ClassDefinition.new(
40
+ # fully_qualified_name: 'Foo',
41
+ # source_path: '/path/to/foo.rb',
42
+ # super_class_chained_name: 'Bar',
43
+ # super_class_fully_qualified_name: 'Bar'
44
+ # )
45
+ # expect(definition).to be_super_class_resolved
46
+ def super_class_resolved?
47
+ !@super_class_fully_qualified_name.nil?
48
+ end
49
+
50
+ # @return [Array<String>]
51
+ # @example returns candidates of super class fully qualified name
52
+ # class_definition = Rucoa::Definitions::ClassDefinition.new(
53
+ # fully_qualified_name: nil,
54
+ # module_nesting: %w[B::A B],
55
+ # source_path: '/path/to/b/a/c.rb',
56
+ # super_class_chained_name: 'C'
57
+ # )
58
+ # expect(class_definition.super_class_candidates).to eq(
59
+ # %w[B::A::C B::C C]
60
+ # )
61
+ # @example returns only correct answer if it's already resolved
62
+ # class_definition = Rucoa::Definitions::ClassDefinition.new(
63
+ # fully_qualified_name: 'B::A::C',
64
+ # source_path: '/path/to/b/a/c.rb',
65
+ # super_class_fully_qualified_name: 'B::A::C'
66
+ # )
67
+ # expect(class_definition.super_class_candidates).to eq(
68
+ # %w[B::A::C]
69
+ # )
70
+ def super_class_candidates
71
+ return [super_class_fully_qualified_name] if super_class_resolved?
72
+
73
+ module_nesting.map do |chained_name|
74
+ [
75
+ chained_name,
76
+ super_class_chained_name
77
+ ].join('::')
78
+ end + [super_class_chained_name]
13
79
  end
14
80
  end
15
81
  end
@@ -5,23 +5,23 @@ module Rucoa
5
5
  # Represents class definition, module definition, or constant assignment.
6
6
  class ConstantDefinition < Base
7
7
  # @return [String]
8
- attr_reader :full_qualified_name
8
+ attr_reader :fully_qualified_name
9
9
 
10
10
  # @return [String]
11
11
  attr_reader :source_path
12
12
 
13
- # @param full_qualified_name [String]
13
+ # @param fully_qualified_name [String]
14
14
  # @param source_path [String]
15
- def initialize(full_qualified_name:, source_path:)
15
+ def initialize(fully_qualified_name:, source_path:)
16
16
  super()
17
- @full_qualified_name = full_qualified_name
17
+ @fully_qualified_name = fully_qualified_name
18
18
  @source_path = source_path
19
19
  end
20
20
 
21
21
  # @return [String]
22
22
  # @example returns non-full-qualified name
23
23
  # definition = Rucoa::Definitions::ConstantDefinition.new(
24
- # full_qualified_name: 'Foo::Bar::Baz',
24
+ # fully_qualified_name: 'Foo::Bar::Baz',
25
25
  # source_path: '/path/to/foo/bar/baz.rb'
26
26
  # )
27
27
  # expect(definition.name).to eq('Baz')
@@ -32,7 +32,7 @@ module Rucoa
32
32
  # @return [String]
33
33
  # @example returns namespace
34
34
  # definition = Rucoa::Definitions::ConstantDefinition.new(
35
- # full_qualified_name: 'Foo::Bar::Baz',
35
+ # fully_qualified_name: 'Foo::Bar::Baz',
36
36
  # source_path: '/path/to/foo/bar/baz.rb'
37
37
  # )
38
38
  # expect(definition.namespace).to eq('Foo::Bar')
@@ -44,7 +44,7 @@ module Rucoa
44
44
 
45
45
  # @return [Array<String>]
46
46
  def names
47
- @names ||= full_qualified_name.split('::')
47
+ @names ||= fully_qualified_name.split('::')
48
48
  end
49
49
  end
50
50
  end
@@ -51,8 +51,8 @@ module Rucoa
51
51
  # source_path: '/path/to/foo/bar.rb',
52
52
  # types: []
53
53
  # )
54
- # expect(method_definition.full_qualified_name).to eq('Foo::Bar#foo')
55
- def full_qualified_name
54
+ # expect(method_definition.fully_qualified_name).to eq('Foo::Bar#foo')
55
+ def fully_qualified_name
56
56
  [
57
57
  @namespace,
58
58
  method_kind_symbol,
@@ -105,8 +105,8 @@ module Rucoa
105
105
  def signatures
106
106
  @types.map do |type|
107
107
  format(
108
- '%<full_qualified_name>s(%<parameters>s) -> %<return_types>s',
109
- full_qualified_name: full_qualified_name,
108
+ '%<fully_qualified_name>s(%<parameters>s) -> %<return_types>s',
109
+ fully_qualified_name: fully_qualified_name,
110
110
  parameters: type.parameters_string,
111
111
  return_types: type.return_type
112
112
  )
@@ -7,16 +7,44 @@ module Rucoa
7
7
 
8
8
  def call
9
9
  request_workspace_configuration
10
- load_definitions
10
+ update_source_store
11
+ update_definition_store
11
12
  end
12
13
 
13
14
  private
14
15
 
15
16
  # @return [void]
16
- def load_definitions
17
- Yard::DefinitionsLoader.load_globs(
18
- globs: ::YARD::Parser::SourceParser::DEFAULT_PATH_GLOB
19
- )
17
+ def update_definition_store
18
+ sources.each do |source|
19
+ definition_store.update_from(source)
20
+ end
21
+ end
22
+
23
+ # @return [void]
24
+ def update_source_store
25
+ sources.each do |source|
26
+ source_store.update(source)
27
+ end
28
+ end
29
+
30
+ # @return [Array<Rucoa::Source>]
31
+ def sources
32
+ @sources ||= pathnames.map do |pathname|
33
+ Source.new(
34
+ content: pathname.read,
35
+ uri: "file://#{pathname}"
36
+ )
37
+ end
38
+ end
39
+
40
+ # @return [Array<Pathname>]
41
+ def pathnames
42
+ ::Pathname.glob(glob)
43
+ end
44
+
45
+ # @return [String]
46
+ def glob
47
+ ::File.expand_path('{app,lib}/**/*.rb')
20
48
  end
21
49
  end
22
50
  end
@@ -163,7 +163,7 @@ module Rucoa
163
163
  # @return [Rucoa::Node, nil]
164
164
  def node
165
165
  @node ||=
166
- if source.syntax_error?
166
+ if source.failed_to_parse?
167
167
  repair
168
168
  repaired_node
169
169
  else
@@ -94,8 +94,8 @@ module Rucoa
94
94
 
95
95
  # @return [Rucoa::Nodes::ClassNode, nil]
96
96
  def find_class_node
97
- find_by_full_qualified_name(
98
- full_qualified_name: definition.full_qualified_name,
97
+ find_by_fully_qualified_name(
98
+ fully_qualified_name: definition.fully_qualified_name,
99
99
  klass: Nodes::ClassNode
100
100
  ) || find_by_name(
101
101
  klass: Nodes::ClassNode,
@@ -105,8 +105,8 @@ module Rucoa
105
105
 
106
106
  # @return [Rucoa::Nodes::ModuleNode, nil]
107
107
  def find_module_node
108
- find_by_full_qualified_name(
109
- full_qualified_name: definition.full_qualified_name,
108
+ find_by_fully_qualified_name(
109
+ fully_qualified_name: definition.fully_qualified_name,
110
110
  klass: Nodes::ModuleNode
111
111
  ) || find_by_name(
112
112
  klass: Nodes::ModuleNode,
@@ -123,13 +123,13 @@ module Rucoa
123
123
  end
124
124
  end
125
125
 
126
- # @param full_qualified_name [String]
126
+ # @param fully_qualified_name [String]
127
127
  # @param klass [Class]
128
128
  # @return [Rucoa::Nodes::Base, nil]
129
- def find_by_full_qualified_name(full_qualified_name:, klass:)
129
+ def find_by_fully_qualified_name(fully_qualified_name:, klass:)
130
130
  location_root_or_descendant_nodes.reverse.find do |node|
131
131
  node.is_a?(klass) &&
132
- node.full_qualified_name == full_qualified_name
132
+ node.fully_qualified_name == fully_qualified_name
133
133
  end
134
134
  end
135
135
 
@@ -7,10 +7,7 @@ module Rucoa
7
7
 
8
8
  def call
9
9
  source_store.update(source)
10
- definition_store.update_definitions_defined_in(
11
- source.path,
12
- definitions: source.definitions
13
- )
10
+ definition_store.update_from(source)
14
11
  publish_diagnostics_on(uri)
15
12
  end
16
13
 
@@ -2,9 +2,9 @@
2
2
 
3
3
  module Rucoa
4
4
  module NodeConcerns
5
- module NameFullQualifiable
5
+ module NameFullyQualifiable
6
6
  # @return [String]
7
- def full_qualified_name
7
+ def fully_qualified_name
8
8
  [
9
9
  name,
10
10
  *each_ancestor(:class, :constant, :module).map(&:name)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Rucoa
4
4
  module NodeConcerns
5
- autoload :NameFullQualifiable, 'rucoa/node_concerns/name_full_qualifiable'
5
+ autoload :NameFullyQualifiable, 'rucoa/node_concerns/name_fully_qualifiable'
6
6
  end
7
7
  end
@@ -90,20 +90,20 @@ module Rucoa
90
90
  def constant_definition
91
91
  return unless @node.is_a?(Nodes::ConstNode)
92
92
 
93
- module_nesting_full_qualified_names = @node.each_ancestor(:class, :module).map(&:full_qualified_name)
94
- candidate_full_qualified_names = module_nesting_full_qualified_names.flat_map do |module_nesting_full_qualified_name|
93
+ module_nesting = @node.module_nesting
94
+ candidate_fully_qualified_names = module_nesting.flat_map do |module_nesting_fully_qualified_name|
95
95
  [
96
- module_nesting_full_qualified_name
97
- # TODO: *ancestors_of(module_nesting_full_qualified_name)
98
- ].map do |full_qualified_name|
96
+ module_nesting_fully_qualified_name
97
+ # TODO: *ancestors_of(module_nesting_fully_qualified_name)
98
+ ].map do |fully_qualified_name|
99
99
  [
100
- full_qualified_name,
100
+ fully_qualified_name,
101
101
  @node.chained_name
102
102
  ].join('::')
103
103
  end
104
104
  end + [@node.chained_name]
105
- candidate_full_qualified_names.find do |candidate_full_qualified_name|
106
- definition = @definition_store.select_by_full_qualified_name(candidate_full_qualified_name).first
105
+ candidate_fully_qualified_names.find do |candidate_fully_qualified_name|
106
+ definition = @definition_store.find_definition_by_fully_qualified_name(candidate_fully_qualified_name)
107
107
  break definition if definition
108
108
  end
109
109
  end
@@ -114,20 +114,21 @@ module Rucoa
114
114
  end
115
115
 
116
116
  # @return [String, nil]
117
- def nearest_def_full_qualified_name
118
- @node.each_ancestor(:def).first&.full_qualified_name
117
+ def nearest_def_fully_qualified_name
118
+ @node.each_ancestor(:def).first&.fully_qualified_name
119
119
  end
120
120
 
121
121
  # @return [Array<String>]
122
122
  def return_types_for_lvar
123
- full_qualified_name = nearest_def_full_qualified_name
124
- return [] unless full_qualified_name
123
+ fully_qualified_name = nearest_def_fully_qualified_name
124
+ return [] unless fully_qualified_name
125
125
 
126
- @definition_store.select_by_full_qualified_name(full_qualified_name).flat_map do |definition|
127
- definition.parameters.select do |parameter|
128
- parameter.name == @node.name
129
- end.flat_map(&:types)
130
- end
126
+ definition = @definition_store.find_definition_by_fully_qualified_name(fully_qualified_name)
127
+ return [] unless definition
128
+
129
+ definition.parameters.select do |parameter|
130
+ parameter.name == @node.name
131
+ end.flat_map(&:types)
131
132
  end
132
133
 
133
134
  # @return [Array<String>]