summary refs log tree commit diff stats
path: root/nimpretty/nimpretty.nim
blob: 628bc163ebebae772ff5c17a564df9cb9f8f2f41 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#
#
#           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, options,
  pathutils, layouter]

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)
  --output:file       set the output file (default: overwrite the .nim file)
  --indent:N          set the number of spaces that is used for indentation
  --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)

type
  PrettyOptions = object
    indWidth: int

proc prettyPrint(infile, outfile: string, opt: PrettyOptions) =
  var conf = newConfigRef()
  let fileIdx = fileInfoIdx(conf, AbsoluteFile infile)
  conf.outFile = AbsoluteFile outfile
  when defined(nimpretty2):
    var p: TParsers
    p.parser.em.indWidth = opt.indWidth
    if setupParsers(p, fileIdx, newIdentCache(), conf):
      discard parseAll(p)
      closeParsers(p)
  else:
    let tree = parseFile(fileIdx, newIdentCache(), conf)
    renderModule(tree, infile, outfile, {}, fileIdx, conf)

proc main =
  var infile, outfile: string
  var backup = true
  var opt: PrettyOptions
  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)
      of "output", "o": outfile = val
      of "indent": opt.indWidth = parseInt(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"))
  if outfile.len == 0: outfile = infile
  prettyPrint(infile, outfile, opt)

main()