type-guessr 0.0.3 → 0.0.4
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
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 189f36a0b1f14badab35c3ea71b7a93d7de66606378533f087dff92e3d0d3f3d
|
|
4
|
+
data.tar.gz: b68f73382fb0a2e171f19254c101125c10b83163555c14d8fb4b920c61288555
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 14029ca04179fed4e548152d6a06303d70069ef27d097ec49f17d969b58c520175de6b3a1130facefc346a9fe302d0897fcdbada1d5087f08e3dfe601cbd88a8
|
|
7
|
+
data.tar.gz: c11ad3e708e2e7ec2aa0ed7813d18967af11a07462964f5fb8426bd6c12c871a1dbd03069ba2feef6dffe517e0dd5b5c1135080ba8bbe90910533c39ffe19467
|
|
@@ -119,7 +119,7 @@ module RubyLsp
|
|
|
119
119
|
entries = if @member_index
|
|
120
120
|
@member_index[pivot.name.to_s] || []
|
|
121
121
|
else
|
|
122
|
-
@index.fuzzy_search(pivot.name.to_s) do |entry|
|
|
122
|
+
@index.fuzzy_search(pivot.name.to_s).select do |entry|
|
|
123
123
|
entry.is_a?(RubyIndexer::Entry::Member) && entry.name == pivot.name.to_s
|
|
124
124
|
end
|
|
125
125
|
end
|
|
@@ -202,6 +202,12 @@ module TypeGuessr
|
|
|
202
202
|
nested_classes = []
|
|
203
203
|
if prism_node.body.is_a?(Prism::StatementsNode)
|
|
204
204
|
prism_node.body.body.each do |stmt|
|
|
205
|
+
if attr_accessor_call?(stmt)
|
|
206
|
+
# attr_reader/attr_accessor/attr_writer DSL → 合成DefNodeを生成
|
|
207
|
+
methods.concat(synthesize_attr_defs(stmt, class_context))
|
|
208
|
+
next
|
|
209
|
+
end
|
|
210
|
+
|
|
205
211
|
node = convert(stmt, class_context)
|
|
206
212
|
if node.is_a?(IR::DefNode)
|
|
207
213
|
methods << node
|
|
@@ -217,6 +223,66 @@ module TypeGuessr
|
|
|
217
223
|
IR::ClassModuleNode.new(name, methods, [], convert_loc(prism_node.constant_path&.location || prism_node.location))
|
|
218
224
|
end
|
|
219
225
|
|
|
226
|
+
ATTR_DSL_NAMES = %i[attr_reader attr_writer attr_accessor].freeze
|
|
227
|
+
private_constant :ATTR_DSL_NAMES
|
|
228
|
+
|
|
229
|
+
private def attr_accessor_call?(prism_node)
|
|
230
|
+
return false unless prism_node.is_a?(Prism::CallNode)
|
|
231
|
+
return false unless prism_node.receiver.nil?
|
|
232
|
+
|
|
233
|
+
ATTR_DSL_NAMES.include?(prism_node.name)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
# attr_reader/attr_writer/attr_accessor呼び出しから合成DefNodeを生成する
|
|
237
|
+
# @return [Array<IR::DefNode>]
|
|
238
|
+
private def synthesize_attr_defs(prism_node, context)
|
|
239
|
+
dsl_name = prism_node.name
|
|
240
|
+
args = prism_node.arguments&.arguments || []
|
|
241
|
+
|
|
242
|
+
args.flat_map do |arg|
|
|
243
|
+
attr_name = extract_attr_name(arg)
|
|
244
|
+
next [] unless attr_name
|
|
245
|
+
|
|
246
|
+
loc = convert_loc(arg.location)
|
|
247
|
+
case dsl_name
|
|
248
|
+
when :attr_reader
|
|
249
|
+
[build_reader_def(attr_name, context.current_class_name, loc)]
|
|
250
|
+
when :attr_writer
|
|
251
|
+
[build_writer_def(attr_name, context.current_class_name, loc)]
|
|
252
|
+
when :attr_accessor
|
|
253
|
+
[
|
|
254
|
+
build_reader_def(attr_name, context.current_class_name, loc),
|
|
255
|
+
build_writer_def(attr_name, context.current_class_name, loc),
|
|
256
|
+
]
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
# 記号/文字列リテラル引数から属性名を取り出す
|
|
262
|
+
# @return [Symbol, nil] シンボルで返す。リテラルでない場合はnil
|
|
263
|
+
private def extract_attr_name(arg)
|
|
264
|
+
case arg
|
|
265
|
+
when Prism::SymbolNode
|
|
266
|
+
arg.value&.to_sym
|
|
267
|
+
when Prism::StringNode
|
|
268
|
+
arg.unescaped.to_sym
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
# attr_readerに対応する合成DefNode (引数なし、@ivarを返す)
|
|
273
|
+
private def build_reader_def(attr_name, class_name, loc)
|
|
274
|
+
ivar_name = :"@#{attr_name}"
|
|
275
|
+
ivar_read = IR::InstanceVariableReadNode.new(ivar_name, class_name, nil, [], loc)
|
|
276
|
+
IR::DefNode.new(attr_name, class_name, [], ivar_read, [ivar_read], [], loc, false)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
# attr_writerに対応する合成DefNode (name= :引数を返す)
|
|
280
|
+
private def build_writer_def(attr_name, class_name, loc)
|
|
281
|
+
setter_name = :"#{attr_name}="
|
|
282
|
+
param = IR::ParamNode.new(:value, :required, nil, [], loc)
|
|
283
|
+
IR::DefNode.new(setter_name, class_name, [param], param, [param], [], loc, false)
|
|
284
|
+
end
|
|
285
|
+
|
|
220
286
|
private def convert_singleton_class(prism_node, context)
|
|
221
287
|
# Create a new context for singleton class scope
|
|
222
288
|
singleton_context = context.fork(:class)
|
data/lib/type_guessr/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: type-guessr
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- riseshia
|
|
@@ -124,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
124
124
|
- !ruby/object:Gem::Version
|
|
125
125
|
version: '0'
|
|
126
126
|
requirements: []
|
|
127
|
-
rubygems_version:
|
|
127
|
+
rubygems_version: 3.6.9
|
|
128
128
|
specification_version: 4
|
|
129
129
|
summary: A heuristic type inference tool for Ruby
|
|
130
130
|
test_files: []
|