diff options
author | flywind <43030857+xflywind@users.noreply.github.com> | 2022-07-13 01:35:08 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-12 19:35:08 +0200 |
commit | 0180c6179aa0ff2dacaa6c063c0fa24cf459a84d (patch) | |
tree | 6fe800abc9162cdf4d4bf6839123be4ea4e0d092 /compiler | |
parent | 5c510a9ab96f265ffb0323a18deadb5bb175cfdc (diff) | |
download | Nim-0180c6179aa0ff2dacaa6c063c0fa24cf459a84d.tar.gz |
fix #18735; genDepend broken for duplicate module names in separate folders (#19988)
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/depends.nim | 58 | ||||
-rw-r--r-- | compiler/options.nim | 2 |
2 files changed, 52 insertions, 8 deletions
diff --git a/compiler/depends.nim b/compiler/depends.nim index 30fc961c5..1dcdec989 100644 --- a/compiler/depends.nim +++ b/compiler/depends.nim @@ -9,10 +9,12 @@ # This module implements a dependency file generator. -import - options, ast, ropes, idents, passes, modulepaths, pathutils +import options, ast, ropes, passes, pathutils, msgs, lineinfos -from modulegraphs import ModuleGraph, PPassContext +import modulegraphs + +import std/[os, strutils, parseutils] +import std/private/globs type TGen = object of PPassContext @@ -28,6 +30,50 @@ proc addDependencyAux(b: Backend; importing, imported: string) = b.dotGraph.addf("\"$1\" -> \"$2\";$n", [rope(importing), rope(imported)]) # s1 -> s2_4[label="[0-9]"]; +proc toNimblePath(s: string, isStdlib: bool): string = + const stdPrefix = "std/" + const pkgPrefix = "pkg/" + if isStdlib: + let sub = "lib/" + var start = s.find(sub) + if start < 0: + doAssert false + else: + start += sub.len + let base = s[start..^1] + + if base.startsWith("system") or base.startsWith("std"): + result = base + else: + for dir in stdlibDirs: + if base.startsWith(dir): + return stdPrefix & base.splitFile.name + + result = stdPrefix & base + else: + var sub = getEnv("NIMBLE_DIR") + if sub.len == 0: + sub = ".nimble/pkgs/" + else: + sub.add "/pkgs/" + var start = s.find(sub) + if start < 0: + result = s + else: + start += sub.len + start += skipUntil(s, '/', start) + start += 1 + result = pkgPrefix & s[start..^1] + +proc addDependency(c: PPassContext, g: PGen, b: Backend, n: PNode) = + doAssert n.kind == nkSym, $n.kind + + let path = splitFile(toProjPath(g.config, n.sym.position.FileIndex)) + let modulePath = splitFile(toProjPath(g.config, g.module.position.FileIndex)) + let parent = nativeToUnixPath(modulePath.dir / modulePath.name).toNimblePath(belongsToStdlib(g.graph, g.module)) + let child = nativeToUnixPath(path.dir / path.name).toNimblePath(belongsToStdlib(g.graph, n.sym)) + addDependencyAux(b, parent, child) + proc addDotDependency(c: PPassContext, n: PNode): PNode = result = n let g = PGen(c) @@ -35,11 +81,9 @@ proc addDotDependency(c: PPassContext, n: PNode): PNode = case n.kind of nkImportStmt: for i in 0..<n.len: - var imported = getModuleName(g.config, n[i]) - addDependencyAux(b, g.module.name.s, imported) + addDependency(c, g, b, n[i]) of nkFromStmt, nkImportExceptStmt: - var imported = getModuleName(g.config, n[0]) - addDependencyAux(b, g.module.name.s, imported) + addDependency(c, g, b, n[0]) of nkStmtList, nkBlockStmt, nkStmtListExpr, nkBlockExpr: for i in 0..<n.len: discard addDotDependency(c, n[i]) else: diff --git a/compiler/options.nim b/compiler/options.nim index 792f15d58..1ba157587 100644 --- a/compiler/options.nim +++ b/compiler/options.nim @@ -852,7 +852,7 @@ when (NimMajor, NimMinor) < (1, 1) or not declared(isRelativeTo): let ret = relativePath(path, base) result = path.len > 0 and not ret.startsWith ".." -const stdlibDirs = [ +const stdlibDirs* = [ "pure", "core", "arch", "pure/collections", "pure/concurrency", |