diff --git a/Gemfile b/Gemfile index 79decbc1b..a4c027052 100644 --- a/Gemfile +++ b/Gemfile @@ -18,6 +18,6 @@ gem "test-unit" gem "test-unit-ruby-core" gem "debug", github: "ruby/debug" if RUBY_VERSION >= "3.0.0" - gem "rbs" + gem "rbs", ">= 0.17.1" gem "prism" end diff --git a/lib/irb/type_completion/completor.rb b/lib/irb/type_completion/completor.rb index ee2af8a42..e893fd8ad 100644 --- a/lib/irb/type_completion/completor.rb +++ b/lib/irb/type_completion/completor.rb @@ -144,11 +144,7 @@ def analyze(code, binding = Object::TOPLEVEL_BINDING) # Workaround for https://github.com/ruby/prism/issues/1592 return if code.match?(/%[qQ]\z/) - lvars_code = binding.local_variables.map do |name| - "#{name}=" - end.join + "nil;\n" - code = lvars_code + code - ast = Prism.parse(code).value + ast = Prism.parse(code, scopes: [binding.local_variables]).value name = code[/(@@|@|\$)?\w*[!?=]?\z/] *parents, target_node = find_target ast, code.bytesize - name.bytesize return unless target_node diff --git a/lib/irb/type_completion/type_analyzer.rb b/lib/irb/type_completion/type_analyzer.rb index 32031e13b..c4a41e499 100644 --- a/lib/irb/type_completion/type_analyzer.rb +++ b/lib/irb/type_completion/type_analyzer.rb @@ -1155,20 +1155,13 @@ def method_call(receiver, method_name, args, kwargs, block, scope, name_match: t Types::UnionType[*types, *breaks] end - def evaluate_program(program, scope) - # statements.body[0] is local variable assign code - program.statements.body[1..].each do |statement| - evaluate statement, scope - end - end - def self.calculate_target_type_scope(binding, parents, target) dig_targets = DigTarget.new(parents, target) do |type, scope| return type, scope end program = parents.first scope = Scope.from_binding(binding, program.locals) - new(dig_targets).evaluate_program program, scope + new(dig_targets).evaluate program, scope [Types::NIL, scope] end end