зеркало из https://github.com/microsoft/cppwinrt.git
111 строки
3.6 KiB
C++
111 строки
3.6 KiB
C++
#pragma once
|
|
|
|
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
|
#define NOMINMAX
|
|
|
|
#include <windows.h>
|
|
#include <vsdebugeng.h>
|
|
#include <vsdebugeng.templates.h>
|
|
#include <Dia2.h>
|
|
#include "base_includes.h"
|
|
#include "base_macros.h"
|
|
#include "base_types.h"
|
|
#include "base_extern.h"
|
|
#include "base_meta.h"
|
|
#include "base_identity.h"
|
|
#include "base_handle.h"
|
|
#include "base_lock.h"
|
|
#include "base_abi.h"
|
|
#include "base_windows.h"
|
|
#include "base_com_ptr.h"
|
|
#include "base_string.h"
|
|
#include "base_string_input.h"
|
|
#include "base_string_operators.h"
|
|
#include "base_array.h"
|
|
#include "base_weak_ref.h"
|
|
#include "base_agile_ref.h"
|
|
#include "base_error.h"
|
|
#include "base_marshaler.h"
|
|
#include "base_delegate.h"
|
|
#include "base_events.h"
|
|
#include "base_activation.h"
|
|
#include "base_implements.h"
|
|
#include <rometadataapi.h>
|
|
#include <rometadata.h>
|
|
#include <filesystem>
|
|
#include <functional>
|
|
#include <optional>
|
|
#include <set>
|
|
#include <memory>
|
|
#include <variant>
|
|
#include <cmd_reader.h>
|
|
#include <winmd_reader.h>
|
|
|
|
#ifndef IF_FAIL_RET
|
|
#define IF_FAIL_RET(expr) { HRESULT _hr = (expr); if(FAILED(_hr)) { return(_hr); } }
|
|
#endif
|
|
|
|
template<typename T>
|
|
winrt::com_ptr<T> make_com_ptr(T* ptr)
|
|
{
|
|
winrt::com_ptr<T> result;
|
|
result.copy_from(ptr);
|
|
return result;
|
|
}
|
|
|
|
enum class NatvisDiagnosticLevel
|
|
{
|
|
Unknown = -1,
|
|
Off,
|
|
Error,
|
|
Warning,
|
|
Verbose
|
|
};
|
|
NatvisDiagnosticLevel GetNatvisDiagnosticLevel();
|
|
HRESULT NatvisDiagnostic(Microsoft::VisualStudio::Debugger::DkmProcess* process, std::wstring_view const& messageText, NatvisDiagnosticLevel level, HRESULT errorCode = S_OK);
|
|
inline HRESULT NatvisDiagnostic(Microsoft::VisualStudio::Debugger::Evaluation::DkmVisualizedExpression* expression, std::wstring_view const& messageText, NatvisDiagnosticLevel level, HRESULT errorCode = S_OK)
|
|
{
|
|
return NatvisDiagnostic(expression->RuntimeInstance()->Process(), messageText, level, errorCode);
|
|
}
|
|
|
|
template <typename...T> struct overloaded : T... { using T::operator()...; };
|
|
template <typename...T> overloaded(T...)->overloaded<T...>;
|
|
|
|
[[noreturn]] inline void throw_invalid(std::string const& message)
|
|
{
|
|
throw std::invalid_argument(message);
|
|
}
|
|
|
|
template <typename...T>
|
|
[[noreturn]] inline void throw_invalid(std::string message, T const&... args)
|
|
{
|
|
(message.append(args), ...);
|
|
throw std::invalid_argument(message);
|
|
}
|
|
|
|
inline bool starts_with(std::string_view const& value, std::string_view const& match) noexcept
|
|
{
|
|
return 0 == value.compare(0, match.size(), match);
|
|
}
|
|
|
|
winmd::reader::TypeDef FindType(Microsoft::VisualStudio::Debugger::DkmProcess* process, std::string_view const& typeName);
|
|
winmd::reader::TypeDef FindType(Microsoft::VisualStudio::Debugger::DkmProcess* process, std::string_view const& typeNamespace, std::string_view const& typeName);
|
|
|
|
inline winmd::reader::TypeDef ResolveType(Microsoft::VisualStudio::Debugger::DkmProcess* process, winmd::reader::coded_index<winmd::reader::TypeDefOrRef> index) noexcept
|
|
{
|
|
switch (index.type())
|
|
{
|
|
case winmd::reader::TypeDefOrRef::TypeDef:
|
|
return index.TypeDef();
|
|
case winmd::reader::TypeDefOrRef::TypeRef:
|
|
return FindType(process, index.TypeRef().TypeNamespace(), index.TypeRef().TypeName());
|
|
default: //case TypeDefOrRef::TypeSpec:
|
|
return winmd::reader::find_required(index.TypeSpec().Signature().
|
|
GenericTypeInst().GenericType().TypeRef());
|
|
}
|
|
}
|
|
|
|
std::pair<winmd::reader::TypeDef, std::wstring> ResolveTypeInterface(Microsoft::VisualStudio::Debugger::DkmProcess* process, winmd::reader::coded_index<winmd::reader::TypeDefOrRef> index);
|
|
|
|
void ClearTypeResolver();
|