summary refs log tree commit diff stats
path: root/compiler/pretty.nim
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/pretty.nim')
-rw-r--r--compiler/pretty.nim82
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)
+