summary refs log tree commit diff stats
path: root/compiler/nimfix.nim
blob: 3fbf27e54c423da524be4949bc3da5e07ece616c (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
88
89
90
91
92
93
94
95
96
97
#
#
#           The Nim Compiler
#        (c) Copyright 2014 Andreas Rumpf
#
#    See the file "copying.txt", included in this
#    distribution, for details about the copyright.
#

## Nimfix is a tool that helps to convert old-style Nimrod code to Nim code.

import strutils, os, parseopt
import options, commands, modules, sem, passes, passaux, pretty, msgs, nimconf,
  extccomp, condsyms

const Usage = """
Nimfix - Tool to patch Nim code
Usage:
  nimfix [options] projectflie.nim

Options:
  --overwriteFiles:on|off          overwrite the original nim files.
                                   DEFAULT is ON!
  --checkExtern:on|off             style check also extern names
  --styleCheck:none|confirm|auto   performs style checking for identifiers
                                   and suggests an alternative spelling. If
                                   'auto', it automatically corrects the
                                   spelling. If 'confirm' it asks the user.

In addition, all command line options of Nim are supported.
"""

proc mainCommand =
  #msgs.gErrorMax = high(int)  # do not stop after first error
  registerPass verbosePass
  registerPass semPass
  registerPass prettyPass
  gCmd = cmdPretty
  compileProject()
  pretty.overwriteFiles()

proc processCmdLine*(pass: TCmdLinePass, cmd: string) =
  var p = parseopt.initOptParser(cmd)
  var argsCount = 0
  while true: 
    parseopt.next(p)
    case p.kind
    of cmdEnd: break 
    of cmdLongoption, cmdShortOption: 
      case p.key.normalize
      of "overwritefiles":
        case p.val.normalize
        of "on": gOverWrite = true
        of "off": gOverWrite = false
        else: localError(gCmdLineInfo, errOnOrOffExpected)
      of "checkextern":
        case p.val.normalize
        of "on": gCheckExtern = true
        of "off": gCheckExtern = false
        else: localError(gCmdLineInfo, errOnOrOffExpected)
      of "stylecheck": 
        case p.val.normalize
        of "none": gStyleCheck = StyleCheck.None
        of "confirm": gStyleCheck = StyleCheck.Confirm
        of "auto": gStyleCheck = StyleCheck.Auto
        else: localError(gCmdLineInfo, errGenerated,
                         "'none', 'confirm' or 'auto' expected")
      else:
        processSwitch(pass, p)
    of cmdArgument:
      if processArgument(pass, p, argsCount): break

proc handleCmdLine() =
  if paramCount() == 0:
    stdout.writeln(Usage)
  else:
    processCmdLine(passCmd1, "")
    if gProjectName != "":
      try:
        gProjectFull = canonicalizePath(gProjectName)
      except OSError:
        gProjectFull = gProjectName
      var p = splitFile(gProjectFull)
      gProjectPath = p.dir
      gProjectName = p.name
    else:
      gProjectPath = getCurrentDir()
    loadConfigs(DefaultConfig) # load all config files
    # now process command line arguments again, because some options in the
    # command line can overwite the config file's settings
    extccomp.initVars()
    processCmdLine(passCmd2, "")
    mainCommand()

condsyms.initDefines()
defineSymbol "nimfix"
handleCmdline()