浏览代码

Fixed 'when' on switch payload case

Brian Fiete 10 月之前
父节点
当前提交
d36d076e95
共有 2 个文件被更改,包括 34 次插入1 次删除
  1. 4 0
      IDEHelper/Compiler/BfStmtEvaluator.cpp
  2. 30 1
      IDEHelper/Tests/src/Switches.bf

+ 4 - 0
IDEHelper/Compiler/BfStmtEvaluator.cpp

@@ -4950,6 +4950,10 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
 					mBfIRBuilder->SetInsertPoint(notEqBB);
 				}
 			}
+			else if (whenExpr != NULL)
+			{
+				mayHaveMatch = true;
+			}
 
 			if (notEqBB)
 				lastNotEqBlock = notEqBB;

+ 30 - 1
IDEHelper/Tests/src/Switches.bf

@@ -4,7 +4,13 @@ namespace Tests
 {
 	class Switches
 	{
-		int Switch0(Result<int> res)
+		enum Shape
+		{
+		    case Rectangle(int x, int y, int width, int height);
+		    case Circle(int x, int y, int radius);
+		}
+
+		static int Switch0(Result<int> res)
 		{
 			switch (res)
 			{
@@ -14,5 +20,28 @@ namespace Tests
 				 return 1;
 			}
 		}
+
+		static int Switch1(Shape shape)
+		{
+			switch (shape)
+			{
+			case .Circle(let x, let y, let radius) when x > 0 && y == 10:
+				return 12;
+			default:
+				return 23;
+			}
+		}
+
+		[Test]
+		public static void TestBasics()
+		{
+			Result<int> val0 = .Ok(1);
+			Test.Assert(Switch0(val0) == 0);
+			val0 = .Err;
+			Test.Assert(Switch0(val0) == 1);
+
+			Shape shape = .Circle(10, 20, 30);
+			Test.Assert(Switch1(shape) == 12);
+		}
 	}
 }