do not update moved inside directory .class file as java one
[idea/community.git] / java / java-impl / src / com / intellij / refactoring / move / moveClassesOrPackages / MoveJavaFileHandler.java
1 /*
2  * Copyright 2000-2011 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 /*
18  * User: anna
19  * Date: 05-Aug-2009
20  */
21 package com.intellij.refactoring.move.moveClassesOrPackages;
22
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;
32
33 import java.util.ArrayList;
34 import java.util.Collections;
35 import java.util.List;
36 import java.util.Map;
37
38 public class MoveJavaFileHandler extends MoveFileHandler {
39   private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.move.moveClassesOrPackages.MoveJavaFileHandler");
40
41   @Override
42   public boolean canProcessElement(PsiFile element) {
43     return element instanceof PsiJavaFile &&
44            !JspPsiUtil.isInJspFile(element) &&
45            !CollectHighlightsUtil.isOutsideSourceRoot(element) &&
46            !(element instanceof PsiCompiledElement);
47   }
48
49   @Override
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));
55     }
56   }
57
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())));
65     }
66     return result.isEmpty() ? null : result;
67   }
68
69   @Override
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) {
78           try {
79             LOG.assertTrue(newElement != null, oldElement != null ? oldElement : reference);
80             reference.bindToElement(newElement);
81           } catch (IncorrectOperationException ex) {
82             LOG.error(ex);
83           }
84         }
85       }
86     }
87   }
88
89   @Override
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)
99                                                      : null;
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());
105             } else {
106               filePackageStatement.delete();
107             }
108           }
109         }
110       }
111     }
112   }
113 }