From ad834521282a45122ddc78006c3dec41875f974f Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Wed, 22 Nov 2023 04:07:11 +0100 Subject: [PATCH] WIP: type hack --- compiler/src/type_check/define_types.rs | 8 +++++++- compiler/src/type_check/methods.rs | 8 +++++++- types/src/resolve.rs | 16 ++++++++++------ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/compiler/src/type_check/define_types.rs b/compiler/src/type_check/define_types.rs index ae6155d63..c2334ca83 100644 --- a/compiler/src/type_check/define_types.rs +++ b/compiler/src/type_check/define_types.rs @@ -288,7 +288,13 @@ impl<'a> ImplementTraits<'a> { &bounds, ); - let rules = Rules::default(); + let mut rules = Rules::default(); + + // TODO: remove + if self.file().ends_with("Downloads/test.inko") { + rules.type_parameters_as_owned = true; + } + let mut definer = DefineTypeSignature::new(self.state, self.module, &scope, rules); diff --git a/compiler/src/type_check/methods.rs b/compiler/src/type_check/methods.rs index 3affc25e6..4bf8aff6e 100644 --- a/compiler/src/type_check/methods.rs +++ b/compiler/src/type_check/methods.rs @@ -1281,13 +1281,19 @@ impl<'a> ImplementTraitMethods<'a> { self_type, ); - let rules = Rules { + let mut rules = Rules { allow_private_types: class_instance .instance_of() .is_private(self.db()) || method.is_private(self.db()), ..Default::default() }; + + // TODO: remove + if self.file().ends_with("Downloads/test.inko") { + rules.type_parameters_as_owned = true; + } + let receiver = receiver_type(self.db(), self_type, node.kind); method.set_receiver(self.db_mut(), receiver); diff --git a/types/src/resolve.rs b/types/src/resolve.rs index 77fe39eea..d4728185d 100644 --- a/types/src/resolve.rs +++ b/types/src/resolve.rs @@ -94,12 +94,16 @@ impl<'a> TypeResolver<'a> { self.cached.insert(value, value); let resolved = match value { - TypeRef::Owned(id) | TypeRef::Infer(id) => { - match self.resolve_type_id(id) { - Either::Left(res) => TypeRef::Owned(res), - Either::Right(typ) => typ, - } - } + TypeRef::Owned(id) => match self.resolve_type_id(id) { + Either::Left(res) => TypeRef::Owned(res), + // TODO: this is to simulate forcing owned type parameter + // values to also be owned. + Either::Right(typ) => typ.as_owned(self.db), + }, + TypeRef::Infer(id) => match self.resolve_type_id(id) { + Either::Left(res) => TypeRef::Owned(res), + Either::Right(typ) => typ, + }, TypeRef::Pointer(id) => match self.resolve_type_id(id) { Either::Left(res) => TypeRef::Pointer(res), Either::Right(