From c1a2bd79e19cb5e33e692ec4ac9126ebb6860e6f Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 2 Jun 2020 05:46:56 -0700 Subject: [PATCH] Fixed 'using static' --- IDEHelper/Compiler/BfAutoComplete.cpp | 37 +++++------------------- IDEHelper/Compiler/BfCompiler.cpp | 19 ++++++++++-- IDEHelper/Compiler/BfExprEvaluator.cpp | 37 ++++++++++++++++++++++-- IDEHelper/Compiler/BfModule.cpp | 11 +++++++ IDEHelper/Compiler/BfModule.h | 1 + IDEHelper/Compiler/BfModuleTypeUtils.cpp | 3 +- IDEHelper/Compiler/BfResolvePass.h | 2 ++ 7 files changed, 74 insertions(+), 36 deletions(-) diff --git a/IDEHelper/Compiler/BfAutoComplete.cpp b/IDEHelper/Compiler/BfAutoComplete.cpp index 39a96042..144a0864 100644 --- a/IDEHelper/Compiler/BfAutoComplete.cpp +++ b/IDEHelper/Compiler/BfAutoComplete.cpp @@ -1233,40 +1233,17 @@ void BfAutoComplete::CheckIdentifier(BfAstNode* identifierNode, bool isInExpress AddTypeMembers(globalContainer.mTypeInst, true, false, filter, globalContainer.mTypeInst, true, true); } } - - ////////////////////////////////////////////////////////////////////////// - + + BfStaticSearch* staticSearch = mModule->GetStaticSearch(); + if (staticSearch != NULL) { - auto activeTypeDef = mModule->GetActiveTypeDef(); - - BfStaticSearch* staticSearch; - if ((mModule->mCurTypeInstance != NULL) && (mModule->mCurTypeInstance->mStaticSearchMap.TryGetValue(activeTypeDef, &staticSearch))) + for (auto typeInst : staticSearch->mStaticTypes) { - for (auto typeInst : staticSearch->mStaticTypes) - { - AddTypeMembers(typeInst, true, false, filter, typeInst, true, true); - AddInnerTypes(typeInst, filter, false, false); - } - } - else if ((activeTypeDef != NULL) && (!activeTypeDef->mStaticSearch.IsEmpty())) - { - BF_ASSERT(mModule->mCompiler->IsAutocomplete()); - for (auto typeRef : activeTypeDef->mStaticSearch) - { - auto type = mModule->ResolveTypeRef(typeRef, NULL, BfPopulateType_Declaration); - if (type != NULL) - { - auto typeInst = type->ToTypeInstance(); - if (typeInst != NULL) - { - AddTypeMembers(typeInst, true, false, filter, typeInst, true, true); - AddInnerTypes(typeInst, filter, false, false); - } - } - } + AddTypeMembers(typeInst, true, false, filter, typeInst, true, true); + AddInnerTypes(typeInst, filter, false, false); } } - + ////////////////////////////////////////////////////////////////////////// BfMethodInstance* curMethodInstance = mModule->mCurMethodInstance; diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 4cd47c79..83528b38 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -3692,7 +3692,7 @@ void BfCompiler::ProcessAutocompleteTempType() mContext->HandleChangedTypeDef(tempTypeDef, true); } } - + if (tempTypeDef == NULL) { GenerateAutocompleteInfo(); @@ -3705,13 +3705,28 @@ void BfCompiler::ProcessAutocompleteTempType() BfLogSysM("ProcessAutocompleteTempType - project disabled\n"); return; } - + SetAndRestoreValue prevMethodState(module->mCurMethodState, NULL); BfTypeState typeState; typeState.mCurTypeDef = tempTypeDef; SetAndRestoreValue prevTypeState(module->mContext->mCurTypeState, &typeState); + BfStaticSearch* staticSearch = NULL; + if (mResolvePassData->mStaticSearchMap.TryAdd(tempTypeDef, NULL, &staticSearch)) + { + for (auto typeRef : tempTypeDef->mStaticSearch) + { + auto type = module->ResolveTypeRef(typeRef, NULL, BfPopulateType_Declaration); + if (type != NULL) + { + auto typeInst = type->ToTypeInstance(); + if (typeInst != NULL) + staticSearch->mStaticTypes.Add(typeInst); + } + } + } + auto _FindAcutalTypeDef = [&](BfTypeDef* tempTypeDef) { auto typeName = tempTypeDef->mFullName; diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 85d72a22..ffe84efa 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -1680,12 +1680,14 @@ NoMatch: } if (hadMatch) - { + { mBestMethodTypeInstance = typeInstance; if (genericArgumentsSubstitute != &mBestMethodGenericArguments) { if (genericArgumentsSubstitute != NULL) { + for (auto& genericArg : *genericArgumentsSubstitute) + genericArg = mModule->FixIntUnknown(genericArg); mBestMethodGenericArguments = *genericArgumentsSubstitute; // #ifdef _DEBUG // for (auto arg : mBestMethodGenericArguments) @@ -3272,9 +3274,19 @@ BfTypedValue BfExprEvaluator::LookupIdentifier(BfAstNode* refNode, const StringI result = LookupField(identifierNode, thisValue, findName); if ((result) || (mPropDef != NULL)) return result; - } + } + } - //TODO: Try static search + auto staticSearch = mModule->GetStaticSearch(); + if (staticSearch != NULL) + { + for (auto typeInst : staticSearch->mStaticTypes) + { + thisValue = BfTypedValue(typeInst); + result = LookupField(identifierNode, thisValue, findName); + if ((result) || (mPropDef != NULL)) + return result; + } } } @@ -7062,6 +7074,25 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp break; } } + + if (methodDef == NULL) + { + BfStaticSearch* staticSearch = mModule->GetStaticSearch(); + if (staticSearch != NULL) + { + for (auto typeInst : staticSearch->mStaticTypes) + { + methodMatcher.CheckType(typeInst, BfTypedValue(), false); + if (methodMatcher.mBestMethodDef != NULL) + { + isFailurePass = false; + curTypeInst = methodMatcher.mBestMethodTypeInstance; + methodDef = methodMatcher.mBestMethodDef; + break; + } + } + } + } } if (methodDef == NULL) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 19e75452..421ed110 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -3205,6 +3205,17 @@ void BfModule::PopulateGlobalContainersList(const BfGlobalLookup& globalLookup) } } +BfStaticSearch* BfModule::GetStaticSearch() +{ + auto activeTypeDef = GetActiveTypeDef(); + BfStaticSearch* staticSearch = NULL; + if ((mCurTypeInstance != NULL) && (mCurTypeInstance->mStaticSearchMap.TryGetValue(activeTypeDef, &staticSearch))) + return staticSearch; + if ((mCompiler->mResolvePassData != NULL) && (mCompiler->mResolvePassData->mStaticSearchMap.TryGetValue(activeTypeDef, &staticSearch))) + return staticSearch; + return NULL; +} + void PrintUsers(llvm::MDNode* md); BfModuleOptions BfModule::GetModuleOptions() diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 50e1611a..76defbad 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1609,6 +1609,7 @@ public: void TypeFailed(BfTypeInstance* typeInstance); bool IsAttribute(BfTypeInstance* typeInst); void PopulateGlobalContainersList(const BfGlobalLookup& globalLookup); + BfStaticSearch* GetStaticSearch(); void AddFailType(BfTypeInstance* typeInstance); void MarkDerivedDirty(BfTypeInstance* typeInst); void CheckAddFailType(); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 87ceb012..bb103b23 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -1770,9 +1770,10 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy } else { + staticSearch->mStaticTypes.Add(staticTypeInst); AddDependency(staticTypeInst, typeInstance, BfDependencyMap::DependencyFlag_StaticValue); } - } + } } } }; diff --git a/IDEHelper/Compiler/BfResolvePass.h b/IDEHelper/Compiler/BfResolvePass.h index db73f5a7..24de4ffb 100644 --- a/IDEHelper/Compiler/BfResolvePass.h +++ b/IDEHelper/Compiler/BfResolvePass.h @@ -1,6 +1,7 @@ #pragma once #include "BfSystem.h" +#include "BfResolvedTypeUtils.h" NS_BF_BEGIN @@ -46,6 +47,7 @@ public: BfParser* mParser; BfAutoComplete* mAutoComplete; Array mAutoCompleteTempTypes; // Contains multiple values when we have nested types + Dictionary mStaticSearchMap; BfSourceClassifier* mSourceClassifier; Array mExteriorAutocompleteCheckNodes;