-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathMethodSignature.cs
More file actions
124 lines (110 loc) · 4.17 KB
/
MethodSignature.cs
File metadata and controls
124 lines (110 loc) · 4.17 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
namespace M31.FluentApi.Generator.CodeBuilding;
internal class MethodSignature : ICode
{
private MethodSignature(
string? returnType,
string methodName,
string? explicitInterfacePrefix,
bool isStandaloneSignature)
{
ReturnType = returnType;
MethodName = methodName;
ExplicitInterfacePrefix = explicitInterfacePrefix;
IsStandaloneSignature = isStandaloneSignature;
Generics = new Generics();
Parameters = new Parameters();
Modifiers = new Modifiers();
Attributes = new List<string>();
}
private MethodSignature(MethodSignature methodSignature, bool isStandaloneSignature)
{
ReturnType = methodSignature.ReturnType;
MethodName = methodSignature.MethodName;
ExplicitInterfacePrefix = methodSignature.ExplicitInterfacePrefix;
IsStandaloneSignature = isStandaloneSignature;
Generics = new Generics(methodSignature.Generics);
Parameters = new Parameters(methodSignature.Parameters);
Modifiers = new Modifiers(methodSignature.Modifiers);
Attributes = new List<string>(methodSignature.Attributes);
}
internal static MethodSignature Create(
string returnType,
string methodName,
string? prefix,
bool isStandaloneSignature)
{
return new MethodSignature(returnType, methodName, prefix, isStandaloneSignature);
}
internal static MethodSignature CreateConstructorSignature(string className)
{
return new MethodSignature(null, className, null, false);
}
internal string? ReturnType { get; }
internal string MethodName { get; }
internal string? ExplicitInterfacePrefix { get; }
internal bool IsStandaloneSignature { get; }
internal Generics Generics { get; }
internal Parameters Parameters { get; }
internal Modifiers Modifiers { get; }
internal List<string> Attributes { get; }
internal bool IsSignatureForMethodBody => !IsStandaloneSignature;
internal bool IsExplicitInterfaceImplementation => ExplicitInterfacePrefix != null;
internal bool IsConstructor => ReturnType == null;
internal void AddGenericParameter(string parameter, IEnumerable<string> constraints)
{
Generics.AddGenericParameter(parameter, constraints);
}
internal void AddParameter(string type, string name)
{
AddParameter(new Parameter(type, name));
}
internal void AddParameter(Parameter parameter)
{
Parameters.AddParameter(parameter);
}
internal void AddModifiers(params string[] modifiers)
{
Modifiers.Add(modifiers);
}
internal void AddAttribute(string attribute)
{
Attributes.Add(attribute);
}
internal MethodSignature ToSignatureForInterface()
{
return new MethodSignature(this, true);
}
internal MethodSignature ToSignatureForMethodBody()
{
return new MethodSignature(this, false);
}
public CodeBuilder AppendCode(CodeBuilder codeBuilder)
{
codeBuilder
.AppendLines(Attributes)
.StartLine()
.Append(
Modifiers,
Modifiers.Contains("extern") || (IsSignatureForMethodBody && !IsExplicitInterfaceImplementation))
.Append($"{ReturnType} ", ReturnType != null)
.Append($"{ExplicitInterfacePrefix}.", IsSignatureForMethodBody && IsExplicitInterfaceImplementation)
.Append(MethodName)
.Append(Generics.Parameters)
.Append(Parameters, !(IsSignatureForMethodBody && IsExplicitInterfaceImplementation))
.Append(Parameters.WithoutDefaultValues(), IsSignatureForMethodBody && IsExplicitInterfaceImplementation);
if (Generics.Constraints.Count == 0 || (IsSignatureForMethodBody && IsExplicitInterfaceImplementation))
{
return codeBuilder.Append(IsStandaloneSignature ? ";" : null).EndLine();
}
else
{
return codeBuilder
.EndLine()
.Indent()
.Append(Generics.Constraints)
.Append(IsStandaloneSignature ? ";" : null)
.EndLine()
.Unindent();
}
}
}