Browse Source

Fixed return type of generic parameters like "ref T[]" and generic references in base types (e.g. IList<T> derives from ICollection<T>).

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@564 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 21 years ago
parent
commit
ce8434156e
  1. 4
      src/Main/Base/Project/Src/Dom/Implementations/DefaultTypeParameter.cs
  2. 2
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs
  3. 2
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs
  4. 8
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs
  5. 7
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionParameter.cs
  6. 80
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionReturnType.cs
  7. 14
      src/Main/Base/Project/Src/Services/ParserService/ReflectionProjectContent.cs

4
src/Main/Base/Project/Src/Dom/Implementations/DefaultTypeParameter.cs

@ -84,7 +84,7 @@ namespace ICSharpCode.SharpDevelop.Dom
this.name = type.Name; this.name = type.Name;
this.index = type.GenericParameterPosition; this.index = type.GenericParameterPosition;
foreach (Type constraint in type.GetGenericParameterConstraints()) { foreach (Type constraint in type.GetGenericParameterConstraints()) {
constraints.Add(ReflectionReturnType.Create(targetClass.ProjectContent, constraint, false)); constraints.Add(ReflectionReturnType.Create(targetClass, constraint, false));
} }
} }
@ -101,7 +101,7 @@ namespace ICSharpCode.SharpDevelop.Dom
this.name = type.Name; this.name = type.Name;
this.index = type.GenericParameterPosition; this.index = type.GenericParameterPosition;
foreach (Type constraint in type.GetGenericParameterConstraints()) { foreach (Type constraint in type.GetGenericParameterConstraints()) {
constraints.Add(ReflectionReturnType.Create(targetClass.ProjectContent, constraint, false)); constraints.Add(ReflectionReturnType.Create(targetClass, constraint, false));
} }
} }

2
src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs

@ -596,7 +596,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
IReturnType CreateReturnType(Type type) IReturnType CreateReturnType(Type type)
{ {
return ReflectionReturnType.Create(ProjectContentRegistry.Mscorlib, type, false); return ReflectionReturnType.Create(ProjectContentRegistry.Mscorlib, null, type, false);
} }
} }
} }

2
src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs

@ -591,7 +591,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
static IReturnType CreateReturnType(Type type) static IReturnType CreateReturnType(Type type)
{ {
return ReflectionReturnType.Create(ProjectContentRegistry.Mscorlib, type, false); return ReflectionReturnType.Create(ProjectContentRegistry.Mscorlib, null, type, false);
} }
} }
} }

8
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs

