{
DWORD argumentCelt=0;
IDiaSymbol* argumentSymbol=0;
while(SUCCEEDED(argumentEnum->Next(1, &argumentSymbol, &argumentCelt)) && argumentSymbol && argumentCelt)
{
enum DataKind dataKind;
if(SUCCEEDED(argumentSymbol->get_dataKind((DWORD*)&dataKind)) && dataKind==DataIsParam)
{
BSTR nameBSTR=0;
if(SUCCEEDED(argumentSymbol->get_name(&nameBSTR)) && nameBSTR)
{
PrintXMLOpen(file, 5, L"argument", nameBSTR);
DumpSymbolType(file, argumentSymbol, 5);
PrintXMLClose(file, 5, L"argument");
}
}
argumentSymbol->Release();
}
argumentEnum->Release();
}
PrintXMLClose(file, 4, L"arguments");
}
void DumpMethod(TextWriter& file, IDiaSymbol* methodSymbol)
{
enum CV_access_e access;
methodSymbol->get_access((DWORD*)&access);
BOOL staticMethod=FALSE;
methodSymbol->get_isStatic(&staticMethod);
BSTR nameBSTR=0;
const wchar_t* virtualValue=L"normal";
BOOL virtualBool=FALSE;
if(SUCCEEDED(methodSymbol->get_pure(&virtualBool)) && virtualBool)
{
virtualValue=L"pure";
}
else if(SUCCEEDED(methodSymbol->get_virtual(&virtualBool)) && virtualBool)
{
virtualValue=L"virtual";
}
if(SUCCEEDED(methodSymbol->get_name(&nameBSTR)) && nameBSTR)
{
if(staticMethod)
{
PrintXMLOpen(file, 3, L"staticMethod", nameBSTR, L"access", GetAccessName(access), L"virtual", virtualValue);
DumpMethodArguments(file, methodSymbol);
DumpSymbolType(file, methodSymbol, 3);
PrintXMLClose(file, 3, L"staticMethod");
}
else
{
PrintXMLOpen(file, 3, L"method", nameBSTR, L"access", GetAccessName(access), L"virtual", virtualValue);
DumpMethodArguments(file, methodSymbol);
DumpSymbolType(file, methodSymbol, 3);
PrintXMLClose(file, 3, L"method");
}
}
}
void DumpMethods(TextWriter& file, IDiaSymbol* udtSymbol)
{
PrintXMLOpen(file, 2, L"methods", NULL);
IDiaEnumSymbols* methodEnum=0;
if(SUCCEEDED(udtSymbol->findChildren(SymTagFunction, NULL, nsNone, &methodEnum)) && methodEnum)
{
DWORD methodCelt=0;
IDiaSymbol* methodSymbol=0;
while(SUCCEEDED(methodEnum->Next(1, &methodSymbol, &methodCelt)) && methodSymbol && methodCelt)
{
DumpMethod(file, methodSymbol);
methodSymbol->Release();
}
methodEnum->Release();
}
PrintXMLClose(file, 2, L"methods");
}
void Dump(TextWriter& file, IDiaSymbol* exeSymbol)
{
FindClasses(exeSymbol);
for(int i=0;i
WString className=udtSymbols.Keys()[i];
IDiaSymbol* classSymbol=udtSymbols.Values()[i];
enum SymTagEnum symTag