diff --git a/src/GDShrapt.Reader.Tests/ParsingTests.cs b/src/GDShrapt.Reader.Tests/ParsingTests.cs index c770f8d..82f1166 100644 --- a/src/GDShrapt.Reader.Tests/ParsingTests.cs +++ b/src/GDShrapt.Reader.Tests/ParsingTests.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Security.Claims; using System.Threading; +using System.Xml.Linq; using static GDShrapt.Reader.GD; namespace GDShrapt.Reader.Tests @@ -2650,5 +2651,37 @@ static func my_int_function() -> int: AssertHelper.CompareCodeStrings(code, @class.ToString()); AssertHelper.NoInvalidTokens(@class); } + + [TestMethod] + public void DictionaryTest2() + { + var reader = new GDScriptReader(); + + var code = @" +static var a = { a = 1, b = 2 }"; + + var @class = reader.ParseFileContent(code); + + Assert.AreEqual(1, @class.Members.Count); + + var variable = (GDVariableDeclaration)@class.Members[0]; + + Assert.IsInstanceOfType(variable.Initializer, typeof(GDDictionaryInitializerExpression)); + + var dictionary = (GDDictionaryInitializerExpression)variable.Initializer; + + Assert.AreEqual(2, dictionary.KeyValues.Count); + + foreach (var node in dictionary.KeyValues) + { + Assert.IsNotNull(node.Key); + Assert.IsNotNull(node.Assign); + Assert.IsNotNull(node.Value); + Assert.IsInstanceOfType(node.Value, typeof(GDNumberExpression)); + } + + AssertHelper.CompareCodeStrings(code, @class.ToString()); + AssertHelper.NoInvalidTokens(@class); + } } } \ No newline at end of file diff --git a/src/GDShrapt.Reader/Declarations/GDDictionaryKeyValueDeclaration.cs b/src/GDShrapt.Reader/Declarations/GDDictionaryKeyValueDeclaration.cs index 0e9d7f0..6813975 100644 --- a/src/GDShrapt.Reader/Declarations/GDDictionaryKeyValueDeclaration.cs +++ b/src/GDShrapt.Reader/Declarations/GDDictionaryKeyValueDeclaration.cs @@ -60,7 +60,7 @@ internal override void HandleChar(char c, GDReadingState state) switch (_form.State) { case State.Key: - this.ResolveExpression(c, state, _intendation); + this.ResolveExpression(c, state, _intendation, allowAssignment: false); break; case State.ColonOrAssign: if (!_checkedColon) diff --git a/src/GDShrapt.Reader/GDShrapt.Reader.csproj b/src/GDShrapt.Reader/GDShrapt.Reader.csproj index 8fe681c..c91119b 100644 --- a/src/GDShrapt.Reader/GDShrapt.Reader.csproj +++ b/src/GDShrapt.Reader/GDShrapt.Reader.csproj @@ -3,7 +3,7 @@ netstandard2.0 true - 4.1.3-alpha + 4.1.4-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.3 - 4.1.3 + 4.1.4 + 4.1.4 true diff --git a/src/GDShrapt.Reader/Resolvers/GDExpressionResolver.cs b/src/GDShrapt.Reader/Resolvers/GDExpressionResolver.cs index 958aa2c..2a38739 100644 --- a/src/GDShrapt.Reader/Resolvers/GDExpressionResolver.cs +++ b/src/GDShrapt.Reader/Resolvers/GDExpressionResolver.cs @@ -10,26 +10,21 @@ internal class GDExpressionResolver : GDResolver, bool _ifExpressionChecked; bool _isCompleted; readonly int _intendation; + readonly bool _allowAssignment; new ITokenReceiver Owner { get; } ITokenSkipReceiver OwnerWithSkip { get; } INewLineReceiver NewLineReceiver { get; } public bool IsCompleted => _isCompleted; - public GDExpressionResolver(ITokenOrSkipReceiver owner, int intendation, INewLineReceiver newLineReceiver = null) + public GDExpressionResolver(ITokenOrSkipReceiver owner, int intendation, INewLineReceiver newLineReceiver = null, bool allowAssignment = true) : base(owner) { Owner = owner; OwnerWithSkip = owner; NewLineReceiver = newLineReceiver; _intendation = intendation; - } - - public GDExpressionResolver(ITokenReceiver owner, int intendation) - : base(owner) - { - Owner = owner; - _intendation = intendation; + _allowAssignment = allowAssignment; } internal override void HandleChar(char c, GDReadingState state) @@ -213,6 +208,13 @@ internal override void HandleChar(char c, GDReadingState state) return; } + if (c == '=' && !_allowAssignment) + { + CompleteExpression(state); + state.PassChar(c); + return; + } + PushAndSwap(state, new GDDualOperatorExpression(_intendation, NewLineReceiver != null)); state.PassChar(c); } diff --git a/src/GDShrapt.Reader/Resolvers/GDResolvingHelper.cs b/src/GDShrapt.Reader/Resolvers/GDResolvingHelper.cs index ac46d93..3d5b314 100644 --- a/src/GDShrapt.Reader/Resolvers/GDResolvingHelper.cs +++ b/src/GDShrapt.Reader/Resolvers/GDResolvingHelper.cs @@ -303,10 +303,10 @@ public static bool ResolvePoint(this ITokenOrSkipReceiver receiver, cha return result; } - public static void ResolveExpression(this ITokenOrSkipReceiver receiver, char c, GDReadingState state, int intendation, INewLineReceiver newLineReceiver = null) + public static void ResolveExpression(this ITokenOrSkipReceiver receiver, char c, GDReadingState state, int intendation, INewLineReceiver newLineReceiver = null, bool allowAssignment = true) { if (!IsExpressionStopChar(c)) - state.Push(new GDExpressionResolver(receiver, intendation, newLineReceiver)); + state.Push(new GDExpressionResolver(receiver, intendation, newLineReceiver, allowAssignment)); else receiver.HandleReceivedTokenSkip(); state.PassChar(c);