Extension.ceylon

import ceylon.ast.core {
    Extension,
    PackageQualifier,
    PositionalArguments,
    Super,
    TypeNameWithTypeArguments,
    UIdentifier
}
import ceylon.ast.redhat {
    RedHatTransformer,
    extensionToCeylon,
    compileExtension
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JInvocationExpression=InvocationExpression,
        JSimpleType=SimpleType
    }
}

shared object extension satisfies ConcreteTest<Extension,JInvocationExpression|JSimpleType> {
    
    String->Extension construct(String->TypeNameWithTypeArguments nameAndArgs, <String->PositionalArguments>? arguments, <String->PackageQualifier|Super>? qualifier)
            => "`` qualifier?.key else "" ````nameAndArgs.key```` arguments?.key else "" ``"->Extension(nameAndArgs.item, arguments?.item, qualifier?.item);
    
    shared String->Extension objectExtension = construct("Object"->TypeNameWithTypeArguments(UIdentifier("Object")), positionalArguments.emptyPositionalArguments, null);
    shared String->Extension packageObjectExtension = construct("Object"->TypeNameWithTypeArguments(UIdentifier("Object")), positionalArguments.emptyPositionalArguments, "package."->PackageQualifier());
    shared String->Extension superInnerExtension = construct("Inner"->TypeNameWithTypeArguments(UIdentifier("Inner")), positionalArguments.emptyPositionalArguments, "super."->Super());
    shared String->Extension objectOfStringExtension = construct("Object<String>"->TypeNameWithTypeArguments(UIdentifier("Object"), typeArguments.stringTypeArguments.item), positionalArguments.emptyPositionalArguments, null);
    shared String->Extension packageObjectOfStringExtension = construct("Object<String>"->TypeNameWithTypeArguments(UIdentifier("Object"), typeArguments.stringTypeArguments.item), positionalArguments.emptyPositionalArguments, "package."->PackageQualifier());
    shared String->Extension superInnerOfStringExtension = construct("Inner<String>"->TypeNameWithTypeArguments(UIdentifier("Inner"), typeArguments.stringTypeArguments.item), positionalArguments.emptyPositionalArguments, "super."->Super());
    
    // not tested directly, but used by other tests
    shared String->Extension extendsAnything = construct("Anything"->TypeNameWithTypeArguments(UIdentifier("Anything")), positionalArguments.emptyPositionalArguments, null);
    shared String->Extension extendsNull = construct("Null"->TypeNameWithTypeArguments(UIdentifier("Null")), positionalArguments.emptyPositionalArguments, null);
    shared String->Extension extendsStringCharacters = construct("String"->TypeNameWithTypeArguments(UIdentifier("String")), positionalArguments.spreadTextPositionalArguments, null);
    
    compile = compileExtension;
    fromCeylon = RedHatTransformer.transformExtension;
    toCeylon = extensionToCeylon;
    codes = [objectExtension, packageObjectExtension, superInnerExtension, objectOfStringExtension, packageObjectOfStringExtension, superInnerOfStringExtension];
}