Skip to content

Commit 81b565c

Browse files
fix(generators): getObject has no generic type (#6026)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent e28ba46 commit 81b565c

File tree

5 files changed

+20
-1
lines changed

5 files changed

+20
-1
lines changed

generators/src/main/java/com/algolia/codegen/cts/tests/Snippet.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public void addMethodCall(Map<String, Object> context, ParametersWithDataType pa
5454

5555
try {
5656
context.put("isGeneric", (boolean) ope.vendorExtensions.getOrDefault("x-is-generic", false));
57+
context.put("isReturnGeneric", (boolean) ope.vendorExtensions.getOrDefault("x-return-is-generic", false));
5758
context.put("isCustomRequest", Helpers.CUSTOM_METHODS.contains(ope.operationIdOriginal));
5859
context.put("isAsyncMethod", (boolean) ope.vendorExtensions.getOrDefault("x-asynchronous-helper", true));
5960
context.put("hasParams", ope.getHasParams());

generators/src/main/java/com/algolia/codegen/cts/tests/TestsClient.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ public void run(Map<String, CodegenModel> models, Map<String, CodegenOperation>
134134
stepOut.put("isMethod", true); // TODO: remove once kotlin is converted
135135
stepOut.put("hasParams", ope.getHasParams());
136136
stepOut.put("isGeneric", (boolean) ope.vendorExtensions.getOrDefault("x-is-generic", false));
137+
stepOut.put("isReturnGeneric", (boolean) ope.vendorExtensions.getOrDefault("x-return-is-generic", false));
137138
if (ope.returnType != null && ope.returnType.length() > 0) {
138139
stepOut.put("returnType", Helpers.toPascalCase(ope.returnType));
139140
stepOut.put("returnsBoolean", ope.returnType.equals("Boolean")); // ruby requires a ? for boolean functions.

generators/src/main/java/com/algolia/codegen/cts/tests/TestsRequest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public void run(Map<String, CodegenModel> models, Map<String, CodegenOperation>
140140

141141
try {
142142
test.put("isGeneric", (boolean) ope.vendorExtensions.getOrDefault("x-is-generic", false));
143+
test.put("isReturnGeneric", (boolean) ope.vendorExtensions.getOrDefault("x-return-is-generic", false));
143144
test.put("isCustomRequest", Helpers.CUSTOM_METHODS.contains(ope.operationIdOriginal));
144145

145146
if (req.request != null && !isHelper) {

generators/src/main/java/com/algolia/codegen/utils/GenericPropagator.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,22 @@ public static void propagateGenericsToOperations(String language, String client,
247247
if (!ope.optionalParams.isEmpty()) {
248248
ope.optionalParams.get(0).vendorExtensions.put("x-is-generic", true);
249249
}
250+
} else if (
251+
returnType == null &&
252+
ope.returnProperty != null &&
253+
(boolean) ope.returnProperty.vendorExtensions.getOrDefault("x-is-generic", false)
254+
) {
255+
// The return type itself IS the generic T (inline schema with x-is-generic, no named
256+
// model).
257+
// We only set x-return-is-generic (not x-is-generic) so that only templates that
258+
// explicitly handle x-return-is-generic (e.g. JavaScript) apply the generic behavior.
259+
// Other language templates (Java, C#, Swift) remain unchanged, avoiding breaking changes.
260+
ope.vendorExtensions.put("x-return-is-generic", true);
261+
if (!ope.optionalParams.isEmpty()) {
262+
// Mirror onto optionalParams[0] so that templates inside {{#optionalParams.0}} blocks
263+
// can find it via Mustache scope resolution.
264+
ope.optionalParams.get(0).vendorExtensions.put("x-return-is-generic", true);
265+
}
250266
}
251267
}
252268
}

templates/javascript/clients/api-single.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export function create{{#lambda.titlecase}}{{clientName}}{{/lambda.titlecase}}({
103103
{{/isCompositionClient}}
104104
{{#operation}}
105105
{{> client/api/operation/jsdoc}}
106-
{{nickname}}{{#vendorExtensions.x-is-generic}}<T>{{/vendorExtensions.x-is-generic}}{{#vendorExtensions.x-has-generic-parameter}}<T extends object>{{/vendorExtensions.x-has-generic-parameter}}( {{> client/api/operation/parameters}} ) : Promise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}{{#vendorExtensions.x-is-generic}}<T>{{/vendorExtensions.x-is-generic}}> {
106+
{{nickname}}{{#vendorExtensions.x-return-is-generic}}<T = Record<string, unknown>>{{/vendorExtensions.x-return-is-generic}}{{^vendorExtensions.x-return-is-generic}}{{#vendorExtensions.x-is-generic}}<T>{{/vendorExtensions.x-is-generic}}{{/vendorExtensions.x-return-is-generic}}{{#vendorExtensions.x-has-generic-parameter}}<T extends object>{{/vendorExtensions.x-has-generic-parameter}}( {{> client/api/operation/parameters}} ) : Promise<{{#vendorExtensions.x-return-is-generic}}T{{/vendorExtensions.x-return-is-generic}}{{^vendorExtensions.x-return-is-generic}}{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}{{#vendorExtensions.x-is-generic}}<T>{{/vendorExtensions.x-is-generic}}{{/vendorExtensions.x-return-is-generic}}> {
107107
{{#vendorExtensions.x-legacy-signature}}
108108
{{> client/api/operation/legacySearchCompatible/implementation}}
109109
{{/vendorExtensions.x-legacy-signature}}

0 commit comments

Comments
 (0)