CompilationUnit.ceylon

import ceylon.ast.core {
    CompilationUnit,
    Declaration,
    Import
}
import ceylon.ast.redhat {
    RedHatTransformer,
    compilationUnitToCeylon,
    compileCompilationUnit
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JCompilationUnit=CompilationUnit
    }
}

shared object compilationUnit satisfies ConcreteTest<CompilationUnit,JCompilationUnit> {
    
    String->CompilationUnit construct(<String->Declaration>[] declarations, <String->Import>[] imports = [])
            => "``"".join(imports*.key)`` ``"".join(declarations*.key)``"->CompilationUnit(declarations*.item, imports*.item);
    
    shared String->CompilationUnit voidFunctionCompilationUnit = construct([functionDefinition.noopFunctionDefinition]);
    shared String->CompilationUnit nonemptyCompilationUnit = construct {
        imports = [\iimport.ceylonAstWildcardImport, \iimport.ceylonCollectionImport];
        declarations = [functionDefinition.nonemptyFunctionDefinition, valueDefinition.annotatedByValueDefinition];
    };
    
    compile = compileCompilationUnit;
    fromCeylon = RedHatTransformer.transformCompilationUnit;
    toCeylon = compilationUnitToCeylon;
    codes = [voidFunctionCompilationUnit, nonemptyCompilationUnit];
}