Browse Source

Fixed generic name for enclosing types

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5116 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 17 years ago
parent
commit
77f6c88db4
  1. 30
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs
  2. 1
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTestsBase.cs
  3. 324
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/DebugType.cs
  4. 6
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/DebugType_CompilerGeneratedClasses.cs

30
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs

@ -40,6 +40,7 @@ namespace Debugger.MetaData
string ns; string ns;
string name; string name;
string fullName; string fullName;
DebugType declaringType;
DebugType elementType; DebugType elementType;
List<DebugType> genericArguments = new List<DebugType>(); List<DebugType> genericArguments = new List<DebugType>();
List<DebugType> interfaces = new List<DebugType>(); List<DebugType> interfaces = new List<DebugType>();
@ -57,7 +58,7 @@ namespace Debugger.MetaData
/// <inheritdoc/> /// <inheritdoc/>
public override Type DeclaringType { public override Type DeclaringType {
get { throw new NotSupportedException(); } get { return declaringType; }
} }
/// <summary> The AppDomain in which this type is loaded </summary> /// <summary> The AppDomain in which this type is loaded </summary>
@ -855,6 +856,7 @@ namespace Debugger.MetaData
if (genericArguments.Length < metaData.GetGenericParamCount(corClass.Token)) { if (genericArguments.Length < metaData.GetGenericParamCount(corClass.Token)) {
throw new DebuggerException("Not enough generic arguments"); throw new DebuggerException("Not enough generic arguments");
} }
Array.Resize(ref genericArguments, metaData.GetGenericParamCount(corClass.Token));
List<ICorDebugType> corGenArgs = new List<ICorDebugType>(genericArguments.Length); List<ICorDebugType> corGenArgs = new List<ICorDebugType>(genericArguments.Length);
foreach(DebugType genAgr in genericArguments) { foreach(DebugType genAgr in genericArguments) {
@ -921,14 +923,19 @@ namespace Debugger.MetaData
corElementType == CorElementType.CLASS || corElementType == CorElementType.CLASS ||
corElementType == CorElementType.VALUETYPE) corElementType == CorElementType.VALUETYPE)
{ {
// We need to know generic arguments before getting name // Get generic arguments
foreach(ICorDebugType t in corType.EnumerateTypeParameters().Enumerator) { foreach(ICorDebugType t in corType.EnumerateTypeParameters().Enumerator) {
genericArguments.Add(DebugType.CreateFromCorType(appDomain, t)); genericArguments.Add(DebugType.CreateFromCorType(appDomain, t));
} }
// We need class props for getting name // Get class props
this.module = appDomain.Process.Modules[corType.Class.Module]; this.module = appDomain.Process.Modules[corType.Class.Module];
this.classProps = module.MetaData.GetTypeDefProps(corType.Class.Token); this.classProps = module.MetaData.GetTypeDefProps(corType.Class.Token);
// Get names // Get the enclosing class
if (classProps.IsNested) {
uint enclosingTk = module.MetaData.GetNestedClassProps((uint)this.MetadataToken).EnclosingClass;
this.declaringType = DebugType.CreateFromTypeDefOrRef(this.DebugModule, null, enclosingTk, genericArguments.ToArray());
}
// Get names (it depends on the previous steps)
int index = classProps.Name.LastIndexOf('.'); int index = classProps.Name.LastIndexOf('.');
if (index == -1) { if (index == -1) {
this.ns = string.Empty; this.ns = string.Empty;
@ -1001,26 +1008,25 @@ namespace Debugger.MetaData
{ {
StringBuilder name = new StringBuilder(); StringBuilder name = new StringBuilder();
if (classProps.IsNested) { for(Type enclosing = this.DeclaringType; enclosing != null; enclosing = enclosing.DeclaringType) {
uint enclosingTk = module.MetaData.GetNestedClassProps((uint)this.MetadataToken).EnclosingClass; name.Insert(0, enclosing.Name + "+");
DebugType enclosingType = DebugType.CreateFromTypeDefOrRef(this.DebugModule, null, enclosingTk, genericArguments.ToArray()); if (enclosing.Namespace != string.Empty)
name.Append(enclosingType.FullName); name.Insert(0, enclosing.Namespace + ".");
name.Append(".");
} }
// '`' might be missing in nested generic classes // '`' might be missing in nested generic classes
name.Append(classProps.Name); name.Append(classProps.Name);
if (this.GetGenericArguments().Length > 0) { if (this.GetGenericArguments().Length > 0) {
name.Append("[["); name.Append("[");
bool first = true; bool first = true;
foreach(DebugType arg in this.GetGenericArguments()) { foreach(DebugType arg in this.GetGenericArguments()) {
if (!first) if (!first)
name.Append(", "); name.Append(",");
first = false; first = false;
name.Append(arg.FullName); name.Append(arg.FullName);
} }
name.Append("]]"); name.Append("]");
} }
return name.ToString(); return name.ToString();

1
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTestsBase.cs

@ -78,6 +78,7 @@ namespace Debugger.Tests
"Type.IsNestedPublic", "Type.IsNestedPublic",
"Type.IsSealed", "Type.IsSealed",
"Type.IsSerializable", "Type.IsSerializable",
"Type.IsVisible",
"Type.IsNotPublic", "Type.IsNotPublic",
"Type.Name", "Type.Name",
"Type.Namespace", "Type.Namespace",

324
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/DebugType.cs

File diff suppressed because one or more lines are too long

6
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/DebugType_CompilerGeneratedClasses.cs

@ -100,7 +100,7 @@ namespace Debugger.Tests {
<Item> <Item>
<LocalVariable <LocalVariable
Name="deleg" Name="deleg"
Type="Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses.IntDelegate" Type="Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses+IntDelegate"
Value="null" /> Value="null" />
</Item> </Item>
<Item> <Item>
@ -151,8 +151,8 @@ namespace Debugger.Tests {
<Item> <Item>
<LocalVariable <LocalVariable
Name="nestedDeleg" Name="nestedDeleg"
Type="Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses.IntDelegate" Type="Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses+IntDelegate"
Value="{Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses.IntDelegate}" /> Value="{Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses+IntDelegate}" />
</Item> </Item>
<Item> <Item>
<LocalVariable <LocalVariable

Loading…
Cancel
Save