package com.intellij.javascript.flex;
import com.intellij.lang.javascript.DialectDetector;
import com.intellij.lang.javascript.DialectDetector;
import com.intellij.lang.javascript.findUsages.SuperMethodUtil;
import com.intellij.lang.javascript.psi.JSFile;
import com.intellij.lang.javascript.psi.JSFunction;
import com.intellij.lang.javascript.psi.resolve.JSInheritanceUtil;
import com.intellij.lang.javascript.refactoring.RenameMoveUtils;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.SearchScope;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.listeners.RefactoringElementListener;
import com.intellij.refactoring.rename.RenamePsiElementProcessor;
import com.intellij.usageView.UsageInfo;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
/**
* @author Maxim.Mossienko
* Date: Sep 18, 2008
* Time: 3:03:37 PM
*/
public class FlexRenameHandler extends RenamePsiElementProcessor {
public boolean canProcessElement(@NotNull final PsiElement element) {
return (element instanceof JSFunction || element instanceof JSFile) &&
DialectDetector.isActionScript(element.getContainingFile());
}
@Override
public void renameElement(final PsiElement element,
final String newName,
final UsageInfo[] usages, @Nullable RefactoringElementListener listener) throws IncorrectOperationException {
super.renameElement(element, newName, usages, listener);
if (element instanceof JSFile) {
// rename invalidates file, so we need to get actual one
PsiFile file = element.getManager().findFile(element.getContainingFile().getVirtualFile());
if (file instanceof JSFile) RenameMoveUtils.updateFileWithChangedName((JSFile)file);
}
}
@Override
public PsiElement substituteElementToRename(final PsiElement element, final Editor editor) {
if (element instanceof JSFunction) {
return SuperMethodUtil.checkSuperMethod((JSFunction)element, RefactoringBundle.message("rename.title"),
RefactoringBundle.message("to.rename"));
}
return super.substituteElementToRename(element, editor);
}
@Override
public void prepareRenaming(final PsiElement element,
final String newName,
final Map<PsiElement, String> allRenames,
final SearchScope scope) {
if (!(element instanceof JSFunction)) {
return;
}
JSInheritanceUtil.iterateMethodsDown((JSFunction)element, new Processor<JSFunction>() {
// synchronized to protect the map
@Override
public synchronized boolean process(final JSFunction jsFunction) {
allRenames.put(jsFunction, newName);
return true;
}
}, true); // check override modifier to keep consistency with current logic
}
}