From 95270aff9a29c728948d4d461755ddaa88a0397c Mon Sep 17 00:00:00 2001 From: Rikki Schulte Date: Sat, 18 May 2024 18:37:44 +0200 Subject: [PATCH] test for field argument definition lookup --- .../src/GraphQLLanguageService.ts | 12 ++++-------- .../src/__tests__/GraphQLLanguageService-test.ts | 11 +++++++++++ .../src/__tests__/MessageProcessor.spec.ts | 8 +++++++- packages/graphql-language-service/src/index.ts | 2 ++ .../src/interface/getDefinition.ts | 10 ++-------- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/packages/graphql-language-service-server/src/GraphQLLanguageService.ts b/packages/graphql-language-service-server/src/GraphQLLanguageService.ts index e35df3471b3..db7e04aca53 100644 --- a/packages/graphql-language-service-server/src/GraphQLLanguageService.ts +++ b/packages/graphql-language-service-server/src/GraphQLLanguageService.ts @@ -45,6 +45,8 @@ import { getASTNodeAtPosition, getTokenAtPosition, getTypeInfo, + DefinitionQueryResponse, + getDefinitionQueryResultForArgument, } from 'graphql-language-service'; import type { GraphQLCache } from './GraphQLCache'; @@ -57,10 +59,6 @@ import { SymbolInformation, SymbolKind, } from 'vscode-languageserver-types'; -import { - DefinitionQueryResponse, - getDefinitionQueryResultForArgument, -} from 'graphql-language-service/src/interface'; const KIND_TO_SYMBOL_KIND: { [key: string]: SymbolKind } = { [Kind.FIELD]: SymbolKind.Field, @@ -488,10 +486,7 @@ export class GraphQLLanguageService { const typeInfo = getTypeInfo(schema!, token.state); const fieldName = typeInfo.fieldDef?.name; const argumentName = typeInfo.argDef?.name; - if (typeInfo && fieldName && argumentName) { - const parentTypeName = (typeInfo.parentType as any).toString(); - const objectTypeDefinitions = await this._graphQLCache.getObjectTypeDefinitions(projectConfig); @@ -501,7 +496,8 @@ export class GraphQLLanguageService { return getDefinitionQueryResultForArgument( argumentName, fieldName, - parentTypeName, + // @ts-expect-error - typeInfo is not typed correctly + typeInfo.argDef?.type?.name, dependencies, ); } diff --git a/packages/graphql-language-service-server/src/__tests__/GraphQLLanguageService-test.ts b/packages/graphql-language-service-server/src/__tests__/GraphQLLanguageService-test.ts index 0283c277174..0bfc6708500 100644 --- a/packages/graphql-language-service-server/src/__tests__/GraphQLLanguageService-test.ts +++ b/packages/graphql-language-service-server/src/__tests__/GraphQLLanguageService-test.ts @@ -14,6 +14,7 @@ import { GraphQLLanguageService } from '../GraphQLLanguageService'; import { SymbolKind } from 'vscode-languageserver-protocol'; import { Position } from 'graphql-language-service'; import { NoopLogger } from '../Logger'; +import { GraphQLEnumType } from 'graphql'; const MOCK_CONFIG = { filepath: join(__dirname, '.graphqlrc.yml'), @@ -71,6 +72,16 @@ describe('GraphQLLanguageService', () => { start: 293, end: 335, }, + arguments: [ + { + name: { value: 'arg' }, + loc: { + start: 293, + end: 335, + }, + type: GraphQLEnumType, + }, + ], }, ], diff --git a/packages/graphql-language-service-server/src/__tests__/MessageProcessor.spec.ts b/packages/graphql-language-service-server/src/__tests__/MessageProcessor.spec.ts index 37a86f412e0..7566a5860c2 100644 --- a/packages/graphql-language-service-server/src/__tests__/MessageProcessor.spec.ts +++ b/packages/graphql-language-service-server/src/__tests__/MessageProcessor.spec.ts @@ -420,7 +420,7 @@ describe('MessageProcessor with config', () => { // and add a fragments.ts file, watched await project.addFile( 'fragments.ts', - '\n\n\nexport const fragment = gql`\n\n fragment T on Test { isTest }\n`', + '\n\n\nexport const fragment = gql`\n\n fragment T on Test { isTest } \n query { hasArgs(string: "") }\n`', true, ); @@ -445,6 +445,12 @@ describe('MessageProcessor with config', () => { character: 31, }, }); + const defsForArgs = await project.lsp.handleDefinitionRequest({ + textDocument: { uri: project.uri('fragments.ts') }, + position: { character: 19, line: 6 }, + }); + + expect(defsForArgs[0].uri).toEqual(URI.parse(genSchemaPath).toString()); expect(project.lsp._logger.error).not.toHaveBeenCalled(); project.lsp.handleShutdownRequest(); }); diff --git a/packages/graphql-language-service/src/index.ts b/packages/graphql-language-service/src/index.ts index 1f268a5f3bc..0f0574a401a 100644 --- a/packages/graphql-language-service/src/index.ts +++ b/packages/graphql-language-service/src/index.ts @@ -21,6 +21,7 @@ export { getDefinitionQueryResultForFragmentSpread, getDefinitionQueryResultForNamedType, getDefinitionQueryResultForField, + getDefinitionQueryResultForArgument, getDefinitionState, getDiagnostics, getFieldDef, @@ -37,6 +38,7 @@ export { SeverityEnum, DIAGNOSTIC_SEVERITY, DefinitionQueryResult, + DefinitionQueryResponse, canUseDirective, SuggestionCommand, AutocompleteSuggestionOptions, diff --git a/packages/graphql-language-service/src/interface/getDefinition.ts b/packages/graphql-language-service/src/interface/getDefinition.ts index 40c3d8131a4..6b50d429d34 100644 --- a/packages/graphql-language-service/src/interface/getDefinition.ts +++ b/packages/graphql-language-service/src/interface/getDefinition.ts @@ -127,21 +127,16 @@ export async function getDefinitionQueryResultForArgument( typeName: string, dependencies: Array, ): Promise { - const defNodes = dependencies.filter( + dependencies.filter( ({ definition }) => definition.name && definition.name.value === typeName, ); - if (defNodes.length === 0) { - throw new Error(`Definition not found for GraphQL type ${typeName}`); - } - const definitions: Array = []; - for (const { filePath, content, definition } of defNodes) { + for (const { filePath, content, definition } of dependencies) { const argDefinition = (definition as ObjectTypeDefinitionNode).fields ?.find(item => item.name.value === fieldName) ?.arguments?.find(item => item.name.value === argumentName); - if (argDefinition == null) { continue; } @@ -154,7 +149,6 @@ export async function getDefinitionQueryResultForArgument( ), ); } - return { definitions, // TODO: seems like it's not using