ComponentWithBrowseButton - optional remove listener on hide
[fedora-idea.git] / java / java-impl / src / com / intellij / refactoring / migration / MigrationUtil.java
bloba77ad19d681853df8ebf9a90119ccf9a683c73a6
1 /*
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;
31 /**
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) {
47 try {
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);
57 else {
58 bindNonJavaReference(aPackage, element, usage);
62 catch (IncorrectOperationException e) {
63 // should not happen!
64 LOG.error(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);
75 break;
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) {
98 try {
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);
109 else {
110 bindNonJavaReference(aClass, element, usage);
114 catch (IncorrectOperationException e) {
115 // should not happen!
116 LOG.error(e);
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) {
123 return aPackage;
125 else {
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);
143 return aClass;