summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2018-05-27 22:52:10 +0200
committerAndreas Rumpf <rumpf_a@web.de>2018-05-27 22:52:10 +0200
commitc640bd2d1bb283bcbd87da11d6b16e5f9bd39bdc (patch)
tree3e9aaf0d7f4398635a683ccac506285416a5138b /compiler
parent545b1582cddb27aba75ac791f8f89e33c6d1ca5a (diff)
downloadNim-c640bd2d1bb283bcbd87da11d6b16e5f9bd39bdc.tar.gz
cleanup compiler/prettybase to not use redudant global variables
Diffstat (limited to 'compiler')
-rw-r--r--compiler/lexer.nim5
-rw-r--r--compiler/lineinfos.nim3
-rw-r--r--compiler/msgs.nim37
-rw-r--r--compiler/nimfix/pretty.nim22
-rw-r--r--compiler/nimfix/prettybase.nim55
5 files changed, 36 insertions, 86 deletions
diff --git a/compiler/lexer.nim b/compiler/lexer.nim
index 1249f84b0..6e5506b09 100644
--- a/compiler/lexer.nim
+++ b/compiler/lexer.nim
@@ -714,11 +714,6 @@ proc handleCRLF(L: var TLexer, pos: int): int =
     if col > MaxLineLength:
       lexMessagePos(L, hintLineTooLong, pos)
 
-    if optEmbedOrigSrc in L.config.globalOptions:
-      let lineStart = cast[ByteAddress](L.buf) + L.lineStart
-      let line = newString(cast[cstring](lineStart), col)
-      addSourceLine(L.config, L.fileIdx, line)
-
   case L.buf[pos]
   of CR:
     registerLine()
diff --git a/compiler/lineinfos.nim b/compiler/lineinfos.nim
index 31fbe5197..0384fda26 100644
--- a/compiler/lineinfos.nim
+++ b/compiler/lineinfos.nim
@@ -194,7 +194,7 @@ type
     quotedFullName*: Rope      # cached quoted full name for codegen
                                # purposes
 
-    lines*: seq[Rope]          # the source code of the module
+    lines*: seq[string]        # the source code of the module
                                #   used for better error messages and
                                #   embedding the original source in the
                                #   generated code
@@ -202,6 +202,7 @@ type
                                # and parsed; usually "" but is used
                                # for 'nimsuggest'
     hash*: string              # the checksum of the file
+    dirty*: bool               # for 'nimfix' / 'nimpretty' like tooling
     when defined(nimpretty):
       fullContent*: string
   FileIndex* = distinct int32
diff --git a/compiler/msgs.nim b/compiler/msgs.nim
index 197d6ca2a..62948e81e 100644
--- a/compiler/msgs.nim
+++ b/compiler/msgs.nim
@@ -105,7 +105,6 @@ proc newLineInfo*(conf: ConfigRef; filename: string, line, col: int): TLineInfo
 proc raiseRecoverableError*(msg: string) {.noinline, noreturn.} =
   raise newException(ERecoverableError, msg)
 
-proc sourceLine*(conf: ConfigRef; i: TLineInfo): Rope
 
 proc concat(strings: openarray[string]): string =
   var totalLen = 0
@@ -409,6 +408,24 @@ proc resetAttributes*(conf: ConfigRef) =
   if {optUseColors, optStdout} * conf.globalOptions == {optUseColors}:
     terminal.resetAttributes(stderr)
 
+proc addSourceLine(conf: ConfigRef; fileIdx: FileIndex, line: string) =
+  conf.m.fileInfos[fileIdx.int32].lines.add line
+
+proc sourceLine*(conf: ConfigRef; i: TLineInfo): string =
+  if i.fileIndex.int32 < 0: return ""
+
+  if not optPreserveOrigSource(conf) and conf.m.fileInfos[i.fileIndex.int32].lines.len == 0:
+    try:
+      for line in lines(toFullPath(conf, i)):
+        addSourceLine conf, i.fileIndex, line.string
+    except IOError:
+      discard
+  assert i.fileIndex.int32 < conf.m.fileInfos.len
+  # can happen if the error points to EOF:
+  if i.line.int > conf.m.fileInfos[i.fileIndex.int32].lines.len: return ""
+
+  result = conf.m.fileInfos[i.fileIndex.int32].lines[i.line.int-1]
+
 proc writeSurroundingSrc(conf: ConfigRef; info: TLineInfo) =
   const indent = "  "
   msgWriteln(conf, indent & $sourceLine(conf, info))
