@@ -118,7 +118,9 @@ export def tpe(id: TypeId) -> TypeId {
118118 return resolve(id).tpe
119119}
120120export def kind(id: TypeId) -> TypeKind {
121- return resolve(id).kind
121+ let tpe = resolve(id)
122+ if not tpe { return TypeKind::NULL }
123+ return tpe.kind
122124}
123125export def type_name(id: TypeId) -> Str {
124126 return resolve(id).type_name
@@ -446,7 +448,9 @@ export def generic_to_string(typeref: &TypeRef) -> Str {
446448}
447449
448450def generic_to_string(generic: &Pattern) -> Str {
449- if generic.kind == TypeKind::REFERENCE {
451+ if generic.kind == TypeKind::TYPE_DEF {
452+ return "type-def " + generic.name
453+ } else if generic.kind == TypeKind::REFERENCE {
450454 return "&" + generic_to_string(generic.tpe) // FIXME *let kw
451455 } else if generic.kind == TypeKind::POINTER {
452456 return "*" + generic_to_string(generic.tpe) // FIXME &let kw
@@ -2306,6 +2310,7 @@ def infer_interface_types(a: &Type, b: &Type, module: &toolchain::Module) -> &Ty
23062310}*/
23072311
23082312export def convert_type_score(a: &TypeRef, b: &Type, scpe: &scope::Scope, impl: bool = true) -> int {
2313+ print(generic_to_string(a), " <-> ", debug::type_to_str(b), "\n")
23092314 if a.pattern {
23102315 return convert_type_score(a.pattern, b, scpe, impl)
23112316 } else if a.name {
@@ -2316,8 +2321,9 @@ export def convert_type_score(a: &TypeRef, b: &Type, scpe: &scope::Scope, impl:
23162321}
23172322
23182323export def convert_type_score(a: &Pattern, b: &Type, scpe: &scope::Scope, impl: bool = true) -> int {
2319- if a.kind == TypeKind::TYPE {
2320- return convert_type_score(a.tpe, b, scpe, impl)
2324+ if a.kind == TypeKind::TYPE_DEF {
2325+ scope::create_type(scpe, parser::make_identifier(a.name), parser::ShareMarker::NONE, make_type_ref(b.id))
2326+ return 1
23212327 }
23222328
23232329 if a.kind == b.kind == TypeKind::STATIC_ARRAY {
@@ -2388,7 +2394,9 @@ export def convert_type_score(a: &Pattern, b: &Type, scpe: &scope::Scope, impl:
23882394 for var i in 0..a.return_t.length {
23892395 let tpe_a = a.return_t(i)
23902396 let tpe_b = b.tc_args(i)
2391- if tpe_a != tpe_b { return -1 }
2397+ if convert_type_score(tpe_a, tpe_b, scpe, impl) < 0 {
2398+ return -1
2399+ }
23922400 }
23932401 return 1
23942402 }
@@ -3365,9 +3373,8 @@ def do_type_lookup(node: &parser::Node, state: &State, is_type: bool = false) ->
33653373 let name = parser::identifier_to_str(node)
33663374 if is_type {
33673375 // Create type in scope
3368- let tr = make_type_ref(name)
3369- scope::create_type(state.scope, node, parser::ShareMarker::NONE, tr)
3370- return tr
3376+ scope::create_type(state.scope, node, parser::ShareMarker::NONE, make_type_ref(name))
3377+ return make_type_ref([ kind = TypeKind::TYPE_DEF, name = name ] !&Pattern)
33713378 } else /*if not lookup_default*/ {
33723379 let value = scope::get(state.scope, node)
33733380 if not value {
0 commit comments