/*
- Copyright (C) 2009-2011 Jeroen Frijters
+ Copyright (C) 2009-2012 Jeroen Frijters
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
*/
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Text;
namespace IKVM.Reflection
return this == other;
}
+ internal TypeName ToLowerInvariant()
+ {
+ return new TypeName(ns == null ? null : ns.ToLowerInvariant(), name.ToLowerInvariant());
+ }
+
internal static TypeName Split(string name)
{
int dot = name.LastIndexOf('.');
for (int pos = 0; pos < name.Length; pos++)
{
char c = name[pos];
- if (SpecialChars.IndexOf(c) != -1)
- {
- if (sb == null)
- {
- sb = new StringBuilder(name, 0, pos, name.Length + 3);
- }
- sb.Append('\\').Append(c);
- }
- else if (sb != null)
+ switch (c)
{
- sb.Append(c);
+ case '\\':
+ case '+':
+ case ',':
+ case '[':
+ case ']':
+ case '*':
+ case '&':
+ if (sb == null)
+ {
+ sb = new StringBuilder(name, 0, pos, name.Length + 3);
+ }
+ sb.Append("\\").Append(c);
+ break;
+ default:
+ if (sb != null)
+ {
+ sb.Append(c);
+ }
+ break;
}
}
return sb != null ? sb.ToString() : name;
}
}
- internal Type GetType(Universe universe, Assembly context, bool throwOnError, string originalName)
+ internal Type GetType(Universe universe, Assembly context, bool throwOnError, string originalName, bool resolve, bool ignoreCase)
{
+ Debug.Assert(!resolve || !ignoreCase);
+ TypeName name = TypeName.Split(this.name);
Type type;
if (assemblyName != null)
{
{
return null;
}
- type = asm.GetTypeImpl(name);
+ if (resolve)
+ {
+ type = asm.ResolveType(name);
+ }
+ else if (ignoreCase)
+ {
+ type = asm.FindTypeIgnoreCase(name.ToLowerInvariant());
+ }
+ else
+ {
+ type = asm.FindType(name);
+ }
}
else if (context == null)
{
- type = universe.Mscorlib.GetTypeImpl(name);
+ if (resolve)
+ {
+ type = universe.Mscorlib.ResolveType(name);
+ }
+ else if (ignoreCase)
+ {
+ type = universe.Mscorlib.FindTypeIgnoreCase(name.ToLowerInvariant());
+ }
+ else
+ {
+ type = universe.Mscorlib.FindType(name);
+ }
}
else
{
- type = context.GetTypeImpl(name);
+ if (ignoreCase)
+ {
+ name = name.ToLowerInvariant();
+ type = context.FindTypeIgnoreCase(name);
+ }
+ else
+ {
+ type = context.FindType(name);
+ }
if (type == null && context != universe.Mscorlib)
{
- type = universe.Mscorlib.GetTypeImpl(name);
+ if (ignoreCase)
+ {
+ type = universe.Mscorlib.FindTypeIgnoreCase(name);
+ }
+ else
+ {
+ type = universe.Mscorlib.FindType(name);
+ }
+ }
+ if (type == null && resolve)
+ {
+ if (universe.Mscorlib.__IsMissing && !context.__IsMissing)
+ {
+ type = universe.Mscorlib.ResolveType(name);
+ }
+ else
+ {
+ type = context.ResolveType(name);
+ }
}
}
- return Expand(type, context, throwOnError, originalName);
+ return Expand(type, context, throwOnError, originalName, resolve, ignoreCase);
}
- internal Type Expand(Type type, Assembly context, bool throwOnError, string originalName)
+ internal Type Expand(Type type, Assembly context, bool throwOnError, string originalName, bool resolve, bool ignoreCase)
{
+ Debug.Assert(!resolve || !ignoreCase);
if (type == null)
{
if (throwOnError)
}
if (nested != null)
{
+ Type outer;
foreach (string nest in nested)
{
- type = type.FindNestedType(TypeName.Split(TypeNameParser.Unescape(nest)));
+ outer = type;
+ TypeName name = TypeName.Split(TypeNameParser.Unescape(nest));
+ type = ignoreCase
+ ? outer.FindNestedTypeIgnoreCase(name.ToLowerInvariant())
+ : outer.FindNestedType(name);
if (type == null)
{
- if (throwOnError)
+ if (resolve)
+ {
+ type = outer.Module.universe.GetMissingTypeOrThrow(outer.Module, outer, name);
+ }
+ else if (throwOnError)
{
throw new TypeLoadException(originalName);
}
- return null;
+ else
+ {
+ return null;
+ }
}
}
}
Type[] typeArgs = new Type[genericParameters.Length];
for (int i = 0; i < typeArgs.Length; i++)
{
- typeArgs[i] = genericParameters[i].GetType(type.Assembly.universe, context, throwOnError, originalName);
+ typeArgs[i] = genericParameters[i].GetType(type.Assembly.universe, context, throwOnError, originalName, resolve, ignoreCase);
if (typeArgs[i] == null)
{
return null;