From 5fe4a9b6912fd75f9f3ab718fef33a4872cb85f5 Mon Sep 17 00:00:00 2001
From: Tagir Valeev <Tagir.Valeev@jetbrains.com>
Date: Thu, 5 Apr 2018 11:46:42 +0700
Subject: [PATCH] GuessManagerImpl: box values on fast-path; disable DFA on
 primitive types at all

Fixes IDEA-189340 Does not show Number methods during auto completion
---
 .../intellij/codeInsight/guess/impl/GuessManagerImpl.java   | 6 ++++++
 .../completion/normal/AssignmentPrimitiveLiteral.java       | 6 ++++++
 .../completion/normal/AssignmentPrimitiveLiteral_after.java | 6 ++++++
 .../codeInsight/completion/NormalCompletionDfaTest.groovy   | 1 +
 4 files changed, 19 insertions(+)
 create mode 100644 java/java-tests/testData/codeInsight/completion/normal/AssignmentPrimitiveLiteral.java
 create mode 100644 java/java-tests/testData/codeInsight/completion/normal/AssignmentPrimitiveLiteral_after.java

diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/guess/impl/GuessManagerImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/guess/impl/GuessManagerImpl.java
index ae1959c9cb6f..ad3f24e8adb9 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/guess/impl/GuessManagerImpl.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/guess/impl/GuessManagerImpl.java
@@ -340,6 +340,9 @@ public class GuessManagerImpl extends GuessManager {
   @NotNull
   @Override
   public List<PsiType> getControlFlowExpressionTypeConjuncts(@NotNull PsiExpression expr) {
+    if (expr.getType() instanceof PsiPrimitiveType) {
+      return Collections.emptyList();
+    }
     List<PsiType> result = null;
     PsiExpression place = PsiUtil.skipParenthesizedExprDown(expr);
     if (place == null) return Collections.emptyList();
@@ -413,6 +416,9 @@ public class GuessManagerImpl extends GuessManager {
     private void handleAssignment(@Nullable PsiExpression expression) {
       if (expression == null) return;
       PsiType type = expression.getType();
+      if (type instanceof PsiPrimitiveType) {
+        type = ((PsiPrimitiveType)type).getBoxedType(expression);
+      }
       PsiType rawType = type instanceof PsiClassType ? ((PsiClassType)type).rawType() : type;
       if (rawType == null || rawType.equals(PsiType.NULL)) return;
       if (mySpecificType == null) {
diff --git a/java/java-tests/testData/codeInsight/completion/normal/AssignmentPrimitiveLiteral.java b/java/java-tests/testData/codeInsight/completion/normal/AssignmentPrimitiveLiteral.java
new file mode 100644
index 000000000000..44fed7a10349
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/AssignmentPrimitiveLiteral.java
@@ -0,0 +1,6 @@
+class Foo {
+    void test() {
+        Number x = 10;
+        return x.lon<caret>
+    }
+}
diff --git a/java/java-tests/testData/codeInsight/completion/normal/AssignmentPrimitiveLiteral_after.java b/java/java-tests/testData/codeInsight/completion/normal/AssignmentPrimitiveLiteral_after.java
new file mode 100644
index 000000000000..d5685ad20c74
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/AssignmentPrimitiveLiteral_after.java
@@ -0,0 +1,6 @@
+class Foo {
+    void test() {
+        Number x = 10;
+        return x.longValue()
+    }
+}
diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionDfaTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionDfaTest.groovy
index 5fe82b6a5939..a676336654c9 100644
--- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionDfaTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionDfaTest.groovy
@@ -47,6 +47,7 @@ class NormalCompletionDfaTest extends NormalCompletionTestCase {
   void testAssignmentTwicePreciseTypeDfa() { doTest() }
   void testAssignmentParameterDfa() { doTest() }
   void testAssignmentNoPreciseTypeDfa() { doTest() }
+  void testAssignmentPrimitiveLiteral() { doTest() }
   void testDeclarationPreciseTypeDfa() { doTest() }
   void testInstanceOfAssignmentDfa() { doTest() }
   void testStreamDfa() { doTest() }
-- 
GitLab