Skip to content

Commit 87eb168

Browse files
committed
sema: fix strict type aliases structure type will not collect the references of the types, such as builtin implementation of the map type when declared like type MyMap: map[int]int
1 parent 62ea0ef commit 87eb168

2 files changed

Lines changed: 11 additions & 4 deletions

File tree

std/jule/sema/constraint.jule

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ impl constraintChecker {
7777
generic.Constraint = make([]ConstraintMask, 0, len(g.Constraint.Mask))
7878
for (_, mut mask) in g.Constraint.Mask {
7979
n := len(sema.errors)
80-
mut typ := sema.buildTypeWithRefers(mask.Type, sema, generics, nil)
80+
mut typ := sema.buildTypeWithRefers(mask.Type, sema, generics, nil, nil)
8181
if typ == nil {
8282
mut itd, _ := mask.Type.Data.(&ast::NameExpr)
8383
if itd != nil && isBuiltinConstraint(itd.Name) {

std/jule/sema/sema.jule

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -699,25 +699,32 @@ impl sema {
699699

700700
// Builds type, builds result as kind and collects referred type aliases.
701701
fn buildTypeWithRefers(mut &self, mut t: &ast::Expr, mut l: Lookup,
702-
mut generics: []&TypeAlias, mut referencer: &referencer): &Type {
703-
ret self.typeChecker(l, generics, referencer).checkDecl(t)
702+
mut generics: []&TypeAlias, mut referencer: &referencer, mut refers: &ReferenceStack): &Type {
703+
mut tc := self.typeChecker(l, generics, referencer)
704+
tc.refers = refers
705+
ret tc.checkDecl(t)
704706
}
705707

706708
// Checks TypeSYm, builds result as Type and collects referred type aliases.
707709
// Skips already checked types.
708710
// See also developer reference (9).
709711
fn checkTypeSymWithRefers(mut &self, mut t: &TypeSym, mut l: Lookup, mut generics: []&TypeAlias, mut referencer: &referencer): (ok: bool) {
710712
mut ta := false // Referencer owner is type alias.
713+
let mut refers: &ReferenceStack
711714
if t.checked() {
712715
match type referencer.owner {
713716
| &TypeAlias:
714717
ta = true
718+
mut typal := referencer.owner.(&TypeAlias)
719+
if typal.Strict {
720+
refers = typal.TypeSym.Type.SoftStruct().Refers
721+
}
715722
}
716723
if !ta {
717724
ret true
718725
}
719726
}
720-
mut tt := self.buildTypeWithRefers(t.Decl, l, generics, referencer)
727+
mut tt := self.buildTypeWithRefers(t.Decl, l, generics, referencer, refers)
721728
if tt == nil || !ta {
722729
t.Type = tt
723730
} else {

0 commit comments

Comments
 (0)