diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt index e14add5ed0e..0d51cf55013 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt @@ -109,7 +109,7 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, get() = smartCompletion?.expectedInfos ?: emptyList() private fun calcCompletionKind(): CompletionKind { - if (NamedArgumentCompletion.isOnlyNamedArgumentExpected(position)) { + if (nameExpression != null && NamedArgumentCompletion.isOnlyNamedArgumentExpected(nameExpression)) { return CompletionKind.NAMED_ARGUMENTS_ONLY } @@ -296,7 +296,7 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, } } - NamedArgumentCompletion.complete(position, collector, expectedInfos) + NamedArgumentCompletion.complete(collector, expectedInfos) } private fun addNonImported(completionKind: CompletionKind) { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/NamedArgumentCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/NamedArgumentCompletion.kt index 87421100999..1288a1e6294 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/NamedArgumentCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/NamedArgumentCompletion.kt @@ -20,19 +20,12 @@ import com.intellij.codeInsight.completion.InsertHandler import com.intellij.codeInsight.completion.InsertionContext import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElementBuilder -import com.intellij.psi.PsiElement -import com.intellij.psi.filters.AndFilter -import com.intellij.psi.filters.ClassFilter -import com.intellij.psi.filters.OrFilter -import com.intellij.psi.filters.position.ParentElementFilter -import org.jetbrains.kotlin.core.FirstChildInParentFilter import org.jetbrains.kotlin.idea.JetIcons import org.jetbrains.kotlin.idea.completion.handlers.WithTailInsertHandler -import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.JetCallElement +import org.jetbrains.kotlin.psi.JetSimpleNameExpression import org.jetbrains.kotlin.psi.JetValueArgument -import org.jetbrains.kotlin.psi.JetValueArgumentName import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.render @@ -40,35 +33,18 @@ import org.jetbrains.kotlin.types.JetType import java.util.* object NamedArgumentCompletion { - private val positionFilter = AndFilter( - LeafElementFilter(JetTokens.IDENTIFIER), - OrFilter( - AndFilter( - ParentElementFilter(ClassFilter(javaClass()), 2), - FirstChildInParentFilter(2) - ), - ParentElementFilter(ClassFilter(javaClass()), 2) - ) - ) - - public fun isOnlyNamedArgumentExpected(position: PsiElement): Boolean { - if (!positionFilter.isAcceptable(position, position)) return false - - val thisArgument = position.getStrictParentOfType()!! + public fun isOnlyNamedArgumentExpected(nameExpression: JetSimpleNameExpression): Boolean { + val thisArgument = nameExpression.parent as? JetValueArgument ?: return false + if (thisArgument.isNamed()) return false val callElement = thisArgument.getStrictParentOfType() ?: return false - for (argument in callElement.getValueArguments()) { - if (argument == thisArgument) break - if (argument.isNamed()) return true - } - - return false + return callElement.valueArguments + .takeWhile { it != thisArgument } + .any { it.isNamed() } } - public fun complete(position: PsiElement, collector: LookupElementsCollector, expectedInfos: Collection) { - if (!positionFilter.isAcceptable(position, position)) return - + public fun complete(collector: LookupElementsCollector, expectedInfos: Collection) { val nameToParameterType = HashMap>() for (expectedInfo in expectedInfos) { val argumentData = expectedInfo.additionalData as? ArgumentPositionData.Positional ?: continue diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletionSession.kt index 0b7e68fc228..918dcd0f8cd 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletionSession.kt @@ -50,8 +50,8 @@ class SmartCompletionSession(configuration: CompletionSessionConfiguration, para get() = smartCompletion?.expectedInfos ?: emptyList() override fun doComplete() { - if (NamedArgumentCompletion.isOnlyNamedArgumentExpected(position)) { - NamedArgumentCompletion.complete(position, collector, expectedInfos) + if (nameExpression != null && NamedArgumentCompletion.isOnlyNamedArgumentExpected(nameExpression)) { + NamedArgumentCompletion.complete(collector, expectedInfos) return }