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
@@ -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