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
@@ -1,215 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'yard'
4
-
5
- module Rucoa
6
- module Yard
7
- class MethodDefinitionMapper
8
- class << self
9
- # @param code_object [YARD::CodeObjects::MethodObject]
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::MethodObject]
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::MethodDefinition]
25
- def call
26
- Definitions::MethodDefinition.new(
27
- description: description,
28
- kind: kind,
29
- method_name: method_name,
30
- namespace: namespace,
31
- source_path: @path,
32
- types: types
33
- )
34
- end
35
-
36
- private
37
-
38
- # @return [String]
39
- def description
40
- @code_object.docstring.to_s
41
- end
42
-
43
- # @return [Symbol]
44
- def kind
45
- if @code_object.scope == :instance
46
- :instance
47
- else
48
- :singleton
49
- end
50
- end
51
-
52
- # @return [String]
53
- def method_name
54
- @code_object.name.to_s
55
- end
56
-
57
- # @return [String]
58
- def namespace
59
- @code_object.namespace.to_s
60
- end
61
-
62
- # @return [Array<Rucoa::Types::MethodType>]
63
- def types
64
- return_types.map do |return_type|
65
- ::Rucoa::Types::MethodType.new(
66
- parameters_string: parameters_string,
67
- return_type: return_type
68
- )
69
- end
70
- end
71
-
72
- # @return [String]
73
- # @example
74
- # definitions = Rucoa::Yard::DefinitionsLoader.load_string(
75
- # content: <<~RUBY,
76
- # class Foo
77
- # def bar(
78
- # argument1,
79
- # argument2 = nil,
80
- # *arguments,
81
- # keyword1:,
82
- # keyword2: nil,
83
- # **keywords,
84
- # &block
85
- # )
86
- # end
87
- # end
88
- # RUBY
89
- # path: '/path/to/foo.rb'
90
- # )
91
- # expect(definitions[1].signatures).to eq(
92
- # [
93
- # 'Foo#bar(argument1, argument2 = nil, *arguments, keyword1:, keyword2: nil, **keywords, &block) -> Object'
94
- # ]
95
- # )
96
- def parameters_string
97
- @code_object.parameters.map do |parameter_name, default_value|
98
- default_value_part =
99
- if default_value.nil?
100
- nil
101
- elsif parameter_name.end_with?(':')
102
- " #{default_value}"
103
- else
104
- " = #{default_value}"
105
- end
106
- [
107
- parameter_name,
108
- default_value_part
109
- ].join
110
- end.join(', ')
111
- end
112
-
113
- # @return [Array<Rucoa::Definitions::MethodParameterDefinition>]
114
- def parameters
115
- parameter_tags.map do |parameter_tag|
116
- Definitions::MethodParameterDefinition.new(
117
- name: parameter_tag.name,
118
- types: parameter_tag.types
119
- )
120
- end
121
- end
122
-
123
- # @return [Array<YARD::Tags::Tag>]
124
- def parameter_tags
125
- @code_object.tags(:param) + @code_object.tags(:overload).flat_map do |overload_tag|
126
- overload_tag.tags(:param)
127
- end
128
- end
129
-
130
- # @return [Array<String>]
131
- # @return [String]
132
- # @example returns return type annotated by YARD @return tags
133
- # definitions = Rucoa::Yard::DefinitionsLoader.load_string(
134
- # content: <<~RUBY,
135
- # # @return [String]
136
- # def foo
137
- # 'foo'
138
- # end
139
- # RUBY
140
- # path: '/path/to/foo.rb'
141
- # )
142
- # expect(definitions.first.return_types).to eq(
143
- # %w[
144
- # String
145
- # ]
146
- # )
147
- # @example ignores empty @return tags
148
- # definitions = Rucoa::Yard::DefinitionsLoader.load_string(
149
- # content: <<~RUBY,
150
- # # @return []
151
- # def foo
152
- # 'foo'
153
- # end
154
- # RUBY
155
- # path: '/path/to/foo.rb'
156
- # )
157
- # expect(definitions.first.return_types).to eq([])
158
- def return_types
159
- return %w[Object] if return_tags.empty?
160
-
161
- return_tags.flat_map(&:types).compact.map do |type|
162
- YardType.new(type).to_rucoa_type
163
- end
164
- end
165
-
166
- # @return [YARD::Tags::Tag]
167
- def return_tags
168
- @code_object.tags(:return) + @code_object.tags(:overload).flat_map do |overload_tag|
169
- overload_tag.tags(:return)
170
- end
171
- end
172
-
173
- class YardType
174
- # @param type [String]
175
- def initialize(type)
176
- @type = type
177
- end
178
-
179
- # @return [String]
180
- # @example scrubs "Array<String>" to "Array"
181
- # yard_type = Rucoa::Yard::MethodDefinitionMapper::YardType.new(
182
- # 'Array<String>'
183
- # )
184
- # expect(yard_type.to_rucoa_type).to eq('Array')
185
- # @example scrubs "Array(String, Integer)" to "Array"
186
- # yard_type = Rucoa::Yard::MethodDefinitionMapper::YardType.new(
187
- # 'Array(String, Integer)'
188
- # )
189
- # expect(yard_type.to_rucoa_type).to eq('Array')
190
- # @example scrubs "::Array" to "Array"
191
- # yard_type = Rucoa::Yard::MethodDefinitionMapper::YardType.new(
192
- # '::Array'
193
- # )
194
- # expect(yard_type.to_rucoa_type).to eq('Array')
195
- # @example scrubs "Hash{Symbol => Object}" to "Hash"
196
- # yard_type = Rucoa::Yard::MethodDefinitionMapper::YardType.new(
197
- # 'Hash{Symbol => Object}'
198
- # )
199
- # expect(yard_type.to_rucoa_type).to eq('Hash')
200
- # @example scrubs "Array<Array<Integer>>" to "Array"
201
- # yard_type = Rucoa::Yard::MethodDefinitionMapper::YardType.new(
202
- # 'Array<Array<Integer>>'
203
- # )
204
- # expect(yard_type.to_rucoa_type).to eq('Array')
205
- def to_rucoa_type
206
- @type
207
- .delete_prefix('::')
208
- .gsub(/<.+>/, '')
209
- .gsub(/\{.+\}/, '')
210
- .gsub(/\(.+\)/, '')
211
- end
212
- end
213
- end
214
- end
215
- end