dmd/compiler/test/dub_package/impvisitor.d
2024-09-29 13:05:12 +08:00

123 lines
2.7 KiB
D
Executable file

#!/usr/bin/env dub
/+dub.sdl:
dependency "dmd" path="../../.."
+/
import dmd.visitor.permissive;
import dmd.visitor.transitive;
import dmd.tokens;
import dmd.common.outbuffer;
import core.stdc.stdio;
extern(C++) class ImportVisitor2(AST) : ParseTimeTransitiveVisitor!AST
{
alias visit = ParseTimeTransitiveVisitor!AST.visit;
override void visit(AST.Import imp)
{
if (imp.isstatic)
printf("static ");
printf("import ");
foreach (const pid; imp.packages)
printf("%s.", pid.toChars());
printf("%s", imp.id.toChars());
if (imp.names.length)
{
printf(" : ");
foreach (const i, const name; imp.names)
{
if (i)
printf(", ");
printf("%s", name.toChars());
}
}
printf(";");
printf("\n");
}
}
extern(C++) class ImportVisitor(AST) : PermissiveVisitor!AST
{
alias visit = PermissiveVisitor!AST.visit;
override void visit(AST.Module m)
{
foreach (s; *m.members)
{
s.accept(this);
}
}
override void visit(AST.Import i)
{
printf("import %s", i.toChars());
}
override void visit(AST.ImportStatement s)
{
foreach (imp; *s.imports)
{
imp.accept(this);
}
}
}
void main()
{
import std.stdio;
import std.file;
import std.path : buildPath, dirName;
import dmd.parse;
import dmd.astbase;
import dmd.id;
import dmd.globals;
import dmd.identifier;
import dmd.errorsink;
import dmd.target;
import core.memory;
GC.disable();
string path = __FILE_FULL_PATH__.dirName.buildPath("../../../../phobos/std/");
string regex = "*.d";
auto dFiles = dirEntries(path, regex, SpanMode.depth);
foreach (f; dFiles)
{
string fn = f.name;
//writeln("Processing ", fn);
Id.initialize();
global._init();
target.os = Target.OS.linux;
target.isX86_64 = (size_t.sizeof == 8);
global.params.useUnitTests = true;
ASTBase.Type._init();
auto id = Identifier.idPool(fn);
auto m = new ASTBase.Module(&(fn.dup)[0], id, false, false);
auto input = readText(fn);
input ~= '\0';
//writeln("Started parsing...");
scope p = new Parser!ASTBase(m, input, false, new ErrorSinkStderr(), null, false);
p.nextToken();
m.members = p.parseModule();
//writeln("Finished parsing. Starting transitive visitor");
scope vis = new ImportVisitor2!ASTBase();
m.accept(vis);
//writeln("Finished!");
}
}