Skip to content

Commit 43011dd

Browse files
authored
feature: logic for handling assembly replacement via config (#404)
* logic for handling assembly replacement via config * fix issue with assembly arg not being ignored if empty
1 parent c6600b1 commit 43011dd

File tree

5 files changed

+85
-6
lines changed

5 files changed

+85
-6
lines changed

src/Vetuviem.IntegrationTests/Vetuviem.IntegrationTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net7.0-windows</TargetFramework>
4+
<TargetFramework>net8.0-windows</TargetFramework>
55
<UseWpf>True</UseWpf>
66
<IsPackable>False</IsPackable>
77
</PropertyGroup>

src/Vetuviem.SourceGenerator/AbstractBaseSourceGenerator.cs

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Microsoft.CodeAnalysis;
1313
using Microsoft.CodeAnalysis.CSharp;
1414
using Microsoft.CodeAnalysis.CSharp.Syntax;
15+
using Vetuviem.SourceGenerator.Features.Configuration;
1516
using Vetuviem.SourceGenerator.Features.Core;
1617

1718
namespace Vetuviem.SourceGenerator
@@ -124,8 +125,17 @@ public void Execute(GeneratorExecutionContext context)
124125

125126
globalOptions.TryGetBuildPropertyValue("Vetuviem_Make_Classes_Public", out var makeClassesPublicAsString);
126127
bool.TryParse(makeClassesPublicAsString, out var makeClassesPublic);
128+
127129
globalOptions.TryGetBuildPropertyValue("Vetuviem_Assemblies", out var assemblies);
128-
var assembliesArray = assemblies?.Split(';');
130+
var assembliesArray = assemblies?.Split(
131+
[';'],
132+
StringSplitOptions.RemoveEmptyEntries)
133+
.Where(s => !string.IsNullOrWhiteSpace(s))
134+
.ToArray();
135+
136+
globalOptions.TryGetBuildPropertyValue("Vetuviem_Assembly_Mode", out var assemblyModeAsString);
137+
138+
var assemblyMode = GetAssemblyMode(assemblyModeAsString);
129139

130140
// base type name only used if passing a custom set of assemblies to search for.
131141
// allows for 3rd parties to use the generator and produce a custom namespace that inherits off the root, or custom namespace.
@@ -150,9 +160,11 @@ public void Execute(GeneratorExecutionContext context)
150160
//}
151161
#endif
152162

153-
// TODO: allow the assemblies to be overriden by config.
154-
// TODO: allow the classes to be internal rather than public
155-
var assembliesOfInterest = platformResolver.GetAssemblyNames();
163+
var assembliesOfInterest = GetAssembliesOfInterest(platformResolver, assembliesArray, assemblyMode);
164+
if (assembliesOfInterest.Length == 0)
165+
{
166+
return null;
167+
}
156168

157169
if (cancellationToken.IsCancellationRequested)
158170
{
@@ -214,6 +226,45 @@ public void Execute(GeneratorExecutionContext context)
214226
return result;
215227
}
216228

229+
private static AssemblyMode GetAssemblyMode(string? assemblyModeAsString)
230+
{
231+
if (string.IsNullOrWhiteSpace(assemblyModeAsString))
232+
{
233+
return AssemblyMode.Replace;
234+
}
235+
236+
if ( !Enum.TryParse<AssemblyMode>(assemblyModeAsString, out var assemblyMode))
237+
{
238+
return assemblyMode;
239+
}
240+
241+
throw new InvalidOperationException("Invalid assembly mode.");
242+
}
243+
244+
private static string[] GetAssembliesOfInterest(
245+
IPlatformResolver platformResolver,
246+
string[]? assembliesArray,
247+
AssemblyMode assemblyMode)
248+
{
249+
var assembliesOfInterest = platformResolver.GetAssemblyNames();
250+
if (assembliesArray?.Length > 0)
251+
{
252+
switch (assemblyMode)
253+
{
254+
case AssemblyMode.Replace:
255+
assembliesOfInterest = assembliesArray;
256+
break;
257+
case AssemblyMode.Extend:
258+
assembliesOfInterest = assembliesOfInterest.Concat(assembliesArray).ToArray();
259+
break;
260+
default:
261+
throw new InvalidOperationException("Invalid assembly mode.");
262+
}
263+
}
264+
265+
return assembliesOfInterest;
266+
}
267+
217268
private void ValidateRootNamespace(string? rootNamespace)
218269
{
219270
if (string.IsNullOrWhiteSpace(rootNamespace))
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright (c) 2022 DPVreony and Contributors. All rights reserved.
2+
// DPVreony and Contributors licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for full license information.
4+
5+
namespace Vetuviem.SourceGenerator.Features.Configuration
6+
{
7+
/// <summary>
8+
/// The operation to carry out if assemblies are specified in the config.
9+
/// </summary>
10+
public enum AssemblyMode
11+
{
12+
/// <summary>
13+
/// None, this is a language default to pickup invalid values.
14+
/// </summary>
15+
None,
16+
17+
/// <summary>
18+
/// Replace the default platform assemblies with the specified assemblies.
19+
/// </summary>
20+
Replace,
21+
22+
/// <summary>
23+
/// Extend the default platform assemblies with the specified assemblies.
24+
/// </summary>
25+
Extend
26+
}
27+
}

src/Vetuviem.SourceGenerator/Vetuviem-SourceGenerator.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<CompilerVisibleProperty Include="Vetuviem_Root_Namespace" />
44
<CompilerVisibleProperty Include="Vetuviem_Make_Classes_Public" />
55
<CompilerVisibleProperty Include="Vetuviem_Assemblies" />
6+
<CompilerVisibleProperty Include="Vetuviem_Assembly_Mode" />
67
<CompilerVisibleProperty Include="Vetuviem_Base_Namespace" />
78
</ItemGroup>
89
</Project>

src/Vetuviem.SourceGenerator/Vetuviem.SourceGenerator.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
5-
<LangVersion>9</LangVersion>
5+
<LangVersion>12</LangVersion>
66
<DebugType>full</DebugType>
77
<DebugSymbols>True</DebugSymbols>
88
</PropertyGroup>

0 commit comments

Comments
 (0)