forked from ful-stackz/SharpCode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInterfaceBuilder.cs
More file actions
139 lines (124 loc) · 4.68 KB
/
InterfaceBuilder.cs
File metadata and controls
139 lines (124 loc) · 4.68 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
using System.Collections.Generic;
using System.Linq;
using Optional;
namespace SharpCode
{
/// <summary>
/// Provides functionality for building interface structures. <see cref="InterfaceBuilder"/> instances are
/// <b>not</b> immutable.
/// </summary>
public class InterfaceBuilder
{
private readonly Interface _interface = new Interface();
private readonly List<PropertyBuilder> _properties = new List<PropertyBuilder>();
internal InterfaceBuilder()
{
}
internal InterfaceBuilder(string name, AccessModifier accessModifier)
{
_interface.Name = name;
_interface.AccessModifier = accessModifier;
}
/// <summary>
/// Sets the access modifier of the interface being built.
/// </summary>
public InterfaceBuilder WithAccessModifier(AccessModifier accessModifier)
{
_interface.AccessModifier = accessModifier;
return this;
}
/// <summary>
/// Sets the name of the interface being built.
/// </summary>
public InterfaceBuilder WithName(string name)
{
_interface.Name = name;
return this;
}
/// <summary>
/// Adds a property to the interface being built.
/// </summary>
public InterfaceBuilder WithProperty(PropertyBuilder builder)
{
_properties.Add(builder);
return this;
}
/// <summary>
/// Adds a bunch of properties to the interface being built.
/// </summary>
public InterfaceBuilder WithProperties(params PropertyBuilder[] builders)
{
_properties.AddRange(builders);
return this;
}
/// <summary>
/// Adds a bunch of properties to the interface being built.
/// </summary>
public InterfaceBuilder WithProperties(IEnumerable<PropertyBuilder> builders)
{
_properties.AddRange(builders);
return this;
}
/// <summary>
/// Adds an interface to the list of interfaces that the interface being built implements.
/// </summary>
public InterfaceBuilder WithImplementedInterface(string name)
{
_interface.ImplementedInterfaces.Add(name);
return this;
}
/// <summary>
/// Adds XML summary documentation to the interface.
/// </summary>
/// <param name="summary">
/// The content of the summary documentation.
/// </param>
public InterfaceBuilder WithSummary(string summary)
{
_interface.Summary = Option.Some<string?>(summary);
return this;
}
/// <summary>
/// Returns the source code of the built interface.
/// </summary>
/// <param name="formatted">
/// Indicates whether to format the source code.
/// </param>
public string ToSourceCode(bool formatted = true) =>
Build().ToSourceCode(formatted);
/// <summary>
/// Returns the source code of the built interface.
/// </summary>
public override string ToString() =>
ToSourceCode();
internal Interface Build()
{
if (string.IsNullOrWhiteSpace(_interface.Name))
{
throw new MissingBuilderSettingException(
"Providing the name of the interface is required when building an interface.");
}
_interface.Properties.AddRange(
_properties.Select(builder => builder
.WithAccessModifier(AccessModifier.None)
.Build()));
if (_interface.Properties.Any(prop => prop.DefaultValue.HasValue))
{
throw new SyntaxException("Interface properties cannot have a default value. (CS8053)");
}
else if (_interface.Properties.Any(prop => !prop.Getter.HasValue && !prop.Setter.HasValue))
{
throw new SyntaxException("Interface properties should have at least a getter or a setter.");
}
else if (_interface.Properties.Any(prop => prop.Getter.Exists(expr => !string.IsNullOrWhiteSpace(expr))))
{
throw new SyntaxException("Interface properties can only define an auto implemented getter.");
}
else if (_interface.Properties.Any(prop => prop.Setter.Exists(expr => !string.IsNullOrWhiteSpace(expr))))
{
throw new SyntaxException("Interface properties can only define an auto implemented setter.");
}
return _interface;
}
}
}