package com.intellij.javascript.flex.refactoring; import com.intellij.lang.LanguageNamesValidation; import com.intellij.lang.javascript.JavaScriptSupportLoader; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.impl.DirectoryIndex; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiManager; import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.move.moveClassesOrPackages.MoveDirectoryWithClassesProcessor; import com.intellij.refactoring.rename.DirectoryAsPackageRenameHandlerBase; import com.intellij.util.Query; /** * @author ksafonov */ public class FlexDirectoryAsPackageRenameHandler extends DirectoryAsPackageRenameHandlerBase<FlexPackageImpl> { @Override protected VirtualFile[] occursInPackagePrefixes(FlexPackageImpl aPackage) { return VirtualFile.EMPTY_ARRAY; } @Override protected boolean isIdentifier(String name, Project project) { return LanguageNamesValidation.INSTANCE.forLanguage(JavaScriptSupportLoader.ECMA_SCRIPT_L4).isIdentifier(name, project); } @Override protected String getQualifiedName(FlexPackageImpl aPackage) { return aPackage.getQualifiedName(); } @Override protected FlexPackageImpl getPackage(PsiDirectory psiDirectory) { Project project = psiDirectory.getProject(); DirectoryIndex index = DirectoryIndex.getInstance(project); String packageName = index.getPackageName(psiDirectory.getVirtualFile()); if (packageName == null) return null; Query<VirtualFile> dirs = index.getDirectoriesByPackageName(packageName, false); if (dirs.findFirst() == null) return null; return new FlexPackageImpl(PsiManager.getInstance(project), packageName); } @Override protected BaseRefactoringProcessor createProcessor(final String newQName, Project project, final PsiDirectory[] dirsToRename, boolean searchInComments, boolean searchInNonJavaFiles) { return new MoveDirectoryWithClassesProcessor(project, dirsToRename, null, searchInComments, searchInNonJavaFiles, false, null) { @Override public TargetDirectoryWrapper getTargetDirectory(final PsiDirectory dir) { return new TargetDirectoryWrapper(dir.getParentDirectory(), StringUtil.getShortName(newQName)); } @Override protected String getTargetName() { return newQName; } @Override protected String getCommandName() { return RefactoringBundle.message(dirsToRename.length == 1 ? "rename.directory.command.name" : "rename.directories.command.name"); } }; } }