Merge pull request #1981 from akoeplinger/ilasm
[mono.git] / mcs / ilasm / codegen / GenericArguments.cs
1 //
2 // Mono.ILASM.GenericArguments
3 //
4 // Author(s):
5 //  Ankit Jain  <jankit@novell.com>
6 //
7 // Copyright 2005 Novell, Inc (http://www.novell.com)
8 //
9
10 using System;
11 using System.Collections;
12 using System.Text;
13
14 namespace Mono.ILASM {
15
16         public class GenericArguments {
17                 ArrayList type_list;
18                 string type_str;
19                 BaseTypeRef [] type_arr;
20                 bool is_resolved;
21                 PEAPI.Type [] p_type_list;
22
23                 public GenericArguments ()
24                 {
25                         type_list = null;
26                         type_arr = null;
27                         type_str = null;
28                         is_resolved = false;
29                         p_type_list = null;
30                 }
31
32                 public int Count {
33                         get { return type_list.Count; }
34                 }
35
36                 public void Add (BaseTypeRef type)
37                 {
38                         if (type == null)
39                                 throw new InternalErrorException ();
40
41                         if (type_list == null)
42                                 type_list = new ArrayList ();
43                         type_list.Add (type);
44                         type_str = null;
45                         type_arr = null;
46                 }
47                 
48                 public BaseTypeRef [] ToArray ()
49                 {
50                         if (type_list == null)
51                                 return null;
52                         if (type_arr == null)
53                                 type_arr = (BaseTypeRef []) type_list.ToArray (typeof (BaseTypeRef));
54
55                         return type_arr;
56                 }
57
58                 public PEAPI.Type [] Resolve (CodeGen code_gen)
59                 {
60                         if (is_resolved)
61                                 return p_type_list;
62
63                         int i = 0;
64                         p_type_list = new PEAPI.Type [type_list.Count];
65                         foreach (BaseTypeRef type in type_list) {
66                                 type.Resolve (code_gen);
67                                 p_type_list [i ++] = type.PeapiType;
68                         }
69                         is_resolved = true;
70                         type_str = null;
71                         return p_type_list;
72                 }
73
74                 public void Resolve (GenericParameters type_gen_params, GenericParameters method_gen_params)
75                 {
76                         foreach (BaseTypeRef type in type_list) {
77                                 BaseGenericTypeRef gtr = type as BaseGenericTypeRef;
78                                 if (gtr != null)
79                                         gtr.Resolve (type_gen_params, method_gen_params);
80                         }
81                         /* Reset, might have changed (think GenericParamRef) */
82                         type_str = null;
83                 }
84
85                 private void MakeString ()
86                 {
87                         //Build full_name (foo < , >)
88                         StringBuilder sb = new StringBuilder ();
89                         sb.Append ("<");
90                         foreach (BaseTypeRef tr in type_list)
91                                 sb.AppendFormat ("{0}, ", tr.FullName);
92                         //Remove the extra ', ' at the end
93                         sb.Length -= 2;
94                         sb.Append (">");
95                         type_str = sb.ToString ();
96                 }
97
98                 public override string ToString ()
99                 {
100                         if (type_str == null)
101                                 MakeString ();
102                         return type_str;
103                 }
104         }
105
106 }
107