fix #13349 regression: isNamedTuple now works with generic tuples (#13350)

This commit is contained in:
Timothee Cour 2020-02-06 21:58:04 -08:00 • committed by GitHub
commit 7481f43753
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 7 additions and 1 deletions

View file

@ -11,7 +11,7 @@
# semantic checking. # semantic checking.
import import
options, ast, msgs, idents, passes, docgen, lineinfos, pathutils options, ast, msgs, passes, docgen, lineinfos, pathutils
from modulegraphs import ModuleGraph, PPassContext from modulegraphs import ModuleGraph, PPassContext

View file

@ -176,6 +176,7 @@ proc evalTypeTrait(c: PContext; traitCall: PNode, operand: PType, context: PSym)
hasDestructor(t) hasDestructor(t)
result = newIntNodeT(toInt128(ord(not complexObj)), traitCall, c.graph) result = newIntNodeT(toInt128(ord(not complexObj)), traitCall, c.graph)
of "isNamedTuple": of "isNamedTuple":
var operand = operand.skipTypes({tyGenericInst})
let cond = operand.kind == tyTuple and operand.n != nil let cond = operand.kind == tyTuple and operand.n != nil
result = newIntNodeT(toInt128(ord(cond)), traitCall, c.graph) result = newIntNodeT(toInt128(ord(cond)), traitCall, c.graph)
of "distinctBase": of "distinctBase":

View file

@ -6,6 +6,8 @@ block: # isNamedTuple
type Foo2 = (Field0:1,).type type Foo2 = (Field0:1,).type
type Foo3 = ().type type Foo3 = ().type
type Foo4 = object type Foo4 = object
type Foo5[T] = tuple[x:int, y: T]
type Foo6[T] = (T,)
doAssert (a:1,).type.isNamedTuple doAssert (a:1,).type.isNamedTuple
doAssert Foo1.isNamedTuple doAssert Foo1.isNamedTuple
@ -14,6 +16,9 @@ block: # isNamedTuple
doAssert not Foo3.isNamedTuple doAssert not Foo3.isNamedTuple
doAssert not Foo4.isNamedTuple doAssert not Foo4.isNamedTuple
doAssert not (1,).type.isNamedTuple doAssert not (1,).type.isNamedTuple
doAssert isNamedTuple(Foo5[int8])
doAssert not isNamedTuple(Foo5)
doAssert not isNamedTuple(Foo6[int8])
proc typeToString*(t: typedesc, prefer = "preferTypeName"): string {.magic: "TypeTrait".} proc typeToString*(t: typedesc, prefer = "preferTypeName"): string {.magic: "TypeTrait".}
## Returns the name of the given type, with more flexibility than `name`, ## Returns the name of the given type, with more flexibility than `name`,