From da0a512e9d4a263aec447c78247362cb20980cf4 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 1 Aug 2018 04:31:43 +0700 Subject: [PATCH] IDEA-195808 Odd warning when change parameter order of method with @Contract --- .../changeSignature/ContractConverter.java | 10 ++++++++-- .../JavaChangeSignatureUsageProcessor.java | 11 ++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/ContractConverter.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/ContractConverter.java index 429371e5d43b..7e605d256b90 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/ContractConverter.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/ContractConverter.java @@ -36,7 +36,7 @@ public final class ContractConverter { throw new ContractConversionException("automatic update of external annotation is not supported"); } if (annotation.getOwner() != method.getModifierList()) { - throw new ContractConversionException("annotation is inherited from base method"); + throw new ContractInheritedException(); } if (annotation.findDeclaredAttributeValue(MutationSignature.ATTR_MUTATES) != null) { throw new ContractConversionException("it contains mutation contract"); @@ -107,9 +107,15 @@ public final class ContractConverter { return oldToNewIndex; } - public static final class ContractConversionException extends Exception { + public static class ContractConversionException extends Exception { ContractConversionException(String message) { super(message); } } + + public static class ContractInheritedException extends ContractConversionException { + ContractInheritedException() { + super("annotation is inherited from base method"); + } + } } 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 96dfccce1449..4b66f478f258 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java @@ -1046,7 +1046,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr if (checkUnusedParameter) { checkParametersToDelete(myChangeInfo.getMethod(), toRemove, conflictDescriptions); } - checkContract(conflictDescriptions, myChangeInfo.getMethod()); + checkContract(conflictDescriptions, myChangeInfo.getMethod(), false); for (UsageInfo usageInfo : usagesSet) { final PsiElement element = usageInfo.getElement(); @@ -1066,7 +1066,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr } } - checkContract(conflictDescriptions, method); + checkContract(conflictDescriptions, method, true); } else if (element instanceof PsiMethodReferenceExpression && MethodReferenceUsageInfo.needToExpand(myChangeInfo)) { conflictDescriptions.putValue(element, RefactoringBundle.message("expand.method.reference.warning")); @@ -1105,10 +1105,15 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr } } - private void checkContract(MultiMap conflictDescriptions, PsiMethod method) { + private void checkContract(MultiMap conflictDescriptions, PsiMethod method, boolean override) { try { ContractConverter.convertContract(method, myChangeInfo); } + catch (ContractConverter.ContractInheritedException e) { + if (!override) { + conflictDescriptions.putValue(method, "@Contract annotation cannot be updated automatically: " + e.getMessage()); + } + } catch (ContractConverter.ContractConversionException e) { conflictDescriptions.putValue(method, "@Contract annotation cannot be updated automatically: " + e.getMessage()); }