case CV_CALL_CLRCALL: return L"clrcall";
default: return L"";
}
}
const wchar_t* GetBasicTypeName(enum BasicType type, int length)
{
switch(type)
{
case btVoid: return L"void";
case btChar: return L"char";
case btWChar: return L"wchar_t";
case btInt:
case btLong: return length==1 L"signed __int8":length==2 L"signed __int16":length==4 L"signed __int32":length==8 L"signed __int64":L"[UnknownSInt]";
case btUInt:
case btULong: return length==1 L"unsigned __int8":length==2 L"unsigned __int16":length==4 L"unsigned __int32":length==8 L"unsigned __int64":L"[UnknownUInt]";
case btFloat: return length==4 L"float":length==8 L"double":L"[UnknownFloat]";
case btBool: return L"bool";
case btBCD: return L"[BCD]";
case btCurrency: return L"[Currency]";
case btDate: return L"[Date]";
case btVariant: return L"[Variant]";
case btComplex: return L"[Complex]";
case btBit: return L"[Bit]";
case btBSTR: return L"[BSTR]";
case btHresult: return L"[HRESULT]";
default: return L"[NoType]";
}
}
//--------------------------------------------------------------------
extern void DumpType(TextWriter& file, IDiaSymbol* typeSymbol, int level);
void DumpTypeHelper(TextWriter& file, IDiaSymbol* typeSymbol, int level, const wchar_t* tagName, const wchar_t* symbolName, bool close=true)
{
BOOL constType=FALSE, volatileType=FALSE;
typeSymbol->get_constType(&constType);
typeSymbol->get_volatileType(&volatileType);
PrintXMLOpen(file, level, tagName, symbolName, L"const", (constType L"true":L"false"), L"volatile", (volatileType L"true":L"false"));
if(close)
{
PrintXMLClose(file, level, tagName);
}
}
void DumpFunctionType(TextWriter& file, IDiaSymbol* typeSymbol, int level)
{
DumpTypeHelper(file, typeSymbol, level, L"function", NULL, false);
{
CV_call_e callconv;
typeSymbol->get_callingConvention((DWORD*)&callconv);
PrintXMLOpen(file, level+1, L"callconv", NULL, L"value", GetCallingConversionName(callconv));
PrintXMLClose(file, level+1, L"callconv");
PrintXMLOpen(file, level+1, L"arguments", NULL);
{
IDiaEnumSymbols* argumentEnum=0;
if(SUCCEEDED(typeSymbol->findChildren(SymTagFunctionArgType, NULL, nsNone, &argumentEnum)) && argumentEnum)
{
DWORD argumentCelt=0;
IDiaSymbol* argumentSymbol=0;
while(SUCCEEDED(argumentEnum->Next(1, &argumentSymbol, &argumentCelt)) && argumentSymbol && argumentCelt)
{
IDiaSymbol* argumentType=0;
if(SUCCEEDED(argumentSymbol->get_type(&argumentType)))
{
PrintXMLOpen(file, level+2, L"argument", NULL);
DumpType(file, argumentType, level+3);