diff --git a/src/main/java/com/google/api/generator/gapic/composer/RetrySettingsComposer.java b/src/main/java/com/google/api/generator/gapic/composer/RetrySettingsComposer.java index 09c4eea906..22608b9f0d 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/RetrySettingsComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/RetrySettingsComposer.java @@ -610,7 +610,6 @@ private static Map createStaticTypes() { RetrySettings.class, StatusCode.class, UnaryCallSettings.class); - return concreteClazzes.stream() .collect( Collectors.toMap( diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java index a511558462..e842e37bdf 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java @@ -1163,7 +1163,7 @@ private static List createNestedClassMethods( Map types) { List nestedClassMethods = new ArrayList<>(); nestedClassMethods.addAll( - createNestedClassConstructorMethods(nestedMethodSettingsMemberVarExprs, types)); + createNestedClassConstructorMethods(service, nestedMethodSettingsMemberVarExprs, types)); nestedClassMethods.add(createNestedClassInitDefaultsMethod(service, serviceConfig, types)); // TODO(miraleung): More methods. @@ -1220,7 +1220,10 @@ private static MethodDefinition createNestedClassInitDefaultsMethod( } private static List createNestedClassConstructorMethods( - Map nestedMethodSettingsMemberVarExprs, Map types) { + Service service, + Map nestedMethodSettingsMemberVarExprs, + Map types) { + TypeNode builderType = types.get(NESTED_BUILDER_CLASS_NAME); List ctorMethods = new ArrayList<>(); @@ -1324,7 +1327,7 @@ private static List createNestedClassConstructorMethods( }) .collect(Collectors.toList())); - ctorBodyExprs.add( + Expr unaryMethodSettingsBuildersAssignExpr = AssignmentExpr.builder() .setVariableExpr(NESTED_UNARY_METHOD_SETTINGS_BUILDERS_VAR_EXPR) .setValueExpr( @@ -1345,7 +1348,8 @@ private static List createNestedClassConstructorMethods( .collect(Collectors.toList())) .setReturnType(NESTED_UNARY_METHOD_SETTINGS_BUILDERS_VAR_EXPR.type()) .build()) - .build()); + .build(); + ctorBodyExprs.add(unaryMethodSettingsBuildersAssignExpr); ctorBodyExprs.add( MethodInvocationExpr.builder() @@ -1364,6 +1368,50 @@ private static List createNestedClassConstructorMethods( .collect(Collectors.toList())) .build()); + // Third constructor that takes a ServivceStubSettings. + TypeNode outerSettingsType = types.get(getThisClassName(service.name())); + VariableExpr settingsVarExpr = + VariableExpr.withVariable( + Variable.builder().setType(outerSettingsType).setName("settings").build()); + ctorBodyExprs = new ArrayList<>(); + ctorBodyExprs.add( + ReferenceConstructorExpr.superBuilder() + .setType(builderType) + .setArguments(settingsVarExpr) + .build()); + // TODO(cleanup): Technically this should actually use the outer class's Settings + // members to avoid decoupling variable names. + ctorBodyExprs.addAll( + nestedMethodSettingsMemberVarExprs.values().stream() + .map( + v -> + AssignmentExpr.builder() + .setVariableExpr(v) + .setValueExpr( + MethodInvocationExpr.builder() + .setExprReferenceExpr( + VariableExpr.builder() + .setExprReferenceExpr(settingsVarExpr) + .setVariable(v.variable()) + .build()) + .setMethodName("toBuilder") + .setReturnType(v.type()) + .build()) + .build()) + .collect(Collectors.toList())); + ctorBodyExprs.add(unaryMethodSettingsBuildersAssignExpr); + + ctorMethods.add( + MethodDefinition.constructorBuilder() + .setScope(ScopeNode.PROTECTED) + .setReturnType(builderType) + .setArguments(settingsVarExpr.toBuilder().setIsDecl(true).build()) + .setBody( + ctorBodyExprs.stream() + .map(e -> ExprStatement.withExpr(e)) + .collect(Collectors.toList())) + .build()); + return ctorMethods; } diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java index 9c6c76eae8..4979b648a9 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java @@ -422,6 +422,22 @@ public void generateServiceClasses() { + " initDefaults(this);\n" + " }\n" + "\n" + + " protected Builder(EchoStubSettings settings) {\n" + + " super(settings);\n" + + " echoSettings = settings.echoSettings.toBuilder();\n" + + " expandSettings = settings.expandSettings.toBuilder();\n" + + " collectSettings = settings.collectSettings.toBuilder();\n" + + " chatSettings = settings.chatSettings.toBuilder();\n" + + " chatAgainSettings = settings.chatAgainSettings.toBuilder();\n" + + " pagedExpandSettings = settings.pagedExpandSettings.toBuilder();\n" + + " waitSettings = settings.waitSettings.toBuilder();\n" + + " waitOperationSettings = settings.waitOperationSettings.toBuilder();\n" + + " blockSettings = settings.blockSettings.toBuilder();\n" + + " unaryMethodSettingsBuilders =\n" + + " ImmutableList.>of(\n" + + " echoSettings, pagedExpandSettings, waitSettings, blockSettings);\n" + + " }\n" + + "\n" + " private static Builder initDefaults(Builder builder) {\n" + " builder\n" + " .echoSettings()\n"