Skip to content

Commit e9b7c5b

Browse files
committed
preferMixed
1 parent c22d0c3 commit e9b7c5b

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

compiler/types.nim

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ type
2222
preferGenericArg,
2323
preferTypeName,
2424
preferResolved, # fully resolved symbols
25+
preferMixed, # show symbol + resolved symbols if it differs, eg: seq[cint{int32}, float]
2526

2627
proc typeToString*(typ: PType; prefer: TPreferedDesc = preferName): string
2728
template `$`*(typ: PType): string = typeToString(typ)
@@ -413,7 +414,8 @@ const
413414
"and", "or", "not", "any", "static", "TypeFromExpr", "FieldAccessor",
414415
"void"]
415416

416-
const preferToResolveSymbols = {preferName, preferTypeName, preferModuleInfo, preferGenericArg, preferResolved}
417+
const preferToResolveSymbols = {preferName, preferTypeName, preferModuleInfo,
418+
preferGenericArg, preferResolved, preferMixed}
417419

418420
template bindConcreteTypeToUserTypeClass*(tc, concrete: PType) =
419421
tc.sons.add concrete
@@ -434,8 +436,8 @@ proc addTypeFlags(name: var string, typ: PType) {.inline.} =
434436
proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string =
435437
let preferToplevel = prefer
436438
proc getPrefer(prefer: TPreferedDesc): TPreferedDesc =
437-
if preferToplevel == preferResolved:
438-
preferResolved # preferResolved is sticky
439+
if preferToplevel in {preferResolved, preferMixed}:
440+
preferToplevel # sticky option
439441
else:
440442
prefer
441443

@@ -450,7 +452,7 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string =
450452
result = t.sym.name.s & " literal(" & $t.n.intVal & ")"
451453
elif t.kind == tyAlias and t.sons[0].kind != tyAlias:
452454
result = typeToString(t.sons[0])
453-
elif prefer == preferResolved:
455+
elif prefer in {preferResolved, preferMixed}:
454456
case t.kind
455457
of IntegralTypes + {tyFloat..tyFloat128} + {tyString, tyCString}:
456458
result = typeToStr[t.kind]
@@ -461,6 +463,8 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string =
461463
result = typeToString(t.lastSon.lastSon)
462464
else:
463465
result = t.sym.name.s
466+
if prefer == preferMixed and result != t.sym.name.s:
467+
result = t.sym.name.s & "{" & result & "}"
464468
elif prefer in {preferName, preferTypeName} or t.sym.owner.isNil:
465469
# note: should probably be: {preferName, preferTypeName, preferGenericArg}
466470
result = t.sym.name.s

tests/metatype/ttypetraits2.nim

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,9 @@ block: # typeToString
3737
doAssert C4[MyInt].name2 == "C4[int]"
3838
when BiggestFloat is float and cint is int:
3939
doAssert C2b[cint, BiggestFloat].name2 == "C3[int, C3[float, int32]]"
40+
41+
template name3(T): string = typeToString(T, "preferMixed")
42+
doAssert MyInt.name3 == "MyInt{int}"
43+
doAssert (tuple[a: MyInt, b: float]).name3 == "tuple[a: MyInt{int}, b: float]"
44+
doAssert (tuple[a: C2b[MyInt, C4[cstring]], b: cint, c: float]).name3 ==
45+
"tuple[a: C2b{C}[MyInt{int}, C4[cstring]], b: cint{int32}, c: float]"

0 commit comments

Comments
 (0)