void TokensTree::RecalcData() { TRACE(cc_text("RecalcData() : Calculating full inheritance tree.")); // first loop to convert ancestors string to token indices for each token for (size_t i = 0; i < size(); ++i) { Token* token = at(i); if (!token) continue; if (!(token->m_TokenKind & (tkClass | tkTypedef | tkEnum))) continue; if (token->m_AncestorsString.empty()) continue; // only local symbols might change inheritance // if (!token->m_IsLocal) // continue; token->m_DirectAncestors.clear(); token->m_Ancestors.clear(); TRACE(cc_text("RecalcData() : Token %s, Ancestors %s"), token->m_Name.wx_str(), token->m_AncestorsString.wx_str()); StringTokenizer tkz(token->m_AncestorsString, cc_text(",")); while (tkz.HasMoreTokens()) { cc_string ancestor = tkz.GetNextToken(); if (ancestor.empty() || ancestor == token->m_Name) continue; TRACE(cc_text("RecalcData() : Ancestor %s"), ancestor.wx_str()); // ancestors might contain namespaces, e.g. NS::Ancestor if (ancestor.find(cc_text("::")) != cc_string::npos) { Token* ancestorToken = 0; StringTokenizer anctkz(ancestor, cc_text("::")); while (anctkz.HasMoreTokens()) { cc_string ns = anctkz.GetNextToken(); if (!ns.empty()) { int ancestorIdx = TokenExists(ns, ancestorToken ? ancestorToken->GetSelf() : -1, tkNamespace | tkClass | tkTypedef); ancestorToken = at(ancestorIdx); // ancestorToken = token->HasChildToken(ns, tkNamespace | tkClass); if (!ancestorToken) // unresolved break; } } if (ancestorToken && ancestorToken != token && ancestorToken->m_TokenKind == tkClass)// && !ancestorToken->m_IsTypedef) { TRACE(cc_text("RecalcData() : Resolved to %s"), ancestorToken->m_Name.wx_str()); token->m_Ancestors.insert(ancestorToken->GetSelf()); ancestorToken->m_Descendants.insert(i); TRACE(cc_text("RecalcData() : + '%s'"), ancestorToken->m_Name.wx_str()); } else TRACE(cc_text("RecalcData() : ! '%s' (unresolved)"), ancestor.wx_str()); } else // no namespaces in ancestor { // accept multiple matches for inheritance TokenIdxSet result; FindMatches(ancestor, result, true, false); for (TokenIdxSet::iterator it = result.begin(); it != result.end(); it++) { Token* ancestorToken = at(*it); // only classes take part in inheritance if ( ancestorToken && (ancestorToken != token) && ( (ancestorToken->m_TokenKind == tkClass) || (ancestorToken->m_TokenKind == tkEnum) || (ancestorToken->m_TokenKind == tkTypedef) ) ) // && !ancestorToken->m_IsTypedef) { token->m_Ancestors.insert(*it); ancestorToken->m_Descendants.insert(i); TRACE(cc_text("RecalcData() : + '%s'"), ancestorToken->m_Name.wx_str()); } } #if TOKEN_DEBUG_OUTPUT if (result.empty()) TRACE(_T("RecalcData() : ! '%s' (unresolved)"), ancestor.wx_str()); #endif } } token->m_DirectAncestors = token->m_Ancestors; if (!token->m_IsLocal) // global symbols are linked once { TRACE(cc_text("RecalcData() : Removing ancestor string from %s"), token->m_Name.wx_str(), token->m_Name.wx_str()); token->m_AncestorsString.clear(); } } // second loop to calculate full inheritance for each token for (size_t i = 0; i < size(); ++i) { Token* token = at(i); if (!token) continue; if (!(token->m_TokenKind & (tkClass | tkTypedef | tkEnum))) continue; // recalc TokenIdxSet result; for (TokenIdxSet::iterator it = token->m_Ancestors.begin(); it != token->m_Ancestors.end(); it++) RecalcFullInheritance(*it, result); // now, add the resulting set to ancestors set for (TokenIdxSet::iterator it = result.begin(); it != result.end(); it++) { Token* ancestor = at(*it); if (ancestor) { token->m_Ancestors.insert(*it); ancestor->m_Descendants.insert(i); } } #if TOKEN_DEBUG_OUTPUT // debug loop TRACE(_T("RecalcData() : Ancestors for %s:"),token->m_Name.wx_str()); for (TokenIdxSet::iterator it = token->m_Ancestors.begin(); it != token->m_Ancestors.end(); it++) TRACE(_T("RecalcData() : + %s"), at(*it)->m_Name.wx_str()); #endif } TRACE(cc_text("RecalcData() : Full inheritance calculated.")); }
void TokensTree::RecalcData() { // Manager::Get()->GetMessageManager()->DebugLog(_T("Calculating full inheritance tree")); // first loop to convert ancestors string to token indices for each token for (size_t i = 0; i < size(); ++i) { Token* token = at(i); if (!token) continue; if (!(token->m_TokenKind & (tkClass | tkTypedef | tkEnum))) continue; if (token->m_AncestorsString.IsEmpty()) continue; // only local symbols might change inheritance // if (!token->m_IsLocal) // continue; token->m_DirectAncestors.clear(); token->m_Ancestors.clear(); // Manager::Get()->GetMessageManager()->DebugLog(_T(" : '%s'"), token->m_Name.c_str()); //Manager::Get()->GetMessageManager()->DebugLog("Token %s, Ancestors %s", token->m_Name.c_str(), token->m_AncestorsString.c_str()); wxStringTokenizer tkz(token->m_AncestorsString, _T(",")); while (tkz.HasMoreTokens()) { wxString ancestor = tkz.GetNextToken(); if (ancestor.IsEmpty() || ancestor == token->m_Name) continue; // Manager::Get()->GetMessageManager()->DebugLog(_T("Ancestor %s"), ancestor.c_str()); // ancestors might contain namespaces, e.g. NS::Ancestor if (ancestor.Find(_T("::")) != wxNOT_FOUND) { Token* ancestorToken = 0; wxStringTokenizer anctkz(ancestor, _T("::")); while (anctkz.HasMoreTokens()) { wxString ns = anctkz.GetNextToken(); if (!ns.IsEmpty()) { int ancestorIdx = TokenExists(ns, ancestorToken ? ancestorToken->GetSelf() : -1, tkNamespace | tkClass | tkTypedef); ancestorToken = at(ancestorIdx); // ancestorToken = token->HasChildToken(ns, tkNamespace | tkClass); if (!ancestorToken) // unresolved break; } } if (ancestorToken && ancestorToken != token && ancestorToken->m_TokenKind == tkClass)// && !ancestorToken->m_IsTypedef) { // Manager::Get()->GetMessageManager()->DebugLog(_T("Resolved to %s"), ancestorToken->m_Name.c_str()); token->m_Ancestors.insert(ancestorToken->GetSelf()); ancestorToken->m_Descendants.insert(i); // Manager::Get()->GetMessageManager()->DebugLog(_T(" + '%s'"), ancestorToken->m_Name.c_str()); } // else // Manager::Get()->GetMessageManager()->DebugLog(_T(" ! '%s' (unresolved)"), ancestor.c_str()); } else // no namespaces in ancestor { // accept multiple matches for inheritance TokenIdxSet result; FindMatches(ancestor, result, true, false); for (TokenIdxSet::iterator it = result.begin(); it != result.end(); it++) { Token* ancestorToken = at(*it); // only classes take part in inheritance if (ancestorToken && ancestorToken != token && (ancestorToken->m_TokenKind == tkClass || ancestorToken->m_TokenKind == tkEnum))// && !ancestorToken->m_IsTypedef) { token->m_Ancestors.insert(*it); ancestorToken->m_Descendants.insert(i); // Manager::Get()->GetMessageManager()->DebugLog(_T(" + '%s'"), ancestorToken->m_Name.c_str()); } } // if (result.empty()) // Manager::Get()->GetMessageManager()->DebugLog(_T(" ! '%s' (unresolved)"), ancestor.c_str()); } } token->m_DirectAncestors = token->m_Ancestors; if (!token->m_IsLocal) // global symbols are linked once { //Manager::Get()->GetMessageManager()->DebugLog("Removing ancestor string from %s", token->m_Name.c_str(), token->m_Name.c_str()); token->m_AncestorsString.Clear(); } } // second loop to calculate full inheritance for each token for (size_t i = 0; i < size(); ++i) { Token* token = at(i); if (!token) continue; if (!(token->m_TokenKind & (tkClass | tkTypedef | tkEnum))) continue; // recalc TokenIdxSet result; for (TokenIdxSet::iterator it = token->m_Ancestors.begin(); it != token->m_Ancestors.end(); it++) RecalcFullInheritance(*it, result); // now, add the resulting set to ancestors set for (TokenIdxSet::iterator it = result.begin(); it != result.end(); it++) { Token* ancestor = at(*it); if (ancestor) { token->m_Ancestors.insert(*it); ancestor->m_Descendants.insert(i); } } // // debug loop // Manager::Get()->GetMessageManager()->DebugLog(_T("Ancestors for %s:"),token->m_Name.c_str()); // for (TokenIdxSet::iterator it = token->m_Ancestors.begin(); it != token->m_Ancestors.end(); it++) // Manager::Get()->GetMessageManager()->DebugLog(_T(" + %s"), at(*it)->m_Name.c_str()); } // Manager::Get()->GetMessageManager()->DebugLog(_T("Full inheritance calculated.")); }