PrintXMLClose(file, level, L"array");
elementTypeSymbol->Release();
}
}
void DumpBaseType(TextWriter& file, IDiaSymbol* typeSymbol, int level)
{
enum BasicType basicType=btNoType;
ULONGLONG length=0;
if(SUCCEEDED(typeSymbol->get_baseType((DWORD*)&basicType)) && SUCCEEDED(typeSymbol->get_length(&length)))
{
DumpTypeHelper(file, typeSymbol, level, L"primitive", GetBasicTypeName(basicType, (int)length));
}
}
void DumpEnumType(TextWriter& file, IDiaSymbol* typeSymbol, int level)
{
BSTR nameBSTR=0;
if(SUCCEEDED(typeSymbol->get_name(&nameBSTR)) && nameBSTR)
{
DumpTypeHelper(file, typeSymbol, level, L"enumType", nameBSTR);
}
}
void DumpUserType(TextWriter& file, IDiaSymbol* typeSymbol, int level)
{
BSTR nameBSTR=0;
if(SUCCEEDED(typeSymbol->get_name(&nameBSTR)) && nameBSTR)
{
DumpTypeHelper(file, typeSymbol, level, L"classType", nameBSTR);
}
}
void DumpType(TextWriter& file, IDiaSymbol* typeSymbol, int level)
{
enum SymTagEnum symTag=SymTagNull;
typeSymbol->get_symTag((DWORD*)&symTag);
switch(symTag)
{
case SymTagFunctionType:
return DumpFunctionType(file, typeSymbol, level);
case SymTagPointerType:
return DumpPointerType(file, typeSymbol, level);
case SymTagArrayType:
return DumpArrayType(file, typeSymbol, level);
case SymTagBaseType:
return DumpBaseType(file, typeSymbol, level);
case SymTagEnum:
return DumpUserType(file, typeSymbol, level);
case SymTagUDT:
return DumpUserType(file, typeSymbol, level);
}
}
void DumpSymbolType(TextWriter& file, IDiaSymbol* symbolWithType, int symbolLevel)
{
IDiaSymbol* typeSymbol=0;
if(SUCCEEDED(symbolWithType->get_type(&typeSymbol)) && typeSymbol)
{
PrintXMLOpen(file, symbolLevel+1, L"type", NULL);
DumpType(file, typeSymbol, symbolLevel+2);
PrintXMLClose(file, symbolLevel+1, L"type");
typeSymbol->Release();
}
}
//--------------------------------------------------------------------
void DumpBaseClasses(TextWriter& file, IDiaSymbol* udtSymbol)
{
PrintXMLOpen(file, 2, L"baseClasses", NULL, false);
IDiaEnumSymbols* baseClassEnum=0;
if(SUCCEEDED(udtSymbol->findChildren(SymTagBaseClass, NULL, nsNone, &baseClassEnum)) && baseClassEnum)
{
DWORD baseClassCelt=0;
IDiaSymbol* baseClassSymbol=0;
while(SUCCEEDED(baseClassEnum->Next(1, &baseClassSymbol, &baseClassCelt)) && baseClassSymbol && baseClassCelt)
{
CV_access_e access=CV_public;
baseClassSymbol->get_access((DWORD*)&access);
BSTR nameBSTR=0;
if(SUCCEEDED(baseClassSymbol->get_name(&nameBSTR)) && nameBSTR)
{
PrintXMLOpen(file, 3, L"baseClass", nameBSTR, L"access", GetAccessName(access));
PrintXMLClose(file, 3, L"baseClass");