rucoa 0.7.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 (53) 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 +194 -27
  7. data/lib/rucoa/definitions/class_definition.rb +82 -0
  8. data/lib/rucoa/definitions/constant_definition.rb +7 -7
  9. data/lib/rucoa/definitions/method_definition.rb +18 -6
  10. data/lib/rucoa/definitions/module_definition.rb +8 -0
  11. data/lib/rucoa/definitions.rb +2 -0
  12. data/lib/rucoa/handlers/initialize_handler.rb +1 -0
  13. data/lib/rucoa/handlers/initialized_handler.rb +33 -5
  14. data/lib/rucoa/handlers/text_document_completion_handler.rb +2 -2
  15. data/lib/rucoa/handlers/text_document_definition_handler.rb +155 -0
  16. data/lib/rucoa/handlers/text_document_did_open_handler.rb +1 -4
  17. data/lib/rucoa/handlers/text_document_hover_handler.rb +3 -4
  18. data/lib/rucoa/handlers.rb +1 -0
  19. data/lib/rucoa/node_concerns/{name_full_qualifiable.rb → name_fully_qualifiable.rb} +2 -2
  20. data/lib/rucoa/node_concerns.rb +1 -1
  21. data/lib/rucoa/node_inspector.rb +56 -34
  22. data/lib/rucoa/nodes/base.rb +32 -7
  23. data/lib/rucoa/nodes/casgn_node.rb +1 -1
  24. data/lib/rucoa/nodes/cbase_node.rb +8 -0
  25. data/lib/rucoa/nodes/class_node.rb +62 -1
  26. data/lib/rucoa/nodes/const_node.rb +72 -0
  27. data/lib/rucoa/nodes/def_node.rb +11 -9
  28. data/lib/rucoa/nodes/defs_node.rb +21 -0
  29. data/lib/rucoa/nodes/lvar_node.rb +2 -1
  30. data/lib/rucoa/nodes/module_node.rb +1 -1
  31. data/lib/rucoa/nodes/send_node.rb +14 -10
  32. data/lib/rucoa/nodes.rb +1 -0
  33. data/lib/rucoa/parse_result.rb +29 -0
  34. data/lib/rucoa/parser.rb +40 -8
  35. data/lib/rucoa/parser_builder.rb +1 -0
  36. data/lib/rucoa/position.rb +1 -1
  37. data/lib/rucoa/rbs/class_definition_mapper.rb +46 -0
  38. data/lib/rucoa/rbs/constant_definition_mapper.rb +2 -2
  39. data/lib/rucoa/rbs/module_definition_mapper.rb +40 -0
  40. data/lib/rucoa/rbs/ruby_definitions_loader.rb +11 -7
  41. data/lib/rucoa/rbs.rb +2 -0
  42. data/lib/rucoa/rubocop/autocorrector.rb +12 -1
  43. data/lib/rucoa/rubocop/investigator.rb +10 -1
  44. data/lib/rucoa/server.rb +2 -1
  45. data/lib/rucoa/source.rb +47 -24
  46. data/lib/rucoa/source_store.rb +0 -13
  47. data/lib/rucoa/version.rb +1 -1
  48. data/lib/rucoa/yard/definitions_loader.rb +320 -48
  49. data/lib/rucoa/yard/type.rb +46 -0
  50. data/lib/rucoa/yard.rb +1 -1
  51. data/lib/rucoa.rb +1 -0
  52. metadata +11 -4
  53. data/lib/rucoa/yard/definition_mapper.rb +0 -217
