# File lib/ruby_lsp/requests/completion.rb, line 54definitialize(document, global_state, position, typechecker_enabled, dispatcher)
super()
@target = T.let(nil, T.nilable(Prism::Node))
@dispatcher = dispatcher# Completion always receives the position immediately after the character that was just typed. Here we adjust it# back by 1, so that we find the right nodechar_position = document.create_scanner.find_char_position(position) -1matched, parent, nesting = document.locate(
document.tree,
char_position,
node_types: [Prism::CallNode, Prism::ConstantReadNode, Prism::ConstantPathNode],
)
@response_builder = T.let(
ResponseBuilders::CollectionResponseBuilder[Interface::CompletionItem].new,
ResponseBuilders::CollectionResponseBuilder[Interface::CompletionItem],
)
Listeners::Completion.new(
@response_builder,
global_state,
nesting,
typechecker_enabled,
dispatcher,
document.uri,
)
Addon.addons.eachdo|addon|addon.create_completion_listener(@response_builder, nesting, dispatcher, document.uri)
endreturnunlessmatched&&parent@target = casematchedwhenPrism::CallNodematchedwhenPrism::ConstantReadNode, Prism::ConstantPathNodeifparent.is_a?(Prism::ConstantPathNode) &&matched.is_a?(Prism::ConstantReadNode)
parentelsematchedendendend
provider()
# File lib/ruby_lsp/requests/completion.rb, line 34defproviderInterface::CompletionOptions.new(
resolve_provider:true,
trigger_characters: ["/", "\"", "'"],
completion_item: {
labelDetailsSupport:true,
},
)
end
Public Instance Methods
perform()
# File lib/ruby_lsp/requests/completion.rb, line 99defperformreturn [] unless@target@dispatcher.dispatch_once(@target)
@response_builder.responseend