@@ -518,24 +535,6 @@ template assertNotNil*(conf: ConfigRef; e): untyped =
 template internalAssert*(conf: ConfigRef, e: bool) =
   if not e: internalError(conf, $instantiationInfo())
 
-proc addSourceLine*(conf: ConfigRef; fileIdx: FileIndex, line: string) =
-  conf.m.fileInfos[fileIdx.int32].lines.add line.rope
-
-proc sourceLine*(conf: ConfigRef; i: TLineInfo): Rope =
-  if i.fileIndex.int32 < 0: return nil
-
-  if not optPreserveOrigSource(conf) and conf.m.fileInfos[i.fileIndex.int32].lines.len == 0:
-    try:
-      for line in lines(toFullPath(conf, i)):
-        addSourceLine conf, i.fileIndex, line.string
-    except IOError:
-      discard
-  assert i.fileIndex.int32 < conf.m.fileInfos.len
-  # can happen if the error points to EOF:
-  if i.line.int > conf.m.fileInfos[i.fileIndex.int32].lines.len: return nil
-
-  result = conf.m.fileInfos[i.fileIndex.int32].lines[i.line.int-1]
-
 proc quotedFilename*(conf: ConfigRef; i: TLineInfo): Rope =
   assert i.fileIndex.int32 >= 0
   if optExcessiveStackTrace in conf.globalOptions:
diff --git a/compiler/nimfix/pretty.nim b/compiler/nimfix/pretty.nim
index b825b5c6f..f3fff781f 100644
--- a/compiler/nimfix/pretty.nim
+++ b/compiler/nimfix/pretty.nim
@@ -27,19 +27,19 @@ var
 
 proc overwriteFiles*(conf: ConfigRef) =
   let doStrip = options.getConfigVar(conf, "pretty.strip").normalize == "on"
-  for i in 0 .. high(gSourceFiles):
-    if gSourceFiles[i].dirty and not gSourceFiles[i].isNimfixFile and
-        (not gOnlyMainfile or gSourceFiles[i].fileIdx == conf.projectMainIdx.FileIndex):
-      let newFile = if gOverWrite: gSourceFiles[i].fullpath
-                    else: gSourceFiles[i].fullpath.changeFileExt(".pretty.nim")
+  for i in 0 .. high(conf.m.fileInfos):
+    if conf.m.fileInfos[i].dirty and
+        (not gOnlyMainfile or FileIndex(i) == conf.projectMainIdx):
+      let newFile = if gOverWrite: conf.m.fileInfos[i].fullpath
+                    else: conf.m.fileInfos[i].fullpath.changeFileExt(".pretty.nim")
       try:
         var f = open(newFile, fmWrite)
-        for line in gSourceFiles[i].lines:
+        for line in conf.m.fileInfos[i].lines:
           if doStrip:
             f.write line.strip(leading = false, trailing = true)
           else:
             f.write line
-          f.write(gSourceFiles[i].newline)
+          f.write(conf.m.fileInfos[i], "\L")
         f.close
       except IOError:
         rawMessage(conf, errGenerated, "cannot open file: " & newFile)
@@ -94,9 +94,7 @@ proc beautifyName(s: string, k: TSymKind): string =
     inc i
 
 proc replaceInFile(conf: ConfigRef; info: TLineInfo; newName: string) =
-  loadFile(conf, info)
-
-  let line = gSourceFiles[info.fileIndex.int].lines[info.line.int-1]
+  let line = conf.m.fileInfos[info.fileIndex.int].lines[info.line.int-1]
   var first = min(info.col.int, line.len)
   if first < 0: return
   #inc first, skipIgnoreCase(line, "proc ", first)
@@ -108,8 +106,8 @@ proc replaceInFile(conf: ConfigRef; info: TLineInfo; newName: string) =
   if differ(line, first, last, newName):
     # last-first+1 != newName.len or
     var x = line.substr(0, first-1) & newName & line.substr(last+1)
-    system.shallowCopy(gSourceFiles[info.fileIndex.int].lines[info.line.int-1], x)
-    gSourceFiles[info.fileIndex.int].dirty = true
+    system.shallowCopy(conf.m.fileInfos[info.fileIndex.int].lines[info.line.int-1], x)
+    conf.m.fileInfos[info.fileIndex.int].dirty = true
 
 proc checkStyle(conf: ConfigRef; cache: IdentCache; info: TLineInfo, s: string, k: TSymKind; sym: PSym) =
   let beau = beautifyName(s, k)
