diff --git a/.changelog/bugfix-waiter-result-getter-collision.json b/.changelog/bugfix-waiter-result-getter-collision.json new file mode 100644 index 000000000000..ebd26a713530 --- /dev/null +++ b/.changelog/bugfix-waiter-result-getter-collision.json @@ -0,0 +1,6 @@ +{ + "type": "bugfix", + "category": "smithy-cpp-codegen", + "contributor": "sbiscigl", + "description": "Fix generated waiters to call the renamed getter when an output member's getter name matches its result class name." +} diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/waiters/jmespath/GetterChainEmitter.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/waiters/jmespath/GetterChainEmitter.java index 215d26e42cf3..31e584ddbcfa 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/waiters/jmespath/GetterChainEmitter.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/waiters/jmespath/GetterChainEmitter.java @@ -9,15 +9,28 @@ import software.amazon.smithy.jmespath.ast.FlattenExpression; import software.amazon.smithy.jmespath.ast.Subexpression; +import java.util.Optional; + /** * Emits a getter chain for non-projection field access (e.g. ".GetCluster().GetStatus()"). */ public class GetterChainEmitter extends UnsupportedExpressionVisitor { + private final Optional resultClassName; + + public GetterChainEmitter() { + this(Optional.empty()); + } + + public GetterChainEmitter(Optional resultClassName) { + this.resultClassName = resultClassName; + } + @Override public String visitField(FieldExpression e) { - return ".Get" + ServiceNameUtil.capitalize(e.getName()) + "()"; + String getter = "Get" + ServiceNameUtil.capitalize(e.getName()); + return "." + resultClassName.filter(getter::equals).map(name -> "Get" + name).orElse(getter) + "()"; } @Override public String visitSubexpression(Subexpression e) { - return e.getLeft().accept(this) + e.getRight().accept(this); + return e.getLeft().accept(this) + e.getRight().accept(new GetterChainEmitter()); } @Override public String visitFlatten(FlattenExpression e) { return e.getExpression().accept(this); diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/waiters/jmespath/TopLevelVisitor.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/waiters/jmespath/TopLevelVisitor.java index da9f61377781..bb00ad0665f0 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/waiters/jmespath/TopLevelVisitor.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/waiters/jmespath/TopLevelVisitor.java @@ -4,6 +4,7 @@ */ package com.amazonaws.util.awsclientsmithygenerator.generators.waiters.jmespath; +import com.amazonaws.util.awsclientsmithygenerator.generators.ShapeUtil; import software.amazon.smithy.jmespath.JmespathExpression; import software.amazon.smithy.jmespath.ast.AndExpression; import software.amazon.smithy.jmespath.ast.ComparatorExpression; @@ -20,6 +21,7 @@ import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.waiters.PathComparator; +import java.util.Optional; import java.util.Set; /** @@ -196,7 +198,9 @@ private String emitPathCode(JmespathExpression expr) { EnumInfo enumInfo = EnumResolver.resolveEnumInfo(expr, model, operation); if (projectionLevels == 0) { - String access = "result" + expr.accept(new GetterChainEmitter()); + Optional resultClassName = Optional.ofNullable(operation) + .map(op -> op.getId().getName() + ShapeUtil.getResultSuffix(model, op, smithyServiceName)); + String access = "result" + expr.accept(new GetterChainEmitter(resultClassName)); if (enumInfo != null) { access = enumInfo.wrapAccess(access); enumIncludes.add(enumInfo.shapeName);