Skip to content

Commit 80c5897

Browse files
committed
[Typer] Infer ParametricType proactively
1 parent cc7f1fc commit 80c5897

File tree

1 file changed

+35
-1
lines changed

1 file changed

+35
-1
lines changed

source/compiler/typer.hexa

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3117,7 +3117,41 @@ class Typer {
31173117
}
31183118
}
31193119
case ParametricType(name, _):
3120-
fail('Cannot use generic type `\(name)` as a value', node)
3120+
if asValue {
3121+
fail('Cannot use generic type `\(name)` as a value', node)
3122+
// TODO ^ "you forgot () to call constructor?"
3123+
}
3124+
3125+
let subj = find(name)
3126+
if subj == null {
3127+
fail('Cannot find type with name `\(name)`', node)
3128+
}
3129+
if parents.get(node) != null, parents.get(node) != subj {
3130+
fail('Parent overwritten from \(parents.get(node)) to \(subj) for node \(node)' + never, node)
3131+
}
3132+
parents.set(node, subj)
3133+
if let type = types.get(subj) {
3134+
types.set(node, type)
3135+
} else {
3136+
// Try eager on-demand type build
3137+
switch subj {
3138+
case Class(_):
3139+
// TODO better idea
3140+
let mod = currentModule
3141+
registerClassType(subj)
3142+
currentModule = mod
3143+
case Enum(_):
3144+
// TODO module trick around this whole `switch`?
3145+
registerEnumType(subj)
3146+
}
3147+
3148+
if let type = types.get(subj) {
3149+
types.set(node, type)
3150+
} else {
3151+
console.log(positionOf(subj) + '\(name) is here')
3152+
fail('Cannot find type for `\(name)` even after late build' + never, node)
3153+
}
3154+
}
31213155
case _:
31223156
fail('Cannot use this type as a value', node)
31233157
}

0 commit comments

Comments
 (0)