package com.chrisfolger.needsmoredojo.intellij.inspections; import com.chrisfolger.needsmoredojo.core.amd.naming.NameException; import com.chrisfolger.needsmoredojo.core.amd.naming.NameResolver; import com.chrisfolger.needsmoredojo.core.settings.DojoSettings; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.refactoring.RefactoringFactory; import com.intellij.refactoring.RenameRefactoring; import org.jetbrains.annotations.NotNull; import java.util.LinkedHashMap; import java.util.List; /** * this quickfix is designed to make a parameter match its corresponding define literal. * * It's hard to do the reverse though because there usually the define literal corresponds to a file, * but the parameter doesn't. So for example dojo/dom-construct -> domConstruct, it's not easy to say domConstruct * corresponds to dom-construct. */ public class MismatchedImportsQuickFix implements LocalQuickFix { private PsiElement define; private PsiElement parameter; private List<NameException> amdImportNamingExceptions = null; private String newParameterName = ""; public MismatchedImportsQuickFix(PsiElement define, PsiElement parameter, String absolutePath) { this.define = define; this.parameter = parameter; amdImportNamingExceptions = ServiceManager.getService(define.getProject(), DojoSettings.class).getNamingExceptionList(); this.newParameterName = NameResolver.defineToParameter(define.getText(), amdImportNamingExceptions); if(parameter != null && absolutePath != null) { this.newParameterName = NameResolver.defineToParameter(define.getText(), amdImportNamingExceptions, true, absolutePath); } } @NotNull @Override public String getName() { return "Change parameter \"" + parameter.getText() + "\" to \"" + this.newParameterName + "\" to match define literal"; } @NotNull @Override public String getFamilyName() { return "Needs More Dojo"; } @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor problemDescriptor) { final RenameRefactoring refactoring = RefactoringFactory.getInstance(project) .createRename(parameter, this.newParameterName, false, false); CommandProcessor.getInstance().executeCommand(project, new Runnable() { @Override public void run() { ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { refactoring.run(); } }); } }, "Rename parameter to match define", "Rename parameter to match define"); } }