CaseItem.ceylon

import ceylon.ast.core {
    CaseItem,
    Node
}
import com.redhat.ceylon.compiler.typechecker.tree {
    JNode=Node,
    Tree {
        JCaseItem=CaseItem,
        JIsCase=IsCase,
        JMatchCase=MatchCase,
        JSatisfiesCase=SatisfiesCase
    }
}

"Converts a RedHat AST [[CaseItem|JCaseItem]] to a `ceylon.ast` [[CaseItem]]."
shared CaseItem caseItemToCeylon(JCaseItem caseItem, Anything(JNode,Node) update = noop) {
    assert (is JMatchCase|JIsCase|JSatisfiesCase caseItem);
    switch (caseItem)
    case (is JMatchCase) { return matchCaseToCeylon(caseItem, update); }
    case (is JIsCase) { return isCaseToCeylon(caseItem, update); }
    case (is JSatisfiesCase) {
        throw AssertionError("satisfies cases not yet supported");
    }
}

"Compiles the given [[code]] for a Case Item
 into a [[CaseItem]] using the Ceylon compiler
 (more specifically, the rule for a `caseItem`)."
shared CaseItem? compileCaseItem(String code, Anything(JNode,Node) update = noop) {
    if (exists jCaseItem = createParser(code).caseItem()) {
        return caseItemToCeylon(jCaseItem, update);
    } else {
        return null;
    }
}