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)); }
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); }
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];