2 // modifiers.cs: Modifier handling.
5 using System.Reflection;
29 // Compiler specific flags
31 PROPERTY_CUSTOM = 0x4000,
34 DEFAULT_ACCESS_MODIFER = 0x40000,
35 METHOD_EXTENSION = 0x80000,
36 COMPILER_GENERATED = 0x100000,
37 BACKING_FIELD = 0x200000,
38 DEBUGGER_HIDDEN = 0x400000,
40 AccessibilityMask = PUBLIC | PROTECTED | INTERNAL | PRIVATE,
41 AllowedExplicitImplFlags = UNSAFE | EXTERN,
44 static class ModifiersExtensions
46 public static string AccessibilityName (Modifiers mod)
48 switch (mod & Modifiers.AccessibilityMask) {
49 case Modifiers.PUBLIC:
51 case Modifiers.PROTECTED:
53 case Modifiers.PROTECTED | Modifiers.INTERNAL:
54 return "protected internal";
55 case Modifiers.INTERNAL:
57 case Modifiers.PRIVATE:
60 throw new NotImplementedException (mod.ToString ());
64 static public string Name (Modifiers i)
71 case Modifiers.PUBLIC:
73 case Modifiers.PROTECTED:
74 s = "protected"; break;
75 case Modifiers.INTERNAL:
76 s = "internal"; break;
77 case Modifiers.PRIVATE:
79 case Modifiers.ABSTRACT:
80 s = "abstract"; break;
81 case Modifiers.SEALED:
83 case Modifiers.STATIC:
85 case Modifiers.READONLY:
86 s = "readonly"; break;
87 case Modifiers.VIRTUAL:
89 case Modifiers.OVERRIDE:
90 s = "override"; break;
91 case Modifiers.EXTERN:
93 case Modifiers.VOLATILE:
94 s = "volatile"; break;
95 case Modifiers.UNSAFE:
103 // Used by custom property accessors to check whether @modA is more restrictive than @modB
105 public static bool IsRestrictedModifier (Modifiers modA, Modifiers modB)
109 if ((modB & Modifiers.PUBLIC) != 0) {
110 flags = Modifiers.PROTECTED | Modifiers.INTERNAL | Modifiers.PRIVATE;
111 } else if ((modB & Modifiers.PROTECTED) != 0) {
112 if ((modB & Modifiers.INTERNAL) != 0)
113 flags = Modifiers.PROTECTED | Modifiers.INTERNAL;
115 flags |= Modifiers.PRIVATE;
116 } else if ((modB & Modifiers.INTERNAL) != 0)
117 flags = Modifiers.PRIVATE;
119 return modB != modA && (modA & (~flags)) == 0;
122 public static TypeAttributes TypeAttr (Modifiers mod_flags, bool is_toplevel)
124 TypeAttributes t = 0;
127 if ((mod_flags & Modifiers.PUBLIC) != 0)
128 t = TypeAttributes.Public;
129 else if ((mod_flags & Modifiers.PRIVATE) != 0)
130 t = TypeAttributes.NotPublic;
132 if ((mod_flags & Modifiers.PUBLIC) != 0)
133 t = TypeAttributes.NestedPublic;
134 else if ((mod_flags & Modifiers.PRIVATE) != 0)
135 t = TypeAttributes.NestedPrivate;
136 else if ((mod_flags & (Modifiers.PROTECTED | Modifiers.INTERNAL)) == (Modifiers.PROTECTED | Modifiers.INTERNAL))
137 t = TypeAttributes.NestedFamORAssem;
138 else if ((mod_flags & Modifiers.PROTECTED) != 0)
139 t = TypeAttributes.NestedFamily;
140 else if ((mod_flags & Modifiers.INTERNAL) != 0)
141 t = TypeAttributes.NestedAssembly;
144 if ((mod_flags & Modifiers.SEALED) != 0)
145 t |= TypeAttributes.Sealed;
146 if ((mod_flags & Modifiers.ABSTRACT) != 0)
147 t |= TypeAttributes.Abstract;
152 public static FieldAttributes FieldAttr (Modifiers mod_flags)
154 FieldAttributes fa = 0;
156 if ((mod_flags & Modifiers.PUBLIC) != 0)
157 fa |= FieldAttributes.Public;
158 if ((mod_flags & Modifiers.PRIVATE) != 0)
159 fa |= FieldAttributes.Private;
160 if ((mod_flags & Modifiers.PROTECTED) != 0) {
161 if ((mod_flags & Modifiers.INTERNAL) != 0)
162 fa |= FieldAttributes.FamORAssem;
164 fa |= FieldAttributes.Family;
166 if ((mod_flags & Modifiers.INTERNAL) != 0)
167 fa |= FieldAttributes.Assembly;
170 if ((mod_flags & Modifiers.STATIC) != 0)
171 fa |= FieldAttributes.Static;
172 if ((mod_flags & Modifiers.READONLY) != 0)
173 fa |= FieldAttributes.InitOnly;
178 public static MethodAttributes MethodAttr (Modifiers mod_flags)
180 MethodAttributes ma = MethodAttributes.HideBySig;
182 switch (mod_flags & Modifiers.AccessibilityMask) {
183 case Modifiers.PUBLIC:
184 ma |= MethodAttributes.Public;
186 case Modifiers.PRIVATE:
187 ma |= MethodAttributes.Private;
189 case Modifiers.PROTECTED | Modifiers.INTERNAL:
190 ma |= MethodAttributes.FamORAssem;
192 case Modifiers.PROTECTED:
193 ma |= MethodAttributes.Family;
195 case Modifiers.INTERNAL:
196 ma |= MethodAttributes.Assembly;
199 throw new NotImplementedException (mod_flags.ToString ());
202 if ((mod_flags & Modifiers.STATIC) != 0)
203 ma |= MethodAttributes.Static;
204 if ((mod_flags & Modifiers.ABSTRACT) != 0) {
205 ma |= MethodAttributes.Abstract | MethodAttributes.Virtual;
207 if ((mod_flags & Modifiers.SEALED) != 0)
208 ma |= MethodAttributes.Final;
210 if ((mod_flags & Modifiers.VIRTUAL) != 0)
211 ma |= MethodAttributes.Virtual;
213 if ((mod_flags & Modifiers.OVERRIDE) != 0) {
214 ma |= MethodAttributes.Virtual;
216 if ((ma & MethodAttributes.Virtual) != 0)
217 ma |= MethodAttributes.NewSlot;
224 // Checks the object @mod modifiers to be in @allowed.
225 // Returns the new mask. Side effect: reports any
226 // incorrect attributes.
228 public static Modifiers Check (Modifiers allowed, Modifiers mod, Modifiers def_access, Location l, Report Report)
230 int invalid_flags = (~(int) allowed) & ((int) mod & ((int) Modifiers.TOP - 1));
233 if (invalid_flags == 0){
235 // If no accessibility bits provided
236 // then provide the defaults.
238 if ((mod & Modifiers.AccessibilityMask) == 0) {
241 mod |= Modifiers.DEFAULT_ACCESS_MODIFER;
248 for (i = 1; i <= (int) Modifiers.TOP; i <<= 1) {
249 if ((i & invalid_flags) == 0)
252 Error_InvalidModifier ((Modifiers)i, l, Report);
255 return allowed & mod;
258 static void Error_InvalidModifier (Modifiers mod, Location l, Report Report)
260 Report.Error (106, l, "The modifier `{0}' is not valid for this item",