Skip to content

Commit 91bec3d

Browse files
authored
refactor: remove dead code in delegate source generation (#313)
This PR removes dead code related to delegate source generation and consolidates some test methods. The main focus is on cleaning up unused methods in the source generator and reorganizing test cases for better structure. ### Key Changes - Removed unused delegate-related source generation methods (`AppendDelegateExtensions`, `AppendMockExtensions`) - Add missing source generation tests - Eliminated unused helper method `GetAllClasses()` from `MockClass` - Reorganized test methods by moving several tests to earlier positions in the test file
1 parent 84c7460 commit 91bec3d

6 files changed

Lines changed: 306 additions & 417 deletions

File tree

Source/Mockolate.SourceGenerators/Entities/MockClass.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,4 @@ public MockClass(ITypeSymbol[] types) : base(types[0])
3333

3434
public IEnumerable<Class> DistinctAdditionalImplementations()
3535
=> AdditionalImplementations.Distinct().Where(x => x.ClassFullName != ClassFullName);
36-
37-
internal IEnumerable<Class> GetAllClasses()
38-
{
39-
yield return this;
40-
foreach (Class implementation in DistinctAdditionalImplementations())
41-
{
42-
yield return implementation;
43-
}
44-
}
4536
}

Source/Mockolate.SourceGenerators/MockGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ private static void Execute(ImmutableArray<MockClass> mocksToGenerate, SourcePro
5454
{
5555
context.AddSource($"MockFor{mockToGenerate.Name}Extensions.g.cs",
5656
SourceText.From(
57-
Sources.Sources.ForMockCombinationExtensions(mockToGenerate.Name, mockToGenerate.MockClass),
57+
Sources.Sources.ForMockCombinationExtensions(mockToGenerate.Name, mockToGenerate.MockClass, mockToGenerate.MockClass.DistinctAdditionalImplementations()),
5858
Encoding.UTF8));
5959
}
6060
}
Lines changed: 40 additions & 254 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
using System.Text;
2-
using Microsoft.CodeAnalysis;
32
using Mockolate.SourceGenerators.Entities;
4-
using Type = Mockolate.SourceGenerators.Entities.Type;
53

64
namespace Mockolate.SourceGenerators.Sources;
75

