2 * Copyright 2000-2011 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 package com.intellij.refactoring.move.moveClassesOrPackages;
23 import com.intellij.codeInsight.ChangeContextUtil;
24 import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil;
25 import com.intellij.openapi.diagnostic.Logger;
26 import com.intellij.openapi.util.text.StringUtil;
27 import com.intellij.psi.*;
28 import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler;
29 import com.intellij.refactoring.util.MoveRenameUsageInfo;
30 import com.intellij.usageView.UsageInfo;
31 import com.intellij.util.IncorrectOperationException;
33 import java.util.ArrayList;
34 import java.util.Collections;
35 import java.util.List;
38 public class MoveJavaFileHandler extends MoveFileHandler {
39 private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.move.moveClassesOrPackages.MoveJavaFileHandler");
42 public boolean canProcessElement(PsiFile element) {
43 return element instanceof PsiJavaFile &&
44 !JspPsiUtil.isInJspFile(element) &&
45 !CollectHighlightsUtil.isOutsideSourceRoot(element) &&
46 !(element instanceof PsiCompiledElement);
50 public void prepareMovedFile(PsiFile file, PsiDirectory moveDestination, Map<PsiElement, PsiElement> oldToNewMap) {
51 final PsiJavaFile javaFile = (PsiJavaFile)file;
52 ChangeContextUtil.encodeContextInfo(javaFile, true);
53 for (PsiClass psiClass : javaFile.getClasses()) {
54 oldToNewMap.put(psiClass, MoveClassesOrPackagesUtil.doMoveClass(psiClass, moveDestination));
58 public List<UsageInfo> findUsages(PsiFile psiFile, PsiDirectory newParent, boolean searchInComments, boolean searchInNonJavaFiles) {
59 final List<UsageInfo> result = new ArrayList<UsageInfo>();
60 final PsiPackage newParentPackage = JavaDirectoryService.getInstance().getPackage(newParent);
61 final String qualifiedName = newParentPackage == null ? "" : newParentPackage.getQualifiedName();
62 for (PsiClass aClass : ((PsiJavaFile)psiFile).getClasses()) {
63 Collections.addAll(result, MoveClassesOrPackagesUtil.findUsages(aClass, searchInComments, searchInNonJavaFiles,
64 StringUtil.getQualifiedName(qualifiedName, aClass.getName())));
66 return result.isEmpty() ? null : result;
70 public void retargetUsages(List<UsageInfo> usageInfos, Map<PsiElement, PsiElement> oldToNewMap) {
71 for (UsageInfo usage : usageInfos) {
72 if (usage instanceof MoveRenameUsageInfo) {
73 final MoveRenameUsageInfo moveRenameUsage = (MoveRenameUsageInfo)usage;
74 final PsiElement oldElement = moveRenameUsage.getReferencedElement();
75 final PsiElement newElement = oldToNewMap.get(oldElement);
76 final PsiReference reference = moveRenameUsage.getReference();
77 if (reference != null) {
79 LOG.assertTrue(newElement != null, oldElement != null ? oldElement : reference);
80 reference.bindToElement(newElement);
81 } catch (IncorrectOperationException ex) {
90 public void updateMovedFile(PsiFile file) throws IncorrectOperationException {
91 ChangeContextUtil.decodeContextInfo(file, null, null);
92 final PsiDirectory containingDirectory = file.getContainingDirectory();
93 if (containingDirectory != null) {
94 final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(containingDirectory);
95 if (aPackage != null) {
96 final String qualifiedName = aPackage.getQualifiedName();
97 final PsiPackageStatement packageStatement = qualifiedName.length() > 0
98 ? JavaPsiFacade.getElementFactory(file.getProject()).createPackageStatement(qualifiedName)
100 if (file instanceof PsiJavaFile) {
101 final PsiPackageStatement filePackageStatement = ((PsiJavaFile)file).getPackageStatement();
102 if (filePackageStatement != null) {
103 if (packageStatement != null) {
104 filePackageStatement.getPackageReference().replace(packageStatement.getPackageReference());
106 filePackageStatement.delete();