diff --git a/src/Spark.Tests/Parser/ViewLoaderTester.cs b/src/Spark.Tests/Parser/ViewLoaderTester.cs index d2dbf3db..e54626b6 100644 --- a/src/Spark.Tests/Parser/ViewLoaderTester.cs +++ b/src/Spark.Tests/Parser/ViewLoaderTester.cs @@ -311,5 +311,31 @@ public void PartialsInCascadingBaseFoldersAndSharedFoldersAreDiscovered() Assert.That(partials, Has.None.EqualTo("dontfind2")); Assert.That(partials, Has.None.EqualTo("dontfind3")); } + + [Test] + public void LoadingEmptyFile() + { + var viewFolder = new InMemoryViewFolder + { + {Path.Combine("home", "empty.spark"), ""}, + }; + var viewLoader = new ViewLoader { SyntaxProvider = new DefaultSyntaxProvider(ParserSettings.DefaultBehavior), ViewFolder = viewFolder }; + var chunks = viewLoader.Load(Path.Combine("home", "empty.spark")); + var everything = viewLoader.GetEverythingLoaded(); + Assert.AreEqual(1, everything.Count()); + } + + [Test] + public void LoadingEmptyShadeFile() + { + var viewFolder = new InMemoryViewFolder + { + {Path.Combine("home", "empty.shade"), ""}, + }; + var viewLoader = new ViewLoader { SyntaxProvider = new DefaultSyntaxProvider(ParserSettings.DefaultBehavior), ViewFolder = viewFolder }; + var chunks = viewLoader.Load(Path.Combine("home", "empty.shade")); + var everything = viewLoader.GetEverythingLoaded(); + Assert.AreEqual(1, everything.Count()); + } } } \ No newline at end of file diff --git a/src/Spark/Parser/Grammar.cs b/src/Spark/Parser/Grammar.cs index ebca1d99..ee5b8e3a 100644 --- a/src/Spark/Parser/Grammar.cs +++ b/src/Spark/Parser/Grammar.cs @@ -184,7 +184,7 @@ public static ParseAction> Rep(ParseAction parse) var rest = input; var result = parse(rest); - while (result != null) + while (result != null && !rest.IsSamePosition(result.Rest)) { list.Add(result.Value); rest = result.Rest; diff --git a/src/Spark/Parser/Position.cs b/src/Spark/Parser/Position.cs index f4b72db2..92b8f226 100644 --- a/src/Spark/Parser/Position.cs +++ b/src/Spark/Parser/Position.cs @@ -85,6 +85,18 @@ public Position(SourceContext sourceContext, int sourceContextLength, int offset this.paintLink = paintLink; } + public bool IsSamePosition(Position position) + { + if (position == null) + throw new ArgumentNullException("position"); + + if (object.ReferenceEquals(position, this)) //obviously + return true; + return position.Column == this.Column + && position.Line == this.Line + && position.Offset == this.Offset; + } + public SourceContext SourceContext { get