blob: 97597bb99e4debac9838e959c9834171cae2ab7b [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.refactoring.migration;
import com.intellij.history.LocalHistory;
import com.intellij.history.LocalHistoryAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMigration;
import com.intellij.psi.impl.migration.PsiMigrationManager;
import com.intellij.refactoring.BaseRefactoringProcessor;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.RefactoringHelper;
import com.intellij.usageView.UsageInfo;
import com.intellij.usageView.UsageViewDescriptor;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
/**
* @author ven
*/
class MigrationProcessor extends BaseRefactoringProcessor {
private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.migration.MigrationProcessor");
private final MigrationMap myMigrationMap;
private static final String REFACTORING_NAME = RefactoringBundle.message("migration.title");
private PsiMigration myPsiMigration;
public MigrationProcessor(Project project, MigrationMap migrationMap) {
super(project);
myMigrationMap = migrationMap;
myPsiMigration = startMigration(project);
}
@NotNull
protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) {
return new MigrationUsagesViewDescriptor(myMigrationMap, false);
}
private PsiMigration startMigration(Project project) {
final PsiMigration migration = PsiMigrationManager.getInstance(project).startMigration();
findOrCreateEntries(project, migration);
return migration;
}
private void findOrCreateEntries(Project project, final PsiMigration migration) {
for (int i = 0; i < myMigrationMap.getEntryCount(); i++) {
MigrationMapEntry entry = myMigrationMap.getEntryAt(i);
if (entry.getType() == MigrationMapEntry.PACKAGE) {
MigrationUtil.findOrCreatePackage(project, migration, entry.getOldName());
}
else {
MigrationUtil.findOrCreateClass(project, migration, entry.getOldName());
}
}
}
@Override
protected void refreshElements(PsiElement[] elements) {
myPsiMigration = startMigration(myProject);
}
@NotNull
protected UsageInfo[] findUsages() {
ArrayList<UsageInfo> usagesVector = new ArrayList<UsageInfo>();
try {
if (myMigrationMap == null) {
return UsageInfo.EMPTY_ARRAY;
}
for (int i = 0; i < myMigrationMap.getEntryCount(); i++) {
MigrationMapEntry entry = myMigrationMap.getEntryAt(i);
UsageInfo[] usages;
if (entry.getType() == MigrationMapEntry.PACKAGE) {
usages = MigrationUtil.findPackageUsages(myProject, myPsiMigration, entry.getOldName());
}
else {
usages = MigrationUtil.findClassUsages(myProject, myPsiMigration, entry.getOldName());
}
for (UsageInfo usage : usages) {
usagesVector.add(new MigrationUsageInfo(usage, entry));
}
}
}
finally {
myPsiMigration.finish();
myPsiMigration = null;
}
return usagesVector.toArray(new MigrationUsageInfo[usagesVector.size()]);
}
protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
if (refUsages.get().length == 0) {
Messages.showInfoMessage(myProject, RefactoringBundle.message("migration.no.usages.found.in.the.project"), REFACTORING_NAME);
return false;
}
setPreviewUsages(true);
return true;
}
protected void performRefactoring(UsageInfo[] usages) {
final PsiMigration psiMigration = PsiMigrationManager.getInstance(myProject).startMigration();
LocalHistoryAction a = LocalHistory.getInstance().startAction(getCommandName());
try {
for (int i = 0; i < myMigrationMap.getEntryCount(); i++) {
MigrationMapEntry entry = myMigrationMap.getEntryAt(i);
if (entry.getType() == MigrationMapEntry.PACKAGE) {
MigrationUtil.doPackageMigration(myProject, psiMigration, entry.getNewName(), usages);
}
if (entry.getType() == MigrationMapEntry.CLASS) {
MigrationUtil.doClassMigration(myProject, psiMigration, entry.getNewName(), usages);
}
}
for(RefactoringHelper helper: Extensions.getExtensions(RefactoringHelper.EP_NAME)) {
Object preparedData = helper.prepareOperation(usages);
//noinspection unchecked
helper.performOperation(myProject, preparedData);
}
}
finally {
a.finish();
psiMigration.finish();
}
}
protected String getCommandName() {
return REFACTORING_NAME;
}
public static class MigrationUsageInfo extends UsageInfo {
public MigrationMapEntry mapEntry;
public MigrationUsageInfo(UsageInfo info, MigrationMapEntry mapEntry) {
super(info.getElement(), info.getRangeInElement().getStartOffset(), info.getRangeInElement().getEndOffset());
this.mapEntry = mapEntry;
}
}
}