Skip to content

Commit 8c9c0c0

Browse files
committed
add ApiListWriter.WriteHeader and make writing assembly info configurable
1 parent 03530e9 commit 8c9c0c0

File tree

5 files changed

+66
-34
lines changed

5 files changed

+66
-34
lines changed

src/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi/ApiListWriter.cs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,33 @@ public ApiListWriter(TextWriter baseWriter, Assembly assembly, ApiListWriterOpti
2525
this.options = options ?? new();
2626
}
2727

28+
public void WriteHeader()
29+
{
30+
if (!options.Writer.WriteHeader)
31+
return;
32+
33+
if (options.Writer.WriteAssemblyInfo)
34+
WriteAssemblyInfo();
35+
36+
if (options.Writer.WriteReferencedAssemblies)
37+
WriteReferencedAssemblies();
38+
39+
if (options.Writer.WriteEmbeddedResources)
40+
WriteEmbeddedResources();
41+
}
42+
43+
[Obsolete($"Use {nameof(WriteHeader)}")]
2844
public void WriteAssemblyInfoHeader()
45+
=> WriteAssemblyInfo();
46+
47+
private void WriteAssemblyInfo()
2948
{
3049
BaseWriter.WriteLine($"// {Path.GetFileName(assembly.Location)} ({assembly.GetAssemblyMetadataAttributeValue<AssemblyProductAttribute, string>()})");
3150
BaseWriter.WriteLine($"// Name: {assembly.GetName().Name}");
3251
BaseWriter.WriteLine($"// AssemblyVersion: {assembly.GetName().Version}");
3352
BaseWriter.WriteLine($"// InformationalVersion: {assembly.GetAssemblyMetadataAttributeValue<AssemblyInformationalVersionAttribute, string>()}");
3453
BaseWriter.WriteLine($"// TargetFramework: {assembly.GetAssemblyMetadataAttributeValue<TargetFrameworkAttribute, string>()}");
3554
BaseWriter.WriteLine($"// Configuration: {assembly.GetAssemblyMetadataAttributeValue<AssemblyConfigurationAttribute, string>()}");
36-
37-
if (options.Writer.WriteReferencedAssemblies)
38-
WriteReferencedAssemblies();
39-
40-
if (options.Writer.WriteEmbeddedResources)
41-
WriteEmbeddedResources();
4255
}
4356

4457
private unsafe void WriteReferencedAssemblies()

src/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi/ApiListWriterOptions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,14 @@ public class ApiListWriterOptions : GeneratorOptions {
88
public class WriterOptions {
99
public bool OrderStaticMembersFirst { get; set; } = false;
1010
public bool WriteNullableAnnotationDirective { get; set; } = true;
11+
12+
/* options relevant to header */
13+
public bool WriteHeader { get; set; } = true;
14+
public bool WriteAssemblyInfo { get; set; } = true;
1115
public bool WriteEmbeddedResources { get; set; } = true;
1216
public bool WriteReferencedAssemblies { get; set; } = true;
17+
18+
/* options relevant to footer */
1319
public bool WriteFooter { get; set; } = true;
1420
}
1521
}

