package com.chrisfolger.needsmoredojo.intellij.actions; import com.chrisfolger.needsmoredojo.core.amd.AMDImport; import com.chrisfolger.needsmoredojo.core.amd.define.DefineStatement; import com.chrisfolger.needsmoredojo.core.amd.psi.AMDPsiUtil; import com.intellij.lang.javascript.JSTokenTypes; import com.intellij.lang.javascript.psi.JSArrayLiteralExpression; import com.intellij.lang.javascript.psi.JSElement; import com.intellij.lang.javascript.psi.JSParameterList; import com.intellij.lang.javascript.psi.impl.JSChangeUtil; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.psi.PsiElement; import java.util.List; public class SendToEndAction extends SendToAction { @Override protected String getName() { return "Send AMD Import to End"; } @Override protected void moveAction(AnActionEvent e, PsiElement define, PsiElement parameter, List<PsiElement> defines, List<PsiElement> parameters, DefineStatement defineStatement) { // go to the last literal/parameter pair PsiElement lastLiteral = null; PsiElement lastParameter = null; if(defines.size() > parameters.size()) { lastLiteral = defines.get(parameters.size()-1); lastParameter = parameters.get(parameters.size()-1); } else { lastLiteral = defines.get(defines.size()-1); lastParameter = parameters.get(defines.size()-1); } final PsiElement finalLastLiteral = lastLiteral; final PsiElement finalLastParameter = lastParameter; moveElementToEnd(define, parameter, finalLastLiteral, finalLastParameter, defineStatement); } private PsiElement moveImportToEnd(JSArrayLiteralExpression imports, JSParameterList parameters, String module, String parameter, PsiElement lastDefine, PsiElement lastParameter) { // TODO move to AMDPsiUtil if we need to reuse this in the future PsiElement lastChild = imports.getChildren()[imports.getChildren().length-1]; if(lastDefine != null) { lastChild = lastDefine; } PsiElement element = imports.addAfter(JSChangeUtil.createExpressionFromText(imports.getProject(), String.format("%s", module)).getPsi(), lastChild); imports.getNode().addLeaf(JSTokenTypes.COMMA, ",", element.getNode()); imports.getNode().addLeaf(JSTokenTypes.WHITE_SPACE, "\n", element.getNode()); PsiElement lastParameterChild = parameters.getChildren()[parameters.getChildren().length-1]; if(lastParameter != null) { lastParameterChild = lastParameter; } PsiElement parameterElement = parameters.addAfter(JSChangeUtil.createExpressionFromText(imports.getProject(), String.format("%s", parameter)).getPsi(), lastParameterChild); parameters.getNode().addLeaf(JSTokenTypes.COMMA, ",", parameterElement.getNode()); return element; } private void moveElementToEnd(PsiElement define, PsiElement parameter, PsiElement lastDefine, PsiElement lastParameter, DefineStatement defineStatement) { if(lastDefine.equals(define)) { return; } PsiElement ignoreComment = AMDPsiUtil.getIgnoreCommentAfterLiteral(define); PsiElement newElement = moveImportToEnd(defineStatement.getArguments(), defineStatement.getFunction().getParameterList(), define.getText(), parameter.getText(), lastDefine, lastParameter); if(ignoreComment != null) { defineStatement.getArguments().addAfter(ignoreComment, newElement); } AMDPsiUtil.removeSingleImport(new AMDImport((JSElement) define, (JSElement)parameter)); } }