From 55914a27afa034cda89d56a9a357b8b492c03ff8 Mon Sep 17 00:00:00 2001
From: peter <peter@jetbrains.com>
Date: Tue, 17 Apr 2018 15:46:24 +0200
Subject: [PATCH] support completion at the end of file with no dummy
 identifier (IDEA-188584)

---
 .../codeInsight/completion/CodeCompletionHandlerBase.java   | 6 ++----
 .../codeInsight/completion/CompletionAssertions.java        | 6 +-----
 .../completion/CompletionInitializationUtil.java            | 4 ++++
 3 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java
index b143784fae04..94563bfb211f 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java
@@ -249,14 +249,12 @@ public class CodeCompletionHandlerBase {
     if (indicator.blockingWaitForFinish(ourAutoInsertItemTimeout)) {
       try {
         indicator.getLookup().refreshUi(true, false);
+        completionFinished(indicator, hasModifiers);
       }
-      catch (Exception e) {
+      catch (Throwable e) {
         CompletionServiceImpl.setCompletionPhase(CompletionPhase.NoCompletion);
         LOG.error(e);
-        return;
       }
-
-      completionFinished(indicator, hasModifiers);
       return;
     }
 
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionAssertions.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionAssertions.java
index 1221ecd26389..daaaf2d5587f 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionAssertions.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionAssertions.java
@@ -120,7 +120,7 @@ class CompletionAssertions {
 
   static void assertHostInfo(PsiFile hostCopy, OffsetMap hostMap) {
     PsiUtilCore.ensureValid(hostCopy);
-    if (hostMap.getOffset(CompletionInitializationContext.START_OFFSET) >= hostCopy.getTextLength()) {
+    if (hostMap.getOffset(CompletionInitializationContext.START_OFFSET) > hostCopy.getTextLength()) {
       throw new AssertionError("startOffset outside the host file: " + hostMap.getOffset(CompletionInitializationContext.START_OFFSET) + "; " + hostCopy);
     }
   }
@@ -140,10 +140,6 @@ class CompletionAssertions {
                                                                    createAstAttachment(fileCopy, originalFile));
     }
 
-    if (fileCopy.findElementAt(offset) != insertedElement) {
-      throw new AssertionError("wrong offset");
-    }
-
     final TextRange range = insertedElement.getTextRange();
     CharSequence fileCopyText = fileCopy.getViewProvider().getContents();
     if ((range.getEndOffset() > fileCopyText.length()) ||
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionInitializationUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionInitializationUtil.java
index 275c88abaa4e..dfffb6e12b24 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionInitializationUtil.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionInitializationUtil.java
@@ -21,6 +21,7 @@ import com.intellij.psi.PsiFile;
 import com.intellij.psi.impl.PsiFileEx;
 import com.intellij.psi.impl.source.PsiFileImpl;
 import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
+import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.psi.util.PsiUtilBase;
 import com.intellij.reference.SoftReference;
 import org.jetbrains.annotations.NotNull;
@@ -156,6 +157,9 @@ public class CompletionInitializationUtil {
   @NotNull
   private static PsiElement findCompletionPositionLeaf(OffsetsInFile offsets, int offset, PsiFile originalFile) {
     PsiElement insertedElement = offsets.getFile().findElementAt(offset);
+    if (insertedElement == null && offsets.getFile().getTextLength() == 0) {
+      insertedElement = PsiTreeUtil.getDeepestLast(offsets.getFile());
+    }
     CompletionAssertions.assertCompletionPositionPsiConsistent(offsets, offset, originalFile, insertedElement);
     return insertedElement;
   }
-- 
GitLab