package me.august.lumen.compile.parser.ast.expr; import me.august.lumen.compile.analyze.method.MethodReference; import me.august.lumen.compile.codegen.BuildContext; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; import java.util.List; public class MethodCallExpr implements OwnedExpr { private String identifier; private List<Expression> params; private Expression owner; private MethodReference ref; private boolean pop; public MethodCallExpr(String identifier, List<Expression> params) { this(identifier, params, null); } public MethodCallExpr(String identifier, List<Expression> params, Expression owner) { this.identifier = identifier; this.params = params; this.owner = owner; } public String getIdentifier() { return identifier; } public List<Expression> getParams() { return params; } public MethodReference getRef() { return ref; } public void setRef(MethodReference ref) { this.ref = ref; } @Override public Type expressionType() { return ref.getReturnType(); } @Override public Expression getOwner() { return owner; } @Override public boolean isConstant() { return false; } @Override public void generate(MethodVisitor visitor, BuildContext context) { if (getOwner() != null) getOwner().generate(visitor, context); // load actual arguments for (Expression expr : params) expr.generate(visitor, context); ref.generate(visitor, context); } @Override public Expression[] getChildren() { return params.toArray(new Expression[params.size()]); } @Override public void markAsTopLevelStatement(boolean flag) { this.pop = flag; } @Override public String toString() { return "MethodCallExpr{" + "identifier='" + identifier + '\'' + ", params=" + params + ", owner=" + owner + '}'; } }