Skip to content

Commit 3007188

Browse files
authored
fixes is operators for tuples (#1184)
1 parent 1da3976 commit 3007188

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

src/nimony/sem.nim

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4198,7 +4198,16 @@ proc semIs(c: var SemContext; it: var Item) =
41984198
it.n = lhs.n
41994199
if lhs.typ.typeKind == TypedescT:
42004200
inc lhs.typ
4201-
let rhs = semLocalType(c, it.n)
4201+
4202+
let rhs: TypeCursor
4203+
if it.n.exprKind == TupConstrX:
4204+
inc it.n
4205+
rhs = semLocalType(c, it.n)
4206+
while it.n.kind != ParRi:
4207+
skip it.n
4208+
skipParRi it.n
4209+
else:
4210+
rhs = semLocalType(c, it.n)
42024211
skipParRi it.n
42034212
c.dest.shrink beforeExpr # delete LHS and RHS
42044213
if containsGenericParams(lhs.typ) or containsGenericParams(rhs):

src/nimony/sigmatch.nim

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,11 @@ proc isSomeSeqType*(a: Cursor): bool {.inline.} =
957957
var dummy = default(Cursor)
958958
result = isSomeSeqType(a, dummy)
959959

960+
proc getTupleFieldTypeSkipTypedesc(c: Cursor): Cursor =
961+
result = getTupleFieldType(c)
962+
if result.typeKind == TypedescT:
963+
inc result
964+
960965
proc singleArgImpl(m: var Match; f: var Cursor; arg: CallArg) =
961966
case f.kind
962967
of Symbol:
@@ -1093,8 +1098,8 @@ proc singleArgImpl(m: var Match; f: var Cursor; arg: CallArg) =
10931098
# len(f) > len(a)
10941099
m.error InvalidMatch, fOrig, aOrig
10951100
# only the type of the field is important:
1096-
var ffld = getTupleFieldType(f)
1097-
var afld = getTupleFieldType(a)
1101+
var ffld = getTupleFieldTypeSkipTypedesc(f)
1102+
var afld = getTupleFieldTypeSkipTypedesc(a)
10981103
linearMatch m, ffld, afld
10991104
# skip fields:
11001105
skip f

tests/nimony/types/tisopr.nim

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,16 @@ assert Foo[int, float] is Foo[int, float]
4242
assert Foo[float, float] is Foo[float, float]
4343
assert Foo[int, float] isnot Foo[float, float]
4444
assert Foo[int, int] isnot Bar[int, int]
45+
46+
47+
type
48+
Person = tuple[name: string, age: int] # type representing a person:
49+
# it consists of a name and an age.
50+
var person: Person
51+
person = (name: "Peter", age: 30)
52+
assert person.name == "Peter"
53+
# the same, but less readable:
54+
person = ("Peter", 30)
55+
assert person[0] == "Peter"
56+
assert Person is (string, int)
57+
assert (string, int) is Person

0 commit comments

Comments
 (0)