86
#pragma warning disable S3776 // Cognitive Complexity of methods should not be too high
97
internal static partial class Sources
108
{
11-
public static string ForMockCombinationExtensions(string name, MockClass mockClass)
9+
public static string ForMockCombinationExtensions(string name, MockClass mockClass,
10+
IEnumerable<Class> distinctAdditionalImplementations)
1211
{
1312
StringBuilder sb = InitializeBuilder([
1413
"Mockolate.Exceptions",
@@ -56,282 +55,69 @@ private static Mock<T> GetMockOrThrow<T>(T subject)
5655
""");
5756
sb.AppendLine();
5857

59-
if (mockClass.Delegate is not null)
58+
sb.Append("\textension(").Append(mockClass.ClassFullName).AppendLine(" subject)");
59+
sb.AppendLine("\t{");
60+
61+
HashSet<string> usedNames = [];
62+
foreach (Class @class in distinctAdditionalImplementations)
6063
{
61-
AppendDelegateExtensions(sb, mockClass, mockClass.Delegate);
64+
AppendAdditionalMockExtensions(sb, @class, usedNames);
6265
}
63-
else
64-
{
65-
if (mockClass.AdditionalImplementations.Any())
66-
{
67-
AppendMockExtensions(sb, mockClass);
68-
}
6966

70-
sb.AppendLine();
71-
}
67+
sb.AppendLine("\t}");
7268

7369
sb.AppendLine("}");
7470
sb.AppendLine("#nullable disable");
7571
return sb.ToString();
7672
}
7773

78-
private static void AppendDelegateExtensions(StringBuilder sb, MockClass mockClass, Method method)
74+
private static void AppendAdditionalMockExtensions(StringBuilder sb, Class @class, HashSet<string> usedNames)
7975
{
80-
#region Setup
81-
82-
sb.Append("\textension(IMockSetup<").Append(mockClass.ClassFullName).AppendLine("> setup)");
83-
sb.AppendLine("\t{");
84-
sb.Append("\t\t/// <summary>").AppendLine();
85-
sb.Append("\t\t/// Sets up the delegate <see cref=\"").Append(mockClass.ClassFullName.EscapeForXmlDoc())
86-
.Append("\" /> on the mock.").AppendLine();
87-
sb.Append("\t\t/// </summary>").AppendLine();
88-
if (method.ReturnType != Type.Void)
89-
{
90-
sb.Append("\t\tpublic ReturnMethodSetup<")
91-
.Append(method.ReturnType.Fullname);
92-
foreach (MethodParameter parameter in method.Parameters)
93-
{
94-
sb.Append(", ").Append(parameter.Type.Fullname);
95-
}
96-
97-
sb.Append("> Delegate(");
98-
}
99-
else
100-
{
101-
sb.Append("\t\tpublic VoidMethodSetup");
102-
if (method.Parameters.Count > 0)
103-
{
104-
sb.Append('<');
105-
int index = 0;
106-
foreach (MethodParameter parameter in method.Parameters)
107-
{
108-
if (index++ > 0)
109-
{
110-
sb.Append(", ");
111-
}
112-
113-
sb.Append(parameter.Type.Fullname);
114-
}
115-
116-
sb.Append('>');
117-
}
118-
119-
sb.Append(" Delegate(");
120-
}
121-
122-
int i = 0;
123-
foreach (MethodParameter parameter in method.Parameters)
124-
{
125-
if (i++ > 0)
126-
{
127-
sb.Append(", ");
128-
}
129-
130-
sb.Append(parameter.RefKind switch
131-
{
132-
RefKind.Ref => "IRefParameter<",
133-
RefKind.Out => "IOutParameter<",
134-
_ => "IParameter<",
135-
}).Append(parameter.Type.Fullname)
136-
.Append('>');
137-
if (parameter.RefKind is not RefKind.Ref and not RefKind.Out)
138-
{
139-
sb.Append('?');
140-
}
141-
142-
sb.Append(' ').Append(parameter.Name);
143-
}
144-
145-
sb.Append(")");
146-
if (method.GenericParameters is not null && method.GenericParameters.Value.Count > 0)
147-
{
148-
foreach (GenericParameter gp in method.GenericParameters.Value)
149-
{
150-
gp.AppendWhereConstraint(sb, "\t\t\t");
151-
}
152-
}
153-
15476
sb.AppendLine();
155-
156-
sb.AppendLine("\t\t{");
157-
158-
if (method.ReturnType != Type.Void)
77+
int nameSuffix = 1;
78+
string name = @class.ClassName.Replace('.', '_');
79+
while (!usedNames.Add(name))
15980
{
160-
sb.Append("\t\t\tvar methodSetup = new ReturnMethodSetup<")
161-
.Append(method.ReturnType.Fullname);
162-
foreach (MethodParameter parameter in method.Parameters)
163-
{
164-
sb.Append(", ").Append(parameter.Type.Fullname);
165-
}
166-
167-
sb.Append(">");
168-
}
169-
else
170-
{
171-
sb.Append("\t\t\tvar methodSetup = new VoidMethodSetup");
172-
173-
if (method.Parameters.Count > 0)
174-
{
175-
sb.Append('<');
176-
int index = 0;
177-
foreach (MethodParameter parameter in method.Parameters)
178-
{
179-
if (index++ > 0)
180-
{
181-
sb.Append(", ");
182-
}
183-
184-
sb.Append(parameter.Type.Fullname);
185-
}
186-
187-
sb.Append('>');
188-
}
189-
}
190-
191-
sb.Append("(\"").Append(mockClass.ClassFullName).Append('.').Append(method.Name).Append("\"");
192-
foreach (MethodParameter parameter in method.Parameters)
193-
{
194-
sb.Append(", new NamedParameter(\"").Append(parameter.Name).Append("\", ").Append(parameter.Name);
195-
if (parameter.RefKind is not RefKind.Ref and not RefKind.Out)
196-
{
197-
sb.Append(" ?? It.IsNull<").Append(parameter.Type.Fullname)
198-
.Append(">()");
199-
}
200-
201-
sb.Append(")");
81+
name = $"{@class.ClassName.Replace('.', '_')}__{++nameSuffix}";
20282
}
20383

204-
sb.Append(");").AppendLine();
205-
sb.AppendLine("\t\t\tif (setup is IMockSetup mockSetup)");
206-
sb.AppendLine("\t\t\t{");
207-
sb.AppendLine("\t\t\t\tmockSetup.RegisterMethod(methodSetup);");
208-
sb.AppendLine("\t\t\t}");
209-
sb.AppendLine("\t\t\treturn methodSetup;");
210-
sb.AppendLine("\t\t}");
211-
sb.AppendLine("\t}");
212-
213-
#endregion
214-
215-
sb.AppendLine();
216-
217-
#region Verify
218-
219-
sb.Append("\textension(IMockVerify<").Append(mockClass.ClassFullName).Append(", Mock<")
220-
.Append(mockClass.ClassFullName).Append(">>").Append(" verify)").AppendLine();
221-
sb.AppendLine("\t{");
22284
sb.Append("\t\t/// <summary>").AppendLine();
223-
sb.Append("\t\t/// Verifies the delegate invocations for <see cref=\"")
224-
.Append(mockClass.ClassFullName.EscapeForXmlDoc()).Append("\"/> on the mock.").AppendLine();
85+
sb.Append("\t\t/// Sets up the mock for <see cref=\"").Append(@class.ClassFullName.EscapeForXmlDoc())
86+
.Append("\" />")
87+
.AppendLine();
22588
sb.Append("\t\t/// </summary>").AppendLine();
226-
sb.Append("\t\tpublic VerificationResult<").Append(mockClass.ClassFullName).Append("> Invoked(");
227-
i = 0;
228-
foreach (MethodParameter parameter in method.Parameters)
89+
sb.Append("\t\tpublic IMockSetup<").Append(@class.ClassFullName).Append("> Setup").Append(name)
90+
.Append("Mock")
91+
.AppendLine();
92+
sb.Append("\t\t\t=> new Mock<").Append(@class.ClassFullName).Append(">((").Append(@class.ClassFullName)
93+
.Append(")subject, GetMockOrThrow(subject).Registrations);")
94+
.AppendLine();
95+
if (@class.AllEvents().Any())
22996
{
230-
if (i++ > 0)
231-
{
232-
sb.Append(", ");
233-
}
234-
235-
sb.Append(parameter.RefKind switch
236-
{
237-
RefKind.Ref => "IVerifyRefParameter<",
238-
RefKind.Out => "IVerifyOutParameter<",
239-
_ => "IParameter<",
240-
}).Append(parameter.Type.Fullname)
241-
.Append('>');
242-
if (parameter.RefKind is not RefKind.Ref and not RefKind.Out)
243-
{
244-
sb.Append('?');
245-
}
246-
247-
sb.Append(' ').Append(parameter.Name);
248-
}
249-
250-
sb.Append(")").AppendLine();
251-
sb.Append("\t\t{").AppendLine();
252-
sb.Append("\t\t\tIMockInvoked<IMockVerify<").Append(mockClass.ClassFullName).Append(", Mock<")
253-
.Append(mockClass.ClassFullName).Append(">>> invoked = (IMockInvoked<IMockVerify<")
254-
.Append(mockClass.ClassFullName).Append(", Mock<")
255-
.Append(mockClass.ClassFullName).Append(">>>)verify;").AppendLine();
256-
sb.Append("\t\t\treturn invoked.Method(\"")
257-
.Append(mockClass.ClassFullName).Append('.').Append(method.Name)
258-
.Append("\"");
259-
260-
foreach (MethodParameter parameter in method.Parameters)
261-
{
262-
sb.Append(", ");
263-
sb.Append(parameter.Name);
264-
if (parameter.RefKind is not RefKind.Ref and not RefKind.Out)
265-
{
266-
sb.Append(" ?? It.IsNull<").Append(parameter.Type.Fullname)
267-
.Append(">()");
268-
}
269-
}
270-
271-
sb.AppendLine(");");
272-
sb.Append("\t\t}").AppendLine();
273-
274-
sb.AppendLine("\t}");
275-
276-
#endregion
277-
}
278-
279-
private static void AppendMockExtensions(StringBuilder sb, MockClass mockClass)
280-
{
281-
sb.Append("\textension(").Append(mockClass.ClassFullName).AppendLine(" subject)");
282-
sb.AppendLine("\t{");
283-
284-
HashSet<string> usedNames = [];
285-
foreach (Class? @class in mockClass.DistinctAdditionalImplementations())
286-
{
287-
sb.AppendLine();
288-
int nameSuffix = 1;
289-
string name = @class.ClassName.Replace('.', '_');
290-
while (!usedNames.Add(name))
291-
{
292-
name = $"{@class.ClassName.Replace('.', '_')}__{++nameSuffix}";
293-
}
294-
295-
sb.Append("\t\t/// <summary>").AppendLine();
296-
sb.Append("\t\t/// Sets up the mock for <see cref=\"").Append(@class.ClassFullName.EscapeForXmlDoc())
297-
.Append("\" />")
298-
.AppendLine();
299-
sb.Append("\t\t/// </summary>").AppendLine();
300-
sb.Append("\t\tpublic IMockSetup<").Append(@class.ClassFullName).Append("> Setup").Append(name)
301-
.Append("Mock")
302-
.AppendLine();
303-
sb.Append("\t\t\t=> new Mock<").Append(@class.ClassFullName).Append(">((").Append(@class.ClassFullName)
304-
.Append(")subject, GetMockOrThrow(subject).Registrations);")
305-
.AppendLine();
306-
if (@class.AllEvents().Any())
307-
{
308-
sb.AppendLine();
309-
sb.Append("\t\t/// <summary>").AppendLine();
310-
sb.Append("\t\t/// Raise events on the mock for <see cref=\"")
311-
.Append(@class.ClassFullName.EscapeForXmlDoc())
312-
.Append("\" />").AppendLine();
313-
sb.Append("\t\t/// </summary>").AppendLine();
314-
sb.Append("\t\tpublic IMockRaises<").Append(@class.ClassFullName).Append("> RaiseOn")
315-
.Append(name).Append("Mock").AppendLine();
316-
sb.Append("\t\t\t=> new Mock<").Append(@class.ClassFullName).Append(">((").Append(@class.ClassFullName)
317-
.Append(")subject, GetMockOrThrow(subject).Registrations);")
318-
.AppendLine();
319-
}
320-
32197
sb.AppendLine();
32298
sb.Append("\t\t/// <summary>").AppendLine();
323-
sb.Append("\t\t/// Verifies the interactions with the mocked subject of <see cref=\"")
324-
.Append(@class.ClassFullName.EscapeForXmlDoc()).Append("\" /> on the mock.").AppendLine();
99+
sb.Append("\t\t/// Raise events on the mock for <see cref=\"")
100+
.Append(@class.ClassFullName.EscapeForXmlDoc())
101+
.Append("\" />").AppendLine();
325102
sb.Append("\t\t/// </summary>").AppendLine();
326-
sb.Append("\t\tpublic IMockVerify<").Append(@class.ClassFullName).Append("> VerifyOn").Append(name)
327-
.Append("Mock")
328-
.AppendLine();
103+
sb.Append("\t\tpublic IMockRaises<").Append(@class.ClassFullName).Append("> RaiseOn")
104+
.Append(name).Append("Mock").AppendLine();
329105
sb.Append("\t\t\t=> new Mock<").Append(@class.ClassFullName).Append(">((").Append(@class.ClassFullName)
330106
.Append(")subject, GetMockOrThrow(subject).Registrations);")
331107
.AppendLine();
332108
}
333109

334-
sb.AppendLine("\t}");
110+
sb.AppendLine();
111+
sb.Append("\t\t/// <summary>").AppendLine();
112+
sb.Append("\t\t/// Verifies the interactions with the mocked subject of <see cref=\"")
113+
.Append(@class.ClassFullName.EscapeForXmlDoc()).Append("\" /> on the mock.").AppendLine();
114+
sb.Append("\t\t/// </summary>").AppendLine();
115+
sb.Append("\t\tpublic IMockVerify<").Append(@class.ClassFullName).Append("> VerifyOn").Append(name)
116+
.Append("Mock")
117+
.AppendLine();
118+
sb.Append("\t\t\t=> new Mock<").Append(@class.ClassFullName).Append(">((").Append(@class.ClassFullName)
119+
.Append(")subject, GetMockOrThrow(subject).Registrations);")
120+
.AppendLine();
335121
}
336122
}
337123
#pragma warning restore S3776 // Cognitive Complexity of methods should not be too high

Source/Mockolate.SourceGenerators/Sources/Sources.ForMock.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,7 @@ namespace Mockolate.Generated;
2626
sb.Append("/// <summary>").AppendLine();
2727
sb.Append("/// A mock implementing <see cref=\"")
2828
.Append(mockClass.ClassFullName.EscapeForXmlDoc())
29-
.Append("\" />");
30-
foreach (Class? additional in mockClass.DistinctAdditionalImplementations())
31-
{
32-
sb.Append(" and <see cref=\"").Append(additional.ClassFullName.EscapeForXmlDoc()).Append("\" />");
33-
}
34-
35-
sb.AppendLine(".");
29+
.Append("\" />.");
3630
sb.Append("/// </summary>").AppendLine();
3731
sb.Append("internal class MockFor").Append(name).Append(" : IMockSubject<").Append(mockClass.ClassFullName)
3832
.Append(">").AppendLine();

0 commit comments

Comments
 (0)