diff --git a/src/main/java/com/google/api/generator/engine/ast/AssignmentExpr.java b/src/main/java/com/google/api/generator/engine/ast/AssignmentExpr.java index 0e32d58c42..9223e41783 100644 --- a/src/main/java/com/google/api/generator/engine/ast/AssignmentExpr.java +++ b/src/main/java/com/google/api/generator/engine/ast/AssignmentExpr.java @@ -15,6 +15,7 @@ package com.google.api.generator.engine.ast; import com.google.auto.value.AutoValue; +import com.google.common.base.Preconditions; @AutoValue public abstract class AssignmentExpr implements Expr { @@ -67,6 +68,15 @@ public AssignmentExpr build() { lhsType.reference().name(), rhsType.reference().name())); } } + + if (!assignmentExpr.variableExpr().isDecl()) { + Preconditions.checkState( + !assignmentExpr.variableExpr().isFinal(), + String.format( + "Cannot assign a value to final variable '%s'.", + assignmentExpr.variableExpr().variable().name())); + } + return assignmentExpr; } } diff --git a/src/test/java/com/google/api/generator/engine/ast/AssignmentExprTest.java b/src/test/java/com/google/api/generator/engine/ast/AssignmentExprTest.java index 56f91f7fec..b40590f231 100644 --- a/src/test/java/com/google/api/generator/engine/ast/AssignmentExprTest.java +++ b/src/test/java/com/google/api/generator/engine/ast/AssignmentExprTest.java @@ -137,6 +137,32 @@ public void writeAssignmentExpr_invalidBoxedPrimitiveType() { assertInvalidAssignmentExpr(lVariableExpr, rVariableExpr); } + @Test + public void writeAssignmentExpr_validIsDeclFinalVariableExpr() { + Variable lVariable = Variable.builder().setName("x").setType(TypeNode.INT).build(); + VariableExpr lVariableExpr = + VariableExpr.builder().setVariable(lVariable).setIsDecl(true).setIsFinal(true).build(); + + ValueExpr valueExpr = + ValueExpr.withValue(PrimitiveValue.builder().setType(TypeNode.INT).setValue("0").build()); + assertValidAssignmentExpr(lVariableExpr, valueExpr); + } + + @Test + public void writeAssignmentExpr_invalidIsNotDeclFinalVariableExpr() { + Variable lVariable = Variable.builder().setName("x").setType(TypeNode.INT).build(); + VariableExpr lVariableExpr = + VariableExpr.builder().setVariable(lVariable).setIsDecl(false).setIsFinal(true).build(); + + ValueExpr valueExpr = + ValueExpr.withValue(PrimitiveValue.builder().setType(TypeNode.INT).setValue("0").build()); + assertThrows( + IllegalStateException.class, + () -> { + AssignmentExpr.builder().setVariableExpr(lVariableExpr).setValueExpr(valueExpr).build(); + }); + } + private static void assertInvalidAssignmentExpr(VariableExpr variableExpr, Expr valueExpr) { assertThrows( TypeMismatchException.class,