size_t ParserBase::FindTokensInFile(const wxString& filename, TokenIdxSet& result, short int kindMask) { result.clear(); size_t tokens_found = 0; TRACE(_T("Parser::FindTokensInFile() : Searching for file '%s' in tokens tree..."), filename.wx_str()); CC_LOCKER_TRACK_TT_MTX_LOCK(s_TokenTreeMutex) TokenIdxSet tmpresult; if ( m_TokenTree->FindTokensInFile(filename, tmpresult, kindMask) ) { for (TokenIdxSet::const_iterator it = tmpresult.begin(); it != tmpresult.end(); ++it) { const Token* token = m_TokenTree->at(*it); if (token) result.insert(*it); } tokens_found = result.size(); } CC_LOCKER_TRACK_TT_MTX_UNLOCK(s_TokenTreeMutex) return tokens_found; }
int MarkFileAsLocalThreadedTask::Execute() { TRACE(_T("MarkFileAsLocalThreadedTask::Execute()")); if (!m_Project) return 0; if (!m_Parser) return 0; // mark all project files as local for (FilesList::const_iterator it = m_Project->GetFilesList().begin(); it != m_Project->GetFilesList().end(); ++it) { ProjectFile* pf = *it; if (!pf) continue; if (ParserCommon::FileType(pf->relativeFilename) != ParserCommon::ftOther) { TokenTree* tree = m_Parser->GetTokenTree(); CC_LOCKER_TRACK_TT_MTX_LOCK(s_TokenTreeMutex) tree->MarkFileTokensAsLocal(pf->file.GetFullPath(), true, m_Project); CC_LOCKER_TRACK_TT_MTX_UNLOCK(s_TokenTreeMutex) } }
ParserBase::~ParserBase() { CC_LOCKER_TRACK_TT_MTX_LOCK(s_TokenTreeMutex) Delete(m_TokenTree); Delete(m_TempTokenTree); CC_LOCKER_TRACK_TT_MTX_UNLOCK(s_TokenTreeMutex) }
void ClassBrowserBuilderThread::Init(NativeParser* np, CCTreeCtrl* treeTop, CCTreeCtrl* treeBottom, const wxString& active_filename, void* user_data, // active project const BrowserOptions& bo, TokenTree* tt, int idThreadEvent) { TRACE(_T("ClassBrowserBuilderThread::Init")); CC_LOCKER_TRACK_CBBT_MTX_LOCK(m_ClassBrowserBuilderThreadMutex); m_NativeParser = np; m_CCTreeCtrlTop = treeTop; m_CCTreeCtrlBottom = treeBottom; m_ActiveFilename = active_filename; m_UserData = user_data; m_BrowserOptions = bo; m_TokenTree = tt; m_idThreadEvent = idThreadEvent; m_CurrentFileSet.clear(); m_CurrentTokenSet.clear(); TokenTree* tree = m_NativeParser->GetParser().GetTokenTree(); // fill filter set for current-file-filter if ( m_BrowserOptions.displayFilter == bdfFile && !m_ActiveFilename.IsEmpty() ) { // m_ActiveFilename is the full filename up to the extension dot. No extension though. // get all filenames' indices matching our mask wxArrayString paths = m_NativeParser->GetAllPathsByFilename(m_ActiveFilename); // Should add locker after called m_NativeParser->GetAllPathsByFilename CC_LOCKER_TRACK_TT_MTX_LOCK(s_TokenTreeMutex) TokenFileSet result; for (size_t i = 0; i < paths.GetCount(); ++i) { tree->GetFileMatches(paths[i], result, true, true); for (TokenFileSet::const_iterator tfs_it = result.begin(); tfs_it != result.end(); ++tfs_it) m_CurrentFileSet.insert(*tfs_it); } CC_LOCKER_TRACK_TT_MTX_UNLOCK(s_TokenTreeMutex) }
void ClassBrowser::OnTreeItemDoubleClick(wxTreeEvent& event) { wxTreeCtrl* wx_tree = (wxTreeCtrl*)event.GetEventObject(); if (!wx_tree || !m_Parser) return; wxTreeItemId id = event.GetItem(); CCTreeCtrlData* ctd = (CCTreeCtrlData*)wx_tree->GetItemData(id); if (ctd && ctd->m_Token) { if (wxGetKeyState(WXK_CONTROL) && wxGetKeyState(WXK_SHIFT)) { // TokenTree* tree = m_Parser->GetTokenTree(); // the one used inside CCDebugInfo CC_LOCKER_TRACK_TT_MTX_LOCK(s_TokenTreeMutex) CCDebugInfo info(wx_tree, m_Parser, ctd->m_Token); info.ShowModal(); CC_LOCKER_TRACK_TT_MTX_UNLOCK(s_TokenTreeMutex) return; } bool toImp = false; switch (ctd->m_Token->m_TokenKind) { case tkConstructor: case tkDestructor: case tkFunction: if (ctd->m_Token->m_ImplLine != 0 && !ctd->m_Token->GetImplFilename().IsEmpty()) toImp = true; break; case tkNamespace: case tkClass: case tkEnum: case tkTypedef: case tkVariable: case tkEnumerator: case tkMacroDef: case tkMacroUse: case tkAnyContainer: case tkAnyFunction: case tkUndefined: default: break; } wxFileName fname; if (toImp) fname.Assign(ctd->m_Token->GetImplFilename()); else fname.Assign(ctd->m_Token->GetFilename()); cbProject* project = nullptr; if (!m_NativeParser->IsParserPerWorkspace()) project = m_NativeParser->GetProjectByParser(m_Parser); else project = m_NativeParser->GetCurrentProject(); wxString base; if (project) { base = project->GetBasePath(); NormalizePath(fname, base); } else { const wxArrayString& incDirs = m_Parser->GetIncludeDirs(); for (size_t i = 0; i < incDirs.GetCount(); ++i) { if (NormalizePath(fname, incDirs.Item(i))) break; } } cbEditor* ed = Manager::Get()->GetEditorManager()->Open(fname.GetFullPath()); if (ed) { int line; if (toImp) line = ctd->m_Token->m_ImplLine - 1; else line = ctd->m_Token->m_Line - 1; ed->GotoTokenPosition(line, ctd->m_Token->m_Name); } }