Skip to content

Commit

Permalink
Completed node cloning methods. Small fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
elamaunt committed Jun 26, 2021
1 parent e2951a9 commit ab62c2a
Show file tree
Hide file tree
Showing 23 changed files with 117 additions and 47 deletions.
4 changes: 2 additions & 2 deletions src/GDShrapt.Converter.Tests/ConversionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ func save(path, resource, flags):
ConvertGDScriptNamingStyleToSharp = true
});

var treeWalker = new GDTreeWalker(visitor);
treeWalker.WalkInNode(declaration);
// var treeWalker = new GDTreeWalker(visitor);
// treeWalker.WalkInNode(declaration);

var csharpCode = visitor.BuildCSharpNormalisedCode();

Expand Down
4 changes: 2 additions & 2 deletions src/GDShrapt.Converter/CSharpGeneratingVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace GDShrapt.Converter
{
public class CSharpGeneratingVisitor : INodeVisitor
public class CSharpGeneratingVisitor //: INodeVisitor
{
private readonly ConversionSettings _settings;

Expand Down Expand Up @@ -200,7 +200,7 @@ public void Visit(GDBracketExpression e)
}

/////////////////////////////////////////////////////////////////////////////////////////////////
public void Visit(GDCallExression e)
public void Visit(GDCallExpression e)
{

}
Expand Down
4 changes: 2 additions & 2 deletions src/GDShrapt.Converter/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ static void ParseFile(GDScriptReader parser, string filePath, string destination
ConvertGDScriptNamingStyleToSharp = true
});

var treeWalker = new GDTreeWalker(visitor);
treeWalker.WalkInNode(declaration);
//var treeWalker = new GDTreeWalker(visitor);
//treeWalker.WalkInNode(declaration);

// Generate C# code and save it in a file
var newPath = Path.ChangeExtension(destinationPath, ".cs");
Expand Down
24 changes: 12 additions & 12 deletions src/GDShrapt.Reader.Tests/ParsingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ public void ForStatementTest2()
var forStatement = (GDForStatement)statement;

Assert.AreEqual("i", forStatement.Variable?.Sequence);
Assert.IsInstanceOfType(forStatement.Collection, typeof(GDCallExression));
Assert.IsInstanceOfType(forStatement.Collection, typeof(GDCallExpression));
Assert.AreEqual("range(2, 8, 2)", forStatement.Collection.ToString());

Assert.AreEqual(1, forStatement.Statements.Count);
Expand Down Expand Up @@ -1348,38 +1348,38 @@ public void MethodsChainTest()

Assert.AreEqual(GDDualOperatorType.Addition, dualOperator.OperatorType);

Assert.IsInstanceOfType(dualOperator.LeftExpression, typeof(GDCallExression));
Assert.IsInstanceOfType(dualOperator.LeftExpression, typeof(GDCallExpression));
Assert.IsInstanceOfType(dualOperator.RightExpression, typeof(GDDualOperatorExression));

var rightDualOperator = (GDDualOperatorExression)dualOperator.RightExpression;

Assert.AreEqual(GDDualOperatorType.Division, rightDualOperator.OperatorType);
Assert.AreEqual("D()", rightDualOperator.LeftExpression.ToString());

Assert.IsInstanceOfType(rightDualOperator.RightExpression, typeof(GDCallExression));
Assert.IsInstanceOfType(rightDualOperator.RightExpression, typeof(GDCallExpression));

var rightCallExpression = (GDCallExression)rightDualOperator.RightExpression;
var rightCallExpression = (GDCallExpression)rightDualOperator.RightExpression;

Assert.AreEqual("E()(\"test\")", rightCallExpression.ToString());

var callExpression = (GDCallExression)dualOperator.LeftExpression;
var callExpression = (GDCallExpression)dualOperator.LeftExpression;
Assert.AreEqual(0, callExpression.Parameters.Count);
var memberOperatorExpression = callExpression.CallerExpression.CastOrAssert<GDMemberOperatorExpression>();
Assert.AreEqual("C", memberOperatorExpression.Identifier?.Sequence);

