forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathExtractToVariable.js
More file actions
1 lines (1 loc) · 6.82 KB
/
Copy pathExtractToVariable.js
File metadata and controls
1 lines (1 loc) · 6.82 KB
1
define(function(require,exports,module){var ASTWalker=brackets.getModule("thirdparty/acorn/dist/walk"),EditorManager=brackets.getModule("editor/EditorManager"),Session=brackets.getModule("JSUtils/Session"),RefactoringUtils=require("RefactoringUtils"),Strings=brackets.getModule("strings"),InlineMenu=brackets.getModule("widgets/InlineMenu").InlineMenu,session=null;function extract(scopes,parentStatement,expns,text,insertPosition){var varType="var",varName=RefactoringUtils.getUniqueIdentifierName(scopes,"extracted"),varDeclaration="var "+varName+" = "+text+";\n",parentStatementStartPos=session.editor.posFromIndex(parentStatement.start),insertStartPos=insertPosition||parentStatementStartPos,selections=[],doc=session.editor.document,replaceExpnIndex=0,posToIndent,edits=[];"ExpressionStatement"===parentStatement.type&&RefactoringUtils.isEqual(parentStatement.expression,expns[0])&&insertStartPos.line===parentStatementStartPos.line&&insertStartPos.ch===parentStatementStartPos.ch&&(varDeclaration="var "+varName+" = ",replaceExpnIndex=1),posToIndent=doc.adjustPosForChange(insertStartPos,varDeclaration.split("\n"),insertStartPos,insertStartPos);for(var i=replaceExpnIndex;i<expns.length;++i)expns[i].start=session.editor.posFromIndex(expns[i].start),expns[i].end=session.editor.posFromIndex(expns[i].end),expns[i].start=doc.adjustPosForChange(expns[i].start,varDeclaration.split("\n"),insertStartPos,insertStartPos),expns[i].end=doc.adjustPosForChange(expns[i].end,varDeclaration.split("\n"),insertStartPos,insertStartPos),edits.push({edit:{text:varName,start:expns[i].start,end:expns[i].end},selection:{start:expns[i].start,end:{line:expns[i].start.line,ch:expns[i].start.ch+varName.length}}});doc.batchOperation(function(){doc.replaceRange(varDeclaration,insertStartPos),(selections=doc.doMultipleEdits(edits)).push({start:{line:insertStartPos.line,ch:insertStartPos.ch+"var".length+1},end:{line:insertStartPos.line,ch:insertStartPos.ch+"var".length+varName.length+1},primary:!0}),session.editor.setSelections(selections),session.editor._codeMirror.indentLine(posToIndent.line,"smart")})}function findAllExpressions(parentBlockStatement,expn,text){var doc=session.editor.document,obj={},expns=[];return obj[expn.type]=function(node){text===doc.getText().substr(node.start,node.end-node.start)&&expns.push(node)},ASTWalker.simple(parentBlockStatement,obj),expns}function getExpressions(ast,start,end){for(var expns=[],s=start,e=end,expn;expn=RefactoringUtils.findSurroundExpression(ast,{start:s,end:e});)expns.push(expn),s=expn.start-1;function checkExpnEquality(e){return e.start===expn.start&&e.end===expn.end}for(s=start,e=end;expn=RefactoringUtils.findSurroundExpression(ast,{start:s,end:e});)e=expn.end+1,expns.find(checkExpnEquality)||expns.push(expn);return expns}function extractToVariable(ast,start,end,text,scopes){var doc=session.editor.document,editor=EditorManager.getActiveEditor(),parentExpn=RefactoringUtils.getExpression(ast,start,end,doc.getText()),expns=[],parentBlockStatement,parentStatement;parentExpn?doc.getText().substr(parentExpn.start,parentExpn.end-parentExpn.start)===text?(parentBlockStatement=RefactoringUtils.findSurroundASTNode(ast,parentExpn,["BlockStatement","Program"]),expns=findAllExpressions(parentBlockStatement,parentExpn,text),RefactoringUtils.getScopeData(session,editor.posFromIndex(expns[0].start)).done(function(scope){var firstExpnsScopes=RefactoringUtils.getAllScopes(ast,scope,doc.getText()),insertPostion;if(parentStatement=RefactoringUtils.findSurroundASTNode(ast,expns[0],["Statement"]),scopes.length<firstExpnsScopes.length){var parentScope;parentScope=expns[0].body&&"BlockStatement"===expns[0].body.type?firstExpnsScopes[firstExpnsScopes.length-scopes.length]:firstExpnsScopes[firstExpnsScopes.length-scopes.length-1];var insertNode=RefactoringUtils.findSurroundASTNode(ast,parentScope.originNode,["Statement"]);insertNode&&(insertPostion=session.editor.posFromIndex(insertNode.start))}extract(scopes,parentStatement,expns,text,insertPostion)})):(parentStatement=RefactoringUtils.findSurroundASTNode(ast,parentExpn,["Statement"]),extract(scopes,parentStatement,[{start:start,end:end}],text)):session.editor.displayErrorMessageAtCursor(Strings.ERROR_EXTRACTTO_VARIABLE_NOT_VALID)}function handleExtractToVariable(){var editor=EditorManager.getActiveEditor();if(editor.getSelections().length>1)editor.displayErrorMessageAtCursor(Strings.ERROR_EXTRACTTO_VARIABLE_MULTICURSORS);else{initializeSession(editor);var selection=editor.getSelection(),doc=editor.document,retObj=RefactoringUtils.normalizeText(editor.getSelectedText(),editor.indexFromPos(selection.start),editor.indexFromPos(selection.end),!0),text=retObj.text,start=retObj.start,end=retObj.end,ast,scopes,expns,inlineMenu;RefactoringUtils.getScopeData(session,editor.posFromIndex(start)).done(function(scope){if(ast=RefactoringUtils.getAST(doc.getText()),scopes=RefactoringUtils.getAllScopes(ast,scope,doc.getText()),editor.hasSelection())extractToVariable(ast,start,end,text,scopes);else{if((expns=getExpressions(ast,start,end)).forEach(function(expn,index){expn.value=doc.getText().substr(expn.start,expn.end-expn.start)}),expns.sort(function(a,b){return a.value.length-b.value.length}),!expns||!expns.length)return void session.editor.displayErrorMessageAtCursor(Strings.ERROR_EXTRACTTO_VARIABLE_NOT_VALID);var firstExpnLength=RefactoringUtils.numLines(expns[0].value);if((expns=expns.filter(function(expn){return RefactoringUtils.numLines(expn.value)===firstExpnLength})).forEach(function(expn,index){RefactoringUtils.numLines(expn.value)>1?expn.name=expn.value.substr(0,expn.value.indexOf("\n"))+"...":expn.name=expn.value}),1===expns.length)return void callExtractToVariable(expns[0].start,expns[0].end,expns[0].value);expns.forEach(function(expn,index){expn.id=index}),(inlineMenu=new InlineMenu(session.editor,Strings.EXTRACTTO_VARIABLE_SELECT_EXPRESSION)).onHover(function(expnId){editor.off("scroll.inlinemenu"),editor.isLineVisible(editor.posFromIndex(expns[expnId].end).line)||editor.on("scroll.inlinemenu",function(){editor.off("scroll.inlinemenu"),inlineMenu.openRemovedMenu()}),editor.setSelection(editor.posFromIndex(expns[expnId].start),editor.posFromIndex(expns[expnId].end))}),inlineMenu.open(expns),inlineMenu.onSelect(function(expnId){callExtractToVariable(expns[expnId].start,expns[expnId].end,expns[expnId].value),inlineMenu.close()}),inlineMenu.onClose(function(){inlineMenu.close()})}}).fail(function(){editor.displayErrorMessageAtCursor(Strings.ERROR_TERN_FAILED)})}function callExtractToVariable(startPos,endPos,value){RefactoringUtils.getScopeData(session,editor.posFromIndex(startPos)).done(function(expnscope){scopes=RefactoringUtils.getAllScopes(ast,expnscope,doc.getText()),extractToVariable(ast,startPos,endPos,value,scopes)}).fail(function(){editor.displayErrorMessageAtCursor(Strings.ERROR_TERN_FAILED)})}}function initializeSession(editor){session=new Session(editor)}exports.handleExtractToVariable=handleExtractToVariable});