package com.haskforce.features.intentions; import com.haskforce.highlighting.annotation.external.GhcMod.*; import com.haskforce.utils.FileUtil; import com.intellij.codeInsight.intention.impl.BaseIntentionAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiFile; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import java.util.regex.Pattern; public class RemoveForall extends BaseIntentionAction { public final Problem problem; public RemoveForall(Problem problem) { this.problem = problem; } @NotNull @Override public String getFamilyName() { return "Remove forall from type signature"; } @NotNull @Override public String getText() { return "Remove forall from type signature"; } @Override public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { // TODO: Add a setting for this. return true; } @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { FileUtil.updateFileText(project, file, new Function<String, String>() { public String fun(String text) { final int offset = StringUtil.lineColToOffset(text, problem.startLine - 1, problem.startColumn - 1); // Doing offset + 1 to catch the dot '.' after the forall in the type signature. final String beginning = text.substring(0, offset + 1); final String ending = text.substring(offset + 1); final Pattern pattern = Pattern.compile("::\\s?forall\\s[^\\.]+\\.\\s*$"); final String newBeginning = pattern.matcher(beginning).replaceFirst("::"); return newBeginning + ending; } }); } }