callExpression = memberOperatorExpression.CallerExpression.CastOrAssert<GDCallExression>();
callExpression = memberOperatorExpression.CallerExpression.CastOrAssert<GDCallExpression>();
Assert.AreEqual(0, callExpression.Parameters.Count);
memberOperatorExpression = callExpression.CallerExpression.CastOrAssert<GDMemberOperatorExpression>();
Assert.AreEqual("B", memberOperatorExpression.Identifier?.Sequence);

callExpression = memberOperatorExpression.CallerExpression.CastOrAssert<GDCallExression>();
callExpression = memberOperatorExpression.CallerExpression.CastOrAssert<GDCallExpression>();
Assert.AreEqual(1, callExpression.Parameters.Count);
Assert.AreEqual("-3", callExpression.Parameters.ToString());

callExpression = callExpression.CallerExpression.CastOrAssert<GDCallExression>();
callExpression = callExpression.CallerExpression.CastOrAssert<GDCallExpression>();
Assert.AreEqual(0, callExpression.Parameters.Count);

callExpression = callExpression.CallerExpression.CastOrAssert<GDCallExression>();
callExpression = callExpression.CallerExpression.CastOrAssert<GDCallExpression>();
Assert.AreEqual(1, callExpression.Parameters.Count);
Assert.AreEqual("1 + 2", callExpression.Parameters.ToString());

Expand Down Expand Up @@ -1428,7 +1428,7 @@ public void BaseMethodCallTest()

Assert.IsInstanceOfType(callStatement.Tokens.Last(), typeof(GDSemiColon));

var callExpression = callStatement.Expression.CastOrAssert<GDCallExression>();
var callExpression = callStatement.Expression.CastOrAssert<GDCallExpression>();

Assert.AreEqual("._init", callExpression.CallerExpression.ToString());
Assert.AreEqual("\"1234\"", callExpression.Parameters.ToString());
Expand Down Expand Up @@ -1468,7 +1468,7 @@ public void GetNodeTest()

Assert.IsNotNull(expression);

var call = expression.CastOrAssert<GDCallExression>();
var call = expression.CastOrAssert<GDCallExpression>();

var memberOperator = call.CallerExpression.CastOrAssert<GDMemberOperatorExpression>();
Assert.AreEqual("CallMethod", memberOperator.Identifier.Sequence);
Expand All @@ -1488,7 +1488,7 @@ public void NodePathTest()

var expression = reader.ParseExpression(code);

var call = expression.CastOrAssert<GDCallExression>();
var call = expression.CastOrAssert<GDCallExpression>();
Assert.AreEqual("0", call.Parameters.ToString());

var memberOperator = call.CallerExpression.CastOrAssert<GDMemberOperatorExpression>();
Expand Down
41 changes: 41 additions & 0 deletions src/GDShrapt.Reader.Tests/SyntaxTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -137,5 +137,46 @@ public void DictionaryCodeStyleTest()
Assert.AreEqual(2, expression.AllTokens.OfType<GDComment>().Count());
AssertHelper.CompareCodeStrings(code, "\n"+expression.ToString());
}

