Skip to content

Commit

Permalink
[ggj][codegen](2/2)feat: Add HashCode in resource name (#368)
Browse files Browse the repository at this point in the history
  • Loading branch information
summer-ji-eng committed Oct 7, 2020
1 parent f228417 commit 257ff42
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.google.api.core.BetaApi;
import com.google.api.generator.engine.ast.AnnotationNode;
import com.google.api.generator.engine.ast.AssignmentExpr;
import com.google.api.generator.engine.ast.AssignmentOperationExpr;
import com.google.api.generator.engine.ast.CastExpr;
import com.google.api.generator.engine.ast.ClassDefinition;
import com.google.api.generator.engine.ast.CommentStatement;
Expand Down Expand Up @@ -274,6 +275,7 @@ private static List<MethodDefinition> createClassMethods(
javaMethods.add(
createToStringMethod(templateFinalVarExprs, patternTokenVarExprs, tokenHierarchies));
javaMethods.add(createEqualsMethod(resourceName, tokenHierarchies, types));
javaMethods.add(createHashCodeMethod(tokenHierarchies));
return javaMethods;
}

Expand Down Expand Up @@ -1257,6 +1259,74 @@ private static MethodInvocationExpr createObjectsEqualsForTokenMethodEpxr(
.build();
}

private static MethodDefinition createHashCodeMethod(List<List<String>> tokenHierarchies) {
List<Statement> asgmtBody = new ArrayList<>();
// code: int h = 1;
Variable hVar = Variable.builder().setType(TypeNode.INT).setName("h").build();
VariableExpr hVarExpr = VariableExpr.builder().setVariable(hVar).build();
ValueExpr hValueExpr =
ValueExpr.withValue(PrimitiveValue.builder().setType(TypeNode.INT).setValue("1").build());
AssignmentExpr hAssignmentExpr =
AssignmentExpr.builder()
.setVariableExpr(hVarExpr.toBuilder().setIsDecl(true).build())
.setValueExpr(hValueExpr)
.build();
asgmtBody.add(ExprStatement.withExpr(hAssignmentExpr));
// code: h *= 1000003;
// code: h ^= Objects.hashCode(...);
ValueExpr numValueExpr =
ValueExpr.withValue(
PrimitiveValue.builder().setType(TypeNode.INT).setValue("1000003").build());
AssignmentOperationExpr multiplyAsgmtOpExpr =
AssignmentOperationExpr.multiplyAssignmentWithExprs(hVarExpr, numValueExpr);
// If it has variants, add the multiply and xor assignment operation exprs for fixedValue.
boolean hasVariants = tokenHierarchies.size() > 1;
if (hasVariants) {
VariableExpr fixedValueVarExpr = FIXED_CLASS_VARS.get("fixedValue");
asgmtBody.add(ExprStatement.withExpr(multiplyAsgmtOpExpr));
asgmtBody.add(
ExprStatement.withExpr(
AssignmentOperationExpr.xorAssignmentWithExprs(
hVarExpr, createObjectsHashCodeForVarMethod(fixedValueVarExpr))));
}
// Add the multiply and xor assignment operation exprs for tokens.
Set<String> tokenSet = getTokenSet(tokenHierarchies);
tokenSet.stream()
.forEach(
token -> {
VariableExpr tokenVarExpr =
VariableExpr.withVariable(
Variable.builder()
.setName(JavaStyle.toLowerCamelCase(token))
.setType(TypeNode.STRING)
.build());
asgmtBody.add(ExprStatement.withExpr(multiplyAsgmtOpExpr));
asgmtBody.add(
ExprStatement.withExpr(
AssignmentOperationExpr.xorAssignmentWithExprs(
hVarExpr, createObjectsHashCodeForVarMethod(tokenVarExpr))));
});

return MethodDefinition.builder()
.setIsOverride(true)
.setScope(ScopeNode.PUBLIC)
.setReturnType(TypeNode.INT)
.setName("hashCode")
.setBody(asgmtBody)
.setReturnExpr(hVarExpr)
.build();
}

private static MethodInvocationExpr createObjectsHashCodeForVarMethod(VariableExpr varExpr) {
// code: Objects.hashCode(varExpr)
return MethodInvocationExpr.builder()
.setMethodName("hashCode")
.setStaticReferenceType(STATIC_TYPES.get("Objects"))
.setArguments(varExpr)
.setReturnType(TypeNode.INT)
.build();
}

private static List<ClassDefinition> createNestedBuilderClasses(
ResourceName resourceName,
List<List<String>> tokenHierarchies,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,22 @@ public class FoobarName implements ResourceName {
return false;
}

@Override
public int hashCode() {
int h = 1;
h *= 1000003;
h ^= Objects.hashCode(fixedValue);
h *= 1000003;
h ^= Objects.hashCode(project);
h *= 1000003;
h ^= Objects.hashCode(foobar);
h *= 1000003;
h ^= Objects.hashCode(variant);
h *= 1000003;
h ^= Objects.hashCode(barFoo);
return h;
}

/** Builder for projects/{project}/foobars/{foobar}. */
public static class Builder {
private String project;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,14 @@ public class SessionName implements ResourceName {
return false;
}

@Override
public int hashCode() {
int h = 1;
h *= 1000003;
h ^= Objects.hashCode(session);
return h;
}

/** Builder for sessions/{session}. */
public static class Builder {
private String session;
Expand Down

0 comments on commit 257ff42

Please sign in to comment.