package com.eslint.fixes;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.lang.javascript.psi.JSElement;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
/**
* @author idok
*/
public class SuppressLineActionFix implements IntentionAction {
private static final Logger LOG = Logger.getInstance(SuppressLineActionFix.class);
private final PsiElement element;
private final String rule;
public SuppressLineActionFix(String rule, PsiElement element) {
this.element = element;
this.rule = rule;
}
@NotNull
@Override
public String getText() {
//noinspection DialogTitleCapitalization
return "Suppress ESLint rule line";
}
@NotNull
@Override
public String getFamilyName() {
return "ESLint";
}
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
return true;
}
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
// final PsiFile file = element.getContainingFile();
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
// InspectionManager inspectionManager = InspectionManager.getInstance(project);
// ProblemDescriptor descriptor = inspectionManager.createProblemDescriptor(element, element, "", ProblemHighlightType.GENERIC_ERROR_OR_WARNING, false);
final JSElement property = PsiTreeUtil.getParentOfType(element, JSElement.class);
LOG.assertTrue(property != null);
final int start = property.getTextRange().getStartOffset();
@NonNls final Document doc = PsiDocumentManager.getInstance(project).getDocument(file);
LOG.assertTrue(doc != null);
final int line = doc.getLineNumber(start);
final int lineEnd = doc.getLineEndOffset(line);
doc.insertString(lineEnd, " //eslint-disable-line " + rule);
DaemonCodeAnalyzer.getInstance(project).restart(file);
}
@Override
public boolean startInWriteAction() {
return true;
}
}