From fbb4e5e0fb7e1639dfca0b50dcab68f92886cea5 Mon Sep 17 00:00:00 2001 From: Benjamin Sengupta Date: Sun, 16 Mar 2025 16:41:19 -0400 Subject: [PATCH 1/4] fix: off by one on hover --- .../__tests__/getHoverInformation.test.ts | 37 +++++++++++++++---- .../src/parser/api.ts | 2 +- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/packages/graphql-language-service/src/interface/__tests__/getHoverInformation.test.ts b/packages/graphql-language-service/src/interface/__tests__/getHoverInformation.test.ts index d676f96e4d5..267e6ad8795 100644 --- a/packages/graphql-language-service/src/interface/__tests__/getHoverInformation.test.ts +++ b/packages/graphql-language-service/src/interface/__tests__/getHoverInformation.test.ts @@ -30,14 +30,35 @@ describe('getHoverInformation', () => { return getHoverInformation(schema, query, point); } - it('provides leaf field information', () => { - const actual = testHover( - 'query { thing { testField } }', - new Position(0, 20), - ); - expect(actual).toEqual( - 'TestType.testField: String\n\nThis is field documentation for TestType.testField', - ); + describe('provides leaf field information', () => { + it('when in middle of token', () => { + const actual = testHover( + 'query { thing { testField } }', + new Position(0, 20), + ); + expect(actual).toEqual( + 'TestType.testField: String\n\nThis is field documentation for TestType.testField', + ); + }); + + it('when at start of token', () => { + const actual = testHover( + 'query { thing { testField } }', + new Position(0, 16), + ); + expect(actual).toEqual( + 'TestType.testField: String\n\nThis is field documentation for TestType.testField', + ); + }); + it('when at end of token', () => { + const actual = testHover( + 'query { thing { testField } }', + new Position(0, 24), + ); + expect(actual).toEqual( + 'TestType.testField: String\n\nThis is field documentation for TestType.testField', + ); + }); }); it('provides aliased field information', () => { diff --git a/packages/graphql-language-service/src/parser/api.ts b/packages/graphql-language-service/src/parser/api.ts index f5fd4bf0675..25635ef1f2b 100644 --- a/packages/graphql-language-service/src/parser/api.ts +++ b/packages/graphql-language-service/src/parser/api.ts @@ -183,7 +183,7 @@ export function getContextAtPosition( mode: GraphQLDocumentMode; } | null { const token: ContextToken = - contextToken || getTokenAtPosition(queryText, cursor, 1); + contextToken || getTokenAtPosition(queryText, cursor, 0); if (!token) { return null; } From e55cfeaf01051b3fa91701f55c0d8b111cbdba87 Mon Sep 17 00:00:00 2001 From: Benjamin Sengupta Date: Sun, 16 Mar 2025 18:25:56 -0400 Subject: [PATCH 2/4] Add `offset` param --- .../src/interface/getAutocompleteSuggestions.ts | 1 + packages/graphql-language-service/src/parser/api.ts | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/graphql-language-service/src/interface/getAutocompleteSuggestions.ts b/packages/graphql-language-service/src/interface/getAutocompleteSuggestions.ts index dfc055cba8b..68a1035c5fa 100644 --- a/packages/graphql-language-service/src/interface/getAutocompleteSuggestions.ts +++ b/packages/graphql-language-service/src/interface/getAutocompleteSuggestions.ts @@ -148,6 +148,7 @@ export function getAutocompleteSuggestions( schema, contextToken, options, + 1, ); if (!context) { return []; diff --git a/packages/graphql-language-service/src/parser/api.ts b/packages/graphql-language-service/src/parser/api.ts index 25635ef1f2b..bd66dbbc730 100644 --- a/packages/graphql-language-service/src/parser/api.ts +++ b/packages/graphql-language-service/src/parser/api.ts @@ -175,7 +175,8 @@ export function getContextAtPosition( cursor: IPosition, schema: GraphQLSchema, contextToken?: ContextToken, - options?: { mode?: GraphQLDocumentMode; uri?: string }, + options?: { mode?: GraphQLDocumentMode; uri?: string; offset?: number }, + offset = 0, ): { token: ContextToken; state: State; @@ -183,7 +184,7 @@ export function getContextAtPosition( mode: GraphQLDocumentMode; } | null { const token: ContextToken = - contextToken || getTokenAtPosition(queryText, cursor, 0); + contextToken || getTokenAtPosition(queryText, cursor, offset); if (!token) { return null; } From f396fa946f071ace7f3233f4623994ca22daec4b Mon Sep 17 00:00:00 2001 From: Benjamin Sengupta Date: Sun, 16 Mar 2025 18:30:10 -0400 Subject: [PATCH 3/4] Remove redundant option --- packages/graphql-language-service/src/parser/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/graphql-language-service/src/parser/api.ts b/packages/graphql-language-service/src/parser/api.ts index bd66dbbc730..8346f743ea6 100644 --- a/packages/graphql-language-service/src/parser/api.ts +++ b/packages/graphql-language-service/src/parser/api.ts @@ -175,7 +175,7 @@ export function getContextAtPosition( cursor: IPosition, schema: GraphQLSchema, contextToken?: ContextToken, - options?: { mode?: GraphQLDocumentMode; uri?: string; offset?: number }, + options?: { mode?: GraphQLDocumentMode; uri?: string }, offset = 0, ): { token: ContextToken; From b7e0a66af7ddc2cac30c943e55963a3e9745f376 Mon Sep 17 00:00:00 2001 From: Benjamin Sengupta Date: Sun, 16 Mar 2025 18:34:24 -0400 Subject: [PATCH 4/4] Add changeset --- .changeset/dry-queens-return.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dry-queens-return.md diff --git a/.changeset/dry-queens-return.md b/.changeset/dry-queens-return.md new file mode 100644 index 00000000000..2e5ac52b735 --- /dev/null +++ b/.changeset/dry-queens-return.md @@ -0,0 +1,5 @@ +--- +'graphql-language-service': patch +--- + +Fix off-by-one when hovering over token