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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +4 -1
- data/data/definitions_ruby_3_1 +0 -0
- data/lib/rucoa/configuration.rb +10 -0
- data/lib/rucoa/definition_store.rb +194 -27
- data/lib/rucoa/definitions/class_definition.rb +82 -0
- data/lib/rucoa/definitions/constant_definition.rb +7 -7
- data/lib/rucoa/definitions/method_definition.rb +18 -6
- data/lib/rucoa/definitions/module_definition.rb +8 -0
- data/lib/rucoa/definitions.rb +2 -0
- data/lib/rucoa/handlers/initialize_handler.rb +1 -0
- data/lib/rucoa/handlers/initialized_handler.rb +33 -5
- data/lib/rucoa/handlers/text_document_completion_handler.rb +2 -2
- data/lib/rucoa/handlers/text_document_definition_handler.rb +155 -0
- data/lib/rucoa/handlers/text_document_did_open_handler.rb +1 -4
- data/lib/rucoa/handlers/text_document_hover_handler.rb +3 -4
- data/lib/rucoa/handlers.rb +1 -0
- data/lib/rucoa/node_concerns/{name_full_qualifiable.rb → name_fully_qualifiable.rb} +2 -2
- data/lib/rucoa/node_concerns.rb +1 -1
- data/lib/rucoa/node_inspector.rb +56 -34
- data/lib/rucoa/nodes/base.rb +32 -7
- data/lib/rucoa/nodes/casgn_node.rb +1 -1
- data/lib/rucoa/nodes/cbase_node.rb +8 -0
- data/lib/rucoa/nodes/class_node.rb +62 -1
- data/lib/rucoa/nodes/const_node.rb +72 -0
- data/lib/rucoa/nodes/def_node.rb +11 -9
- data/lib/rucoa/nodes/defs_node.rb +21 -0
- data/lib/rucoa/nodes/lvar_node.rb +2 -1
- data/lib/rucoa/nodes/module_node.rb +1 -1
- data/lib/rucoa/nodes/send_node.rb +14 -10
- data/lib/rucoa/nodes.rb +1 -0
- data/lib/rucoa/parse_result.rb +29 -0
- data/lib/rucoa/parser.rb +40 -8
- data/lib/rucoa/parser_builder.rb +1 -0
- data/lib/rucoa/position.rb +1 -1
- data/lib/rucoa/rbs/class_definition_mapper.rb +46 -0
- data/lib/rucoa/rbs/constant_definition_mapper.rb +2 -2
- data/lib/rucoa/rbs/module_definition_mapper.rb +40 -0
- data/lib/rucoa/rbs/ruby_definitions_loader.rb +11 -7
- data/lib/rucoa/rbs.rb +2 -0
- data/lib/rucoa/rubocop/autocorrector.rb +12 -1
- data/lib/rucoa/rubocop/investigator.rb +10 -1
- data/lib/rucoa/server.rb +2 -1
- data/lib/rucoa/source.rb +47 -24
- data/lib/rucoa/source_store.rb +0 -13
- data/lib/rucoa/version.rb +1 -1
- data/lib/rucoa/yard/definitions_loader.rb +320 -48
- data/lib/rucoa/yard/type.rb +46 -0
- data/lib/rucoa/yard.rb +1 -1
- data/lib/rucoa.rb +1 -0
- metadata +11 -4
- 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
|