2 // modifiers.cs: Modifier handling.
5 using System
.Reflection
;
7 namespace Mono
.CSharp
{
8 public class Modifiers
{
11 // The ordering of the following 4 constants
12 // has been carefully done.
14 public const int PROTECTED
= 0x0001;
15 public const int PUBLIC
= 0x0002;
16 public const int PRIVATE
= 0x0004;
17 public const int INTERNAL
= 0x0008;
18 public const int NEW
= 0x0010;
19 public const int ABSTRACT
= 0x0020;
20 public const int SEALED
= 0x0040;
21 public const int STATIC
= 0x0080;
22 public const int READONLY
= 0x0100;
23 public const int VIRTUAL
= 0x0200;
24 public const int OVERRIDE
= 0x0400;
25 public const int EXTERN
= 0x0800;
26 public const int VOLATILE
= 0x1000;
27 public const int UNSAFE
= 0x2000;
28 public const int TOP
= 0x2000;
30 public const int PROPERTY_CUSTOM
= 0x4000; // Custom property modifier
31 public const int PARTIAL
= 0x20000;
32 public const int DEFAULT_ACCESS_MODIFER
= 0x40000;
35 // We use this internally to flag that the method contains an iterator
37 public const int METHOD_YIELDS
= 0x8000;
38 public const int METHOD_GENERIC
= 0x10000;
40 public const int Accessibility
=
41 PUBLIC
| PROTECTED
| INTERNAL
| PRIVATE
;
42 public const int AllowedExplicitImplFlags
=
45 static public string Name (int i
)
52 case Modifiers
.PUBLIC
:
54 case Modifiers
.PROTECTED
:
55 s
= "protected"; break;
56 case Modifiers
.INTERNAL
:
57 s
= "internal"; break;
58 case Modifiers
.PRIVATE
:
60 case Modifiers
.ABSTRACT
:
61 s
= "abstract"; break;
62 case Modifiers
.SEALED
:
64 case Modifiers
.STATIC
:
66 case Modifiers
.READONLY
:
67 s
= "readonly"; break;
68 case Modifiers
.VIRTUAL
:
70 case Modifiers
.OVERRIDE
:
71 s
= "override"; break;
72 case Modifiers
.EXTERN
:
74 case Modifiers
.VOLATILE
:
75 s
= "volatile"; break;
76 case Modifiers
.UNSAFE
:
83 public static string GetDescription (MethodAttributes ma
)
85 if ((ma
& MethodAttributes
.Assembly
) != 0)
88 if ((ma
& MethodAttributes
.Family
) != 0)
91 if ((ma
& MethodAttributes
.Public
) != 0)
94 if ((ma
& MethodAttributes
.FamANDAssem
) != 0)
95 return "protected internal";
97 if ((ma
& MethodAttributes
.Private
) != 0)
100 throw new NotImplementedException (ma
.ToString ());
103 public static TypeAttributes
TypeAttr (int mod_flags
, bool is_toplevel
)
105 TypeAttributes t
= 0;
108 if ((mod_flags
& PUBLIC
) != 0)
109 t
|= TypeAttributes
.Public
;
110 if ((mod_flags
& PRIVATE
) != 0)
111 t
|= TypeAttributes
.NotPublic
;
113 if ((mod_flags
& PUBLIC
) != 0)
114 t
|= TypeAttributes
.NestedPublic
;
115 if ((mod_flags
& PRIVATE
) != 0)
116 t
|= TypeAttributes
.NestedPrivate
;
117 if ((mod_flags
& PROTECTED
) != 0 && (mod_flags
& INTERNAL
) != 0)
118 t
|= TypeAttributes
.NestedFamORAssem
;
119 if ((mod_flags
& PROTECTED
) != 0)
120 t
|= TypeAttributes
.NestedFamily
;
121 if ((mod_flags
& INTERNAL
) != 0)
122 t
|= TypeAttributes
.NestedAssembly
;
125 if ((mod_flags
& SEALED
) != 0)
126 t
|= TypeAttributes
.Sealed
;
127 if ((mod_flags
& ABSTRACT
) != 0)
128 t
|= TypeAttributes
.Abstract
;
133 public static FieldAttributes
FieldAttr (int mod_flags
)
135 FieldAttributes fa
= 0;
137 if ((mod_flags
& PUBLIC
) != 0)
138 fa
|= FieldAttributes
.Public
;
139 if ((mod_flags
& PRIVATE
) != 0)
140 fa
|= FieldAttributes
.Private
;
141 if ((mod_flags
& PROTECTED
) != 0){
142 if ((mod_flags
& INTERNAL
) != 0)
143 fa
|= FieldAttributes
.FamORAssem
;
145 fa
|= FieldAttributes
.Family
;
147 if ((mod_flags
& INTERNAL
) != 0)
148 fa
|= FieldAttributes
.Assembly
;
151 if ((mod_flags
& STATIC
) != 0)
152 fa
|= FieldAttributes
.Static
;
153 if ((mod_flags
& READONLY
) != 0)
154 fa
|= FieldAttributes
.InitOnly
;
159 public static MethodAttributes
MethodAttr (int mod_flags
)
161 MethodAttributes ma
= MethodAttributes
.HideBySig
;
163 if ((mod_flags
& PUBLIC
) != 0)
164 ma
|= MethodAttributes
.Public
;
165 if ((mod_flags
& PRIVATE
) != 0)
166 ma
|= MethodAttributes
.Private
;
167 if ((mod_flags
& PROTECTED
) != 0){
168 if ((mod_flags
& INTERNAL
) != 0)
169 ma
|= MethodAttributes
.FamORAssem
;
171 ma
|= MethodAttributes
.Family
;
173 if ((mod_flags
& INTERNAL
) != 0)
174 ma
|= MethodAttributes
.Assembly
;
177 if ((mod_flags
& STATIC
) != 0)
178 ma
|= MethodAttributes
.Static
;
179 if ((mod_flags
& ABSTRACT
) != 0){
180 ma
|= MethodAttributes
.Abstract
| MethodAttributes
.Virtual
;
182 if ((mod_flags
& SEALED
) != 0)
183 ma
|= MethodAttributes
.Final
;
185 if ((mod_flags
& VIRTUAL
) != 0)
186 ma
|= MethodAttributes
.Virtual
;
188 if ((mod_flags
& OVERRIDE
) != 0)
189 ma
|= MethodAttributes
.Virtual
;
191 if ((ma
& MethodAttributes
.Virtual
) != 0)
192 ma
|= MethodAttributes
.NewSlot
;
199 // Checks the object @mod modifiers to be in @allowed.
200 // Returns the new mask. Side effect: reports any
201 // incorrect attributes.
203 public static int Check (int allowed
, int mod
, int def_access
, Location l
)
205 int invalid_flags
= (~allowed
) & mod
;
208 if (invalid_flags
== 0){
211 if ((mod
& Modifiers
.UNSAFE
) != 0){
212 RootContext
.CheckUnsafeOption (l
);
216 // If no accessibility bits provided
217 // then provide the defaults.
219 if ((mod
& Accessibility
) == 0){
222 mod
|= DEFAULT_ACCESS_MODIFER
;
227 // Make sure that no conflicting accessibility
228 // bits have been set. Protected+Internal is
229 // allowed, that is why they are placed on bits
230 // 1 and 4 (so the shift 3 basically merges them)
234 a
= ((a
& 2) >> 1) + (a
& 5);
235 a
= ((a
& 4) >> 2) + (a
& 3);
237 Report
.Error (107, l
, "More than one protection modifier specified");
242 for (i
= 1; i
<= TOP
; i
<<= 1){
243 if ((i
& invalid_flags
) == 0)
246 Error_InvalidModifier (l
, Name (i
));
249 return allowed
& mod
;
252 public static void Error_InvalidModifier (Location l
, string name
)
254 Report
.Error (106, l
, "The modifier `" + name
+ "' is not valid for this item");