Skip to content

Commit

Permalink
Added new methods for attributes enumeration
Browse files Browse the repository at this point in the history
  • Loading branch information
elamaunt committed Jan 31, 2024
1 parent 7f9340f commit b4b8689
Show file tree
Hide file tree
Showing 7 changed files with 135 additions and 5 deletions.
47 changes: 47 additions & 0 deletions src/GDShrapt.Reader.Tests/SyntaxTests.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.Xml.Linq;

namespace GDShrapt.Reader.Tests
{
Expand Down Expand Up @@ -414,5 +415,51 @@ func _process(delta) -> void:
AssertHelper.CompareCodeStrings(code, @class.ToString());
AssertHelper.NoInvalidTokens(@class);
}

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

var code = @"
@tool
@static_unload
class_name MyClass extends Node
@export var a = ""Hello""
@onready @export var b = ""init_value_b""";

var @class = reader.ParseFileContent(code);

var members = @class.Members.ToArray();

Assert.AreEqual(9, members.Length);

members[8].AttributesDeclaredBefore.Select(x => x.ToString()).Should().BeEquivalentTo(new[]
{
"@export ",
"@onready "
});

members[8].AttributesDeclaredBeforeFromStartOfTheClass.Select(x => x.ToString()).Should().BeEquivalentTo(new[]
{
"@export ",
"@onready ",
"@export ",
"@static_unload",
"@tool"
});

members[5].AttributesDeclaredBeforeFromStartOfTheClass.Select(x => x.ToString()).Should().BeEquivalentTo(new[]
{
"@export ",
"@static_unload",
"@tool"
});

members[5].AttributesDeclaredBefore.Select(x => x.ToString()).Should().BeEquivalentTo(new[]
{
"@export "
});
}
}
}
3 changes: 1 addition & 2 deletions src/GDShrapt.Reader/Basics/GDNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace GDShrapt.Reader
/// <summary>
/// Basic GDScript node, may contains multiple tokens
/// </summary>
public abstract class GDNode : GDSyntaxToken,
public abstract class GDNode : GDSyntaxToken, IGDNode,
ITokenReceiver<GDComment>,
ITokenReceiver<GDSpace>
{
Expand All @@ -21,7 +21,6 @@ public GDSyntaxToken[] FormTokensSetter
{
set => Form.SetFormUnsafe(value);
}


public IEnumerable<GDSyntaxToken> Tokens => Form.Direct();
public IEnumerable<GDSyntaxToken> TokensReversed => Form.Reversed();
Expand Down
3 changes: 2 additions & 1 deletion src/GDShrapt.Reader/Basics/IGDClassDeclaration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace GDShrapt.Reader
{
public interface IGDClassDeclaration : IGDSyntaxToken
public interface IGDClassDeclaration : IGDNode
{
GDIdentifier Identifier { get; }
GDClassMembersList Members { get; }
Expand All @@ -13,5 +13,6 @@ public interface IGDClassDeclaration : IGDSyntaxToken
IEnumerable<GDEnumDeclaration> Enums { get; }
IEnumerable<GDInnerClassDeclaration> InnerClasses { get; }
IEnumerable<GDIdentifiableClassMember> IdentifiableMembers { get; }
IEnumerable<GDCustomAttribute> CustomAttributes { get; }
}
}
21 changes: 21 additions & 0 deletions src/GDShrapt.Reader/Basics/IGDNode.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System.Collections.Generic;

namespace GDShrapt.Reader
{
public interface IGDNode : IGDSyntaxToken
{
IEnumerable<GDNode> Nodes { get; }
IEnumerable<GDNode> NodesReversed { get; }
IEnumerable<GDNode> AllNodes { get; }
IEnumerable<GDNode> AllNodesReversed { get; }
IEnumerable<GDSyntaxToken> AllTokens { get; }
IEnumerable<GDSyntaxToken> AllTokensReversed { get; }

int TokensCount { get; }
bool HasTokens { get; }
GDTokensForm Form { get; }
GDSyntaxToken[] FormTokensSetter { set; }

void UpdateIntendation();
}
}
63 changes: 61 additions & 2 deletions src/GDShrapt.Reader/Declarations/Class/GDClassMember.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
namespace GDShrapt.Reader
using System.Collections.Generic;

namespace GDShrapt.Reader
{
public abstract class GDClassMember : GDIntendedNode
{
internal GDClassMember(int intendation)
internal GDClassMember(int intendation)
: base(intendation)
{
}
Expand All @@ -11,5 +13,62 @@ internal GDClassMember()
: base()
{
}

public IEnumerable<GDCustomAttribute> AttributesDeclaredBefore
{
get
{
var @class = ClassDeclaration;

if (@class == null)
yield break;

bool foundThis = false;

foreach (var item in @class.Members.NodesReversed)
{
if (!foundThis)
{
if (ReferenceEquals(item, this))
foundThis = true;
}
else
{
if (item is GDCustomAttribute attr)
yield return attr;
else
yield break;

}
}
}
}

public IEnumerable<GDCustomAttribute> AttributesDeclaredBeforeFromStartOfTheClass
{
get
{
var @class = ClassDeclaration;

if (@class == null)
yield break;

bool foundThis = false;

foreach (var item in @class.Members.NodesReversed)
{
if (!foundThis)
{
if (ReferenceEquals(item, this))
foundThis = true;
}
else
{
if (item is GDCustomAttribute attr)
yield return attr;
}
}
}
}
}
}
2 changes: 2 additions & 0 deletions src/GDShrapt.Reader/Declarations/GDClassDeclaration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ public GDClassDeclaration()
public bool IsTool => Attributes.OfType<GDToolAttribute>().Any();

public IEnumerable<GDClassAttribute> Attributes => Members.OfType<GDClassAttribute>();
public IEnumerable<GDCustomAttribute> CustomAttributes => Members.OfType<GDCustomAttribute>();

public IEnumerable<GDVariableDeclaration> Variables => Members.OfType<GDVariableDeclaration>();
public IEnumerable<GDMethodDeclaration> Methods => Members.OfType<GDMethodDeclaration>();
public IEnumerable<GDEnumDeclaration> Enums => Members.OfType<GDEnumDeclaration>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public sealed class GDInnerClassDeclaration : GDIdentifiableClassMember, IGDClas
public IEnumerable<GDEnumDeclaration> Enums => Members.OfType<GDEnumDeclaration>();
public IEnumerable<GDInnerClassDeclaration> InnerClasses => Members.OfType<GDInnerClassDeclaration>();
public IEnumerable<GDIdentifiableClassMember> IdentifiableMembers => Members.OfType<GDIdentifiableClassMember>();
public IEnumerable<GDCustomAttribute> CustomAttributes => Members.OfType<GDCustomAttribute>();

public GDClassKeyword ClassKeyword
{
Expand Down

0 comments on commit b4b8689

Please sign in to comment.