use of dyvilx.tools.compiler.ast.attribute.AttributeList in project Dyvil by Dyvil.
the class CaseClassMetadata method createApplyMethod.
private CodeMethod createApplyMethod() {
// static final func apply<TypeParams...>(classParams...: ClassParamTypes...) -> This
final SourcePosition position = this.theClass.position();
final AttributeList attributes = AttributeList.of(Modifiers.PUBLIC | Modifiers.STATIC_FINAL | Modifiers.GENERATED);
final IType type = this.theClass.getThisType();
final CodeMethod applyMethod = new CodeMethod(this.theClass, Names.apply, type, attributes);
applyMethod.setPosition(position);
applyMethod.getTypeParameters().addAll(this.theClass.getTypeParameters());
this.copyClassParameters(applyMethod);
// = new This<TypeParams...>(classParams...)
final ArgumentList arguments = new ArgumentList();
for (IParameter param : applyMethod.getParameters()) {
// no need to check for override class parameters here, since we are dealing with parameters of the
// apply method
final IValue access;
if (param.isVarargs()) {
access = new VarargsOperator(position, new FieldAccess(param));
} else {
access = new FieldAccess(param);
}
arguments.add(access);
}
// = new This(params...)
applyMethod.setValue(new ConstructorCall(this.theClass.position(), this.theClass.getThisType(), arguments));
return applyMethod;
}
use of dyvilx.tools.compiler.ast.attribute.AttributeList 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.attribute.AttributeList in project Dyvil by Dyvil.
the class EnumClassMetadata method createValuesField.
private Field createValuesField() {
final SourcePosition position = this.theClass.position();
final ArrayType type = new ArrayType(this.theClass.getClassType(), Mutability.IMMUTABLE);
final AttributeList attributes = AttributeList.of(Modifiers.PRIVATE | Modifiers.CONST | Modifiers.SYNTHETIC);
final Field field = new Field(this.theClass, position, Names.$VALUES, type, attributes);
field.setValue(this.createValuesArray());
return field;
}
use of dyvilx.tools.compiler.ast.attribute.AttributeList in project Dyvil by Dyvil.
the class EnumClassMetadata method createValuesMethod.
private CodeMethod createValuesMethod() {
// public static func values() -> [final EnumType]
final SourcePosition position = this.theClass.position();
final ArrayType type = new ArrayType(this.theClass.getClassType());
final AttributeList attributes = AttributeList.of(Modifiers.PUBLIC | Modifiers.STATIC);
final CodeMethod method = new CodeMethod(this.theClass, Names.values, type, attributes);
method.setPosition(position);
// = $VALUES.copy()
final FieldAccess valuesField = new FieldAccess(position, null, Names.$VALUES);
final MethodCall cloneCall = new MethodCall(position, valuesField, Name.fromRaw("copy"), ArgumentList.EMPTY);
method.setValue(cloneCall);
return method;
}
use of dyvilx.tools.compiler.ast.attribute.AttributeList in project Dyvil by Dyvil.
the class ModifierUtil method checkModifiers.
public static void checkModifiers(IMember member, MarkerList markers) {
final AttributeList attributes = member.getAttributes();
final MemberKind memberKind = member.getKind();
final int defaultAccess = memberKind.getDefaultAccess(member);
StringBuilder errorBuilder = null;
for (Attribute modifier : attributes) {
if (!memberKind.isAttributeAllowed(modifier)) {
if (errorBuilder == null) {
errorBuilder = new StringBuilder();
} else {
errorBuilder.append(", ");
}
modifier.toString(errorBuilder);
}
final int visibility = modifier.flags() & Modifiers.VISIBILITY_MODIFIERS;
if (visibility != 0 && visibility == defaultAccess) {
markers.add(Markers.semantic(member.getPosition(), "modifiers.visibility.default", Util.memberNamed(member), ModifierUtil.accessModifiersToString(visibility)));
}
}
if (errorBuilder != null) {
markers.add(Markers.semanticError(member.getPosition(), "modifiers.illegal", Util.memberNamed(member), errorBuilder.toString()));
}
if (!attributes.hasAnyFlag(Modifiers.VISIBILITY_MODIFIERS)) {
// If there is no explicit or implicit visibility modifier already, add the default one
attributes.addFlag(defaultAccess);
}
}
Aggregations