package org.elixir_lang.refactoring.variable.rename;
import com.intellij.lang.Language;
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.psi.PsiNamedElement;
import com.intellij.refactoring.rename.inplace.VariableInplaceRenameHandler;
import com.intellij.refactoring.rename.inplace.VariableInplaceRenamer;
import org.elixir_lang.psi.call.Call;
import org.elixir_lang.reference.Callable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* A custom rename handler, so that {@link #createRenamer(PsiElement, Editor)} can be return {@link Inplace}, so
* {@link Inplace#isIdentifier(String, Language)} won't use {@link com.intellij.lang.refactoring.NamesValidator}, whose
* {@link com.intellij.lang.refactoring.NamesValidator#isIdentifier(String, Project)} can't be customized to the
* element.
*/
public class Handler extends VariableInplaceRenameHandler {
/*
* Static Methods
*/
static boolean isAvailable(PsiElement element) {
return element instanceof Call &&
Callable.isVariable((Call) element);
}
/*
* Instance Methods
*/
@Nullable
@Override
protected VariableInplaceRenamer createRenamer(@NotNull PsiElement elementToRename, Editor editor) {
return new Inplace((PsiNamedElement)elementToRename, editor);
}
@Override
protected boolean isAvailable(PsiElement element, Editor editor, PsiFile file) {
return editor.getSettings().isVariableInplaceRenameEnabled() && isAvailable(element);
}
}