From ab6a579558c5818f6d0f461d8899c7d316c689f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Thu, 19 Jun 2008 10:52:40 +0000 Subject: [PATCH] Added Module.GetDefinedTypes; Only non-generic types are returned at the moment; Added test for it git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3110 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Control/Module.cs | 6 ++ .../Src/Interop/MetaData/IMetaDataImport.cs | 2 +- .../Project/Src/Metadata/DebugType.cs | 13 +++ .../Src/Wrappers/MetaData/MetaDataImport.cs | 28 +++++- .../Project/Debugger.Tests.csproj | 1 + .../Project/Src/TestPrograms/DefinedTypes.cs | 93 +++++++++++++++++++ 6 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/DefinedTypes.cs diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Module.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Module.cs index 27e878fb43..6790f686d6 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Module.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Module.cs @@ -6,6 +6,7 @@ // using System; +using System.Collections.Generic; using Debugger.MetaData; using Debugger.Wrappers.CorDebug; @@ -127,6 +128,11 @@ namespace Debugger } } + public List GetDefinedTypes() + { + return DebugType.GetDefinedTypesInModule(this); + } + internal Module(Process process, ICorDebugModule pModule) { this.process = process; diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Interop/MetaData/IMetaDataImport.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Interop/MetaData/IMetaDataImport.cs index 18f46071b0..2ec35687a3 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Interop/MetaData/IMetaDataImport.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Interop/MetaData/IMetaDataImport.cs @@ -23,7 +23,7 @@ namespace Debugger.Interop.MetaData [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] void ResetEnum(IntPtr hEnum, uint ulPos); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] - void EnumTypeDefs([In, Out] ref IntPtr phEnum, ref uint rTypeDefs, uint cMax, ref uint pcTypeDefs); + void EnumTypeDefs([In, Out] ref IntPtr phEnum, out uint rTypeDefs, uint cMax, out uint pcTypeDefs); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] void EnumInterfaceImpls([In, Out] ref IntPtr phEnum, uint td, out uint rImpls, uint cMax, out uint pcImpls); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs index d1d9025250..2fd9a26d0b 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs @@ -398,6 +398,19 @@ namespace Debugger.MetaData return type; } + /// Returns all non-generic types defined in the given module + public static List GetDefinedTypesInModule(Module module) + { + // TODO: Generic types + List types = new List(); + foreach(TypeDefProps typeDef in module.MetaData.EnumTypeDefs()) { + if (module.MetaData.GetGenericParamCount(typeDef.Token) == 0) { + types.Add(DebugType.Create(module, typeDef.Token)); + } + } + return types; + } + string GetFullName() { if (IsArray) { diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaDataImport.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaDataImport.cs index 29d235071b..781d320257 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaDataImport.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaDataImport.cs @@ -52,6 +52,13 @@ namespace Debugger.Wrappers.MetaData } } + public IEnumerable EnumTypeDefs() + { + foreach(uint token in EnumerateTokens(metaData.EnumTypeDefs)) { + yield return GetTypeDefProps(token); + } + } + public TypeDefProps GetTypeDefProps(uint typeToken) { TypeDefProps typeDefProps = new TypeDefProps(); @@ -234,9 +241,26 @@ namespace Debugger.Wrappers.MetaData #region Util - delegate void TokenEnumerator(ref IntPtr phEnum, uint parameter, out uint token, uint maxCount, out uint fetched); + delegate void TokenEnumerator(ref IntPtr phEnum, out uint token, uint maxCount, out uint fetched); + + IEnumerable EnumerateTokens(TokenEnumerator tokenEnumerator) + { + IntPtr enumerator = IntPtr.Zero; + while(true) { + uint token; + uint fetched; + tokenEnumerator(ref enumerator, out token, 1, out fetched); + if (fetched == 0) { + metaData.CloseEnum(enumerator); + break; + } + yield return token; + } + } + + delegate void TokenEnumeratorWithParameter(ref IntPtr phEnum, uint parameter, out uint token, uint maxCount, out uint fetched); - IEnumerable EnumerateTokens(TokenEnumerator tokenEnumerator, uint parameter) + IEnumerable EnumerateTokens(TokenEnumeratorWithParameter tokenEnumerator, uint parameter) { IntPtr enumerator = IntPtr.Zero; while(true) { diff --git a/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Debugger.Tests.csproj b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Debugger.Tests.csproj index b7d1bd85c7..235b8967d2 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Debugger.Tests.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Debugger.Tests.csproj @@ -46,6 +46,7 @@ + diff --git a/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/DefinedTypes.cs b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/DefinedTypes.cs new file mode 100644 index 0000000000..005c30ab82 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/DefinedTypes.cs @@ -0,0 +1,93 @@ +// +// +// +// +// $Revision$ +// + +using System; + +namespace Debugger.Tests.TestPrograms +{ + public class DefinedTypes_Class + { + public static void Main() + { + System.Diagnostics.Debugger.Break(); + } + } + + public struct DefinedTypes_Struct + { + + } + + public class DefinedTypes_GenericClass + { + + } +} + +#if TEST_CODE +namespace Debugger.Tests { + public partial class DebuggerTests + { + [NUnit.Framework.Test] + public void DefinedTypes() + { + StartTest("DefinedTypes.cs"); + + ObjectDump("Types", process.GetModule("DefinedTypes.exe").GetDefinedTypes()); + + EndTest(); + } + } +} +#endif + +#if EXPECTED_OUTPUT + + + + + mscorlib.dll + DefinedTypes.exe + Break + + 4 + 2 + + System.Object + Debugger.Tests.TestPrograms.DefinedTypes_Class + False + System.Collections.Generic.List`1[Debugger.MetaData.DebugType] + False + True + False + False + False + False + False + null + DefinedTypes.exe + + + System.ValueType + Debugger.Tests.TestPrograms.DefinedTypes_Struct + False + System.Collections.Generic.List`1[Debugger.MetaData.DebugType] + False + False + False + False + False + False + True + null + DefinedTypes.exe + + + + + +#endif // EXPECTED_OUTPUT \ No newline at end of file