From f0a876431afa1c944cbe58c652990f3d7753322c Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 28 Nov 2014 15:19:55 +0100 Subject: [PATCH] show setting with generate annotations right on extract method dialog --- .../dataFlow/DataFlowInspectionBase.java | 15 ------------- .../extractMethod/ExtractMethodDialog.java | 15 ++++++++++++- .../extractMethod/ExtractMethodProcessor.java | 21 ++++++++++++++----- .../CastWhenDuplicateReplacement_after.java | 3 +++ ...arargsShouldNotChangeReturnType_after.java | 3 +++ .../CodeDuplicatesWithOutputValue1_after.java | 3 +++ .../CodeDuplicatesWithOutputValue_after.java | 3 +++ .../CodeDuplicatesWithReturn2_after.java | 3 +++ .../CodeDuplicatesWithReturn_after.java | 3 +++ .../ExpressionDuplicates_after.java | 3 +++ .../ExtractFromTryFinally_after.java | 3 +++ .../FromLambdaBodyWithReturn_after.java | 3 +++ .../NullableCheckDontMissFinal_after.java | 3 +++ .../extractMethod/ReturnFromTry_after.java | 3 +++ .../extractMethod/SCR15815_after.java | 3 +++ .../extractMethod/ThisCall_after.java | 3 +++ ...arDeclAfterExpressionExtraction_after.java | 3 +++ .../util/resources/misc/registry.properties | 5 +---- 18 files changed, 73 insertions(+), 25 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java index 75927fc9b872..c5f7de6925c4 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java @@ -134,21 +134,6 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool { }; analyzeDfaWithNestedClosures(scope, holder, dfaRunner, Arrays.asList(dfaRunner.createMemoryState()), onTheFly); } - - @Nullable - public static Collection getNullableReturn(PsiMethod method) { - final StandardDataFlowRunner dfaRunner = new StandardDataFlowRunner(); - final DataFlowInstructionVisitor visitor = new DataFlowInstructionVisitor(dfaRunner); - final PsiCodeBlock body = method.getBody(); - if (body == null) { - return null; - } - final RunnerResult rc = dfaRunner.analyzeMethod(body, visitor); - if (rc == RunnerResult.OK) { - return visitor.getProblems(NullabilityProblem.nullableReturn); - } - return null; - } private void analyzeDfaWithNestedClosures(PsiElement scope, ProblemsHolder holder, diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java index 7283acaecafb..70fab8c5c78b 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java @@ -61,7 +61,8 @@ import java.awt.event.*; */ @SuppressWarnings("MethodMayBeStatic") public class ExtractMethodDialog extends DialogWrapper implements AbstractExtractDialog { - public static final String EXTRACT_METHOD_DEFAULT_VISIBILITY = "extract.method.default.visibility"; + private static final String EXTRACT_METHOD_DEFAULT_VISIBILITY = "extract.method.default.visibility"; + public static final String EXTRACT_METHOD_GENERATE_ANNOTATIONS = "extractMethod.generateAnnotations"; private final Project myProject; private final PsiType myReturnType; private final PsiTypeParameterList myTypeParameterList; @@ -75,6 +76,7 @@ public class ExtractMethodDialog extends DialogWrapper implements AbstractExtrac private final MethodSignatureComponent mySignature; private final JCheckBox myMakeStatic; protected JCheckBox myMakeVarargs; + protected JCheckBox myGenerateAnnotations; private JCheckBox myCbChainedConstructor; private final InputVariables myVariableData; @@ -196,6 +198,10 @@ public class ExtractMethodDialog extends DialogWrapper implements AbstractExtrac if (containingMethod != null && containingMethod.hasModifierProperty(PsiModifier.PUBLIC)) { PropertiesComponent.getInstance(myProject).setValue(EXTRACT_METHOD_DEFAULT_VISIBILITY, getVisibility()); } + + if (myGenerateAnnotations != null) { + PropertiesComponent.getInstance(myProject).setValue(EXTRACT_METHOD_GENERATE_ANNOTATIONS, String.valueOf(myGenerateAnnotations.isSelected())); + } super.doOKAction(); } @@ -287,6 +293,13 @@ public class ExtractMethodDialog extends DialogWrapper implements AbstractExtrac optionsPanel.add(myMakeVarargs); } + if (!(myReturnType instanceof PsiPrimitiveType) && PsiUtil.isLanguageLevel5OrHigher(myTargetClass)) { + final boolean isSelected = PropertiesComponent.getInstance(myProject).getBoolean(EXTRACT_METHOD_GENERATE_ANNOTATIONS, true); + myGenerateAnnotations = new JCheckBox("Generate annotations", isSelected); + //todo update signature?! + optionsPanel.add(myGenerateAnnotations); + } + if (myCbChainedConstructor != null) { optionsPanel.add(myCbChainedConstructor); myCbChainedConstructor.setBorder(emptyBorder); diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index 50b028158593..369bb26c99d7 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -31,6 +31,7 @@ import com.intellij.codeInspection.dataFlow.*; import com.intellij.codeInspection.dataFlow.instructions.BranchingInstruction; import com.intellij.codeInspection.dataFlow.instructions.Instruction; import com.intellij.ide.DataManager; +import com.intellij.ide.util.PropertiesComponent; import com.intellij.ide.util.PsiClassListCellRenderer; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; @@ -867,15 +868,25 @@ public class ExtractMethodProcessor implements MatchProvider { } } - if (isNullabilityCheckApplicable() && !(newMethod.getReturnType() instanceof PsiPrimitiveType) && - PsiUtil.isLanguageLevel5OrHigher(newMethod) && Registry.is("annotate.extracted.method.nullable.when.applicable", true)) { + if (isNullabilityCheckApplicable() && !(newMethod.getReturnType() instanceof PsiPrimitiveType) && PsiUtil.isLanguageLevel5OrHigher(newMethod) && + PropertiesComponent.getInstance(myProject).getBoolean(ExtractMethodDialog.EXTRACT_METHOD_GENERATE_ANNOTATIONS, true)) { final NullableNotNullManager manager = NullableNotNullManager.getInstance(myProject); final PsiClass nullableAnnotationClass = JavaPsiFacade.getInstance(myProject).findClass(manager.getDefaultNullable(), GlobalSearchScope.allScope(myProject)); if (nullableAnnotationClass != null) { - final Collection nullableReturn = DataFlowInspectionBase.getNullableReturn(newMethod); - if (nullableReturn != null && !nullableReturn.isEmpty()) { - final AddNullableNotNullAnnotationFix annotationFix = new AddNullableAnnotationFix(newMethod); + final Nullness nullness = DfaUtil.inferMethodNullity(newMethod); + AddNullableNotNullAnnotationFix annotationFix; + switch (nullness) { + case NOT_NULL: + annotationFix = new AddNotNullAnnotationFix(newMethod); + break; + case NULLABLE: + annotationFix = new AddNullableAnnotationFix(newMethod); + break; + default: + annotationFix = null; + } + if (annotationFix != null) { annotationFix.invoke(myProject, myTargetClass.getContainingFile(), newMethod, newMethod); } } diff --git a/java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement_after.java b/java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement_after.java index 106ec29fb405..dbe5a20546ce 100644 --- a/java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/CastWhenDuplicateReplacement_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + class Test { void foo(Object x) { @@ -5,6 +7,7 @@ class Test { if (x instanceof String) x = newMethod((String) x); } + @NotNull private String newMethod(String x) { return x.substring(1); } diff --git a/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesVarargsShouldNotChangeReturnType_after.java b/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesVarargsShouldNotChangeReturnType_after.java index 97652c778c1e..cabf2a5a0c1d 100644 --- a/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesVarargsShouldNotChangeReturnType_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesVarargsShouldNotChangeReturnType_after.java @@ -1,9 +1,12 @@ +import org.jetbrains.annotations.NotNull; + class Test { void foo() { bar(newMethod()); baz(newMethod()); } + @NotNull private String newMethod() { return String.valueOf(1); } diff --git a/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithOutputValue1_after.java b/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithOutputValue1_after.java index 81ebc6806331..6ac023628408 100644 --- a/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithOutputValue1_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithOutputValue1_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + import java.util.*; class C { @@ -11,6 +13,7 @@ class C { System.out.println("l1 = " + l1 + ", l2 = " + l2); } + @NotNull private List newMethod(Object[] array) { List l1 = null; l1 = new ArrayList(Arrays.asList(array)); diff --git a/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithOutputValue_after.java b/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithOutputValue_after.java index 9b0dca12e8ea..bd8e0b719009 100644 --- a/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithOutputValue_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithOutputValue_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + import java.util.*; class C { @@ -11,6 +13,7 @@ class C { System.out.println("l1 = " + l1 + ", l2 = " + l2); } + @NotNull private List newMethod(Object[] array) { return new ArrayList(Arrays.asList(array)); } diff --git a/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithReturn2_after.java b/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithReturn2_after.java index 7ccc2380d719..e6bc2850b072 100644 --- a/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithReturn2_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithReturn2_after.java @@ -1,9 +1,12 @@ +import org.jetbrains.annotations.NotNull; + class C { String method(Object o) { System.out.println(o); return newMethod(o); } + @NotNull private String newMethod(Object o) { Integer i = new Integer(o.hashCode()); return i.toString(); diff --git a/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithReturn_after.java b/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithReturn_after.java index 9901f3b87d6c..86c3e46763be 100644 --- a/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithReturn_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/CodeDuplicatesWithReturn_after.java @@ -1,9 +1,12 @@ +import org.jetbrains.annotations.NotNull; + class C { String method(Object o) { System.out.println(o); return newMethod(o); } + @NotNull private String newMethod(Object o) { Integer i = new Integer(o.hashCode()); return i.toString(); diff --git a/java/java-tests/testData/refactoring/extractMethod/ExpressionDuplicates_after.java b/java/java-tests/testData/refactoring/extractMethod/ExpressionDuplicates_after.java index a564ab13bded..83aa1d0b7f68 100644 --- a/java/java-tests/testData/refactoring/extractMethod/ExpressionDuplicates_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/ExpressionDuplicates_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + import java.util.*; class C { @@ -8,6 +10,7 @@ class C { List l1 = newMethod(new Object[0]); } + @NotNull private ArrayList newMethod(Object[] o) { return new ArrayList(Arrays.asList(o)); } diff --git a/java/java-tests/testData/refactoring/extractMethod/ExtractFromTryFinally_after.java b/java/java-tests/testData/refactoring/extractMethod/ExtractFromTryFinally_after.java index 52900ce6ee0d..fae271959f7d 100644 --- a/java/java-tests/testData/refactoring/extractMethod/ExtractFromTryFinally_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/ExtractFromTryFinally_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + public class S { { String s; @@ -8,6 +10,7 @@ public class S { System.out.print(s); } + @NotNull private String newMethod() { String s; s = ""; diff --git a/java/java-tests/testData/refactoring/extractMethod/FromLambdaBodyWithReturn_after.java b/java/java-tests/testData/refactoring/extractMethod/FromLambdaBodyWithReturn_after.java index 9b5d3d680a66..f3441791c8bd 100644 --- a/java/java-tests/testData/refactoring/extractMethod/FromLambdaBodyWithReturn_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/FromLambdaBodyWithReturn_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + class Test { interface I { String foo(); @@ -8,6 +10,7 @@ class Test { }; } + @NotNull private String newMethod() { return "42"; } diff --git a/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java b/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java index 217f9f4f955a..94013e366942 100644 --- a/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + class Test { void foo() { final String str = newMethod(); @@ -9,6 +11,7 @@ class Test { } } + @NotNull private String newMethod() { final String str = ""; if (str == "") { diff --git a/java/java-tests/testData/refactoring/extractMethod/ReturnFromTry_after.java b/java/java-tests/testData/refactoring/extractMethod/ReturnFromTry_after.java index 4621ab2ba5c8..ce3d365100e9 100644 --- a/java/java-tests/testData/refactoring/extractMethod/ReturnFromTry_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/ReturnFromTry_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + class A { public String method() { try { @@ -9,6 +11,7 @@ class A { return ""; } + @NotNull private String newMethod() { try { return ""; diff --git a/java/java-tests/testData/refactoring/extractMethod/SCR15815_after.java b/java/java-tests/testData/refactoring/extractMethod/SCR15815_after.java index 23a53de82e87..9d0877031ae0 100644 --- a/java/java-tests/testData/refactoring/extractMethod/SCR15815_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/SCR15815_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + public class Foo { static Foo f1 = new Foo(){ @@ -6,6 +8,7 @@ public class Foo { } }; + @NotNull private static String newMethod() { return "a" + "b"; } diff --git a/java/java-tests/testData/refactoring/extractMethod/ThisCall_after.java b/java/java-tests/testData/refactoring/extractMethod/ThisCall_after.java index e30db827fa05..5f954d13db6e 100644 --- a/java/java-tests/testData/refactoring/extractMethod/ThisCall_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/ThisCall_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + public class A { A(String s) { } @@ -6,6 +8,7 @@ public class A { this(newMethod()); } + @NotNull private static String newMethod() { return "a"; } diff --git a/java/java-tests/testData/refactoring/extractMethod/VarDeclAfterExpressionExtraction_after.java b/java/java-tests/testData/refactoring/extractMethod/VarDeclAfterExpressionExtraction_after.java index cb7aeffa679d..fdf2963c9797 100644 --- a/java/java-tests/testData/refactoring/extractMethod/VarDeclAfterExpressionExtraction_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/VarDeclAfterExpressionExtraction_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + class BasicLazyResolveTest { @@ -9,6 +11,7 @@ class BasicLazyResolveTest { } + @NotNull private Object newMethod() { return new Object() { diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index fa0d5c9a4253..bb4706fc1df6 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -497,7 +497,4 @@ editor.config.stop.at.project.root=true editor.config.stop.at.project.root.description=Stops searching for .editorconfig at project root (requires project reopening) JDK8042508.bug.fixed=false -JDK8042508.bug.fixed.description=Disable check for type variable until javac bug is fixed - -annotate.extracted.method.nullable.when.applicable=true -annotate.extracted.method.nullable.when.applicable.description=Enables @Nullable annotation on newly extracted method when applicable +JDK8042508.bug.fixed.description=Disable check for type variable until javac bug is fixed \ No newline at end of file