fixes symbolName for range enums (#24052)

This commit is contained in:
ringabout
2024-09-03 22:35:04 +08:00
committed by GitHub
parent 4bf323d6c4
commit c948ab9b85
2 changed files with 17 additions and 1 deletions

View File

@@ -174,6 +174,9 @@ template symbolRank*[T: enum](a: T): int =
when T is Ordinal: ord(a) - T.low.ord.static
else: symbolRankImpl(a)
proc rangeBase(T: typedesc): typedesc {.magic: "TypeTrait".}
# skip one level of range; return the base type of a range type
func symbolName*[T: enum](a: T): string =
## Returns the symbol name of an enum.
##
@@ -192,5 +195,8 @@ func symbolName*[T: enum](a: T): string =
c1 = 4
c2 = 20
assert c1.symbolName == "c1"
const names = enumNames(T)
when T is range:
const names = enumNames(rangeBase T)
else:
const names = enumNames(T)
names[a.symbolRank]

View File

@@ -35,5 +35,15 @@ template main =
doAssert $b == "kb0"
static: doAssert B.high.symbolName == "b2"
block:
type
Color = enum
Red = "red", Yellow = "yellow", Blue = "blue"
var s = Red
doAssert symbolName(s) == "Red"
var x: range[Red..Blue] = Yellow
doAssert symbolName(x) == "Yellow"
static: main()
main()