summary refs log tree commit diff stats
path: root/rod/depends.nim
diff options
context:
space:
mode:
Diffstat (limited to 'rod/depends.nim')
-rwxr-xr-xrod/depends.nim68
1 files changed, 68 insertions, 0 deletions
diff --git a/rod/depends.nim b/rod/depends.nim
new file mode 100755
index 000000000..94d41c49f
--- /dev/null
+++ b/rod/depends.nim
@@ -0,0 +1,68 @@
+#
+#
+#           The Nimrod Compiler
+#        (c) Copyright 2009 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+# This module implements a dependency file generator.
+
+import 
+  os, options, ast, astalgo, msgs, ropes, idents, passes, importer
+
+proc genDependPass*(): TPass
+proc generateDot*(project: string)
+# implementation
+
+type 
+  TGen = object of TPassContext
+    module*: PSym
+    filename*: string
+
+  PGen = ref TGen
+
+var gDotGraph: PRope
+
+proc addDependencyAux(importing, imported: string) = 
+  # the generated DOT file; we need a global variable
+  appf(gDotGraph, "$1 -> $2;$n", [toRope(importing), toRope(imported)]) #    s1 -> s2_4 
+                                                                        #    [label="[0-9]"];
+  
+proc addDotDependency(c: PPassContext, n: PNode): PNode = 
+  var 
+    g: PGen
+    imported: string
+  result = n
+  if n == nil: return 
+  g = PGen(c)
+  case n.kind
+  of nkImportStmt: 
+    for i in countup(0, sonsLen(n) - 1): 
+      imported = splitFile(getModuleFile(n.sons[i])).name
+      addDependencyAux(g.module.name.s, imported)
+  of nkFromStmt: 
+    imported = splitFile(getModuleFile(n.sons[0])).name
+    addDependencyAux(g.module.name.s, imported)
+  of nkStmtList, nkBlockStmt, nkStmtListExpr, nkBlockExpr: 
+    for i in countup(0, sonsLen(n) - 1): discard addDotDependency(c, n.sons[i])
+  else: 
+    nil
+
+proc generateDot(project: string) = 
+  writeRope(ropef("digraph $1 {$n$2}$n", [
+      toRope(changeFileExt(extractFileName(project), "")), gDotGraph]), 
+            changeFileExt(project, "dot"))
+
+proc myOpen(module: PSym, filename: string): PPassContext = 
+  var g: PGen
+  new(g)
+  g.module = module
+  g.filename = filename
+  result = g
+
+proc gendependPass(): TPass = 
+  initPass(result)
+  result.open = myOpen
+  result.process = addDotDependency