forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRefactoringUtils.js
More file actions
1 lines (1 loc) · 8.37 KB
/
Copy pathRefactoringUtils.js
File metadata and controls
1 lines (1 loc) · 8.37 KB
1
define(function(require,exports,module){var Acorn=brackets.getModule("thirdparty/acorn/dist/acorn"),ASTWalker=brackets.getModule("thirdparty/acorn/dist/walk"),MessageIds=JSON.parse(brackets.getModule("text!JSUtils/MessageIds.json")),_=brackets.getModule("thirdparty/lodash"),AcornLoose=brackets.getModule("thirdparty/acorn/dist/acorn_loose"),ScopeManager=brackets.getModule("JSUtils/ScopeManager"),templates=JSON.parse(require("text!Templates.json")),FUNCTION_BODY_PREFIX_LENGTH=30;function isEqual(a,b){return a.start===b.start&&a.end===b.end}function getExpression(ast,start,end,fileText){var expn=findSurroundExpression(ast,{start:start,end:end});if(!expn)return!1;if("ClassExpression"===expn.type&&expn.start===start&&expn.end-end<=1)return expn.end=end,expn;if(expn.start===start&&expn.end===end)return expn;if(!["BinaryExpression","LogicalExpression","SequenceExpression"].includes(expn.type))return!1;var parentExpn=expn,parentExpStr=fileText.substr(parentExpn.start,parentExpn.end-parentExpn.start),str,node=isStandAloneExpression(parentExpStr.substr(0,start-parentExpn.start)+"placeHolder"+parentExpStr.substr(end-parentExpn.start));return!(!node||node.type!==parentExpn.type)&&parentExpn}function getAST(text){var ast;try{ast=Acorn.parse(text,{ecmaVersion:9})}catch(e){ast=AcornLoose.parse(text,{ecmaVersion:9})}return ast}function checkStatement(ast,start,end,fileText){var notStatement=!1;if(ASTWalker.simple(getAST(fileText.substr(start,end-start)),{FunctionDeclaration:function(node){notStatement=!0},ClassDeclaration:function(node){notStatement=!0}}),notStatement)return!1;var startStatement=findSurroundASTNode(ast,{start:start},["Statement"]),endStatement=findSurroundASTNode(ast,{start:end},["Statement"]);return startStatement&&endStatement&&startStatement.start===start&&startStatement.end<=end&&endStatement.start>=start&&endStatement.end===end}function getUniqueIdentifierName(scopes,prefix,num){if(!scopes)return prefix;var props=scopes.reduce(function(props,scope){return _.union(props,_.keys(scope.props))},[]),name;if(!props)return prefix;for(num=num||"1";num<100&&(name=prefix+num,-1!==props.indexOf(name));)++num;return name}function numLines(text){return text.split("\n").length}function isStandAloneExpression(text){var found=ASTWalker.findNodeAt(getAST(text),0,text.length,function(nodeType,node){return"Expression"===nodeType});return found&&found.node}function getScopeData(session,offset){var path=session.path,fileInfo={type:MessageIds.TERN_FILE_INFO_TYPE_FULL,name:path,offsetLines:0,text:ScopeManager.filterText(session.getJavascriptText())};ScopeManager.postMessage({type:MessageIds.TERN_SCOPEDATA_MSG,fileInfo:fileInfo,offset:offset});var ternPromise=ScopeManager.addPendingRequest(fileInfo.name,offset,MessageIds.TERN_SCOPEDATA_MSG),result=new $.Deferred;return ternPromise.done(function(response){result.resolveWith(null,[response.scope])}).fail(function(){result.reject()}),result}function normalizeText(text,start,end,removeTrailingSemiColons){var trimmedText;return(trimmedText=_.trimLeft(text)).length<text.length&&(start+=text.length-trimmedText.length),text=trimmedText,(trimmedText=_.trimRight(text)).length<text.length&&(end-=text.length-trimmedText.length),text=trimmedText,removeTrailingSemiColons&&(trimmedText=_.trimRight(text,";")).length<text.length&&(end-=text.length-trimmedText.length),{text:trimmedText,start:start,end:end}}function isFnScope(scope){return!scope.isBlock&&!scope.isCatch}function findSurroundExpression(ast,expn){for(var start=expn.start,end=expn.end,surroundExpn;;){if(!(surroundExpn=findSurroundASTNode(ast,{start:start,end:end},["Expression"])))return null;if("SequenceExpression"===surroundExpn.type)start=surroundExpn.start-1;else{if("FunctionExpression"!==surroundExpn.type)return surroundExpn;var methodDefinitionNode=findSurroundASTNode(ast,surroundExpn,["MethodDefinition"]);if(!methodDefinitionNode||!isEqual(methodDefinitionNode.value,surroundExpn))return surroundExpn;start=surroundExpn.start-1}}return surroundExpn}function findSurroundASTNode(ast,expn,types){var foundNode=ASTWalker.findNodeAround(ast,expn.start,function(nodeType,node){return expn.end?types.includes(nodeType)&&node.end>=expn.end:types.includes(nodeType)});return foundNode&&_.clone(foundNode.node)}function getAllScopes(ast,scope,fullText){for(var curScope=scope,cnt=0,scopes=[];curScope;){if(curScope.id=cnt++,scopes.push(curScope),curScope.fnType)if("FunctionExpression"===curScope.fnType){var methodDefinitionNode=findSurroundASTNode(ast,curScope.originNode,["MethodDefinition"]);if(methodDefinitionNode&&isEqual(methodDefinitionNode.value,curScope.originNode)){curScope.name=methodDefinitionNode.key.name,curScope.originNode=methodDefinitionNode;var classNode=findSurroundASTNode(ast,methodDefinitionNode,["ClassDeclaration","ClassExpression"]);if(classNode){var temp=curScope.prev,newScope={isClass:!0};if("ClassExpression"===classNode.type){var assignmentExpNode=findSurroundASTNode(ast,classNode,["AssignmentExpression"]);if(assignmentExpNode&&assignmentExpNode.left&&assignmentExpNode.left.name)newScope.name="class "+assignmentExpNode.left.name;else{var varDeclaratorNode=findSurroundASTNode(ast,classNode,["VariableDeclarator"]);varDeclaratorNode&&varDeclaratorNode.id&&varDeclaratorNode.id.name?newScope.name="class "+varDeclaratorNode.id.name:newScope.name="class null"}}else newScope.name="class "+(classNode.id&&classNode.id.name);newScope.originNode=classNode,curScope.prev=newScope,newScope.prev=temp}}else curScope.name="function starting with "+fullText.substr(curScope.originNode.body.start,Math.min(FUNCTION_BODY_PREFIX_LENGTH,curScope.originNode.body.end-curScope.originNode.body.start))}else"✖"===curScope.fnType?curScope.name="function starting with "+fullText.substr(curScope.originNode.body.start,Math.min(FUNCTION_BODY_PREFIX_LENGTH,curScope.originNode.body.end-curScope.originNode.body.start)):curScope.name=curScope.fnType;else curScope.originNode||(curScope.name="global");curScope=curScope.prev}return scopes}function RefactoringSession(editor){this.editor=editor,this.document=editor.document,this.selection=editor.getSelection(),this.text=this.document.getText(),this.selectedText=editor.getSelectedText(),this.cm=editor._codeMirror,this.startIndex=editor.indexFromPos(this.selection.start),this.endIndex=editor.indexFromPos(this.selection.end),this.startPos=this.selection.start,this.endPos=this.selection.end,this.ast=this.createAstOfCurrentDoc()}RefactoringSession.prototype.lineEndPosition=function(line){var lineText;return{line:line,ch:this.document.getLine(line).length}},RefactoringSession.prototype.createAstOfCurrentDoc=function(){var ast,text=this.document.getText();try{ast=Acorn.parse(text)}catch(e){ast=AcornLoose.parse(text)}return ast},RefactoringSession.prototype.replaceTextFromTemplate=function(template,args,rangeToReplace,subTemplate){var templateText=templates[template];subTemplate&&(templateText=templateText[subTemplate]);var compiled,formattedText=_.template(templateText)(args);rangeToReplace||(rangeToReplace=this.editor.getSelection()),this.document.replaceRange(formattedText,rangeToReplace.start,rangeToReplace.end);for(var startLine=rangeToReplace.start.line,endLine=startLine+formattedText.split("\n").length,i=startLine+1;i<endLine;i++)this.cm.indentLine(i)},RefactoringSession.prototype.getParamsOfFunction=function getParamsOfFunction(start,end,selectedText){var param=[];return ASTWalker.simple(AcornLoose.parse(selectedText),{Function:function(node){"FunctionDeclaration"===node.type&&node.params.forEach(function(item){param.push(item.name)})}}),param},RefactoringSession.prototype.getParentNode=function(ast,start){var foundNode=ASTWalker.findNodeAround(ast,start,function(nodeType,node){return"ObjectExpression"===nodeType});return foundNode&&foundNode.node},RefactoringSession.prototype.isLastNodeInScope=function(ast,start){var parentNode=this.getParentNode(ast,start),currentNodeStart;return ASTWalker.simple(parentNode,{Property:function(node){currentNodeStart=node.start}}),start>=currentNodeStart},exports.isEqual=isEqual,exports.getUniqueIdentifierName=getUniqueIdentifierName,exports.isStandAloneExpression=isStandAloneExpression,exports.numLines=numLines,exports.getScopeData=getScopeData,exports.normalizeText=normalizeText,exports.getExpression=getExpression,exports.isFnScope=isFnScope,exports.getAllScopes=getAllScopes,exports.checkStatement=checkStatement,exports.findSurroundASTNode=findSurroundASTNode,exports.getAST=getAST,exports.findSurroundExpression=findSurroundExpression,exports.RefactoringSession=RefactoringSession});