repl_type_completor 0.1.13 → 0.1.14
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/lib/repl_type_completor/result.rb +13 -0
- data/lib/repl_type_completor/version.rb +1 -1
- data/lib/repl_type_completor.rb +17 -5
- metadata +1 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 63dda3c224b0b6eeb8dbc32ef8d3890878eb6f5134d3c5651406f321ade32e00
|
|
4
|
+
data.tar.gz: a4e24e9d56dc4802fc826693e0866185a63e5e027ad4b7e0fb9b819c35a83ba4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 25324bc6b23711cd04dec7c6956436e2b9ebc58a54c1583135c9056d0d8165a9fe3b227e0312a905c953ac12f726a5b71e9e219b9910e3e0ad025b2e97ff1464
|
|
7
|
+
data.tar.gz: b502763947570ec6362381d29740f11213839bc1472c3f8f22929b5580f3f65dd1ef994e328fc4d73cf46b1be6d6b6ab6052f69ea6719f50e347b21f78db6d1e
|
|
@@ -65,6 +65,19 @@ module ReplTypeCompletor
|
|
|
65
65
|
scope.global_variables
|
|
66
66
|
in [:symbol, name]
|
|
67
67
|
filter_symbol_candidates(Symbol.all_symbols, name, limit: 100)
|
|
68
|
+
in [:aref, key_type, name, receiver_type]
|
|
69
|
+
key_type = key_type == :string ? String : Symbol
|
|
70
|
+
keys = receiver_type.types.grep(Types::InstanceType).select do |t|
|
|
71
|
+
Hash == t.klass
|
|
72
|
+
end.flat_map do |t|
|
|
73
|
+
t.instances.flat_map(&:keys).grep(key_type).uniq.sort
|
|
74
|
+
end
|
|
75
|
+
if key_type == Symbol
|
|
76
|
+
keys = Symbol.all_symbols if keys.empty? && name.size >= 1
|
|
77
|
+
filter_symbol_candidates(keys, name, limit: 100)
|
|
78
|
+
else
|
|
79
|
+
keys.select { _1.start_with?(name) }.sort
|
|
80
|
+
end
|
|
68
81
|
in [:call, name, type, self_call]
|
|
69
82
|
(self_call ? type.all_methods : type.methods).map(&:to_s) - HIDDEN_METHODS
|
|
70
83
|
in [:lvar_or_method, name, scope]
|
data/lib/repl_type_completor.rb
CHANGED
|
@@ -59,6 +59,15 @@ module ReplTypeCompletor
|
|
|
59
59
|
|
|
60
60
|
private
|
|
61
61
|
|
|
62
|
+
# Checks if `*parents, target_node` returned by `find_target` is a call with a single argument.
|
|
63
|
+
# returns CallNode or nil.
|
|
64
|
+
def single_arg_call_node(parents)
|
|
65
|
+
call_node, args_node = parents.last(2)
|
|
66
|
+
if call_node.is_a?(Prism::CallNode) && args_node.is_a?(Prism::ArgumentsNode) && args_node.arguments.size == 1
|
|
67
|
+
call_node
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
62
71
|
def analyze_code(code, binding = Object::TOPLEVEL_BINDING)
|
|
63
72
|
ast = Prism.parse(code, scopes: [binding.local_variables]).value
|
|
64
73
|
*parents, target_node = find_target ast, code.bytesize
|
|
@@ -71,12 +80,12 @@ module ReplTypeCompletor
|
|
|
71
80
|
when Prism::StringNode
|
|
72
81
|
return if target_node.opening == "?" || (target_node.closing_loc && !target_node.closing.empty?)
|
|
73
82
|
|
|
74
|
-
call_node
|
|
75
|
-
|
|
76
|
-
return unless args_node.is_a?(Prism::ArgumentsNode) && args_node.arguments.size == 1
|
|
77
|
-
|
|
78
|
-
if call_node.name == :require || call_node.name == :require_relative
|
|
83
|
+
call_node = single_arg_call_node(parents) # require("target") or require_relative("target")
|
|
84
|
+
if call_node.receiver.nil? && (call_node.name == :require || call_node.name == :require_relative)
|
|
79
85
|
[call_node.name, target_node.content]
|
|
86
|
+
elsif call_node.receiver && call_node.name == :[] # object["target"]
|
|
87
|
+
receiver_type, _scope = calculate_type_scope.call call_node.receiver
|
|
88
|
+
[:aref, :string, target_node.content, receiver_type]
|
|
80
89
|
end
|
|
81
90
|
when Prism::SymbolNode
|
|
82
91
|
return unless !target_node.closing || target_node.closing.empty?
|
|
@@ -85,6 +94,9 @@ module ReplTypeCompletor
|
|
|
85
94
|
if parents.last.is_a? Prism::BlockArgumentNode # method(&:target)
|
|
86
95
|
receiver_type, _scope = calculate_type_scope.call target_node
|
|
87
96
|
[:call, name, receiver_type, false]
|
|
97
|
+
elsif (call_node = single_arg_call_node(parents)) && call_node.receiver && call_node.name == :[] # object[:target]
|
|
98
|
+
receiver_type, _scope = calculate_type_scope.call call_node.receiver
|
|
99
|
+
[:aref, :symbol, name, receiver_type]
|
|
88
100
|
else
|
|
89
101
|
[:symbol, name] unless name.empty?
|
|
90
102
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: repl_type_completor
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.14
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- tompng
|
|
@@ -30,9 +30,6 @@ dependencies:
|
|
|
30
30
|
- - ">="
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
32
|
version: 2.7.0
|
|
33
|
-
- - "<"
|
|
34
|
-
- !ruby/object:Gem::Version
|
|
35
|
-
version: 4.0.0
|
|
36
33
|
type: :runtime
|
|
37
34
|
prerelease: false
|
|
38
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -40,9 +37,6 @@ dependencies:
|
|
|
40
37
|
- - ">="
|
|
41
38
|
- !ruby/object:Gem::Version
|
|
42
39
|
version: 2.7.0
|
|
43
|
-
- - "<"
|
|
44
|
-
- !ruby/object:Gem::Version
|
|
45
|
-
version: 4.0.0
|
|
46
40
|
description: Type based completion for REPL.
|
|
47
41
|
email:
|
|
48
42
|
- tomoyapenguin@gmail.com
|