Skip to content

Commit 3803e73

Browse files
committed
change generated file names
also add option for prefix
1 parent b2fb01d commit 3803e73

File tree

2 files changed

+57
-18
lines changed

2 files changed

+57
-18
lines changed

XmlSchemaClassGenerator.SourceGenerator/XmlSchemaClassGenerator.SourceGenerator.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
<ItemGroup>
33
<CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="xscgen_Namespace" />
44
<CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="xscgen_SeparateFiles" />
5+
<CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="xscgen_Prefix" />
56
</ItemGroup>
67
</Project>

XmlSchemaClassGenerator.SourceGenerator/XsdSourceGenerator.cs

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)