浏览代码

Better array size fix with missing commas

Brian Fiete 5 年之前
父节点
当前提交
d24f169181
共有 2 个文件被更改,包括 21 次插入13 次删除
  1. 19 13
      IDEHelper/Compiler/BfExprEvaluator.cpp
  2. 2 0
      IDEHelper/Tests/src/Arrays.bf

+ 19 - 13
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -12100,13 +12100,13 @@ void BfExprEvaluator::Visit(BfObjectCreateExpression* objCreateExpr)
 
 				int dimensions = 1;
 				
+				bool commaExpected = false;
 				if (arrayTypeRef->mParams.size() != 0)
 				{
 					auto intType = mModule->ResolveTypeDef(mModule->mSystem->mTypeIntPtr);
-					
-					for (int argIdx = 0; argIdx < (int)arrayTypeRef->mParams.size(); argIdx++)
+
+					for (auto arg : arrayTypeRef->mParams)
 					{
-						auto arg = arrayTypeRef->mParams[argIdx];
 						if (auto tokenNode = BfNodeDynCastExact<BfTokenNode>(arg))
 						{
 							if (tokenNode->GetToken() == BfToken_Comma)
@@ -12114,11 +12114,19 @@ void BfExprEvaluator::Visit(BfObjectCreateExpression* objCreateExpr)
 								if (isRawArrayAlloc)
 								{
 									mModule->Fail("Sized arrays cannot be multidimensional.", tokenNode);
+									continue;
+								}
+								dimensions++;
+
+								if (dimensions == 5)
+								{
+									mModule->Fail("Too many array dimensions, consider using a jagged array.", tokenNode);
 								}
+
+								commaExpected = false;
 								continue;
 							}
 						}
-						
 						auto expr = BfNodeDynCast<BfExpression>(arg);
 						if ((isRawArrayAlloc) && (!dimLengthVals.IsEmpty()))
 						{
@@ -12126,15 +12134,6 @@ void BfExprEvaluator::Visit(BfObjectCreateExpression* objCreateExpr)
 							continue;
 						}
 
-						if (argIdx != 0)
-						{
-							dimensions++;
-							if (dimensions == 5)
-							{
-								mModule->Fail("Too many array dimensions, consider using a jagged array.", arg);
-							}
-						}
-
 						dimLengthRefs.Add(expr);
 
 						BfTypedValue dimLength;
@@ -12160,11 +12159,18 @@ void BfExprEvaluator::Visit(BfObjectCreateExpression* objCreateExpr)
 								dimLength = mModule->Cast(expr, dimLength, intType, castFlags);
 						}
 
+						if (commaExpected)
+						{
+							mModule->AssertErrorState();
+							continue;
+						}
+
 						if (!dimLength)
 						{
 							dimLength = mModule->GetDefaultTypedValue(intType);
 						}
 						dimLengthVals.push_back(dimLength.mValue);
+						commaExpected = true;
 					}
 				} 
 

+ 2 - 0
IDEHelper/Tests/src/Arrays.bf

@@ -3,6 +3,8 @@ namespace Tests
 {
 	class Arrays
 	{
+		public static float[,] GetArray() => new .[,] ( ( 0, 1, 2, 3), ( 10, 11, 12, 13 ), ( 20, 21, 22, 23 ) );
+
 		struct StructA
 		{
 			public int16 mA = 11;