From fdee76603c332bbcb65d10fa5b56fa444b9f9307 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 21 Feb 2014 14:44:06 +0100 Subject: [PATCH] IDEA-117332 Change signature refactoring should warn about @Contract conflict --- .../JavaChangeSignatureUsageProcessor.java | 16 ++++++++++++---- .../changeSignature/WarnAboutContract.java | 6 ++++++ .../refactoring/ChangeSignatureTest.java | 9 +++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/refactoring/changeSignature/WarnAboutContract.java diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java index e8bb45ce350d..83de0ed2f516 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java @@ -17,6 +17,7 @@ package com.intellij.refactoring.changeSignature; import com.intellij.codeInsight.ExceptionUtil; import com.intellij.codeInsight.daemon.impl.analysis.JavaHighlightUtil; +import com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer; import com.intellij.lang.StdLanguages; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; @@ -884,7 +885,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr private static class ConflictSearcher { private final JavaChangeInfo myChangeInfo; - private ConflictSearcher(JavaChangeInfo changeInfo) { + private ConflictSearcher(@NotNull JavaChangeInfo changeInfo) { this.myChangeInfo = changeInfo; } @@ -901,6 +902,8 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr LOG.error(e); } } + + checkContract(conflictDescriptions, myChangeInfo.getMethod()); for (UsageInfo usageInfo : usagesSet) { final PsiElement element = usageInfo.getElement(); @@ -914,6 +917,8 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr conflictDescriptions.putValue(baseMethod, "Implicit last parameter should not be deleted"); } } + + checkContract(conflictDescriptions, method); } else if (element instanceof PsiMethodReferenceExpression) { conflictDescriptions.putValue(element, "Changed method is used in method reference"); } @@ -922,6 +927,12 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr return conflictDescriptions; } + private static void checkContract(MultiMap conflictDescriptions, PsiMethod method) { + if (ControlFlowAnalyzer.findContractAnnotation(method) != null) { + conflictDescriptions.putValue(method, "@Contract annotation will have to be changed manually"); + } + } + private boolean needToChangeCalls() { return myChangeInfo.isNameChanged() || myChangeInfo.isParameterSetOrOrderChanged() || myChangeInfo.isExceptionSetOrOrderChanged(); } @@ -964,9 +975,6 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr private void addMethodConflicts(MultiMap conflicts) { String newMethodName = myChangeInfo.getNewName(); - if (!(myChangeInfo instanceof JavaChangeInfo)) { - return; - } try { PsiMethod prototype; final PsiMethod method = myChangeInfo.getMethod(); diff --git a/java/java-tests/testData/refactoring/changeSignature/WarnAboutContract.java b/java/java-tests/testData/refactoring/changeSignature/WarnAboutContract.java new file mode 100644 index 000000000000..f3f573e9bde2 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignature/WarnAboutContract.java @@ -0,0 +1,6 @@ +class A { + @org.jetbrains.annotations.Contract("null,_->fail") + public int method(Object i, Object j) { + return 0; + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java index e769c7a88c85..51905419d22c 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java @@ -42,6 +42,15 @@ public class ChangeSignatureTest extends LightRefactoringTestCase { doTest(null, new ParameterInfoImpl[]{new ParameterInfoImpl(1), new ParameterInfoImpl(0)}, false); } + public void testWarnAboutContract() throws Exception { + try { + doTest(null, new ParameterInfoImpl[]{new ParameterInfoImpl(1), new ParameterInfoImpl(0)}, false); + fail("Conflict expected"); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException ignored) { + } + } + public void testGenericTypes() throws Exception { doTest(null, null, "T", new GenParams() { @Override