* DefaultArgumentValueAttribute.cs: Remove any trace of executable
[mono.git] / mcs / class / Microsoft.VisualBasic / Microsoft.VisualBasic / Information.cs
1 //
2 // Information.cs
3 //
4 // Author:
5 //   Chris J Breisch (cjbreisch@altavista.net) 
6 //   Francesco Delfino (pluto@tipic.com)
7 //   Rafael Teixeira (rafaelteixeirabr@hotmail.com)
8 //
9 // (C) 2002 Chris J Breisch
10 //     2003 Tipic, Inc. (http://www.tipic.com)
11 //     2004 Rafael Teixeira
12 //
13
14 //
15 // Copyright (c) 2002-2003 Mainsoft Corporation.
16 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
17 //
18 // Permission is hereby granted, free of charge, to any person obtaining
19 // a copy of this software and associated documentation files (the
20 // "Software"), to deal in the Software without restriction, including
21 // without limitation the rights to use, copy, modify, merge, publish,
22 // distribute, sublicense, and/or sell copies of the Software, and to
23 // permit persons to whom the Software is furnished to do so, subject to
24 // the following conditions:
25 // 
26 // The above copyright notice and this permission notice shall be
27 // included in all copies or substantial portions of the Software.
28 // 
29 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
33 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
34 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
35 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 //
37
38 using System;
39 using System.Runtime.InteropServices;
40 using System.Globalization;
41 using Microsoft.VisualBasic.CompilerServices;
42
43 namespace Microsoft.VisualBasic
44 {
45         [StandardModule] 
46         sealed public class Information {
47
48                 private Information ()
49                 {
50                         //Nothing to do here...
51                 }
52
53                 private static int [] QBColorTable = { 0, 8388608, 32768, 8421376, 
54                                                        128, 8388736, 32896, 12632256, 
55                                                        8421504, 16711680, 65280, 16776960, 
56                                                        255, 16711935, 65535, 16777215 };
57
58
59
60                 public static System.Boolean IsArray (Object VarName)
61                 {
62                         if(VarName == null)
63                                 return false;
64                         else
65                                 return VarName is Array;
66                 }
67
68                 public static System.Boolean IsError (Object Expression)
69                 { 
70                         if(Expression == null )
71                                 return false;
72                         else
73                                 return Expression is Exception;
74                 }
75
76                 public static System.Boolean IsReference (Object Expression)
77                 {
78                         return (false == Expression is ValueType);
79                 }
80
81
82
83                 public static System.Boolean IsDate (System.Object Expression)
84                 {
85                         if(Expression == null)
86                                 return false;
87                         else if(Expression is DateTime)
88                                 return true;
89                         else if(Expression is String) {
90                                 try {
91                                         DateTime.Parse((String) Expression);
92                                 }
93                                 catch (Exception e) {
94                                         return false;
95                                 }
96
97                                 return true;
98                         }
99                         else
100                                 return false;
101                 }
102
103
104                 public static System.Boolean IsDBNull (System.Object Expression) 
105                 { 
106                         if(Expression == null)
107                                 return false;
108                         else
109                                 return Expression is DBNull;
110                 }
111
112                 public static System.Boolean IsNothing (System.Object Expression) 
113                 { 
114                         return (Expression == null);
115                 }
116
117                 public static System.Int32 RGB (int Red, int Green, int Blue) 
118                 { 
119                         if(Red < 0)
120                                 throw new ArgumentException(Utils.GetResourceString("Argument_InvalidValue1", "Red"));
121                         if(Green < 0)
122                                 throw new ArgumentException(Utils.GetResourceString("Argument_InvalidValue1", "Green"));
123                         if(Blue < 0)
124                                 throw new ArgumentException(Utils.GetResourceString("Argument_InvalidValue1", "Blue"));
125
126                         if(Red > 255) 
127                                 Red = 255;
128                         if(Green > 255) 
129                                 Green = 255;
130                         if(Blue > 255) 
131                                 Blue = 255;
132
133                         return (((Blue & 0xFF) << 16) | ((Green & 0xFF) << 8) | ((Red & 0xFF) << 0));
134                 }
135
136
137
138
139                 public static System.Boolean IsNumeric (System.Object Expression) 
140                 { 
141
142                         if(Expression == null || Expression is DateTime)
143                                 return false;
144
145                         if(Expression is Int16 || Expression is Int32 || Expression is Int64 || Expression is Decimal ||
146                             Expression is Single || Expression is Double || Expression is Boolean)
147                                 return true;
148         
149
150
151                         try {
152                                 if(Expression is string)
153                                         Double.Parse(Expression as string);
154                                 else
155                                         Double.Parse(Expression.ToString());
156                                 return true;
157                         } catch {} // just dismiss errors but return false
158
159                         return false;
160                 }
161
162                 public static System.Int32 QBColor (System.Int32 Color) 
163                 { 
164                         if(Color < 0 || Color > 15)
165                                 throw new ArgumentException(
166                                                             Utils.GetResourceString("Argument_InvalidValue1", "Color"));
167                         return QBColorTable[Color];
168                 }
169
170                 public static String VbTypeName(String UrtName)
171                 {
172
173                         if(UrtName == null)
174                                 return null;
175
176                         String tmpName = UrtName.Trim().ToLower(CultureInfo.InvariantCulture);
177
178                         if(tmpName.StartsWith("system."))
179                                 tmpName = tmpName.Substring(7);
180
181                         if(tmpName.Equals("object"))
182                                 return "Object";
183                         if(tmpName.Equals("int16"))
184                                 return "Short";
185                         if(tmpName.Equals("clrint16"))
186                                 return "Short";
187                         if(tmpName.Equals("int32"))
188                                 return "Integer";
189                         if(tmpName.Equals("clrint32"))
190                                 return "Integer";
191                         if(tmpName.Equals("int64"))
192                                 return "Long";
193                         if(tmpName.Equals("clrint64"))
194                                 return "Long";
195                         if(tmpName.Equals("clrsingle"))
196                                 return "Single";
197                         if(tmpName.Equals("single"))
198                                 return "Single";
199                         if(tmpName.Equals("double"))
200                                 return "Double";
201                         if(tmpName.Equals("clrdouble"))
202                                 return "Double";
203                         if(tmpName.Equals("boolean"))
204                                 return "Boolean";
205                         if(tmpName.Equals("clrboolean"))
206                                 return "Boolean";
207                         if(tmpName.Equals("char"))
208                                 return "Char";
209                         if(tmpName.Equals("clrchar"))
210                                 return "char";
211                         if(tmpName.Equals("string"))
212                                 return "String";
213                         if(tmpName.Equals("java.lang.string"))
214                                 return "String";
215                         if(tmpName.Equals("byte"))
216                                 return "Byte";
217                         if(tmpName.Equals("clrbyte"))
218                                 return "Byte";
219                         if(tmpName.Equals("decimal"))
220                                 return "Decimal";
221                         if(tmpName.Equals("datetime"))
222                                 return "Date";
223
224                         return null;
225                 }
226
227                 internal static String TypeNameOfCOMObject (Object obj, Boolean flag) 
228                 {
229                         throw new NotImplementedException("Method Microsoft.VisualBasic.Information.TypeNameOfCOMObject() is not supported");
230                 }
231
232                 public static System.Int32 UBound (System.Array Array, 
233                                                    [Optional, __DefaultArgumentValue(1)] 
234                                                    System.Int32 Rank) 
235                 { 
236                         Exception e;
237
238                         if(Array == null) {
239                                 e =  new ArgumentNullException(Utils.GetResourceString("Argument_InvalidNullValue1", "Array"));
240                                 throw (ArgumentNullException) ExceptionUtils.VbMakeException(e, 9);
241                         }
242
243                         e = ExceptionUtils.VbMakeException((Exception) new ArgumentNullException(VBUtils.GetResourceString(9)), 9);
244
245                         if(!IsArray(Array))
246                         {
247                                 throw new ArgumentException("Not array arrived to UBound method of Information class");
248                         }
249
250                         if(Rank < 1 || Rank > Array.Rank)
251                                 throw new RankException(Utils.GetResourceString("Argument_InvalidRank1", "Rank"));
252
253                         return Array.GetUpperBound(Rank-1);
254                 }
255
256                 public static System.Int32 LBound (System.Array Array, 
257                                                    [Optional, __DefaultArgumentValue(1)] 
258                                                    System.Int32 Rank) 
259                 { 
260                         Exception e;
261
262                         if(Array == null) {
263                                 e = new ArgumentNullException(Utils.GetResourceString("Argument_InvalidNullValue1", "Array"));
264                                 throw (ArgumentNullException)ExceptionUtils.VbMakeException(e, 9);
265                         }
266
267                         if(!IsArray(Array)) {
268                                 throw new ArgumentException("Not array arrived to LBound method of Information class");
269                         }
270
271                         if(Rank < 1 || Rank > Array.Rank)
272                                 throw new RankException(Utils.GetResourceString("Argument_InvalidRank1", "Rank"));
273
274                         return Array.GetLowerBound(Rank-1);
275                 }
276
277                 public static Microsoft.VisualBasic.ErrObject Err() 
278                 { 
279                         return ProjectData.Err;
280                 }
281
282                 [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] 
283                 public static System.Int32 Erl () 
284                 { 
285                         return ProjectData.Err.Erl;
286                 }
287
288                 public static System.String TypeName (System.Object VarName) 
289                 { 
290                         String name;
291                         Boolean isArray = false;
292
293                         if(VarName == null)
294                                 return "Nothing";
295
296                         Type type = VarName.GetType();
297                         if(type.IsArray) {
298                                 isArray = true;
299                                 type = type.GetElementType();
300                         }
301                         if(type.IsEnum)
302                                 name = type.Name;
303                         else {
304                                 switch(Type.GetTypeCode(type)) {
305                                 case TypeCode.DBNull:
306                                         name = "DBNull";
307                                         break;
308                                 case TypeCode.Boolean:
309                                         name = "Boolean";
310                                         break;
311                                 case TypeCode.Char:
312                                         name = "Char";
313                                         break;
314                                 case TypeCode.Byte:
315                                         name = "Byte";
316                                         break;
317                                 case TypeCode.Int16:
318                                         name = "Short";
319                                         break;
320                                 case TypeCode.Int32:
321                                         name = "Integer";
322                                         break;
323                                 case TypeCode.Int64:
324                                         name = "Long";
325                                         break;
326                                 case TypeCode.Single:
327                                         name = "Single";
328                                         break;
329                                 case TypeCode.Double:
330                                         name = "Double";
331                                         break;
332                                 case TypeCode.Decimal:
333                                         name = "Decimal";
334                                         break;
335                                 case TypeCode.DateTime:
336                                         name = "Date";
337                                         break;
338                                 case TypeCode.String:
339                                         name = "String";
340                                         break;
341                                 default :
342                                         name = type.Name;
343                                         break;
344                                 }
345                                 
346                                 // the following is commented even with mainsoft
347
348                                 // if(type.get_IsCOMObject() && name.equals("__ComObject"))
349                                 // {
350                                 //      throw new NotImplementedException("COM Objects unsupported in TypeName of Information");
351                                 // }
352                         }
353                         int index = name.IndexOf('+');
354                         if(index >= 0)
355                                 name = name.Substring(index + 1);
356
357                         if(isArray == true) {
358                                 int rank = (VarName as Array).Rank;
359                                 if(rank == 1)
360                                         name = name + "[]";
361                                 else {
362                                         name = name + "[";
363                                         for (int i = 0; i < rank - 1; i++)
364                                                 name += ',';
365                                         name = name + "]";
366                                 }
367                                 name = Utils.VBFriendlyNameOfTypeName(name);
368                         }
369                         return name;
370                 }
371
372                 public static System.String SystemTypeName (System.String VbName) 
373                 { 
374                         String tmpStr = VbName.Trim().ToLower(CultureInfo.InvariantCulture);
375                         if(tmpStr.Equals("object"))
376                                 return "System.Object";
377                         if(tmpStr.Equals("short"))
378                                 return "System.Int16";
379                         if(tmpStr.Equals("integer"))
380                                 return "System.Int32";
381                         if(tmpStr.Equals("single"))
382                                 return "System.Single";
383                         if(tmpStr.Equals("double"))
384                                 return "System.Double";
385                         if(tmpStr.Equals("date"))
386                                 return "System.DateTime";
387                         if(tmpStr.Equals("string"))
388                                 return "System.String";
389                         if(tmpStr.Equals("boolean"))
390                                 return "System.Boolean";
391                         if(tmpStr.Equals("decimal"))
392                                 return "System.Decimal";
393                         if(tmpStr.Equals("byte"))
394                                 return "System.Byte";
395                         if(tmpStr.Equals("char"))
396                                 return "System.Char";
397                         if(tmpStr.Equals("long"))
398                                 return "System.Int64";
399
400                         return null;
401                 }
402
403                 [MonoTODO]
404                 public static VariantType VarType(Object VarName)
405                 {
406                         if(VarName == null)
407                                 return VariantType.Object;
408
409                         if(VarName is Exception)
410                                 return VariantType.Error;
411
412                         return varType(VarName.GetType());
413                 }
414
415                 private static VariantType varType(Type varType)
416                 {
417                         if(varType == null)
418                                 return VariantType.Object;
419
420                         if(varType.IsArray) {
421
422                                 Type type = varType.GetElementType();
423                                 if(type.IsArray)
424                                         return VariantType.ObjectArray;
425
426                                 int elemVal = (int) Information.varType(type);
427                                 return (VariantType)((int)VariantType.Array | elemVal);
428                         }
429         
430                         if(varType.IsEnum)
431                                 varType = Enum.GetUnderlyingType(varType);
432
433                         if(varType == null)
434                                 return VariantType.Empty;
435
436                         switch(Type.GetTypeCode(varType)) {
437                         case TypeCode.Empty:    
438                                 return VariantType.Empty;
439                         case TypeCode.DBNull:   
440                                 return VariantType.Null;
441                         case TypeCode.Boolean:  
442                                 return VariantType.Boolean;
443                         case TypeCode.Char:     
444                                 return VariantType.Char;
445                         case TypeCode.Byte:     
446                                 return VariantType.Byte;
447                         case TypeCode.Int16:    
448                                 return VariantType.Short;
449                         case TypeCode.Int32:    
450                                 return VariantType.Integer;
451                         case TypeCode.Int64:    
452                                 return VariantType.Long;
453                         case TypeCode.Single:   
454                                 return VariantType.Single;
455                         case TypeCode.Double:   
456                                 return VariantType.Double;
457                         case TypeCode.Decimal:  
458                                 return VariantType.Decimal;
459                         case TypeCode.DateTime: 
460                                 return VariantType.Date;
461                         case TypeCode.String:   
462                                 return VariantType.String;
463                         }
464
465                         if(varType.IsSubclassOf(typeof(System.Exception)))
466                                 return VariantType.Error;
467
468                         if(varType.IsValueType)
469                                 return VariantType.UserDefinedType;
470
471                         return VariantType.Object;
472                 }
473         }
474 }
475
476