forked from SharpGenTools/SharpGenTools
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStructCodeGenerator.cs
More file actions
59 lines (49 loc) · 2.76 KB
/
Copy pathStructCodeGenerator.cs
File metadata and controls
59 lines (49 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using SharpGen.Model;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
namespace SharpGen.Generator;
internal sealed class StructCodeGenerator : MemberSingleCodeGeneratorBase<CsStruct>
{
public StructCodeGenerator(Ioc ioc) : base(ioc)
{
}
public override MemberDeclarationSyntax GenerateCode(CsStruct csElement)
{
var list = NewMemberList;
list.AddRange(csElement.InnerStructs, Generators.Struct);
list.AddRange(csElement.ExpressionConstants, Generators.ExpressionConstant);
list.AddRange(csElement.GuidConstants, Generators.GuidConstant);
list.AddRange(csElement.ResultConstants, Generators.ResultConstant);
var explicitLayout = !csElement.HasMarshalType && csElement.ExplicitLayout;
var generator = explicitLayout ? Generators.ExplicitOffsetField : Generators.AutoLayoutField;
list.AddRange(csElement.PublicFields, generator);
if (csElement.HasMarshalType && !csElement.HasCustomMarshal)
list.Add(csElement, Generators.NativeStruct);
var attributeList = !csElement.HasMarshalType
? SingletonList(NativeStructCodeGenerator.GenerateStructLayoutAttribute(csElement))
: default;
var modifierTokenList = csElement.VisibilityTokenList.Add(Token(SyntaxKind.PartialKeyword));
var identifier = Identifier(csElement.Name);
MemberDeclarationSyntax declaration = csElement.GenerateAsClass
? ClassDeclaration(
attributeList,
modifierTokenList,
identifier,
default,
default,
default,
List(list)
)
: StructDeclaration(
attributeList,
modifierTokenList,
identifier,
default,
default,
default,
List(list)
);
return AddDocumentationTrivia(declaration, csElement);
}
}