void ClassScope::checkDerivation(AnalysisResultPtr ar, hphp_string_iset &seen) { seen.insert(m_name); hphp_string_iset bases; for (int i = m_bases.size() - 1; i >= 0; i--) { const string &base = m_bases[i]; if (seen.find(base) != seen.end() || bases.find(base) != bases.end()) { Compiler::Error( Compiler::InvalidDerivation, m_stmt, "The class hierarchy contains a circular reference involving " + base); if (i == 0 && !m_parent.empty()) { assert(base == m_parent); m_parent.clear(); } m_bases.erase(m_bases.begin() + i); continue; } bases.insert(base); ClassScopePtrVec parents = ar->findClasses(Util::toLower(base)); for (unsigned int j = 0; j < parents.size(); j++) { parents[j]->checkDerivation(ar, seen); } } seen.erase(m_name); }
void ClassScope::checkDerivation(AnalysisResultPtr ar, hphp_string_iset &seen) { seen.insert(m_scopeName); hphp_string_iset bases; for (int i = m_bases.size() - 1; i >= 0; i--) { auto const& base = m_bases[i]; if (seen.find(base) != seen.end() || bases.find(base) != bases.end()) { Compiler::Error( Compiler::InvalidDerivation, m_stmt, "The class hierarchy contains a circular reference involving " + base); if (i == 0 && !m_parent.empty()) { assert(base == m_parent); m_parent.clear(); } m_bases.erase(m_bases.begin() + i); continue; } bases.insert(base); auto parents = ar->findClasses(base); for (auto& parent : parents) { parent->checkDerivation(ar, seen); } } seen.erase(m_scopeName); }