From fc9650af41e840a5fc78b7f2a3f8ce46ea92d264 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Wed, 25 Sep 2024 11:33:12 -0400 Subject: [PATCH] Better error attribution for payload enum circular data references --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 84452f49..0dffaaac 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -1132,11 +1132,30 @@ bool BfModule::CheckCircularDataError(bool failTypes) } else if (checkTypeState->mCurFieldDef != NULL) { - Fail(StrFormat("Field '%s.%s' causes a data cycle", TypeToString(checkTypeState->mType).c_str(), checkTypeState->mCurFieldDef->mName.c_str())); + BfAstNode* refNode = checkTypeState->mCurFieldDef->GetRefNode(); + + if (refNode == NULL) + { + if (checkTypeState->mCurTypeDef != NULL) + refNode = checkTypeState->mCurTypeDef->GetRefNode(); + } + + auto checkSrcTypeState = checkTypeState; + while ((refNode == NULL) && (checkSrcTypeState != NULL)) + { + if (checkSrcTypeState->mCurFieldDef != NULL) + refNode = checkSrcTypeState->mCurFieldDef->GetRefNode(); + checkSrcTypeState = checkSrcTypeState->mPrevState; + } + + Fail(StrFormat("Field '%s.%s' causes a data cycle", TypeToString(checkTypeState->mType).c_str(), checkTypeState->mCurFieldDef->mName.c_str()), refNode, true); } else { - Fail(StrFormat("Type '%s' causes a data cycle", TypeToString(checkTypeState->mType).c_str())); + BfAstNode* refNode = NULL; + if (checkTypeState->mCurTypeDef != NULL) + refNode = checkTypeState->mCurTypeDef->GetRefNode(); + Fail(StrFormat("Type '%s' causes a data cycle", TypeToString(checkTypeState->mType).c_str()), refNode, true); } auto typeInstance = checkTypeState->mType->ToTypeInstance();