package com.eslint.fixes;

import com.intellij.lang.javascript.psi.JSElementFactory;
import com.intellij.lang.javascript.psi.JSExpressionCodeFragment;
import com.intellij.lang.javascript.psi.JSNewExpression;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
 * @author idok
 */
public abstract class NoNewBaseActionFix extends BaseActionFix {
    protected NoNewBaseActionFix(PsiElement element) {
        super(element);
    }

    protected abstract String getNewExp();

    @Override
    public void invoke(@NotNull Project project, @NotNull PsiFile psiFile, @Nullable("is null when called from inspection") Editor editor, @NotNull PsiElement element, @NotNull PsiElement end) throws IncorrectOperationException {
        PsiElement parent = element.getParent();
        if (!(parent instanceof JSNewExpression)) return;
        final JSExpressionCodeFragment useStrict = JSElementFactory.createExpressionCodeFragment(project, getNewExp(), parent);
        PsiElement child = useStrict.getFirstChild();
        parent.replace(child);
    }
}