linux-packaging-mono/mcs/ilasm/codegen/GenericArguments.cs
Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

108 lines
2.1 KiB
C#

//
// 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;
}
}
}