@Override public DSLExpression reduce(DSLExpressionReducer reducer) { DSLExpression newReceiver = null; if (receiver != null) { newReceiver = receiver.reduceImpl(reducer); } boolean parameterChanged = false; List<DSLExpression> newParameters = new ArrayList<>(); for (DSLExpression param : getParameters()) { DSLExpression newParam = param.reduceImpl(reducer); if (newParam != param) { parameterChanged = true; newParameters.add(newParam); } else { newParameters.add(param); } } Call c = this; if (newReceiver != receiver || parameterChanged) { c = new Call(newReceiver, getName(), newParameters); c.setResolvedMethod(getResolvedMethod()); c.setResolvedTargetType(getResolvedTargetType()); } return reducer.visitCall(c); }
public void visitCall(Call call) { List<ExecutableElement> lookupMethods; DSLExpression receiver = call.getReceiver(); if (receiver == null) { lookupMethods = this.methods; if (getMethodName(method).equals(call.getName())) { foundWithName = method; if (parameters.size() != call.getParameters().size()) { continue outer; for (DSLExpression expression : call.getParameters()) { TypeMirror sourceType = expression.getResolvedType(); TypeMirror targetType = parameters.get(parameterIndex).asType(); call.setResolvedMethod(method); break; if (call.getResolvedMethod() == null) { if (foundWithName == null) { throw new InvalidExpressionException(String.format("The method %s is undefined for the enclosing scope.", call.getName())); } else { StringBuilder arguments = new StringBuilder(); String sep = ""; for (DSLExpression expression : call.getParameters()) { arguments.append(sep).append(ElementUtils.getSimpleName(expression.getResolvedType())); sep = ", ";
public void visitCall(Call call) { List<ExecutableElement> lookupMethods; DSLExpression receiver = call.getReceiver(); if (receiver == null) { lookupMethods = this.methods; if (getMethodName(method).equals(call.getName())) { foundWithName = method; if (parameters.size() != call.getParameters().size()) { continue outer; for (DSLExpression expression : call.getParameters()) { TypeMirror sourceType = expression.getResolvedType(); TypeMirror targetType = parameters.get(parameterIndex).asType(); call.setResolvedMethod(method); break; if (call.getResolvedMethod() == null) { if (foundWithName == null) { throw new InvalidExpressionException(String.format("The method %s is undefined for the enclosing scope.", call.getName())); } else { StringBuilder arguments = new StringBuilder(); String sep = ""; for (DSLExpression expression : call.getParameters()) { arguments.append(sep).append(ElementUtils.getSimpleName(expression.getResolvedType())); sep = ", ";
public void visitCall(Call call) { ExecutableElement method = call.getResolvedMethod(); CodeTree[] parameters = new CodeTree[method.getParameters().size()]; for (int i = 0; i < parameters.length; i++) { parameters[parameters.length - i - 1] = pop(); } CodeTreeBuilder builder = CodeTreeBuilder.createBuilder(); if (call.getResolvedMethod().getKind() == ElementKind.CONSTRUCTOR) { builder.startNew(call.getResolvedType()); } else if (call.getReceiver() == null) { if (isStatic(method)) { builder.startStaticCall(method); } else { if (root != null) { builder.tree(root).string("."); } builder.startCall(method.getSimpleName().toString()); } } else { if (isStatic(method)) { throw new AssertionError("Static calls must not have receivers."); } builder.startCall(pop(), method.getSimpleName().toString()); } for (CodeTree parameter : parameters) { builder.tree(parameter); } builder.end(); push(builder.build()); }
DSLExpression MemberExpression(DSLExpression receiver) { DSLExpression result; result = null; Expect(1); Variable variable = new Variable(receiver, t.val); result = variable; if (la.kind == 11) { Get(); List<DSLExpression> parameters = new ArrayList<>(); DSLExpression parameter; if (StartOf(2)) { parameter = Expression(); parameters.add(parameter); while (la.kind == 13) { Get(); parameter = Expression(); parameters.add(parameter); } } Expect(12); result = new Call(variable.getReceiver(), variable.getName(), parameters); } if (la.kind == 14) { Get(); result = MemberExpression(result); } return result; }
public void visitCall(Call call) { ExecutableElement method = call.getResolvedMethod(); CodeTree[] parameters = new CodeTree[method.getParameters().size()]; for (int i = 0; i < parameters.length; i++) { parameters[parameters.length - i - 1] = pop(); } CodeTreeBuilder builder = CodeTreeBuilder.createBuilder(); if (call.getResolvedMethod().getKind() == ElementKind.CONSTRUCTOR) { builder.startNew(call.getResolvedType()); } else if (call.getReceiver() == null) { if (isStatic(method)) { builder.startStaticCall(method); } else { if (root != null) { builder.tree(root).string("."); } builder.startCall(method.getSimpleName().toString()); } } else { if (isStatic(method)) { throw new AssertionError("Static calls must not have receivers."); } builder.startCall(pop(), method.getSimpleName().toString()); } for (CodeTree parameter : parameters) { builder.tree(parameter); } builder.end(); push(builder.build()); }
DSLExpression MemberExpression(DSLExpression receiver) { DSLExpression result; result = null; Expect(1); Variable variable = new Variable(receiver, t.val); result = variable; if (la.kind == 11) { Get(); List<DSLExpression> parameters = new ArrayList<>(); DSLExpression parameter; if (StartOf(2)) { parameter = Expression(); parameters.add(parameter); while (la.kind == 13) { Get(); parameter = Expression(); parameters.add(parameter); } } Expect(12); result = new Call(variable.getReceiver(), variable.getName(), parameters); } if (la.kind == 14) { Get(); result = MemberExpression(result); } return result; }
@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 void accept(DSLExpressionVisitor visitor) { if (receiver != null) { receiver.accept(visitor); } for (DSLExpression parameter : getParameters()) { parameter.accept(visitor); } visitor.visitCall(this); }
private boolean isMethodAccessMember(Call call) { if (!call.getResolvedMethod().getModifiers().contains(STATIC)) { DSLExpression receiver = call.getReceiver(); if (receiver instanceof Variable) { return isVariableAccessMember((Variable) receiver); } else if (receiver instanceof Call) { return isMethodAccessMember((Call) receiver); } return true; } return false; }
@Override public void accept(DSLExpressionVisitor visitor) { if (receiver != null) { receiver.accept(visitor); } for (DSLExpression parameter : getParameters()) { parameter.accept(visitor); } visitor.visitCall(this); }