Skip to content

Commit 7809094

Browse files
committed
Work on type replacements
1 parent a7af023 commit 7809094

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

src/scope.pr

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,17 @@ def find_function(scope: &Scope, node: &parser::Node, v: &Value, parameter_t: &V
691691

692692
loop {
693693
if not v { break }
694-
let s = typechecking::overload_score(v.fdef, node.value.identifier.types, context, true)
694+
695+
var new_scope = scope
696+
if typechecking::is_polymorph(v.fdef.parameter_t) {
697+
// Create temporary scope for type lookup
698+
// TODO Maybe cache it somewhere instead of creating a new one when creating a polymorphic instance
699+
let parents = vector::make(type weak &Scope)
700+
parents.push(scope)
701+
parents.push(context)
702+
new_scope = enter_scope(parents, scope.module)
703+
}
704+
let s = typechecking::overload_score(v.fdef, node.value.identifier.types, new_scope, true)
695705
if s == 0 {
696706
@score = 0
697707
return true, v

src/typechecking.pr

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,9 @@ export def tpe(id: TypeId) -> TypeId {
118118
return resolve(id).tpe
119119
}
120120
export 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
}
123125
export 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

448450
def 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

23082312
export 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

23182323
export 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

Comments
 (0)