diff --git a/IDE/Tests/CompileFail001/src/Generics.bf b/IDE/Tests/CompileFail001/src/Generics.bf index 03df377b..d896a9fc 100644 --- a/IDE/Tests/CompileFail001/src/Generics.bf +++ b/IDE/Tests/CompileFail001/src/Generics.bf @@ -65,5 +65,25 @@ namespace IDETest { Method5(); //FAIL Generic argument 'A', declared to be 'E' for 'IDETest.Generics.Method5()', must implement 'System.Collections.IEnumerable' } + + interface IFaceB + { + void MethodA0(); + } + + extension IFaceB + { + void MethodA1(); + } + + class ClassB : IFaceB //FAIL 'IDETest.Generics.ClassB' does not implement interface member 'IDETest.Generics.IFaceB.MethodA0()' + { + + } + + extension ClassB + { + + } } } diff --git a/IDEHelper/Compiler/BfContext.h b/IDEHelper/Compiler/BfContext.h index be023b87..6efd1fdd 100644 --- a/IDEHelper/Compiler/BfContext.h +++ b/IDEHelper/Compiler/BfContext.h @@ -146,6 +146,7 @@ public: BfTypeReference* mCurAttributeTypeRef; BfFieldDef* mCurFieldDef; BfTypeDef* mCurTypeDef; + BfTypeDef* mForceActiveTypeDef; ResolveKind mResolveKind; BfAstNode* mCurVarInitializer; int mArrayInitializerSize; @@ -162,6 +163,7 @@ public: mCurFieldDef = NULL; mCurAttributeTypeRef = NULL; mCurTypeDef = NULL; + mForceActiveTypeDef = NULL; mCurVarInitializer = NULL; mArrayInitializerSize = -1; mResolveKind = ResolveKind_None; @@ -178,6 +180,7 @@ public: mCurFieldDef = NULL; mCurAttributeTypeRef = NULL; mCurTypeDef = NULL; + mForceActiveTypeDef = NULL; mCurVarInitializer = NULL; mArrayInitializerSize = -1; mResolveKind = ResolveKind_None; diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 82e81eb4..08a928a7 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -5543,6 +5543,11 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance) String methodString; /// { + BfTypeState typeState; + typeState.mPrevState = mContext->mCurTypeState; + typeState.mForceActiveTypeDef = declTypeDef; + SetAndRestoreValue prevTypeState(mContext->mCurTypeState, &typeState); + SetAndRestoreValue prevMethodInstance(mCurMethodInstance, ifaceMethodInst); methodString = MethodToString(ifaceMethodInst); } @@ -7621,7 +7626,7 @@ BfGenericParamInstance* BfModule::GetGenericTypeParamInstance(int genericParamId BfGenericExtensionEntry* genericExEntry; if (genericTypeInst->mGenericTypeInfo->mGenericExtensionInfo->mExtensionMap.TryGetValue(lookupTypeDef, &genericExEntry)) { - return genericExEntry->mGenericParams[genericParamIdx]; + return genericExEntry->mGenericParams[genericParamIdx]; } else { @@ -8113,6 +8118,8 @@ BfTypeDef* BfModule::GetActiveTypeDef(BfTypeInstance* typeInstanceOverride, bool { BfTypeDef* useTypeDef = NULL; BfTypeInstance* typeInstance = (typeInstanceOverride != NULL) ? typeInstanceOverride : mCurTypeInstance; + if ((mContext->mCurTypeState != NULL) && (mContext->mCurTypeState->mForceActiveTypeDef != NULL)) + return mContext->mCurTypeState->mForceActiveTypeDef; if (typeInstance != NULL) useTypeDef = typeInstance->mTypeDef; if ((mCurMethodState != NULL) && (mCurMethodState->mMixinState != NULL) && (useMixinDecl))