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..e5d72ea
--- /dev/null
+++ b/Main/Program.cs
@@ -0,0 +1,35 @@
+using Hypercube.Utilities.Serialization.Hml;
+using Hypercube.Utilities.Serialization.Hml.Core;
+
+namespace Main;
+
+public static class Program
+{
+ public static void Main()
+ {
+ var data = new
+ {
+ Name = "ТесмиДев",
+ Age = 20,
+ Obj = new {},
+ Roles = new[]
+ {
+ "Programmer",
+ "Driver"
+ }
+ };
+
+ var options = new HmlSerializerOptions
+ {
+ Eol = false,
+ Indented = true,
+ IndentSize = 2
+ };
+
+ var serialized = HmlSerializer.Serialize(data, options);
+ var tokens = HmlLexer.Tokenize(serialized);
+
+ Console.WriteLine(HmlSerializer.Serialize(data, options));
+ Console.WriteLine(string.Join(Environment.NewLine, tokens));
+ }
+}
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.UnitTests/Serialization/HmlTests.cs b/src/Hypercube.Utilities.UnitTests/Serialization/HmlTests.cs
index 433a1af..7948326 100644
--- a/src/Hypercube.Utilities.UnitTests/Serialization/HmlTests.cs
+++ b/src/Hypercube.Utilities.UnitTests/Serialization/HmlTests.cs
@@ -117,7 +117,7 @@ public void SerializeTrailingComma()
""";
- var options = new HmlSerializerOptions { TrailingComma = false };
+ var options = new HmlSerializerOptions();
var serialized = HmlSerializer.Serialize(new Weapon(), options);
Assert.That(serialized, Is.EqualTo(expected));
diff --git a/src/Hypercube.Utilities/Helpers/ReflectionHelper.cs b/src/Hypercube.Utilities/Helpers/ReflectionHelper.cs
index fdd5b3a..fd99cb3 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;
@@ -249,6 +247,11 @@ public static IReadOnlyList GetValueInfos(BindingFlags? flags = nu
return GetValueInfos(typeof(T), flags);
}
+ public static IReadOnlyList GetValueInfos(object obj, BindingFlags? flags = null)
+ {
+ return GetValueInfos(obj.GetType(), flags);
+ }
+
public static IReadOnlyList GetValueInfos(Type type, BindingFlags? flags = null)
{
flags ??= DefaultFlags;
@@ -262,7 +265,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/Serialization/Hml/Core/CompilerTypes/BuildASTStackFrame.cs b/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/BuildASTStackFrame.cs
new file mode 100644
index 0000000..e2420a3
--- /dev/null
+++ b/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/BuildASTStackFrame.cs
@@ -0,0 +1,17 @@
+using System.Diagnostics;
+using Hypercube.Utilities.Serialization.Hml.Core.Nodes;
+
+namespace Hypercube.Utilities.Serialization.Hml.Core.CompilerTypes;
+
+[DebuggerDisplay("{Node} ({Parent})")]
+public record BuildAstStackFrame
+{
+ public readonly INode Node;
+ public readonly INode Parent;
+
+ public BuildAstStackFrame(INode node, INode parent)
+ {
+ Node = node;
+ Parent = parent;
+ }
+}
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..d138abb
--- /dev/null
+++ b/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/RenderASTStackFrame.cs
@@ -0,0 +1,16 @@
+using Hypercube.Utilities.Serialization.Hml.Core.Nodes;
+
+namespace Hypercube.Utilities.Serialization.Hml.Core.CompilerTypes;
+
+public record RenderAstStackFrame
+{
+ public readonly INode Node;
+
+ public int State;
+ public int Index;
+
+ public RenderAstStackFrame(INode node)
+ {
+ Node = node;
+ }
+}
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..b333cdf
--- /dev/null
+++ b/src/Hypercube.Utilities/Serialization/Hml/Core/CompilerTypes/RenderASTState.cs
@@ -0,0 +1,23 @@
+namespace Hypercube.Utilities.Serialization.Hml.Core.CompilerTypes;
+
+public class RenderAstState
+{
+ public readonly int IndentSize;
+
+ public string Indent { get; private set; } = string.Empty;
+
+ public RenderAstState(int indentSize)
+ {
+ IndentSize = indentSize;
+ }
+
+ public void PushIndent()
+ {
+ Indent += new string(' ', IndentSize);
+ }
+
+ public void PopIndent()
+ {
+ Indent = Indent.Remove(Indent.Length - IndentSize);
+ }
+}
diff --git a/src/Hypercube.Utilities/Serialization/Hml/Core/HmlCompiler.cs b/src/Hypercube.Utilities/Serialization/Hml/Core/HmlCompiler.cs
index d61c190..a486070 100644
--- a/src/Hypercube.Utilities/Serialization/Hml/Core/HmlCompiler.cs
+++ b/src/Hypercube.Utilities/Serialization/Hml/Core/HmlCompiler.cs
@@ -1,146 +1,152 @@
using System.Collections;
using System.Text;
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)
+ public static string Serialize(object? obj, HmlSerializerOptions options)
{
- var builder = new StringBuilder();
- var stack = new Stack();
-
- stack.Push(new StackItem(obj, 0, null));
+ return SerializeToBuilder(obj, options).ToString();
+ }
+
+ public static StringBuilder SerializeToBuilder(object? obj, HmlSerializerOptions options)
+ {
+ var stack = new Stack