2 // modifiers.cs: Modifier handling.
5 using System
.Reflection
;
29 // Compiler specific flags
31 PROPERTY_CUSTOM
= 0x4000,
32 OVERRIDE_UNCHECKED
= 0x8000,
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 (l
, Name ((Modifiers
) i
), Report
);
255 return allowed
& mod
;
258 public static void Error_InvalidModifier (Location l
, string name
, Report Report
)
260 Report
.Error (106, l
, "The modifier `{0}' is not valid for this item", name
);