From 29e9cd834951df35bd6a43c6f400c834df09d5cb Mon Sep 17 00:00:00 2001 From: rameel Date: Mon, 28 Sep 2026 17:54:29 +0500 Subject: [PATCH] parsers: prevent invalid casts in Repeat --- src/Ramstack.Parsing/Parser.Repeat.cs | 2 +- tests/Ramstack.Parsing.Tests/ParsersTests.Repeat.cs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Ramstack.Parsing/Parser.Repeat.cs b/src/Ramstack.Parsing/Parser.Repeat.cs index 6e177c1..b637b4c 100644 --- a/src/Ramstack.Parsing/Parser.Repeat.cs +++ b/src/Ramstack.Parsing/Parser.Repeat.cs @@ -132,7 +132,7 @@ public static Parser> Repeat(this Parser parser, int min, int max) Argument.ThrowIfNegativeOrZero(max); Argument.ThrowIfGreaterThan(min, max); - return parser is ICharClassSupport s + return typeof(T) == typeof(char) && parser is ICharClassSupport s ? (Parser>)(object)CreateRepeatParser(s.GetCharClass(), min, max) : new RepeatParser(parser, min, max); } diff --git a/tests/Ramstack.Parsing.Tests/ParsersTests.Repeat.cs b/tests/Ramstack.Parsing.Tests/ParsersTests.Repeat.cs index 5915027..ff92186 100644 --- a/tests/Ramstack.Parsing.Tests/ParsersTests.Repeat.cs +++ b/tests/Ramstack.Parsing.Tests/ParsersTests.Repeat.cs @@ -52,6 +52,19 @@ public void Repeat_5_10_Test() Assert.That(parser.Parse("aaaa").Success, Is.False); } + [Test] + public void Repeat_UnitCharParser_ReturnsUnitList() + { + var parser = L('a').Void().Repeat(2, 3); + var result = parser.Parse("aaaa"); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value, Is.EqualTo(new Unit[3])); + Assert.That(result.Length, Is.EqualTo(3)); + + Assert.That(parser.Parse("a").Success, Is.False); + } + [Test] [SuppressMessage("ReSharper", "InconsistentNaming")] public void Repeat_InfiniteLoopPrevention_ZeroLength()