[TestMethod]
public void SyntaxCloneTest()
{
var reader = new GDScriptReader();

var code = @"
# before tool comment
tool # tool comment
# before class name comment
class_name HTerrainDataSaver # class name comment
# before extends comment
extends ResourceFormatSaver # extends comment
# before const comment
const HTerrainData = preload(""./ hterrain_data.gd"") # const comment
# before func comment 1
# before func comment 2
func get_recognized_extensions(res): # func comment
# before if statement comment
if res != null and res is HTerrainData: # if expression comment
# before return statement comment
return PoolStringArray([HTerrainData.META_EXTENSION]) # if true statement comment
return PoolStringArray()
# end file comment 1
# end file comment 2
";

var @class = reader.ParseFileContent(code);

Assert.IsNotNull(@class);

var clone = @class.Clone();
AssertHelper.CompareCodeStrings(@class.ToString(), clone.ToString());
}
}
}
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/Atributes/GDClassNameAtribute.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GDShrapt.Reader
{
public class GDClassNameAtribute : GDClassAtribute,
public sealed class GDClassNameAtribute : GDClassAtribute,
IKeywordReceiver<GDClassNameKeyword>,
IIdentifierReceiver,
ITokenReceiver<GDComma>,
Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/Atributes/GDExtendsAtribute.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GDShrapt.Reader
{
public class GDExtendsAtribute : GDClassAtribute,
public sealed class GDExtendsAtribute : GDClassAtribute,
IKeywordReceiver<GDExtendsKeyword>,
ITypeReceiver,
IStringReceiver
Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/Atributes/GDToolAtribute.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GDShrapt.Reader
{
public class GDToolAtribute : GDClassAtribute, IKeywordReceiver<GDToolKeyword>
public sealed class GDToolAtribute : GDClassAtribute, IKeywordReceiver<GDToolKeyword>
{
internal GDToolKeyword ToolKeyword
{
Expand Down
4 changes: 2 additions & 2 deletions src/GDShrapt.Reader/Basics/GDNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public override void AppendTo(StringBuilder builder)
token.AppendTo(builder);
}

public override string ToString()
public sealed override string ToString()
{
var builder = new StringBuilder();

Expand All @@ -92,7 +92,7 @@ public override string ToString()
public override GDSyntaxToken Clone()
{
var node = CreateEmptyInstance();
node.Form.CloneFrom(node.Form);
node.Form.CloneFrom(Form);
return node;
}

Expand Down
6 changes: 3 additions & 3 deletions src/GDShrapt.Reader/GDShrapt.Reader.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<Version>2.0.0-alpha</Version>
<Version>2.1.0-alpha</Version>
<Authors>elamaunt</Authors>
<Product>GDShrapt</Product>
<Description>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.
Expand All @@ -16,8 +16,8 @@ Usage: Just create GDScriptReader instance and call methods from it.</Descriptio
<RepositoryUrl>https://github.com/elamaunt/GDShrapt</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>GDShrapt GDScript reader parser codegeneration Godot lexical analyzer</PackageTags>
<AssemblyVersion>2.0.0</AssemblyVersion>
<FileVersion>2.0.0</FileVersion>
<AssemblyVersion>2.1.0</AssemblyVersion>
<FileVersion>2.1.0</FileVersion>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>

Expand Down
47 changes: 38 additions & 9 deletions src/GDShrapt.Reader/GDTokensForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -717,6 +717,30 @@ protected void Set(GDSyntaxToken value, int index)
node.Value = value;
}

/// <summary>
/// Used only by cloning methods. <see cref="CloneFrom(GDTokensForm)"/>
/// </summary>
void SetOrAdd(GDSyntaxToken value, int index)
{
if (index >= _statePoints.Count)
{
// Only for ListForms
_statePoints.Add(_list.AddLast(value));

if (value != null)
value.Parent = _owner;
}
else
{
var node = _statePoints[index];

if (value != null)
value.Parent = _owner;

node.Value = value;
}
}

protected T Get<T>(int index) where T : GDSyntaxToken => (T)_statePoints[index].Value;
protected GDSyntaxToken Get(int index) => _statePoints[index].Value;

Expand Down Expand Up @@ -814,30 +838,35 @@ internal int CountTokensBetween(int start, int end)
return counter;
}

/// <summary>
/// Main nodes cloning method. Current form must be empty
/// </summary>
/// <param name="form">The form to be cloned</param>
internal void CloneFrom(GDTokensForm form)
{
if (_initialSize != form._initialSize)
throw new InvalidOperationException("Forms must have same size");
if ((_initialSize != 0 || form._initialSize != 0) && _initialSize != form._initialSize)
throw new InvalidOperationException("Forms must have same size or zero");

if (StateIndex > 0)
throw new InvalidOperationException("The form must be at initial state");

if (form._list.Count == 0)
return;

var node = form._list.First;
var point = form._statePoints[StateIndex];

while (true)
while (node != null)
{
if (point == node)
{
Set(point.Value?.Clone(), StateIndex++);
point = form._statePoints[StateIndex];
SetOrAdd(node.Value?.Clone(), StateIndex++);
point = form._statePoints.ElementAtOrDefault(StateIndex);
}
else
{
var clone = point.Value?.Clone();

if (clone != null)
AddBeforeActiveToken(clone);
var clone = node.Value?.Clone();
AddBeforeActiveToken(clone);
}

node = node.Next;
Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/SimpleTokens/GDComment.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GDShrapt.Reader
{
public class GDComment : GDCharSequence
public sealed class GDComment : GDCharSequence
{
public GDComment()
{
Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/SimpleTokens/GDCornerCloseBracket.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GDShrapt.Reader
{
public class GDCornerCloseBracket : GDSingleCharToken, IGDStructureToken
public sealed class GDCornerCloseBracket : GDSingleCharToken, IGDStructureToken
{
public override char Char => '>';

Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/SimpleTokens/GDCornerOpenBracket.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GDShrapt.Reader
{
public class GDCornerOpenBracket : GDSingleCharToken, IGDStructureToken
public sealed class GDCornerOpenBracket : GDSingleCharToken, IGDStructureToken
{
public override char Char => '<';

Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/SimpleTokens/GDFigureCloseBracket.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GDShrapt.Reader
{
public class GDFigureCloseBracket : GDSingleCharToken, IGDStructureToken
public sealed class GDFigureCloseBracket : GDSingleCharToken, IGDStructureToken
{
public override char Char => '}';

Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/SimpleTokens/GDFigureOpenBracket.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GDShrapt.Reader
{
public class GDFigureOpenBracket : GDSingleCharToken, IGDStructureToken
public sealed class GDFigureOpenBracket : GDSingleCharToken, IGDStructureToken
{
public override char Char => '{';

Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/SimpleTokens/GDIdentifier.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace GDShrapt.Reader
{
public class GDIdentifier : GDDataToken
public sealed class GDIdentifier : GDDataToken
{
public bool IsPi => string.Equals(Sequence, "PI", StringComparison.Ordinal);
public bool IsTau => string.Equals(Sequence, "TAU", StringComparison.Ordinal);
Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/SimpleTokens/GDIntendation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace GDShrapt.Reader
{
public class GDIntendation : GDSimpleSyntaxToken
public sealed class GDIntendation : GDSimpleSyntaxToken
{
int _lineIntendation;
int _spaceCounter;
Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/SimpleTokens/GDNumber.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace GDShrapt.Reader
{
public class GDNumber : GDLiteralToken
public sealed class GDNumber : GDLiteralToken
{
readonly StringBuilder _stringBuilder = new StringBuilder();

Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/SimpleTokens/GDSpace.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GDShrapt.Reader
{
public class GDSpace : GDCharSequence
public sealed class GDSpace : GDCharSequence
{
internal override bool CanAppendChar(char c, GDReadingState state)
{
Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/SimpleTokens/GDSquareCloseBracket.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GDShrapt.Reader
{
public class GDSquareCloseBracket : GDSingleCharToken, IGDStructureToken
public sealed class GDSquareCloseBracket : GDSingleCharToken, IGDStructureToken
{
public override char Char => ']';

Expand Down
2 changes: 1 addition & 1 deletion src/GDShrapt.Reader/SimpleTokens/GDSquareOpenBracket.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GDShrapt.Reader
{
public class GDSquareOpenBracket : GDSingleCharToken, IGDStructureToken
public sealed class GDSquareOpenBracket : GDSingleCharToken, IGDStructureToken
{
public override char Char => '[';

Expand Down
Loading

0 comments on commit ab62c2a

Please sign in to comment.