use of dyvilx.tools.compiler.ast.parameter.CodeParameter in project Dyvil by Dyvil.
the class CaseClassMetadata method createUnapplyAnyMethod.
private CodeMethod createUnapplyAnyMethod() {
// static final func unapply<TypeParams...>(value: any) -> (T...)?
final SourcePosition position = this.theClass.position();
final AttributeList attributes = AttributeList.of(Modifiers.PUBLIC | Modifiers.STATIC_FINAL | Modifiers.GENERATED);
final IType type = NullableType.apply(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, Types.NULLABLE_ANY);
unapply.getParameters().add(parameter);
// = (param is This) ? unapply(param as This) : null
final InstanceOfOperator isOperator = new InstanceOfOperator(new FieldAccess(parameter), this.theClass.getClassType());
final CastOperator castOperator = new CastOperator(new FieldAccess(parameter), this.theClass.getThisType());
final IValue call = new MethodCall(position, null, Names.unapply, new ArgumentList(castOperator));
final IfStatement ifStatement = new IfStatement(isOperator, call, new NullValue());
unapply.setValue(ifStatement);
return unapply;
}
use of dyvilx.tools.compiler.ast.parameter.CodeParameter in project Dyvil by Dyvil.
the class EnumClassMetadata method updateConstructor.
private void updateConstructor(IConstructor constructor) {
constructor.getAttributes().addFlag(Modifiers.PRIVATE_PROTECTED);
// Prepend parameters and set super initializer
final CodeParameter nameParam = new CodeParameter(constructor, null, Names.name, new ImplicitNullableType(Types.STRING), AttributeList.of(Modifiers.SYNTHETIC));
final CodeParameter ordParam = new CodeParameter(constructor, null, Names.ordinal, Types.INT, AttributeList.of(Modifiers.SYNTHETIC));
constructor.getParameters().insert(0, nameParam);
constructor.getParameters().insert(1, ordParam);
final IConstructor enumConstructor = Types.ENUM_CLASS.getBody().getConstructor(0);
final InitializerCall initializer = constructor.getInitializer();
if (initializer == null) {
final ArgumentList arguments = new ArgumentList(new FieldAccess(nameParam), new FieldAccess(ordParam));
final SourcePosition position = constructor.position();
final InitializerCall init = new InitializerCall(position, true, arguments, this.theClass.getSuperType(), enumConstructor);
constructor.setInitializer(init);
return;
}
// Prepend access to new parameters
final ArgumentList arguments = initializer.getArguments();
arguments.insert(0, new FieldAccess(nameParam));
arguments.insert(1, new FieldAccess(ordParam));
}
use of dyvilx.tools.compiler.ast.parameter.CodeParameter in project Dyvil by Dyvil.
the class EnumClassMetadata method createFromOrdMethod.
private CodeMethod createFromOrdMethod() {
// @BytecodeName("valueOf")
// public static func from(ordinal: int) -> 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("ordinal"), Types.INT);
method.getParameters().add(parameter);
// = $VALUES[ordinal]
final FieldAccess valuesField = new FieldAccess(position, null, Names.$VALUES);
final SubscriptAccess getCall = new SubscriptAccess(position, valuesField, new ArgumentList(new FieldAccess(parameter)));
method.setValue(getCall);
return method;
}
use of dyvilx.tools.compiler.ast.parameter.CodeParameter in project Dyvil by Dyvil.
the class Template method makeGenerateSpecMethod.
private void makeGenerateSpecMethod() {
// func generate(spec: Specialization, writer: java.io.Writer) throws IOException -> void = { ... }
final ParameterList params = this.genMethod.getParameters();
final CodeParameter specParam = new CodeParameter(this.genMethod, null, Name.fromRaw("spec"), Template.LazyTypes.Specialization);
final CodeParameter writerParam = new CodeParameter(this.genMethod, null, Name.fromRaw("writer"), Template.LazyTypes.Writer);
params.add(specParam);
params.add(writerParam);
this.genMethod.getExceptions().add(Template.LazyTypes.IOException);
}
use of dyvilx.tools.compiler.ast.parameter.CodeParameter in project Dyvil by Dyvil.
the class CodeTypeParameter method computeReifiedKind.
@Override
protected void computeReifiedKind() {
super.computeReifiedKind();
final IType type;
final Reified.Type reifiedKind = this.getReifiedKind();
if (reifiedKind == Reified.Type.TYPE) {
type = TypeOperator.LazyFields.TYPE;
} else if (reifiedKind != null) {
type = ClassOperator.LazyFields.CLASS;
} else {
return;
}
if (this.getReifiedKind() != null) {
final AttributeList attributes = AttributeList.of(Modifiers.MANDATED | Modifiers.SYNTHETIC | Modifiers.FINAL);
final Name name = Name.apply("reify_" + this.getName().qualified);
final CodeParameter parameter = new CodeParameter(null, this.getPosition(), name, type, attributes);
this.setReifyParameter(parameter);
}
}
Aggregations