diff --git a/src/GDShrapt.Reader.Tests/ParsingTests.cs b/src/GDShrapt.Reader.Tests/ParsingTests.cs index 17384f1..202f45b 100644 --- a/src/GDShrapt.Reader.Tests/ParsingTests.cs +++ b/src/GDShrapt.Reader.Tests/ParsingTests.cs @@ -1788,8 +1788,8 @@ public void GetNodeTest() Assert.IsNotNull(expression); - var getNodeExpression = expression.CastOrAssert(); - Assert.AreEqual("Animation/Root/ _345/ end .CallMethod()", getNodeExpression.Path.ToString()); + var getNodeExpression = expression.CastOrAssert(); + Assert.AreEqual("$Animation/Root/ _345/ end .CallMethod", getNodeExpression.CallerExpression.ToString()); AssertHelper.CompareCodeStrings(code, expression.ToString()); AssertHelper.NoInvalidTokens(expression); diff --git a/src/GDShrapt.Reader/Building/GD_LIST.cs b/src/GDShrapt.Reader/Building/GD_LIST.cs index 415e637..70e2be1 100644 --- a/src/GDShrapt.Reader/Building/GD_LIST.cs +++ b/src/GDShrapt.Reader/Building/GD_LIST.cs @@ -234,15 +234,15 @@ public static GDPathList Path(params GDLayersList[] identifiers) return list; } - public static GDLayersList LayersList() => new GDLayersList(); - public static GDLayersList LayersList(Func setup) => setup(new GDLayersList()); - public static GDLayersList LayersList(params GDSyntaxToken[] unsafeTokens) => new GDLayersList() { FormTokensSetter = unsafeTokens }; + public static GDLayersList LayersList() => new GDLayersList(true); + public static GDLayersList LayersList(Func setup) => setup(new GDLayersList(true)); + public static GDLayersList LayersList(params GDSyntaxToken[] unsafeTokens) => new GDLayersList(true) { FormTokensSetter = unsafeTokens }; public static GDLayersList LayersList(params GDPathSpecifier[] pathSpecifiers) { if (pathSpecifiers == null || pathSpecifiers.Length == 0) - return new GDLayersList(); + return new GDLayersList(true); - var list = new GDLayersList(); + var list = new GDLayersList(true); for (int i = 0; i < pathSpecifiers.Length; i++) { diff --git a/src/GDShrapt.Reader/Lists/GDLayersList.cs b/src/GDShrapt.Reader/Lists/GDLayersList.cs index 14ca380..ec8bc1f 100644 --- a/src/GDShrapt.Reader/Lists/GDLayersList.cs +++ b/src/GDShrapt.Reader/Lists/GDLayersList.cs @@ -7,6 +7,12 @@ public class GDLayersList : GDSeparatedList, { bool _switch; bool _ended; + readonly bool _allowNonStringIdentifiers; + + public GDLayersList(bool allowNonStringIdentifiers) + { + _allowNonStringIdentifiers = allowNonStringIdentifiers; + } internal override void HandleChar(char c, GDReadingState state) { @@ -20,7 +26,7 @@ internal override void HandleChar(char c, GDReadingState state) } if (!_switch) - this.ResolvePathSpecifier(c, state); + this.ResolvePathSpecifier(c, state, _allowNonStringIdentifiers); else this.ResolveColon(c, state); } @@ -33,7 +39,7 @@ internal override void HandleNewLineChar(GDReadingState state) public override GDNode CreateEmptyInstance() { - return new GDLayersList(); + return new GDLayersList(_allowNonStringIdentifiers); } internal override void Visit(IGDVisitor visitor) diff --git a/src/GDShrapt.Reader/Lists/GDPathList.cs b/src/GDShrapt.Reader/Lists/GDPathList.cs index 26ef2fc..0244c2b 100644 --- a/src/GDShrapt.Reader/Lists/GDPathList.cs +++ b/src/GDShrapt.Reader/Lists/GDPathList.cs @@ -24,7 +24,7 @@ internal override void HandleChar(char c, GDReadingState state) return; } - if (c.IsExpressionStopChar() && BoundingChar == GDPathBoundingChar.None) + if ((c.IsExpressionStopChar() || c == '.') && BoundingChar == GDPathBoundingChar.None) { _ended = true; state.PopAndPass(c); @@ -82,7 +82,7 @@ internal override void HandleChar(char c, GDReadingState state) } if (!_switch) - this.ResolveLayersList(c, state); + this.ResolveLayersList(c, state, BoundingChar != GDPathBoundingChar.None); else this.ResolveRightSlash(c, state); } diff --git a/src/GDShrapt.Reader/Resolvers/GDPathSpecifierResolver.cs b/src/GDShrapt.Reader/Resolvers/GDPathSpecifierResolver.cs index 047ea9b..86dd1b1 100644 --- a/src/GDShrapt.Reader/Resolvers/GDPathSpecifierResolver.cs +++ b/src/GDShrapt.Reader/Resolvers/GDPathSpecifierResolver.cs @@ -6,11 +6,14 @@ internal class GDPathSpecifierResolver : GDResolver { private GDPathSpecifierType? _type; private StringBuilder _identifierBuilder; + private readonly bool _allowNonStringIdentifiers; + public new ITokenOrSkipReceiver Owner { get; } - public GDPathSpecifierResolver(ITokenOrSkipReceiver owner) + public GDPathSpecifierResolver(ITokenOrSkipReceiver owner, bool allowNonStringIdentifiers) : base(owner) { Owner = owner; + _allowNonStringIdentifiers = allowNonStringIdentifiers; } internal override void HandleChar(char c, GDReadingState state) @@ -25,6 +28,12 @@ internal override void HandleChar(char c, GDReadingState state) { if (c == '.') { + if (!_allowNonStringIdentifiers) + { + Complete(c, state); + return; + } + switch (_type.Value) { case GDPathSpecifierType.Current: diff --git a/src/GDShrapt.Reader/Resolvers/GDResolvingHelper.cs b/src/GDShrapt.Reader/Resolvers/GDResolvingHelper.cs index 3d5b314..f8867ea 100644 --- a/src/GDShrapt.Reader/Resolvers/GDResolvingHelper.cs +++ b/src/GDShrapt.Reader/Resolvers/GDResolvingHelper.cs @@ -437,11 +437,11 @@ public static bool ResolveString(this ITokenOrSkipReceiver receive return false; } - public static bool ResolveLayersList(this ITokenOrSkipReceiver receiver, char c, GDReadingState state) + public static bool ResolveLayersList(this ITokenOrSkipReceiver receiver, char c, GDReadingState state, bool allowNonStringIdentifiers) { if (IsIdentifierStartChar(c) || c == ':' || c == '.') { - receiver.HandleReceivedToken(state.Push(new GDLayersList())); + receiver.HandleReceivedToken(state.Push(new GDLayersList(allowNonStringIdentifiers))); state.PassChar(c); return true; } @@ -452,9 +452,9 @@ public static bool ResolveLayersList(this ITokenOrSkipReceiver rec } - public static void ResolvePathSpecifier(this ITokenOrSkipReceiver receiver, char c, GDReadingState state) + public static void ResolvePathSpecifier(this ITokenOrSkipReceiver receiver, char c, GDReadingState state, bool allowNonStringIdentifiers) { - state.PushAndPass(new GDPathSpecifierResolver(receiver), c); + state.PushAndPass(new GDPathSpecifierResolver(receiver, allowNonStringIdentifiers), c); } public static bool ResolveType(this ITokenOrSkipReceiver receiver, char c, GDReadingState state)