summary refs log tree commit diff stats
path: root/tools/nimpretty.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tools/nimpretty.nim')
-rw-r--r--tools/nimpretty.nim68
1 files changed, 68 insertions, 0 deletions
diff --git a/tools/nimpretty.nim b/tools/nimpretty.nim
new file mode 100644
index 000000000..36d1382cf
--- /dev/null
+++ b/tools/nimpretty.nim
@@ -0,0 +1,68 @@
+#
+#
+#           The Nim Compiler
+#        (c) Copyright 2017 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+## Standard tool for pretty printing.
+
+when not defined(nimpretty):
+  {.error: "This needs to be compiled with --define:nimPretty".}
+
+import ../compiler / [idents, msgs, ast, syntaxes, renderer]
+
+import parseopt, strutils, os
+
+const
+  Version = "0.1"
+  Usage = "nimpretty - Nim Pretty Printer Version " & Version & """
+
+  (c) 2017 Andreas Rumpf
+Usage:
+  nimpretty [options] file.nim
+Options:
+  --backup:ON|OFF     create a backup file before overwritting (default: ON)
+  --version           show the version
+  --help              show this help
+"""
+
+proc writeHelp() =
+  stdout.write(Usage)
+  stdout.flushFile()
+  quit(0)
+
+proc writeVersion() =
+  stdout.write(Version & "\n")
+  stdout.flushFile()
+  quit(0)
+
+proc prettyPrint(infile: string) =
+  let fileIdx = fileInfoIdx(infile)
+  let tree = parseFile(fileIdx, newIdentCache())
+  let outfile = changeFileExt(infile, ".pretty.nim")
+  renderModule(tree, infile, outfile, {})
+
+proc main =
+  var infile: string
+  var backup = true
+  for kind, key, val in getopt():
+    case kind
+    of cmdArgument:
+      infile = key.addFileExt(".nim")
+    of cmdLongoption, cmdShortOption:
+      case normalize(key)
+      of "help", "h": writeHelp()
+      of "version", "v": writeVersion()
+      of "backup": backup = parseBool(val)
+      else: writeHelp()
+    of cmdEnd: assert(false) # cannot happen
+  if infile.len == 0:
+    quit "[Error] no input file."
+  if backup:
+    os.copyFile(source=infile, dest=changeFileExt(infile, ".nim.backup"))
+  prettyPrint(infile)
+
+main()