Пример #1
0
    private static FieldDeclarationSyntax EmitStructFieldFixedBuffer(
        CSharpStructField field)
    {
        string typeName;

        if (field.IsWrapped)
        {
            typeName = field.Type.AlignOf switch
            {
                1 => "byte",
                2 => "ushort",
                4 => "uint",
                8 => "ulong",
                _ => throw new InvalidOperationException()
            };
        }
        else
        {
            typeName = field.Type.Name ?? string.Empty;
        }

        var code = $@"
[FieldOffset({field.Offset})] // size = {field.Type.SizeOf}, padding = {field.Padding}
public fixed {typeName} {field.BackingFieldName}[{field.Type.SizeOf}/{field.Type.AlignOf}]; // {field.Type.OriginalName}
".Trim();

        return(ParseMemberCode <FieldDeclarationSyntax>(code));
    }
Пример #2
0
    private static FieldDeclarationSyntax StructField(CSharpStructField field)
    {
        var code = $@"
[FieldOffset({field.Offset})] // size = {field.Type.SizeOf}, padding = {field.Padding}
public {field.Type.Name} {field.Name};
".Trim();

        var member = ParseMemberCode <FieldDeclarationSyntax>(code);

        return(member);
    }
Пример #3
0
    private PropertyDeclarationSyntax StructFieldFixedBufferProperty(
        string structName,
        CSharpStructField field)
    {
        string code;

        if (field.Type.Name == "CString")
        {
            code = $@"
public string {field.Name}
{{
	get
	{{
		fixed ({structName}*@this = &this)
		{{
			var pointer = &@this->{field.BackingFieldName}[0];
            var cString = new CString(pointer);
            return Runtime.CStrings.String(cString);
		}}
	}}
}}
".Trim();
        }
        else if (field.Type.Name == "CStringWide")
        {
            code = $@"
public string {field.Name}
{{
	get
	{{
		fixed ({structName}*@this = &this)
		{{
			var pointer = &@this->{field.BackingFieldName}[0];
            var cString = new CStringWide(pointer);
            return Runtime.CStrings.StringWide(cString);
		}}
	}}
}}
".Trim();
        }
        else
        {
            var fieldTypeName = field.Type.Name ?? string.Empty;
            var elementType   = fieldTypeName[..^ 1];