Skip to content

Commit 7051f55

Browse files
authored
Implement excludeClassByName option (#6)
1 parent 0cd2e76 commit 7051f55

File tree

6 files changed

+75
-2
lines changed

6 files changed

+75
-2
lines changed

source/MetadataProcessor.Console/Options.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ public class Options
3333
HelpText = "Loads one (or more) assembly file(s) as a dependency(ies).")]
3434
public IEnumerable<string> LoadHints { get; set; }
3535

36+
[Option(
37+
"excludeClassByName",
38+
Required = false,
39+
Default = null,
40+
HelpText = "Removes the class from an assembly.")]
41+
public IEnumerable<string> ExcludeClassByName { get; set; }
42+
3643

3744
}
3845
}

source/MetadataProcessor.Console/Program.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ private sealed class MetadataProcessor
2525

2626
private AssemblyDefinition _assemblyDefinition;
2727

28+
private List<string> _classNamesToExclude = new List<string>();
29+
2830
public void Parse(string fileName)
2931
{
3032
try
@@ -44,7 +46,7 @@ public void Compile(string fileName)
4446
{
4547
try
4648
{
47-
var builder = new nanoAssemblyBuilder(_assemblyDefinition);
49+
var builder = new nanoAssemblyBuilder(_assemblyDefinition, _classNamesToExclude);
4850

4951
using (var stream = File.Open(fileName, FileMode.Create, FileAccess.ReadWrite))
5052
using (var writer = new BinaryWriter(stream))
@@ -76,6 +78,12 @@ public void AddLoadHint(
7678
{
7779
_loadHints[assemblyName] = assemblyFileName;
7880
}
81+
82+
public void AddClassToExclude(
83+
string className)
84+
{
85+
_classNamesToExclude.Add(className);
86+
}
7987
}
8088

8189
public static void Main(string[] args)
@@ -151,6 +159,15 @@ static void RunOptionsAndReturnExitCode(Options o)
151159
while (hintCount < o.LoadHints.Count());
152160
}
153161

162+
// set class(es) to exclude
163+
if (o.ExcludeClassByName.Any())
164+
{
165+
foreach (string name in o.ExcludeClassByName)
166+
{
167+
md.AddClassToExclude(name);
168+
}
169+
}
170+
154171
// parse assembly
155172
if (!string.IsNullOrEmpty(o.Parse))
156173
{

source/MetadataProcessor.Core/Tables/nanoFieldDefinitionTable.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ public bool TryGetFieldReferenceId(
8484
bool trackMaxReferenceId,
8585
out ushort referenceId)
8686
{
87+
// compare against classes to exclude
88+
if (_context.ClassNamesToExclude.Contains(field.FullName))
89+
{
90+
referenceId = 0;
91+
return false;
92+
}
93+
8794
var found = TryGetIdByValue(field, out referenceId);
8895
if (trackMaxReferenceId && found)
8996
{

source/MetadataProcessor.Core/Tables/nanoMethodDefinitionTable.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ public bool TryGetMethodReferenceId(
5454
MethodDefinition methodDefinition,
5555
out ushort referenceId)
5656
{
57+
// compare against classes to exclude
58+
if (_context.ClassNamesToExclude.Contains(methodDefinition.FullName))
59+
{
60+
referenceId = 0;
61+
return false;
62+
}
63+
5764
return TryGetIdByValue(methodDefinition, out referenceId);
5865
}
5966

source/MetadataProcessor.Core/Tables/nanoTablesContext.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,30 @@ public sealed class nanoTablesContext
7979
public nanoTablesContext(
8080
AssemblyDefinition assemblyDefinition,
8181
List<string> explicitTypesOrder,
82+
List<string> classNamesToExclude,
8283
ICustomStringSorter stringSorter,
8384
bool applyAttributesCompression)
8485
{
8586
AssemblyDefinition = assemblyDefinition;
8687

88+
ClassNamesToExclude = classNamesToExclude;
89+
8790
foreach (var item in assemblyDefinition.CustomAttributes)
8891
{
8992
_ignoringAttributes.Add(item.AttributeType.FullName);
9093
}
9194

95+
// check CustomAttributes against list of classes to exclude
96+
foreach (var item in assemblyDefinition.CustomAttributes)
97+
{
98+
// add it to ignore list, if it's not already there
99+
if (ClassNamesToExclude.Contains(item.AttributeType.FullName) &&
100+
!_ignoringAttributes.Contains(item.AttributeType.FullName))
101+
{
102+
_ignoringAttributes.Add(item.AttributeType.FullName);
103+
}
104+
}
105+
92106
NativeMethodsCrc = new NativeMethodsCrc(assemblyDefinition);
93107

94108
var mainModule = AssemblyDefinition.MainModule;
@@ -101,6 +115,20 @@ public nanoTablesContext(
101115
var typeReferences = mainModule.GetTypeReferences()
102116
.Where(item => !IsAttribute(item))
103117
.ToList();
118+
119+
// copy collection to remove classes to exclude
120+
TypeReference[] typeReferencesCopy = new TypeReference[typeReferences.Count];
121+
typeReferences.CopyTo(typeReferencesCopy);
122+
123+
// compare against classes to remove
124+
foreach (TypeReference t in typeReferencesCopy)
125+
{
126+
if (ClassNamesToExclude.Contains(t.FullName))
127+
{
128+
typeReferences.Remove(t);
129+
}
130+
}
131+
104132
TypeReferencesTable = new nanoTypeReferenceTable(
105133
typeReferences, this);
106134

@@ -231,6 +259,8 @@ public ushort GetMethodReferenceId(
231259

232260
public nanoResourceFileTable ResourceFileTable { get; private set; }
233261

262+
public List<string> ClassNamesToExclude { get; private set; }
263+
234264
private IEnumerable<Tuple<CustomAttribute, ushort>> GetAttributes(
235265
IEnumerable<ICustomAttributeProvider> types,
236266
bool applyAttributesCompression)

source/MetadataProcessor.Core/nanoAssemblyBuilder.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,17 @@ public sealed class nanoAssemblyBuilder
3030
/// </param>
3131
public nanoAssemblyBuilder(
3232
AssemblyDefinition assemblyDefinition,
33+
List<string> classNamesToExclude,
3334
List<string> explicitTypesOrder = null,
3435
ICustomStringSorter stringSorter = null,
3536
bool applyAttributesCompression = false)
3637
{
3738
_tablesContext = new nanoTablesContext(
38-
assemblyDefinition, explicitTypesOrder, stringSorter, applyAttributesCompression);
39+
assemblyDefinition,
40+
explicitTypesOrder,
41+
classNamesToExclude,
42+
stringSorter,
43+
applyAttributesCompression);
3944
}
4045

4146
/// <summary>

0 commit comments

Comments
 (0)