|
17 | 17 | import com.google.api.core.BetaApi; |
18 | 18 | import com.google.api.generator.engine.ast.AnnotationNode; |
19 | 19 | import com.google.api.generator.engine.ast.AssignmentExpr; |
| 20 | +import com.google.api.generator.engine.ast.CastExpr; |
20 | 21 | import com.google.api.generator.engine.ast.ClassDefinition; |
21 | 22 | import com.google.api.generator.engine.ast.CommentStatement; |
22 | 23 | import com.google.api.generator.engine.ast.ConcreteReference; |
|
30 | 31 | import com.google.api.generator.engine.ast.MethodInvocationExpr; |
31 | 32 | import com.google.api.generator.engine.ast.NewObjectExpr; |
32 | 33 | import com.google.api.generator.engine.ast.NullObjectValue; |
| 34 | +import com.google.api.generator.engine.ast.PrimitiveValue; |
33 | 35 | import com.google.api.generator.engine.ast.Reference; |
| 36 | +import com.google.api.generator.engine.ast.RelationalOperationExpr; |
34 | 37 | import com.google.api.generator.engine.ast.ReturnExpr; |
35 | 38 | import com.google.api.generator.engine.ast.ScopeNode; |
36 | 39 | import com.google.api.generator.engine.ast.Statement; |
|
57 | 60 | import java.util.Arrays; |
58 | 61 | import java.util.Collections; |
59 | 62 | import java.util.HashMap; |
| 63 | +import java.util.Iterator; |
60 | 64 | import java.util.LinkedHashSet; |
61 | 65 | import java.util.List; |
62 | 66 | import java.util.Map; |
@@ -269,6 +273,7 @@ private static List<MethodDefinition> createClassMethods( |
269 | 273 | createFieldValueGetterMethods(resourceName, patternTokenVarExprs, tokenHierarchies, types)); |
270 | 274 | javaMethods.add( |
271 | 275 | createToStringMethod(templateFinalVarExprs, patternTokenVarExprs, tokenHierarchies)); |
| 276 | + javaMethods.add(createEqualsMethod(resourceName, tokenHierarchies, types)); |
272 | 277 | return javaMethods; |
273 | 278 | } |
274 | 279 |
|
@@ -1140,6 +1145,118 @@ private static MethodDefinition createToStringMethod( |
1140 | 1145 | .build(); |
1141 | 1146 | } |
1142 | 1147 |
|
| 1148 | + private static MethodDefinition createEqualsMethod( |
| 1149 | + ResourceName resourceName, List<List<String>> tokenHierarchies, Map<String, TypeNode> types) { |
| 1150 | + // Create method definition variables. |
| 1151 | + Variable oVariable = Variable.builder().setType(TypeNode.OBJECT).setName("o").build(); |
| 1152 | + VariableExpr argVarExpr = |
| 1153 | + VariableExpr.builder().setIsDecl(false).setVariable(oVariable).build(); |
| 1154 | + TypeNode thisClassType = types.get(getThisClassName(resourceName)); |
| 1155 | + ValueExpr thisValueExpr = ValueExpr.withValue(ThisObjectValue.withType(thisClassType)); |
| 1156 | + ValueExpr trueValueExpr = |
| 1157 | + ValueExpr.withValue( |
| 1158 | + PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("true").build()); |
| 1159 | + |
| 1160 | + // Create first if statement's return expression |
| 1161 | + ReturnExpr returnTrueExpr = ReturnExpr.withExpr(trueValueExpr); |
| 1162 | + |
| 1163 | + // Create second if statement's condition expression |
| 1164 | + RelationalOperationExpr oEqualsThisExpr = |
| 1165 | + RelationalOperationExpr.equalToWithExprs(argVarExpr, thisValueExpr); |
| 1166 | + RelationalOperationExpr oNotEqualsNullExpr = |
| 1167 | + RelationalOperationExpr.notEqualToWithExprs( |
| 1168 | + argVarExpr, ValueExpr.withValue(NullObjectValue.create())); |
| 1169 | + MethodInvocationExpr getClassMethodInvocationExpr = |
| 1170 | + MethodInvocationExpr.builder().setMethodName("getClass").build(); |
| 1171 | + RelationalOperationExpr getClassEqualsExpr = |
| 1172 | + RelationalOperationExpr.equalToWithExprs( |
| 1173 | + getClassMethodInvocationExpr, |
| 1174 | + getClassMethodInvocationExpr.toBuilder().setExprReferenceExpr(argVarExpr).build()); |
| 1175 | + LogicalOperationExpr orLogicalExpr = |
| 1176 | + LogicalOperationExpr.logicalOrWithExprs(oNotEqualsNullExpr, getClassEqualsExpr); |
| 1177 | + |
| 1178 | + // Create second if statement's body assignment expression. |
| 1179 | + Variable thatVariable = Variable.builder().setName("that").setType(thisClassType).build(); |
| 1180 | + VariableExpr thatVariableExpr = |
| 1181 | + VariableExpr.builder().setIsDecl(false).setVariable(thatVariable).build(); |
| 1182 | + CastExpr oCastExpr = CastExpr.builder().setExpr(argVarExpr).setType(thisClassType).build(); |
| 1183 | + AssignmentExpr thatAssignmentExpr = |
| 1184 | + AssignmentExpr.builder() |
| 1185 | + .setVariableExpr(thatVariableExpr.toBuilder().setIsDecl(true).build()) |
| 1186 | + .setValueExpr(oCastExpr) |
| 1187 | + .build(); |
| 1188 | + |
| 1189 | + // Create return expression in the second if statement's body. |
| 1190 | + Set<String> tokenSet = getTokenSet(tokenHierarchies); |
| 1191 | + Iterator<String> itToken = tokenSet.iterator(); |
| 1192 | + Expr curTokenExpr = |
| 1193 | + createObjectsEqualsForTokenMethodEpxr( |
| 1194 | + thisValueExpr, |
| 1195 | + thatVariableExpr, |
| 1196 | + Variable.builder() |
| 1197 | + .setType(TypeNode.STRING) |
| 1198 | + .setName(JavaStyle.toLowerCamelCase(itToken.next())) |
| 1199 | + .build()); |
| 1200 | + while (itToken.hasNext()) { |
| 1201 | + Expr nextTokenExpr = |
| 1202 | + createObjectsEqualsForTokenMethodEpxr( |
| 1203 | + thisValueExpr, |
| 1204 | + thatVariableExpr, |
| 1205 | + Variable.builder() |
| 1206 | + .setType(TypeNode.STRING) |
| 1207 | + .setName(JavaStyle.toLowerCamelCase(itToken.next())) |
| 1208 | + .build()); |
| 1209 | + curTokenExpr = LogicalOperationExpr.logicalAndWithExprs(curTokenExpr, nextTokenExpr); |
| 1210 | + } |
| 1211 | + ReturnExpr secondIfReturnExpr = ReturnExpr.withExpr(curTokenExpr); |
| 1212 | + |
| 1213 | + // Code: if (o == this) { return true;} |
| 1214 | + IfStatement firstIfStatement = |
| 1215 | + IfStatement.builder() |
| 1216 | + .setConditionExpr(oEqualsThisExpr) |
| 1217 | + .setBody(Arrays.asList(ExprStatement.withExpr(returnTrueExpr))) |
| 1218 | + .build(); |
| 1219 | + // Code: if (o != null || getClass() == o.getClass()) { FoobarName that = ((FoobarName) o); |
| 1220 | + // return ..} |
| 1221 | + IfStatement secondIfStatement = |
| 1222 | + IfStatement.builder() |
| 1223 | + .setConditionExpr(orLogicalExpr) |
| 1224 | + .setBody( |
| 1225 | + Arrays.asList( |
| 1226 | + ExprStatement.withExpr(thatAssignmentExpr), |
| 1227 | + ExprStatement.withExpr(secondIfReturnExpr))) |
| 1228 | + .build(); |
| 1229 | + |
| 1230 | + // Create method's return expression. |
| 1231 | + ValueExpr falseValueExpr = |
| 1232 | + ValueExpr.withValue( |
| 1233 | + PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("false").build()); |
| 1234 | + |
| 1235 | + return MethodDefinition.builder() |
| 1236 | + .setIsOverride(true) |
| 1237 | + .setScope(ScopeNode.PUBLIC) |
| 1238 | + .setArguments(argVarExpr.toBuilder().setIsDecl(true).build()) |
| 1239 | + .setReturnType(TypeNode.BOOLEAN) |
| 1240 | + .setName("equals") |
| 1241 | + .setReturnExpr(falseValueExpr) |
| 1242 | + .setBody(Arrays.asList(firstIfStatement, secondIfStatement)) |
| 1243 | + .build(); |
| 1244 | + } |
| 1245 | + |
| 1246 | + private static MethodInvocationExpr createObjectsEqualsForTokenMethodEpxr( |
| 1247 | + Expr thisExpr, Expr thatExpr, Variable tokenVar) { |
| 1248 | + VariableExpr varThisExpr = |
| 1249 | + VariableExpr.builder().setVariable(tokenVar).setExprReferenceExpr(thisExpr).build(); |
| 1250 | + VariableExpr varThatExpr = |
| 1251 | + VariableExpr.builder().setVariable(tokenVar).setExprReferenceExpr(thatExpr).build(); |
| 1252 | + return MethodInvocationExpr.builder() |
| 1253 | + .setStaticReferenceType(STATIC_TYPES.get("Objects")) |
| 1254 | + .setMethodName("equals") |
| 1255 | + .setArguments(Arrays.asList(varThisExpr, varThatExpr)) |
| 1256 | + .setReturnType(TypeNode.BOOLEAN) |
| 1257 | + .build(); |
| 1258 | + } |
| 1259 | + |
1143 | 1260 | private static List<ClassDefinition> createNestedBuilderClasses( |
1144 | 1261 | ResourceName resourceName, |
1145 | 1262 | List<List<String>> tokenHierarchies, |
|
0 commit comments