linux-packaging-mono/mcs/ilasm/codegen/GenericArguments.cs
Xamarin Public Jenkins (auto-signing) ef583813eb Imported Upstream version 6.4.0.137
Former-commit-id: 943baa9f16a098c33e129777827f3a9d20da00d6
2019-07-26 19:53:28 +00:00

112 lines
2.3 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 ();
var prim = PrimitiveTypeRef.GetPrimitiveType (type.FullName);
if (prim != null)
type_list.Add (prim);
else
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;
}
}
}