From be0e78b11afbc0d64e07fef867115658a0028b6d Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 23 Jul 2014 19:01:46 +0200 Subject: [PATCH] Fixed one more case of no-auto-insertion after "as" --- .../completion/JetCompletionContributor.java | 22 ++++++++++++++----- .../handlers/smart/AutoCompleteAfterAs3.kt | 4 ++++ .../smart/AutoCompleteAfterAs3.kt.after | 4 ++++ .../SmartCompletionHandlerTestGenerated.java | 5 +++++ 4 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 idea/testData/completion/handlers/smart/AutoCompleteAfterAs3.kt create mode 100644 idea/testData/completion/handlers/smart/AutoCompleteAfterAs3.kt.after diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java index 510d438603b..1f843a4d9f5 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.plugin.completion; import com.intellij.codeInsight.completion.*; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.patterns.PlatformPatterns; import com.intellij.psi.PsiElement; @@ -122,7 +123,9 @@ public class JetCompletionContributor extends CompletionContributor { // this code will make replacement offset "modified" and prevents altering it by the code in CompletionProgressIndicator context.setReplacementOffset(context.getReplacementOffset()); - if (context.getCompletionType() == CompletionType.SMART) { + if (context.getCompletionType() == CompletionType.SMART + && !isAtEndOfLine(offset, context.getEditor().getDocument()) /* do not use parent expression if we are at the end of line - it's probably parsed incorrectly */) { + PsiElement tokenAt = context.getFile().findElementAt(Math.max(0, offset)); if (tokenAt != null) { PsiElement parent = tokenAt.getParent(); @@ -136,11 +139,6 @@ public class JetCompletionContributor extends CompletionContributor { } int expressionEnd = expression.getTextRange().getEndOffset(); - String text = context.getFile().getText(); - while (expressionEnd > 0 && Character.isWhitespace(text.charAt(expressionEnd - 1))) { - expressionEnd--; - } - int suggestedReplacementOffset; if (expression instanceof JetCallExpression) { JetExpression calleeExpression = ((JetCallExpression) expression).getCalleeExpression(); @@ -159,4 +157,16 @@ public class JetCompletionContributor extends CompletionContributor { } } } + + private static boolean isAtEndOfLine(int offset, Document document) { + int i = offset; + CharSequence chars = document.getCharsSequence(); + while (i < chars.length()) { + char c = chars.charAt(i); + if (c == '\n' || c == 'r') return true; + if (!Character.isWhitespace(c)) return false; + i++; + } + return true; + } } diff --git a/idea/testData/completion/handlers/smart/AutoCompleteAfterAs3.kt b/idea/testData/completion/handlers/smart/AutoCompleteAfterAs3.kt new file mode 100644 index 00000000000..0b8259264d9 --- /dev/null +++ b/idea/testData/completion/handlers/smart/AutoCompleteAfterAs3.kt @@ -0,0 +1,4 @@ +fun bar(o: Any): String { + val v: String = o as + return "" +} diff --git a/idea/testData/completion/handlers/smart/AutoCompleteAfterAs3.kt.after b/idea/testData/completion/handlers/smart/AutoCompleteAfterAs3.kt.after new file mode 100644 index 00000000000..117de5cdfcb --- /dev/null +++ b/idea/testData/completion/handlers/smart/AutoCompleteAfterAs3.kt.after @@ -0,0 +1,4 @@ +fun bar(o: Any): String { + val v: String = o as String + return "" +} diff --git a/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java index ea4d2939b5b..c2771868e47 100644 --- a/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java @@ -86,6 +86,11 @@ public class SmartCompletionHandlerTestGenerated extends AbstractSmartCompletion doTest("idea/testData/completion/handlers/smart/AutoCompleteAfterAs2.kt"); } + @TestMetadata("AutoCompleteAfterAs3.kt") + public void testAutoCompleteAfterAs3() throws Exception { + doTest("idea/testData/completion/handlers/smart/AutoCompleteAfterAs3.kt"); + } + @TestMetadata("ClassObjectMethod1.kt") public void testClassObjectMethod1() throws Exception { doTest("idea/testData/completion/handlers/smart/ClassObjectMethod1.kt");