Skip to content

Commit 2b142fe

Browse files
committed
preferMixed
1 parent 6e07690 commit 2b142fe

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)
@@ -437,7 +438,8 @@ const
437438
"and", "or", "not", "any", "static", "TypeFromExpr", "FieldAccessor",
438439
"void"]
439440

440-
const preferToResolveSymbols = {preferName, preferTypeName, preferModuleInfo, preferGenericArg, preferResolved}
441+
const preferToResolveSymbols = {preferName, preferTypeName, preferModuleInfo,
442+
preferGenericArg, preferResolved, preferMixed}
441443

442444
template bindConcreteTypeToUserTypeClass*(tc, concrete: PType) =
443445
tc.sons.add concrete
@@ -458,8 +460,8 @@ proc addTypeFlags(name: var string, typ: PType) {.inline.} =
458460
proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string =
459461
let preferToplevel = prefer
460462
proc getPrefer(prefer: TPreferedDesc): TPreferedDesc =
461-
if preferToplevel == preferResolved:
462-
preferResolved # preferResolved is sticky
463+
if preferToplevel in {preferResolved, preferMixed}:
464+
preferToplevel # sticky option
463465
else:
464466
prefer
465467

@@ -474,7 +476,7 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string =
474476
result = t.sym.name.s & " literal(" & $t.n.intVal & ")"
475477
elif t.kind == tyAlias and t.sons[0].kind != tyAlias:
476478
result = typeToString(t.sons[0])
477-
elif prefer == preferResolved:
479+
elif prefer in {preferResolved, preferMixed}:
478480
case t.kind
479481
of IntegralTypes + {tyFloat..tyFloat128} + {tyString, tyCString}:
480482
result = typeToStr[t.kind]
@@ -485,6 +487,8 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string =
485487
result = typeToString(t.lastSon.lastSon)
486488
else:
487489
result = t.sym.name.s
490+
if prefer == preferMixed and result != t.sym.name.s:
491+
result = t.sym.name.s & "{" & result & "}"
488492
elif prefer in {preferName, preferTypeName} or t.sym.owner.isNil:
489493
# note: should probably be: {preferName, preferTypeName, preferGenericArg}
490494
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)