2 // modifiers.cs: Modifier handling.
5 using System
.Reflection
;
7 namespace Mono
.MonoBASIC
{
8 public class Modifiers
{
11 // The ordering of the following 4 constants
12 // has been carefully done.
14 public const int PROTECTED
= 0x00001;
15 public const int PUBLIC
= 0x00002;
16 public const int PRIVATE
= 0x00004;
17 public const int INTERNAL
= 0x00008;
18 public const int NEW
= 0x00010;
19 public const int ABSTRACT
= 0x00020;
20 public const int SEALED
= 0x00040;
21 public const int STATIC
= 0x00080;
22 public const int READONLY
= 0x00100;
23 public const int VIRTUAL
= 0x00200;
24 public const int OVERRIDE
= 0x00400;
25 public const int EXTERN
= 0x00800;
26 public const int VOLATILE
= 0x01000;
27 public const int UNSAFE
= 0x02000;
28 public const int WRITEONLY
= 0x04000;
29 // Todo : Shadows needs implementation
30 public const int SHADOWS
= 0x08000;
31 public const int DEFAULT
= 0x10000;
32 public const int NONVIRTUAL
= 0x20000;
33 private const int TOP
= 0x20000;
36 public const int Accessibility
=
37 PUBLIC
| PROTECTED
| INTERNAL
| PRIVATE
;
39 static public string Name (int i
)
45 s
= "overloads"; break;
46 case Modifiers
.PUBLIC
:
48 case Modifiers
.PROTECTED
:
49 s
= "protected"; break;
50 case Modifiers
.INTERNAL
:
52 case Modifiers
.PRIVATE
:
54 case Modifiers
.ABSTRACT
:
55 s
= "mustinherit"; break;
56 case Modifiers
.SEALED
:
57 s
= "notinheritable"; break;
58 case Modifiers
.STATIC
:
60 case Modifiers
.READONLY
:
61 s
= "readonly"; break;
62 case Modifiers
.VIRTUAL
:
63 s
= "overridable"; break;
64 case Modifiers
.OVERRIDE
:
65 s
= "overrides"; break;
66 case Modifiers
.EXTERN
:
68 case Modifiers
.VOLATILE
:
69 s
= "volatile"; break;
70 case Modifiers
.SHADOWS
:
72 case Modifiers
.NONVIRTUAL
:
73 s
= "notoveridable"; break;
79 public static TypeAttributes
TypeAttr (int mod_flags
, bool is_toplevel
)
84 if ((mod_flags
& PUBLIC
) != 0)
85 t
|= TypeAttributes
.Public
;
86 if ((mod_flags
& PRIVATE
) != 0)
87 t
|= TypeAttributes
.NotPublic
;
89 if ((mod_flags
& PUBLIC
) != 0)
90 t
|= TypeAttributes
.NestedPublic
;
91 if ((mod_flags
& PRIVATE
) != 0)
92 t
|= TypeAttributes
.NestedPrivate
;
93 if ((mod_flags
& PROTECTED
) != 0 && (mod_flags
& INTERNAL
) != 0)
94 t
|= TypeAttributes
.NestedFamORAssem
;
95 if ((mod_flags
& PROTECTED
) != 0)
96 t
|= TypeAttributes
.NestedFamily
;
97 if ((mod_flags
& INTERNAL
) != 0)
98 t
|= TypeAttributes
.NestedAssembly
;
101 if ((mod_flags
& SEALED
) != 0)
102 t
|= TypeAttributes
.Sealed
;
103 if ((mod_flags
& ABSTRACT
) != 0)
104 t
|= TypeAttributes
.Abstract
;
109 public static TypeAttributes
TypeAttr (int mod_flags
, TypeContainer caller
)
111 TypeAttributes t
= TypeAttr (mod_flags
, caller
.IsTopLevel
);
113 // If we do not have static constructors, static methods
114 // can be invoked without initializing the type.
115 if (!caller
.HaveStaticConstructor
)
116 t
|= TypeAttributes
.BeforeFieldInit
;
121 public static FieldAttributes
FieldAttr (int mod_flags
)
123 FieldAttributes fa
= 0;
125 if ((mod_flags
& PUBLIC
) != 0)
126 fa
|= FieldAttributes
.Public
;
127 if ((mod_flags
& PRIVATE
) != 0)
128 fa
|= FieldAttributes
.Private
;
129 if ((mod_flags
& PROTECTED
) != 0){
130 if ((mod_flags
& INTERNAL
) != 0)
131 fa
|= FieldAttributes
.FamORAssem
;
133 fa
|= FieldAttributes
.Family
;
135 if ((mod_flags
& INTERNAL
) != 0)
136 fa
|= FieldAttributes
.Assembly
;
139 if ((mod_flags
& STATIC
) != 0)
140 fa
|= FieldAttributes
.Static
;
141 if ((mod_flags
& READONLY
) != 0)
142 fa
|= FieldAttributes
.InitOnly
;
146 public static MethodAttributes
MethodAttr (int mod_flags
)
148 MethodAttributes ma
= 0;
149 if ((mod_flags
& PUBLIC
) != 0)
150 ma
|= MethodAttributes
.Public
;
151 if ((mod_flags
& PRIVATE
) != 0)
152 ma
|= MethodAttributes
.Private
;
153 if ((mod_flags
& PROTECTED
) != 0){
154 if ((mod_flags
& INTERNAL
) != 0)
155 ma
|= MethodAttributes
.FamORAssem
;
157 ma
|= MethodAttributes
.Family
;
159 if ((mod_flags
& INTERNAL
) != 0)
160 ma
|= MethodAttributes
.Assembly
;
163 if ((mod_flags
& STATIC
) != 0)
164 ma
|= MethodAttributes
.Static
;
165 if ((mod_flags
& ABSTRACT
) != 0){
166 ma
|= MethodAttributes
.Abstract
| MethodAttributes
.Virtual
|
167 MethodAttributes
.HideBySig
;
169 if ((mod_flags
& NONVIRTUAL
) != 0)
170 ma
|= MethodAttributes
.Final
;
172 if ((mod_flags
& VIRTUAL
) != 0)
173 ma
|= MethodAttributes
.Virtual
;
175 if ((mod_flags
& OVERRIDE
) != 0)
176 ma
|= MethodAttributes
.Virtual
| MethodAttributes
.HideBySig
;
178 if ((ma
& MethodAttributes
.Virtual
) != 0)
179 ma
|= MethodAttributes
.NewSlot
;
182 if ((mod_flags
& NEW
) != 0)
183 ma
|= MethodAttributes
.HideBySig
;
185 //if ((mod_flags & SHADOWS) != 0)
192 // Checks the object @mod modifiers to be in @allowed.
193 // Returns the new mask. Side effect: reports any
194 // incorrect attributes.
196 public static int Check (int allowed
, int mod
, int def_access
, Location l
)
198 int invalid_flags
= (~allowed
) & mod
;
201 if (invalid_flags
== 0){
204 if ((mod
& Modifiers
.UNSAFE
) != 0){
205 if (!RootContext
.Unsafe
){
206 Report
.Error (227, l
,
207 "Unsafe code requires the --unsafe command " +
208 "line option to be specified");
213 // If no accessibility bits provided
214 // then provide the defaults.
216 if ((mod
& Accessibility
) == 0){
222 // Make sure that no conflicting accessibility
223 // bits have been set. Protected+Internal is
224 // allowed, that is why they are placed on bits
225 // 1 and 4 (so the shift 3 basically merges them)
229 a
= ((a
& 2) >> 1) + (a
& 5);
230 a
= ((a
& 4) >> 2) + (a
& 3);
232 Report
.Error (30176, l
, "More than one protection modifier specified");
237 for (i
= 1; i
< TOP
; i
<<= 1){
238 if ((i
& invalid_flags
) == 0)
241 Error_InvalidModifier (l
, Name (i
));
244 return allowed
& mod
;
247 public static void Error_InvalidModifier (Location l
, string name
)
249 Report
.Error (30233, l
, "the modifier " + name
+ " is not valid for this item");