Beispiel #1
0
bool TypeExtensionIterator::MoveNext()
{
    BCSYM_NamedRoot * pNamed = NULL;
    do
    {
        pNamed = m_childIterator.GetNext();
        if (pNamed && pNamed->IsContainer())
        {
            BCSYM_Container *pContainer = pNamed->PContainer();

            // Perf: We are only interested in looking at types marked as containing extension methods.  So only load the 
            // type's children if the type says it contains extension methods.

            BCSYM *pContainerAfterDiggingThroughAlias = pContainer->DigThroughAlias();

            if (pContainerAfterDiggingThroughAlias->IsClass())
            {
                if (pContainerAfterDiggingThroughAlias->PClass()->ContainsExtensionMethods())
                {
                    pContainer->EnsureChildrenLoaded();
                }
            }
            else if (!pContainer->GetCompilerFile() ||
                (pContainer->GetCompilerFile()->IsMetaDataFile() && pContainer->GetCompilerFile()->ContainsExtensionMethods()))
            {
                pContainer->EnsureChildrenLoaded();
            }
        }
    }
    while (pNamed && ! pNamed->IsTypeExtension());

    if (pNamed)
    {
        m_pCurrent = pNamed->PClass();
    }
    else
    {
        m_pCurrent = NULL;
    }

    return m_pCurrent;
}
Beispiel #2
0
BCSYM_Container *AllContainersInFileIterator::Next()
{
    BCSYM_NamedRoot *pDug;

    while(m_pNext)
    {
        pDug = m_pNext->DigThroughAlias()->PNamedRoot();

        m_pNext = m_pNext->GetNextInSymbolList();

        if (!m_fIncludeTransientSymbols && pDug->IsTransient())
        {
            continue;
        }

        if (pDug->IsContainer() &&
            (m_fIncludePartialContainers || !pDug->PContainer()->IsPartialTypeAndHasMainType()))
        {
            return pDug->PContainer();
        }
    }

    return NULL;
}