FunctionExpression.ceylon

import ceylon.ast.core {
    Block,
    FunctionExpression,
    FunctionModifier,
    LazySpecifier,
    Parameters,
    VoidModifier
}
import ceylon.ast.redhat {
    RedHatTransformer,
    functionExpressionToCeylon,
    compileFunctionExpression
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JFunctionArgument=FunctionArgument
    }
}

shared object functionExpression satisfies ConcreteTest<FunctionExpression,JFunctionArgument> {
    
    String->FunctionExpression construct([<String->Parameters>+] parameterLists, String->LazySpecifier|Block definition, <String->FunctionModifier|VoidModifier>? type = null)
            => "`` type?.key else "" ````"".join(parameterLists*.key)````definition.key``"->FunctionExpression(parameterLists*.item, definition.item, type?.item);
    
    shared String->FunctionExpression emptyNoopFunctionExpression = construct([parameters.emptyParameters], block.emptyBlock);
    shared String->FunctionExpression functionFunctionExpression = construct([parameters.charactersParameters, parameters.emptyParameters], lazySpecifier.aTimesBPlusCLazySpecifier, functionModifier.functionModifier);
    shared String->FunctionExpression voidFunctionExpression = construct([parameters.notEmptyParameters], block.emptyBlock, voidModifier.voidModifier);
    
    compile = compileFunctionExpression;
    fromCeylon = RedHatTransformer.transformFunctionExpression;
    toCeylon = functionExpressionToCeylon;
    codes = [emptyNoopFunctionExpression, functionFunctionExpression, voidFunctionExpression];
}