Description
Is there an existing issue for this?
- I have searched the existing issues
Current Behavior
Consider the following code:
mutation createComment2 @auth(is: PUBLIC) {
comment_insert2(data: {
})
}
where data
expects an input
type.
In this scenario, adding whitespaces when trying to get autocompletion seems to change the result. Here's a video showcasing the issue:
Screen.Recording.2024-03-06.at.13.06.38.mov
Expected Behavior
Adding whitespaces/newlines should not have any impact on the suggestion.
Steps To Reproduce
No response
Environment
- LSP Server Version: latest
- OS: macos
- LSP Client: vscode-graphql
Anything else?
I've tried debugging this by adding logs on a fork of the repository, and the issue appears to be getAutocompletionSuggestions.ts#getTokenAtPosition
.
I added a console.log(token)
inside getAutocompleteSuggestions
right before the call to getTypeInfo
here
Then compared the log outputs based on where the cursor is.
Given comment_insert2(data: {| })
, the token returned is:
{
start: 0,
end: 0,
string: '{',
state: { ... },
style: 'punctuation'
}
But for comment_insert2(data: { | })
it is:
{
start: 0,
end: 0,
string: '}',
state: { ... },
style: 'punctuation'
}
And lastly for comment_insert2(data: { |})
it is:
{
start: 0,
end: 0,
string: ')',
state: { ... },
style: 'punctuation'
}
This doesn't make sense to me. I would expect all of them to return the token with string: '{'
Activity
acao commentedon Mar 6, 2024
there are some bugs I'm planning to fix in autocomplete that may be related to this, or it's an offset issue. Is the file you are editing named . graphql or .graphqls by chance, or something else?
rrousselGit commentedon Mar 6, 2024
No it is named
.gql
actuallyrrousselGit commentedon Mar 6, 2024
I think
CharacterStream#getCurrentPosition
is wrong.I've logged the
cursor
andstream.getCurrentPosition()
ingetTokenAtPosition
, and the cursor matches what I expected. But the position of}
/)
is off.Given the line:
}
is said to be at column26
and)
at27
. But they are in fact at respectively 29 and 33rrousselGit commentedon Mar 6, 2024
Looks like disabling "eatWhitespace" fixes the whitespace issue (although likely an incorrect fix)
Newlines are still a problem though. I'll look into it more
rrousselGit commentedon Mar 6, 2024
I think for newlines the issue is this condition here:
https://github.com/graphql/graphiql/blob/ece99f63f5d8d01057b735e90a6957edea3e42b9/packages/graphql-language-service/src/interface/getAutocompleteSuggestions.ts#L973C1-L974C1
In the case of:
I assume we'd want to obtain
{
for the token under the cursor. But the cursor isn't in the same line as the token, so that condition is bound to fail I think.My guess is, we should update the logic such that when the cursor is between two tokens, we pick the first one. At the moment, it'll always fail to pick anything
With both changes considered, that seem to fix the issue for me. I'll open a PR
Fix autocomplete suggestion