Skip to content

Commit 94e2165

Browse files
tlakolloMichalStrehovsky
authored andcommitted
Support for type ref and asm ref (#9)
Add support for TypeReferences and Assembly References
1 parent bda0c9c commit 94e2165

4 files changed

Lines changed: 116 additions & 3 deletions

File tree

src/coreclr/tools/ILTrim/DependencyAnalysis/NodeFactory.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public TokenBasedNode GetNodeForToken(EcmaModule module, EntityHandle handle)
2323
switch (handle.Kind)
2424
{
2525
case HandleKind.TypeReference:
26-
throw new NotImplementedException();
26+
return TypeReference(module, (TypeReferenceHandle)handle);
2727
case HandleKind.TypeDefinition:
2828
return TypeDefinition(module, (TypeDefinitionHandle)handle);
2929
case HandleKind.FieldDefinition:
@@ -55,7 +55,7 @@ public TokenBasedNode GetNodeForToken(EcmaModule module, EntityHandle handle)
5555
case HandleKind.TypeSpecification:
5656
throw new NotImplementedException();
5757
case HandleKind.AssemblyReference:
58-
throw new NotImplementedException();
58+
return AssemblyReference(module, (AssemblyReferenceHandle)handle);
5959
case HandleKind.AssemblyFile:
6060
throw new NotImplementedException();
6161
case HandleKind.ExportedType:
@@ -73,6 +73,14 @@ public TokenBasedNode GetNodeForToken(EcmaModule module, EntityHandle handle)
7373
}
7474
}
7575

76+
NodeCache<HandleKey<TypeReferenceHandle>, TypeReferenceNode> _typeReferences
77+
= new NodeCache<HandleKey<TypeReferenceHandle>, TypeReferenceNode>(key
78+
=> new TypeReferenceNode(key.Module, key.Handle));
79+
public TypeReferenceNode TypeReference(EcmaModule module, TypeReferenceHandle handle)
80+
{
81+
return _typeReferences.GetOrAdd(new HandleKey<TypeReferenceHandle>(module, handle));
82+
}
83+
7684
NodeCache<HandleKey<TypeDefinitionHandle>, TypeDefinitionNode> _typeDefinitions
7785
= new NodeCache<HandleKey<TypeDefinitionHandle>, TypeDefinitionNode>(key
7886
=> new TypeDefinitionNode(key.Module, key.Handle));
@@ -129,6 +137,14 @@ public AssemblyDefinitionNode AssemblyDefinition(EcmaModule module)
129137
return _assemblyDefinitions.GetOrAdd(module);
130138
}
131139

