diff options
Diffstat (limited to 'rod/depends.nim')
-rwxr-xr-x | rod/depends.nim | 68 |
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 |