diff --git a/Library/Core/Model/Workspace.cs b/Library/Core/Model/Workspace.cs index 60fd0fc..d7394f6 100644 --- a/Library/Core/Model/Workspace.cs +++ b/Library/Core/Model/Workspace.cs @@ -50,21 +50,22 @@ public class Workspace : IFragment return returnValue; } - private void InspectBlockChain(Block? block) + private void InspectBlockChain(Block? block, List groups) { for (; block != null; block = block.Next) { - System.Diagnostics.Debug.WriteLine(block.Type); + GroupInfo? info = null; if (block is ExecutionGroup group) - { - System.Diagnostics.Debug.WriteLine(group.Fields["NAME"]); + groups.Add(info = new GroupInfo { Id = block.Id, Name = group.Fields["NAME"] }); - InspectBlockChain(group.Values.Get("RESULT")?.Block); - } + var list = info?.Children ?? groups; + + foreach (var value in block.Values) + InspectBlockChain(value.Block, list); foreach (var statement in block.Statements) - InspectBlockChain(statement.Block); + InspectBlockChain(statement.Block, list); } } @@ -73,8 +74,11 @@ private void InspectBlockChain(Block? block) /// the script. /// /// The group information tree. - public async Task GetGroupTreeAsync() + public async Task> GetGroupTreeAsync() { + /* Resulting list. */ + var groups = new List(); + /* Use a dummy site. */ var context = new Context((IScriptSite)null!); @@ -85,9 +89,9 @@ public async Task GetGroupTreeAsync() /* Inspect all blocks. */ foreach (var block in Blocks) if (block is not ProceduresDef) - InspectBlockChain(block); + InspectBlockChain(block, groups); - return 0; + return groups; } } diff --git a/Library/Core/Parser.cs b/Library/Core/Parser.cs index 8e2f553..288beb5 100644 --- a/Library/Core/Parser.cs +++ b/Library/Core/Parser.cs @@ -58,7 +58,7 @@ private class ParsedScript(Workspace workspace) : IParsedScript } /// - public Task GetGroupTreeAsync() => _workspace.GetGroupTreeAsync(); + public Task> GetGroupTreeAsync() => _workspace.GetGroupTreeAsync(); } public IParsedScript Parse(string scriptAsText) diff --git a/Library/Scripting/Engine/GroupInfo.cs b/Library/Scripting/Engine/GroupInfo.cs new file mode 100644 index 0000000..92281e0 --- /dev/null +++ b/Library/Scripting/Engine/GroupInfo.cs @@ -0,0 +1,28 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace BlocklyNet.Scripting.Engine; + +/// +/// +/// +public class GroupInfo +{ + /// + /// + /// + [NotNull, Required] + public string Id { get; set; } = null!; + + /// + /// + /// + [NotNull, Required] + public string? Name { get; set; } + + /// + /// + /// + [NotNull, Required] + public List Children { get; set; } = []; +} \ No newline at end of file diff --git a/Library/Scripting/Parsing/IParsedScript.cs b/Library/Scripting/Parsing/IParsedScript.cs index 0c363ec..b54138e 100644 --- a/Library/Scripting/Parsing/IParsedScript.cs +++ b/Library/Scripting/Parsing/IParsedScript.cs @@ -26,5 +26,5 @@ public interface IParsedScript /// /// /// - Task GetGroupTreeAsync(); + Task> GetGroupTreeAsync(); } diff --git a/Tests/Engine/GroupAnalyserTests.cs b/Tests/Engine/GroupAnalyserTests.cs index d76e902..d7898d8 100644 --- a/Tests/Engine/GroupAnalyserTests.cs +++ b/Tests/Engine/GroupAnalyserTests.cs @@ -188,6 +188,6 @@ public async Task Can_Retrieve_Group_Structure_With_Functions_Async() var tree = await script.GetGroupTreeAsync(); - Assert.That(tree, Is.EqualTo(0)); + Assert.That(tree, Has.Count.EqualTo(3)); } } \ No newline at end of file