diff --git a/idea/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt b/idea/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt index 6297792b225..e5d5d296eec 100644 --- a/idea/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt @@ -103,19 +103,12 @@ public class KotlinCompletionContributor : CompletionContributor() { parent = expression.getParent() } - val expressionEnd = expression.getTextRange()!!.getEndOffset() - val suggestedReplacementOffset = if (expression is JetCallExpression) { - val calleeExpression = (expression as JetCallExpression).getCalleeExpression() - if (calleeExpression != null) calleeExpression.getTextRange()!!.getEndOffset() else expressionEnd - } - else { - expressionEnd - } + val suggestedReplacementOffset = replacementOffsetByExpression(expression) if (suggestedReplacementOffset > context.getReplacementOffset()) { context.setReplacementOffset(suggestedReplacementOffset) } - context.getOffsetMap().addOffset(SmartCompletion.OLD_ARGUMENTS_REPLACEMENT_OFFSET, expressionEnd) + context.getOffsetMap().addOffset(SmartCompletion.OLD_ARGUMENTS_REPLACEMENT_OFFSET, expression.getTextRange().getEndOffset()) val argumentList = (expression.getParent() as? JetValueArgument)?.getParent() as? JetValueArgumentList if (argumentList != null) { @@ -127,6 +120,25 @@ public class KotlinCompletionContributor : CompletionContributor() { } } + private fun replacementOffsetByExpression(expression: JetExpression): Int { + when (expression) { + is JetCallExpression -> { + val calleeExpression = expression.getCalleeExpression() + if (calleeExpression != null) { + return calleeExpression.getTextRange()!!.getEndOffset() + } + } + + is JetQualifiedExpression -> { + val selector = expression.getSelectorExpression() + if (selector != null) { + return replacementOffsetByExpression(selector) + } + } + } + return expression.getTextRange()!!.getEndOffset() + } + private fun isInFunctionLiteralParameterList(tokenBefore: PsiElement?): Boolean { val parameterList = tokenBefore?.parents(false)?.firstOrNull { it is JetParameterList } ?: return false val parent = parameterList.getParent() diff --git a/idea/testData/completion/handlers/smart/QualifiedCallReplacementBug.kt b/idea/testData/completion/handlers/smart/QualifiedCallReplacementBug.kt new file mode 100644 index 00000000000..0f5d7eb2e09 --- /dev/null +++ b/idea/testData/completion/handlers/smart/QualifiedCallReplacementBug.kt @@ -0,0 +1,8 @@ +class C(val v: Int) + +fun foo(): C { + return a.b(1) +} + +// ELEMENT: C +// CHAR: \t \ No newline at end of file diff --git a/idea/testData/completion/handlers/smart/QualifiedCallReplacementBug.kt.after b/idea/testData/completion/handlers/smart/QualifiedCallReplacementBug.kt.after new file mode 100644 index 00000000000..2bc3b320555 --- /dev/null +++ b/idea/testData/completion/handlers/smart/QualifiedCallReplacementBug.kt.after @@ -0,0 +1,8 @@ +class C(val v: Int) + +fun foo(): C { + return C(1) +} + +// ELEMENT: C +// CHAR: \t \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/completion/handlers/SmartCompletionHandlerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/completion/handlers/SmartCompletionHandlerTestGenerated.java index be4ffefbab1..1947b72e9f9 100644 --- a/idea/tests/org/jetbrains/kotlin/completion/handlers/SmartCompletionHandlerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/completion/handlers/SmartCompletionHandlerTestGenerated.java @@ -534,6 +534,12 @@ public class SmartCompletionHandlerTestGenerated extends AbstractSmartCompletion doTest(fileName); } + @TestMetadata("QualifiedCallReplacementBug.kt") + public void testQualifiedCallReplacementBug() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/handlers/smart/QualifiedCallReplacementBug.kt"); + doTest(fileName); + } + @TestMetadata("QualifiedThisKeywordName1.kt") public void testQualifiedThisKeywordName1() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/handlers/smart/QualifiedThisKeywordName1.kt");