ClassDefinition.ceylon

import ceylon.ast.core {
    Annotations,
    CaseTypes,
    ClassBody,
    ClassDefinition,
    ExtendedType,
    Parameters,
    SatisfiedTypes,
    TypeConstraint,
    TypeParameters,
    UIdentifier
}
import ceylon.ast.redhat {
    RedHatTransformer,
    classDefinitionToCeylon,
    compileClassDefinition
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JClassDefinition=ClassDefinition
    }
}

shared object classDefinition satisfies ConcreteTest<ClassDefinition,JClassDefinition> {
    
    String->ClassDefinition construct(String->UIdentifier name, <String->Parameters>? parameters, String->ClassBody body, <String->CaseTypes>? caseTypes = null, <String->ExtendedType>? extendedType = null, <String->SatisfiedTypes>? satisfiedTypes = null, <String->TypeParameters>? typeParameters = null, <String->TypeConstraint>[] typeConstraints = [], String->Annotations annotations = package.annotations.emptyAnnotations)
            => "``annotations.key`` class ``name.key`` `` typeParameters?.key else "" `` `` parameters?.key else "" `` `` caseTypes?.key else "" `` `` extendedType?.key else "" `` `` satisfiedTypes?.key else "" `` ``" ".join(typeConstraints*.key)`` ``body.key``"->ClassDefinition(name.item, parameters?.item, body.item, caseTypes?.item, extendedType?.item, satisfiedTypes?.item, typeParameters?.item, typeConstraints*.item, annotations.item);
    
    shared String->ClassDefinition nullClassDefinition = construct {
        name = identifier.nullUIdentifier;
        parameters = parameters.emptyParameters;
        body = classBody.emptyClassBody;
        caseTypes = caseTypes.ofNullCaseTypes;
        extendedType = extendedType.extendsAnything;
    };
    
    shared String->ClassDefinition pointClassDefinition = construct {
        name = identifier.pointUIdentifier;
        parameters = null; // two explicit constructors, one value constructor
        body = classBody.pointClassBody;
        annotations = annotations.sharedAnnotations;
    };
    
    compile = compileClassDefinition;
    fromCeylon = RedHatTransformer.transformClassDefinition;
    toCeylon = classDefinitionToCeylon;
    codes = [nullClassDefinition, pointClassDefinition];
}