ExtendedType.ceylon

import ceylon.ast.core {
    ClassInstantiation,
    ExtendedType,
    TypeNameWithTypeArguments,
    PositionalArguments,
    Super
}
import ceylon.ast.redhat {
    RedHatTransformer,
    extendedTypeToCeylon,
    compileExtendedType
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JExtendedType=ExtendedType
    }
}
import ceylon.ast.create {
    baseType
}

shared object extendedType satisfies ConcreteTest<ExtendedType,JExtendedType> {
    
    String->ExtendedType construct(String->TypeNameWithTypeArguments name, String->PositionalArguments arguments, <String->Super>? qualifier = null)
            => "extends `` qualifier exists then "`` qualifier?.key else "" ``." else "" ````name.key````arguments.key``"->ExtendedType(ClassInstantiation(name.item, arguments.item, qualifier?.item));
    
    shared String->ExtendedType extendsNull = construct("Null"->baseType("Null").nameAndArgs, positionalArguments.emptyPositionalArguments);
    shared String->ExtendedType extendsSuperEntry
            = construct {
        value qualifier => \isuper.superSuper;
        name = "Entry<Key,Item>"->baseType("Entry", "Key", "Item").nameAndArgs;
        arguments = positionalArguments.keyItemPositionArguments;
    };
    
    // not tested directly, but used by other tests
    shared String->ExtendedType extendsAnything = construct("Anything"->baseType("Anything").nameAndArgs, positionalArguments.emptyPositionalArguments);
    
    compile = compileExtendedType;
    fromCeylon = RedHatTransformer.transformExtendedType;
    toCeylon = extendedTypeToCeylon;
    codes = [extendsNull, extendsSuperEntry];
}