From c0a2e2ed92610933983d1edb57d1ad0204189f61 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Fri, 7 Feb 2020 04:27:28 -0800 Subject: [PATCH] replace old problematic isNamedTuple implementation by TypeTrait isNamedTuple in dollars.nim (#13347) * replace old problematic isNamedTuple implementation by TypeTrait isNamedTuple * fix for bootstrap --- compiler/condsyms.nim | 1 + lib/system/dollars.nim | 26 +++++++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/compiler/condsyms.nim b/compiler/condsyms.nim index 9a762d585..344f6fd5a 100644 --- a/compiler/condsyms.nim +++ b/compiler/condsyms.nim @@ -103,6 +103,7 @@ proc initDefines*(symbols: StringTableRef) = defineSymbol("nimNewShiftOps") defineSymbol("nimHasCursor") defineSymbol("nimHasExceptionsQuery") + defineSymbol("nimHasIsNamedTuple") when defined(nimHasLibFFI): # Renaming as we can't conflate input vs output define flags; e.g. this diff --git a/lib/system/dollars.nim b/lib/system/dollars.nim index 64860ef39..664f1c30d 100644 --- a/lib/system/dollars.nim +++ b/lib/system/dollars.nim @@ -49,18 +49,22 @@ proc `$`*(t: typedesc): string {.magic: "TypeTrait".} ## doAssert $(type("Foo")) == "string" ## static: doAssert $(type(@['A', 'B'])) == "seq[char]" +when defined(nimHasIsNamedTuple): + proc isNamedTuple(T: typedesc): bool {.magic: "TypeTrait".} +else: + # for bootstrap; remove after release 1.2 + proc isNamedTuple(T: typedesc): bool = + # Taken from typetraits. + when T isnot tuple: result = false + else: + var t: T + for name, _ in t.fieldPairs: + when name == "Field0": + return compiles(t.Field0) + else: + return true + return false -proc isNamedTuple(T: typedesc): bool = - # Taken from typetraits. - when T isnot tuple: result = false - else: - var t: T - for name, _ in t.fieldPairs: - when name == "Field0": - return compiles(t.Field0) - else: - return true - return false proc `$`*[T: tuple|object](x: T): string = ## Generic ``$`` operator for tuples that is lifted from the components