diff --git a/Hypercube.Utilities.sln b/Hypercube.Utilities.sln
index 0a62cca..0b7609f 100644
--- a/Hypercube.Utilities.sln
+++ b/Hypercube.Utilities.sln
@@ -8,6 +8,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hypercube.Utilities.Analyze
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hypercube.Utilities.Analyzers.CodeFix", "src\Hypercube.Utilities.Analyzers.CodeFix\Hypercube.Utilities.Analyzers.CodeFix.csproj", "{33E0A347-BAE3-43A1-9D6B-E5AF033CCE16}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Main", "Main\Main.csproj", "{6BB9C8F4-4BA5-45EA-8924-1DE5771DF4BF}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -30,5 +32,9 @@ Global
{33E0A347-BAE3-43A1-9D6B-E5AF033CCE16}.Debug|Any CPU.Build.0 = Debug|Any CPU
{33E0A347-BAE3-43A1-9D6B-E5AF033CCE16}.Release|Any CPU.ActiveCfg = Release|Any CPU
{33E0A347-BAE3-43A1-9D6B-E5AF033CCE16}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6BB9C8F4-4BA5-45EA-8924-1DE5771DF4BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6BB9C8F4-4BA5-45EA-8924-1DE5771DF4BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6BB9C8F4-4BA5-45EA-8924-1DE5771DF4BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6BB9C8F4-4BA5-45EA-8924-1DE5771DF4BF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
diff --git a/Main/Main.csproj b/Main/Main.csproj
new file mode 100644
index 0000000..fcb2d26
--- /dev/null
+++ b/Main/Main.csproj
@@ -0,0 +1,14 @@
+
+
+
+ Exe
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/Main/Program.cs b/Main/Program.cs
new file mode 100644
index 0000000..66a0f3c
--- /dev/null
+++ b/Main/Program.cs
@@ -0,0 +1,13 @@
+using Hypercube.Utilities.Serialization.Hml;
+
+namespace Main;
+
+public static class Program
+{
+ public static void Main()
+ {
+ var data = new { Name = "ТесмиДев", Age = 20, Da = new {}, Roles = new[] {"Programmer", "Driver"} };
+ //var data = new[] { new[] { "Programmer" }, new[] { "Programmer" }};
+ Console.WriteLine(HmlSerializer.Serialize(data, new HmlSerializerOptions() { WriteIndented = true }));
+ }
+}
\ No newline at end of file
diff --git a/src/Hypercube.Utilities.Analyzers.CodeFix/DependencyCodeFixProvider.cs b/src/Hypercube.Utilities.Analyzers.CodeFix/DependencyCodeFixProvider.cs
index c5122dd..d488ff7 100644
--- a/src/Hypercube.Utilities.Analyzers.CodeFix/DependencyCodeFixProvider.cs
+++ b/src/Hypercube.Utilities.Analyzers.CodeFix/DependencyCodeFixProvider.cs
@@ -5,7 +5,7 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Editing;
-namespace Hypercube.Analyzers.CodeFix;
+namespace Hypercube.Utilities.Analyzers.CodeFix;
[Shared, ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(DependencyCodeFixProvider))]
public sealed class DependencyCodeFixProvider : CodeFixProvider
diff --git a/src/Hypercube.Utilities.Analyzers/DependencyAnalyzer.cs b/src/Hypercube.Utilities.Analyzers/DependencyAnalyzer.cs
index 65d0ee6..fb0a5dd 100644
--- a/src/Hypercube.Utilities.Analyzers/DependencyAnalyzer.cs
+++ b/src/Hypercube.Utilities.Analyzers/DependencyAnalyzer.cs
@@ -4,7 +4,7 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;
-namespace Hypercube.Analyzers;
+namespace Hypercube.Utilities.Analyzers;
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class DependencyAnalyzer : DiagnosticAnalyzer
diff --git a/src/Hypercube.Utilities.Analyzers/DependencySuppressor.cs b/src/Hypercube.Utilities.Analyzers/DependencySuppressor.cs
index f84c20b..31e6b79 100644
--- a/src/Hypercube.Utilities.Analyzers/DependencySuppressor.cs
+++ b/src/Hypercube.Utilities.Analyzers/DependencySuppressor.cs
@@ -3,7 +3,7 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;
-namespace Hypercube.Analyzers;
+namespace Hypercube.Utilities.Analyzers;
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class DependencySuppressor : DiagnosticSuppressor
diff --git a/src/Hypercube.Utilities/Helpers/ReflectionHelper.cs b/src/Hypercube.Utilities/Helpers/ReflectionHelper.cs
index fdd5b3a..6ea88ba 100644
--- a/src/Hypercube.Utilities/Helpers/ReflectionHelper.cs
+++ b/src/Hypercube.Utilities/Helpers/ReflectionHelper.cs
@@ -1,7 +1,5 @@
using System.Reflection;
-using System.Xml.XPath;
using Hypercube.Utilities.Extensions;
-using Hypercube.Utilities.Serialization.Hml.Core.Nodes.Value;
using JetBrains.Annotations;
namespace Hypercube.Utilities.Helpers;
@@ -262,7 +260,7 @@ public static IReadOnlyList GetValueInfos(Type type, BindingFlags? fl
foreach (var info in type.GetFields((BindingFlags) flags))
{
- if (info.Name.Contains("k__BackingField"))
+ if (info.Name.Contains("k__BackingField") || info.Name.Contains("i__Field"))
continue;
if (Attribute.IsDefined(info, typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute)))
diff --git a/src/Hypercube.Utilities/Hypercube.Utilities.csproj b/src/Hypercube.Utilities/Hypercube.Utilities.csproj
index ef57b3b..73de427 100644
--- a/src/Hypercube.Utilities/Hypercube.Utilities.csproj
+++ b/src/Hypercube.Utilities/Hypercube.Utilities.csproj
@@ -15,5 +15,9 @@
+
+
+
+
diff --git a/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/BuildASTStackFrame.cs b/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/BuildASTStackFrame.cs
new file mode 100644
index 0000000..cd55a54
--- /dev/null
+++ b/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/BuildASTStackFrame.cs
@@ -0,0 +1,9 @@
+using Hypercube.Utilities.Serialization.Hml.Core.Nodes;
+
+namespace Hypercube.Utilities.Serialization.Hml.Core.CompilerTypes;
+
+public record BuildAstStackFrame()
+{
+ public required Node Node;
+ public required Node Parent;
+}
\ No newline at end of file
diff --git a/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/RenderASTStackFrame.cs b/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/RenderASTStackFrame.cs
new file mode 100644
index 0000000..f9e288f
--- /dev/null
+++ b/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/RenderASTStackFrame.cs
@@ -0,0 +1,15 @@
+using Hypercube.Utilities.Serialization.Hml.Core.Nodes;
+
+namespace Hypercube.Utilities.Serialization.Hml.Core.CompilerTypes;
+
+public record RenderAstStackFrame
+{
+ public INode Node;
+ public int State;
+ public int Index;
+
+ public RenderAstStackFrame(INode node)
+ {
+ Node = node;
+ }
+}
\ No newline at end of file
diff --git a/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/RenderASTState.cs b/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/RenderASTState.cs
new file mode 100644
index 0000000..7fd4972
--- /dev/null
+++ b/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/RenderASTState.cs
@@ -0,0 +1,17 @@
+namespace Hypercube.Utilities.Serialization.Hml.Core.CompilerTypes;
+
+public class RenderAstState
+{
+ public string Indent { get; private set; } = string.Empty;
+ public int IndentSize { get; init; }
+
+ public void PushIndent()
+ {
+ Indent += new string(' ', IndentSize);
+ }
+
+ public void PopIndent()
+ {
+ Indent = Indent.Remove(Indent.Length - IndentSize);
+ }
+}
\ No newline at end of file
diff --git a/src/Hypercube.Utilities/Serialization/Hml/Core/HmlCompiler.cs b/src/Hypercube.Utilities/Serialization/Hml/Core/HmlCompiler.cs
index d61c190..b1aac68 100644
--- a/src/Hypercube.Utilities/Serialization/Hml/Core/HmlCompiler.cs
+++ b/src/Hypercube.Utilities/Serialization/Hml/Core/HmlCompiler.cs
@@ -1,123 +1,119 @@
using System.Collections;
using System.Text;
+using System.Text.Json;
using Hypercube.Utilities.Helpers;
+using Hypercube.Utilities.Serialization.Hml.Core.CompilerTypes;
+using Hypercube.Utilities.Serialization.Hml.Core.Nodes;
+using Hypercube.Utilities.Serialization.Hml.Core.Nodes.Value;
+using Hypercube.Utilities.Serialization.Hml.Core.Nodes.Value.Primitives;
namespace Hypercube.Utilities.Serialization.Hml.Core;
public static class HmlCompiler
{
- private record StackItem(object? Obj, int Indent, string? Name, bool IsClosing = false, bool Enumerated = false);
-
public static StringBuilder Serialize(object? obj, HmlSerializerOptions options)
{
- var builder = new StringBuilder();
- var stack = new Stack();
-
- stack.Push(new StackItem(obj, 0, null));
+ var stack = new Stack