From 2c5117ba22c13cec2910bfe6daea2891a8ac6b1d Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 30 May 2018 20:34:20 +0300 Subject: [PATCH] completion: presume fresh variables have always low bounds during completion IDEA-190041 --- .../resolve/CompletionParameterTypeInferencePolicy.java | 5 +++++ .../source/resolve/ParameterTypeInferencePolicy.java | 9 +++++++++ .../smartType/LowerBoundOfFreshVariable-out.java | 9 +++++++++ .../completion/smartType/LowerBoundOfFreshVariable.java | 9 +++++++++ .../completion/SmartType18CompletionTest.java | 5 +++++ 5 files changed, 37 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/LowerBoundOfFreshVariable-out.java create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/LowerBoundOfFreshVariable.java diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/CompletionParameterTypeInferencePolicy.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/CompletionParameterTypeInferencePolicy.java index 9100174f0f3f..429a949051ed 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/CompletionParameterTypeInferencePolicy.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/resolve/CompletionParameterTypeInferencePolicy.java @@ -66,4 +66,9 @@ public class CompletionParameterTypeInferencePolicy extends ProcessCandidatePara public boolean isVarargsIgnored() { return true; } + + @Override + public boolean inferLowerBoundForFreshVariables() { + return true; + } } diff --git a/java/java-psi-api/src/com/intellij/psi/impl/source/resolve/ParameterTypeInferencePolicy.java b/java/java-psi-api/src/com/intellij/psi/impl/source/resolve/ParameterTypeInferencePolicy.java index 9b9cfce7ab72..81a4b4de59db 100644 --- a/java/java-psi-api/src/com/intellij/psi/impl/source/resolve/ParameterTypeInferencePolicy.java +++ b/java/java-psi-api/src/com/intellij/psi/impl/source/resolve/ParameterTypeInferencePolicy.java @@ -42,4 +42,13 @@ public abstract class ParameterTypeInferencePolicy { public boolean isVarargsIgnored() { return false; } + + /** + * For infinite type declarations, like {@code Foo>}, inference introduces fake fresh "fixed" type parameters. + * These fresh parameters respect constraints, created during inference session. For completion, it makes sense to define lower bounds + * even if no appropriate constraints were detected, as probably the corresponding argument is currently completed. + */ + public boolean inferLowerBoundForFreshVariables() { + return false; + } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/LowerBoundOfFreshVariable-out.java b/java/java-tests/testData/codeInsight/completion/smartType/LowerBoundOfFreshVariable-out.java new file mode 100644 index 000000000000..8449cdd7c422 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/LowerBoundOfFreshVariable-out.java @@ -0,0 +1,9 @@ + +interface Foo> { + + static > void foo(F f) { + bar(f); + } + + static > void bar(B b) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/LowerBoundOfFreshVariable.java b/java/java-tests/testData/codeInsight/completion/smartType/LowerBoundOfFreshVariable.java new file mode 100644 index 000000000000..0adbc564775c --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/LowerBoundOfFreshVariable.java @@ -0,0 +1,9 @@ + +interface Foo> { + + static > void foo(F f) { + bar(); + } + + static > void bar(B b) { } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java index d8c9221ba182..f57975355de0 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java @@ -224,6 +224,11 @@ public void testConvertToObjectStream() { myFixture.complete(CompletionType.SMART, 1); checkResultByFile("/" + getTestName(false) + "-out.java"); } + public void testLowerBoundOfFreshVariable() { + configureByTestName(); + myFixture.complete(CompletionType.SMART, 1); + checkResultByFile("/" + getTestName(false) + "-out.java"); + } private void doTest() { doTest(true);