// caches the inheritance info for each token (recursive function) void TokensTree::RecalcFullInheritance(int parentIdx, TokenIdxSet& result) { // no parent token? no ancestors... if (parentIdx == -1) return; // no parent token? no ancestors... Token* ancestor = at(parentIdx); if (!ancestor) return; // only classes take part in inheritance if (!(ancestor->m_TokenKind & (tkClass | tkTypedef))) return; TRACE(cc_text("RecalcFullInheritance() : Anc: '%s'"), ancestor->m_Name.wx_str()); // for all its ancestors for (TokenIdxSet::iterator it = ancestor->m_Ancestors.begin(); it != ancestor->m_Ancestors.end(); it++) { if (*it != -1 && // not global scope *it != parentIdx && // not the same token (avoid infinite loop) result.find(*it) == result.end()) // not already in the set (avoid infinite loop) { // add it to the set result.insert(*it); // and recurse for its ancestors RecalcFullInheritance(*it, result); } } }
void TokenTree::RecalcInheritanceChain(Token* token) { if (!token) return; if (!(token->m_TokenKind & (tkClass | tkTypedef | tkEnum | tkNamespace))) return; if (token->m_AncestorsString.IsEmpty()) return; token->m_DirectAncestors.clear(); token->m_Ancestors.clear(); wxStringTokenizer tkz(token->m_AncestorsString, _T(",")); TRACE(_T("RecalcInheritanceChain() : Token %s, Ancestors %s"), token->m_Name.wx_str(), token->m_AncestorsString.wx_str()); TRACE(_T("RecalcInheritanceChain() : Removing ancestor string from %s"), token->m_Name.wx_str()); token->m_AncestorsString.Clear(); while (tkz.HasMoreTokens()) { wxString ancestor = tkz.GetNextToken(); if (ancestor.IsEmpty() || ancestor == token->m_Name) continue; TRACE(_T("RecalcInheritanceChain() : Ancestor %s"), ancestor.wx_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->m_Index : -1, tkNamespace | tkClass | tkTypedef); ancestorToken = at(ancestorIdx); if (!ancestorToken) // unresolved break; } } if ( ancestorToken && ancestorToken != token && (ancestorToken->m_TokenKind == tkClass || ancestorToken->m_TokenKind == tkNamespace) ) { TRACE(_T("RecalcInheritanceChain() : Resolved to %s"), ancestorToken->m_Name.wx_str()); RecalcInheritanceChain(ancestorToken); token->m_Ancestors.insert(ancestorToken->m_Index); ancestorToken->m_Descendants.insert(token->m_Index); TRACE(_T("RecalcInheritanceChain() : + '%s'"), ancestorToken->m_Name.wx_str()); } else { TRACE(_T("RecalcInheritanceChain() : ! '%s' (unresolved)"), ancestor.wx_str()); } } else // no namespaces in ancestor { // accept multiple matches for inheritance TokenIdxSet result; FindMatches(ancestor, result, true, false); for (TokenIdxSet::const_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_TokenKind == tkNamespace) ) ) { RecalcInheritanceChain(ancestorToken); token->m_Ancestors.insert(*it); ancestorToken->m_Descendants.insert(token->m_Index); TRACE(_T("RecalcInheritanceChain() : + '%s'"), ancestorToken->m_Name.wx_str()); } } #if defined(CC_TOKEN_DEBUG_OUTPUT) #if CC_TOKEN_DEBUG_OUTPUT if (result.empty()) TRACE(_T("RecalcInheritanceChain() : ! '%s' (unresolved)"), ancestor.wx_str()); #endif #endif } // Now, we have calc all the direct ancestors token->m_DirectAncestors = token->m_Ancestors; } #if defined(CC_TOKEN_DEBUG_OUTPUT) #if CC_TOKEN_DEBUG_OUTPUT wxStopWatch sw; TRACE(_T("RecalcInheritanceChain() : First iteration took : %ld ms"), sw.Time()); sw.Start(); #endif #endif // recalc TokenIdxSet result; for (TokenIdxSet::const_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::const_iterator it = result.begin(); it != result.end(); ++it) { Token* ancestor = at(*it); if (ancestor) { token->m_Ancestors.insert(*it); ancestor->m_Descendants.insert(token->m_Index); } } #if defined(CC_TOKEN_DEBUG_OUTPUT) #if CC_TOKEN_DEBUG_OUTPUT if (token) { // debug loop TRACE(_T("RecalcInheritanceChain() : Ancestors for %s:"), token->m_Name.wx_str()); for (TokenIdxSet::const_iterator it = token->m_Ancestors.begin(); it != token->m_Ancestors.end(); ++it) { const Token* anc_token = at(*it); if (anc_token) TRACE(_T("RecalcInheritanceChain() : + %s"), anc_token->m_Name.wx_str()); else TRACE(_T("RecalcInheritanceChain() : + NULL?!")); } } #endif #endif #if defined(CC_TOKEN_DEBUG_OUTPUT) #if CC_TOKEN_DEBUG_OUTPUT TRACE(_T("RecalcInheritanceChain() : Second iteration took : %ld ms"), sw.Time()); #endif #endif TRACE(_T("RecalcInheritanceChain() : Full inheritance calculated.")); }
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.")); }