From 159686adf68bad9263fec31f4db375cdbf1f32e2 Mon Sep 17 00:00:00 2001 From: Jay Herron Date: Sun, 9 Aug 2026 21:52:04 -0600 Subject: [PATCH] fix: Use the GraphQL argument name as the resolver call's label This fixes compiler bugs when using arguments whose names are swift keywords like `where` and `if`. --- .../BuildGraphQLSchemaGenerator.swift | 2 +- .../SchemaGeneratorTests.swift | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Sources/GraphQLGeneratorCore/Generator/BuildGraphQLSchemaGenerator.swift b/Sources/GraphQLGeneratorCore/Generator/BuildGraphQLSchemaGenerator.swift index 9f7f751..4fc2d22 100644 --- a/Sources/GraphQLGeneratorCore/Generator/BuildGraphQLSchemaGenerator.swift +++ b/Sources/GraphQLGeneratorCore/Generator/BuildGraphQLSchemaGenerator.swift @@ -234,7 +234,7 @@ package struct BuildGraphQLSchemaGenerator { let \(safeArgName) = \(decodeStatement) """ - argsList.append("\(safeArgName): \(safeArgName)") + argsList.append("\(argName): \(safeArgName)") } // Add context diff --git a/Tests/GraphQLGeneratorCoreTests/SchemaGeneratorTests.swift b/Tests/GraphQLGeneratorCoreTests/SchemaGeneratorTests.swift index f9baee9..166d424 100644 --- a/Tests/GraphQLGeneratorCoreTests/SchemaGeneratorTests.swift +++ b/Tests/GraphQLGeneratorCoreTests/SchemaGeneratorTests.swift @@ -310,6 +310,37 @@ struct SchemaGeneratorTests { #expect(result == expected) } + @Test func generateResolverCallbackHandlesSwiftKeywordArgumentNames() throws { + let field = GraphQLField( + type: GraphQLString, + args: [ + "ID": GraphQLArgument(type: GraphQLNonNull(GraphQLID)), + "where": GraphQLArgument(type: GraphQLString), + ] + ) + + let queryType = try GraphQLObjectType(name: "Query") + + let result = try generator.generateResolverCallback( + variableName: "queryFields", + fieldName: "user", + field: field, + target: .query, + parentType: queryType + ) + + let expected = """ + queryFields["user"]?.resolve = { @Sendable source, args, context, info in + let id = try decoder.decode((String).self, from: args["ID"]) + let _where = args["where"] != .undefined ? try decoder.decode((String?).self, from: args["where"]) : nil + let context = try cast(context, to: GraphQLContext.self) + return try await Resolvers.Query.user(ID: id, where: _where, context: context, info: info) + } + """ + + #expect(result == expected) + } + @Test func generateResolverCallbackForSubscription() throws { let field = GraphQLField( type: GraphQLString