ASTUnit* TranslationUnitManager::ReparseProjectFile(ProjectFile* file) { { //if the file is already being parsed return immediately. std::lock_guard<std::mutex> lock(m_FilesBeingParsedMutex); auto it = std::find(m_FilesBeingParsed.begin(), m_FilesBeingParsed.end(), file); if (it != m_FilesBeingParsed.end()) return nullptr; m_FilesBeingParsed.push_back(file); } wxString fileName = file->file.GetFullPath(); ccEvent startEvent(ccEVT_REPARSE_START, fileName, nullptr, file); AddPendingEvent(startEvent); #ifdef CLANGCC_TIMING wxStopWatch watch; #endif // CLANGCC_TIMING cbStyledTextCtrl* control = Manager::Get()->GetEditorManager()->GetBuiltinEditor(fileName)->GetControl(); SmallVector<ASTUnit::RemappedFile,1> remappedFiles; if (control->GetModify()) { unsigned length = control->GetLength(); llvm::MemoryBuffer* membuf = llvm::MemoryBuffer::getNewUninitMemBuffer(length+1,wx2std(fileName)).release(); control->SendMsg(SCI_GETTEXT, length+1, (wxUIntPtr)membuf->getBufferStart()); ASTUnit::RemappedFile remap = std::make_pair(wx2std(fileName),membuf); remappedFiles.push_back(remap); } ASTUnit* tu = GetASTUnitForProjectFile(file); if (!tu) tu = ParseProjectFile(file); if (!tu || tu->Reparse(m_PCHContainerOps, remappedFiles)) LoggerAccess::Get()->Log("\t Reparsing Failed : "+ file->file.GetFullName()); #ifdef CLANGCC_TIMING LoggerAccess::Get()->Log(wxString::Format("Reparsing completed in %ldms", watch.Time()), Logger::info); #endif // CLANGCC_TIMING { //File is free again std::lock_guard<std::mutex> lock(m_FilesBeingParsedMutex); m_FilesBeingParsed.erase(std::remove(m_FilesBeingParsed.begin(), m_FilesBeingParsed.end(), file),m_FilesBeingParsed.end()); } ccEvent endEvent(ccEVT_REPARSE_END, fileName, tu, file); AddPendingEvent(endEvent); return tu; }