summary refs log tree commit diff stats
path: root/nim/depends.pas
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2008-12-12 14:02:27 +0100
committerAndreas Rumpf <rumpf_a@web.de>2008-12-12 14:02:27 +0100
commitddaedab835fa7ea3457f21a772d636921defdc46 (patch)
tree8f96b5a3a6700704e0a64bdcdedee1d2caf68517 /nim/depends.pas
parent2cd136cf7a0210e3cfde7a6f8ba32c9f09560047 (diff)
downloadNim-ddaedab835fa7ea3457f21a772d636921defdc46.tar.gz
version 0.7.2
Diffstat (limited to 'nim/depends.pas')
-rw-r--r--nim/depends.pas97
1 files changed, 97 insertions, 0 deletions
diff --git a/nim/depends.pas b/nim/depends.pas
new file mode 100644
index 000000000..d8b978142
--- /dev/null
+++ b/nim/depends.pas
@@ -0,0 +1,97 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit depends;
+
+// This module implements a dependency file generator.
+
+interface
+
+{$include 'config.inc'}
+
+uses
+  nsystem, nos, options, ast, astalgo, msgs, ropes, idents, passes, importer;
+
+function genDependPass(): TPass;
+procedure generateDot(const project: string);
+
+implementation
+
+type
+  TGen = object(TPassContext)
+    module: PSym;
+    filename: string;
+  end;
+  PGen = ^TGen;
+
+var
+  gDotGraph: PRope; // the generated DOT file; we need a global variable
+
+procedure addDependencyAux(const importing, imported: string);
+begin
+  appf(gDotGraph, '$1 -> $2;$n', [toRope(importing),
+                                  toRope(imported)]);
+  //    s1 -> s2_4 [label="[0-9]"];
+end;
+
+function addDotDependency(c: PPassContext; n: PNode): PNode;
+var
+  i: int;
+  g: PGen;
+  imported: string;
+begin
+  result := n;
+  if n = nil then exit;
+  g := PGen(c);
+  case n.kind of
+    nkImportStmt: begin
+      for i := 0 to sonsLen(n)-1 do begin
+        imported := getFileTrunk(getModuleFile(n.sons[i]));
+        addDependencyAux(g.module.name.s, imported);
+      end
+    end;
+    nkFromStmt: begin
+      imported := getFileTrunk(getModuleFile(n.sons[0]));
+      addDependencyAux(g.module.name.s, imported);
+    end;
+    nkStmtList, nkBlockStmt, nkStmtListExpr, nkBlockExpr: begin
+      for i := 0 to sonsLen(n)-1 do {@discard} addDotDependency(c, n.sons[i]);
+    end
+    else begin end
+  end
+end;
+
+procedure generateDot(const project: string);
+begin
+  writeRope(
+    ropef('digraph $1 {$n$2}$n', [
+      toRope(changeFileExt(extractFileName(project), '')), gDotGraph]),
+    changeFileExt(project, 'dot') );
+end;
+
+function myOpen(module: PSym; const filename: string): PPassContext;
+var
+  g: PGen;
+begin
+  new(g);
+{@ignore}
+  fillChar(g^, sizeof(g^), 0);
+{@emit}
+  g.module := module;
+  g.filename := filename;
+  result := g;
+end;
+
+function gendependPass(): TPass;
+begin
+  initPass(result);
+  result.open := myOpen;
+  result.process := addDotDependency;
+end;
+
+end.