Merge branch 'master' of git.labs.intellij.net:idea/community

This commit is contained in:
Maxim Medvedev
2011-04-01 09:58:47 +04:00
69 changed files with 1380 additions and 821 deletions
@@ -84,7 +84,7 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase {
if (baseClass != null){
ArrayList<PsiMethod> array = new ArrayList<PsiMethod>();
for (PsiMethod method : baseClass.getConstructors()) {
if (JavaPsiFacade.getInstance(method.getProject()).getResolveHelper().isAccessible(method, aClass, aClass)) {
if (JavaPsiFacade.getInstance(method.getProject()).getResolveHelper().isAccessible(method, aClass, null)) {
array.add(method);
}
}
@@ -21,12 +21,18 @@ import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.util.MethodSignature;
import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class UnimplementInterfaceAction implements IntentionAction {
@@ -55,7 +61,10 @@ public class UnimplementInterfaceAction implements IntentionAction {
if (psiClass.getExtendsList() != referenceList && psiClass.getImplementsList() != referenceList) return false;
final PsiElement target = psiReference.resolve();
PsiJavaCodeReferenceElement referenceElement = getTopLevelRef(psiReference, referenceList);
if (referenceElement == null) return false;
final PsiElement target = referenceElement.resolve();
if (target == null || !(target instanceof PsiClass)) return false;
PsiClass targetClass = (PsiClass)target;
@@ -69,6 +78,18 @@ public class UnimplementInterfaceAction implements IntentionAction {
return true;
}
@Nullable
private static PsiJavaCodeReferenceElement getTopLevelRef(PsiReference psiReference, PsiReferenceList referenceList) {
PsiElement element = psiReference.getElement();
while (element.getParent() != referenceList) {
element = element.getParent();
if (element == null) return null;
}
if (!(element instanceof PsiJavaCodeReferenceElement)) return null;
return (PsiJavaCodeReferenceElement)element;
}
public void invoke(@NotNull final Project project, final Editor editor, final PsiFile file) throws IncorrectOperationException {
if (!CodeInsightUtilBase.preparePsiElementForWrite(file)) return;
@@ -83,12 +104,22 @@ public class UnimplementInterfaceAction implements IntentionAction {
if (psiClass.getExtendsList() != referenceList && psiClass.getImplementsList() != referenceList) return;
final PsiElement target = psiReference.resolve();
PsiJavaCodeReferenceElement element = getTopLevelRef(psiReference, referenceList);
if (element == null) return;
final PsiElement target = element.resolve();
if (target == null || !(target instanceof PsiClass)) return;
PsiClass targetClass = (PsiClass)target;
psiReference.getElement().delete();
final Map<PsiMethod, PsiMethod> implementations = new HashMap<PsiMethod, PsiMethod>();
for (PsiMethod psiMethod : targetClass.getAllMethods()) {
final PsiMethod implementingMethod = MethodSignatureUtil.findMethodBySuperMethod(psiClass, psiMethod, false);
if (implementingMethod != null) {
implementations.put(psiMethod, implementingMethod);
}
}
element.delete();
final Set<PsiMethod> superMethods = new HashSet<PsiMethod>();
for (PsiClass aClass : psiClass.getSupers()) {
@@ -97,10 +128,8 @@ public class UnimplementInterfaceAction implements IntentionAction {
final PsiMethod[] psiMethods = targetClass.getAllMethods();
for (PsiMethod psiMethod : psiMethods) {
if (superMethods.contains(psiMethod)) continue;
final PsiMethod[] implementingMethods = psiClass.findMethodsBySignature(psiMethod, false);
for (PsiMethod implementingMethod : implementingMethods) {
implementingMethod.delete();
}
final PsiMethod impl = implementations.get(psiMethod);
if (impl != null) impl.delete();
}
}
@@ -125,7 +125,7 @@ public class CopyClassesHandler implements CopyHandlerDelegate {
CopyClassDialog dialog = new CopyClassDialog(classes.values().iterator().next()[0], defaultTargetDirectory, project, false){
@Override
protected String getQualifiedName() {
if (commonPath != null) {
if (commonPath != null && !commonPath.isEmpty()) {
return StringUtil.getQualifiedName(super.getQualifiedName(), commonPath.replaceAll("/", "."));
}
return super.getQualifiedName();
@@ -34,6 +34,7 @@ import com.intellij.refactoring.JavaRefactoringSettings;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.move.MoveCallback;
import com.intellij.refactoring.move.MoveHandlerDelegate;
import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.refactoring.util.RadioUpDownListener;
import com.intellij.refactoring.util.RefactoringUtil;
@@ -131,8 +132,13 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate {
processor.run();
}
else {
final boolean containsJava = hasJavaFiles(directories[0]);
if (!containsJava) {
MoveFilesOrDirectoriesUtil.doMove(project, new PsiElement[] {directories[0]}, new PsiElement[]{targetContainer}, callback);
return;
}
final MoveClassesOrPackagesToNewDirectoryDialog dlg =
new MoveClassesOrPackagesToNewDirectoryDialog(directories[0], new PsiElement[2], false, callback) {
new MoveClassesOrPackagesToNewDirectoryDialog(directories[0], new PsiElement[0], false, callback) {
@Override
protected void performRefactoring(Project project,
final PsiDirectory targetDirectory,
@@ -161,6 +167,25 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate {
MoveClassesOrPackagesImpl.doMove(project, elements, targetContainer, callback);
}
public static boolean hasJavaFiles(PsiDirectory directory) {
final boolean [] containsJava = new boolean[]{false};
directory.accept(new JavaRecursiveElementWalkingVisitor() {
@Override
public void visitElement(PsiElement element) {
if (containsJava[0]) return;
if (element instanceof PsiFile || element instanceof PsiDirectory) {
super.visitElement(element);
}
}
@Override
public void visitJavaFile(PsiJavaFile file) {
containsJava[0] = true;
}
});
return containsJava[0];
}
@Override
public PsiElement adjustTargetForMove(DataContext dataContext, PsiElement targetContainer) {
if (targetContainer instanceof PsiPackage) {
@@ -24,6 +24,7 @@ import com.intellij.psi.impl.file.JavaDirectoryServiceImpl;
import com.intellij.psi.util.PsiUtilBase;
import com.intellij.refactoring.copy.JavaCopyFilesOrDirectoriesHandler;
import com.intellij.refactoring.move.MoveCallback;
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesHandlerBase;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException;
@@ -41,6 +42,7 @@ public class JavaMoveFilesOrDirectoriesHandler extends MoveFilesOrDirectoriesHan
for (PsiElement element : srcElements) {
if (element instanceof PsiDirectory) {
allJava &= JavaCopyFilesOrDirectoriesHandler.hasPackages((PsiDirectory)element);
allJava &= MoveClassesOrPackagesHandlerBase.hasJavaFiles((PsiDirectory)element);
}
else if (element instanceof PsiFile) {
allJava &= element instanceof PsiJavaFile && !JspPsiUtil.isInJspFile(element) &&