import std.d.lexer;
import std.d.ast;
import std.d.parser;
import std.stdio;
import std.file;
import std.array;

class TestVisitor : ASTVisitor
{
    override void visit(ClassDeclaration classDeclaration)
    {
        writeln("class ", classDeclaration.name.value, " on line ", classDeclaration.name.line);
    }

    override void visit(StructDeclaration structDeclaration)
    {
        writeln("struct ", structDeclaration.name.value, " on line ", structDeclaration.name.line);
    }

    override void visit(ModuleDeclaration md)
    {
        writeln("module declaration found");
    }

    override void visit(FunctionDeclaration funDec)
    {
        writeln("function ", funDec.name.value, " on line ", funDec.name.line);
    }

    override void visit(VariableDeclaration varDec)
    {
        foreach (decl; varDec.declarators)
        {
            writeln("variable ", decl.identifier.value,
                " on line ", decl.identifier.line);
        }
    }

    override void visit(ImportDeclaration impDec)
    {
        writeln("import declaration found");
    }

    override void visit(InterfaceDeclaration intDec)
    {
        writeln("Interface ", intDec.identifier.value,
            " on line ", intDec.identifier.line);
    }

    override void visit(VersionSpecification verSpec)
    {
        writeln("Version specification");
    }

    alias ASTVisitor.visit visit;
}

void main(string[] args)
{
    auto de = dirEntry(args[1]);
    ubyte[] sourceBuffer = new ubyte[de.size];
    auto f = File(args[1]);
    ubyte[] rawSource = f.rawRead(sourceBuffer);
    LexerConfig config;
    auto tokens = byToken(rawSource, config).array();
    Module m = parseModule(tokens, args[1]);
    //ASTVisitor visitor = new TestVisitor;
    //visitor.visit(m);
}