rucoa 0.6.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +4 -1
  4. data/data/definitions_ruby_3_1 +0 -0
  5. data/lib/rucoa/configuration.rb +10 -0
  6. data/lib/rucoa/definition_store.rb +113 -6
  7. data/lib/rucoa/definitions/class_definition.rb +16 -0
  8. data/lib/rucoa/definitions/method_definition.rb +14 -2
  9. data/lib/rucoa/definitions/module_definition.rb +8 -0
  10. data/lib/rucoa/definitions.rb +2 -0
  11. data/lib/rucoa/handler_concerns/diagnostics_publishable.rb +14 -2
  12. data/lib/rucoa/handlers/initialize_handler.rb +1 -0
  13. data/lib/rucoa/handlers/initialized_handler.rb +1 -1
  14. data/lib/rucoa/handlers/text_document_completion_handler.rb +9 -2
  15. data/lib/rucoa/handlers/text_document_definition_handler.rb +155 -0
  16. data/lib/rucoa/handlers/text_document_did_close_handler.rb +20 -0
  17. data/lib/rucoa/handlers/text_document_formatting_handler.rb +2 -2
  18. data/lib/rucoa/handlers/text_document_hover_handler.rb +3 -4
  19. data/lib/rucoa/handlers/text_document_range_formatting_handler.rb +2 -2
  20. data/lib/rucoa/handlers.rb +2 -0
  21. data/lib/rucoa/node_inspector.rb +48 -15
  22. data/lib/rucoa/nodes/base.rb +2 -2
  23. data/lib/rucoa/nodes/const_node.rb +31 -0
  24. data/lib/rucoa/position.rb +1 -1
  25. data/lib/rucoa/rbs/class_definition_mapper.rb +46 -0
  26. data/lib/rucoa/{definition_builders/rbs_constant_definition_builder.rb → rbs/constant_definition_mapper.rb} +4 -8
  27. data/lib/rucoa/{definition_builders/rbs_method_definition_builder.rb → rbs/method_definition_mapper.rb} +4 -7
  28. data/lib/rucoa/rbs/module_definition_mapper.rb +40 -0
  29. data/lib/rucoa/rbs/ruby_definitions_loader.rb +82 -0
  30. data/lib/rucoa/rbs.rb +11 -0
  31. data/lib/rucoa/rubocop/autocorrector.rb +51 -0
  32. data/lib/rucoa/rubocop/configuration_checker.rb +44 -0
  33. data/lib/rucoa/rubocop/investigator.rb +59 -0
  34. data/lib/rucoa/rubocop.rb +9 -0
  35. data/lib/rucoa/server.rb +2 -0
  36. data/lib/rucoa/source.rb +11 -3
  37. data/lib/rucoa/version.rb +1 -1
  38. data/lib/rucoa/yard/definitions_loader.rb +85 -0
  39. data/lib/rucoa/{definition_builders/yard_method_definition_builder.rb → yard/method_definition_mapper.rb} +22 -25
  40. data/lib/rucoa/yard.rb +8 -0
  41. data/lib/rucoa.rb +3 -7
  42. metadata +19 -12
  43. data/lib/rucoa/definition_builders.rb +0 -9
  44. data/lib/rucoa/rbs_document_loader.rb +0 -43
  45. data/lib/rucoa/rubocop_autocorrector.rb +0 -38
  46. data/lib/rucoa/rubocop_configuration_checker.rb +0 -42
  47. data/lib/rucoa/rubocop_investigator.rb +0 -48
  48. data/lib/rucoa/yard_glob_document_loader.rb +0 -47
  49. data/lib/rucoa/yard_string_document_loader.rb +0 -70
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f31a0a81d1013267e3bfc0358911e1306e22f0b34f40249604050914da18d8f4
4
- data.tar.gz: b999e9fe78ee1dbb0b11662756c84399b474fb8522476429c90becb454fb0fd1
3
+ metadata.gz: 26c4a8d526acb34d3722fc4b78e4c8fa0a1bac7bfc11d72af4b5962afdbc01c9
4
+ data.tar.gz: b49e5bdca272898e10870fbad7f99b2ba5cf63e0d1acef074d3af1928b69058b
5
5
  SHA512:
