Skip to content

Commit

Permalink
Fixed new properties parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
elamaunt committed Jan 17, 2024
1 parent 8721e94 commit 416c7a6
Show file tree
Hide file tree
Showing 6 changed files with 225 additions and 42 deletions.
23 changes: 3 additions & 20 deletions src/GDShrapt.Reader.Tests/ParsingTests.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Linq;
using System.Security.Claims;
using System.Threading;
using static GDShrapt.Reader.GD;

Expand Down Expand Up @@ -2228,6 +2229,7 @@ public void ParseNewProperiesSyntaxTest1()
AssertHelper.NoInvalidTokens(@class);
}

[TestMethod]
public void ParseNewProperiesSyntaxTest2()
{
var reader = new GDScriptReader();
Expand All @@ -2249,26 +2251,7 @@ public void ParseNewProperiesSyntaxTest2()
AssertHelper.NoInvalidTokens(@class);
}

public void ParseNewProperiesSyntaxTest3()
{
var reader = new GDScriptReader();

var code = @"var score: int:
get:
return score
set(value: int):
score = value
update_score_display()
func update_score_display():
pass # Do something to update the displayed score";

var @class = reader.ParseFileContent(code);

AssertHelper.CompareCodeStrings(code, @class.ToString());
AssertHelper.NoInvalidTokens(@class);
}

