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

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

@ -78,6 +78,7 @@ namespace Debugger.Tests @@ -78,6 +78,7 @@ namespace Debugger.Tests
"Type.IsNestedPublic",
"Type.IsSealed",
"Type.IsSerializable",
"Type.IsVisible",
"Type.IsNotPublic",
"Type.Name",
"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 { @@ -100,7 +100,7 @@ namespace Debugger.Tests {
<Item>
<LocalVariable
Name="deleg"
Type="Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses.IntDelegate"
Type="Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses+IntDelegate"
Value="null" />
</Item>
<Item>
@ -151,8 +151,8 @@ namespace Debugger.Tests { @@ -151,8 +151,8 @@ namespace Debugger.Tests {
<Item>
<LocalVariable
Name="nestedDeleg"
Type="Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses.IntDelegate"
Value="{Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses.IntDelegate}" />
Type="Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses+IntDelegate"
Value="{Debugger.Tests.TestPrograms.DebugType_CompilerGeneratedClasses+IntDelegate}" />
</Item>
<Item>
<LocalVariable

Loading…
Cancel
Save