diff options
Diffstat (limited to 'mcs/ilasm/codegen/GenericArguments.cs')
-rw-r--r-- | mcs/ilasm/codegen/GenericArguments.cs | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/mcs/ilasm/codegen/GenericArguments.cs b/mcs/ilasm/codegen/GenericArguments.cs new file mode 100644 index 00000000000..afefa395848 --- /dev/null +++ b/mcs/ilasm/codegen/GenericArguments.cs @@ -0,0 +1,107 @@ +// +// Mono.ILASM.GenericArguments +// +// Author(s): +// Ankit Jain <jankit@novell.com> +// +// Copyright 2005 Novell, Inc (http://www.novell.com) +// + +using System; +using System.Collections; +using System.Text; + +namespace Mono.ILASM { + + public class GenericArguments { + ArrayList type_list; + string type_str; + BaseTypeRef [] type_arr; + bool is_resolved; + PEAPI.Type [] p_type_list; + + public GenericArguments () + { + type_list = null; + type_arr = null; + type_str = null; + is_resolved = false; + p_type_list = null; + } + + public int Count { + get { return type_list.Count; } + } + + public void Add (BaseTypeRef type) + { + if (type == null) + throw new InternalErrorException (); + + if (type_list == null) + type_list = new ArrayList (); + type_list.Add (type); + type_str = null; + type_arr = null; + } + + public BaseTypeRef [] ToArray () + { + if (type_list == null) + return null; + if (type_arr == null) + type_arr = (BaseTypeRef []) type_list.ToArray (typeof (BaseTypeRef)); + + return type_arr; + } + + public PEAPI.Type [] Resolve (CodeGen code_gen) + { + if (is_resolved) + return p_type_list; + + int i = 0; + p_type_list = new PEAPI.Type [type_list.Count]; + foreach (BaseTypeRef type in type_list) { + type.Resolve (code_gen); + p_type_list [i ++] = type.PeapiType; + } + is_resolved = true; + type_str = null; + return p_type_list; + } + + public void Resolve (GenericParameters type_gen_params, GenericParameters method_gen_params) + { + foreach (BaseTypeRef type in type_list) { + BaseGenericTypeRef gtr = type as BaseGenericTypeRef; + if (gtr != null) + gtr.Resolve (type_gen_params, method_gen_params); + } + /* Reset, might have changed (think GenericParamRef) */ + type_str = null; + } + + private void MakeString () + { + //Build full_name (foo < , >) + StringBuilder sb = new StringBuilder (); + sb.Append ("<"); + foreach (BaseTypeRef tr in type_list) + sb.AppendFormat ("{0}, ", tr.FullName); + //Remove the extra ', ' at the end + sb.Length -= 2; + sb.Append (">"); + type_str = sb.ToString (); + } + + public override string ToString () + { + if (type_str == null) + MakeString (); + return type_str; + } + } + +} + |