Complete writer methods with self receiver when receiver is self #3550
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation
Closes #3528
Setter methods where the receiver is
self
were being completed without the explicitself.
prefix. This would result in local variable assignment rather than calling the writer method.For example, when typing
b
in a class method and expecting completion forbaz=
, the LSP would suggest:Instead of the correct:
Implementation
add_method_completions
method incompletion.rb
to detect when completing setter methods with aself
receiver.The implementation checks
node.receiver.nil?
to detect implicit self and avoid addingself.
when the user has already typed the receiver.Note
This is my first ruby-lsp PR. Feedback on the approach would be appreciated, particularly:
newText
is the correct option (leaving thelabel
andfilterText
as before) but I'd be curious if reviewers feel otherwise.Automated Tests
Added test coverage in
completion_test.rb
with three scenarios:b
in class method) - verifiesself.
prefix is added to completion textself.b
in class method) - verifies no additionalself.
prefix is addedfoo.b
outside class) - verifies noself.
prefix is added