DefaultedParameter.ceylon

import ceylon.ast.core {
    DefaultedParameter,
    Node
}
import com.redhat.ceylon.compiler.typechecker.tree {
    JNode=Node,
    Tree {
        JFunctionalParameterDeclaration=FunctionalParameterDeclaration,
        JInitializerParameter=InitializerParameter,
        JParameter=Parameter,
        JParameterDeclaration=ParameterDeclaration,
        JValueParameterDeclaration=ValueParameterDeclaration
    }
}

"Converts a RedHat AST [[Parameter|JParameter]] to a `ceylon.ast` [[DefaultedParameter]]."
shared DefaultedParameter defaultedParameterToCeylon(JParameter defaultedParameter, Anything(JNode,Node) update = noop) {
    assert (is JParameterDeclaration|JInitializerParameter defaultedParameter);
    switch (defaultedParameter)
    case (is JParameterDeclaration) {
        assert (is JValueParameterDeclaration|JFunctionalParameterDeclaration defaultedParameter);
        switch (defaultedParameter)
        case (is JValueParameterDeclaration) { return defaultedValueParameterToCeylon(defaultedParameter, update); }
        case (is JFunctionalParameterDeclaration) { return defaultedCallableParameterToCeylon(defaultedParameter, update); }
    }
    case (is JInitializerParameter) {
        return defaultedParameterReferenceToCeylon(defaultedParameter, update);
    }
}

"Compiles the given [[code]] for a Defaulted Parameter
 into a [[DefaultedParameter]] using the Ceylon compiler
 (more specifically, the rule for a `parameterDeclarationOrRef`)."
shared DefaultedParameter? compileDefaultedParameter(String code, Anything(JNode,Node) update = noop) {
    if (exists jParameterDeclarationOrRef = createParser(code).parameterDeclarationOrRef()) {
        return defaultedParameterToCeylon(jParameterDeclarationOrRef, update);
    } else {
        return null;
    }
}