Smart completion to work when some of previous arguments have errors (+ fixed testAfterEmptyArgument broken by previous changes)

This commit is contained in:
Valentin Kipyatkov
2015-09-03 14:03:26 +03:00
parent b11f47ec33
commit 7663793e3d
4 changed files with 45 additions and 2 deletions
@@ -37,7 +37,6 @@ import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo
import org.jetbrains.kotlin.resolve.bindingContextUtil.getTargetFunctionDescriptor
import org.jetbrains.kotlin.resolve.calls.CallResolver
import org.jetbrains.kotlin.resolve.calls.callUtil.getCall
import org.jetbrains.kotlin.resolve.calls.callUtil.noErrorsInValueArguments
import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode
@@ -250,7 +249,7 @@ class ExpectedInfos(
if (status == ResolutionStatus.RECEIVER_TYPE_ERROR || status == ResolutionStatus.RECEIVER_PRESENCE_ERROR) continue
// check that all arguments before the current one matched
if (!candidate.noErrorsInValueArguments()) continue
if (!candidate.allArgumentsMatched()) continue
var descriptor = candidate.getResultingDescriptor()
if (descriptor.valueParameters.isEmpty()) continue
@@ -352,6 +351,12 @@ class ExpectedInfos(
return expectedInfos
}
private fun <D : CallableDescriptor> ResolvedCall<D>.allArgumentsMatched()
= call.valueArguments.none { argument -> getArgumentMapping(argument).isError() && !argument.hasError() /* ignore arguments that has error type */ }
private fun ValueArgument.hasError()
= getArgumentExpression()?.let { bindingContext.getType(it) }?.isError ?: true
private fun namedArgumentTail(argumentToParameter: Map<ValueArgument, ValueParameterDescriptor>, argumentName: Name, descriptor: FunctionDescriptor): Tail? {
val usedParameterNames = (argumentToParameter.values().map { it.getName() } + listOf(argumentName)).toSet()
val notUsedParameters = descriptor.getValueParameters().filter { it.getName() !in usedParameterNames }
+16
View File
@@ -0,0 +1,16 @@
class A
class B
class C
class D
class E
fun foo(s: String, a: A){}
fun foo(p: Int, b: B, c: C){}
fun foo(s: String, d: D, e: E, a: A){}
fun f(pa: A, pb: B, pc: C, pd: D, pe: E) {
foo(xxx, pb, <caret>)
}
// EXIST: pc
// ABSENT: pa, pb, pd, pe
@@ -0,0 +1,16 @@
class A
class B
class C
class D
class E
fun foo(a: A){}
fun foo(b: B, c: C){}
fun foo(d: D, e: E, a: A){}
fun f(pa: A, pb: B, pc: C, pd: D, pe: E) {
foo(pa, <caret>)
}
// EXIST: pc, pe
// ABSENT: pa, pb, pd
@@ -413,6 +413,12 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT
doTest(fileName);
}
@TestMetadata("PreviousArgError.kt")
public void testPreviousArgError() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/PreviousArgError.kt");
doTest(fileName);
}
@TestMetadata("QualifiedOverloadedMethodCallArgument1.kt")
public void testQualifiedOverloadedMethodCallArgument1() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/QualifiedOverloadedMethodCallArgument1.kt");