2010-06-21 Atsushi Enomoto <atsushi@ximian.com>
[mcs.git] / tools / tuner / Mono.Tuner / FilterAttributes.cs
blobd06fd354b49dd390dd9fc72cd5389dc2cc95e6a8
1 //
2 // FilterAttributes.cs
3 //
4 // Author:
5 // Jb Evain (jbevain@novell.com)
6 //
7 // (C) 2009 Novell, Inc.
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 using System;
30 using System.Collections;
32 using Mono.Linker;
33 using Mono.Linker.Steps;
35 using Mono.Cecil;
37 namespace Mono.Tuner {
39 public class FilterAttributes : BaseStep {
41 static Hashtable attributes = new Hashtable ();
43 static FilterAttributes ()
45 FilterAttribute ("System.Runtime.InteropServices.ComVisibleAttribute");
48 static void FilterAttribute (string fullname)
50 attributes.Add (fullname, null);
53 protected override void ProcessAssembly (AssemblyDefinition assembly)
55 if (Annotations.GetAction (assembly) != AssemblyAction.Link)
56 return;
58 Filter (assembly);
60 foreach (ModuleDefinition module in assembly.Modules)
61 ProcessModule (module);
64 static void ProcessModule (ModuleDefinition module)
66 Filter (module);
68 foreach (TypeDefinition type in module.Types)
69 ProcessType (type);
72 static void ProcessType (TypeDefinition type)
74 if (type.HasFields)
75 ProcessFields (type.Fields);
77 if (type.HasMethods)
78 ProcessMethods (type.Methods);
80 if (type.HasConstructors)
81 ProcessMethods (type.Constructors);
83 if (type.HasEvents)
84 ProcessEvents (type.Events);
86 if (type.HasProperties)
87 ProcessProperties (type.Properties);
89 ProcessGenericParameters (type);
92 static void ProcessFields (ICollection fields)
94 foreach (FieldDefinition field in fields)
95 Filter (field);
98 static void ProcessMethods (ICollection methods)
100 foreach (MethodDefinition method in methods)
101 ProcessMethod (method);
104 static void ProcessMethod (MethodDefinition method)
106 ProcessGenericParameters (method);
108 Filter (method.ReturnType);
110 if (method.HasParameters)
111 ProcessParameters (method.Parameters);
114 static void ProcessParameters (ICollection parameters)
116 foreach (ParameterDefinition parameter in parameters)
117 Filter (parameter);
120 static void ProcessGenericParameters (IGenericParameterProvider provider)
122 if (!provider.HasGenericParameters)
123 return;
125 foreach (GenericParameter parameter in provider.GenericParameters)
126 Filter (parameter);
129 static void ProcessEvents (ICollection events)
131 foreach (EventDefinition @event in events)
132 Filter (@event);
135 static void ProcessProperties (ICollection properties)
137 foreach (PropertyDefinition property in properties)
138 Filter (property);
141 static void Filter (ICustomAttributeProvider provider)
143 if (!provider.HasCustomAttributes)
144 return;
146 for (int i = 0; i < provider.CustomAttributes.Count; i++) {
147 CustomAttribute attribute = provider.CustomAttributes [i];
148 if (!IsFilteredAttribute (attribute))
149 continue;
151 provider.CustomAttributes.RemoveAt (i--);
155 static bool IsFilteredAttribute (CustomAttribute attribute)
157 return attributes.Contains (attribute.Constructor.DeclaringType.FullName);