Browse Source

Load properties properly rather then using the "get_" "set_" heuristics

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5150 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 16 years ago
parent
commit
a7cfc8351c
  1. 32
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/MetaData/DebugType.cs
  2. 171
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/Tests/DebugType_Tests.cs

32
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/MetaData/DebugType.cs

@ -413,6 +413,12 @@ namespace Debugger.MetaData @@ -413,6 +413,12 @@ namespace Debugger.MetaData
return GetMembers<MemberInfo>(null, bindingAttr, null);
}
/// <summary> Return method with the given token</summary>
public MethodInfo GetMethod(uint token)
{
return (MethodInfo)membersByToken[(int)token];
}
/// <summary> Return method overload with given parameter names </summary>
/// <returns> Null if not found </returns>
public MethodInfo GetMethod(string name, string[] paramNames)
@ -1141,26 +1147,12 @@ namespace Debugger.MetaData @@ -1141,26 +1147,12 @@ namespace Debugger.MetaData
}
// Load properties
// TODO: Handle properties properly
// TODO: Handle indexers ("get_Item") in other code
// Collect data
Dictionary<string, MethodInfo> accessors = new Dictionary<string, MethodInfo>();
Dictionary<string, object> propertyNames = new Dictionary<string, object>();
foreach(MethodInfo method in this.GetMethods(BindingFlagsAllDeclared)) {
if (method.IsSpecialName && (method.Name.StartsWith("get_") || method.Name.StartsWith("set_"))) {
// There can be many get_Items
// TODO: This returns only last, return all
accessors[method.Name] = method;
propertyNames[method.Name.Remove(0,4)] = null;
}
}
// Pair up getters and setters
foreach(KeyValuePair<string, object> kvp in propertyNames) {
MethodInfo getter = null;
MethodInfo setter = null;
accessors.TryGetValue("get_" + kvp.Key, out getter);
accessors.TryGetValue("set_" + kvp.Key, out setter);
AddMember(new DebugPropertyInfo(this, getter, setter));
foreach(PropertyProps prop in module.MetaData.EnumPropertyProps((uint)this.MetadataToken)) {
AddMember(new DebugPropertyInfo(
this,
prop.GetterMethod != 0x06000000 ? GetMethod(prop.GetterMethod) : null,
prop.SetterMethod != 0x06000000 ? GetMethod(prop.SetterMethod) : null
));
}
}

171
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/Tests/DebugType_Tests.cs

