diff options
Diffstat (limited to 'compiler/pretty.nim')
-rw-r--r-- | compiler/pretty.nim | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/compiler/pretty.nim b/compiler/pretty.nim new file mode 100644 index 000000000..c205aaa7e --- /dev/null +++ b/compiler/pretty.nim @@ -0,0 +1,82 @@ +# +# +# The Nimrod Compiler +# (c) Copyright 2013 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## This module implements the code "prettifier". This is part of the toolchain +## to convert Nimrod code into a consistent style. + +import + os, options, ast, astalgo, msgs, ropes, idents, passes, importer + +type + TGen = object of TPassContext + module*: PSym + PGen = ref TGen + + TSourceFile = object + lines: seq[string] + dirty: bool + fullpath: string + +proc addSourceLine(fileIdx: int32, line: string) = + fileInfos[fileIdx].lines.add line + +proc sourceLine(i: TLineInfo): PRope = + if i.fileIndex < 0: return nil + + if not optPreserveOrigSource and fileInfos[i.fileIndex].lines.len == 0: + try: + for line in lines(i.toFullPath): + addSourceLine i.fileIndex, line.string + except EIO: + discard + InternalAssert i.fileIndex < fileInfos.len + # can happen if the error points to EOF: + if i.line > fileInfos[i.fileIndex].lines.len: return nil + + result = fileInfos[i.fileIndex].lines[i.line-1] + +proc addDependencyAux(importing, imported: string) = + appf(gDotGraph, "$1 -> $2;$n", [toRope(importing), toRope(imported)]) + # s1 -> s2_4[label="[0-9]"]; + +proc addDotDependency(c: PPassContext, n: PNode): PNode = + result = n + var g = PGen(c) + case n.kind + of nkSym: + + of nkTypeSection: + # we need to figure out whether the PType or the TType should become + # Type. The other then is either TypePtr/TypeRef or TypeDesc. + + of nkImportStmt: + for i in countup(0, sonsLen(n) - 1): + var imported = getModuleName(n.sons[i]) + addDependencyAux(g.module.name.s, imported) + of nkFromStmt, nkImportExceptStmt: + var imported = getModuleName(n.sons[0]) + 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 generateRefactorScript*(project: string) = + writeRope(ropef("digraph $1 {$n$2}$n", [ + toRope(changeFileExt(extractFileName(project), "")), gDotGraph]), + changeFileExt(project, "dot")) + +proc myOpen(module: PSym): PPassContext = + var g: PGen + new(g) + g.module = module + result = g + +const prettyPass* = makePass(open = myOpen, process = addDotDependency) + |