use of dyvilx.tools.compiler.ast.parameter.ArgumentList in project Dyvil by Dyvil.
the class CaseClassMetadata method createUnapplyMethod.
private CodeMethod createUnapplyMethod() {
// static final func unapply<TypeParams...>(value: This) -> (T...)
final SourcePosition position = this.theClass.position();
final AttributeList attributes = AttributeList.of(Modifiers.PUBLIC | Modifiers.STATIC_FINAL | Modifiers.GENERATED);
final IType type = this.getUnapplyReturnType();
final CodeMethod unapply = new CodeMethod(this.theClass, Names.unapply, type, attributes);
unapply.setPosition(position);
unapply.getTypeParameters().addAll(this.theClass.getTypeParameters());
final CodeParameter parameter = new CodeParameter(unapply, position, Names.value, this.theClass.getThisType());
unapply.getParameters().add(parameter);
// = (value.classParams...)
final TupleExpr tupleExpr = new TupleExpr(position);
final ArgumentList arguments = tupleExpr.getValues();
for (IParameter param : this.theClass.getParameters()) {
// value
final FieldAccess thisAccess = new FieldAccess(position, null, parameter);
// value.classParam
final IValue fieldAccess;
if (param.isOverride()) {
// if the class parameter is marked as 'override', we have to resolve it from a super-class
// the easiest way to do this is by name
fieldAccess = new FieldAccess(position, thisAccess, param.getName());
} else {
fieldAccess = new FieldAccess(position, thisAccess, param);
}
arguments.add(fieldAccess);
}
unapply.setValue(tupleExpr);
return unapply;
}
use of dyvilx.tools.compiler.ast.parameter.ArgumentList in project Dyvil by Dyvil.
the class ClassMetadata method createDefaultConstructor.
private CodeConstructor createDefaultConstructor() {
// init(classParams...)
final SourcePosition position = this.theClass.position();
final AttributeList attributes = this.theClass.getConstructorAttributes();
attributes.addFlag(Modifiers.GENERATED);
final CodeConstructor constructor = new CodeConstructor(this.theClass, attributes);
constructor.setPosition(position);
this.copyClassParameters(constructor);
// : super(superParams...)
final IType superType = this.theClass.getSuperType();
if (superType != null) {
// Generate the constructor body
ArgumentList arguments = this.theClass.getSuperConstructorArguments();
if (arguments == null) {
arguments = ArgumentList.empty();
}
final InitializerCall init = new InitializerCall(this.theClass.getPosition(), true, arguments, superType);
constructor.setInitializer(init);
}
// { this.classParams... = classParams... }
final ParameterList classParams = this.theClass.getParameters();
final StatementList ctorBody = new StatementList();
final ParameterList ctorParams = constructor.getParameters();
// j is the counter for class parameters, as there may be leading synthetic constructor parameters
for (int i = 0, j = 0, count = ctorParams.size(); i < count; i++) {
final IParameter ctorParam = ctorParams.get(i);
if (ctorParam.hasModifier(Modifiers.SYNTHETIC)) {
continue;
}
final IParameter classParam = classParams.get(j++);
if (classParam.hasModifier(Modifiers.OVERRIDE)) {
continue;
}
final IValue receiver = new ThisExpr(this.theClass);
final FieldAccess access = new FieldAccess(ctorParam);
final FieldAssignment assignment = new FieldAssignment(position, receiver, classParam, access);
ctorBody.add(assignment);
}
constructor.setValue(ctorBody);
return constructor;
}
use of dyvilx.tools.compiler.ast.parameter.ArgumentList in project Dyvil by Dyvil.
the class EnumClassMetadata method createFromNameMethod.
private CodeMethod createFromNameMethod() {
// @BytecodeName("valueOf")
// public static func from(name: String) -> EnumType
final SourcePosition position = this.theClass.position();
final IType type = this.theClass.getClassType();
final CodeMethod method = new CodeMethod(this.theClass, Name.fromRaw("from"), type, AttributeList.of(Modifiers.PUBLIC | Modifiers.STATIC));
method.setPosition(position);
method.setInternalName("valueOf");
final CodeParameter parameter = new CodeParameter(Name.fromRaw("name"), Types.STRING);
method.getParameters().add(parameter);
// = Enum.valueOf(class<EnumType>, name)
final MethodCall valueOfCall = new MethodCall(position, new ClassAccess(Types.ENUM), Name.fromRaw("valueOf"), new ArgumentList(new ClassOperator(this.theClass.getClassType()), new FieldAccess(parameter)));
method.setValue(valueOfCall);
return method;
}
use of dyvilx.tools.compiler.ast.parameter.ArgumentList in project Dyvil by Dyvil.
the class AnnotationExpr method writeExpression.
@Override
public void writeExpression(MethodWriter writer, IType type) throws BytecodeException {
final StringBuilder descBuilder = new StringBuilder().append('(');
final ArgumentList arguments = this.annotation.getArguments();
final IClass iclass = this.annotation.getType().getTheClass();
final ParameterList parameterList = iclass.getParameters();
final int count = parameterList.size();
String[] parameterNames = new String[count];
for (int i = 0; i < count; i++) {
final IParameter parameter = parameterList.get(i);
final IType parameterType = parameter.getType();
parameterNames[i] = parameter.getInternalName();
parameterType.appendExtendedName(descBuilder);
arguments.writeValue(i, parameter, writer);
}
descBuilder.append(')');
descBuilder.append('L').append(iclass.getInternalName()).append(';');
writer.visitInvokeDynamicInsn("_", descBuilder.toString(), ANNOTATION_METAFACTORY, (Object[]) parameterNames);
if (type != null) {
this.annotation.getType().writeCast(writer, type, this.lineNumber());
}
}
use of dyvilx.tools.compiler.ast.parameter.ArgumentList in project Dyvil by Dyvil.
the class Intrinsics method readAnnotation.
public static IntrinsicData readAnnotation(IMethod method, Annotation annotation) {
final ArgumentList arguments = annotation.getArguments();
final IValue compilerCode = arguments.get(LazyFields.COMPILER_CODE);
if (compilerCode != null && compilerCode.valueTag() == IValue.INT) {
return new CompilerIntrinsic(compilerCode.intValue());
}
final IValue value = arguments.get(LazyFields.VALUE);
if (value == null || value.valueTag() != IValue.ARRAY) {
return null;
}
final ArrayExpr valueArray = (ArrayExpr) value;
final ArgumentList values = valueArray.getValues();
final int size = values.size();
int insnCount = 0;
int[] ints = new int[size];
for (int i = 0; i < size; i++) {
int opcode = values.get(i).intValue();
ints[i] = opcode;
insnCount++;
if (Opcodes.isFieldOrMethodOpcode(opcode)) {
ints[i + 1] = values.get(i + 1).intValue();
ints[i + 2] = values.get(i + 2).intValue();
ints[i + 3] = values.get(i + 3).intValue();
i += 3;
} else if (Opcodes.isJumpOpcode(opcode) || Opcodes.isLoadOpcode(opcode) || Opcodes.isStoreOpcode(opcode) || opcode == Opcodes.LDC || opcode == Opcodes.BIPUSH || opcode == Opcodes.SIPUSH) {
ints[i + 1] = values.get(i + 1).intValue();
i += 1;
}
}
if (size > insnCount) {
IValue stringValue = arguments.get(LazyFields.STRINGS);
ArrayExpr strings = (ArrayExpr) stringValue;
return readComplex(method, insnCount, ints, strings);
}
return new SimpleIntrinsicData(method, ints);
}
Aggregations