6
- metadata.gz: 1af0f2fed0d7d7930f69768234263e77707f1f22d80e93392ae126c0cfa72d11b3356de6ba5c6f3476ff7b3f27239c1667ac1c2442e9e12301bdadb0a25fec47
7
- data.tar.gz: bdd44ba9cb0284a16589798ec20ee7d9e9bf01989e054108859f3f8286a3f6382a45d84be056dd7a755de8b14d4cf9e28610652489e8e57f9c009b1f81c7f432
6
+ metadata.gz: 4de0736efd9d7b44d7756bfe5aedf6fc60d0b3a9ce9ab55cb0e3c6b83ca0525017e0ddb629d612ec4c05a8cae97f1d902bf33a3090c00570765c344821393bf6
7
+ data.tar.gz: 8228a81e3b4408274d2e51f2c339e724e4c4615f4af2a311bad68c48b74d32a09773cf5a0caaa780135780d7510b95aa64579ec6d009bf7fe711cb590660bde8
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rucoa (0.6.0)
4
+ rucoa (0.8.0)
5
5
  parser
6
6
  rbs
7
7
  rubocop
data/README.md CHANGED
@@ -62,6 +62,10 @@ This extension supports the folowiing types of symbols:
62
62
 
63
63
  Provides completion items for constant names and method names.
64
64
 
65
+ ### Definition
66
+
67
+ Provides "Go to Definition" command to jump to the definition.
68
+
65
69
  ### Hover
66
70
 
67
71
  Shows documentation for the symbol under the cursor.
