package jetbrains.mps.idea.java.refactoring;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.diagnostic.Logger;
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.PsiMethod;
import com.intellij.psi.search.searches.OverridingMethodsSearch;
import com.intellij.refactoring.rename.RenameHandler;
import jetbrains.mps.baseLanguage.util.plugin.refactorings.MethodRefactoringUtils;
import jetbrains.mps.ide.actions.MPSCommonDataKeys;
import jetbrains.mps.ide.platform.refactoring.RefactoringAccessEx;
import jetbrains.mps.ide.platform.refactoring.RenameMethodDialog;
import jetbrains.mps.idea.core.psi.impl.MPSPsiProvider;
import jetbrains.mps.idea.core.refactoring.RenameRefactoringContributor;
import jetbrains.mps.progress.EmptyProgressMonitor;
import jetbrains.mps.project.MPSProject;
import jetbrains.mps.refactoring.framework.IRefactoring;
import jetbrains.mps.refactoring.framework.RefactoringContext;
import jetbrains.mps.refactoring.framework.RefactoringUtil;
import jetbrains.mps.util.Computable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.language.SConcept;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SNodeUtil;
import org.jetbrains.mps.openapi.module.ModelAccess;
import org.jetbrains.mps.openapi.module.SRepository;
import java.util.Arrays;
/**
* danilla 6/4/13
*/
public class MethodRenameContributor implements RenameRefactoringContributor {
private static final Logger LOG = Logger.getInstance("#jetbrains.mps.idea.core.refactoring.MethodRenameContributor");
@Override
public boolean isAvailableFor(SNode node) {
return node != null && isJavaMethod(node);
}
private boolean isJavaMethod(final SNode node) {
SConcept concept = node.getConcept();
return concept.isSubConceptOf(jetbrains.mps.smodel.SNodeUtil.concept_InstanceMethodDeclaration)
|| concept.isSubConceptOf(jetbrains.mps.smodel.SNodeUtil.concept_StaticMethodDeclaration)
|| concept.isSubConceptOf(jetbrains.mps.smodel.SNodeUtil.concept_ConstructorDeclaration);
}
@Override
public void invoke(@NotNull final Project project, @NotNull SNode node) {
MPSProject mpsProject = project.getComponent(MPSProject.class);
String oldName = node.getName();
final RenameMethodDialog d = new RenameMethodDialog(project, oldName);
d.show();
final String newName = d.getName();
if (newName == null) {
return;
}
if (!SNodeUtil.isAccessible(node, mpsProject.getRepository())) {
return;
}
IRefactoring psiAwareRefactoring = new PsiMethodRenameRefactoringWrapper();
RefactoringAccessEx.getInstance().getRefactoringFacade().execute(RefactoringContext.createRefactoringContext(
psiAwareRefactoring,
Arrays.asList("newName", "refactorOverriding"),
Arrays.asList(newName),
node,
mpsProject));
}
}