@ -48,12 +48,8 @@ namespace Debugger.Tests @@ -48,12 +48,8 @@ namespace Debugger.Tests
public unsafe class MyInterfaceImpl<R> : MyInterface<R, MyClass, MyStruct>
{
public void* voidPtr;
public List<R> Prop { get { return new List<R>(); } }
public char SetterOnlyProp { set { ; } }
public R Fun<M>(MyClass a, MyStruct b, M m)
{
throw new NotImplementedException();
@ -65,6 +61,22 @@ namespace Debugger.Tests @@ -65,6 +61,22 @@ namespace Debugger.Tests
}
}
public unsafe class Members
{
public void* voidPtr;
public char SetterOnlyProp { set { ; } }
public const int IntLiteral = 42;
public char this[int i] {
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
public char this[string s] {
get { throw new NotImplementedException(); }
}
}
public static unsafe void Main()
{
// The nulls should be first to test for "Value does not fall within the expected range." exception of .BaseType
@ -119,6 +131,7 @@ namespace Debugger.Tests @@ -119,6 +131,7 @@ namespace Debugger.Tests
Enum enumType = null;
MyEnum myEnum = MyEnum.B;
Members members = new Members();
Access access = new Access();
System.Diagnostics.Debugger.Break();
@ -189,6 +202,7 @@ namespace Debugger.Tests { @@ -189,6 +202,7 @@ namespace Debugger.Tests {
ObjectDump("DefinedTypes", process.Modules["DebugType_Tests.exe"].GetNamesOfDefinedTypes());
ObjectDump("DefinedTypes", process.Modules["DebugType_Tests.exe"].GetDefinedTypes());
ObjectDump("Members", process.SelectedStackFrame.GetLocalVariableValue("members").Type.GetMembers(DebugType.BindingFlagsAllDeclared));
ObjectDump("Access-Members", process.SelectedStackFrame.GetLocalVariableValue("access").Type.GetMembers());
ObjectDump("MyInterfaceImpl-Members", process.SelectedStackFrame.GetLocalVariableValue("myInterfaceImpl").Type.GetMembers());
PrintLocalVariables();
@ -209,10 +223,10 @@ namespace Debugger.Tests { @@ -209,10 +223,10 @@ namespace Debugger.Tests {
<ProcessStarted />
<ModuleLoaded>mscorlib.dll (No symbols)</ModuleLoaded>
<ModuleLoaded>DebugType_Tests.exe (Has symbols)</ModuleLoaded>
<DebuggingPaused>Break DebugType_Tests.cs:124,4-124,40</DebuggingPaused>
<DebuggingPaused>Break DebugType_Tests.cs:137,4-137,40</DebuggingPaused>
<DefinedTypes
Capacity="16"
Count="11">
Count="12">
<Item>Debugger.Tests.DebugType_Tests</Item>
<Item>AddDelegate</Item>
<Item>MyEnum</Item>
@ -223,11 +237,12 @@ namespace Debugger.Tests { @@ -223,11 +237,12 @@ namespace Debugger.Tests {
<Item>MyGenNestedStruct`1</Item>
<Item>MyInterface`3</Item>
<Item>MyInterfaceImpl`1</Item>
<Item>Members</Item>
<Item>Access</Item>
</DefinedTypes>
<DefinedTypes
Capacity="8"
Count="6">
Count="7">
<Item>
<DebugType
Attributes="AutoLayout, AnsiClass, Class, Public, BeforeFieldInit"
@ -291,6 +306,20 @@ namespace Debugger.Tests { @@ -291,6 +306,20 @@ namespace Debugger.Tests {
<GetElementType>null</GetElementType>
</DebugType>
</Item>
<Item>
<DebugType
Attributes="AutoLayout, AnsiClass, Class, NestedPublic, BeforeFieldInit"
BaseType="System.Object"
FullName="Debugger.Tests.DebugType_Tests+Members"
GetFields="{System.Int32 IntLiteral, System.Void* voidPtr}"
GetMembers="{System.Int32 IntLiteral, System.Void* voidPtr, void Debugger.Tests.DebugType_Tests+Members.set_SetterOnlyProp(Char value), System.Char Debugger.Tests.DebugType_Tests+Members.get_Item(Int32 i), System.Char Debugger.Tests.DebugType_Tests+Members.get_Item(String s), void Debugger.Tests.DebugType_Tests+Members.set_Item(Int32 i, Char value), void Debugger.Tests.DebugType_Tests+Members..ctor(), System.Char SetterOnlyProp, System.Char Item, System.Char Item, void System.Object..ctor(), System.String System.Object.ToString(), System.Boolean System.Object.Equals(Object obj), System.Int32 System.Object.GetHashCode(), System.Type System.Object.GetType()}"
GetMethods="{void Debugger.Tests.DebugType_Tests+Members.set_SetterOnlyProp(Char value), System.Char Debugger.Tests.DebugType_Tests+Members.get_Item(Int32 i), System.Char Debugger.Tests.DebugType_Tests+Members.get_Item(String s), void Debugger.Tests.DebugType_Tests+Members.set_Item(Int32 i, Char value), void Debugger.Tests.DebugType_Tests+Members..ctor(), void System.Object..ctor(), System.String System.Object.ToString(), System.Boolean System.Object.Equals(Object obj), System.Int32 System.Object.GetHashCode(), System.Type System.Object.GetType()}"
GetProperties="{System.Char SetterOnlyProp, System.Char Item, System.Char Item}"
IsClass="True"
IsNested="True">
<GetElementType>null</GetElementType>
</DebugType>
</Item>
<Item>
<DebugType
Attributes="AutoLayout, AnsiClass, Class, NestedPublic, BeforeFieldInit"
@ -306,6 +335,85 @@ namespace Debugger.Tests { @@ -306,6 +335,85 @@ namespace Debugger.Tests {
</DebugType>
</Item>
</DefinedTypes>
<Members>
<Item>
<DebugFieldInfo
Attributes="Public, Static, Literal, HasDefault"
DeclaringType="Debugger.Tests.DebugType_Tests+Members"
FieldType="System.Int32"
IsLiteral="True"
Name="IntLiteral" />
</Item>
<Item>
<DebugFieldInfo
Attributes="Public"
DeclaringType="Debugger.Tests.DebugType_Tests+Members"
FieldType="System.Void*"
Name="voidPtr" />
</Item>
<Item>
<DebugMethodInfo
Attributes="PrivateScope, Public, HideBySig, SpecialName"
DeclaringType="Debugger.Tests.DebugType_Tests+Members"
FullName="Debugger.Tests.DebugType_Tests+Members.set_SetterOnlyProp(Char value)"
GetLocalVariables="{Debugger.Tests.DebugType_Tests+Members this}"
Name="set_SetterOnlyProp" />
</Item>
<Item>
<DebugMethodInfo
Attributes="PrivateScope, Public, HideBySig, SpecialName"
DeclaringType="Debugger.Tests.DebugType_Tests+Members"
FullName="Debugger.Tests.DebugType_Tests+Members.get_Item(Int32 i)"
GetLocalVariables="{Debugger.Tests.DebugType_Tests+Members this}"
Name="get_Item"
ReturnType="System.Char" />
</Item>
<Item>
<DebugMethodInfo
Attributes="PrivateScope, Public, HideBySig, SpecialName"
DeclaringType="Debugger.Tests.DebugType_Tests+Members"
FullName="Debugger.Tests.DebugType_Tests+Members.get_Item(String s)"
GetLocalVariables="{Debugger.Tests.DebugType_Tests+Members this}"
Name="get_Item"
ReturnType="System.Char" />
</Item>
<Item>
<DebugMethodInfo
Attributes="PrivateScope, Public, HideBySig, SpecialName"
DeclaringType="Debugger.Tests.DebugType_Tests+Members"
FullName="Debugger.Tests.DebugType_Tests+Members.set_Item(Int32 i, Char value)"
GetLocalVariables="{Debugger.Tests.DebugType_Tests+Members this}"
Name="set_Item" />
</Item>
<Item>
<DebugMethodInfo
Attributes="PrivateScope, Public, HideBySig, SpecialName, RTSpecialName"
DeclaringType="Debugger.Tests.DebugType_Tests+Members"
FullName="Debugger.Tests.DebugType_Tests+Members..ctor()"
Name=".ctor"
StepOver="True" />
</Item>
<Item>
<DebugPropertyInfo
DeclaringType="Debugger.Tests.DebugType_Tests+Members"
Name="SetterOnlyProp"
PropertyType="System.Char" />
</Item>
<Item>
<DebugPropertyInfo
DeclaringType="Debugger.Tests.DebugType_Tests+Members"
GetIndexParameters="{System.Int32 i}"
Name="Item"
PropertyType="System.Char" />
</Item>
<Item>
<DebugPropertyInfo
DeclaringType="Debugger.Tests.DebugType_Tests+Members"
GetIndexParameters="{System.String s}"
Name="Item"
PropertyType="System.Char" />
</Item>
</Members>
<Access-Members>
<Item>
<DebugFieldInfo
@ -391,13 +499,6 @@ namespace Debugger.Tests { @@ -391,13 +499,6 @@ namespace Debugger.Tests {
</Item>
</Access-Members>
<MyInterfaceImpl-Members>
<Item>
<DebugFieldInfo
Attributes="Public"
DeclaringType="Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32]"
FieldType="System.Void*"
Name="voidPtr" />
</Item>
<Item>
<DebugMethodInfo
Attributes="PrivateScope, Public, HideBySig, SpecialName"
@ -407,14 +508,6 @@ namespace Debugger.Tests { @@ -407,14 +508,6 @@ namespace Debugger.Tests {
Name="get_Prop"
ReturnType="System.Collections.Generic.List`1[System.Int32]" />
</Item>
<Item>
<DebugMethodInfo
Attributes="PrivateScope, Public, HideBySig, SpecialName"
DeclaringType="Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32]"
FullName="Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].set_SetterOnlyProp(Char value)"
GetLocalVariables="{Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32] this}"
Name="set_SetterOnlyProp" />
</Item>
<Item>
<DebugMethodInfo
Attributes="PrivateScope, Public, Final, Virtual, HideBySig, VtableLayoutMask"
@ -447,12 +540,6 @@ namespace Debugger.Tests { @@ -447,12 +540,6 @@ namespace Debugger.Tests {
Name="Prop"
PropertyType="System.Collections.Generic.List`1[System.Int32]" />
</Item>
<Item>
<DebugPropertyInfo
DeclaringType="Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32]"
Name="SetterOnlyProp"
PropertyType="System.Char" />
</Item>
<Item>
<DebugMethodInfo
Attributes="PrivateScope, Public, HideBySig, SpecialName, RTSpecialName"
@ -1151,12 +1238,11 @@ namespace Debugger.Tests { @@ -1151,12 +1238,11 @@ namespace Debugger.Tests {
Attributes="AutoLayout, AnsiClass, Class, NestedPublic, BeforeFieldInit"
BaseType="System.Object"
FullName="Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32]"
GetFields="{System.Void* voidPtr}"
GetGenericArguments="{System.Int32}"
GetInterfaces="{Debugger.Tests.DebugType_Tests+MyInterface`3[System.Int32,Debugger.Tests.DebugType_Tests+MyClass,Debugger.Tests.DebugType_Tests+MyStruct]}"
GetMembers="{System.Void* voidPtr, System.Collections.Generic.List`1[System.Int32] Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].get_Prop(), void Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].set_SetterOnlyProp(Char value), System.Int32 Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].Fun(MyClass a, MyStruct b, Object m), System.Object[] Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].Fun2(Int32** iPtrPtr, Object[,] mdArray, Enumerator listEnum), void Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32]..ctor(), System.Collections.Generic.List`1[System.Int32] Prop, System.Char SetterOnlyProp, void System.Object..ctor(), System.String System.Object.ToString(), System.Boolean System.Object.Equals(Object obj), System.Int32 System.Object.GetHashCode(), System.Type System.Object.GetType()}"
GetMethods="{System.Collections.Generic.List`1[System.Int32] Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].get_Prop(), void Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].set_SetterOnlyProp(Char value), System.Int32 Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].Fun(MyClass a, MyStruct b, Object m), System.Object[] Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].Fun2(Int32** iPtrPtr, Object[,] mdArray, Enumerator listEnum), void Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32]..ctor(), void System.Object..ctor(), System.String System.Object.ToString(), System.Boolean System.Object.Equals(Object obj), System.Int32 System.Object.GetHashCode(), System.Type System.Object.GetType()}"
GetProperties="{System.Collections.Generic.List`1[System.Int32] Prop, System.Char SetterOnlyProp}"
GetMembers="{System.Collections.Generic.List`1[System.Int32] Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].get_Prop(), System.Int32 Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].Fun(MyClass a, MyStruct b, Object m), System.Object[] Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].Fun2(Int32** iPtrPtr, Object[,] mdArray, Enumerator listEnum), void Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32]..ctor(), System.Collections.Generic.List`1[System.Int32] Prop, void System.Object..ctor(), System.String System.Object.ToString(), System.Boolean System.Object.Equals(Object obj), System.Int32 System.Object.GetHashCode(), System.Type System.Object.GetType()}"
GetMethods="{System.Collections.Generic.List`1[System.Int32] Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].get_Prop(), System.Int32 Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].Fun(MyClass a, MyStruct b, Object m), System.Object[] Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32].Fun2(Int32** iPtrPtr, Object[,] mdArray, Enumerator listEnum), void Debugger.Tests.DebugType_Tests+MyInterfaceImpl`1[System.Int32]..ctor(), void System.Object..ctor(), System.String System.Object.ToString(), System.Boolean System.Object.Equals(Object obj), System.Int32 System.Object.GetHashCode(), System.Type System.Object.GetType()}"
GetProperties="{System.Collections.Generic.List`1[System.Int32] Prop}"
IsClass="True"
IsGenericType="True"
IsNested="True">
@ -1309,6 +1395,27 @@ namespace Debugger.Tests { @@ -1309,6 +1395,27 @@ namespace Debugger.Tests {
</Type>
</LocalVariable>
</Item>
<Item>
<LocalVariable
Name="members"
Type="Debugger.Tests.DebugType_Tests+Members"
Value="{Debugger.Tests.DebugType_Tests+Members}">
<Type>
<DebugType
Attributes="AutoLayout, AnsiClass, Class, NestedPublic, BeforeFieldInit"
BaseType="System.Object"
FullName="Debugger.Tests.DebugType_Tests+Members"
GetFields="{System.Int32 IntLiteral, System.Void* voidPtr}"
GetMembers="{System.Int32 IntLiteral, System.Void* voidPtr, void Debugger.Tests.DebugType_Tests+Members.set_SetterOnlyProp(Char value), System.Char Debugger.Tests.DebugType_Tests+Members.get_Item(Int32 i), System.Char Debugger.Tests.DebugType_Tests+Members.get_Item(String s), void Debugger.Tests.DebugType_Tests+Members.set_Item(Int32 i, Char value), void Debugger.Tests.DebugType_Tests+Members..ctor(), System.Char SetterOnlyProp, System.Char Item, System.Char Item, void System.Object..ctor(), System.String System.Object.ToString(), System.Boolean System.Object.Equals(Object obj), System.Int32 System.Object.GetHashCode(), System.Type System.Object.GetType()}"
GetMethods="{void Debugger.Tests.DebugType_Tests+Members.set_SetterOnlyProp(Char value), System.Char Debugger.Tests.DebugType_Tests+Members.get_Item(Int32 i), System.Char Debugger.Tests.DebugType_Tests+Members.get_Item(String s), void Debugger.Tests.DebugType_Tests+Members.set_Item(Int32 i, Char value), void Debugger.Tests.DebugType_Tests+Members..ctor(), void System.Object..ctor(), System.String System.Object.ToString(), System.Boolean System.Object.Equals(Object obj), System.Int32 System.Object.GetHashCode(), System.Type System.Object.GetType()}"
GetProperties="{System.Char SetterOnlyProp, System.Char Item, System.Char Item}"
IsClass="True"
IsNested="True">
<GetElementType>null</GetElementType>
</DebugType>
</Type>
</LocalVariable>
</Item>
<Item>
<LocalVariable
Name="access"

Loading…
Cancel
Save