Search in sources :

Example 6 with CodeMethod

use of dyvilx.tools.compiler.ast.method.CodeMethod 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;
}
Also used : IParameter(dyvilx.tools.compiler.ast.parameter.IParameter) IValue(dyvilx.tools.compiler.ast.expression.IValue) CodeMethod(dyvilx.tools.compiler.ast.method.CodeMethod) AttributeList(dyvilx.tools.compiler.ast.attribute.AttributeList) VarargsOperator(dyvilx.tools.compiler.ast.expression.intrinsic.VarargsOperator) SourcePosition(dyvil.source.position.SourcePosition) ArgumentList(dyvilx.tools.compiler.ast.parameter.ArgumentList) FieldAccess(dyvilx.tools.compiler.ast.expression.access.FieldAccess) ConstructorCall(dyvilx.tools.compiler.ast.expression.access.ConstructorCall) IType(dyvilx.tools.compiler.ast.type.IType)

Example 7 with CodeMethod

use of dyvilx.tools.compiler.ast.method.CodeMethod 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;
}
Also used : AttributeList(dyvilx.tools.compiler.ast.attribute.AttributeList) CastOperator(dyvilx.tools.compiler.ast.expression.CastOperator) ArgumentList(dyvilx.tools.compiler.ast.parameter.ArgumentList) CodeParameter(dyvilx.tools.compiler.ast.parameter.CodeParameter) MethodCall(dyvilx.tools.compiler.ast.expression.access.MethodCall) IType(dyvilx.tools.compiler.ast.type.IType) InstanceOfOperator(dyvilx.tools.compiler.ast.expression.InstanceOfOperator) IfStatement(dyvilx.tools.compiler.ast.statement.IfStatement) IValue(dyvilx.tools.compiler.ast.expression.IValue) NullValue(dyvilx.tools.compiler.ast.expression.constant.NullValue) CodeMethod(dyvilx.tools.compiler.ast.method.CodeMethod) SourcePosition(dyvil.source.position.SourcePosition) FieldAccess(dyvilx.tools.compiler.ast.expression.access.FieldAccess)

Example 8 with CodeMethod

use of dyvilx.tools.compiler.ast.method.CodeMethod 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;
}
Also used : CodeMethod(dyvilx.tools.compiler.ast.method.CodeMethod) SourcePosition(dyvil.source.position.SourcePosition) ArgumentList(dyvilx.tools.compiler.ast.parameter.ArgumentList) CodeParameter(dyvilx.tools.compiler.ast.parameter.CodeParameter) IType(dyvilx.tools.compiler.ast.type.IType)

Example 9 with CodeMethod

use of dyvilx.tools.compiler.ast.method.CodeMethod 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;
}
Also used : ArrayType(dyvilx.tools.compiler.ast.type.compound.ArrayType) CodeMethod(dyvilx.tools.compiler.ast.method.CodeMethod) AttributeList(dyvilx.tools.compiler.ast.attribute.AttributeList) SourcePosition(dyvil.source.position.SourcePosition)

Aggregations

CodeMethod (dyvilx.tools.compiler.ast.method.CodeMethod)9 SourcePosition (dyvil.source.position.SourcePosition)6 ArgumentList (dyvilx.tools.compiler.ast.parameter.ArgumentList)5 CodeParameter (dyvilx.tools.compiler.ast.parameter.CodeParameter)5 IType (dyvilx.tools.compiler.ast.type.IType)5 AttributeList (dyvilx.tools.compiler.ast.attribute.AttributeList)4 IValue (dyvilx.tools.compiler.ast.expression.IValue)3 FieldAccess (dyvilx.tools.compiler.ast.expression.access.FieldAccess)3 IParameter (dyvilx.tools.compiler.ast.parameter.IParameter)2 Name (dyvil.lang.Name)1 ClassBody (dyvilx.tools.compiler.ast.classes.ClassBody)1 CodeClass (dyvilx.tools.compiler.ast.classes.CodeClass)1 CastOperator (dyvilx.tools.compiler.ast.expression.CastOperator)1 ClassOperator (dyvilx.tools.compiler.ast.expression.ClassOperator)1 InstanceOfOperator (dyvilx.tools.compiler.ast.expression.InstanceOfOperator)1 TupleExpr (dyvilx.tools.compiler.ast.expression.TupleExpr)1 ConstructorCall (dyvilx.tools.compiler.ast.expression.access.ConstructorCall)1 MethodCall (dyvilx.tools.compiler.ast.expression.access.MethodCall)1 NullValue (dyvilx.tools.compiler.ast.expression.constant.NullValue)1 VarargsOperator (dyvilx.tools.compiler.ast.expression.intrinsic.VarargsOperator)1