summary refs log tree commit diff stats
path: root/compiler/options.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2014-03-02 15:41:53 +0100
committerAraq <rumpf_a@web.de>2014-03-02 15:41:53 +0100
commitc55f5b34ee4d3c44c21b17c93e8d38dd867fb9cc (patch)
treecdebb4a733cb89cfb8f2cdd986fb000e74ae8e8a /compiler/options.nim
parentd4263b1012f50e7d468e53d07d592b39983f026a (diff)
downloadNim-c55f5b34ee4d3c44c21b17c93e8d38dd867fb9cc.tar.gz
better handling of packages, still incomplete
Diffstat (limited to 'compiler/options.nim')
-rw-r--r--compiler/options.nim57
1 files changed, 44 insertions, 13 deletions
diff --git a/compiler/options.nim b/compiler/options.nim
index 4f642e626..69d41c562 100644
--- a/compiler/options.nim
+++ b/compiler/options.nim
@@ -209,21 +209,52 @@ proc getGeneratedPath: string =
   result = if nimcacheDir.len > 0: nimcacheDir else: gProjectPath.shortenDir /
                                                          genSubDir
 
+var packageCache = newStringTable(when FileSystemCaseSensitive:
+                                    modeCaseInsensitive
+                                  else:
+                                    modeCaseSensitive)
+
+iterator myParentDirs(p: string): string =
+  # XXX os's parentDirs is stupid (multiple yields) and triggers an old bug...
+  var current = p
+  while true:
+    current = current.parentDir
+    if current.len == 0: break
+    yield current
+
 proc getPackageName*(path: string): string =
-  var q = 1
-  var b = 0
-  if path[len(path)-1] in {DirSep, AltSep}: q = 2
-  for i in countdown(len(path)-q, 0):
-    if path[i] in {DirSep, AltSep}:
-      if b == 0: b = i
-      else:
-        let x = path.substr(i+1, b-1)
-        case x.normalize
-        of "lib", "src", "source", "package", "pckg", "library", "private":
-          b = i
+  var parents = 0
+  block packageSearch:
+    for d in myParentDirs(path):
+      if packageCache.hasKey(d):
+        #echo "from cache ", d, " |", packageCache[d], "|", path.splitFile.name
+        return packageCache[d]
+      inc parents
+      for file in walkFiles(d / "*.babel"):
+        result = file.splitFile.name
+        break packageSearch
+  # we also store if we didn't find anything:
+  if result.isNil: result = ""
+  for d in myParentDirs(path):
+    #echo "set cache ", d, " |", result, "|", parents
+    packageCache[d] = result
+    dec parents
+    if parents <= 0: break
+  when false:
+    var q = 1
+    var b = 0
+    if path[len(path)-1] in {DirSep, AltSep}: q = 2
+    for i in countdown(len(path)-q, 0):
+      if path[i] in {DirSep, AltSep}:
+        if b == 0: b = i
         else:
-          return x.replace('.', '_')
-  result = ""
+          let x = path.substr(i+1, b-1)
+          case x.normalize
+          of "lib", "src", "source", "package", "pckg", "library", "private":
+            b = i
+          else:
+            return x.replace('.', '_')
+    result = ""
 
 proc withPackageName*(path: string): string =
   let x = path.getPackageName