Mercurial > projects > dil
diff trunk/src/cmd/ImportGraph.d @ 367:dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
- Added function findModule().
- Renamed option includes to import_paths.
- Fix in ctor of ModuleDeclaration: check for pname.length before removing last separator.
- Fixed scanning binary numbers.
- Added member modules and method getFQN() to class Module.
- Fix in parseIfStatement(): AttributeStatement mustn't have a null parameter.
- Parsing import_paths in GlobalSettings.load().
author | aziz |
---|---|
date | Fri, 31 Aug 2007 23:07:05 +0000 |
parents | dcbd3bf9bf74 |
children | 2adf808343d6 |
line wrap: on
line diff
--- a/trunk/src/cmd/ImportGraph.d Fri Aug 31 12:14:03 2007 +0000 +++ b/trunk/src/cmd/ImportGraph.d Fri Aug 31 23:07:05 2007 +0000 @@ -9,18 +9,60 @@ import dil.Parser, dil.Lexer; import dil.File; import dil.Module; +import dil.Settings; import std.stdio : writefln; +import std.path : getDirName, dirSep = sep; +import std.file : exists; + +string findModule(string moduleFQN, string[] importPaths) +{ + string modulePath; + foreach (path; importPaths) + { + modulePath = path ~ (path[$-1] == dirSep[0] ? "" : dirSep) ~ moduleFQN ~ ".d"; + if (exists(modulePath)) + return modulePath; + } + return null; +} + +void execute(string fileName, string[] importPaths) +{ + // Add directory of file and global directories to import paths. + importPaths ~= getDirName(fileName) ~ GlobalSettings.importPaths; + + Module[string] loadedModules; -void execute(string fileName, string[] includePaths) -{ + Module loadModule(string moduleFQN) + { + auto mod_ = moduleFQN in loadedModules; + if (mod_ !is null) + return *mod_; + + auto modulePath = findModule(moduleFQN, importPaths); + if (modulePath is null) + writefln("Warning: Module %s.d couldn't be found.", moduleFQN); + else + { + auto mod = new Module(modulePath); + mod.parse(); + + loadedModules[moduleFQN] = mod; + + auto moduleFQNs = mod.getImports(); + + foreach (moduleFQN_; moduleFQNs) + mod.modules ~= loadModule(moduleFQN_); + return mod; + } + return null; + } + auto mod = new Module(fileName); mod.parse(); - auto root = mod.root; - Module[] modules; + auto moduleFQNs = mod.getImports(); - foreach (decl; root.children) - { - - } + foreach (moduleFQN_; moduleFQNs) + mod.modules ~= loadModule(moduleFQN_); }