[FIR-IDE] Fix completion check for generic extensions

Generic candidate extensions are completed in partial mode
when there is not enough information for type parameter in return position.
Partial completion mode in single candidate resolver leads to unconditionally failing candidate.
Providing noExpectedType instead of null guarantees full completion.
This commit is contained in:
Pavel Kirpichenkov
2020-09-04 18:34:55 +03:00
parent 60dfa8cc84
commit d674f519fd
5 changed files with 28 additions and 1 deletions
@@ -0,0 +1,11 @@
// FIR_COMPARISON
class Generic<T>
fun <A : String, B, C> Generic<A>.extension(arg: (A) -> B): B = TODO()
fun test() {
val v = Generic<String>()
v.ext<caret>
}
// EXIST: extension
@@ -1433,6 +1433,11 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
runTest("idea/idea-completion/testData/basic/common/extensions/NoMemberExtensionsFromCompanionObject.kt");
}
@TestMetadata("ParametrizedExpectedType.kt")
public void testParametrizedExpectedType() throws Exception {
runTest("idea/idea-completion/testData/basic/common/extensions/ParametrizedExpectedType.kt");
}
@TestMetadata("StarTypeArg.kt")
public void testStarTypeArg() throws Exception {
runTest("idea/idea-completion/testData/basic/common/extensions/StarTypeArg.kt");
@@ -1433,6 +1433,11 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
runTest("idea/idea-completion/testData/basic/common/extensions/NoMemberExtensionsFromCompanionObject.kt");
}
@TestMetadata("ParametrizedExpectedType.kt")
public void testParametrizedExpectedType() throws Exception {
runTest("idea/idea-completion/testData/basic/common/extensions/ParametrizedExpectedType.kt");
}
@TestMetadata("StarTypeArg.kt")
public void testStarTypeArg() throws Exception {
runTest("idea/idea-completion/testData/basic/common/extensions/StarTypeArg.kt");
@@ -1433,6 +1433,11 @@ public class HighLevelJvmBasicCompletionTestGenerated extends AbstractHighLevelJ
runTest("idea/idea-completion/testData/basic/common/extensions/NoMemberExtensionsFromCompanionObject.kt");
}
@TestMetadata("ParametrizedExpectedType.kt")
public void testParametrizedExpectedType() throws Exception {
runTest("idea/idea-completion/testData/basic/common/extensions/ParametrizedExpectedType.kt");
}
@TestMetadata("StarTypeArg.kt")
public void testStarTypeArg() throws Exception {
runTest("idea/idea-completion/testData/basic/common/extensions/StarTypeArg.kt");
@@ -90,7 +90,8 @@ class SingleCandidateResolver(
candidate = candidate
)
}
val completionResult = firCallCompleter.completeCall(fakeCall, resolutionParameters.expectedType)
val expectedType = resolutionParameters.expectedType ?: bodyResolveComponents.noExpectedType
val completionResult = firCallCompleter.completeCall(fakeCall, expectedType)
return if (completionResult.callCompleted) {
completionResult.result
} else null