Skip to content

Commit 7f7383c

Browse files
committed
add fallback implementation for ApiListWriter.WriteReferencedAssemblies
1 parent 29a5397 commit 7f7383c

File tree

2 files changed

+108
-77
lines changed
  • src/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi
  • tests/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi

2 files changed

+108
-77
lines changed

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,27 @@ public void WriteAssemblyInfoHeader()
4343

4444
private unsafe void WriteReferencedAssemblies()
4545
{
46-
if (!assembly.TryGetRawMetadata(out var blobPtr, out var blobLength))
47-
return;
48-
4946
BaseWriter.WriteLine("// Referenced assemblies:");
5047

48+
if (assembly.TryGetRawMetadata(out var blobPtr, out var blobLength))
49+
WriteReferencedAssembliesFromRawMetadata(blobPtr, blobLength);
50+
else
51+
WriteReferencedAssembliesUsingGetReferencedAssemblies();
52+
}
53+
54+
private void WriteReferencedAssembliesUsingGetReferencedAssemblies()
55+
{
56+
var orderedReferencedAssemblies = assembly
57+
.GetReferencedAssemblies()
58+
.OrderBy(static refassm => refassm.Name, StringComparer.Ordinal);
59+
60+
foreach (var referencedAssembly in orderedReferencedAssemblies) {
61+
BaseWriter.WriteLine($"// {referencedAssembly.FullName}");
62+
}
63+
}
64+
65+
private unsafe void WriteReferencedAssembliesFromRawMetadata(byte* blobPtr, int blobLength)
66+
{
5167
var reader = new MetadataReader(blobPtr, blobLength);
5268
var assemblyReferences = reader
5369
.AssemblyReferences

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

Lines changed: 89 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -530,93 +530,103 @@ public void WriteEmbeddedResources_HasNoEmbeddedResources(
530530

531531
private static System.Collections.IEnumerable YieldTestCases_WriteReferencedAssemblies()
532532
{
533-
foreach (var writeReferencedAssemblies in new[] { true, false }) {
533+
foreach (var loadIntoReflectionOnlyContext in new[] {true, false} ) {
534+
foreach (var writeReferencedAssemblies in new[] { true, false }) {
534535
#if NETCOREAPP3_1_OR_GREATER || NET6_0_OR_GREATER
535-
yield return new object[] {
536-
"Lib",
537-
"netstandard2.1",
538-
writeReferencedAssemblies,
539-
new[] {
540-
"netstandard, Version=2.1.",
541-
}
542-
};
536+
yield return new object[] {
537+
"Lib",
538+
"netstandard2.1",
539+
writeReferencedAssemblies,
540+
loadIntoReflectionOnlyContext,
541+
new[] {
542+
"netstandard, Version=2.1.",
543+
}
544+
};
543545
#endif
544546
#if NET6_0_OR_GREATER
545-
yield return new object[] {
546-
"Lib",
547-
"net6.0",
548-
writeReferencedAssemblies,
549-
new[] {
550-
"System.Runtime, Version=6.0.",
551-
}
552-
};
547+
yield return new object[] {
548+
"Lib",
549+
"net6.0",
550+
writeReferencedAssemblies,
551+
loadIntoReflectionOnlyContext,
552+
new[] {
553+
"System.Runtime, Version=6.0.",
554+
}
555+
};
553556
#endif
554557
#if NET7_0_OR_GREATER
555-
yield return new object[] {
556-
"Lib",
557-
"net7.0",
558-
writeReferencedAssemblies,
559-
new[] {
560-
"System.Runtime, Version=7.0.",
561-
}
562-
};
558+
yield return new object[] {
559+
"Lib",
560+
"net7.0",
561+
writeReferencedAssemblies,
562+
loadIntoReflectionOnlyContext,
563+
new[] {
564+
"System.Runtime, Version=7.0.",
565+
}
566+
};
563567
#endif
564568
#if NETCOREAPP3_1_OR_GREATER || NET6_0_OR_GREATER
565-
yield return new object[] {
566-
"LibB",
567-
"netstandard2.1",
568-
writeReferencedAssemblies,
569-
new[] {
570-
"netstandard, Version=2.1.",
571-
"LibA, Version=",
572-
}
573-
};
569+
yield return new object[] {
570+
"LibB",
571+
"netstandard2.1",
572+
writeReferencedAssemblies,
573+
loadIntoReflectionOnlyContext,
574+
new[] {
575+
"netstandard, Version=2.1.",
576+
"LibA, Version=",
577+
}
578+
};
574579
#endif
575580
#if NET6_0_OR_GREATER
576-
yield return new object[] {
577-
"LibB",
578-
"net6.0",
579-
writeReferencedAssemblies,
580-
new[] {
581-
"System.Runtime, Version=6.0.",
582-
"LibA, Version=",
583-
}
584-
};
581+
yield return new object[] {
582+
"LibB",
583+
"net6.0",
584+
writeReferencedAssemblies,
585+
loadIntoReflectionOnlyContext,
586+
new[] {
587+
"System.Runtime, Version=6.0.",
588+
"LibA, Version=",
589+
}
590+
};
585591
#endif
586592
#if NETCOREAPP3_1_OR_GREATER || NET6_0_OR_GREATER
587-
yield return new object[] {
588-
"LibReferencedAssemblies1",
589-
"netstandard2.1",
590-
writeReferencedAssemblies,
591-
new[] {
592-
"netstandard, Version=2.1.",
593-
}
594-
};
593+
yield return new object[] {
594+
"LibReferencedAssemblies1",
595+
"netstandard2.1",
596+
writeReferencedAssemblies,
597+
loadIntoReflectionOnlyContext,
598+
new[] {
599+
"netstandard, Version=2.1.",
600+
}
601+
};
595602
#endif
596603
#if NET6_0_OR_GREATER
597-
yield return new object[] {
598-
"LibReferencedAssemblies1",
599-
"net6.0",
600-
writeReferencedAssemblies,
601-
new[] {
602-
"System.Runtime, Version=6.0.",
603-
"System.Threading, Version=6.0.",
604-
"System.Xml.ReaderWriter, Version=6.0.",
605-
}
606-
};
604+
yield return new object[] {
605+
"LibReferencedAssemblies1",
606+
"net6.0",
607+
writeReferencedAssemblies,
608+
loadIntoReflectionOnlyContext,
609+
new[] {
610+
"System.Runtime, Version=6.0.",
611+
"System.Threading, Version=6.0.",
612+
"System.Xml.ReaderWriter, Version=6.0.",
613+
}
614+
};
607615
#endif
608616
#if NET7_0_OR_GREATER
609-
yield return new object[] {
610-
"LibReferencedAssemblies1",
611-
"net7.0",
612-
writeReferencedAssemblies,
613-
new[] {
614-
"System.Runtime, Version=7.0.",
615-
"System.Threading, Version=7.0.",
616-
"System.Xml.ReaderWriter, Version=7.0.",
617-
}
618-
};
617+
yield return new object[] {
618+
"LibReferencedAssemblies1",
619+
"net7.0",
620+
writeReferencedAssemblies,
621+
loadIntoReflectionOnlyContext,
622+
new[] {
623+
"System.Runtime, Version=7.0.",
624+
"System.Threading, Version=7.0.",
625+
"System.Xml.ReaderWriter, Version=7.0.",
626+
}
627+
};
619628
#endif
629+
}
620630
}
621631
}
622632

@@ -629,6 +639,7 @@ public void WriteReferencedAssemblies(
629639
string assemblyFileName,
630640
string targetFrameworkMoniker,
631641
bool writeReferencedAssemblies,
642+
bool loadIntoReflectionOnlyContext,
632643
string[] expectedReferencedAssemblies
633644
)
634645
{
@@ -642,7 +653,7 @@ string[] expectedReferencedAssemblies
642653
options.Writer.WriteEmbeddedResources = false;
643654
options.Writer.WriteReferencedAssemblies = writeReferencedAssemblies;
644655

645-
var generated = GenerateApiListFrom(assemblyFile, options);
656+
var generated = GenerateApiListFrom(assemblyFile, loadIntoReflectionOnlyContext, options);
646657

647658
if (writeReferencedAssemblies) {
648659
StringAssert.Contains(
@@ -664,11 +675,15 @@ string[] expectedReferencedAssemblies
664675
);
665676
}
666677

667-
string GenerateApiListFrom(FileInfo assemblyFile, ApiListWriterOptions options)
678+
string GenerateApiListFrom(
679+
FileInfo assemblyFile,
680+
bool loadIntoReflectionOnlyContext,
681+
ApiListWriterOptions options
682+
)
668683
{
669684
var ret = AssemblyLoader.UsingAssembly(
670685
assemblyFile,
671-
loadIntoReflectionOnlyContext: false,
686+
loadIntoReflectionOnlyContext: loadIntoReflectionOnlyContext,
672687
arg: options,
673688
logger: logger,
674689
actionWithLoadedAssembly: static (assm, options) => {

0 commit comments

Comments
 (0)