From efbdc3362215921526ddab85dc3975a7ffedd41a Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 30 Dec 2021 11:04:52 -0500 Subject: [PATCH] Improvements to warn/error type attributes --- IDEHelper/Compiler/BfContext.cpp | 34 +++++++++++++++++++++--- IDEHelper/Compiler/BfContext.h | 8 ++++++ IDEHelper/Compiler/BfModuleTypeUtils.cpp | 16 +++++++++-- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/IDEHelper/Compiler/BfContext.cpp b/IDEHelper/Compiler/BfContext.cpp index 3d10da23..e6b1778e 100644 --- a/IDEHelper/Compiler/BfContext.cpp +++ b/IDEHelper/Compiler/BfContext.cpp @@ -381,7 +381,7 @@ bool BfContext::ProcessWorkList(bool onlyReifiedTypes, bool onlyReifiedMethods) for (int workIdx = 0; workIdx < (int)mPopulateTypeWorkList.size(); workIdx++) { - //BP_ZONE("PWL_PopulateType"); + //BP_ZONE("PWL_PopulateType"); if (IsCancellingAndYield()) break; @@ -426,8 +426,33 @@ bool BfContext::ProcessWorkList(bool onlyReifiedTypes, bool onlyReifiedMethods) useModule->PopulateType(type, BfPopulateType_Full); mCompiler->mStats.mQueuedTypesProcessed++; mCompiler->UpdateCompletion(); - didWork = true; - } + didWork = true; + } + + for (int workIdx = 0; workIdx < (int)mTypeRefVerifyWorkList.size(); workIdx++) + { + if (IsCancellingAndYield()) + break; + + auto workItemRef = mTypeRefVerifyWorkList[workIdx]; + if (workItemRef == NULL) + { + workIdx = mTypeRefVerifyWorkList.RemoveAt(workIdx); + continue; + } + + SetAndRestoreValue prevTypeInstance(workItemRef->mFromModule->mCurTypeInstance, workItemRef->mCurTypeInstance); + + auto refTypeInst = workItemRef->mType->ToTypeInstance(); + if (refTypeInst->mCustomAttributes == NULL) + workItemRef->mFromModule->PopulateType(refTypeInst, BfPopulateType_AllowStaticMethods); + + if (refTypeInst != NULL) + workItemRef->mFromModule->CheckErrorAttributes(refTypeInst, NULL, refTypeInst->mCustomAttributes, workItemRef->mRefNode); + + workIdx = mTypeRefVerifyWorkList.RemoveAt(workIdx); + didWork = true; + } //while (mMethodSpecializationWorkList.size() != 0) @@ -2743,7 +2768,7 @@ void DoRemoveInvalidWorkItems(BfContext* bfContext, WorkQueue& workList, bool if (workItem == NULL) continue; - auto typeInst = workItem->mType->ToTypeInstance(); + BfTypeInstance* typeInst = workItem->mType->ToTypeInstance(); if ((workItem->mType->IsDeleting()) || (workItem->mType->mRebuildFlags & BfTypeRebuildFlag_Deleted) || @@ -2805,6 +2830,7 @@ void BfContext::RemoveInvalidWorkItems() DoRemoveInvalidWorkItems(this, mPopulateTypeWorkList, false); DoRemoveInvalidWorkItems(this, mMethodSpecializationWorkList, false/*true*/); + DoRemoveInvalidWorkItems(this, mTypeRefVerifyWorkList, false); #ifdef _DEBUG for (auto& workItem : mMethodWorkList) diff --git a/IDEHelper/Compiler/BfContext.h b/IDEHelper/Compiler/BfContext.h index a85a308d..9ae036c2 100644 --- a/IDEHelper/Compiler/BfContext.h +++ b/IDEHelper/Compiler/BfContext.h @@ -106,6 +106,13 @@ public: } }; +class BfTypeRefVerifyRequest : public BfWorkListEntry +{ +public: + BfTypeInstance* mCurTypeInstance; + BfAstNode* mRefNode; +}; + struct BfStringPoolEntry { String mString; @@ -384,6 +391,7 @@ public: WorkQueue mInlineMethodWorkList; WorkQueue mPopulateTypeWorkList; WorkQueue mMethodSpecializationWorkList; + WorkQueue mTypeRefVerifyWorkList; PtrWorkQueue mFinishedSlotAwaitModuleWorkList; PtrWorkQueue mFinishedModuleWorkList; diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index c0343498..1f42fed5 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -8669,8 +8669,20 @@ BfType* BfModule::ResolveTypeResult(BfTypeReference* typeRef, BfType* resolvedTy if (typeInstance != NULL) { - if ((typeInstance->mCustomAttributes != NULL) && (!typeRef->IsTemporary())) - CheckErrorAttributes(typeInstance, NULL, typeInstance->mCustomAttributes, typeRef); + if ((!typeRef->IsTemporary()) && ((resolveFlags & BfResolveTypeRefFlag_FromIndirectSource) == 0)) + { + if (typeInstance->mCustomAttributes != NULL) + CheckErrorAttributes(typeInstance, NULL, typeInstance->mCustomAttributes, typeRef); + else if ((typeInstance->mTypeDef->mTypeDeclaration != NULL) && (typeInstance->mTypeDef->mTypeDeclaration->mAttributes != NULL)) + { + auto typeRefVerifyRequest = mContext->mTypeRefVerifyWorkList.Alloc(); + typeRefVerifyRequest->mCurTypeInstance = mCurTypeInstance; + typeRefVerifyRequest->mRefNode = typeRef; + typeRefVerifyRequest->mType = typeInstance; + typeRefVerifyRequest->mFromModule = this; + typeRefVerifyRequest->mFromModuleRevision = mRevision; + } + } if (typeInstance->IsTuple()) {