140+
NodeCache<HandleKey<AssemblyReferenceHandle>, AssemblyReferenceNode> _assemblyReferences
141+
= new NodeCache<HandleKey<AssemblyReferenceHandle>, AssemblyReferenceNode>(key
142+
=> new AssemblyReferenceNode(key.Module, key.Handle));
143+
public AssemblyReferenceNode AssemblyReference(EcmaModule module, AssemblyReferenceHandle handle)
144+
{
145+
return _assemblyReferences.GetOrAdd(new HandleKey<AssemblyReferenceHandle>(module, handle));
146+
}
147+
132148
private struct HandleKey<T> : IEquatable<HandleKey<T>> where T : struct, IEquatable<T>
133149
{
134150
public readonly EcmaModule Module;
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.Collections.Generic;
5+
using System.Reflection.Metadata;
6+
using System.Reflection.Metadata.Ecma335;
7+
8+
namespace ILTrim.DependencyAnalysis
9+
{
10+
/// <summary>
11+
/// Represents an entry in the Assembly Reference metadata table.
12+
/// </summary>
13+
public sealed class AssemblyReferenceNode : TokenBasedNode
14+
{
15+
public AssemblyReferenceNode(EcmaModule module, AssemblyReferenceHandle handle)
16+
: base(module, handle)
17+
{
18+
}
19+
20+
private AssemblyReferenceHandle Handle => (AssemblyReferenceHandle)_handle;
21+
22+
public override IEnumerable<DependencyListEntry> GetStaticDependencies(NodeFactory factory)
23+
{
24+
yield break;
25+
}
26+
27+
protected override EntityHandle WriteInternal(ModuleWritingContext writeContext)
28+
{
29+
MetadataReader reader = _module.MetadataReader;
30+
AssemblyReference assemblyRef = reader.GetAssemblyReference(Handle);
31+
32+
var builder = writeContext.MetadataBuilder;
33+
34+
return builder.AddAssemblyReference(builder.GetOrAddString(reader.GetString(assemblyRef.Name)),
35+
assemblyRef.Version,
36+
builder.GetOrAddString(reader.GetString(assemblyRef.Culture)),
37+
builder.GetOrAddBlob(reader.GetBlobBytes(assemblyRef.PublicKeyOrToken)),
38+
assemblyRef.Flags,
39+
builder.GetOrAddBlob(reader.GetBlobBytes(assemblyRef.HashValue)));
40+
}
41+
42+
public override string ToString()
43+
{
44+
MetadataReader reader = _module.MetadataReader;
45+
return reader.GetString(reader.GetAssemblyReference(Handle).Name);
46+
}
47+
}
48+
}

src/coreclr/tools/ILTrim/DependencyAnalysis/TokenBased/TypeDefinitionNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ protected override EntityHandle WriteInternal(ModuleWritingContext writeContext)
4747
return builder.AddTypeDefinition(typeDef.Attributes,
4848
builder.GetOrAddString(reader.GetString(typeDef.Namespace)),
4949
builder.GetOrAddString(reader.GetString(typeDef.Name)),
50-
(TypeDefinitionHandle)writeContext.TokenMap.MapToken(typeDef.BaseType),
50+
writeContext.TokenMap.MapToken(typeDef.BaseType),
5151
writeContext.TokenMap.MapTypeFieldList(Handle),
5252
writeContext.TokenMap.MapTypeMethodList(Handle));
5353
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.Collections.Generic;
5+
using System.Reflection.Metadata;
6+
using System.Reflection.Metadata.Ecma335;
7+
8+
using Debug = System.Diagnostics.Debug;
9+
10+
namespace ILTrim.DependencyAnalysis
11+
{
12+
/// <summary>
13+
/// Represents an entry in the Type Reference metadata table.
14+
/// </summary>
15+
public sealed class TypeReferenceNode : TokenBasedNode
16+
{
17+
public TypeReferenceNode(EcmaModule module, TypeReferenceHandle handle)
18+
: base(module, handle)
19+
{
20+
}
21+
22+
private TypeReferenceHandle Handle => (TypeReferenceHandle)_handle;
23+
24+
public override IEnumerable<DependencyListEntry> GetStaticDependencies(NodeFactory factory)
25+
{
26+
TypeReference typeRef = _module.MetadataReader.GetTypeReference(Handle);
27+
28+
yield return new(factory.GetNodeForToken(_module, typeRef.ResolutionScope), "Resolution Scope of a type reference");
29+
}
30+
31+
protected override EntityHandle WriteInternal(ModuleWritingContext writeContext)
32+
{
33+
MetadataReader reader = _module.MetadataReader;
34+
TypeReference typeRef = reader.GetTypeReference(Handle);
35+
36+
var builder = writeContext.MetadataBuilder;
37+
38+
return builder.AddTypeReference(writeContext.TokenMap.MapToken(typeRef.ResolutionScope),
39+
builder.GetOrAddString(reader.GetString(typeRef.Namespace)),
40+
builder.GetOrAddString(reader.GetString(typeRef.Name)));
41+
}
42+
43+
public override string ToString()
44+
{
45+
MetadataReader reader = _module.MetadataReader;
46+
return reader.GetString(reader.GetTypeReference(Handle).Name);
47+
}
48+
}
49+
}

0 commit comments

Comments
 (0)