diff --git a/changelog.md b/changelog.md index e48e38dd6dca..7fe5a4ffc26c 100644 --- a/changelog.md +++ b/changelog.md @@ -140,6 +140,10 @@ with other backends. see #9125. Use `-d:nimLegacyJsRound` for previous behavior. - Added experimental `linenoise.readLineStatus` to get line and status (e.g. ctrl-D or ctrl-C). +- `std/wrapnils` doesn't use `experimental:dotOperators` anymore, avoiding + issues like https://github.com/nim-lang/Nim/issues/13063 (which affected error messages) + for modules importing `std/wrapnils`. + ## Language changes - `nimscript` now handles `except Exception as e`. diff --git a/lib/std/wrapnils.nim b/lib/std/wrapnils.nim index c9120e1b7202..7c067217692a 100644 --- a/lib/std/wrapnils.nim +++ b/lib/std/wrapnils.nim @@ -2,8 +2,7 @@ ## This simplifies code by reducing need for if-else branches around intermediate values ## that maybe be nil. ## -## Note: experimental module and relies on {.experimental: "dotOperators".} -## Unstable API. +## Note: experimental module, unstable API. runnableExamples: type Foo = ref object @@ -39,9 +38,7 @@ template unwrap(a: Wrapnil): untyped = ## See top-level example. a.valueImpl -{.push experimental: "dotOperators".} - -template `.`*(a: Wrapnil, b): untyped = +template fakeDot*(a: Wrapnil, b): untyped = ## See top-level example. let a1 = a # to avoid double evaluations let a2 = a1.valueImpl @@ -58,8 +55,6 @@ template `.`*(a: Wrapnil, b): untyped = # nil is "sticky"; this is needed, see tests default(T) -{.pop.} - proc isValid(a: Wrapnil): bool = ## Returns true if `a` didn't contain intermediate `nil` values (note that ## `a.valueImpl` itself can be nil even in that case) @@ -90,16 +85,18 @@ template `[]`*(a: Wrapnil): untyped = import std/macros proc replace(n: NimNode): NimNode = - if n.kind == nnkPar: + if n.kind == nnkDotExpr: + result = newCall(bindSym"fakeDot", replace(n[0]), n[1]) + elif n.kind == nnkPar: doAssert n.len == 1 - newCall(bindSym"wrapnil", n[0]) + result = newCall(bindSym"wrapnil", n[0]) elif n.kind in {nnkCall, nnkObjConstr}: - newCall(bindSym"wrapnil", n) + result = newCall(bindSym"wrapnil", n) elif n.len == 0: - newCall(bindSym"wrapnil", n) + result = newCall(bindSym"wrapnil", n) else: n[0] = replace(n[0]) - n + result = n macro `?.`*(a: untyped): untyped = ## Transforms `a` into an expression that can be safely evaluated even in