diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index ba6fa327..a4cc688b 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -5918,8 +5918,14 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance) continue; auto iReturnType = ifaceMethodInst->mReturnType; - if (iReturnType->IsSelf()) - iReturnType = typeInstance; + if (iReturnType->IsUnspecializedTypeVariation()) + { + BfType* resolvedType = ResolveGenericType(iReturnType, NULL, NULL); + if (resolvedType != NULL) + iReturnType = resolvedType; + else + iReturnType = typeInstance; + } if (ifaceMethodInst->mMethodDef->mIsOverride) continue; // Don't consider overrides here @@ -7684,6 +7690,9 @@ BfType* BfModule::ResolveGenericType(BfType* unspecializedType, BfTypeVector* ty return unspecializedType; } + if ((unspecializedType->IsSelf()) && (mCurTypeInstance != NULL)) + return mCurTypeInstance; + if (!unspecializedType->IsUnspecializedType()) { return unspecializedType; diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 195dbb8a..dd8495ca 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -659,6 +659,8 @@ public: virtual bool IsDot() override { return mTypeDef->mTypeCode == BfTypeCode_Dot; } virtual bool IsVar() override { return mTypeDef->mTypeCode == BfTypeCode_Var; } virtual bool IsLet() override { return mTypeDef->mTypeCode == BfTypeCode_Let; } + virtual bool IsUnspecializedType() override { return mTypeDef->mTypeCode == BfTypeCode_Self; } + virtual bool IsUnspecializedTypeVariation() override { return mTypeDef->mTypeCode == BfTypeCode_Self; } }; class BfTypeInstance; diff --git a/IDEHelper/Tests/src/Interfaces.bf b/IDEHelper/Tests/src/Interfaces.bf index 83391849..4f786e0d 100644 --- a/IDEHelper/Tests/src/Interfaces.bf +++ b/IDEHelper/Tests/src/Interfaces.bf @@ -315,6 +315,19 @@ namespace Tests return val.Val; } + interface IParsable + { + static Result Parse(StringView sv, Self defaultVal); + } + + class ClassH : IParsable + { + public static Result Parse(StringView sv, ClassH defaultVal) + { + return .Err; + } + } + [Test] public static void TestDefaults() {