소스 검색

Allow catch-all '#pragma warning disable'

Brian Fiete 8 달 전
부모
커밋
f10f389400
2개의 변경된 파일22개의 추가작업 그리고 11개의 파일을 삭제
  1. 21 10
      IDEHelper/Compiler/BfParser.cpp
  2. 1 1
      IDEHelper/Compiler/BfSystem.cpp

+ 21 - 10
IDEHelper/Compiler/BfParser.cpp

@@ -363,21 +363,18 @@ bool BfParserData::IsUnwarnedAt(BfAstNode* node)
 bool BfParserData::IsWarningEnabledAtSrcIndex(int warningNumber, int srcIdx)
 {
 	int enabled = 1; //CDH TODO if/when we add warning level support, this default will change based on the warning number and the general project warning level setting
-	int lastUnwarnPos = 0;
 
 	for (const auto& it : mWarningEnabledChanges)
 	{
 		if (it.mKey > srcIdx)
 			break;
-		if (it.mValue.mWarningNumber == warningNumber)
+		if ((it.mValue.mWarningNumber == warningNumber) || (it.mValue.mWarningNumber == -1))
 		{
 			if (it.mValue.mEnable)
 				enabled++;
 			else
 				enabled--;
-		}
-		if (it.mValue.mWarningNumber == -1)
-			lastUnwarnPos = -1;
+		}		
 	}
 	return enabled > 0;
 }
@@ -923,10 +920,14 @@ void BfParser::HandlePragma(const StringImpl& pragma, BfBlock* block)
 				mPassInstance->FailAt("Expected \"disable\" or \"restore\" after \"warning\"", mSourceData, iterNode->GetSrcStart(), iterNode->GetSrcLength());
 			}
 
-			//iterNode = parentNode->mChildArr.GetAs<BfAstNode*>(++curIdx);
+			int srcStart = iterNode->GetSrcStart();
+
+			int nodeCount = 0;
+			
 			iterNode = itr.Get();
 			while (iterNode)
 			{
+				++nodeCount;
 				++itr;
 				auto tokenStr = iterNode->ToString();
 				if (tokenStr != ",") // commas allowed between warning numbers but not required; we just ignore them
@@ -941,11 +942,14 @@ void BfParser::HandlePragma(const StringImpl& pragma, BfBlock* block)
 							break;
 						}
 					}
-					if (isNum)
+
+					int warningNum = atoi(tokenStr.c_str());
+
+					if ((isNum) && (warningNum > 0))
 					{
 						BfParserWarningEnabledChange wec;
 						wec.mEnable = enable;
-						wec.mWarningNumber = atoi(tokenStr.c_str());
+						wec.mWarningNumber = warningNum;
 						mParserData->mWarningEnabledChanges[iterNode->GetSrcStart()] = wec;
 					}
 					else
@@ -953,10 +957,17 @@ void BfParser::HandlePragma(const StringImpl& pragma, BfBlock* block)
 						mPassInstance->FailAt("Expected decimal warning number", mSourceData, iterNode->GetSrcStart(), iterNode->GetSrcLength());
 					}
 				}
-
-				//iterNode = parentNode->mChildArr.Get(++curIdx);
+				
 				iterNode = itr.Get();
 			}
+
+			if (nodeCount == 0)
+			{
+				BfParserWarningEnabledChange wec;
+				wec.mEnable = enable;
+				wec.mWarningNumber = -1;
+				mParserData->mWarningEnabledChanges[srcStart] = wec;
+			}
 		}
 		else
 		{

+ 1 - 1
IDEHelper/Compiler/BfSystem.cpp

@@ -1762,7 +1762,7 @@ BfError* BfPassInstance::WarnAt(int warningNumber, const StringImpl& warning, Bf
 		return NULL;
 
 	auto bfParser = bfSource->ToParserData();
-	if ((bfParser != NULL) && (warningNumber > 0) && (!bfParser->IsWarningEnabledAtSrcIndex(warningNumber, srcIdx)))
+	if ((bfParser != NULL) && (!bfParser->IsWarningEnabledAtSrcIndex(warningNumber, srcIdx)))
 		return NULL;
 
 	if (!WantsRangeRecorded(bfParser, srcIdx, srcLen, true, isDeferred))