Skip to content

Commit 07956c8

Browse files
committed
add ApiListWriterOptions.WriterOptions.WriteReferencedAssemblies
1 parent aa4ce90 commit 07956c8

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
lines changed

src/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi.Core.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ SPDX-License-Identifier: MIT
1010
<VersionSuffix></VersionSuffix>
1111
<PackageValidationBaselineVersion>1.0.0</PackageValidationBaselineVersion>
1212
<Nullable>enable</Nullable>
13+
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
1314
</PropertyGroup>
1415

1516
<Import Project="..\Sdk.net7.0-preview.props" />

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.IO;
66
using System.Linq;
77
using System.Reflection;
8+
using System.Reflection.Metadata;
89
using System.Runtime.CompilerServices;
910
using System.Runtime.Versioning;
1011
using System.Text;
@@ -33,6 +34,9 @@ public void WriteAssemblyInfoHeader()
3334
BaseWriter.WriteLine($"// TargetFramework: {assembly.GetAssemblyMetadataAttributeValue<TargetFrameworkAttribute, string>()}");
3435
BaseWriter.WriteLine($"// Configuration: {assembly.GetAssemblyMetadataAttributeValue<AssemblyConfigurationAttribute, string>()}");
3536

37+
if (options.Writer.WriteReferencedAssemblies)
38+
WriteReferencedAssemblies();
39+
3640
var manifestResourceNames = assembly.GetManifestResourceNames();
3741

3842
if (options.Writer.WriteEmbeddedResources && 0 < manifestResourceNames.Length) {
@@ -52,6 +56,37 @@ public void WriteAssemblyInfoHeader()
5256
}
5357
}
5458

59+
private unsafe void WriteReferencedAssemblies()
60+
{
61+
if (!assembly.TryGetRawMetadata(out var blobPtr, out var blobLength))
62+
return;
63+
64+
BaseWriter.WriteLine("// Referenced assemblies:");
65+
66+
var reader = new MetadataReader(blobPtr, blobLength);
67+
var assemblyReferences = reader
68+
.AssemblyReferences
69+
.Select(handle => reader.GetAssemblyReference(handle))
70+
.ToDictionary(
71+
assmRef => reader.GetString(assmRef.Name),
72+
assmRef => assmRef
73+
);
74+
75+
foreach (var (name, assmRef) in assemblyReferences.OrderBy(static pair => pair.Key, StringComparer.Ordinal)) {
76+
var culture = reader.GetString(assmRef.Culture);
77+
78+
if (string.IsNullOrEmpty(culture))
79+
culture = "neutral";
80+
81+
var publicKeyOrToken = reader.GetBlobBytes(assmRef.PublicKeyOrToken);
82+
var publicKeyOrTokenString = publicKeyOrToken is null || publicKeyOrToken.Length == 0
83+
? string.Empty
84+
: $", PublicKeyToken={string.Concat(publicKeyOrToken.Select(static b => b.ToString("x2", provider: null)))}";
85+
86+
BaseWriter.WriteLine($"// {name}, Version={assmRef.Version}, Culture={culture}{publicKeyOrTokenString}");
87+
}
88+
}
89+
5590
public void WriteExportedTypes()
5691
{
5792
var types = assembly.GetExportedTypes()

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ public class WriterOptions {
99
public bool OrderStaticMembersFirst { get; set; } = false;
1010
public bool WriteNullableAnnotationDirective { get; set; } = true;
1111
public bool WriteEmbeddedResources { get; set; } = true;
12+
public bool WriteReferencedAssemblies { get; set; } = true;
1213
}
1314
}

0 commit comments

Comments
 (0)