Add canonical instance encoding for constants

This commit is contained in:
Yoshi Askharoun
2024-07-07 15:34:27 -05:00
parent 7d408659dc
commit 3192685f82
5 changed files with 190 additions and 129 deletions
+79
View File
@@ -0,0 +1,79 @@
using Microsoft.Iris.Markup;
using System;
using System.Linq;
namespace Microsoft.Iris.Asm.Models;
public record ConstantDirective : Directive
{
public ConstantDirective(string name, QualifiedTypeName typeName, string constructor) : base("constant")
{
Name = name;
TypeName = typeName;
Constructor = constructor;
}
public string Name { get; }
public QualifiedTypeName TypeName { get; }
public string Constructor { get; }
public MarkupConstantPersistMode PersistMode { get; init; }
public override string ToString() => $"{base.ToString()} {Name} = {Constructor}";
}
public record StringEncodedConstantDirective : ConstantDirective
{
public StringEncodedConstantDirective(string name, QualifiedTypeName typeName, string content)
: base(name, typeName, $"{typeName}.str({content})")
{
Content = content;
PersistMode = MarkupConstantPersistMode.FromString;
}
public string Content { get; }
public override string ToString() => base.ToString();
}
public record BinaryEncodedConstantDirective : ConstantDirective
{
public BinaryEncodedConstantDirective(string name, QualifiedTypeName typeName, byte[] content)
: base(name, typeName, GetConstructor(typeName, content))
{
Content = content;
PersistMode = MarkupConstantPersistMode.Binary;
}
public byte[] Content { get; }
public override string ToString() => base.ToString();
private static string GetConstructor(QualifiedTypeName typeName, byte[] content)
{
string contentStr;
if (content.Length == 1)
contentStr = $"0x{content[0]:X2}";
else if (content.Length == 2)
contentStr = $"0x{BitConverter.ToUInt16(content, 0):X4}";
else if (content.Length == 4)
contentStr = $"0x{BitConverter.ToUInt32(content, 0):X8}";
else
contentStr = string.Join(", ", content.Select(b => $"0x{b:X2}"));
return $"{typeName}.bin({contentStr})";
}
}
public record CanonicalInstanceConstantDirective : ConstantDirective
{
public CanonicalInstanceConstantDirective(string name, QualifiedTypeName typeName, string canonicalName)
: base(name, typeName, $"{typeName}.can({canonicalName})")
{
CanonicalName = canonicalName;
PersistMode = MarkupConstantPersistMode.Canonical;
}
public string CanonicalName { get; }
public override string ToString() => base.ToString();
}