@@ -1,217 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'yard'
4
-
5
- module Rucoa
6
- module Yard
7
- class DefinitionMapper
8
- class << self
9
- # @param code_object [YARD::CodeObjects::Base]
10
- # @param path [String] This must be passed if the path is not available from code object.
11
- # @return [Rucoa::Definitions::Base, nil]
12
- def call(code_object, path: code_object.file)
13
- new(code_object, path: path).call
14
- end
15
- end
16
-
17
- # @param code_object [YARD::CodeObjects::Base]
18
- # @param path [String]
19
- def initialize(code_object, path:)
20
- @code_object = code_object
21
- @path = path
22
- end
23
-
24
- # @return [Rucoa::Definitions::Base, nil]
25
- def call
26
- return unless @code_object.is_a?(::YARD::CodeObjects::MethodObject)
27
-
28
- Definitions::MethodDefinition.new(
29
- description: description,
30
- kind: kind,
31
- method_name: method_name,
32
- namespace: namespace,
33
- source_path: @path,
34
- types: types
35
- )
36
- end
37
-
38
- private
39
-
40
- # @return [String]
41
- def description
42
- @code_object.docstring.to_s
43
- end
44
-
45
- # @return [Symbol]
46
- def kind
47
- if @code_object.scope == :instance
48
- :instance
49
- else
50
- :singleton
51
- end
52
- end
53
-
54
- # @return [String
55
- def method_name
56
- @code_object.name
57
- end
58
-
59
- # @return [String]
60
- def namespace
61
- @code_object.namespace.to_s
62
- end
63
-
64
- # @return [Array<Rucoa::Types::MethodType>]
65
- def types
66
- return_types.map do |return_type|
67
- ::Rucoa::Types::MethodType.new(
68
- parameters_string: parameters_string,
69
- return_type: return_type
70
- )
71
- end
72
- end
73
-
74
- # @return [String]
75
- # @example
76
- # definitions = Rucoa::Yard::DefinitionsLoader.load_string(
77
- # content: <<~RUBY,
78
- # class Foo
79
- # def bar(
80
- # argument1,
81
- # argument2 = nil,
82
- # *arguments,
83
- # keyword1:,
84
- # keyword2: nil,
85
- # **keywords,
86
- # &block
87
- # )
88
- # end
89
- # end
90
- # RUBY
91
- # path: '/path/to/foo.rb'
92
- # )
93
- # expect(definitions.first.signatures).to eq(
94
- # [
95
- # 'Foo#bar(argument1, argument2 = nil, *arguments, keyword1:, keyword2: nil, **keywords, &block) -> Object'
96
- # ]
97
- # )
98
- def parameters_string
99
- @code_object.parameters.map do |parameter_name, default_value|
100
- default_value_part =
101
- if default_value.nil?
102
- nil
103
- elsif parameter_name.end_with?(':')
104
- " #{default_value}"
105
- else
106
- " = #{default_value}"
107
- end
108
- [
109
- parameter_name,
110
- default_value_part
111
- ].join
112
- end.join(', ')
113
- end
114
-
115
- # @return [Array<Rucoa::Definitions::MethodParameterDefinition>]
116
- def parameters
117
- parameter_tags.map do |parameter_tag|
118
- ::Rucoa::Definitions::MethodParameterDefinition.new(
119
- name: parameter_tag.name,
120
- types: parameter_tag.types
121
- )
122
- end
123
- end
124
-
125
- # @return [Array<YARD::Tags::Tag>]
126
- def parameter_tags
127
- @code_object.tags(:param) + @code_object.tags(:overload).flat_map do |overload_tag|
128
- overload_tag.tags(:param)
129
- end
130
- end
131
-
132
- # @return [Array<String>]
133
- # @return [String]
134
- # @example returns return type annotated by YARD @return tags
135
- # definitions = Rucoa::Yard::DefinitionsLoader.load_string(
136
- # content: <<~RUBY,
137
- # # @return [String]
138
- # def foo
139
- # 'foo'
140
- # end
141
- # RUBY
142
- # path: '/path/to/foo.rb'
143
- # )
144
- # expect(definitions.first.return_types).to eq(
145
- # %w[
146
- # String
147
- # ]
148
- # )
149
- # @example ignores empty @return tags
150
- # definitions = Rucoa::Yard::DefinitionsLoader.load_string(
151
- # content: <<~RUBY,
152
- # # @return []
153
- # def foo
154
- # 'foo'
155
- # end
156
- # RUBY
157
- # path: '/path/to/foo.rb'
158
- # )
159
- # expect(definitions.first.return_types).to eq([])
160
- def return_types
161
- return %w[Object] if return_tags.empty?
162
-
163
- return_tags.flat_map(&:types).compact.map do |type|
164
- YardType.new(type).to_rucoa_type
165
- end
166
- end
167
-
168
- # @return [YARD::Tags::Tag]
169
- def return_tags
170
- @code_object.tags(:return) + @code_object.tags(:overload).flat_map do |overload_tag|
171
- overload_tag.tags(:return)
172
- end
173
- end
174
-
175
- class YardType
176
- # @param type [String]
177
- def initialize(type)
178
- @type = type
179
- end
180
-
181
- # @return [String]
182
- # @example scrubs "Array<String>" to "Array"
183
- # yard_type = Rucoa::Yard::DefinitionMapper::YardType.new(
184
- # 'Array<String>'
185
- # )
186
- # expect(yard_type.to_rucoa_type).to eq('Array')
187
- # @example scrubs "Array(String, Integer)" to "Array"
188
- # yard_type = Rucoa::Yard::DefinitionMapper::YardType.new(
189
- # 'Array(String, Integer)'
190
- # )
191
- # expect(yard_type.to_rucoa_type).to eq('Array')
192
- # @example scrubs "::Array" to "Array"
193
- # yard_type = Rucoa::Yard::DefinitionMapper::YardType.new(
194
- # '::Array'
195
- # )
196
- # expect(yard_type.to_rucoa_type).to eq('Array')
197
- # @example scrubs "Hash{Symbol => Object}" to "Hash"
198
- # yard_type = Rucoa::Yard::DefinitionMapper::YardType.new(
199
- # 'Hash{Symbol => Object}'
200
- # )
201
- # expect(yard_type.to_rucoa_type).to eq('Hash')
202
- # @example scrubs "Array<Array<Integer>>" to "Array"
203
- # yard_type = Rucoa::Yard::DefinitionMapper::YardType.new(
204
- # 'Array<Array<Integer>>'
205
- # )
206
- # expect(yard_type.to_rucoa_type).to eq('Array')
207
- def to_rucoa_type
208
- @type
209
- .delete_prefix('::')
210
- .gsub(/<.+>/, '')
211
- .gsub(/\{.+\}/, '')
212
- .gsub(/\(.+\)/, '')
213
- end
214
- end
215
- end
216
- end
217
- end