repl_type_completor 0.1.12 → 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/Gemfile +1 -0
- data/lib/repl_type_completor/result.rb +13 -0
- data/lib/repl_type_completor/version.rb +1 -1
- data/lib/repl_type_completor.rb +18 -6
- 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
|
data/Gemfile
CHANGED
|
@@ -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
|
|
@@ -69,14 +78,14 @@ module ReplTypeCompletor
|
|
|
69
78
|
|
|
70
79
|
case target_node
|
|
71
80
|
when Prism::StringNode
|
|
72
|
-
return
|
|
73
|
-
|
|
74
|
-
call_node, args_node = parents.last(2)
|
|
75
|
-
return unless call_node.is_a?(Prism::CallNode) && call_node.receiver.nil?
|
|
76
|
-
return unless args_node.is_a?(Prism::ArgumentsNode) && args_node.arguments.size == 1
|
|
81
|
+
return if target_node.opening == "?" || (target_node.closing_loc && !target_node.closing.empty?)
|
|
77
82
|
|
|
78
|
-
|
|
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
|