@Override public DSLExpression visitCall(Call binary) { ExecutableElement method = binary.getResolvedMethod(); if (!method.getSimpleName().toString().equals("equals")) { return binary; } if (method.getModifiers().contains(Modifier.STATIC)) { return binary; } if (!ElementUtils.typeEquals(method.getReturnType(), context.getType(boolean.class))) { return binary; } if (method.getParameters().size() != 1) { return binary; } // signature: receiver.equals(receiver) can be folded to true DSLExpression receiver = binary.getReceiver(); DSLExpression firstArg = binary.getParameters().get(0); if (receiver instanceof Variable && firstArg instanceof Variable) { if (receiver.equals(firstArg)) { return new BooleanLiteral(true); } } return super.visitCall(binary); }
@Override public DSLExpression visitBinary(Binary binary) { // signature: value == value can be folded to true if (IDENTITY_FOLD_OPERATORS.contains(binary.getOperator())) { if (binary.getLeft() instanceof Variable && binary.getRight() instanceof Variable) { Variable leftVar = ((Variable) binary.getLeft()); Variable rightVar = ((Variable) binary.getRight()); if (leftVar.equals(rightVar)) { // double and float cannot be folded as NaN is never identity equal if (!ElementUtils.typeEquals(leftVar.getResolvedType(), context.getType(float.class)) && !ElementUtils.typeEquals(leftVar.getResolvedType(), context.getType(double.class))) { return new BooleanLiteral(true); } } } } return super.visitBinary(binary); } });
@Override public DSLExpression visitVariable(Variable binary) { // on the slow path we can assume all cache expressions inlined. for (CacheExpression cache : source.getCaches()) { if (ElementUtils.variableEquals(cache.getParameter().getVariableElement(), binary.getResolvedVariable())) { return cache.getExpression(); } } return super.visitVariable(binary); }