Removed libdparse from imports print functionality (#3)

This commit is contained in:
lucica28 2022-01-28 10:47:07 +02:00 committed by Vladiwostok
parent 0c215ec98d
commit c9d07ebbf6
2 changed files with 46 additions and 48 deletions

View File

@ -5,75 +5,73 @@
module dscanner.imports; module dscanner.imports;
import dparse.ast;
import dparse.lexer;
import dparse.parser;
import dparse.rollback_allocator;
import std.stdio; import std.stdio;
import std.container.rbtree; import std.container.rbtree;
import std.functional : toDelegate; import std.functional : toDelegate;
import dscanner.utils; import dscanner.utils;
import dmd.permissivevisitor;
import dmd.transitivevisitor;
import dmd.tokens;
import dmd.common.outbuffer;
import core.stdc.stdio;
import dmd.parse;
import dmd.astbase;
import dmd.id;
import dmd.globals;
import dmd.identifier;
import core.memory;
import std.stdio;
import std.file;
/** extern(C++) class ImportVisitor(AST) : ParseTimeTransitiveVisitor!AST
* AST visitor that collects modules imported to an R-B tree.
*/
class ImportPrinter : ASTVisitor
{ {
alias visit = ParseTimeTransitiveVisitor!AST.visit;
this() this()
{ {
imports = new RedBlackTree!string; imports = new RedBlackTree!string;
} }
override void visit(const SingleImport singleImport) override void visit(AST.Import imp)
{ {
ignore = false; import std.conv;
singleImport.accept(this);
ignore = true;
}
override void visit(const IdentifierChain identifierChain)
{
if (ignore)
return;
bool first = true;
string s; string s;
foreach (ident; identifierChain.identifiers)
{ foreach (const pid; imp.packages)
if (!first) s = s ~ to!string(pid.toChars()) ~ ".";
s ~= ".";
s ~= ident.text; s ~= to!string(imp.id.toChars());
first = false;
}
imports.insert(s); imports.insert(s);
} }
alias visit = ASTVisitor.visit;
/// Collected imports
RedBlackTree!string imports; RedBlackTree!string imports;
private:
bool ignore = true;
} }
private void visitFile(bool usingStdin, string fileName, RedBlackTree!string importedModules, StringCache* cache) private void visitFile(bool usingStdin, string fileName, RedBlackTree!string importedModules)
{ {
RollbackAllocator rba; Id.initialize();
LexerConfig config; global._init();
config.fileName = fileName; global.params.useUnitTests = true;
config.stringBehavior = StringBehavior.source; ASTBase.Type._init();
auto visitor = new ImportPrinter;
auto tokens = getTokensForParser(usingStdin ? readStdin() : readFile(fileName), config, cache); auto id = Identifier.idPool(fileName);
auto mod = parseModule(tokens, fileName, &rba, toDelegate(&doNothing)); auto m = new ASTBase.Module(&(fileName.dup)[0], id, false, false);
visitor.visit(mod); auto input = readText(fileName);
importedModules.insert(visitor.imports[]);
scope p = new Parser!ASTBase(m, input, false);
p.nextToken();
m.members = p.parseModule();
scope vis = new ImportVisitor!ASTBase();
m.accept(vis);
importedModules.insert(vis.imports[]);
} }
private void doNothing(string, size_t, size_t, string, bool) private void doNothing(string, size_t, size_t, string, bool)
{ {
} }
void printImports(bool usingStdin, string[] args, string[] importPaths, StringCache* cache, bool recursive) void printImports(bool usingStdin, string[] args, string[] importPaths, bool recursive)
{ {
string[] fileNames = usingStdin ? ["stdin"] : expandArgs(args); string[] fileNames = usingStdin ? ["stdin"] : expandArgs(args);
import std.path : buildPath, dirSeparator; import std.path : buildPath, dirSeparator;
@ -85,7 +83,7 @@ void printImports(bool usingStdin, string[] args, string[] importPaths, StringCa
auto resolvedLocations = new RedBlackTree!(string); auto resolvedLocations = new RedBlackTree!(string);
auto importedFiles = new RedBlackTree!(string); auto importedFiles = new RedBlackTree!(string);
foreach (name; fileNames) foreach (name; fileNames)
visitFile(usingStdin, name, importedFiles, cache); visitFile(usingStdin, name, importedFiles);
if (importPaths.empty) if (importPaths.empty)
{ {
foreach (item; importedFiles[]) foreach (item; importedFiles[])
@ -110,7 +108,7 @@ void printImports(bool usingStdin, string[] args, string[] importPaths, StringCa
resolvedModules.insert(item); resolvedModules.insert(item);
resolvedLocations.insert(alt); resolvedLocations.insert(alt);
if (recursive) if (recursive)
visitFile(false, alt, newlyDiscovered, cache); visitFile(false, alt, newlyDiscovered);
continue itemLoop; continue itemLoop;
} }
} }

View File

@ -387,7 +387,7 @@ else
} }
else if (imports || recursiveImports) else if (imports || recursiveImports)
{ {
printImports(usingStdin, args, importPaths, &cache, recursiveImports); printImports(usingStdin, args, importPaths, recursiveImports);
} }
else if (ast || outline) else if (ast || outline)
{ {