diff --git a/IDEHelper/Compiler/BfAutoComplete.cpp b/IDEHelper/Compiler/BfAutoComplete.cpp index 6d1a17c7..0caaa01e 100644 --- a/IDEHelper/Compiler/BfAutoComplete.cpp +++ b/IDEHelper/Compiler/BfAutoComplete.cpp @@ -2979,6 +2979,16 @@ void BfAutoComplete::FixitAddMethod(BfTypeInstance* typeInst, const StringImpl& } } +void BfAutoComplete::FixitAddNamespace(BfAstNode* refNode, const StringImpl& namespaceStr) +{ + auto parserData = refNode->GetParserData(); + + BfUsingFinder usingFinder; + usingFinder.VisitMembers(refNode->GetSourceData()->mRootNode); + AddEntry(AutoCompleteEntry("fixit", StrFormat("using %s;\tusing|%s|%d||using %s;", namespaceStr.c_str(), parserData->mFileName.c_str(), + usingFinder.mLastIdx, namespaceStr.c_str()).c_str())); +} + void BfAutoComplete::FixitCheckNamespace(BfTypeDef* activeTypeDef, BfTypeReference* typeRef, BfTokenNode* nextDotToken) { if (nextDotToken == NULL) @@ -3001,9 +3011,6 @@ void BfAutoComplete::FixitCheckNamespace(BfTypeDef* activeTypeDef, BfTypeReferen } else { - BfUsingFinder usingFinder; - usingFinder.VisitMembers(typeRef->GetSourceData()->mRootNode); - mCompiler->mResolvePassData->mAutoComplete->AddEntry(AutoCompleteEntry("fixit", StrFormat("using %s;\tusing|%s|%d||using %s;", namespaceString.c_str(), parserData->mFileName.c_str(), - usingFinder.mLastIdx, namespaceString.c_str()).c_str())); + FixitAddNamespace(typeRef, namespaceString); } } diff --git a/IDEHelper/Compiler/BfAutoComplete.h b/IDEHelper/Compiler/BfAutoComplete.h index c7e620c1..c8d1a423 100644 --- a/IDEHelper/Compiler/BfAutoComplete.h +++ b/IDEHelper/Compiler/BfAutoComplete.h @@ -250,10 +250,11 @@ public: void CheckEmptyStart(BfAstNode* prevNode, BfType* type); bool CheckFixit(BfAstNode* node); void CheckInterfaceFixit(BfTypeInstance* typeInstance, BfAstNode* node); - + void FixitAddMember(BfTypeInstance* typeInst, BfType* fieldType, const StringImpl& fieldName, bool isStatic, BfTypeInstance* referencedFrom); void FixitAddCase(BfTypeInstance * typeInst, const StringImpl & caseName, const BfTypeVector & fieldTypes); void FixitAddMethod(BfTypeInstance* typeInst, const StringImpl& methodName, BfType* returnType, const BfTypeVector& paramTypes, bool wantStatic); + void FixitAddNamespace(BfAstNode* refNode, const StringImpl& namespacStr); void FixitCheckNamespace(BfTypeDef* activeTypeDef, BfTypeReference* typeRef, BfTokenNode* nextDotToken); }; diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index a69d665f..2949ab59 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -3189,6 +3189,26 @@ void BfExprEvaluator::Visit(BfIdentifierNode* identifierNode) autoComplete->FixitAddMember(mModule->mCurTypeInstance, fieldType, identifierNode->ToString(), true, mModule->mCurTypeInstance); if (!mModule->mCurMethodInstance->mMethodDef->mIsStatic) autoComplete->FixitAddMember(mModule->mCurTypeInstance, fieldType, identifierNode->ToString(), false, mModule->mCurTypeInstance); + + for (auto typeDef : mModule->mSystem->mTypeDefs) + { + if (!typeDef->mIsCombinedPartial) + continue; + if (!typeDef->IsGlobalsContainer()) + continue; + + typeDef->PopulateMemberSets(); + + String findName = identifierNode->ToString(); + BfMemberSetEntry* memberSetEntry; + if ((typeDef->mMethodSet.TryGetWith(findName, &memberSetEntry)) || + (typeDef->mFieldSet.TryGetWith(findName, &memberSetEntry)) || + (typeDef->mPropertySet.TryGetWith(findName, &memberSetEntry))) + { + if (mModule->GetActiveTypeDef()->mProject->ContainsReference(typeDef->mProject)) + autoComplete->FixitAddNamespace(identifierNode, typeDef->mNamespace.ToString()); + } + } } }