BaseType.ceylon

import ceylon.ast.core {
    BaseType,
    Node,
    PackageQualifier,
    TypeArguments,
    TypeNameWithTypeArguments
}
import com.redhat.ceylon.compiler.typechecker.tree {
    JNode=Node,
    Tree {
        JBaseType=BaseType
    }
}

"Converts a RedHat AST [[BaseType|JBaseType]] to a `ceylon.ast` [[BaseType]]."
shared BaseType baseTypeToCeylon(JBaseType baseType, Anything(JNode,Node) update = noop) {
    TypeArguments? typeArguments;
    if (exists jTypeArguments = baseType.typeArgumentList) {
        typeArguments = typeArgumentsToCeylon(jTypeArguments, update);
    } else {
        typeArguments = null;
    }
    value result = BaseType {
        value nameAndArgs {
            value result = TypeNameWithTypeArguments(uIdentifierToCeylon(baseType.identifier, update), typeArguments);
            update(baseType, result);
            return result;
        }
        value qualifier {
            if (baseType.packageQualified) {
                value pq = PackageQualifier();
                update(baseType, pq);
                return pq;
            } else {
                return null;
            }
        }
    };
    update(baseType, result);
    return result;
}

"Compiles the given [[code]] for a Base Type
 into a [[BaseType]] using the Ceylon compiler
 (more specifically, the rule for a `baseType`)."
shared BaseType? compileBaseType(String code, Anything(JNode,Node) update = noop) {
    if (is JBaseType jBaseType = createParser(code).baseType()) {
        return baseTypeToCeylon(jBaseType, update);
    } else {
        return null;
    }
}