package me.august.lumen.compile.parser.ast.expr;
import me.august.lumen.common.BytecodeUtil;
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.Type;
import java.util.List;
public class ArrayInitializerExpr extends Typed implements Expression {
private List<Expression> lengths;
private int dims;
public ArrayInitializerExpr(UnresolvedType type, List<Expression> lengths, int dims) {
super(type);
this.lengths = lengths;
this.dims = dims;
super.unresolvedType = new UnresolvedType(type.getBaseName(), dims);
}
public boolean isMultidimensional() {
return dims > 1;
}
@Override
public void generate(MethodVisitor visitor, BuildContext context) {
if (isMultidimensional()) {
for (Expression len : lengths) {
len.generate(visitor, context);
}
visitor.visitMultiANewArrayInsn(expressionType().getDescriptor(), lengths.size());
} else {
Type elemType = BytecodeUtil.componentType(expressionType());
BytecodeUtil.createArray(visitor, context, elemType, lengths.get(0));
}
}
@Override
public Type expressionType() {
return getResolvedType();
}
@Override
public Expression[] getChildren() {
return lengths.toArray(new Expression[lengths.size()]);
}
}