forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathFindInFiles.js
More file actions
1 lines (1 loc) · 16.9 KB
/
FindInFiles.js
File metadata and controls
1 lines (1 loc) · 16.9 KB
1
define(function(require,exports,module){var _=require("thirdparty/lodash"),FileFilters=require("search/FileFilters"),Async=require("utils/Async"),StringUtils=require("utils/StringUtils"),ProjectManager=require("project/ProjectManager"),DocumentModule=require("document/Document"),DocumentManager=require("document/DocumentManager"),MainViewManager=require("view/MainViewManager"),FileSystem=require("filesystem/FileSystem"),LanguageManager=require("language/LanguageManager"),SearchModel=require("search/SearchModel").SearchModel,PerfUtils=require("utils/PerfUtils"),FindUtils=require("search/FindUtils"),Metrics=require("utils/Metrics"),IndexingWorker=require("worker/IndexingWorker");let projectIndexingComplete=!1;IndexingWorker.loadScriptInWorker(`${Phoenix.baseURL}search/worker/search.js`),IndexingWorker.on(IndexingWorker.EVENT_CRAWL_COMPLETE,function(_evt,params){workerFileCacheComplete(params)}),IndexingWorker.on(IndexingWorker.EVENT_CRAWL_PROGRESS,function(_evt,params){FindUtils.notifyIndexingProgress(params.processed,params.total)});let searchScopeChanged=!1,findOrReplaceInProgress=!1,changedFileList={};var ZERO_FILES_TO_SEARCH={},MAX_DISPLAY_LENGTH=200;let CACHE_INIT_DELAY_MS=1e3;var searchModel=new SearchModel,_documentChangeHandler,_fileSystemChangeHandler,_processCachedFileSystemEvents,_debouncedFileSystemChangeHandler,_fileNameChangeHandler,clearSearch,FILE_SYSTEM_EVENT_DEBOUNCE_TIME=100;function _removeListeners(){DocumentModule.off("documentChange",_documentChangeHandler),FileSystem.off("change",_debouncedFileSystemChangeHandler),DocumentManager.off("fileNameChange",_fileNameChangeHandler)}function _addListeners(){_removeListeners(),DocumentModule.on("documentChange",_documentChangeHandler),FileSystem.on("change",_debouncedFileSystemChangeHandler),DocumentManager.on("fileNameChange",_fileNameChangeHandler)}function workerFileCacheComplete(data){let numFiles=data.numFilesCached,cacheSize=data.cacheSizeBytes,crawlTime=data.crawlTimeMs;if(projectIndexingComplete=!0,console.log(`file indexing worker cache complete: ${numFiles} files, size: ${cacheSize} B in ${crawlTime}ms`),!/\/test\/SpecRunner\.html$/.test(window.location.pathname)){var projectRoot=ProjectManager.getProjectRoot(),projectName=projectRoot?projectRoot.name:null;projectName||(console.error("'File cache complete' event received, but no project root found"),projectName="noName00"),FindUtils.setInstantSearchDisabled(!1),FindUtils.notifyIndexingFinished(),Metrics.valueEvent(Metrics.EVENT_TYPE.SEARCH,"indexing","numFiles",numFiles),Metrics.valueEvent(Metrics.EVENT_TYPE.SEARCH,"indexing","cacheSizeKB",cacheSize/1024),Metrics.valueEvent(Metrics.EVENT_TYPE.SEARCH,"indexing","crawlTimeMs",crawlTime)}}function _getSearchMatches(contents,queryExpr){if(searchModel.foundMaximum||-1===contents.search(queryExpr))return[];for(var match,lineNum,line,ch,totalMatchLength,matchedLines,numMatchedLines,lastLineLength,endCh,padding,leftPadding,rightPadding,highlightOffset,highlightEndCh,lines=StringUtils.getLines(contents),matches=[];null!==(match=queryExpr.exec(contents));){if(line=lines[lineNum=StringUtils.offsetToLineNum(lines,match.index)],ch=match.index-contents.lastIndexOf("\n",match.index-1)-1,numMatchedLines=(matchedLines=match[0].split("\n")).length,totalMatchLength=match[0].length,lastLineLength=matchedLines[matchedLines.length-1].length,endCh=1===numMatchedLines?ch+totalMatchLength:lastLineLength,highlightOffset=0,(highlightEndCh=1===numMatchedLines?endCh:line.length)<=MAX_DISPLAY_LENGTH?line=line.substr(0,MAX_DISPLAY_LENGTH):totalMatchLength>MAX_DISPLAY_LENGTH?(line=line.substr(ch,ch+MAX_DISPLAY_LENGTH),highlightOffset=ch):(padding=MAX_DISPLAY_LENGTH-totalMatchLength,rightPadding=Math.floor(Math.min(padding/2,line.length-highlightEndCh)),highlightOffset=ch-(leftPadding=Math.ceil(padding-rightPadding)),line=line.substring(highlightOffset,highlightEndCh+rightPadding)),matches.push({start:{line:lineNum,ch:ch},end:{line:lineNum+numMatchedLines-1,ch:endCh},highlightOffset:highlightOffset,startOffset:match.index,endOffset:match.index+totalMatchLength,line:line,result:match,isChecked:!0}),matches.length>SearchModel.MAX_TOTAL_RESULTS){queryExpr.lastIndex=0;break}0===totalMatchLength&&queryExpr.lastIndex++}return matches}function _updateResults(doc,changeList){var i,diff,matches,lines,start,howMany,resultsChanged=!1,fullPath=doc.file.fullPath,resultInfo=searchModel.results[fullPath];searchModel.removeResults(fullPath),changeList.forEach(function(change){if(lines=[],start=0,howMany=0,change.from&&change.to){for(i=0;i<change.text.length;i++)lines.push(doc.getLine(change.from.line+i));diff=lines.length-1-(change.to.line-change.from.line),resultInfo&&(resultInfo.matches.forEach(function(item){item.end.line<change.from.line?start++:item.end.line<=change.to.line?howMany++:(item.start.line+=diff,item.end.line+=diff)}),howMany>0&&resultInfo.matches.splice(start,howMany),resultsChanged=!0),(matches=_getSearchMatches(lines.join("\r\n"),searchModel.queryExpr)).length&&(matches.forEach(function(value,key){matches[key].start.line+=change.from.line,matches[key].end.line+=change.from.line}),resultInfo?Array.prototype.splice.apply(resultInfo.matches,[start,0].concat(matches)):resultInfo={matches:matches,collapsed:!1,timestamp:doc.diskTimestamp},resultsChanged=!0)}else resultInfo={matches:_getSearchMatches(doc.getText(),searchModel.queryExpr),timestamp:doc.diskTimestamp},resultsChanged=!0}),resultInfo&&resultInfo.matches.length&&searchModel.setResults(fullPath,resultInfo),resultsChanged&&searchModel.fireChanged(!0)}function _subtreeFilter(file,scope){return!scope||(scope.isDirectory?0===file.fullPath.indexOf(scope.fullPath):file.fullPath===scope.fullPath)}function _isReadableFileType(fullPath){return!LanguageManager.getLanguageForPath(fullPath).isBinary()}function getCandidateFiles(scope){function filter(file){return _subtreeFilter(file,scope)&&_isReadableFileType(file.fullPath)}return scope&&scope.isFile?(new $.Deferred).resolve(filter(scope)?[scope]:[]).promise():ProjectManager.getAllFiles(filter,!0,!0,{scope:scope})}function _inSearchScope(file){if(searchModel&&searchModel.scope){if(!_subtreeFilter(file,searchModel.scope))return!1}else if(0!==file.fullPath.indexOf(ProjectManager.getProjectRoot().fullPath)&&-1===MainViewManager.findInWorkingSet(MainViewManager.ALL_PANES,file.fullPath))return!1;return!!_isReadableFileType(file.fullPath)&&FileFilters.filterPath(searchModel.filter,file.fullPath)}function _doSearchInOneFile(file){var result=new $.Deferred;return DocumentManager.getDocumentText(file).done(function(text,timestamp){var matches=_getSearchMatches(text,searchModel.queryExpr);searchModel.setResults(file.fullPath,{matches:matches,timestamp:timestamp}),result.resolve(!!matches.length)}).fail(function(){result.resolve(!1)}),result.promise()}function _updateDocumentInWorker(docPath){DocumentManager.getDocumentForPath(docPath).done(function(doc){if(doc){var updateObject={filePath:docPath,docContents:doc.getText()};IndexingWorker.execPeer("documentChanged",updateObject)}})}function _updateChangedDocs(){let key=null;for(key in changedFileList)changedFileList.hasOwnProperty(key)&&_updateDocumentInWorker(key);changedFileList={}}function _doSearch(queryInfo,candidateFilesPromise,filter,scope){var queryResult;if(searchModel.filter=filter,!searchModel.setQueryInfo(queryInfo))return null;var scopeName=searchModel.scope?searchModel.scope.fullPath:ProjectManager.getProjectRoot().fullPath,perfTimer=PerfUtils.markStart("FindIn: "+scopeName+" - "+queryInfo.query);return findOrReplaceInProgress=!0,candidateFilesPromise.then(function(fileListResult){const isSingleFileScope=scope&&scope.isFile;if(isSingleFileScope||(fileListResult=FileFilters.filterFileList(filter,fileListResult)),searchModel.isReplace)return fileListResult.length?(searchModel.allResultsAvailable=!0,Async.doInParallel(fileListResult,_doSearchInOneFile)):ZERO_FILES_TO_SEARCH;var searchDeferred=new $.Deferred;if(fileListResult.length){var searchObject;if(searchScopeChanged){var files=fileListResult.filter(function(entry){return entry.isFile&&_isReadableFileType(entry.fullPath)}).map(function(entry){return entry.fullPath});searchObject={files:files=FindUtils.prioritizeOpenFile(files,FindUtils.getOpenFilePath()),queryInfo:queryInfo,queryExpr:searchModel.queryExpr},searchScopeChanged=!1}else searchObject={queryInfo:queryInfo,queryExpr:searchModel.queryExpr};searchModel.isReplace&&(searchObject.getAllResults=!0),_updateChangedDocs(),FindUtils.notifyWorkerSearchStarted();let searchStatTime=Date.now();return IndexingWorker.execPeer("doSearch",searchObject).then(function(rcvd_object){if(FindUtils.notifyWorkerSearchFinished(),!rcvd_object||!rcvd_object.results)return console.error("search worker failed, falling back to brackets search",rcvd_object),searchDeferred.fail(),void clearSearch();searchModel.results=rcvd_object.results,searchModel.numMatches=rcvd_object.numMatches,searchModel.numFiles=rcvd_object.numFiles,searchModel.exceedsMaximum=rcvd_object.exceedsMaximum,searchModel.allResultsAvailable=rcvd_object.allResultsAvailable,searchDeferred.resolve(),Metrics.valueEvent(Metrics.EVENT_TYPE.SEARCH,"instantSearch","timeMs",Date.now()-searchStatTime)}).catch(function(err){FindUtils.notifyWorkerSearchFinished(),console.error("worker fails",err),clearSearch(),searchDeferred.reject()}),searchDeferred.promise()}return ZERO_FILES_TO_SEARCH}).then(function(zeroFilesToken){return exports._searchDone=!0,PerfUtils.addMeasurement(perfTimer),zeroFilesToken===ZERO_FILES_TO_SEARCH?zeroFilesToken:searchModel.results},function(err){return console.error("find in files failed: ",err),PerfUtils.finalizeMeasurement(perfTimer),err})}function doSearchInScope(queryInfo,scope,filter,replaceText,candidateFilesPromise){return clearSearch(),searchModel.scope=scope,void 0!==replaceText&&(searchModel.isReplace=!0,searchModel.replaceText=replaceText),_doSearch(queryInfo,candidateFilesPromise=candidateFilesPromise||getCandidateFiles(scope),filter,scope)}function doReplace(results,replaceText,options){return FindUtils.performReplacements(results,replaceText,options).always(function(){exports._replaceDone=!0})}_documentChangeHandler=function(event,document,change){changedFileList[document.file.fullPath]=!0,findOrReplaceInProgress&&_inSearchScope(document.file)&&_updateResults(document,change)},clearSearch=function(){findOrReplaceInProgress=!1,searchModel.clear()};var _searchScopeChanged=function(){searchScopeChanged=!0};function _searchcollapseResults(){IndexingWorker.execPeer("collapseResults",FindUtils.isCollapsedResults())}function filesChanged(fileList){if(fileList&&0!==fileList.length){var updateObject={fileList:fileList};searchModel.filter&&(updateObject.filesInSearchScope=FileFilters.getPathsMatchingFilter(searchModel.filter,fileList),_searchScopeChanged()),IndexingWorker.execPeer("filesChanged",updateObject)}}function filesRemoved(fileList){if(fileList&&0!==fileList.length){var updateObject={fileList:fileList};searchModel.filter&&(updateObject.filesInSearchScope=FileFilters.getPathsMatchingFilter(searchModel.filter,fileList),_searchScopeChanged()),IndexingWorker.execPeer("filesRemoved",updateObject)}}_fileNameChangeHandler=function(event,oldName,newName){var resultsChanged=!1;let removedFiles=[],changedFiles=[];_.forEach(searchModel.results,function(item,fullPath){0===fullPath.indexOf(oldName)&&(removedFiles.push(fullPath),changedFiles.push(fullPath.replace(oldName,newName)),findOrReplaceInProgress&&(searchModel.removeResults(fullPath),searchModel.setResults(fullPath.replace(oldName,newName),item),resultsChanged=!0))}),filesRemoved(removedFiles),filesChanged(changedFiles),resultsChanged&&searchModel.fireChanged()},_fileSystemChangeHandler=function(event,entry,added,removed){var resultsChanged=!1;function _removeSearchResultsForEntries(entries){var fullPaths=[];entries.forEach(function(entry){Object.keys(searchModel.results).forEach(function(fullPath){(fullPath===entry.fullPath||entry.isDirectory&&0===fullPath.indexOf(entry.fullPath))&&(fullPaths.push(fullPath),findOrReplaceInProgress&&(searchModel.removeResults(fullPath),resultsChanged=!0))})}),filesRemoved(fullPaths)}function _addSearchResultsForEntries(entries){var fullPaths=[];return Async.doInParallel(entries,function(entry){var addedFiles=[],addedFilePaths=[],deferred=new $.Deferred,visitor=function(child){return!!ProjectManager.shouldIndex(child)&&(child.isFile&&_isReadableFileType(child.name)&&_inSearchScope(child)&&(addedFiles.push(child),addedFilePaths.push(child.fullPath)),!0)};return entry.visit(visitor,function(err){err?deferred.reject(err):(fullPaths=fullPaths.concat(addedFilePaths),findOrReplaceInProgress?Async.doInParallel(addedFiles,function(file){return _doSearchInOneFile(file).done(function(foundMatches){resultsChanged=resultsChanged||foundMatches})}).always(deferred.resolve):deferred.resolve())}),deferred.promise()}).always(function(){filesChanged(fullPaths)})}if(entry){var addPromise;if(entry.isDirectory)if(0===added.length&&0===removed.length){_removeSearchResultsForEntries([entry]);var deferred=$.Deferred();addPromise=deferred.promise(),entry.getContents(function(err,entries){_addSearchResultsForEntries(entries).always(deferred.resolve)})}else _removeSearchResultsForEntries(removed),addPromise=_addSearchResultsForEntries(added);else _removeSearchResultsForEntries([entry]),addPromise=_addSearchResultsForEntries([entry]);addPromise.always(function(){resultsChanged&&searchModel.fireChanged()})}};var _cachedFileSystemEvents=[];_processCachedFileSystemEvents=_.debounce(function(){_cachedFileSystemEvents=_cachedFileSystemEvents.reduce(function(result,obj){var fullPath=obj.entry?obj.entry.fullPath:null;return result[fullPath]&&obj.isDirectory&&(obj.added=obj.added.concat(result[fullPath].added),obj.removed=obj.removed.concat(result[fullPath].removed)),result[fullPath]=obj,result},{}),_.forEach(_cachedFileSystemEvents,function(obj){_fileSystemChangeHandler(obj.event,obj.entry,obj.added,obj.removed)}),_cachedFileSystemEvents=[]},100),_debouncedFileSystemChangeHandler=function(event,entry,added,removed){var isDirectory=!1;entry&&entry.isDirectory&&(isDirectory=!0,added=added||[],removed=removed||[]),_cachedFileSystemEvents.push({event:event,entry:entry,isDirectory:isDirectory,added:added,removed:removed}),_processCachedFileSystemEvents()};var _initCache=function(){function filter(file){return _isReadableFileType(file.fullPath)}projectIndexingComplete=!1,FindUtils.setInstantSearchDisabled(!0),_addListeners(),FindUtils.notifyIndexingStarted(),ProjectManager.getAllFiles(filter,!0,!0).done(function(fileListResult){let files=fileListResult;files=files.filter(function(entry){return entry.isFile&&_isReadableFileType(entry.fullPath)}).map(function(entry){return entry.fullPath}),IndexingWorker.execPeer("initCache",files)}),_searchScopeChanged()};function _scheduleCacheInit(){projectIndexingComplete=!1,setTimeout(_initCache,CACHE_INIT_DELAY_MS)}function getNextPageofSearchResults(){var searchDeferred=$.Deferred();return searchModel.allResultsAvailable?searchDeferred.resolve().promise():(_updateChangedDocs(),FindUtils.notifyWorkerSearchStarted(),IndexingWorker.execPeer("nextPage").then(function(rcvd_object){var resultEntry;if(FindUtils.notifyWorkerSearchFinished(),searchModel.results)for(resultEntry in rcvd_object.results)rcvd_object.results.hasOwnProperty(resultEntry)&&(searchModel.results[resultEntry.toString()]=rcvd_object.results[resultEntry]);else searchModel.results=rcvd_object.results;searchModel.fireChanged(),searchDeferred.resolve()}).catch(function(err){FindUtils.notifyWorkerSearchFinished(),console.error("search worker fails",err),searchDeferred.reject()}),searchDeferred.promise())}function getAllSearchResults(){var searchDeferred=$.Deferred();return searchModel.allResultsAvailable?searchDeferred.resolve().promise():(_updateChangedDocs(),FindUtils.notifyWorkerSearchStarted(),IndexingWorker.execPeer("getAllResults").then(function(rcvd_object){FindUtils.notifyWorkerSearchFinished(),searchModel.results=rcvd_object.results,searchModel.numMatches=rcvd_object.numMatches,searchModel.numFiles=rcvd_object.numFiles,searchModel.allResultsAvailable=!0,searchModel.fireChanged(),searchDeferred.resolve()}).catch(function(err){FindUtils.notifyWorkerSearchFinished(),console.error("search worker fails",err),searchDeferred.reject()}),searchDeferred.promise())}function isProjectIndexingComplete(){return projectIndexingComplete}ProjectManager.on("projectOpen",_scheduleCacheInit),FindUtils.on(FindUtils.SEARCH_FILE_FILTERS_CHANGED,_searchScopeChanged),FindUtils.on(FindUtils.SEARCH_SCOPE_CHANGED,_searchScopeChanged),FindUtils.on(FindUtils.SEARCH_COLLAPSE_RESULTS,_searchcollapseResults),exports.searchModel=searchModel,exports.isProjectIndexingComplete=isProjectIndexingComplete,exports.doSearchInScope=doSearchInScope,exports.doReplace=doReplace,exports.getCandidateFiles=getCandidateFiles,exports.clearSearch=clearSearch,exports.ZERO_FILES_TO_SEARCH=ZERO_FILES_TO_SEARCH,exports.getNextPageofSearchResults=getNextPageofSearchResults,exports.getAllSearchResults=getAllSearchResults,exports._documentChangeHandler=_documentChangeHandler,exports._fileNameChangeHandler=_fileNameChangeHandler,exports._fileSystemChangeHandler=_fileSystemChangeHandler});