ExtendedType.ceylon

import ceylon.ast.core {
    ExtensionOrConstruction,
    ExtendedType
}
import ceylon.ast.redhat {
    RedHatTransformer,
    extendedTypeToCeylon,
    compileExtendedType
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JExtendedType=ExtendedType
    }
}

shared object extendedType satisfies ConcreteTest<ExtendedType,JExtendedType> {
    
    String->ExtendedType construct(String->ExtensionOrConstruction target)
            => "extends ``target.key``"->ExtendedType(target.item);
    
    shared String->ExtendedType objectExtendedType = construct(extension.objectExtension);
    shared String->ExtendedType packageObjectExtendedType = construct(extension.packageObjectExtension);
    shared String->ExtendedType superInnerExtendedType = construct(extension.superInnerExtension);
    shared String->ExtendedType objectOfStringExtendedType = construct(extension.objectOfStringExtension);
    shared String->ExtendedType packageObjectOfStringExtendedType = construct(extension.packageObjectOfStringExtension);
    shared String->ExtendedType superInnerOfStringExtendedType = construct(extension.superInnerOfStringExtension);
    
    shared String->ExtendedType pointCartesianExtendedType = construct(construction.pointCartesianConstruction);
    shared String->ExtendedType withRgbExtendedType = construct(construction.withRgbConstruction);
    shared String->ExtendedType superCartesianExtendedType = construct(construction.superCartesianConstruction);
    shared String->ExtendedType pointCartesianOfStringExtendedType = construct(construction.pointCartesianOfStringConstruction);
    shared String->ExtendedType withRgbOfStringExtendedType = construct(construction.withRgbOfStringConstruction);
    shared String->ExtendedType superCartesianOfStringExtendedType = construct(construction.superCartesianOfStringConstruction);
    
    // not tested directly, but used by other tests
    shared String->ExtendedType extendsAnything = construct(extension.extendsAnything);
    shared String->ExtendedType extendsNull = construct(extension.extendsNull);
    
    compile = compileExtendedType;
    fromCeylon = RedHatTransformer.transformExtendedType;
    toCeylon = extendedTypeToCeylon;
    codes = [objectExtendedType, packageObjectExtendedType, superInnerExtendedType, objectOfStringExtendedType, packageObjectOfStringExtendedType, superInnerOfStringExtendedType,
        pointCartesianExtendedType, withRgbExtendedType, superCartesianExtendedType, pointCartesianOfStringExtendedType, withRgbOfStringExtendedType, superCartesianOfStringExtendedType];
}