From 924c23d3b8950c8b9f270a360541bb11cbdd1729 Mon Sep 17 00:00:00 2001 From: Semenov Dmitry Date: Sat, 20 Jan 2024 01:35:54 +0400 Subject: [PATCH] Fixed lambda intendation parsing --- src/GDShrapt.Reader.Tests/ParsingTests.cs | 58 ++++++++++++++++++- src/GDShrapt.Reader/GDShrapt.Reader.csproj | 6 +- .../Resolvers/GDStatementsResolver.cs | 4 +- 3 files changed, 61 insertions(+), 7 deletions(-) diff --git a/src/GDShrapt.Reader.Tests/ParsingTests.cs b/src/GDShrapt.Reader.Tests/ParsingTests.cs index 217d45c..aa11a1a 100644 --- a/src/GDShrapt.Reader.Tests/ParsingTests.cs +++ b/src/GDShrapt.Reader.Tests/ParsingTests.cs @@ -599,7 +599,7 @@ public void MatchStatementWildcardPatternTest() AssertHelper.CompareCodeStrings(code, statement.ToString()); AssertHelper.NoInvalidTokens(statement); } - + [TestMethod] public void MatchStatementArrayPatternTest() { @@ -1343,7 +1343,7 @@ public void NumberTest4(string code) "**", "**=", "<<=", - ">>=", + ">>=", "^=", "%=")] public void DualOperatorsTest(params string[] operators) @@ -2566,5 +2566,59 @@ class_name Helper AssertHelper.CompareCodeStrings(code, @class.ToString()); AssertHelper.NoInvalidTokens(@class); } + + [TestMethod] + public void ParseCurryingTest2() + { + var reader = new GDScriptReader(); + + var code = @" +class_name Helper + +func curry_test(f): + var sum_all = func(x, y, z): + return x + y + z + + var curry = func(f): + return func(x): + return func(y): + return func(z): + return f.call(x, y, z) + + var curried_sum = curry.call(sum_all) + var partial_sum_x = curried_sum.call(1) + var partial_sum_y = partial_sum_x.call(2) + + print(partial_sum_y.call(3)) + print(curried_sum.call(1).call(2).call(3))"; + + var @class = reader.ParseFileContent(code); + + var method = @class.Methods.First(); + + var statements = method.Statements.ToArray(); + var second = statements[1]; + + Assert.AreEqual(7, statements.Length); + + var declaration = (GDVariableDeclarationStatement)second; + + var methodExpr = (GDMethodExpression)declaration.Initializer; + + var returnExpr = (GDReturnExpression)((GDExpressionStatement)methodExpr.Statements.First()).Expression; + var method2Expr = (GDMethodExpression)returnExpr.Expression; + + var return2Expr = (GDReturnExpression)((GDExpressionStatement)method2Expr.Statements.First()).Expression; + var method3Expr = (GDMethodExpression)return2Expr.Expression; + + var return3Expr = (GDReturnExpression)((GDExpressionStatement)method3Expr.Statements.First()).Expression; + var method4Expr = (GDMethodExpression)return3Expr.Expression; + + Assert.AreEqual(1, method4Expr.Statements.Count); + Assert.AreEqual("\n return f.call(x, y, z)", method4Expr.Statements.ToString()); + + AssertHelper.CompareCodeStrings(code, @class.ToString()); + AssertHelper.NoInvalidTokens(@class); + } } } \ No newline at end of file diff --git a/src/GDShrapt.Reader/GDShrapt.Reader.csproj b/src/GDShrapt.Reader/GDShrapt.Reader.csproj index 585b69d..c1ee5e7 100644 --- a/src/GDShrapt.Reader/GDShrapt.Reader.csproj +++ b/src/GDShrapt.Reader/GDShrapt.Reader.csproj @@ -3,7 +3,7 @@ netstandard2.0 true - 4.1.1-alpha + 4.1.2-alpha elamaunt GDShrapt GDShrapt.Reader is .Net library and object-oriented one-pass parser of GDScript. It can build a lexical tree of GDScript code or generate a new code from scratch. @@ -16,8 +16,8 @@ Usage: Just create a GDScriptReader instance and call methods from it.https://github.com/elamaunt/GDShrapt git GDShrapt GDScript reader parser codegeneration Godot lexical analyzer - 4.1.1 - 4.1.1 + 4.1.2 + 4.1.2 true diff --git a/src/GDShrapt.Reader/Resolvers/GDStatementsResolver.cs b/src/GDShrapt.Reader/Resolvers/GDStatementsResolver.cs index ddf8a76..3427068 100644 --- a/src/GDShrapt.Reader/Resolvers/GDStatementsResolver.cs +++ b/src/GDShrapt.Reader/Resolvers/GDStatementsResolver.cs @@ -37,7 +37,7 @@ internal override void HandleCharAfterIntendation(char c, GDReadingState state) } // Resolving multiple expressions on the same string - var statement = new GDExpressionStatement(); + var statement = new GDExpressionStatement(LineIntendationThreshold); Owner.HandleReceivedToken(statement); state.PushAndPass(statement, c); } @@ -211,7 +211,7 @@ private GDStatement CompleteAsStatement(GDReadingState state, string sequence) private GDExpressionStatement CompleteAsExpressionStatement(GDReadingState state) { - var statement = new GDExpressionStatement(); + var statement = new GDExpressionStatement(LineIntendationThreshold); SendIntendationTokensToOwner(); Owner.HandleReceivedToken(statement);