TypeAliasDefinition.ceylon

import ceylon.ast.core {
    Node,
    TypeAliasDefinition,
    TypeConstraint,
    TypeParameters
}
import com.redhat.ceylon.compiler.typechecker.tree {
    JNode=Node,
    Tree {
        JTypeAliasDeclaration=TypeAliasDeclaration
    }
}
import ceylon.interop.java {
    CeylonIterable
}

"Converts a RedHat AST [[TypeAliasDeclaration|JTypeAliasDeclaration]] to a `ceylon.ast` [[TypeAliasDefinition]]."
shared TypeAliasDefinition typeAliasDefinitionToCeylon(JTypeAliasDeclaration typeAliasDefinition, Anything(JNode,Node) update = noop) {
    TypeParameters? typeParameters;
    if (exists jTypeParameterList = typeAliasDefinition.typeParameterList) {
        typeParameters = typeParametersToCeylon(jTypeParameterList, update);
    } else {
        typeParameters = null;
    }
    TypeConstraint[] typeConstraints;
    if (exists jTypeConstraintList = typeAliasDefinition.typeConstraintList) {
        typeConstraints = CeylonIterable(jTypeConstraintList.typeConstraints).collect(propagateUpdate(typeConstraintToCeylon, update));
    } else {
        typeConstraints = [];
    }
    value result = TypeAliasDefinition {
        name = uIdentifierToCeylon(typeAliasDefinition.identifier, update);
        specifier = typeSpecifierToCeylon(typeAliasDefinition.typeSpecifier, update);
        typeParameters = typeParameters;
        typeConstraints = typeConstraints;
        annotations = annotationsToCeylon(typeAliasDefinition.annotationList, update);
    };
    update(typeAliasDefinition, result);
    return result;
}

"Compiles the given [[code]] for a Type Alias Definition
 into a [[TypeAliasDefinition]] using the Ceylon compiler
 (more specifically, the rule for a `declaration`)."
shared TypeAliasDefinition? compileTypeAliasDefinition(String code, Anything(JNode,Node) update = noop) {
    if (is JTypeAliasDeclaration jTypeAliasDefinition = createParser(code).declaration()) {
        return typeAliasDefinitionToCeylon(jTypeAliasDefinition, update);
    } else {
        return null;
    }
}