Skip to content

Commit 564f22a

Browse files
committed
first case
1 parent 3f0459d commit 564f22a

File tree

4 files changed

+70
-76
lines changed

4 files changed

+70
-76
lines changed

src/definitions/object.ts

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ limitations under the License.
1212
*/
1313

1414
import {
15+
FieldDefinitionNode,
1516
GraphQLSchema,
1617
isInputObjectType,
1718
ObjectTypeDefinitionNode,
@@ -23,7 +24,6 @@ import {
2324
getDependentInterfaceNames,
2425
getDependentUnionsForType,
2526
} from "../helpers/dependent-type-utils";
26-
import { shouldGenerateResolverClass } from "../helpers/should-generate-resolver-class";
2727
import { buildFieldDefinition } from "../helpers/build-field-definition";
2828
import { CodegenConfigWithDefaults } from "../helpers/build-config-with-defaults";
2929
import { inputTypeHasMatchingOutputType } from "../helpers/input-type-has-matching-output-type";
@@ -59,32 +59,44 @@ export function buildObjectTypeDefinition(
5959
? ""
6060
: "@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])\n";
6161

62-
const shouldGenerateFunctions = shouldGenerateResolverClass(node, config);
62+
const shouldGenerateFunctions = node.fields?.some(
63+
(fieldNode) => fieldNode.arguments?.length,
64+
);
6365
if (shouldGenerateFunctions) {
6466
const fieldsWithNoArguments = node.fields?.filter(
6567
(fieldNode) => !fieldNode.arguments?.length,
6668
);
67-
const constructor = fieldsWithNoArguments?.length
68-
? `(\n${fieldsWithNoArguments
69-
.map((fieldNode) => {
70-
const typeMetadata = buildTypeMetadata(
71-
fieldNode.type,
72-
schema,
73-
config,
74-
);
75-
return buildFieldDefinition(
76-
node,
77-
fieldNode,
78-
schema,
79-
config,
80-
typeMetadata,
81-
);
82-
})
83-
.join(",\n")}\n)`
84-
: "";
69+
const resolverClassesContainsType = config.resolverClasses?.includes(
70+
node.name.value,
71+
);
72+
const constructor =
73+
!resolverClassesContainsType && fieldsWithNoArguments?.length
74+
? `(\n${fieldsWithNoArguments
75+
.map((fieldNode) => {
76+
const typeMetadata = buildTypeMetadata(
77+
fieldNode.type,
78+
schema,
79+
config,
80+
);
81+
return buildFieldDefinition(
82+
node,
83+
fieldNode,
84+
schema,
85+
config,
86+
typeMetadata,
87+
);
88+
})
89+
.join(",\n")}\n)`
90+
: "";
8591

92+
const fieldsWithArguments = node.fields?.filter(
93+
(fieldNode) => fieldNode.arguments?.length,
94+
);
95+
const fieldNodes = resolverClassesContainsType
96+
? node.fields
97+
: fieldsWithArguments;
8698
return `${annotations}${outputRestrictionAnnotation}open class ${name}${constructor}${interfaceInheritance} {
87-
${getDataClassMembers({ node, schema, config, shouldGenerateFunctions })}
99+
${getDataClassMembers({ node, fieldNodes, schema, config, shouldGenerateFunctions })}
88100
}`;
89101
}
90102

@@ -95,19 +107,18 @@ ${getDataClassMembers({ node, schema, config })}
95107

96108
function getDataClassMembers({
97109
node,
110+
fieldNodes,
98111
schema,
99112
config,
100113
shouldGenerateFunctions,
101114
}: {
102115
node: ObjectTypeDefinitionNode;
116+
fieldNodes?: readonly FieldDefinitionNode[];
103117
schema: GraphQLSchema;
104118
config: CodegenConfigWithDefaults;
105119
shouldGenerateFunctions?: boolean;
106120
}) {
107-
return node.fields
108-
?.filter(
109-
(fieldNode) => !shouldGenerateFunctions || fieldNode.arguments?.length,
110-
)
121+
return (fieldNodes ?? node.fields)
111122
?.map((fieldNode) => {
112123
const typeMetadata = buildTypeMetadata(fieldNode.type, schema, config);
113124
return buildFieldDefinition(

src/helpers/build-field-definition.ts

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ export function buildFieldDefinition(
3232
typeMetadata: TypeMetadata,
3333
shouldUseFunction?: boolean,
3434
) {
35-
const modifier = buildFieldModifier(node, fieldNode, schema);
36-
const fieldArguments = buildFieldArguments(fieldNode, schema, config);
35+
const modifier = buildFieldModifier(node, fieldNode, schema, config);
36+
const fieldArguments = buildFieldArguments(node, fieldNode, schema, config);
3737
const fieldDefinition = `${modifier} ${fieldNode.name.value}${fieldArguments}`;
3838
const annotations = buildAnnotations({
3939
config,
@@ -66,12 +66,16 @@ function buildFieldModifier(
6666
node: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode,
6767
fieldNode: FieldDefinitionNode,
6868
schema: GraphQLSchema,
69+
config: CodegenConfigWithDefaults,
6970
) {
71+
const resolverClassesContainsType = config.resolverClasses?.includes(
72+
node.name.value,
73+
);
7074
const completableFuture = false;
7175
const shouldOverrideField =
7276
!completableFuture &&
7377
shouldModifyFieldWithOverride(node, fieldNode, schema);
74-
if (!fieldNode.arguments?.length) {
78+
if (!resolverClassesContainsType && !fieldNode.arguments?.length) {
7579
return shouldOverrideField ? "override val" : "val";
7680
}
7781
if (completableFuture || node.kind === Kind.INTERFACE_TYPE_DEFINITION) {
@@ -83,6 +87,31 @@ function buildFieldModifier(
8387
return "open fun";
8488
}
8589

90+
function buildFieldArguments(
91+
node: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode,
92+
fieldNode: FieldDefinitionNode,
93+
schema: GraphQLSchema,
94+
config: CodegenConfigWithDefaults,
95+
) {
96+
const resolverClassesContainsType = config.resolverClasses?.includes(
97+
node.name.value,
98+
);
99+
if (!resolverClassesContainsType && !fieldNode.arguments?.length) {
100+
return "";
101+
}
102+
const existingFieldArguments = fieldNode.arguments?.map((arg) => {
103+
const argMetadata = buildTypeMetadata(arg.type, schema, config);
104+
return `${arg.name.value}: ${argMetadata.typeName}${arg.type.kind === Kind.NON_NULL_TYPE ? "" : "?"}`;
105+
});
106+
const dataFetchingEnvironmentArgument =
107+
"dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment";
108+
const extraFieldArguments = [dataFetchingEnvironmentArgument];
109+
const allFieldArguments = existingFieldArguments?.concat(extraFieldArguments);
110+
return allFieldArguments?.length
111+
? `(${allFieldArguments?.join(", ")})`
112+
: "()";
113+
}
114+
86115
function shouldModifyFieldWithOverride(
87116
node: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode,
88117
fieldNode: FieldDefinitionNode,
@@ -112,24 +141,3 @@ function buildInterfaceFieldDefinition(
112141
);
113142
return `${annotations}${fieldText}`;
114143
}
115-
116-
function buildFieldArguments(
117-
fieldNode: FieldDefinitionNode,
118-
schema: GraphQLSchema,
119-
config: CodegenConfigWithDefaults,
120-
) {
121-
if (!fieldNode.arguments?.length) {
122-
return "";
123-
}
124-
const existingFieldArguments = fieldNode.arguments.map((arg) => {
125-
const argMetadata = buildTypeMetadata(arg.type, schema, config);
126-
return `${arg.name.value}: ${argMetadata.typeName}${arg.type.kind === Kind.NON_NULL_TYPE ? "" : "?"}`;
127-
});
128-
const dataFetchingEnvironmentArgument =
129-
"dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment";
130-
const extraFieldArguments = [dataFetchingEnvironmentArgument];
131-
const allFieldArguments = existingFieldArguments?.concat(extraFieldArguments);
132-
return allFieldArguments?.length
133-
? `(${allFieldArguments?.join(", ")})`
134-
: "()";
135-
}

src/helpers/should-generate-resolver-class.ts

Lines changed: 0 additions & 25 deletions
This file was deleted.

test/unit/should_honor_resolverClasses_config/expected.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ open class MyResolverType {
77
open fun nullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = throw NotImplementedError("MyResolverType.nullableField must be implemented.")
88
open fun nonNullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String = throw NotImplementedError("MyResolverType.nonNullableField must be implemented.")
99
open fun nullableResolver(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = throw NotImplementedError("MyResolverType.nullableResolver must be implemented.")
10-
open fun nonNullableResolver(arg: InputTypeForResolver, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String = throw NotImplementedError("MyResolverType.nonNullableResolver must be implemented.")
10+
open fun nonNullableResolver(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String = throw NotImplementedError("MyResolverType.nonNullableResolver must be implemented.")
1111
}
1212

1313
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
1414
open class MySuspendResolverType {
1515
open suspend fun nullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = throw NotImplementedError("MySuspendResolverType.nullableField must be implemented.")
1616
open suspend fun nonNullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String = throw NotImplementedError("MySuspendResolverType.nonNullableField must be implemented.")
1717
open suspend fun nullableResolver(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = throw NotImplementedError("MySuspendResolverType.nullableResolver must be implemented.")
18-
open suspend fun nonNullableResolver(arg: InputTypeForResolver, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String = throw NotImplementedError("MySuspendResolverType.nonNullableResolver must be implemented.")
18+
open suspend fun nonNullableResolver(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String = throw NotImplementedError("MySuspendResolverType.nonNullableResolver must be implemented.")
1919
}
2020

2121
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])

0 commit comments

Comments
 (0)