forked from ful-stackz/SharpCode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathClassBuilder.cs
More file actions
184 lines (164 loc) · 5.58 KB
/
ClassBuilder.cs
File metadata and controls
184 lines (164 loc) · 5.58 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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
using System.Collections.Generic;
using System.Linq;
using Optional;
namespace SharpCode
{
/// <summary>
/// Provides functionality for building class structures. <see cref="ClassBuilder"/> instances are <b>not</b>
/// immutable.
/// </summary>
public class ClassBuilder
{
private readonly Class _class = new Class();
private readonly List<FieldBuilder> _fields = new List<FieldBuilder>();
private readonly List<PropertyBuilder> _properties = new List<PropertyBuilder>();
private readonly List<ConstructorBuilder> _constructors = new List<ConstructorBuilder>();
internal ClassBuilder()
{
}
internal ClassBuilder(AccessModifier accessModifier, string name)
{
_class.AccessModifier = accessModifier;
_class.Name = name;
}
/// <summary>
/// Sets the access modifier of the class being built.
/// </summary>
public ClassBuilder WithAccessModifier(AccessModifier accessModifier)
{
_class.AccessModifier = accessModifier;
return this;
}
/// <summary>
/// Sets the name of the class being built.
/// </summary>
public ClassBuilder WithName(string name)
{
_class.Name = name;
return this;
}
/// <summary>
/// Sets the class that the class being built inherits from.
/// </summary>
public ClassBuilder WithInheritedClass(string name)
{
_class.InheritedClass = Option.Some(name);
return this;
}
/// <summary>
/// Adds an interface to the list of interfaces that the class being built implements.
/// </summary>
public ClassBuilder WithImplementedInterface(string name)
{
_class.ImplementedInterfaces.Add(name);
return this;
}
/// <summary>
/// Adds XML summary documentation to the class.
/// </summary>
/// <param name="summary">
/// The content of the summary documentation.
/// </param>
public ClassBuilder WithSummary(string summary)
{
_class.Summary = Option.Some<string?>(summary);
return this;
}
/// <summary>
/// Adds a field to the class being built.
/// </summary>
public ClassBuilder WithField(FieldBuilder builder)
{
_fields.Add(builder);
return this;
}
/// <summary>
/// Adds a bunch of fields to the class being built.
/// </summary>
public ClassBuilder WithFields(params FieldBuilder[] builders)
{
_fields.AddRange(builders);
return this;
}
/// <summary>
/// Adds a property to the class being built.
/// </summary>
public ClassBuilder WithProperty(PropertyBuilder builder)
{
_properties.Add(builder);
return this;
}
/// <summary>
/// Adds a bunch of properties to the class being built.
/// </summary>
public ClassBuilder WithProperties(params PropertyBuilder[] builders)
{
_properties.AddRange(builders);
return this;
}
/// <summary>
/// Adds a bunch of properties to the class being built.
/// </summary>
public ClassBuilder WithProperties(IEnumerable<PropertyBuilder> builders)
{
_properties.AddRange(builders);
return this;
}
/// <summary>
/// Adds a constructor to the class being built.
/// </summary>
public ClassBuilder WithConstructor(ConstructorBuilder builder)
{
_constructors.Add(builder);
return this;
}
/// <summary>
/// Sets whether the class being built should be static or not.
/// </summary>
/// <param name="makeStatic">
/// Indicates whether the class should be static or not.
/// </param>
public ClassBuilder MakeStatic(bool makeStatic = true)
{
_class.IsStatic = makeStatic;
return this;
}
/// <summary>
/// Returns the source code of the built class.
/// </summary>
/// <param name="formatted">
/// Indicates whether to format the source code.
/// </param>
public string ToSourceCode(bool formatted = true)
{
return Build().ToSourceCode(formatted);
}
/// <summary>
/// Returns the source code of the built class.
/// </summary>
public override string ToString()
{
return ToSourceCode();
}
internal Class Build()
{
if (string.IsNullOrWhiteSpace(_class.Name))
{
throw new MissingBuilderSettingException(
"Providing the name of the class is required when building a class.");
}
else if (_class.IsStatic && _constructors.Count > 1)
{
throw new SyntaxException("Static classes can have only 1 constructor.");
}
_class.Fields.AddRange(_fields.Select(builder => builder.Build()));
_class.Properties.AddRange(_properties.Select(builder => builder.Build()));
_class.Constructors.AddRange(
_constructors.Select(builder => builder
.WithName(_class.Name!)
.MakeStatic(_class.IsStatic)
.Build()));
return _class;
}
}
}