-
Notifications
You must be signed in to change notification settings - Fork 13
/
OnReadyGetResourceAddition.cs
73 lines (62 loc) · 1.76 KB
/
OnReadyGetResourceAddition.cs
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using GodotOnReady.Generator.Util;
using Microsoft.CodeAnalysis.CSharp;
using System;
namespace GodotOnReady.Generator.Additions
{
public class OnReadyGetResourceAddition : OnReadyGetAddition
{
public OnReadyGetResourceAddition(MemberAttributeSite site) : base(site) { }
private bool IsGeneratingAssignment => Path is { Length: >0 };
public override Action<SourceStringBuilder>? DeclarationWriter => g =>
{
string export = Path is not { Length: >0 } || Export
? "[Export] "
: "";
g.Line();
g.Line(export, "public ", Member.Type.ToFullDisplayString(), " ", ExportPropertyName);
g.BlockBrace(() =>
{
g.Line("get => ", Member.Name, ";");
g.Line("set { _hasBeenSet", Member.Name, " = true; ", Member.Name, " = value; }");
});
g.Line("private bool _hasBeenSet", Member.Name, ";");
};
public override Action<SourceStringBuilder>? ConstructorStatementWriter =>
IsGeneratingAssignment
? g =>
{
g.Line("if (Engine.EditorHint)");
g.BlockBrace(() =>
{
WriteAssignment(g);
});
}
: null;
public override Action<SourceStringBuilder>? OnReadyStatementWriter =>
IsGeneratingAssignment || !OrNull
? g =>
{
g.Line();
if (IsGeneratingAssignment)
{
g.Line("if (!_hasBeenSet", Member.Name, ")");
g.BlockBrace(() =>
{
WriteAssignment(g);
});
}
if (!OrNull)
{
WriteMemberNullCheck(g, ExportPropertyName);
}
}
: null;
private void WriteAssignment(SourceStringBuilder g)
{
g.Line(Member.Name, " = GD.Load",
"<", Member.Type.ToFullDisplayString(), ">",
"(", SyntaxFactory.Literal(Path ?? "").ToString(), ");");
}
protected virtual string ExportPropertyName => SuffixlessExportPropertyName + "Resource";
}
}