module dpp.translation.namespace;

import dpp.from;

string[] translateNamespace(in from!"clang".Cursor cursor,
                            ref from!"dpp.runtime.context".Context context)
    @safe
{
    import dpp.translation.translation: translate, ignoredCppCursorSpellings;
    import clang: Cursor;
    import std.conv: text;
    import std.algorithm: map, canFind;
    import std.array: array;

    assert(cursor.kind == Cursor.Kind.Namespace);

    context.log("    Namespace children: ", cursor.children);

    string[] lines;

    lines ~= context.pushNamespace(cursor.spelling);

    foreach(child; cursor.children) {

        if(child.kind == Cursor.Kind.VisibilityAttr) continue;

        lines ~= translate(child, context)
            .map!(a => (child.kind == Cursor.Kind.Namespace ? "    " : "        ") ~ a)
            .array;

        if(child.kind != Cursor.Kind.Namespace &&
           !ignoredCppCursorSpellings.canFind(child.spelling))
        {
            context.addNamespaceSymbol(child.spelling);
        }
    }

    lines ~= context.popNamespace();

    return lines;
}