mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-04 20:17:42 +00:00
fixes symbolName for range enums (#24052)
This commit is contained in:
@@ -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]
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user