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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e17428782dfde53e8b592d0fb16957c02ec537bee5122a624e3a99bbfc663e5a
4
- data.tar.gz: ebebeec739da4ae0e46ac690f3e238cff6759a3cedebccdf9e180e28ee6c51a8
3
+ metadata.gz: 63dda3c224b0b6eeb8dbc32ef8d3890878eb6f5134d3c5651406f321ade32e00
4
+ data.tar.gz: a4e24e9d56dc4802fc826693e0866185a63e5e027ad4b7e0fb9b819c35a83ba4
5
5
  SHA512:
6
- metadata.gz: d2d803e3ae97d53a1b3287b564615f9f4f9790d58065ad224d9376ec4fd2407d6df66d10c20a54175ad10c57e2b9efafe10955e01306b21c0d92213b6cc5b9e9
7
- data.tar.gz: 4ffb182ae4720b9e67d4abb575c09b1e07f7c00a33c1c2601bf66f763eaa4997f8a813980b9367f47ba9731f6ce318a13b277d8c80396c9e7cfe43178896198c
6
+ metadata.gz: 25324bc6b23711cd04dec7c6956436e2b9ebc58a54c1583135c9056d0d8165a9fe3b227e0312a905c953ac12f726a5b71e9e219b9910e3e0ad025b2e97ff1464
7
+ data.tar.gz: b502763947570ec6362381d29740f11213839bc1472c3f8f22929b5580f3f65dd1ef994e328fc4d73cf46b1be6d6b6ab6052f69ea6719f50e347b21f78db6d1e
data/Gemfile CHANGED
@@ -23,5 +23,6 @@ if ENV['GEMFILE_RBS_VERSION']
23
23
  gem 'rbs', github: 'ruby/rbs'
24
24
  else
25
25
  gem 'rbs', ENV['GEMFILE_RBS_VERSION']
26
+ gem 'logger' # ruby >= 4.0 && rbs <= 3.5
26
27
  end
27
28
  end
@@ -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.12"
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
@@ -69,14 +78,14 @@ module ReplTypeCompletor
69
78
 
70
79
  case target_node
71
80
  when Prism::StringNode
72
- return unless target_node.closing&.empty?
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
- 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.12
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