package me.august.lumen.compile.parser.ast.expr; import me.august.lumen.compile.codegen.BuildContext; import me.august.lumen.compile.codegen.MethodCodeGen; import me.august.lumen.compile.parser.ast.Typed; import me.august.lumen.compile.resolve.type.UnresolvedType; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import java.util.List; public class StaticMethodCall extends Typed implements Expression { private String methodName; private List<Expression> parameters; private MethodCodeGen ref; private Type returnType; private boolean pop; public StaticMethodCall(UnresolvedType classType, String methodName, List<Expression> parameters) { super(classType); this.methodName = methodName; this.parameters = parameters; } public String getClassName() { return unresolvedType.getBaseName(); } public String getMethodName() { return methodName; } public MethodCodeGen getRef() { return ref; } public void setRef(MethodCodeGen ref) { this.ref = ref; } public List<Expression> getParameters() { return parameters; } public Type getReturnType() { return returnType; } public void setReturnType(Type returnType) { this.returnType = returnType; } @Override public void generate(MethodVisitor visitor, BuildContext context) { for (Expression arg : parameters) arg.generate(visitor, context); ref.generate(visitor, context); if (pop) visitor.visitInsn(Opcodes.POP); } @Override public Expression[] getChildren() { return parameters.toArray(new Expression[parameters.size()]); } @Override public Type expressionType() { return returnType; } @Override public void markAsTopLevelStatement(boolean flag) { this.pop = flag; } @Override public String toString() { return "StaticMethodCall{" + "methodName='" + methodName + '\'' + ", parameters=" + parameters + ", ref=" + ref + ", returnType=" + returnType + ", pop=" + pop + '}'; } }