diff --git a/compiler/nimfix/prettybase.nim b/compiler/nimfix/prettybase.nim
index f530c8012..d1ad41a6e 100644
--- a/compiler/nimfix/prettybase.nim
+++ b/compiler/nimfix/prettybase.nim
@@ -11,45 +11,6 @@ import strutils, lexbase, streams
 import ".." / [ast, msgs, lineinfos, idents, options]
 from os import splitFile
 
-type
-  TSourceFile* = object
-    lines*: seq[string]
-    dirty*, isNimfixFile*: bool
-    fullpath*, newline*: string
-    fileIdx*: FileIndex
-
-var
-  gSourceFiles*: seq[TSourceFile] = @[]
-
-proc loadFile*(conf: ConfigRef; info: TLineInfo) =
-  let i = info.fileIndex.int
-  if i >= gSourceFiles.len:
-    gSourceFiles.setLen(i+1)
-  if gSourceFiles[i].lines.isNil:
-    gSourceFiles[i].fileIdx = info.fileIndex
-    gSourceFiles[i].lines = @[]
-    let path = toFullPath(conf, info)
-    gSourceFiles[i].fullpath = path
-    gSourceFiles[i].isNimfixFile = path.splitFile.ext == ".nimfix"
-    # we want to die here for IOError:
-    for line in lines(path):
-      gSourceFiles[i].lines.add(line)
-    # extract line ending of the file:
-    var lex: BaseLexer
-    open(lex, newFileStream(path, fmRead))
-    var pos = lex.bufpos
-    while true:
-      case lex.buf[pos]
-      of '\c':
-        gSourceFiles[i].newline = "\c\L"
-        break
-      of '\L', '\0':
-        gSourceFiles[i].newline = "\L"
-        break
-      else: discard
-      inc pos
-    close(lex)
-
 const
   Letters* = {'a'..'z', 'A'..'Z', '0'..'9', '\x80'..'\xFF', '_'}
 
@@ -62,9 +23,7 @@ proc differ*(line: string, a, b: int, x: string): bool =
   result = cmpIgnoreStyle(y, x) == 0 and y != x
 
 proc replaceDeprecated*(conf: ConfigRef; info: TLineInfo; oldSym, newSym: PIdent) =
-  loadFile(conf, info)
-
-  let line = gSourceFiles[info.fileIndex.int32].lines[info.line.int-1]
+  let line = sourceLine(conf, info)
   var first = min(info.col.int, line.len)
   if first < 0: return
   #inc first, skipIgnoreCase(line, "proc ", first)
@@ -75,20 +34,18 @@ proc replaceDeprecated*(conf: ConfigRef; info: TLineInfo; oldSym, newSym: PIdent
   let last = first+identLen(line, first)-1
   if cmpIgnoreStyle(line[first..last], oldSym.s) == 0:
     var x = line.substr(0, first-1) & newSym.s & line.substr(last+1)
-    system.shallowCopy(gSourceFiles[info.fileIndex.int32].lines[info.line.int-1], x)
-    gSourceFiles[info.fileIndex.int32].dirty = true
+    system.shallowCopy(conf.m.fileInfos[info.fileIndex.int32].lines[info.line.int-1], x)
+    conf.m.fileInfos[info.fileIndex.int32].dirty = true
     #if newSym.s == "File": writeStackTrace()
 
 proc replaceDeprecated*(conf: ConfigRef; info: TLineInfo; oldSym, newSym: PSym) =
   replaceDeprecated(conf, info, oldSym.name, newSym.name)
 
 proc replaceComment*(conf: ConfigRef; info: TLineInfo) =
-  loadFile(conf, info)
-
-  let line = gSourceFiles[info.fileIndex.int32].lines[info.line.int-1]
+  let line = sourceLine(conf, info)
   var first = info.col.int
   if line[first] != '#': inc first
 
   var x = line.substr(0, first-1) & "discard " & line.substr(first+1).escape
-  system.shallowCopy(gSourceFiles[info.fileIndex.int32].lines[info.line.int-1], x)
-  gSourceFiles[info.fileIndex.int32].dirty = true
+  system.shallowCopy(conf.m.fileInfos[info.fileIndex.int32].lines[info.line.int-1], x)
+  conf.m.fileInfos[info.fileIndex.int32].dirty = true