From 85f7593874eb626f767177ccf04288d2bb5bf029 Mon Sep 17 00:00:00 2001 From: Vinicius Stock Date: Mon, 27 Nov 2023 15:27:05 -0500 Subject: [PATCH] Add Member parent class to represent accessors and methods --- lib/ruby_indexer/lib/ruby_indexer/entry.rb | 30 +++++++++++++--------- lib/ruby_lsp/requests/completion.rb | 4 +-- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/lib/ruby_indexer/lib/ruby_indexer/entry.rb b/lib/ruby_indexer/lib/ruby_indexer/entry.rb index d183917ff0..b476e8eaeb 100644 --- a/lib/ruby_indexer/lib/ruby_indexer/entry.rb +++ b/lib/ruby_indexer/lib/ruby_indexer/entry.rb @@ -93,8 +93,11 @@ def initialize(name:) class RequiredParameter < Parameter end - class Accessor < Entry + class Member < Entry extend T::Sig + extend T::Helpers + + abstract! sig { returns(T.nilable(Entry::Namespace)) } attr_reader :owner @@ -113,7 +116,14 @@ def initialize(name, file_path, location, comments, owner) @owner = owner end - sig { returns(T::Array[Parameter]) } + sig { abstract.returns(T::Array[Parameter]) } + def parameters; end + end + + class Accessor < Member + extend T::Sig + + sig { override.returns(T::Array[Parameter]) } def parameters params = [] params << RequiredParameter.new(name: name.delete_suffix("=").to_sym) if name.end_with?("=") @@ -121,17 +131,15 @@ def parameters end end - class Method < Entry + class Method < Member extend T::Sig extend T::Helpers + abstract! - sig { returns(T::Array[Parameter]) } + sig { override.returns(T::Array[Parameter]) } attr_reader :parameters - sig { returns(T.nilable(Entry::Namespace)) } - attr_reader :owner - sig do params( name: String, @@ -143,9 +151,9 @@ class Method < Entry ).void end def initialize(name, file_path, location, comments, parameters_node, owner) # rubocop:disable Metrics/ParameterLists - super(name, file_path, location, comments) + super(name, file_path, location, comments, owner) + @parameters = T.let(list_params(parameters_node), T::Array[Parameter]) - @owner = owner end private @@ -162,9 +170,7 @@ def list_params(parameters_node) end end - sig do - params(node: Prism::Node).returns(T.nilable(Symbol)) - end + sig { params(node: Prism::Node).returns(T.nilable(Symbol)) } def parameter_name(node) case node when Prism::RequiredParameterNode diff --git a/lib/ruby_lsp/requests/completion.rb b/lib/ruby_lsp/requests/completion.rb index be3ba8cf5b..46813d8dcc 100644 --- a/lib/ruby_lsp/requests/completion.rb +++ b/lib/ruby_lsp/requests/completion.rb @@ -139,7 +139,7 @@ def on_call_node_enter(node) candidates = T.cast( @index.prefix_search(name), - T::Array[T.any(T::Array[RubyIndexer::Entry::Method], T::Array[RubyIndexer::Entry::Accessor])], + T::Array[T::Array[RubyIndexer::Entry::Member]], ) candidates.each do |entries| entry = entries.find { |e| e.owner&.name == receiver.name } @@ -153,7 +153,7 @@ def on_call_node_enter(node) sig do params( - entry: T.any(RubyIndexer::Entry::Method, RubyIndexer::Entry::Accessor), + entry: RubyIndexer::Entry::Member, node: Prism::CallNode, ).returns(Interface::CompletionItem) end