@@ -18,12 +18,16 @@ public class XsdSourceGenerator : ISourceGenerator
1818 internal class MemoryOutputWriter : OutputWriter
1919 {
2020 private readonly bool separateFiles ;
21+ private readonly string schemaFileName ;
22+ private readonly string prefix ;
2123
2224 public ICollection < ( string Name , string Content ) > Contents { get ; private set ; } = new List < ( string , string ) > ( ) ;
2325
24- public MemoryOutputWriter ( bool separateFiles )
26+ public MemoryOutputWriter ( bool separateFiles , string schemaFileName , string prefix )
2527 {
2628 this . separateFiles = separateFiles ;
29+ this . schemaFileName = schemaFileName ;
30+ this . prefix = prefix ;
2731 }
2832
2933 public override void Write ( CodeNamespace cn )
@@ -40,14 +44,14 @@ public override void Write(CodeNamespace cn)
4044 using ( var writer = new StringWriter ( ) )
4145 {
4246 Write ( writer , cu ) ;
43- Contents . Add ( ( "Pocos ", writer . ToString ( ) ) ) ;
47+ Contents . Add ( ( $ " { this . prefix ?? string . Empty } { this . schemaFileName } .g.cs ", writer . ToString ( ) ) ) ;
4448 }
4549 }
4650 }
4751
4852 private void WriteSeparateFiles ( CodeNamespace cn )
4953 {
50- var validName = ValidateName ( cn . Name ) ;
54+ var validName = GetSanitizedName ( cn . Name ) ;
5155 var ccu = new CodeCompileUnit ( ) ;
5256 var cns = new CodeNamespace ( validName ) ;
5357
@@ -63,14 +67,14 @@ private void WriteSeparateFiles(CodeNamespace cn)
6367 using ( var writer = new StringWriter ( ) )
6468 {
6569 Write ( writer , ccu ) ;
66- Contents . Add ( ( contentName , writer . ToString ( ) ) ) ;
70+ Contents . Add ( ( $ " { this . prefix ?? string . Empty } { contentName } .g.cs" , writer . ToString ( ) ) ) ;
6771 }
6872 }
6973 }
7074
7175 static readonly Regex InvalidCharacters = new Regex ( $ "[{ string . Join ( "" , Path . GetInvalidFileNameChars ( ) ) } ]", RegexOptions . Compiled ) ;
7276
73- private string ValidateName ( string name ) => InvalidCharacters . Replace ( name , "_" ) ;
77+ private string GetSanitizedName ( string name ) => InvalidCharacters . Replace ( name , "_" ) ;
7478 }
7579
7680 public void Execute ( GeneratorExecutionContext context )
@@ -81,24 +85,23 @@ public void Execute(GeneratorExecutionContext context)
8185 // Debugger.Launch();
8286 }
8387#endif
84- var configurations = GetConfigurations ( context ) ;
85- bool generateSeparateFiles =
86- context . AnalyzerConfigOptions . GlobalOptions . TryGetValue ( "build_property.xscgen_separatefiles" , out var generateSeparateFilesStr ) &&
87- bool . TryParse ( generateSeparateFilesStr , out var parsedGenerateSeparateFiles ) &&
88- parsedGenerateSeparateFiles ;
88+ var sources = GetConfigurations ( context ) ;
8989
90- foreach ( var ( schemaFile , @namespace ) in configurations )
90+ foreach ( var source in sources )
9191 {
92- var schemaStr = schemaFile . GetText ( ) . ToString ( ) ;
92+ var schemaStr = source . AdditionalText . GetText ( ) . ToString ( ) ;
9393 var stringReader = new StringReader ( schemaStr ) ;
9494
9595 var schemaSet = new XmlSchemaSet ( ) ;
9696 schemaSet . Add ( null , XmlReader . Create ( stringReader ) ) ;
9797
9898 var generator = new Generator ( ) ;
99- generator . NamespaceProvider . Add ( new NamespaceKey ( ) , @namespace ) ;
100- generator . SeparateClasses = generateSeparateFiles ;
101- MemoryOutputWriter memoryOutputWriter = new MemoryOutputWriter ( generateSeparateFiles ) ;
99+ generator . NamespaceProvider . Add ( new NamespaceKey ( ) , source . Namespace ) ;
100+ generator . SeparateClasses = source . GenerateSeparateFiles ;
101+ MemoryOutputWriter memoryOutputWriter = new MemoryOutputWriter (
102+ source . GenerateSeparateFiles ,
103+ Path . GetFileNameWithoutExtension ( source . AdditionalText . Path ) ,
104+ source . Prefix ) ;
102105 generator . OutputWriter = memoryOutputWriter ;
103106 generator . Generate ( schemaSet ) ;
104107
@@ -114,20 +117,55 @@ public void Initialize(GeneratorInitializationContext context)
114117 // do nothing
115118 }
116119
117- static IEnumerable < ( AdditionalText SchemaFile , string Namespace ) > GetConfigurations ( GeneratorExecutionContext context )
120+ static IEnumerable < GenerationSource > GetConfigurations ( GeneratorExecutionContext context )
118121 {
119122 foreach ( AdditionalText file in context . AdditionalFiles )
120123 {
121- if ( ! context . AnalyzerConfigOptions . GetOptions ( file ) . TryGetValue ( "build_metadata.AdditionalFiles.xscgen_Namespace" , out var @namespace ) )
124+ AnalyzerConfigOptions fileOptions = context . AnalyzerConfigOptions . GetOptions ( file ) ;
125+ if ( ! fileOptions . TryGetValue ( "build_metadata.AdditionalFiles.xscgen_namespace" , out var @namespace ) )
122126 {
123127 @namespace = "Generated" ;
124128 }
125129
130+ if ( ! fileOptions . TryGetValue ( "build_metadata.AdditionalFiles.xscgen_prefix" , out var prefix ) )
131+ {
132+ prefix = null ;
133+ }
134+
135+ bool generateSeparateFiles =
136+ fileOptions . TryGetValue ( "build_metadata.AdditionalFiles.xscgen_separatefiles" , out var generateSeparateFilesStr ) &&
137+ bool . TryParse ( generateSeparateFilesStr , out var parsedGenerateSeparateFiles ) &&
138+ parsedGenerateSeparateFiles ;
139+
126140 if ( Path . GetExtension ( file . Path ) . Equals ( ".xsd" , StringComparison . OrdinalIgnoreCase ) )
127141 {
128- yield return ( file , @namespace ) ;
142+ yield return new GenerationSource (
143+ file ,
144+ @namespace ,
145+ generateSeparateFiles ,
146+ prefix ) ;
129147 }
130148 }
131149 }
150+
151+ sealed class GenerationSource
152+ {
153+ public GenerationSource (
154+ AdditionalText additionalText ,
155+ string @namespace ,
156+ bool generateSeparateFiles ,
157+ string prefix )
158+ {
159+ AdditionalText = additionalText ;
160+ Namespace = @namespace ;
161+ GenerateSeparateFiles = generateSeparateFiles ;
162+ Prefix = prefix ;
163+ }
164+
165+ public AdditionalText AdditionalText { get ; }
166+ public string Namespace { get ; }
167+ public bool GenerateSeparateFiles { get ; }
168+ public string Prefix { get ; }
169+ }
132170 }
133171}
0 commit comments