5 // Jb Evain (jbevain@novell.com)
7 // (C) 2009 Novell, Inc.
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.
30 using System.Collections;
33 using Mono.Linker.Steps;
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)
60 foreach (ModuleDefinition module in assembly.Modules)
61 ProcessModule (module);
64 static void ProcessModule (ModuleDefinition module)
68 foreach (TypeDefinition type in module.Types)
72 static void ProcessType (TypeDefinition type)
75 ProcessFields (type.Fields);
78 ProcessMethods (type.Methods);
81 ProcessEvents (type.Events);
83 if (type.HasProperties)
84 ProcessProperties (type.Properties);
86 ProcessGenericParameters (type);
89 static void ProcessFields (ICollection fields)
91 foreach (FieldDefinition field in fields)
95 static void ProcessMethods (ICollection methods)
97 foreach (MethodDefinition method in methods)
98 ProcessMethod (method);
101 static void ProcessMethod (MethodDefinition method)
103 ProcessGenericParameters (method);
105 Filter (method.MethodReturnType);
107 if (method.HasParameters)
108 ProcessParameters (method.Parameters);
111 static void ProcessParameters (ICollection parameters)
113 foreach (ParameterDefinition parameter in parameters)
117 static void ProcessGenericParameters (IGenericParameterProvider provider)
119 if (!provider.HasGenericParameters)
122 foreach (GenericParameter parameter in provider.GenericParameters)
126 static void ProcessEvents (ICollection events)
128 foreach (EventDefinition @event in events)
132 static void ProcessProperties (ICollection properties)
134 foreach (PropertyDefinition property in properties)
138 static void Filter (ICustomAttributeProvider provider)
140 if (!provider.HasCustomAttributes)
143 for (int i = 0; i < provider.CustomAttributes.Count; i++) {
144 CustomAttribute attribute = provider.CustomAttributes [i];
145 if (!IsFilteredAttribute (attribute))
148 provider.CustomAttributes.RemoveAt (i--);
152 static bool IsFilteredAttribute (CustomAttribute attribute)
154 return attributes.Contains (attribute.Constructor.DeclaringType.FullName);