src/Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks/Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks/GenerateApiList.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ private static void WriteApiListFile(
184184
#endif
185185
var writer = new ApiListWriter(outputWriter, assm, arg.options);
186186

187-
writer.WriteAssemblyInfoHeader();
187+
writer.WriteHeader();
188188
writer.WriteExportedTypes();
189189
writer.WriteFooter();
190190

src/Smdn.Reflection.ReverseGenerating.ListApi/Smdn.Reflection.ReverseGenerating.ListApi/RootCommandImplementation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ private void CommandMain(ParseResult parseResult, IConsole console)
214214

215215
var writer = new ApiListWriter(outputWriter, assm, arg.options);
216216

217-
writer.WriteAssemblyInfoHeader();
217+
writer.WriteHeader();
218218
writer.WriteExportedTypes();
219219
writer.WriteFooter();
220220

tests/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi/ApiListWriter.cs

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ private string WriteApiListFromSourceCode(
143143
var sb = new StringBuilder();
144144
var writer = new ApiListWriter(new StringWriter(sb), assm, arg);
145145

146-
writer.WriteAssemblyInfoHeader();
146+
writer.WriteHeader();
147147
writer.WriteExportedTypes();
148148
writer.WriteFooter();
149149

@@ -225,8 +225,8 @@ string[] expectedUsingDirectives
225225
var options = new ApiListWriterOptions();
226226

227227
options.Writer.WriteNullableAnnotationDirective = false;
228-
options.Writer.WriteEmbeddedResources = false;
229-
options.Writer.WriteReferencedAssemblies = false;
228+
options.Writer.WriteHeader = false;
229+
options.Writer.WriteFooter = false;
230230

231231
var usingDirectives = new StringReader(WriteApiListFromSourceCode(sourceCode, options))
232232
.ReadAllLines()
@@ -276,15 +276,13 @@ string expectedOutput
276276
var options = new ApiListWriterOptions();
277277

278278
options.Writer.WriteNullableAnnotationDirective = false;
279-
options.Writer.WriteEmbeddedResources = false;
280-
options.Writer.WriteReferencedAssemblies = false;
279+
options.Writer.WriteHeader = false;
280+
options.Writer.WriteFooter = false;
281281

282282
var output =
283283
string.Join(
284284
"\n",
285-
new StringReader(WriteApiListFromSourceCode(sourceCode, options))
286-
.ReadAllLines()
287-
.Where(static line => !line.StartsWith("// ", StringComparison.Ordinal)) // remove header
285+
new StringReader(WriteApiListFromSourceCode(sourceCode, options)).ReadAllLines()
288286
);
289287

290288
Assert.AreEqual(
@@ -359,8 +357,8 @@ string expectedOutput
359357
var options = new ApiListWriterOptions();
360358

361359
options.Writer.WriteNullableAnnotationDirective = writeNullableAnnotationDirective;
362-
options.Writer.WriteEmbeddedResources = false;
363-
options.Writer.WriteReferencedAssemblies = false;
360+
options.Writer.WriteHeader = false;
361+
options.Writer.WriteFooter = false;
364362

365363
options.TypeDeclaration.NullabilityInfoContext = typeDeclarationNullabilityInfoContext;
366364
options.MemberDeclaration.NullabilityInfoContext = memberDeclarationNullabilityInfoContext;
@@ -369,9 +367,7 @@ string expectedOutput
369367
var output =
370368
string.Join(
371369
"\n",
372-
new StringReader(WriteApiListFromSourceCode(sourceCode, options))
373-
.ReadAllLines()
374-
.Where(static line => !line.StartsWith("// ", StringComparison.Ordinal)) // remove header
370+
new StringReader(WriteApiListFromSourceCode(sourceCode, options)).ReadAllLines()
375371
);
376372

377373
Assert.AreEqual(
@@ -381,7 +377,7 @@ string expectedOutput
381377
}
382378
#endif // SYSTEM_REFLECTION_NULLABILITYINFOCONTEXT
383379

384-
private static System.Collections.IEnumerable YieldTestCases_WriteAssemblyInfoHeader()
380+
private static System.Collections.IEnumerable YieldTestCases_WriteHeader_WriteAssemblyInfo()
385381
{
386382
yield return new object[] {
387383
@"
@@ -396,6 +392,7 @@ private static System.Collections.IEnumerable YieldTestCases_WriteAssemblyInfoHe
396392
typeof(AssemblyInformationalVersionAttribute).Assembly.GetName().Name + ".dll",
397393
typeof(System.Runtime.Versioning.TargetFrameworkAttribute).Assembly.GetName().Name + ".dll",
398394
},
395+
true,
399396
@"// (Product)
400397
// Name: TestCase1Assembly
401398
// AssemblyVersion: 1.2.3.4
@@ -408,26 +405,38 @@ private static System.Collections.IEnumerable YieldTestCases_WriteAssemblyInfoHe
408405
@"// empty assembly",
409406
"TestCase2Assembly",
410407
null!,
408+
true,
411409
"// ()\n" +
412410
"// Name: TestCase2Assembly\n" +
413411
"// AssemblyVersion: 0.0.0.0\n" +
414412
"// InformationalVersion: \n" +
415413
"// TargetFramework: \n" +
416414
"// Configuration: \n"
417415
};
416+
417+
yield return new object[] {
418+
@"// empty assembly",
419+
"TestCase3Assembly",
420+
null!,
421+
false,
422+
string.Empty
423+
};
418424
}
419425

420-
[TestCaseSource(nameof(YieldTestCases_WriteAssemblyInfoHeader))]
421-
public void WriteAssemblyInfoHeader(
426+
[TestCaseSource(nameof(YieldTestCases_WriteHeader_WriteAssemblyInfo))]
427+
public void WriteHeader_WriteAssemblyInfo(
422428
string sourceCode,
423429
string assemblyName,
424430
string[] referenceAssemblyFileNames,
431+
bool writeAssemblyInfo,
425432
string expectedOutput
426433
)
427434
{
428435
var options = new ApiListWriterOptions();
429436

430437
options.Writer.WriteNullableAnnotationDirective = false;
438+
options.Writer.WriteHeader = true;
439+
options.Writer.WriteAssemblyInfo = writeAssemblyInfo;
431440
options.Writer.WriteEmbeddedResources = false;
432441
options.Writer.WriteReferencedAssemblies = false;
433442
options.Writer.WriteFooter = false;
@@ -443,7 +452,7 @@ string expectedOutput
443452
);
444453
}
445454

446-
private static System.Collections.IEnumerable YieldTestCases_WriteEmbeddedResources()
455+
private static System.Collections.IEnumerable YieldTestCases_WriteHeader_WriteEmbeddedResources()
447456
{
448457
foreach (var writeEmbeddedResources in new[] { true, false }) {
449458
yield return new object[] {
@@ -474,8 +483,8 @@ private static System.Collections.IEnumerable YieldTestCases_WriteEmbeddedResour
474483
}
475484
}
476485

477-
[TestCaseSource(nameof(YieldTestCases_WriteEmbeddedResources))]
478-
public void WriteEmbeddedResources(
486+
[TestCaseSource(nameof(YieldTestCases_WriteHeader_WriteEmbeddedResources))]
487+
public void WriteHeader_WriteEmbeddedResources(
479488
bool writeEmbeddedResources,
480489
IEnumerable<ResourceDescription> manifestResources,
481490
string expectedEmbeddedResourcesOutput
@@ -484,6 +493,8 @@ string expectedEmbeddedResourcesOutput
484493
var options = new ApiListWriterOptions();
485494

486495
options.Writer.WriteNullableAnnotationDirective = false;
496+
options.Writer.WriteHeader = true;
497+
options.Writer.WriteAssemblyInfo = false;
487498
options.Writer.WriteEmbeddedResources = writeEmbeddedResources;
488499
options.Writer.WriteReferencedAssemblies = false;
489500

@@ -510,13 +521,15 @@ string expectedEmbeddedResourcesOutput
510521
}
511522

512523
[Test]
513-
public void WriteEmbeddedResources_HasNoEmbeddedResources(
524+
public void WriteHeader_WriteEmbeddedResources_HasNoEmbeddedResources(
514525
[Values(true, false)] bool writeEmbeddedResources
515526
)
516527
{
517528
var options = new ApiListWriterOptions();
518529

519530
options.Writer.WriteNullableAnnotationDirective = false;
531+
options.Writer.WriteHeader = true;
532+
options.Writer.WriteAssemblyInfo = false;
520533
options.Writer.WriteEmbeddedResources = writeEmbeddedResources;
521534
options.Writer.WriteReferencedAssemblies = false;
522535

@@ -530,7 +543,7 @@ public void WriteEmbeddedResources_HasNoEmbeddedResources(
530543
);
531544
}
532545

533-
private static System.Collections.IEnumerable YieldTestCases_WriteReferencedAssemblies()
546+
private static System.Collections.IEnumerable YieldTestCases_WriteHeader_WriteReferencedAssemblies()
534547
{
535548
static IEnumerable<(
536549
string AssemblyName,
@@ -637,7 +650,7 @@ string[] ExpectedReferencedAssemblies
637650
// The type of the assembly generated by CSharpCompilation.Emit and loaded by AssemblyLoader, will be System.Reflection.TypeLoading.Ecma.EcmaAssembly.
638651
// And Assembly.TryGetRawMetadata returns false if the type of input assembl is System.Reflection.TypeLoading.Ecma.EcmaAssembly.
639652
// Therefore, the referenced assemblies cannot be read from the assembly generated and loaded with WriteApiListFromSourceCode.
640-
[TestCaseSource(nameof(YieldTestCases_WriteReferencedAssemblies))]
653+
[TestCaseSource(nameof(YieldTestCases_WriteHeader_WriteReferencedAssemblies))]
641654
public void WriteReferencedAssemblies(
642655
string assemblyFileName,
643656
string targetFrameworkMoniker,
@@ -653,6 +666,8 @@ string[] expectedReferencedAssemblies
653666
var options = new ApiListWriterOptions();
654667

655668
options.Writer.WriteNullableAnnotationDirective = false;
669+
options.Writer.WriteHeader = true;
670+
options.Writer.WriteAssemblyInfo = false;
656671
options.Writer.WriteEmbeddedResources = false;
657672
options.Writer.WriteReferencedAssemblies = writeReferencedAssemblies;
658673

@@ -693,7 +708,7 @@ ApiListWriterOptions options
693708
var sb = new StringBuilder();
694709
var writer = new ApiListWriter(new StringWriter(sb), assm, options);
695710

696-
writer.WriteAssemblyInfoHeader();
711+
writer.WriteHeader();
697712
writer.WriteExportedTypes();
698713

699714
return sb.ToString();
@@ -721,9 +736,7 @@ public void WriteFooter(
721736
{
722737
var options = new ApiListWriterOptions();
723738

724-
options.Writer.WriteNullableAnnotationDirective = false;
725-
options.Writer.WriteEmbeddedResources = false;
726-
options.Writer.WriteReferencedAssemblies = false;
739+
options.Writer.WriteHeader = false;
727740
options.Writer.WriteFooter = writeFooter;
728741

729742
var output = WriteApiListFromSourceCode("//", options).TrimEnd();

0 commit comments

Comments
 (0)