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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 28136c362ceef7b3c11ed900d8e0d86e3d2649f9ca30074d6e3a5db463231f39
4
- data.tar.gz: 468f27e11fc42e4e937f9f910e2cb10c554a68dc0a39f06055409b3dace78f8d
3
+ metadata.gz: 63dda3c224b0b6eeb8dbc32ef8d3890878eb6f5134d3c5651406f321ade32e00
4
+ data.tar.gz: a4e24e9d56dc4802fc826693e0866185a63e5e027ad4b7e0fb9b819c35a83ba4
5
5
  SHA512:
6
- metadata.gz: b6245b2523a70a8941db801f65fd3f3f8b8799919a7d940f327688f39ed05bdbe35a15a9098ce79f34aa3f90f95b8e6109e85216667c5438c33ff50001514502
7
- data.tar.gz: 4b81ea74a33fd0755c6169d953e4234328916d2dc15a87d52728dfb55323b27db66377be1d48b12c4c8d91ccf444b1434380bdd93c24a65fdb029b203e26af4e
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]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReplTypeCompletor
4
- VERSION = "0.1.13"
4
+ VERSION = "0.1.14"
5
5
  end
@@ -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, 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
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.13
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