2 * Copyright 2000-2009 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.
16 package com
.intellij
.refactoring
.migration
;
18 import com
.intellij
.openapi
.application
.ApplicationManager
;
19 import com
.intellij
.openapi
.diagnostic
.Logger
;
20 import com
.intellij
.openapi
.util
.Computable
;
21 import com
.intellij
.openapi
.util
.TextRange
;
22 import com
.intellij
.psi
.*;
23 import com
.intellij
.psi
.impl
.source
.resolve
.reference
.impl
.providers
.JavaClassReference
;
24 import com
.intellij
.psi
.search
.GlobalSearchScope
;
25 import com
.intellij
.psi
.search
.searches
.ReferencesSearch
;
26 import com
.intellij
.usageView
.UsageInfo
;
27 import com
.intellij
.util
.IncorrectOperationException
;
29 import java
.util
.ArrayList
;
34 public class MigrationUtil
{
35 private static final Logger LOG
= Logger
.getInstance("#com.intellij.refactoring.migration.MigrationUtil");
37 private MigrationUtil() {
40 public static UsageInfo
[] findPackageUsages(PsiManager manager
, PsiMigration migration
, String qName
) {
41 PsiPackage aPackage
= findOrCreatePackage(manager
, migration
, qName
);
43 return findRefs(manager
, aPackage
);
46 public static void doPackageMigration(PsiManager manager
, PsiMigration migration
, String newQName
, UsageInfo
[] usages
) {
48 PsiPackage aPackage
= findOrCreatePackage(manager
, migration
, newQName
);
50 // rename all references
51 for (UsageInfo usage
: usages
) {
52 PsiElement element
= usage
.getElement();
53 if (element
== null || !element
.isValid()) continue;
54 if (element
instanceof PsiJavaCodeReferenceElement
) {
55 ((PsiJavaCodeReferenceElement
)element
).bindToElement(aPackage
);
58 bindNonJavaReference(aPackage
, element
, usage
);
62 catch (IncorrectOperationException e
) {
68 private static void bindNonJavaReference(PsiElement bindTo
, PsiElement element
, UsageInfo usage
) {
69 final TextRange range
= usage
.getRange();
70 for (PsiReference reference
: element
.getReferences()) {
71 if (reference
instanceof JavaClassReference
) {
72 final JavaClassReference classReference
= (JavaClassReference
)reference
;
73 if (classReference
.getRangeInElement().equals(range
)) {
74 classReference
.bindToElement(bindTo
);
81 public static UsageInfo
[] findClassUsages(PsiManager manager
, PsiMigration migration
, String qName
) {
82 PsiClass aClass
= findOrCreateClass(manager
, migration
, qName
);
84 return findRefs(manager
, aClass
);
87 private static UsageInfo
[] findRefs(final PsiManager manager
, final PsiElement aClass
) {
88 final ArrayList
<UsageInfo
> results
= new ArrayList
<UsageInfo
>();
89 GlobalSearchScope projectScope
= GlobalSearchScope
.projectScope(manager
.getProject());
90 for (PsiReference usage
: ReferencesSearch
.search(aClass
, projectScope
, false)) {
91 results
.add(new UsageInfo(usage
));
94 return results
.toArray(new UsageInfo
[results
.size()]);
97 public static void doClassMigration(PsiManager manager
, PsiMigration migration
, String newQName
, UsageInfo
[] usages
) {
99 PsiClass aClass
= findOrCreateClass(manager
, migration
, newQName
);
101 // rename all references
102 for (UsageInfo usage
: usages
) {
103 PsiElement element
= usage
.getElement();
104 if (element
== null || !element
.isValid()) continue;
105 if (element
instanceof PsiJavaCodeReferenceElement
) {
106 final PsiJavaCodeReferenceElement referenceElement
= (PsiJavaCodeReferenceElement
)element
;
107 referenceElement
.bindToElement(aClass
);
110 bindNonJavaReference(aClass
, element
, usage
);
114 catch (IncorrectOperationException e
) {
115 // should not happen!
120 static PsiPackage
findOrCreatePackage(PsiManager manager
, final PsiMigration migration
, final String qName
) {
121 PsiPackage aPackage
= JavaPsiFacade
.getInstance(manager
.getProject()).findPackage(qName
);
122 if (aPackage
!= null) {
126 return ApplicationManager
.getApplication().runWriteAction(new Computable
<PsiPackage
>() {
127 public PsiPackage
compute() {
128 return migration
.createPackage(qName
);
134 static PsiClass
findOrCreateClass(PsiManager manager
, final PsiMigration migration
, final String qName
) {
135 PsiClass aClass
= JavaPsiFacade
.getInstance(manager
.getProject()).findClass(qName
, GlobalSearchScope
.allScope(manager
.getProject()));
136 if (aClass
== null) {
137 aClass
= ApplicationManager
.getApplication().runWriteAction(new Computable
<PsiClass
>() {
138 public PsiClass
compute() {
139 return migration
.createClass(qName
);