/*
- 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)
- {
- sb.Append(c);
+ switch (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, bool resolve)
+ 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)
{
type = asm.ResolveType(name);
}
+ else if (ignoreCase)
+ {
+ type = asm.FindTypeIgnoreCase(name.ToLowerInvariant());
+ }
else
{
type = asm.FindType(name);
{
type = universe.Mscorlib.ResolveType(name);
}
+ else if (ignoreCase)
+ {
+ type = universe.Mscorlib.FindTypeIgnoreCase(name.ToLowerInvariant());
+ }
else
{
type = universe.Mscorlib.FindType(name);
}
else
{
- type = context.FindType(name);
+ if (ignoreCase)
+ {
+ name = name.ToLowerInvariant();
+ type = context.FindTypeIgnoreCase(name);
+ }
+ else
+ {
+ type = context.FindType(name);
+ }
if (type == null && context != universe.Mscorlib)
{
- type = universe.Mscorlib.FindType(name);
+ if (ignoreCase)
+ {
+ type = universe.Mscorlib.FindTypeIgnoreCase(name);
+ }
+ else
+ {
+ type = universe.Mscorlib.FindType(name);
+ }
}
if (type == null && resolve)
{
}
}
}
- return Expand(type, context, throwOnError, originalName, resolve);
+ return Expand(type, context, throwOnError, originalName, resolve, ignoreCase);
}
- internal Type Expand(Type type, Assembly context, bool throwOnError, string originalName, bool resolve)
+ internal Type Expand(Type type, Assembly context, bool throwOnError, string originalName, bool resolve, bool ignoreCase)
{
+ Debug.Assert(!resolve || !ignoreCase);
if (type == null)
{
if (throwOnError)
{
outer = type;
TypeName name = TypeName.Split(TypeNameParser.Unescape(nest));
- type = outer.FindNestedType(name);
+ type = ignoreCase
+ ? outer.FindNestedTypeIgnoreCase(name.ToLowerInvariant())
+ : outer.FindNestedType(name);
if (type == null)
{
if (resolve)
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, resolve);
+ typeArgs[i] = genericParameters[i].GetType(type.Assembly.universe, context, throwOnError, originalName, resolve, ignoreCase);
if (typeArgs[i] == null)
{
return null;