@ -70,11 +70,11 @@ namespace ICSharpCode.SharpDevelop.Dom
foreach (CustomAttributeData att in attributes) { foreach (CustomAttributeData att in attributes) {
DefaultAttribute a = new DefaultAttribute(att.Constructor.DeclaringType.FullName); DefaultAttribute a = new DefaultAttribute(att.Constructor.DeclaringType.FullName);
foreach (CustomAttributeTypedArgument arg in att.ConstructorArguments) { foreach (CustomAttributeTypedArgument arg in att.ConstructorArguments) {
IReturnType type = ReflectionReturnType.Create(pc, arg.ArgumentType, false); IReturnType type = ReflectionReturnType.Create(pc, null, arg.ArgumentType, false);
a.PositionalArguments.Add(new AttributeArgument(type, arg.Value)); a.PositionalArguments.Add(new AttributeArgument(type, arg.Value));
} }
foreach (CustomAttributeNamedArgument arg in att.NamedArguments) { foreach (CustomAttributeNamedArgument arg in att.NamedArguments) {
IReturnType type = ReflectionReturnType.Create(pc, arg.TypedValue.ArgumentType, false); IReturnType type = ReflectionReturnType.Create(pc, null, arg.TypedValue.ArgumentType, false);
a.NamedArguments.Add(arg.MemberInfo.Name, new AttributeArgument(type, arg.TypedValue.Value)); a.NamedArguments.Add(arg.MemberInfo.Name, new AttributeArgument(type, arg.TypedValue.Value));
} }
list.Add(a); list.Add(a);
@ -151,11 +151,11 @@ namespace ICSharpCode.SharpDevelop.Dom
// set base classes // set base classes
if (type.BaseType != null) { // it's null for System.Object ONLY !!! if (type.BaseType != null) { // it's null for System.Object ONLY !!!
BaseTypes.Add(ReflectionReturnType.Create(compilationUnit.ProjectContent, type.BaseType, false)); BaseTypes.Add(ReflectionReturnType.Create(this, type.BaseType, false));
} }
foreach (Type iface in type.GetInterfaces()) { foreach (Type iface in type.GetInterfaces()) {
BaseTypes.Add(ReflectionReturnType.Create(compilationUnit.ProjectContent, iface, false)); BaseTypes.Add(ReflectionReturnType.Create(this, iface, false));
} }
InitMembers(type); InitMembers(type);

7
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionParameter.cs

@ -17,14 +17,13 @@ namespace ICSharpCode.SharpDevelop.Dom
{ {
public ReflectionParameter(ParameterInfo parameterInfo, IMember member) : base(parameterInfo.Name) public ReflectionParameter(ParameterInfo parameterInfo, IMember member) : base(parameterInfo.Name)
{ {
this.ReturnType = ReflectionReturnType.Create(member, parameterInfo.ParameterType, false);
Type type = parameterInfo.ParameterType; Type type = parameterInfo.ParameterType;
this.ReturnType = ReflectionReturnType.Create(member, type, false);
if (parameterInfo.IsOut) { if (parameterInfo.IsOut) {
modifier = ParameterModifiers.Out; modifier = ParameterModifiers.Out;
} else if (type.Name.EndsWith("&")) { } else if (type.IsByRef) {
// seems there is no other way to determine a ref parameter
modifier = ParameterModifiers.Ref; modifier = ParameterModifiers.Ref;
} }

80
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionReturnType.cs

@ -139,59 +139,38 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
#endregion #endregion
public static IReturnType Create(IProjectContent content, Type type, bool createLazyReturnType) public static bool IsDefaultType(Type type)
{ {
if (type.IsArray) { return !type.IsArray && !type.IsGenericType && !type.IsGenericParameter;
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);
}
} }
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) public static IReturnType Create(IMember member, Type type, bool createLazyReturnType)
{ {
if (type.IsArray) { return Create(member.DeclaringType.ProjectContent, member, type, createLazyReturnType);
return MakeArray(type, Create(member, type.GetElementType(), 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) { } else if (type.IsGenericType && !type.IsGenericTypeDefinition) {
Type[] args = type.GetGenericArguments(); Type[] args = type.GetGenericArguments();
List<IReturnType> para = new List<IReturnType>(args.Length); List<IReturnType> para = new List<IReturnType>(args.Length);
for (int i = 0; i < args.Length; ++i) { 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) { } else if (type.IsGenericParameter) {
IClass c = member.DeclaringType; IClass c = (member is IClass) ? (IClass)member : (member is IMember) ? ((IMember)member).DeclaringType : null;
if (type.GenericParameterPosition < c.TypeParameters.Count) { if (c != null && type.GenericParameterPosition < c.TypeParameters.Count) {
if (c.TypeParameters[type.GenericParameterPosition].Name == type.Name) { if (c.TypeParameters[type.GenericParameterPosition].Name == type.Name) {
return new GenericReturnType(c.TypeParameters[type.GenericParameterPosition]); return new GenericReturnType(c.TypeParameters[type.GenericParameterPosition]);
} }
@ -203,8 +182,29 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
} }
return new GenericReturnType(new DefaultTypeParameter(c, type)); 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) static IReturnType MakeArray(Type type, IReturnType baseType)

14
src/Main/Base/Project/Src/Services/ParserService/ReflectionProjectContent.cs

@ -57,17 +57,13 @@ namespace ICSharpCode.SharpDevelop.Dom
public ReflectionProjectContent(Assembly assembly, string assemblyLocation) public ReflectionProjectContent(Assembly assembly, string assemblyLocation)
: this(assembly.FullName, assemblyLocation, assembly.GetReferencedAssemblies()) : this(assembly.FullName, assemblyLocation, assembly.GetReferencedAssemblies())
{ {
try { foreach (Type type in assembly.GetExportedTypes()) {
foreach (Type type in assembly.GetExportedTypes()) { string name = type.FullName;
string name = type.FullName; if (name.IndexOf('+') < 0) { // type.IsNested
if (name.IndexOf('+') < 0) { // type.IsNested AddClassToNamespaceListInternal(new ReflectionClass(assemblyCompilationUnit, type, name, null));
AddClassToNamespaceListInternal(new ReflectionClass(assemblyCompilationUnit, type, name, null));
}
} }
InitializeSpecialClasses();
} catch (Exception ex) {
MessageService.ShowError(ex);
} }
InitializeSpecialClasses();
} }
public ReflectionProjectContent(string assemblyFullName, string assemblyLocation, AssemblyName[] referencedAssemblies) public ReflectionProjectContent(string assemblyFullName, string assemblyLocation, AssemblyName[] referencedAssemblies)

Loading…
Cancel
Save