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 20 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 @@ -84,7 +84,7 @@ namespace ICSharpCode.SharpDevelop.Dom
this.name = type.Name;
this.index = type.GenericParameterPosition;
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 @@ -101,7 +101,7 @@ namespace ICSharpCode.SharpDevelop.Dom
this.name = type.Name;
this.index = type.GenericParameterPosition;
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 @@ -596,7 +596,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
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 @@ -591,7 +591,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
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 @@ -70,11 +70,11 @@ namespace ICSharpCode.SharpDevelop.Dom
foreach (CustomAttributeData att in attributes) {
DefaultAttribute a = new DefaultAttribute(att.Constructor.DeclaringType.FullName);
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));
}
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));
}
list.Add(a);
@ -151,11 +151,11 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -151,11 +151,11 @@ namespace ICSharpCode.SharpDevelop.Dom
// set base classes
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()) {
BaseTypes.Add(ReflectionReturnType.Create(compilationUnit.ProjectContent, iface, false));
BaseTypes.Add(ReflectionReturnType.Create(this, iface, false));
}
InitMembers(type);

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

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

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

@ -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)

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

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

Loading…
Cancel
Save