diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 0347b999..ddfae2a1 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -10981,8 +10981,19 @@ void BfExprEvaluator::LookupQualifiedName(BfAstNode* nameNode, BfIdentifierNode* auto lookupType = BindGenericType(nameNode, mResult.mType); if ((lookupType->IsGenericParam()) && (!mResult.mType->IsGenericParam())) { + bool prevUseMixinGenerics = false; + if (mModule->mCurMethodState->mMixinState != NULL) + { + prevUseMixinGenerics = mModule->mCurMethodState->mMixinState->mUseMixinGenerics; + mModule->mCurMethodState->mMixinState->mUseMixinGenerics = true; + } + // Try to lookup from generic binding mResult = LookupField(nameRight, BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), lookupType), fieldName, BfLookupFieldFlag_BindOnly); + + if (mModule->mCurMethodState->mMixinState != NULL) + mModule->mCurMethodState->mMixinState->mUseMixinGenerics = prevUseMixinGenerics; + if (mPropDef != NULL) { mOrigPropTarget = lookupVal; diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 6c0d62dd..dffe9adf 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -830,6 +830,7 @@ public: bool mHasDeferredUsage; bool mCheckedCircularRef; bool mDoCircularVarResult; + bool mUseMixinGenerics; BfTypedValue mTarget; int mLastTargetAccessId; @@ -847,6 +848,7 @@ public: mHasDeferredUsage = false; mCheckedCircularRef = false; mDoCircularVarResult = false; + mUseMixinGenerics = false; mLastTargetAccessId = -1; } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 4c85bd8d..7f64425c 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -9358,8 +9358,11 @@ BfGenericParamInstance* BfModule::GetGenericParamInstance(BfGenericParamType* ty if (type->mGenericParamKind == BfGenericParamKind_Method) { auto curGenericMethodInstance = mCurMethodInstance; - if ((checkMixinBind) && (mCurMethodState != NULL) && (mCurMethodState->mMixinState != NULL)) - curGenericMethodInstance = mCurMethodState->mMixinState->mMixinMethodInstance; + if ((mCurMethodState != NULL) && (mCurMethodState->mMixinState != NULL)) + { + if ((checkMixinBind) || (mCurMethodState->mMixinState->mUseMixinGenerics)) + curGenericMethodInstance = mCurMethodState->mMixinState->mMixinMethodInstance; + } if ((curGenericMethodInstance == NULL) || (curGenericMethodInstance->mMethodInfoEx == NULL) || (type->mGenericParamIdx >= curGenericMethodInstance->mMethodInfoEx->mGenericParams.mSize)) {