LetExpression.ceylon

import ceylon.ast.core {
    DisjoiningExpression,
    IfElseExpression,
    LetExpression,
    LIdentifier,
    PatternList,
    SpecifiedPattern,
    UnspecifiedVariable,
    VariablePattern
}
import ceylon.ast.redhat {
    RedHatTransformer,
    letExpressionToCeylon,
    compileLetExpression
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JLetExpression=LetExpression
    }
}

shared object letExpression satisfies ConcreteTest<LetExpression,JLetExpression> {
    
    String->LetExpression construct([<String->SpecifiedPattern>+] patterns, String->DisjoiningExpression|IfElseExpression|LetExpression expression)
            => "let (``",".join(patterns*.key)``) ``expression.key``"->LetExpression(PatternList(patterns*.item), expression.item);
    
    shared String->LetExpression distLetExpression = construct(["dist=1"->SpecifiedPattern(VariablePattern(UnspecifiedVariable(LIdentifier("dist"))), specifier.oneSpecifier.item)], baseExpression.iExpression);
    shared String->LetExpression abcLetExpression = construct([
            "a=1"->SpecifiedPattern(VariablePattern(UnspecifiedVariable(LIdentifier("a"))), specifier.oneSpecifier.item),
            "b=0"->SpecifiedPattern(VariablePattern(UnspecifiedVariable(LIdentifier("b"))), specifier._0Specifier.item),
            "c=1"->SpecifiedPattern(VariablePattern(UnspecifiedVariable(LIdentifier("c"))), specifier.oneSpecifier.item)],
        sumOperation.aTimesBPlusCExpression);
    shared String->LetExpression letIfExpression => construct(["a=1"->SpecifiedPattern(VariablePattern(UnspecifiedVariable(LIdentifier("a"))), specifier.oneSpecifier.item)],ifElseExpression.ifThenAElseBExpression);
    
    compile = compileLetExpression;
    fromCeylon = RedHatTransformer.transformLetExpression;
    toCeylon = letExpressionToCeylon;
    codes => [distLetExpression, abcLetExpression, letIfExpression];
}