|
|
|
@ -139,59 +139,38 @@ namespace ICSharpCode.SharpDevelop.Dom
@@ -139,59 +139,38 @@ namespace ICSharpCode.SharpDevelop.Dom
|
|
|
|
|
} |
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
public static IReturnType Create(IProjectContent content, Type type, bool createLazyReturnType) |
|
|
|
|
public static bool IsDefaultType(Type type) |
|
|
|
|
{ |
|
|
|
|
if (type.IsArray) { |
|
|
|
|
return MakeArray(type, Create(content, type.GetElementType(), createLazyReturnType)); |
|
|
|
|
} else { |
|
|
|
|
string name = type.FullName; |
|
|
|
|
if (name == null) |
|
|
|
|
return null; |
|
|
|
|
if (name.Length > 1) { |
|
|
|
|
if (name[name.Length - 1] == '&') { |
|
|
|
|
name = name.Substring(0, name.Length - 1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
int typeParameterCount = 0; |
|
|
|
|
if (name.Length > 2) { |
|
|
|
|
if (name[name.Length - 2] == '`') { |
|
|
|
|
typeParameterCount = int.Parse(name[name.Length - 1].ToString()); |
|
|
|
|
name = name.Substring(0, name.Length - 2); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (name.IndexOf('+') > 0) { |
|
|
|
|
name = name.Replace('+', '.'); |
|
|
|
|
} |
|
|
|
|
if (!createLazyReturnType) { |
|
|
|
|
IClass c = content.GetClass(name, typeParameterCount); |
|
|
|
|
if (c != null) |
|
|
|
|
return c.DefaultReturnType; |
|
|
|
|
// example where name is not found: pointers like System.Char*
|
|
|
|
|
// or when the class is in a assembly that is not referenced
|
|
|
|
|
} |
|
|
|
|
return new GetClassReturnType(content, name, typeParameterCount); |
|
|
|
|
} |
|
|
|
|
return !type.IsArray && !type.IsGenericType && !type.IsGenericParameter; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static bool IsDefaultType(Type type) |
|
|
|
|
public static IReturnType Create(IClass @class, Type type, bool createLazyReturnType) |
|
|
|
|
{ |
|
|
|
|
return !type.IsArray && !type.IsGenericType && !type.IsGenericParameter; |
|
|
|
|
return Create(@class.ProjectContent, @class, type, createLazyReturnType); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static IReturnType Create(IMember member, Type type, bool createLazyReturnType) |
|
|
|
|
{ |
|
|
|
|
if (type.IsArray) { |
|
|
|
|
return MakeArray(type, Create(member, type.GetElementType(), createLazyReturnType)); |
|
|
|
|
return Create(member.DeclaringType.ProjectContent, member, type, createLazyReturnType); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static IReturnType Create(IProjectContent pc, IDecoration member, Type type, bool createLazyReturnType) |
|
|
|
|
{ |
|
|
|
|
if (type.IsByRef) { |
|
|
|
|
// TODO: Use ByRefRefReturnType
|
|
|
|
|
return Create(pc, member, type.GetElementType(), createLazyReturnType); |
|
|
|
|
} else if (type.IsArray) { |
|
|
|
|
return MakeArray(type, Create(pc, member, type.GetElementType(), createLazyReturnType)); |
|
|
|
|
} else if (type.IsGenericType && !type.IsGenericTypeDefinition) { |
|
|
|
|
Type[] args = type.GetGenericArguments(); |
|
|
|
|
List<IReturnType> para = new List<IReturnType>(args.Length); |
|
|
|
|
for (int i = 0; i < args.Length; ++i) { |
|
|
|
|
para.Add(Create(member, args[i], createLazyReturnType)); |
|
|
|
|
para.Add(Create(pc, member, args[i], createLazyReturnType)); |
|
|
|
|
} |
|
|
|
|
return new ConstructedReturnType(Create(member, type.GetGenericTypeDefinition(), createLazyReturnType), para); |
|
|
|
|
return new ConstructedReturnType(Create(pc, member, type.GetGenericTypeDefinition(), createLazyReturnType), para); |
|
|
|
|
} else if (type.IsGenericParameter) { |
|
|
|
|
IClass c = member.DeclaringType; |
|
|
|
|
if (type.GenericParameterPosition < c.TypeParameters.Count) { |
|
|
|
|
IClass c = (member is IClass) ? (IClass)member : (member is IMember) ? ((IMember)member).DeclaringType : null; |
|
|
|
|
if (c != null && type.GenericParameterPosition < c.TypeParameters.Count) { |
|
|
|
|
if (c.TypeParameters[type.GenericParameterPosition].Name == type.Name) { |
|
|
|
|
return new GenericReturnType(c.TypeParameters[type.GenericParameterPosition]); |
|
|
|
|
} |
|
|
|
@ -203,8 +182,29 @@ namespace ICSharpCode.SharpDevelop.Dom
@@ -203,8 +182,29 @@ namespace ICSharpCode.SharpDevelop.Dom
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return new GenericReturnType(new DefaultTypeParameter(c, type)); |
|
|
|
|
} else { |
|
|
|
|
string name = type.FullName; |
|
|
|
|
if (name == null) |
|
|
|
|
throw new ApplicationException("type.FullName returned null. Type: " + type.ToString()); |
|
|
|
|
int typeParameterCount = 0; |
|
|
|
|
if (name.Length > 2) { |
|
|
|
|
if (name[name.Length - 2] == '`') { |
|
|
|
|
typeParameterCount = int.Parse(name[name.Length - 1].ToString()); |
|
|
|
|
name = name.Substring(0, name.Length - 2); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (name.IndexOf('+') > 0) { |
|
|
|
|
name = name.Replace('+', '.'); |
|
|
|
|
} |
|
|
|
|
if (!createLazyReturnType) { |
|
|
|
|
IClass c = pc.GetClass(name, typeParameterCount); |
|
|
|
|
if (c != null) |
|
|
|
|
return c.DefaultReturnType; |
|
|
|
|
// example where name is not found: pointers like System.Char*
|
|
|
|
|
// or when the class is in a assembly that is not referenced
|
|
|
|
|
} |
|
|
|
|
return new GetClassReturnType(pc, name, typeParameterCount); |
|
|
|
|
} |
|
|
|
|
return Create(member.DeclaringType.ProjectContent, type, createLazyReturnType); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static IReturnType MakeArray(Type type, IReturnType baseType) |
|
|
|
|