From ddaedab835fa7ea3457f21a772d636921defdc46 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Fri, 12 Dec 2008 14:02:27 +0100 Subject: version 0.7.2 --- nim/depends.pas | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 nim/depends.pas (limited to 'nim/depends.pas') 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. -- cgit 1.4.1-2-gfad0