Body.ceylon

import ceylon.ast.core {
    Body,
    Node
}
import com.redhat.ceylon.compiler.typechecker.tree {
    JNode=Node,
    Tree {
        JBlock=Block,
        JBody=Body,
        JClassBody=ClassBody,
        JInterfaceBody=InterfaceBody
    }
}

"Converts a RedHat AST [[Body|JBody]] to a `ceylon.ast` [[Body]]."
shared Body bodyToCeylon(JBody body, Anything(JNode,Node) update = noop) {
    assert (is JBlock|JClassBody|JInterfaceBody body);
    switch (body)
    case (is JBlock) { return blockToCeylon(body, update); }
    case (is JClassBody) { return classBodyToCeylon(body, update); }
    case (is JInterfaceBody) { return interfaceBodyToCeylon(body, update); }
}

/*
 There is no compileBody() method because it’s impossible to write:
 ‘{}’ can be a block, a class body, or an interface body.
 In fact, *every* block can be a class body and vice versa,
 every interface body can also be a block or a class body,
 and blocks and class bodies without statements can also be
 interface bodies. This is utterly ambiguous, and cannot possibly be compiled.
 */