2001-11-05 Miguel de Icaza <miguel@ximian.com>
[mono.git] / mcs / mcs / support.cs
1 //
2 // support.cs: Support routines to work around the fact that System.Reflection.Emit
3 // can not introspect types that are being constructed
4 //
5 // Author:
6 //   Miguel de Icaza (miguel@ximian.com)
7 //
8 // (C) 2001 Ximian, Inc (http://www.ximian.com)
9 //
10
11 using System.Reflection.Emit;
12 using System.Reflection;
13 using System;
14 using System.Text;
15
16 namespace CIR {
17
18         public interface ParameterData {
19                 Type ParameterType (int pos);
20                 int  Count { get; }
21                 string ParameterDesc (int pos);
22                 Parameter.Modifier ParameterModifier (int pos);
23         }
24
25         public class ReflectionParameters : ParameterData {
26                 ParameterInfo [] pi;
27
28                 public ReflectionParameters (ParameterInfo [] pi)
29                 {
30                         this.pi = pi;
31                 }
32                        
33                 public Type ParameterType (int pos)
34                 {
35                         return pi [pos].ParameterType;
36                 }
37
38                 public string ParameterDesc (int pos)
39                 {
40                         StringBuilder sb = new StringBuilder ();
41
42                         if (pi [pos].IsOut)
43                                 sb.Append ("out ");
44
45                         if (pi [pos].IsIn)
46                                 sb.Append ("in ");
47
48                         sb.Append (TypeManager.CSharpName (ParameterType (pos)));
49
50                         return sb.ToString ();
51                         
52                 }
53
54                 public Parameter.Modifier ParameterModifier (int pos)
55                 {
56                         if (pi [pos].IsOut)
57                                 return Parameter.Modifier.OUT;
58
59                         return Parameter.Modifier.NONE;
60                 }
61
62                 public int Count {
63                         get {
64                                 return pi.Length;
65                         }
66                 }
67                 
68         }
69
70         public class InternalParameters : ParameterData {
71                 Type [] param_types;
72
73                 Parameters parameters;
74                 
75                 public InternalParameters (TypeContainer tc, Parameters parameters)
76                 {
77                         this.param_types = parameters.GetParameterInfo (tc);
78                         this.parameters = parameters;
79                 }
80
81                 public int Count {
82                         get {
83                                 if (param_types == null)
84                                         return 0;
85
86                                 return param_types.Length;
87                         }
88                 }
89
90                 public Type ParameterType (int pos)
91                 {
92                         if (param_types == null)
93                                 return null;
94
95                         Parameter p;
96                         
97                         if (pos == parameters.FixedParameters.Length)
98                                 p = parameters.ArrayParameter;
99                         else
100                                 p = parameters.FixedParameters [pos];
101
102                         Type t = param_types [pos];
103                         string name = t.FullName;
104                         
105                         if (p.ModFlags == Parameter.Modifier.REF ||
106                             p.ModFlags == Parameter.Modifier.OUT)
107                                 t = Type.GetType (name.Substring (0, name.Length - 1));
108                         
109                         return t;
110                 }
111
112                 public string ParameterDesc (int pos)
113                 {
114                         string tmp = null;
115                         Parameter p;
116
117                         if (pos == parameters.FixedParameters.Length)
118                                 p = parameters.ArrayParameter;
119                         else
120                                 p = parameters.FixedParameters [pos];
121                         
122                         if (p.ModFlags == Parameter.Modifier.REF)
123                                 tmp = "ref ";
124                         else if (p.ModFlags == Parameter.Modifier.OUT)
125                                 tmp = "out ";
126                         else if (p.ModFlags == Parameter.Modifier.PARAMS)
127                                 tmp = "params ";
128
129                         Type t = ParameterType (pos);
130
131                         return tmp + TypeManager.CSharpName (t);
132                 }
133
134                 public Parameter.Modifier ParameterModifier (int pos)
135                 {
136                         if (pos == parameters.FixedParameters.Length)
137                                 return parameters.ArrayParameter.ModFlags;
138                         else
139                                 return parameters.FixedParameters [pos].ModFlags;
140                 }
141                 
142         }
143 }