| 5115 | } |
| 5116 | |
| 5117 | void BfCompiler::GetSymbolReferences() |
| 5118 | { |
| 5119 | BfLogSysM("GetSymbolReferences\n"); |
| 5120 | |
| 5121 | if (mInInvalidState) |
| 5122 | return; // Don't even try |
| 5123 | |
| 5124 | auto context = mContext; |
| 5125 | if (context->mBfObjectType == NULL) |
| 5126 | return; // Not initialized yet |
| 5127 | auto module = context->mScratchModule; |
| 5128 | |
| 5129 | if (mResolvePassData->mAutoComplete != NULL) |
| 5130 | mResolvePassData->mAutoComplete->SetModule(module); |
| 5131 | |
| 5132 | BfTypeDef* typeDef = NULL; |
| 5133 | HashSet<BfTypeInstance*> rebuildTypeInstList; |
| 5134 | if (!mResolvePassData->mQueuedSymbolReferenceNamespace.IsEmpty()) |
| 5135 | { |
| 5136 | if (!mSystem->ParseAtomComposite(mResolvePassData->mQueuedSymbolReferenceNamespace, mResolvePassData->mSymbolReferenceNamespace)) |
| 5137 | return; |
| 5138 | |
| 5139 | for (auto type : mContext->mResolvedTypes) |
| 5140 | { |
| 5141 | auto typeInst = type->ToTypeInstance(); |
| 5142 | if (typeInst == NULL) |
| 5143 | continue; |
| 5144 | |
| 5145 | for (auto& lookupKV : typeInst->mLookupResults) |
| 5146 | { |
| 5147 | auto typeDef = lookupKV.mValue.mTypeDef; |
| 5148 | if ((typeDef != NULL) && (typeDef->mNamespace.StartsWith(mResolvePassData->mSymbolReferenceNamespace))) |
| 5149 | { |
| 5150 | AddToRebuildTypeList(typeInst, rebuildTypeInstList); |
| 5151 | } |
| 5152 | } |
| 5153 | } |
| 5154 | |
| 5155 | for (auto parser : mSystem->mParsers) |
| 5156 | { |
| 5157 | BfNamespaceVisitor namespaceVisitor; |
| 5158 | namespaceVisitor.mResolvePassData = mResolvePassData; |
| 5159 | namespaceVisitor.mSystem = mSystem; |
| 5160 | namespaceVisitor.Visit(parser->mRootNode); |
| 5161 | } |
| 5162 | } |
| 5163 | else |
| 5164 | { |
| 5165 | const char* strPtr = mResolvePassData->mQueuedReplaceTypeDef.c_str(); |
| 5166 | typeDef = mSystem->FindTypeDefEx(strPtr); |
| 5167 | if ((typeDef == NULL) || (typeDef->mTypeDeclaration == NULL)) |
| 5168 | return; |
| 5169 | |
| 5170 | typeDef = typeDef->GetLatest(); |
| 5171 | mResolvePassData->mSymbolReferenceTypeDef = typeDef; |
| 5172 | auto replaceType = module->ResolveTypeDef(typeDef, BfPopulateType_IdentityNoRemapAlias); |
| 5173 | module->PopulateType(replaceType); |
| 5174 | auto replaceTypeInst = replaceType->ToTypeInstance(); |
no test coverage detected