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_);
 }