rucoa 0.8.0 → 0.9.0

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