package me.august.lumen.compile.parser.ast.expr;
import me.august.lumen.compile.codegen.BuildContext;
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 ConstructorCallExpr extends Typed implements Expression {
private List<Expression> params;
public ConstructorCallExpr(UnresolvedType unresolvedType, List<Expression> params) {
super(unresolvedType);
this.params = params;
}
@Override
public Expression[] getChildren() {
return params.toArray(new Expression[params.size()]);
}
@Override
public void generate(MethodVisitor visitor, BuildContext context) {
visitor.visitTypeInsn(Opcodes.NEW, getResolvedType().getInternalName());
visitor.visitInsn(Opcodes.DUP);
Type[] paramTypes = new Type[params.size()];
for (int i = 0; i < params.size(); i++)
paramTypes[i] = params.get(i).expressionType();
Type methodType = Type.getMethodType(Type.VOID_TYPE, paramTypes);
for (Expression param : params)
param.generate(visitor, context);
visitor.visitMethodInsn(
Opcodes.INVOKESPECIAL,
getResolvedType().getInternalName(),
"<init>",
methodType.getDescriptor(),
false
);
}
@Override
public Type expressionType() {
return getResolvedType();
}
}