package com.intellij.lang.javascript.refactoring; import com.intellij.lang.javascript.DialectDetector; import com.intellij.lang.javascript.JavaScriptSupportLoader; import com.intellij.lang.javascript.psi.JSFile; import com.intellij.lang.javascript.psi.JSFunction; import com.intellij.lang.javascript.psi.JSInheritedLanguagesHelper; import com.intellij.lang.javascript.psi.JSNamedElement; import com.intellij.lang.javascript.psi.ecmal4.JSClass; import com.intellij.lang.javascript.psi.ecmal4.JSPackageStatement; import com.intellij.lang.javascript.psi.ecmal4.JSQualifiedNamedElement; import com.intellij.lang.javascript.psi.ecmal4.XmlBackedJSClassFactory; import com.intellij.lang.javascript.psi.impl.JSFileImpl; import com.intellij.lang.javascript.psi.resolve.ActionScriptResolveUtil; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlFile; import org.jetbrains.annotations.NotNull; import java.util.Map; public class JSQualifiedElementRenameProcessor extends JSDefaultRenameProcessor { @Override public boolean canProcessElement(@NotNull PsiElement element) { VirtualFile vFile; return (element instanceof JSQualifiedNamedElement && DialectDetector.isActionScript(element) && (element.getParent() instanceof JSPackageStatement || element instanceof JSClass)) || ((element instanceof JSFile && DialectDetector.isActionScript(element)) || (element instanceof XmlFile && JavaScriptSupportLoader.isFlexMxmFile((PsiFile)element))) && (vFile = ((PsiFile)element).getVirtualFile()) != null && ProjectRootManager.getInstance(element.getProject()).getFileIndex().getSourceRootForFile(vFile) != null; } @Override public PsiElement substituteElementToRename(PsiElement element, Editor editor) { if (element instanceof JSFileImpl) { JSNamedElement mainDeclaredElement = ActionScriptResolveUtil.findMainDeclaredElement((JSFileImpl)element); if (mainDeclaredElement != null) return mainDeclaredElement; } else if (element instanceof XmlFile) { JSClass jsClass = XmlBackedJSClassFactory.getXmlBackedClass((XmlFile)element); if (jsClass != null) return jsClass; } return super.substituteElementToRename(element, editor); } @Override public void prepareRenaming(PsiElement element, String newName, Map<PsiElement, String> allRenames) { if (element instanceof JSClass) { JSFunction constructor = ((JSClass)element).getConstructor(); if (constructor != null) { allRenames.put(constructor, newName); } } if (element instanceof JSQualifiedNamedElement) { PsiFile containingFile = element.getContainingFile(); if ((!(containingFile instanceof JSFileImpl) || ActionScriptResolveUtil.findMainDeclaredElement((JSFileImpl)containingFile) == element) && JSInheritedLanguagesHelper.shouldRenameFileWithClass(element)) { allRenames.put(containingFile, newName + "." + containingFile.getVirtualFile().getExtension()); } } } }