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);