Skip to content

Commit

Permalink
fix: add final keyword check on assignment expr (#366)
Browse files Browse the repository at this point in the history
  • Loading branch information
summer-ji-eng committed Oct 6, 2020
1 parent 6e9b4a5 commit f323896
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit f323896

Please sign in to comment.