Skip to content

Commit

Permalink
Fixed get_node expression parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
elamaunt committed Jun 16, 2024
1 parent d4cefbd commit a868dd4
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 16 deletions.
4 changes: 2 additions & 2 deletions src/GDShrapt.Reader.Tests/ParsingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1788,8 +1788,8 @@ public void GetNodeTest()

Assert.IsNotNull(expression);

var getNodeExpression = expression.CastOrAssert<GDGetNodeExpression>();
Assert.AreEqual("Animation/Root/ _345/ end .CallMethod()", getNodeExpression.Path.ToString());
var getNodeExpression = expression.CastOrAssert<GDCallExpression>();
Assert.AreEqual("$Animation/Root/ _345/ end .CallMethod", getNodeExpression.CallerExpression.ToString());

AssertHelper.CompareCodeStrings(code, expression.ToString());
AssertHelper.NoInvalidTokens(expression);
Expand Down
10 changes: 5 additions & 5 deletions src/GDShrapt.Reader/Building/GD_LIST.cs
Original file line number Diff line number Diff line change
Expand Up @@ -234,15 +234,15 @@ public static GDPathList Path(params GDLayersList[] identifiers)
return list;
}

public static GDLayersList LayersList() => new GDLayersList();
public static GDLayersList LayersList(Func<GDLayersList, GDLayersList> 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<GDLayersList, GDLayersList> 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++)
{
Expand Down
10 changes: 8 additions & 2 deletions src/GDShrapt.Reader/Lists/GDLayersList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ public class GDLayersList : GDSeparatedList<GDPathSpecifier, GDColon>,
{
bool _switch;
bool _ended;
readonly bool _allowNonStringIdentifiers;

public GDLayersList(bool allowNonStringIdentifiers)
{
_allowNonStringIdentifiers = allowNonStringIdentifiers;
}

internal override void HandleChar(char c, GDReadingState state)
{
Expand All @@ -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);
}
Expand All @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions src/GDShrapt.Reader/Lists/GDPathList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down
11 changes: 10 additions & 1 deletion src/GDShrapt.Reader/Resolvers/GDPathSpecifierResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@ internal class GDPathSpecifierResolver : GDResolver
{
private GDPathSpecifierType? _type;
private StringBuilder _identifierBuilder;
private readonly bool _allowNonStringIdentifiers;

public new ITokenOrSkipReceiver<GDPathSpecifier> Owner { get; }
public GDPathSpecifierResolver(ITokenOrSkipReceiver<GDPathSpecifier> owner)
public GDPathSpecifierResolver(ITokenOrSkipReceiver<GDPathSpecifier> owner, bool allowNonStringIdentifiers)
: base(owner)
{
Owner = owner;
_allowNonStringIdentifiers = allowNonStringIdentifiers;
}

internal override void HandleChar(char c, GDReadingState state)
Expand All @@ -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:
Expand Down
8 changes: 4 additions & 4 deletions src/GDShrapt.Reader/Resolvers/GDResolvingHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -437,11 +437,11 @@ public static bool ResolveString(this ITokenOrSkipReceiver<GDStringNode> receive
return false;
}

public static bool ResolveLayersList(this ITokenOrSkipReceiver<GDLayersList> receiver, char c, GDReadingState state)
public static bool ResolveLayersList(this ITokenOrSkipReceiver<GDLayersList> 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;
}
Expand All @@ -452,9 +452,9 @@ public static bool ResolveLayersList(this ITokenOrSkipReceiver<GDLayersList> rec
}


public static void ResolvePathSpecifier(this ITokenOrSkipReceiver<GDPathSpecifier> receiver, char c, GDReadingState state)
public static void ResolvePathSpecifier(this ITokenOrSkipReceiver<GDPathSpecifier> 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<GDType> receiver, char c, GDReadingState state)
Expand Down

0 comments on commit a868dd4

Please sign in to comment.