Removed libdparse from imports print functionality (#3)
This commit is contained in:
parent
d6e68087e0
commit
1960b5fa79
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue