Modifier.ceylon

import ceylon.ast.core {
    Modifier,
    Node
}
import com.redhat.ceylon.compiler.typechecker.tree {
    JNode=Node,
    Tree {
        JDynamicModifier=DynamicModifier,
        JLocalModifier=LocalModifier,
        JTypeVariance=TypeVariance,
        JVoidModifier=VoidModifier
    }
}
import com.redhat.ceylon.compiler.typechecker.parser {
    CeylonLexer {
        dynamicModifier=\iDYNAMIC,
        function_modifier=\iFUNCTION_MODIFIER,
        value_modifier=\iVALUE_MODIFIER,
        void_modifier=\iVOID_MODIFIER
    }
}

"Converts a RedHat AST [[VoidModifier|JVoidModifier]] or [[DynamicModifier|JDynamicModifier]]
 to a `ceylon.ast` [[Modifier]]."
shared Modifier modifierToCeylon(JVoidModifier|JLocalModifier|JDynamicModifier|JTypeVariance modifier, Anything(JNode,Node) update = noop) {
    switch (modifier)
    case (is JLocalModifier|JVoidModifier|JDynamicModifier) { return typeModifierToCeylon(modifier, update); }
    case (is JTypeVariance) { return varianceToCeylon(modifier, update); }
}

"Compiles the given [[code]] for a Modifier
 into a [[Modifier]] using the Ceylon compiler
 (more specifically, the lexer)."
shared Modifier? compileModifier(String code, Anything(JNode,Node) update = noop) {
    value type = createParser(code).tokenStream.\iLA(1);
    if (type == void_modifier) {
        return compileVoidModifier(code, update);
    } else if (type == value_modifier) {
        return compileValueModifier(code, update);
    } else if (type == function_modifier) {
        return compileFunctionModifier(code, update);
    } else if (type == dynamicModifier) {
        return compileDynamicModifier(code, update);
    } else if (exists variance = compileVariance(code, update)) {
        return variance;
    } else {
        return null;
    }
}