@@ -72,6 +76,5 @@ Shows method signature help when you start to type method arguments like `"100".
72
76
 
73
77
  ## Coming soon
74
78
 
75
- - Go to Definition
76
79
  - Highlight
77
80
  - Semantic Tokens
Binary file
@@ -16,6 +16,11 @@ module Rucoa
16
16
  disable_feature('completion')
17
17
  end
18
18
 
19
+ # @return [void]
20
+ def disable_definition
21
+ disable_feature('definition')
22
+ end
23
+
19
24
  # @return [void]
20
25
  def disable_diagnostics
21
26
  disable_feature('diagnostics')
@@ -82,6 +87,11 @@ module Rucoa
82
87
  enables_feature?('completion')
83
88
  end
84
89
 
90
+ # @return [Boolean]
91
+ def enables_definition?
92
+ enables_feature?('definition')
93
+ end
94
+
85
95
  # @return [Boolean]
86
96
  def enables_diagnostics?
87
97
  enables_feature?('diagnostics')
@@ -24,14 +24,86 @@ module Rucoa
24
24
  end
25
25
  end
26
26
 
27
+ # @param method_name [String]
27
28
  # @param namespace [String]
29
+ # @param singleton [Boolean]
30
+ # @return [Rucoa::Definition::MethodDefinition, nil]
31
+ # @example has the ability to find `IO.write` from `File.write`
32
+ # definition_store = Rucoa::DefinitionStore.new
33
+ # definition_store.definitions += Rucoa::DefinitionArchiver.load
34
+ # subject = definition_store.find_method_definition_by(
35
+ # method_name: 'write',
36
+ # namespace: 'File',
37
+ # singleton: true
38
+ # )
39
+ # expect(subject.full_qualified_name).to eq('IO.write')
40
+ 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
47
+ end
48
+ end
49
+
50
+ # @param type [String]
51
+ # @return [Array<Rucoa::Definitions::MethodDefinition>]
52
+ # @example includes ancestors' methods
53
+ # definition_store = Rucoa::DefinitionStore.new
54
+ # definition_store.definitions += Rucoa::DefinitionArchiver.load
55
+ # subject = definition_store.instance_method_definitions_of('File')
56
+ # expect(subject.map(&:full_qualified_name)).to include('IO#raw')
57
+ # @example responds to `singleton<File>`
58
+ # definition_store = Rucoa::DefinitionStore.new
59
+ # definition_store.definitions += Rucoa::DefinitionArchiver.load
60
+ # subject = definition_store.instance_method_definitions_of('singleton<File>')
61
+ # expect(subject.map(&:full_qualified_name)).to include('IO.write')
62
+ def instance_method_definitions_of(type)
63
+ singleton_class_name = singleton_class_name_from(type)
64
+ return singleton_method_definitions_of(singleton_class_name) if singleton_class_name
65
+
66
+ class_or_module_definition = find_class_or_module_definition(type)
67
+ return [] unless class_or_module_definition
68
+
69
+ definitions = instance_method_definitions
70
+ [
71
+ class_or_module_definition,
72
+ *ancestor_definitions_of(class_or_module_definition)
73
+ ].map(&:full_qualified_name).flat_map do |full_qualified_type_name|
74
+ definitions.select do |definition|
75
+ definition.namespace == full_qualified_type_name
76
+ end
77
+ end
78
+ end
79
+
80
+ # @param type [String]
28
81
  # @return [Array<Rucoa::Definitions::MethodDefinition>]
29
- def method_definitions_of(namespace)
30
- method_definitions.select do |method_definition|
31
- method_definition.namespace == namespace
82
+ # @example returns singleton method definitions of File
83
+ # definition_store = Rucoa::DefinitionStore.new
84
+ # definition_store.definitions += Rucoa::DefinitionArchiver.load
85
+ # subject = definition_store.singleton_method_definitions_of('File')
86
+ # expect(subject.map(&:full_qualified_name)).to include('IO.write')
87
+ def singleton_method_definitions_of(type)
88
+ class_or_module_definition = find_class_or_module_definition(type)
89
+ return [] unless class_or_module_definition
90
+
91
+ definitions = singleton_method_definitions
92
+ [
93
+ class_or_module_definition,
94
+ *ancestor_definitions_of(class_or_module_definition)
95
+ ].map(&:full_qualified_name).flat_map do |full_qualified_type_name|
96
+ definitions.select do |definition|
97
+ definition.namespace == full_qualified_type_name
98
+ end
32
99
  end
33
100
  end
34
101
 
102
+ # @return [Array<Rucoa::Definition::ConstantDefinition>]
103
+ def constant_definitions
104
+ @definitions.grep(Definitions::ConstantDefinition)
105
+ end
106
+
35
107
  # @param namespace [String]
36
108
  # @return [Array<Rucoa::Definitions::ConstantDefinition>] e.g. File::Separator, File::SEPARATOR, etc.
37
109
  def constant_definitions_under(namespace)
@@ -42,9 +114,34 @@ module Rucoa
42
114
 
43
115
  private
44
116
 
45
- # @return [Array<Rucoa::Definition::ConstantDefinition>]
46
- def constant_definitions
47
- @definitions.grep(Definitions::ConstantDefinition)
117
+ # @param type [String]
118
+ # @return [String, nil]
119
+ def singleton_class_name_from(type)
120
+ type[/singleton<(\w+)>/, 1]
121
+ end
122
+
123
+ # @param class_or_module_definition [Rucoa::Definitions::Class, Rucoa::Definitions::Module]
124
+ # @return [Array<Rucoa::Definitions::Class>]
125
+ def ancestor_definitions_of(class_or_module_definition)
126
+ return [] unless class_or_module_definition.is_a?(Definitions::ClassDefinition)
127
+
128
+ result = []
129
+ 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)
132
+ break unless class_definition
133
+
134
+ result << class_definition
135
+ end
136
+ result
137
+ end
138
+
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
48
145
  end
49
146
 
50
147
  # @return [Array<Rucoa::Definition::MethodDefinition>]
@@ -52,6 +149,16 @@ module Rucoa
52
149
  @definitions.grep(Definitions::MethodDefinition)
53
150
  end
54
151
 
152
+ # @return [Array<Rucoa::Definition::MethodDefinition>]
153
+ def instance_method_definitions
154
+ method_definitions.select(&:instance_method?)
155
+ end
156
+
157
+ # @return [Array<Rucoa::Definition::MethodDefinition>]
158
+ def singleton_method_definitions
159
+ method_definitions.select(&:singleton_method?)
160
+ end
161
+
55
162
  # @param source_path [String]
56
163
  # @return [Array<Rucoa::Definition::Base>]
57
164
  def delete_definitions_defined_in(source_path)
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rucoa
4
+ module Definitions
5
+ class ClassDefinition < ModuleDefinition
6
+ # @return [String, nil]
7
+ attr_reader :super_class_name
8
+
9
+ # @param super_class_name [String, nil]
10
+ def initialize(super_class_name:, **keyword_arguments)
11
+ super(**keyword_arguments)
12
+ @super_class_name = super_class_name
13
+ end
14
+ end
15
+ end
16
+ end
@@ -6,6 +6,9 @@ module Rucoa
6
6
  # @return [String, nil]
7
7
  attr_reader :description
8
8
 
9
+ # @return [Symbol]
10
+ attr_reader :kind
11
+
9
12
  # @return [String]
10
13
  attr_reader :method_name
11
14
 
@@ -110,12 +113,21 @@ module Rucoa
110
113
  end
111
114
  end
112
115
 
116
+ # @return [Boolean]
117
+ def instance_method?
118
+ @kind == :instance
119
+ end
120
+
121
+ # @return [Boolean]
122
+ def singleton_method?
123
+ !instance_method?
124
+ end
125
+
113
126
  private
114
127
 
115
128
  # @return [String]
116
129
  def method_kind_symbol
117
- case @kind
118
- when :instance
130
+ if instance_method?
119
131
  '#'
120
132
  else
121
133
  '.'
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rucoa
4
+ module Definitions
5
+ class ModuleDefinition < ConstantDefinition
6
+ end
7
+ end
8
+ end
@@ -3,7 +3,9 @@
3
3
  module Rucoa
4
4
  module Definitions
5
5
  autoload :Base, 'rucoa/definitions/base'
6
+ autoload :ClassDefinition, 'rucoa/definitions/class_definition'
6
7
  autoload :ConstantDefinition, 'rucoa/definitions/constant_definition'
7
8
  autoload :MethodDefinition, 'rucoa/definitions/method_definition'
9
+ autoload :ModuleDefinition, 'rucoa/definitions/module_definition'
8
10
  end
9
11
  end
@@ -16,6 +16,18 @@ module Rucoa
16
16
  )
17
17
  end
18
18
 
19
+ # @param uri [String]
20
+ # @return [void]
21
+ def clear_diagnostics_on(uri)
22
+ write(
23
+ method: 'textDocument/publishDiagnostics',
24
+ params: {
25
+ diagnostics: [],
26
+ uri: uri
27
+ }
28
+ )
29
+ end
30
+
19
31
  # @param uri [String]
20
32
  # @return [void]
21
33
  def publish_diagnostics_on(uri)
@@ -48,7 +60,7 @@ module Rucoa
48
60
 
49
61
  # @return [Array<Hash>]
50
62
  def call
51
- return [] unless RubocopConfigurationChecker.call
63
+ return [] unless Rubocop::ConfigurationChecker.call
52
64
 
53
65
  offenses.map do |offense|
54
66
  OffenseToDiagnosticMapper.call(
@@ -63,7 +75,7 @@ module Rucoa
63
75
 
64
76
  # @return [Array<RuboCop::Cop::Offense>]
65
77
  def offenses
66
- RubocopInvestigator.call(source: @source)
78
+ Rubocop::Investigator.call(source: @source)
67
79
  end
68
80
 
69
81
  class OffenseToDiagnosticMapper
@@ -13,6 +13,7 @@ module Rucoa
13
13
  .
14
14
  ]
15
15
  },
16
+ definitionProvider: true,
16
17
  documentFormattingProvider: true,
17
18
  documentRangeFormattingProvider: true,
18
19
  documentSymbolProvider: true,
@@ -14,7 +14,7 @@ module Rucoa
14
14
 
15
15
  # @return [void]
16
16
  def load_definitions
17
- YardGlobDocumentLoader.call(
17
+ Yard::DefinitionsLoader.load_globs(
18
18
  globs: ::YARD::Parser::SourceParser::DEFAULT_PATH_GLOB
19
19
  )
20
20
  end
@@ -148,7 +148,7 @@ module Rucoa
148
148
  # @return [Array<String>]
149
149
  def callable_method_definitions
150
150
  receiver_types.flat_map do |type|
151
- definition_store.method_definitions_of(type)
151
+ definition_store.instance_method_definitions_of(type)
152
152
  end
153
153
  end
154
154
 
@@ -208,7 +208,14 @@ module Rucoa
208
208
  if @repaired
209
209
  position.to_range
210
210
  else
211
- Range.from_parser_range(node.location.expression)
211
+ Range.from_parser_range(
212
+ case node
213
+ when Nodes::SendNode
214
+ node.location.selector
215
+ else
216
+ node.location.expression
217
+ end
218
+ )
212
219
  end
213
220
  end
214
221
  end
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rucoa
4
+ module Handlers
5
+ class TextDocumentDefinitionHandler < Base
6
+ def call
7
+ respond(location)
8
+ end
9
+
10
+ private
11
+
12
+ # @return [Hash, nil]
13
+ def location
14
+ return unless reponsible?
15
+
16
+ {
17
+ range: location_range.to_vscode_range,
18
+ uri: location_uri
19
+ }
20
+ end
21
+
22
+ # @return [Boolean]
23
+ def reponsible?
24
+ configuration.enables_definition? &&
25
+ !location_uri.nil? &&
26
+ !location_source.nil?
27
+ end
28
+
29
+ # @return [Rucoa::Range]
30
+ def location_range
31
+ return Range.from_parser_range(location_node.location.expression) if location_node
32
+
33
+ Position.new.to_range
34
+ end
35
+
36
+ # @return [String, nil]
37
+ def location_uri
38
+ return unless definition
39
+
40
+ if definition.source_path.start_with?('Untitled-')
41
+ "untitled:#{definition.source_path}"
42
+ else
43
+ "file://#{definition.source_path}"
44
+ end
45
+ end
46
+
47
+ # @return [Rucoa::Nodes::Base, nil]
48
+ def location_node
49
+ @location_node ||=
50
+ case definition
51
+ when Definitions::ClassDefinition
52
+ find_class_node
53
+ when Definitions::ModuleDefinition
54
+ find_module_node
55
+ when Definitions::MethodDefinition
56
+ find_method_node
57
+ end
58
+ end
59
+
60
+ # @return [Rucoa::Source, nil]
61
+ def location_source
62
+ source_store.get(location_uri)
63
+ end
64
+
65
+ # @return [Rucoa::Position]
66
+ def position
67
+ Position.from_vscode_position(
68
+ request.dig('params', 'position')
69
+ )
70
+ end
71
+
72
+ # @return [String]
73
+ def uri
74
+ request.dig('params', 'textDocument', 'uri')
75
+ end
76
+
77
+ # @return [Rucoa::Source, nil]
78
+ def source
79
+ source_store.get(uri)
80
+ end
81
+
82
+ # @return [Rucoa::Nodes::Base]
83
+ def node
84
+ source&.node_at(position)
85
+ end
86
+
87
+ # @return [Rucoa::Definitions::Base, nil]
88
+ def definition
89
+ @definition ||= NodeInspector.new(
90
+ definition_store: definition_store,
91
+ node: node
92
+ ).definitions.first
93
+ end
94
+
95
+ # @return [Rucoa::Nodes::ClassNode, nil]
96
+ def find_class_node
97
+ find_by_full_qualified_name(
98
+ full_qualified_name: definition.full_qualified_name,
99
+ klass: Nodes::ClassNode
100
+ ) || find_by_name(
101
+ klass: Nodes::ClassNode,
102
+ name: definition.name
103
+ )
104
+ end
105
+
106
+ # @return [Rucoa::Nodes::ModuleNode, nil]
107
+ def find_module_node
108
+ find_by_full_qualified_name(
109
+ full_qualified_name: definition.full_qualified_name,
110
+ klass: Nodes::ModuleNode
111
+ ) || find_by_name(
112
+ klass: Nodes::ModuleNode,
113
+ name: definition.name
114
+ )
115
+ end
116
+
117
+ # @return [Rucoa::Nodes::MethodNode, nil]
118
+ def find_method_node
119
+ location_root_or_descendant_nodes.reverse.find do |node|
120
+ node.is_a?(Nodes::DefNode) &&
121
+ node.name == definition.method_name &&
122
+ node.namespace == definition.namespace
123
+ end
124
+ end
125
+
126
+ # @param full_qualified_name [String]
127
+ # @param klass [Class]
128
+ # @return [Rucoa::Nodes::Base, nil]
129
+ def find_by_full_qualified_name(full_qualified_name:, klass:)
130
+ location_root_or_descendant_nodes.reverse.find do |node|
131
+ node.is_a?(klass) &&
132
+ node.full_qualified_name == full_qualified_name
133
+ end
134
+ end
135
+
136
+ # @param name [String]
137
+ # @param klass [Class]
138
+ # @return [Rucoa::Nodes::Base, nil]
139
+ def find_by_name(klass:, name:)
140
+ location_root_or_descendant_nodes.reverse.find do |node|
141
+ node.is_a?(klass) &&
142
+ node.name == name
143
+ end
144
+ end
145
+
146
+ # @return [Array<Rucoa::Nodes::Base>]
147
+ def location_root_or_descendant_nodes
148
+ @location_root_or_descendant_nodes ||= [
149
+ location_source.root_node,
150
+ *location_source.root_node.descendants
151
+ ]
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rucoa
4
+ module Handlers
5
+ class TextDocumentDidCloseHandler < Base
6
+ include HandlerConcerns::DiagnosticsPublishable
7
+
8
+ def call
9
+ clear_diagnostics_on(uri)
10
+ end
11
+
12
+ private
13
+
14
+ # @return [String]
15
+ def uri
16
+ request.dig('params', 'textDocument', 'uri')
17
+ end
18
+ end
19
+ end
20
+ end
@@ -13,7 +13,7 @@ module Rucoa
13
13
  def formattable?
14
14
  configuration.enables_formatting? &&
15
15
  source &&
16
- RubocopConfigurationChecker.call
16
+ Rubocop::ConfigurationChecker.call
17
17
  end
18
18
 
19
19
  # @return [Array<Hash>]
@@ -43,7 +43,7 @@ module Rucoa
43
43
 
44
44
  # @return [String]
45
45
  def new_text
46
- RubocopAutocorrector.call(source: source)
46
+ Rubocop::Autocorrector.call(source: source)
47
47
  end
48
48
 
49
49
  # @return [Hash]
@@ -23,14 +23,13 @@ module Rucoa
23
23
  def responsible?
24
24
  configuration.enables_hover? &&
25
25
  !source.nil? &&
26
- !node.nil?
26
+ !node.nil? &&
27
+ !method_definitions.empty?
27
28
  end
28
29
 
29
30
  # @return [String, nil]
30
31
  def contents
31
32
  method_definition = method_definitions.first
32
- return unless method_definition
33
-
34
33
  [
35
34
  method_definition.signatures.join("\n"),
36
35
  method_definition.description
@@ -66,7 +65,7 @@ module Rucoa
66
65
 
67
66
  # @return [Array<Rucoa::Definitions::MethodDefinition>]
68
67
  def method_definitions
69
- NodeInspector.new(
68
+ @method_definitions ||= NodeInspector.new(
70
69
  definition_store: definition_store,
71
70
  node: node
72
71
  ).method_definitions
@@ -25,7 +25,7 @@ module Rucoa
25
25
  def formattable?
26
26
  configuration.enables_formatting? &&
27
27
  source &&
28
- RubocopConfigurationChecker.call
28
+ Rubocop::ConfigurationChecker.call
29
29
  end
30
30
 
31
31
  # @return [Rucoa::Source]
@@ -59,7 +59,7 @@ module Rucoa
59
59
 
60
60
  # @return [Array<RuboCop::Cop::Offense>]
61
61
  def offenses
62
- RubocopInvestigator.call(source: source)
62
+ Rubocop::Investigator.call(source: source)
63
63
  end
64
64
 
65
65
  # @return [Array(Rucoa::Range, String)]
@@ -9,7 +9,9 @@ module Rucoa
9
9
  autoload :ShutdownHandler, 'rucoa/handlers/shutdown_handler'
10
10
  autoload :TextDocumentCodeActionHandler, 'rucoa/handlers/text_document_code_action_handler'
11
11
  autoload :TextDocumentCompletionHandler, 'rucoa/handlers/text_document_completion_handler'
12
+ autoload :TextDocumentDefinitionHandler, 'rucoa/handlers/text_document_definition_handler'
12
13
  autoload :TextDocumentDidChangeHandler, 'rucoa/handlers/text_document_did_change_handler'
14
+ autoload :TextDocumentDidCloseHandler, 'rucoa/handlers/text_document_did_close_handler'
13
15
  autoload :TextDocumentDidOpenHandler, 'rucoa/handlers/text_document_did_open_handler'
14
16
  autoload :TextDocumentDocumentSymbolHandler, 'rucoa/handlers/text_document_document_symbol_handler'
15
17
  autoload :TextDocumentFormattingHandler, 'rucoa/handlers/text_document_formatting_handler'