[w32handle] Stop returning 0 in every cases for locking/unlocking (#3926)
[mono.git] / mcs / tools / tuner / Mono.Tuner / RemoveAttributesBase.cs
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Linq;
5
6 using Mono.Linker;
7 using Mono.Linker.Steps;
8
9 using Mono.Tuner;
10
11 using Mono.Cecil;
12
13 namespace Mono.Tuner {
14
15         public abstract class RemoveAttributesBase : BaseSubStep {
16
17                 public override SubStepTargets Targets {
18                         get {
19                                 return SubStepTargets.Assembly
20                                         | SubStepTargets.Type
21                                         | SubStepTargets.Field
22                                         | SubStepTargets.Method
23                                         | SubStepTargets.Property
24                                         | SubStepTargets.Event;
25                         }
26                 }
27
28                 public override bool IsActiveFor (AssemblyDefinition assembly)
29                 {
30                         return Annotations.GetAction (assembly) == AssemblyAction.Link;
31                 }
32
33                 public override void ProcessAssembly (AssemblyDefinition assembly)
34                 {
35                         ProcessAttributeProvider (assembly);
36                         ProcessAttributeProvider (assembly.MainModule);
37                 }
38
39                 public override void ProcessType (TypeDefinition type)
40                 {
41                         ProcessAttributeProvider (type);
42
43                         if (type.HasGenericParameters)
44                                 ProcessAttributeProviderCollection (type.GenericParameters);
45                 }
46
47                 void ProcessAttributeProviderCollection (IList list)
48                 {
49                         for (int i = 0; i < list.Count; i++)
50                                 ProcessAttributeProvider ((ICustomAttributeProvider) list [i]);
51                 }
52
53                 public override void ProcessField (FieldDefinition field)
54                 {
55                         ProcessAttributeProvider (field);
56                 }
57
58                 public override void ProcessMethod (MethodDefinition method)
59                 {
60                         ProcessMethodAttributeProvider (method);
61                 }
62
63                 void ProcessMethodAttributeProvider (MethodDefinition method)
64                 {
65                         ProcessAttributeProvider (method);
66                         ProcessAttributeProvider (method.MethodReturnType);
67
68                         if (method.HasParameters)
69                                 ProcessAttributeProviderCollection (method.Parameters);
70
71                         if (method.HasGenericParameters)
72                                 ProcessAttributeProviderCollection (method.GenericParameters);
73                 }
74
75                 public override void ProcessProperty (PropertyDefinition property)
76                 {
77                         ProcessAttributeProvider (property);
78                 }
79
80                 public override void ProcessEvent (EventDefinition @event)
81                 {
82                         ProcessAttributeProvider (@event);
83                 }
84
85                 void ProcessAttributeProvider (ICustomAttributeProvider provider)
86                 {
87                         if (!provider.HasCustomAttributes)
88                                 return;
89
90                         for (int i = 0; i < provider.CustomAttributes.Count; i++) {
91                                 var attrib = provider.CustomAttributes [i];
92                                 if (!IsRemovedAttribute (attrib))
93                                         continue;
94
95                                 WillRemoveAttribute (provider, attrib);
96                                 provider.CustomAttributes.RemoveAt (i--);
97                         }
98                 }
99
100                 protected abstract bool IsRemovedAttribute (CustomAttribute attribute);
101                 protected virtual void WillRemoveAttribute (ICustomAttributeProvider provider, CustomAttribute attribute) { }
102         }
103 }