UnaryIshOperation.ceylon

import ceylon.ast.core {
    UnaryIshOperation
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JExists=Exists,
        JNegativeOp=NegativeOp,
        JNonempty=Nonempty,
        JNotOp=NotOp,
        JPositiveOp=PositiveOp,
        JPostfixOperatorExpression=PostfixOperatorExpression,
        JPrefixOperatorExpression=PrefixOperatorExpression,
        JTypeOperatorExpression=TypeOperatorExpression,
        JUnaryOperatorExpression=UnaryOperatorExpression
    }
}

"Converts a RedHat AST [[UnaryOperatorExpression|JUnaryOperatorExpression]] to a `ceylon.ast` [[UnaryIshOperation]]."
shared UnaryIshOperation unaryIshOperationToCeylon(JUnaryOperatorExpression unaryIshOperation) {
    assert (is JPostfixOperatorExpression|JPrefixOperatorExpression|JNegativeOp|JPositiveOp|JExists|JNonempty|JTypeOperatorExpression|JNotOp unaryIshOperation);
    switch (unaryIshOperation)
    case (is JPostfixOperatorExpression) { return postfixOperationToCeylon(unaryIshOperation); }
    case (is JPrefixOperatorExpression) { return prefixOperationToCeylon(unaryIshOperation); }
    case (is JNegativeOp) { return negationOperationToCeylon(unaryIshOperation); }
    case (is JPositiveOp) { return identityOperationToCeylon(unaryIshOperation); }
    case (is JExists) { return existsOperationToCeylon(unaryIshOperation); }
    case (is JNonempty) { return nonemptyOperationToCeylon(unaryIshOperation); }
    case (is JTypeOperatorExpression) { return unaryTypeOperationToCeylon(unaryIshOperation); }
    case (is JNotOp) { return notOperationToCeylon(unaryIshOperation); }
}

"Compiles the given [[code]] for an Unary Ish Operation
 into an [[UnaryIshOperation]] using the Ceylon compiler
 (more specifically, the rule for an `unaryIshOperation`)."
shared UnaryIshOperation? compileUnaryIshOperation(String code) {
    if (is JUnaryOperatorExpression jUnaryExpression = createParser(code).assignmentExpression()) {
        return unaryIshOperationToCeylon(jUnaryExpression);
    } else {
        return null;
    }
}