| 10541 | } |
| 10542 | |
| 10543 | BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGenericArgs, BfTypeInstance* typeInstanceOverride, BfTypeLookupError* error, BfResolveTypeRefFlags resolveFlags) |
| 10544 | { |
| 10545 | //BP_ZONE("BfModule::FindTypeDef_1"); |
| 10546 | |
| 10547 | BfTypeInstance* typeInstance = (typeInstanceOverride != NULL) ? typeInstanceOverride : mCurTypeInstance; |
| 10548 | auto useTypeDef = GetActiveTypeDef(typeInstanceOverride, true); |
| 10549 | |
| 10550 | if ((mCurMethodState != NULL) && (mCurMethodState->mMixinState != NULL)) |
| 10551 | typeInstance = mCurMethodState->mMixinState->mMixinMethodInstance->GetOwner(); |
| 10552 | |
| 10553 | if (useTypeDef != NULL) |
| 10554 | useTypeDef = useTypeDef->GetDefinition(); |
| 10555 | |
| 10556 | if ((typeInstance == NULL) && (useTypeDef == NULL)) |
| 10557 | { |
| 10558 | BfProject* project = NULL; |
| 10559 | if ((mContext->mCurTypeState != NULL) && (mContext->mCurTypeState->mActiveProject != NULL)) |
| 10560 | project = mContext->mCurTypeState->mActiveProject; |
| 10561 | else if ((mCompiler->mResolvePassData != NULL) && (!mCompiler->mResolvePassData->mParsers.IsEmpty())) |
| 10562 | project = mCompiler->mResolvePassData->mParsers[0]->mProject; |
| 10563 | |
| 10564 | //BP_ZONE("System.FindTypeDef_2"); |
| 10565 | Array<BfAtomComposite> namespaceSearch; |
| 10566 | if (mContext->mCurNamespaceNodes != NULL) |
| 10567 | { |
| 10568 | String checkNamespace; |
| 10569 | for (auto namespaceNode : *mContext->mCurNamespaceNodes) |
| 10570 | { |
| 10571 | if (namespaceNode->mNameNode != NULL) |
| 10572 | { |
| 10573 | if (!checkNamespace.IsEmpty()) |
| 10574 | checkNamespace += "."; |
| 10575 | namespaceNode->mNameNode->ToString(checkNamespace); |
| 10576 | } |
| 10577 | } |
| 10578 | |
| 10579 | if (!checkNamespace.IsEmpty()) |
| 10580 | { |
| 10581 | BfAtomCompositeT<16> atomComposite; |
| 10582 | if (mSystem->ParseAtomComposite(checkNamespace, atomComposite)) |
| 10583 | namespaceSearch.Add(atomComposite); |
| 10584 | } |
| 10585 | } |
| 10586 | |
| 10587 | BfFindTypeDefFlags findDefFlags = BfFindTypeDefFlag_None; |
| 10588 | if ((resolveFlags & BfResolveTypeRefFlag_AllowGlobalContainer) != 0) |
| 10589 | findDefFlags = (BfFindTypeDefFlags)(findDefFlags | BfFindTypeDefFlag_AllowGlobal); |
| 10590 | |
| 10591 | BfTypeDef* ambiguousTypeDef = NULL; |
| 10592 | BfTypeDef *result = mSystem->FindTypeDef(findName, numGenericArgs, project, namespaceSearch, &ambiguousTypeDef, findDefFlags); |
| 10593 | if ((ambiguousTypeDef != NULL) && (error != NULL)) |
| 10594 | { |
| 10595 | error->mErrorKind = BfTypeLookupError::BfErrorKind_Ambiguous; |
| 10596 | error->mAmbiguousTypeDef = ambiguousTypeDef; |
| 10597 | if (error->mRefNode != NULL) |
| 10598 | ShowAmbiguousTypeError(error->mRefNode, result, ambiguousTypeDef); |
| 10599 | } |
| 10600 |
no test coverage detected