Merge pull request #3269 from alexanderkyte/silence_zero_len
[mono.git] / mcs / ilasm / scanner / ILToken.cs
1 // ILToken.cs\r
2 // Author: Sergey Chaban (serge@wildwestsoftware.com)\r
3 \r
4 \r
5 using System;\r
6 \r
7 namespace Mono.ILASM {\r
8 \r
9         public class ILToken : ICloneable {\r
10                 internal int token;\r
11                 internal object val;\r
12 \r
13                 public static readonly ILToken Invalid;\r
14                 public static readonly ILToken EOF;\r
15 \r
16                 public static readonly ILToken Dot;\r
17 \r
18                 public static readonly ILToken OpenBrace;\r
19                 public static readonly ILToken CloseBrace;\r
20                 public static readonly ILToken OpenBracket;\r
21                 public static readonly ILToken CloseBracket;\r
22                 public static readonly ILToken OpenParens;\r
23                 public static readonly ILToken CloseParens;\r
24                 public static readonly ILToken Comma;\r
25                 public static readonly ILToken Colon;\r
26                 public static readonly ILToken DoubleColon;\r
27                 public static readonly ILToken Semicolon;\r
28                 public static readonly ILToken Assign;\r
29                 public static readonly ILToken Star;\r
30                 public static readonly ILToken Ampersand;\r
31                 public static readonly ILToken Plus;\r
32                 public static readonly ILToken Slash;\r
33                 public static readonly ILToken Bang;\r
34                 public static readonly ILToken Ellipsis;\r
35                 public static readonly ILToken Dash;\r
36                 public static readonly ILToken OpenAngleBracket;\r
37                 public static readonly ILToken CloseAngleBracket;\r
38 \r
39                 private static readonly ILToken [] punctuations;\r
40 \r
41                 /// <summary>\r
42                 /// </summary>\r
43                 static ILToken ()\r
44                 {\r
45                         Invalid = new ILToken (-1, "invalid");\r
46                         EOF = new ILToken (Token.EOF, "eof");\r
47 \r
48                         Dot = new ILToken (Token.DOT, ".");\r
49                         OpenBrace = new ILToken (Token.OPEN_BRACE, "{");\r
50                         CloseBrace = new ILToken (Token.CLOSE_BRACE, "}");\r
51                         OpenBracket = new ILToken (Token.OPEN_BRACKET, "[");\r
52                         CloseBracket = new ILToken (Token.CLOSE_BRACKET, "]");\r
53                         OpenParens = new ILToken (Token.OPEN_PARENS, "(");\r
54                         CloseParens = new ILToken (Token.CLOSE_PARENS, ")");\r
55                         Comma = new ILToken (Token.COMMA, ",");\r
56                         Colon = new ILToken (Token.COLON, ":");\r
57                         DoubleColon = new ILToken (Token.DOUBLE_COLON, "::");\r
58                         Semicolon = new ILToken (Token.SEMICOLON, ";");\r
59                         Assign = new ILToken (Token.ASSIGN, "=");\r
60                         Star = new ILToken (Token.STAR, "*");\r
61                         Ampersand = new ILToken (Token.AMPERSAND, "&");\r
62                         Plus = new ILToken (Token.PLUS, "+");\r
63                         Slash = new ILToken (Token.SLASH, "/");\r
64                         Bang = new ILToken (Token.BANG, "!");\r
65                         Ellipsis = new ILToken (Token.ELLIPSIS, "...");\r
66                         Dash = new ILToken (Token.DASH, "-");\r
67                         OpenAngleBracket = new ILToken (Token.OPEN_ANGLE_BRACKET, "<");\r
68                         CloseAngleBracket = new ILToken (Token.CLOSE_ANGLE_BRACKET, ">");\r
69 \r
70                         punctuations = new ILToken [] {\r
71                                 OpenBrace, CloseBrace,\r
72                                 OpenBracket, CloseBracket,\r
73                                 OpenParens, CloseParens,\r
74                                 Comma, Colon, Semicolon,\r
75                                 Assign, Star, Ampersand,\r
76                                 Plus, Slash, Bang,\r
77                                 OpenAngleBracket, CloseAngleBracket\r
78                         };\r
79                 }\r
80 \r
81                 /// <summary>\r
82                 /// </summary>\r
83                 public ILToken ()\r
84                 {\r
85                 }\r
86 \r
87                 /// <summary>\r
88                 /// </summary>\r
89                 /// <param name="token"></param>\r
90                 /// <param name="val"></param>\r
91                 public ILToken (int token, object val)\r
92                 {\r
93                         this.token = token;\r
94                         this.val = val;\r
95                 }\r
96 \r
97 \r
98                 /// <summary>\r
99                 /// </summary>\r
100                 /// <param name="that"></param>\r
101                 public ILToken (ILToken that)\r
102                 {\r
103                         this.token = that.token;\r
104                         this.val = that.val;\r
105                 }\r
106 \r
107 \r
108 \r
109                 /// <summary>\r
110                 /// </summary>\r
111                 public int TokenId {\r
112                         get {\r
113                                 return token;\r
114                         }\r
115                 }\r
116 \r
117                 /// <summary>\r
118                 /// </summary>\r
119                 public object Value {\r
120                         get {\r
121                                 return val;\r
122                         }\r
123                 }\r
124 \r
125 \r
126                 /// <summary>\r
127                 /// </summary>\r
128                 /// <param name="that"></param>\r
129                 public virtual void CopyFrom (ILToken that)\r
130                 {\r
131                         this.token = that.token;\r
132                         this.val = that.val;\r
133                 }\r
134 \r
135 \r
136                 /// <summary>\r
137                 /// </summary>\r
138                 /// <returns></returns>\r
139                 public virtual object Clone ()\r
140                 {\r
141                         return new ILToken (this);\r
142                 }\r
143 \r
144 \r
145                 /// <summary>\r
146                 /// </summary>\r
147                 /// <returns></returns>\r
148                 public override int GetHashCode ()\r
149                 {\r
150                         int h = token;\r
151                         if (val != null) h ^= val.GetHashCode ();\r
152                         return h;\r
153                 }\r
154 \r
155 \r
156                 /// <summary>\r
157                 /// </summary>\r
158                 /// <returns></returns>\r
159                 public override string ToString ()\r
160                 {\r
161                         return (token.ToString() + " : " + (val != null ? val.ToString () : "<null>"));\r
162                 }\r
163 \r
164 \r
165                 /// <summary>\r
166                 /// </summary>\r
167                 /// <param name="o"></param>\r
168                 /// <returns></returns>\r
169                 public override bool Equals (object o)\r
170                 {\r
171                         bool res = (o != null);\r
172 \r
173                         if (res) {\r
174                                 res = Object.ReferenceEquals (this, o);\r
175                                 if (!res) {\r
176                                         res = o is ILToken;\r
177                                         if (res) {\r
178                                                 ILToken that = o as ILToken;\r
179                                                 res = (this.token == that.token) && (this.val.Equals (that.val));\r
180                                         }\r
181                                 }\r
182                         }\r
183 \r
184                         return res;\r
185                 }\r
186 \r
187 \r
188                 private static bool EqImpl (ILToken t1, ILToken t2)\r
189                 {\r
190                         bool res = false;\r
191                         if ((t1 as object) != null) {\r
192                                 res = t1.Equals (t2);\r
193                         } else {\r
194                                 res = ((t2 as object) == null);\r
195                         }\r
196 \r
197                         return res;\r
198                 }\r
199 \r
200 \r
201                 /// <summary>\r
202                 /// </summary>\r
203                 /// <param name="t1"></param>\r
204                 /// <param name="t2"></param>\r
205                 /// <returns></returns>\r
206                 public static bool operator == (ILToken t1, ILToken t2)\r
207                 {\r
208                         return EqImpl (t1, t2);\r
209                 }\r
210 \r
211                 /// <summary>\r
212                 /// </summary>\r
213                 /// <param name="t1"></param>\r
214                 /// <param name="t2"></param>\r
215                 /// <returns></returns>\r
216                 public static bool operator != (ILToken t1, ILToken t2)\r
217                 {\r
218                         return !EqImpl (t1, t2);\r
219                 }\r
220 \r
221 \r
222 \r
223                 /// <summary>\r
224                 /// </summary>\r
225                 /// <param name="ch"></param>\r
226                 /// <returns></returns>\r
227                 public static ILToken GetPunctuation (int ch)\r
228                 {\r
229                         int id = "{}[](),:;=*&+/!<>".IndexOf ((char) ch);\r
230                         ILToken res = null;\r
231 \r
232                         if (id != -1) {\r
233                                 res = punctuations [id];\r
234                         }\r
235 \r
236                         return res;\r
237                 }\r
238 \r
239 \r
240         }\r
241 }\r