diff options
-rw-r--r-- | compiler/semfold.nim | 18 | ||||
-rw-r--r-- | compiler/types.nim | 4 | ||||
-rw-r--r-- | tests/objvariant/tyaoption.nim | 47 |
3 files changed, 61 insertions, 8 deletions
diff --git a/compiler/semfold.nim b/compiler/semfold.nim index 925a80832..caaab2291 100644 --- a/compiler/semfold.nim +++ b/compiler/semfold.nim @@ -113,12 +113,18 @@ proc pickMaxInt(n: PNode): BiggestInt = internalError(n.info, "pickMaxInt") proc makeRange(typ: PType, first, last: BiggestInt): PType = - var n = newNode(nkRange) - addSon(n, newIntNode(nkIntLit, min(first, last))) - addSon(n, newIntNode(nkIntLit, max(first, last))) - result = newType(tyRange, typ.owner) - result.n = n - addSonSkipIntLit(result, skipTypes(typ, {tyRange})) + let minA = min(first, last) + let maxA = max(first, last) + let lowerNode = newIntNode(nkIntLit, minA) + if typ.kind == tyInt and minA == maxA: + result = getIntLitType(lowerNode) + else: + var n = newNode(nkRange) + addSon(n, lowerNode) + addSon(n, newIntNode(nkIntLit, maxA)) + result = newType(tyRange, typ.owner) + result.n = n + addSonSkipIntLit(result, skipTypes(typ, {tyRange})) proc makeRangeF(typ: PType, first, last: BiggestFloat): PType = var n = newNode(nkRange) diff --git a/compiler/types.nim b/compiler/types.nim index ae31d24de..c80f6ff35 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -385,8 +385,8 @@ proc mutateType(t: PType, iter: TTypeMutator, closure: PObject): PType = proc valueToString(a: PNode): string = case a.kind - of nkCharLit..nkUInt64Lit: result = $(a.intVal) - of nkFloatLit..nkFloat128Lit: result = $(a.floatVal) + of nkCharLit..nkUInt64Lit: result = $a.intVal + of nkFloatLit..nkFloat128Lit: result = $a.floatVal of nkStrLit..nkTripleStrLit: result = a.strVal else: result = "<invalid value>" diff --git a/tests/objvariant/tyaoption.nim b/tests/objvariant/tyaoption.nim new file mode 100644 index 000000000..635e60bb8 --- /dev/null +++ b/tests/objvariant/tyaoption.nim @@ -0,0 +1,47 @@ +discard """ + output: '''some(str), some(5), none +some(5!) +some(10)''' +""" + +import strutils + +type Option[A] = object + case isDefined*: Bool + of true: + value*: A + of false: + nil + +proc some[A](value: A): Option[A] = + Option[A](isDefined: true, value: value) + +proc none[A](): Option[A] = + Option[A](isDefined: false) + +proc `$`[A](o: Option[A]): String = + if o.isDefined: + "some($1)" % [$o.value] + else: + "none" + +let x = some("str") +let y = some(5) +let z = none[Int]() + +echo x, ", ", y, ", ", z + +proc intOrString[A : Int | String](o: Option[A]): Option[A] = + when A is Int: + some(o.value + 5) + elif A is String: + some(o.value & "!") + else: + o + +#let a1 = intOrString(none[String]()) +let a2 = intOrString(some("5")) +let a3 = intOrString(some(5)) +#echo a1 +echo a2 +echo a3 |