12
12
using Microsoft . CodeAnalysis ;
13
13
using Microsoft . CodeAnalysis . CSharp ;
14
14
using Microsoft . CodeAnalysis . CSharp . Syntax ;
15
+ using Vetuviem . SourceGenerator . Features . Configuration ;
15
16
using Vetuviem . SourceGenerator . Features . Core ;
16
17
17
18
namespace Vetuviem . SourceGenerator
@@ -124,8 +125,17 @@ public void Execute(GeneratorExecutionContext context)
124
125
125
126
globalOptions . TryGetBuildPropertyValue ( "Vetuviem_Make_Classes_Public" , out var makeClassesPublicAsString ) ;
126
127
bool . TryParse ( makeClassesPublicAsString , out var makeClassesPublic ) ;
128
+
127
129
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 ) ;
129
139
130
140
// base type name only used if passing a custom set of assemblies to search for.
131
141
// 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)
150
160
//}
151
161
#endif
152
162
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
+ }
156
168
157
169
if ( cancellationToken . IsCancellationRequested )
158
170
{
@@ -214,6 +226,45 @@ public void Execute(GeneratorExecutionContext context)
214
226
return result ;
215
227
}
216
228
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
+
217
268
private void ValidateRootNamespace ( string ? rootNamespace )
218
269
{
219
270
if ( string . IsNullOrWhiteSpace ( rootNamespace ) )
0 commit comments