[TestMethod]
public void ParseNewExportsTest()
{
var reader = new GDScriptReader();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
public class GDGetAccessorBodyDeclaration : GDAccessorDeclaration,
ITokenOrSkipReceiver<GDGetKeyword>,
ITokenOrSkipReceiver<GDColon>,
ITokenOrSkipReceiver<GDExpression>,
ITokenOrSkipReceiver<GDStatementsList>
{
public GDGetKeyword GetKeyword
Expand All @@ -16,34 +17,40 @@ public GDColon Colon
get => _form.Token1;
set => _form.Token1 = value;
}
public GDExpression Expression
{
get => _form.Token2;
set => _form.Token2 = value;
}

public GDStatementsList Statements
{
get => _form.Token2 ?? (_form.Token2 = new GDStatementsList(Intendation + 1));
set => _form.Token2 = value;
get => _form.Token3 ?? (_form.Token3 = new GDStatementsList(Intendation + 1));
set => _form.Token3 = value;
}

public enum State
{
Get,
Colon,
Expression,
Statements,
Completed
}

readonly GDTokensForm<State, GDGetKeyword, GDColon, GDStatementsList> _form;
readonly GDTokensForm<State, GDGetKeyword, GDColon, GDExpression, GDStatementsList> _form;
public override GDTokensForm Form => _form;
public GDTokensForm<State, GDGetKeyword, GDColon, GDStatementsList> TypedForm => _form;
public GDTokensForm<State, GDGetKeyword, GDColon, GDExpression, GDStatementsList> TypedForm => _form;

public GDGetAccessorBodyDeclaration()
{
_form = new GDTokensForm<State, GDGetKeyword, GDColon, GDStatementsList>(this);
_form = new GDTokensForm<State, GDGetKeyword, GDColon, GDExpression, GDStatementsList>(this);
}

public GDGetAccessorBodyDeclaration(int intendation)
: base(intendation)
{
_form = new GDTokensForm<State, GDGetKeyword, GDColon, GDStatementsList>(this);
_form = new GDTokensForm<State, GDGetKeyword, GDColon, GDExpression, GDStatementsList>(this);
}

public override GDNode CreateEmptyInstance()
Expand Down Expand Up @@ -73,6 +80,10 @@ internal override void HandleChar(char c, GDReadingState state)
if (!this.ResolveSpaceToken(c, state))
this.ResolveColon(c, state);
break;
case State.Expression:
if (!this.ResolveSpaceToken(c, state))
this.ResolveExpression(c, state, Intendation);
break;
case State.Statements:
this.HandleAsInvalidToken(c, state, x => x.IsSpace() || x.IsNewLine());
break;
Expand All @@ -88,6 +99,7 @@ internal override void HandleNewLineChar(GDReadingState state)
{
case State.Get:
case State.Colon:
case State.Expression:
case State.Statements:
_form.State = State.Completed;
state.PushAndPassNewLine(Statements);
Expand Down Expand Up @@ -126,7 +138,7 @@ void ITokenReceiver<GDColon>.HandleReceivedToken(GDColon token)
if (_form.State == State.Colon)
{
Colon = token;
_form.State = State.Statements;
_form.State = State.Expression;
return;
}

Expand All @@ -136,6 +148,28 @@ void ITokenReceiver<GDColon>.HandleReceivedToken(GDColon token)
void ITokenSkipReceiver<GDColon>.HandleReceivedTokenSkip()
{
if (_form.State == State.Colon)
{
_form.State = State.Expression;
return;
}

throw new GDInvalidStateException();
}
void ITokenReceiver<GDExpression>.HandleReceivedToken(GDExpression token)
{
if (_form.State == State.Expression)
{
Expression = token;
_form.State = State.Statements;
return;
}

throw new GDInvalidStateException();
}

void ITokenSkipReceiver<GDExpression>.HandleReceivedTokenSkip()
{
if (_form.State == State.Expression)
{
_form.State = State.Statements;
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ public class GDSetAccessorBodyDeclaration : GDAccessorDeclaration,
ITokenOrSkipReceiver<GDParameterDeclaration>,
ITokenOrSkipReceiver<GDCloseBracket>,
ITokenOrSkipReceiver<GDColon>,
ITokenOrSkipReceiver<GDExpression>,
ITokenOrSkipReceiver<GDStatementsList>
{
public GDSetKeyword SetKeyword
Expand Down Expand Up @@ -38,36 +39,43 @@ public GDColon Colon
set => _form.Token4 = value;
}

public GDStatementsList Statements
public GDExpression Expression
{
get => _form.Token5 ?? (_form.Token5 = new GDStatementsList(Intendation + 1));
get => _form.Token5;
set => _form.Token5 = value;
}

public GDStatementsList Statements
{
get => _form.Token6 ?? (_form.Token6 = new GDStatementsList(Intendation + 1));
set => _form.Token6 = value;
}

public enum State
{
Set,
OpenBracket,
Parameter,
CloseBracket,
Colon,
Expression,
Statements,
Completed
}

readonly GDTokensForm<State, GDSetKeyword, GDOpenBracket, GDParameterDeclaration, GDCloseBracket, GDColon, GDStatementsList> _form;
readonly GDTokensForm<State, GDSetKeyword, GDOpenBracket, GDParameterDeclaration, GDCloseBracket, GDColon, GDExpression, GDStatementsList> _form;
public override GDTokensForm Form => _form;
public GDTokensForm<State, GDSetKeyword, GDOpenBracket, GDParameterDeclaration, GDCloseBracket, GDColon, GDStatementsList> TypedForm => _form;
public GDTokensForm<State, GDSetKeyword, GDOpenBracket, GDParameterDeclaration, GDCloseBracket, GDColon, GDExpression, GDStatementsList> TypedForm => _form;

public GDSetAccessorBodyDeclaration()
{
_form = new GDTokensForm<State, GDSetKeyword, GDOpenBracket, GDParameterDeclaration, GDCloseBracket, GDColon, GDStatementsList>(this);
_form = new GDTokensForm<State, GDSetKeyword, GDOpenBracket, GDParameterDeclaration, GDCloseBracket, GDColon, GDExpression, GDStatementsList>(this);
}

public GDSetAccessorBodyDeclaration(int intendation)
: base(intendation)
{
_form = new GDTokensForm<State, GDSetKeyword, GDOpenBracket, GDParameterDeclaration, GDCloseBracket, GDColon, GDStatementsList>(this);
_form = new GDTokensForm<State, GDSetKeyword, GDOpenBracket, GDParameterDeclaration, GDCloseBracket, GDColon, GDExpression, GDStatementsList>(this);
}

public override GDNode CreateEmptyInstance()
Expand All @@ -93,10 +101,26 @@ internal override void HandleChar(char c, GDReadingState state)
if (!this.ResolveSpaceToken(c, state))
this.ResolveKeyword<GDSetKeyword>(c, state);
break;
case State.OpenBracket:
if (!this.ResolveSpaceToken(c, state))
this.ResolveOpenBracket(c, state);
break;
case State.Parameter:
if (!this.ResolveSpaceToken(c, state))
this.ResolveParameter(c, state);
break;
case State.CloseBracket:
if (!this.ResolveSpaceToken(c, state))
this.ResolveCloseBracket(c, state);
break;
case State.Colon:
if (!this.ResolveSpaceToken(c, state))
this.ResolveColon(c, state);
break;
case State.Expression:
if (!this.ResolveSpaceToken(c, state))
this.ResolveExpression(c, state, Intendation);
break;
case State.Statements:
this.HandleAsInvalidToken(c, state, x => x.IsSpace() || x.IsNewLine());
break;
Expand All @@ -110,11 +134,15 @@ internal override void HandleNewLineChar(GDReadingState state)
{
switch (_form.State)
{
case State.Set:
case State.OpenBracket:
case State.Parameter:
case State.CloseBracket:
_form.AddBeforeActiveToken(new GDNewLine());
break;

case State.Set:
case State.OpenBracket:
case State.Colon:
case State.Expression:
case State.Statements:
_form.State = State.Completed;
state.PushAndPassNewLine(Statements);
Expand All @@ -130,7 +158,7 @@ void ITokenReceiver<GDSetKeyword>.HandleReceivedToken(GDSetKeyword token)
if (_form.State == State.Set)
{
SetKeyword = token;
_form.State = State.Colon;
_form.State = State.OpenBracket;
return;
}

Expand Down Expand Up @@ -222,7 +250,7 @@ void ITokenReceiver<GDColon>.HandleReceivedToken(GDColon token)
if (_form.State == State.Colon)
{
Colon = token;
_form.State = State.Statements;
_form.State = State.Expression;
return;
}

Expand All @@ -232,6 +260,29 @@ void ITokenReceiver<GDColon>.HandleReceivedToken(GDColon token)
void ITokenSkipReceiver<GDColon>.HandleReceivedTokenSkip()
{
if (_form.State == State.Colon)
{
_form.State = State.Expression;
return;
}

throw new GDInvalidStateException();
}

void ITokenReceiver<GDExpression>.HandleReceivedToken(GDExpression token)
{
if (_form.State == State.Expression)
{
Expression = token;
_form.State = State.Statements;
return;
}

throw new GDInvalidStateException();
}

void ITokenSkipReceiver<GDExpression>.HandleReceivedTokenSkip()
{
if (_form.State == State.Expression)
{
_form.State = State.Statements;
return;
Expand Down Expand Up @@ -262,7 +313,5 @@ void ITokenSkipReceiver<GDStatementsList>.HandleReceivedTokenSkip()

throw new GDInvalidStateException();
}


}
}
13 changes: 13 additions & 0 deletions src/GDShrapt.Reader/Resolvers/GDResolvingHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,19 @@ public static bool ResolveAssign(this ITokenOrSkipReceiver<GDAssign> receiver, c
return result;
}

public static bool ResolveParameter(this ITokenOrSkipReceiver<GDParameterDeclaration> receiver, char c, GDReadingState state)
{
if (c.IsIdentifierStartChar())
{
receiver.HandleReceivedToken(state.PushAndPass(new GDParameterDeclaration(), c));
return true;
}

receiver.HandleReceivedTokenSkip();
state.PassChar(c);
return false;
}

public static bool ResolveCloseBracket(this ITokenOrSkipReceiver<GDCloseBracket> receiver, char c, GDReadingState state)
{
var result = c == ')';
Expand Down
8 changes: 6 additions & 2 deletions src/GDShrapt.Reader/Resolvers/GDSetGetAccessorsResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,15 @@ public override string[] GeneratePatterns()
"set=",

"get:",
"set:"
"set("
};
}

protected override void PatternMatched(string pattern, GDReadingState state)
{
if (pattern != null)
SendIntendationTokensToOwner();

switch (pattern)
{
case "set":
Expand All @@ -46,8 +49,9 @@ protected override void PatternMatched(string pattern, GDReadingState state)
state.Push(accessor);
break;
}
case "set:":
case "set(":
{
// TODO: check spaces
var accessor = new GDSetAccessorBodyDeclaration(LineIntendationThreshold);
Owner.HandleReceivedToken(accessor);
state.Push(accessor);
Expand Down
Loading

0 comments on commit 416c7a6

Please sign in to comment.