From d24f169181a47a6a31c224d251bb72bb10e84a78 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 12 Oct 2020 10:22:42 -0700 Subject: [PATCH] Better array size fix with missing commas --- IDEHelper/Compiler/BfExprEvaluator.cpp | 32 +++++++++++++++----------- IDEHelper/Tests/src/Arrays.bf | 2 ++ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 4dbbd5b0..a4777844 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/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(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(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; } } diff --git a/IDEHelper/Tests/src/Arrays.bf b/IDEHelper/Tests/src/Arrays.bf index 5c12a333..3cac81fc 100644 --- a/IDEHelper/Tests/src/Arrays.bf +++ b/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;