[NI] Align builder inference with the old inference
#KT-29184 Fixed
This commit is contained in:
@@ -55,6 +55,7 @@ public interface Errors {
|
|||||||
|
|
||||||
DiagnosticFactory1<PsiElement, String> NEW_INFERENCE_ERROR = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<PsiElement, String> NEW_INFERENCE_ERROR = DiagnosticFactory1.create(ERROR);
|
||||||
DiagnosticFactory1<PsiElement, String> NEW_INFERENCE_DIAGNOSTIC = DiagnosticFactory1.create(WARNING);
|
DiagnosticFactory1<PsiElement, String> NEW_INFERENCE_DIAGNOSTIC = DiagnosticFactory1.create(WARNING);
|
||||||
|
DiagnosticFactory0<KtElement> NON_APPLICABLE_CALL_FOR_BUILDER_INFERENCE = DiagnosticFactory0.create(WARNING);
|
||||||
|
|
||||||
DiagnosticFactory1<PsiElement, Pair<LanguageFeature, LanguageVersionSettings>> UNSUPPORTED_FEATURE = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<PsiElement, Pair<LanguageFeature, LanguageVersionSettings>> UNSUPPORTED_FEATURE = DiagnosticFactory1.create(ERROR);
|
||||||
DiagnosticFactory1<PsiElement, Throwable> EXCEPTION_FROM_ANALYZER = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<PsiElement, Throwable> EXCEPTION_FROM_ANALYZER = DiagnosticFactory1.create(ERROR);
|
||||||
|
|||||||
+1
@@ -633,6 +633,7 @@ public class DefaultErrorMessages {
|
|||||||
MAP.put(UNSUPPORTED, "Unsupported [{0}]", STRING);
|
MAP.put(UNSUPPORTED, "Unsupported [{0}]", STRING);
|
||||||
MAP.put(NEW_INFERENCE_ERROR, "New inference error [{0}]", STRING);
|
MAP.put(NEW_INFERENCE_ERROR, "New inference error [{0}]", STRING);
|
||||||
MAP.put(NEW_INFERENCE_DIAGNOSTIC, "New inference [{0}]", STRING);
|
MAP.put(NEW_INFERENCE_DIAGNOSTIC, "New inference [{0}]", STRING);
|
||||||
|
MAP.put(NON_APPLICABLE_CALL_FOR_BUILDER_INFERENCE, "Non-applicable call for builder inference");
|
||||||
|
|
||||||
MAP.put(UNSUPPORTED_FEATURE, "{0}", new LanguageFeatureMessageRenderer(LanguageFeatureMessageRenderer.Type.UNSUPPORTED));
|
MAP.put(UNSUPPORTED_FEATURE, "{0}", new LanguageFeatureMessageRenderer(LanguageFeatureMessageRenderer.Type.UNSUPPORTED));
|
||||||
MAP.put(EXPERIMENTAL_FEATURE_WARNING, "{0}", new LanguageFeatureMessageRenderer(LanguageFeatureMessageRenderer.Type.WARNING));
|
MAP.put(EXPERIMENTAL_FEATURE_WARNING, "{0}", new LanguageFeatureMessageRenderer(LanguageFeatureMessageRenderer.Type.WARNING));
|
||||||
|
|||||||
+5
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.diagnostics.Errors
|
|||||||
import org.jetbrains.kotlin.diagnostics.Errors.*
|
import org.jetbrains.kotlin.diagnostics.Errors.*
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors.BadNamedArgumentsTarget.INVOKE_ON_FUNCTION_TYPE
|
import org.jetbrains.kotlin.diagnostics.Errors.BadNamedArgumentsTarget.INVOKE_ON_FUNCTION_TYPE
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors.BadNamedArgumentsTarget.NON_KOTLIN_FUNCTION
|
import org.jetbrains.kotlin.diagnostics.Errors.BadNamedArgumentsTarget.NON_KOTLIN_FUNCTION
|
||||||
|
import org.jetbrains.kotlin.diagnostics.reportDiagnosticOnce
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
@@ -49,6 +50,10 @@ class DiagnosticReporterByTrackingStrategy(
|
|||||||
)
|
)
|
||||||
InstantiationOfAbstractClass::class.java -> tracingStrategy.instantiationOfAbstractClass(trace)
|
InstantiationOfAbstractClass::class.java -> tracingStrategy.instantiationOfAbstractClass(trace)
|
||||||
AbstractSuperCall::class.java -> tracingStrategy.abstractSuperCall(trace)
|
AbstractSuperCall::class.java -> tracingStrategy.abstractSuperCall(trace)
|
||||||
|
NonApplicableCallForBuilderInferenceDiagnostic::class.java -> {
|
||||||
|
val reportOn = (diagnostic as NonApplicableCallForBuilderInferenceDiagnostic).kotlinCall
|
||||||
|
trace.reportDiagnosticOnce(Errors.NON_APPLICABLE_CALL_FOR_BUILDER_INFERENCE.on(reportOn.psiKotlinCall.psiCall.callElement))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+20
-14
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.resolve.calls.inference
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||||
import org.jetbrains.kotlin.resolve.TemporaryBindingTrace
|
import org.jetbrains.kotlin.resolve.TemporaryBindingTrace
|
||||||
@@ -22,9 +21,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind
|
|||||||
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage
|
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl
|
import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.model.NewTypeVariable
|
import org.jetbrains.kotlin.resolve.calls.inference.model.NewTypeVariable
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.KotlinCallComponents
|
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.KotlinResolutionCandidate
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedLambdaAtom
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.tower.*
|
import org.jetbrains.kotlin.resolve.calls.tower.*
|
||||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
||||||
import org.jetbrains.kotlin.types.StubType
|
import org.jetbrains.kotlin.types.StubType
|
||||||
@@ -51,19 +48,25 @@ class CoroutineInferenceSession(
|
|||||||
) : ManyCandidatesResolver<CallableDescriptor>(
|
) : ManyCandidatesResolver<CallableDescriptor>(
|
||||||
psiCallResolver, postponedArgumentsAnalyzer, kotlinConstraintSystemCompleter, callComponents, builtIns
|
psiCallResolver, postponedArgumentsAnalyzer, kotlinConstraintSystemCompleter, callComponents, builtIns
|
||||||
) {
|
) {
|
||||||
private val suspendCompletedCalls = arrayListOf<PSICompletedCallInfo>()
|
private val commonCalls = arrayListOf<PSICompletedCallInfo>()
|
||||||
private val normalCompletedCalls = arrayListOf<PSICompletedCallInfo>()
|
private val diagnostics = arrayListOf<KotlinCallDiagnostic>()
|
||||||
|
|
||||||
override fun shouldRunCompletion(candidate: KotlinResolutionCandidate): Boolean = true
|
override fun shouldRunCompletion(candidate: KotlinResolutionCandidate): Boolean = true
|
||||||
|
|
||||||
override fun addCompletedCallInfo(callInfo: CompletedCallInfo) {
|
override fun addCompletedCallInfo(callInfo: CompletedCallInfo) {
|
||||||
require(callInfo is PSICompletedCallInfo) { "Wrong instance of callInfo: $callInfo" }
|
require(callInfo is PSICompletedCallInfo) { "Wrong instance of callInfo: $callInfo" }
|
||||||
|
|
||||||
val candidateDescriptor = callInfo.callResolutionResult.resultCallAtom.candidateDescriptor
|
commonCalls.add(callInfo)
|
||||||
if (candidateDescriptor is FunctionDescriptor && candidateDescriptor.isSuspend)
|
|
||||||
suspendCompletedCalls.add(callInfo)
|
val isApplicableCall =
|
||||||
else
|
callComponents.statelessCallbacks.isApplicableCallForBuilderInference(
|
||||||
normalCompletedCalls.add(callInfo)
|
callInfo.resolvedCall.resultingDescriptor,
|
||||||
|
callComponents.languageVersionSettings
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!isApplicableCall) {
|
||||||
|
diagnostics.add(NonApplicableCallForBuilderInferenceDiagnostic(callInfo.callResolutionResult.resultCallAtom.atom))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun writeOnlyStubs(): Boolean {
|
override fun writeOnlyStubs(): Boolean {
|
||||||
@@ -140,8 +143,11 @@ class CoroutineInferenceSession(
|
|||||||
|
|
||||||
integrateConstraints(commonSystem, initialStorage, nonFixedToVariablesSubstitutor)
|
integrateConstraints(commonSystem, initialStorage, nonFixedToVariablesSubstitutor)
|
||||||
|
|
||||||
for (suspendCall in suspendCompletedCalls) {
|
for (call in commonCalls) {
|
||||||
integrateConstraints(commonSystem, suspendCall.callResolutionResult.constraintSystem, nonFixedToVariablesSubstitutor)
|
integrateConstraints(commonSystem, call.callResolutionResult.constraintSystem, nonFixedToVariablesSubstitutor)
|
||||||
|
}
|
||||||
|
for (diagnostic in diagnostics) {
|
||||||
|
commonSystem.addError(diagnostic)
|
||||||
}
|
}
|
||||||
|
|
||||||
return commonSystem
|
return commonSystem
|
||||||
@@ -155,7 +161,7 @@ class CoroutineInferenceSession(
|
|||||||
|
|
||||||
val nonFixedTypesToResultSubstitutor = ComposedSubstitutor(commonSystemSubstitutor, nonFixedToVariablesSubstitutor)
|
val nonFixedTypesToResultSubstitutor = ComposedSubstitutor(commonSystemSubstitutor, nonFixedToVariablesSubstitutor)
|
||||||
|
|
||||||
for (completedCall in suspendCompletedCalls + normalCompletedCalls) {
|
for (completedCall in commonCalls) {
|
||||||
val resultCallAtom = completedCall.callResolutionResult.resultCallAtom
|
val resultCallAtom = completedCall.callResolutionResult.resultCallAtom
|
||||||
val call = resultCallAtom.atom.getResolvedPsiKotlinCall<CallableDescriptor>(trace) ?: continue
|
val call = resultCallAtom.atom.getResolvedPsiKotlinCall<CallableDescriptor>(trace) ?: continue
|
||||||
|
|
||||||
|
|||||||
+27
-27
@@ -221,7 +221,7 @@ class CoroutineInferenceSupport(
|
|||||||
if (!resultingCall.isReallySuccess()) return
|
if (!resultingCall.isReallySuccess()) return
|
||||||
|
|
||||||
val resultingDescriptor = resultingCall.resultingDescriptor
|
val resultingDescriptor = resultingCall.resultingDescriptor
|
||||||
if (!isGoodCall(resultingDescriptor)) {
|
if (!isApplicableCallForBuilderInference(resultingDescriptor, languageVersionSettings)) {
|
||||||
inferenceData.badCallHappened()
|
inferenceData.badCallHappened()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,32 +250,6 @@ class CoroutineInferenceSupport(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun KotlinType.containsTypeTemplate() = contains { it is TypeTemplate }
|
|
||||||
|
|
||||||
private fun isGoodCall(resultingDescriptor: CallableDescriptor): Boolean {
|
|
||||||
if (!languageVersionSettings.supportsFeature(LanguageFeature.ExperimentalBuilderInference)) {
|
|
||||||
return isGoodCallForOldCoroutines(resultingDescriptor)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (resultingDescriptor.isExtension && !resultingDescriptor.hasBuilderInferenceAnnotation()) {
|
|
||||||
return resultingDescriptor.extensionReceiverParameter?.type?.containsTypeTemplate() == false
|
|
||||||
}
|
|
||||||
|
|
||||||
val returnType = resultingDescriptor.returnType ?: return false
|
|
||||||
return !returnType.containsTypeTemplate()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isGoodCallForOldCoroutines(resultingDescriptor: CallableDescriptor): Boolean {
|
|
||||||
val returnType = resultingDescriptor.returnType ?: return false
|
|
||||||
if (returnType.containsTypeTemplate()) return false
|
|
||||||
|
|
||||||
if (resultingDescriptor !is FunctionDescriptor || resultingDescriptor.isSuspend) return true
|
|
||||||
|
|
||||||
if (resultingDescriptor.valueParameters.any { it.type.containsTypeTemplate() }) return false
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
private class CoroutineTypeCheckerContext(
|
private class CoroutineTypeCheckerContext(
|
||||||
private val allowOnlyTrivialConstraints: Boolean
|
private val allowOnlyTrivialConstraints: Boolean
|
||||||
) : ClassicTypeCheckerContext(errorTypeEqualsToAnything = true) {
|
) : ClassicTypeCheckerContext(errorTypeEqualsToAnything = true) {
|
||||||
@@ -320,6 +294,32 @@ class CoroutineInferenceSupport(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KotlinType.containsTypeTemplate() = contains { it is TypeTemplate || it is StubType }
|
||||||
|
|
||||||
|
fun isApplicableCallForBuilderInference(descriptor: CallableDescriptor, languageVersionSettings: LanguageVersionSettings): Boolean {
|
||||||
|
if (!languageVersionSettings.supportsFeature(LanguageFeature.ExperimentalBuilderInference)) {
|
||||||
|
return isGoodCallForOldCoroutines(descriptor)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (descriptor.isExtension && !descriptor.hasBuilderInferenceAnnotation()) {
|
||||||
|
return descriptor.extensionReceiverParameter?.type?.containsTypeTemplate() == false
|
||||||
|
}
|
||||||
|
|
||||||
|
val returnType = descriptor.returnType ?: return false
|
||||||
|
return !returnType.containsTypeTemplate()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isGoodCallForOldCoroutines(resultingDescriptor: CallableDescriptor): Boolean {
|
||||||
|
val returnType = resultingDescriptor.returnType ?: return false
|
||||||
|
if (returnType.containsTypeTemplate()) return false
|
||||||
|
|
||||||
|
if (resultingDescriptor !is FunctionDescriptor || resultingDescriptor.isSuspend) return true
|
||||||
|
|
||||||
|
if (resultingDescriptor.valueParameters.any { it.type.containsTypeTemplate() }) return false
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
fun isCoroutineCallWithAdditionalInference(
|
fun isCoroutineCallWithAdditionalInference(
|
||||||
parameterDescriptor: ValueParameterDescriptor,
|
parameterDescriptor: ValueParameterDescriptor,
|
||||||
argument: ValueArgument,
|
argument: ValueArgument,
|
||||||
|
|||||||
+1
-1
@@ -205,7 +205,7 @@ class KotlinResolutionCallbacksImpl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun bindStubResolvedCallForCandidate(candidate: ResolvedCallAtom) {
|
override fun bindStubResolvedCallForCandidate(candidate: ResolvedCallAtom) {
|
||||||
kotlinToResolvedCallTransformer.createStubResolvedCallAndWriteItToTrace<CallableDescriptor>(candidate, trace, emptyList())
|
kotlinToResolvedCallTransformer.createStubResolvedCallAndWriteItToTrace(candidate, trace, emptyList(), substitutor = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createReceiverWithSmartCastInfo(resolvedAtom: ResolvedCallAtom): ReceiverValueWithSmartCastInfo? {
|
override fun createReceiverWithSmartCastInfo(resolvedAtom: ResolvedCallAtom): ReceiverValueWithSmartCastInfo? {
|
||||||
|
|||||||
+7
@@ -73,4 +73,11 @@ class KotlinResolutionStatelessCallbacksImpl(
|
|||||||
|
|
||||||
override fun isCoroutineCall(argument: KotlinCallArgument, parameter: ValueParameterDescriptor): Boolean =
|
override fun isCoroutineCall(argument: KotlinCallArgument, parameter: ValueParameterDescriptor): Boolean =
|
||||||
isCoroutineCallWithAdditionalInference(parameter, argument.psiCallArgument.valueArgument, languageVersionSettings)
|
isCoroutineCallWithAdditionalInference(parameter, argument.psiCallArgument.valueArgument, languageVersionSettings)
|
||||||
|
|
||||||
|
override fun isApplicableCallForBuilderInference(
|
||||||
|
descriptor: CallableDescriptor,
|
||||||
|
languageVersionSettings: LanguageVersionSettings
|
||||||
|
): Boolean {
|
||||||
|
return org.jetbrains.kotlin.resolve.calls.inference.isApplicableCallForBuilderInference(descriptor, languageVersionSettings)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+24
-11
@@ -100,26 +100,26 @@ class KotlinToResolvedCallTransformer(
|
|||||||
PSIPartialCallInfo(baseResolvedCall, context, tracingStrategy)
|
PSIPartialCallInfo(baseResolvedCall, context, tracingStrategy)
|
||||||
)
|
)
|
||||||
|
|
||||||
createStubResolvedCallAndWriteItToTrace(candidate, context.trace, baseResolvedCall.diagnostics)
|
createStubResolvedCallAndWriteItToTrace(candidate, context.trace, baseResolvedCall.diagnostics, substitutor = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
is CompletedCallResolutionResult, is ErrorCallResolutionResult -> {
|
is CompletedCallResolutionResult, is ErrorCallResolutionResult -> {
|
||||||
val candidate = (baseResolvedCall as SingleCallResolutionResult).resultCallAtom
|
val candidate = (baseResolvedCall as SingleCallResolutionResult).resultCallAtom
|
||||||
|
|
||||||
if (baseResolvedCall is CompletedCallResolutionResult) {
|
val resultSubstitutor = baseResolvedCall.constraintSystem.buildResultingSubstitutor()
|
||||||
context.inferenceSession.addCompletedCallInfo(PSICompletedCallInfo(baseResolvedCall, context, tracingStrategy))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (context.inferenceSession.writeOnlyStubs()) {
|
if (context.inferenceSession.writeOnlyStubs()) {
|
||||||
return createStubResolvedCallAndWriteItToTrace(
|
val stub = createStubResolvedCallAndWriteItToTrace(
|
||||||
candidate,
|
candidate,
|
||||||
context.trace,
|
context.trace,
|
||||||
baseResolvedCall.diagnostics,
|
baseResolvedCall.diagnostics,
|
||||||
completedCall = true
|
substitutor = resultSubstitutor
|
||||||
)
|
)
|
||||||
|
|
||||||
|
forwardCallToInferenceSession(baseResolvedCall, context, stub, tracingStrategy)
|
||||||
|
|
||||||
|
return stub as ResolvedCall<D>
|
||||||
}
|
}
|
||||||
|
|
||||||
val resultSubstitutor = baseResolvedCall.constraintSystem.buildResultingSubstitutor()
|
|
||||||
val ktPrimitiveCompleter = ResolvedAtomCompleter(
|
val ktPrimitiveCompleter = ResolvedAtomCompleter(
|
||||||
resultSubstitutor, context, this, expressionTypingServices, argumentTypeResolver,
|
resultSubstitutor, context, this, expressionTypingServices, argumentTypeResolver,
|
||||||
doubleColonExpressionResolver, builtIns, deprecationResolver, moduleDescriptor, dataFlowValueFactory
|
doubleColonExpressionResolver, builtIns, deprecationResolver, moduleDescriptor, dataFlowValueFactory
|
||||||
@@ -129,7 +129,10 @@ class KotlinToResolvedCallTransformer(
|
|||||||
ktPrimitiveCompleter.completeAll(subKtPrimitive)
|
ktPrimitiveCompleter.completeAll(subKtPrimitive)
|
||||||
}
|
}
|
||||||
|
|
||||||
ktPrimitiveCompleter.completeResolvedCall(candidate, baseResolvedCall.diagnostics) as ResolvedCall<D>
|
val resolvedCall = ktPrimitiveCompleter.completeResolvedCall(candidate, baseResolvedCall.diagnostics) as ResolvedCall<D>
|
||||||
|
forwardCallToInferenceSession(baseResolvedCall, context, resolvedCall, tracingStrategy)
|
||||||
|
|
||||||
|
resolvedCall
|
||||||
}
|
}
|
||||||
|
|
||||||
is SingleCallResolutionResult -> error("Call resolution result for one candidate didn't transformed: $baseResolvedCall")
|
is SingleCallResolutionResult -> error("Call resolution result for one candidate didn't transformed: $baseResolvedCall")
|
||||||
@@ -137,13 +140,23 @@ class KotlinToResolvedCallTransformer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun forwardCallToInferenceSession(
|
||||||
|
baseResolvedCall: CallResolutionResult,
|
||||||
|
context: BasicCallResolutionContext,
|
||||||
|
resolvedCall: ResolvedCall<*>,
|
||||||
|
tracingStrategy: TracingStrategy
|
||||||
|
) {
|
||||||
|
if (baseResolvedCall is CompletedCallResolutionResult) {
|
||||||
|
context.inferenceSession.addCompletedCallInfo(PSICompletedCallInfo(baseResolvedCall, context, resolvedCall, tracingStrategy))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun <D : CallableDescriptor> createStubResolvedCallAndWriteItToTrace(
|
fun <D : CallableDescriptor> createStubResolvedCallAndWriteItToTrace(
|
||||||
candidate: ResolvedCallAtom,
|
candidate: ResolvedCallAtom,
|
||||||
trace: BindingTrace,
|
trace: BindingTrace,
|
||||||
diagnostics: Collection<KotlinCallDiagnostic>,
|
diagnostics: Collection<KotlinCallDiagnostic>,
|
||||||
completedCall: Boolean = false
|
substitutor: NewTypeSubstitutor?
|
||||||
): ResolvedCall<D> {
|
): ResolvedCall<D> {
|
||||||
val substitutor = if (completedCall) NewTypeSubstitutorByConstructorMap(emptyMap()) else null
|
|
||||||
val result = transformToResolvedCall<D>(candidate, trace, substitutor, diagnostics)
|
val result = transformToResolvedCall<D>(candidate, trace, substitutor, diagnostics)
|
||||||
val psiKotlinCall = candidate.atom.psiKotlinCall
|
val psiKotlinCall = candidate.atom.psiKotlinCall
|
||||||
val tracing = psiKotlinCall.safeAs<PSIKotlinCallForInvoke>()?.baseCall?.tracingStrategy ?: psiKotlinCall.tracingStrategy
|
val tracing = psiKotlinCall.safeAs<PSIKotlinCallForInvoke>()?.baseCall?.tracingStrategy ?: psiKotlinCall.tracingStrategy
|
||||||
|
|||||||
+1
@@ -122,6 +122,7 @@ class PSIPartialCallInfo(
|
|||||||
class PSICompletedCallInfo(
|
class PSICompletedCallInfo(
|
||||||
override val callResolutionResult: CompletedCallResolutionResult,
|
override val callResolutionResult: CompletedCallResolutionResult,
|
||||||
val context: BasicCallResolutionContext,
|
val context: BasicCallResolutionContext,
|
||||||
|
val resolvedCall: ResolvedCall<*>,
|
||||||
val tracingStrategy: TracingStrategy
|
val tracingStrategy: TracingStrategy
|
||||||
) : CompletedCallInfo
|
) : CompletedCallInfo
|
||||||
|
|
||||||
|
|||||||
+2
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.resolve.calls.components
|
package org.jetbrains.kotlin.resolve.calls.components
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||||
@@ -29,6 +30,7 @@ interface KotlinResolutionStatelessCallbacks {
|
|||||||
fun getScopeTowerForCallableReferenceArgument(argument: CallableReferenceKotlinCallArgument): ImplicitScopeTower
|
fun getScopeTowerForCallableReferenceArgument(argument: CallableReferenceKotlinCallArgument): ImplicitScopeTower
|
||||||
fun getVariableCandidateIfInvoke(functionCall: KotlinCall): KotlinResolutionCandidate?
|
fun getVariableCandidateIfInvoke(functionCall: KotlinCall): KotlinResolutionCandidate?
|
||||||
fun isCoroutineCall(argument: KotlinCallArgument, parameter: ValueParameterDescriptor): Boolean
|
fun isCoroutineCall(argument: KotlinCallArgument, parameter: ValueParameterDescriptor): Boolean
|
||||||
|
fun isApplicableCallForBuilderInference(descriptor: CallableDescriptor, languageVersionSettings: LanguageVersionSettings): Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
// This components hold state (trace). Work with this carefully.
|
// This components hold state (trace). Work with this carefully.
|
||||||
|
|||||||
+6
@@ -179,4 +179,10 @@ class ManyCandidatesCallDiagnostic(
|
|||||||
override fun report(reporter: DiagnosticReporter) {
|
override fun report(reporter: DiagnosticReporter) {
|
||||||
reporter.onCall(this)
|
reporter.onCall(this)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NonApplicableCallForBuilderInferenceDiagnostic(val kotlinCall: KotlinCall) : KotlinCallDiagnostic(CONVENTION_ERROR) {
|
||||||
|
override fun report(reporter: DiagnosticReporter) {
|
||||||
|
reporter.onCall(this)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -53,7 +53,7 @@ val test6 = <!OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>generate<!> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val test7 = <!OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>generate<!> {
|
val test7 = <!OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>generate<!> {
|
||||||
yield("baz")
|
yield(<!NI;TYPE_MISMATCH!>"baz"<!>)
|
||||||
genericExtension<Int>()
|
genericExtension<Int>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -5,9 +5,9 @@ public val test2: kotlin.Any?
|
|||||||
public val test3: kotlin.Int
|
public val test3: kotlin.Int
|
||||||
public val test4: kotlin.Any?
|
public val test4: kotlin.Any?
|
||||||
public val test5: kotlin.Int
|
public val test5: kotlin.Int
|
||||||
public val test6: kotlin.String
|
public val test6: kotlin.Any?
|
||||||
public val test7: kotlin.String
|
public val test7: kotlin.Int
|
||||||
public val test8: kotlin.Any?
|
public val test8: kotlin.String
|
||||||
public fun </*0*/ S> generate(/*0*/ @kotlin.BuilderInference g: suspend Controller<S>.() -> kotlin.Unit): S
|
public fun </*0*/ S> generate(/*0*/ @kotlin.BuilderInference g: suspend Controller<S>.() -> kotlin.Unit): S
|
||||||
public fun Base.baseExtension(): kotlin.Unit
|
public fun Base.baseExtension(): kotlin.Unit
|
||||||
public fun </*0*/ S> Controller<S>.genericExtension(): kotlin.Unit
|
public fun </*0*/ S> Controller<S>.genericExtension(): kotlin.Unit
|
||||||
|
|||||||
compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/inferCoroutineTypeInOldVersion.kt
Vendored
+1
-1
@@ -23,7 +23,7 @@ val memberWithoutAnn = <!NI;IMPLICIT_NOTHING_AS_TYPE_PARAMETER, OI;TYPE_INFERENC
|
|||||||
}
|
}
|
||||||
|
|
||||||
val extension = <!OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>build<!> {
|
val extension = <!OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>build<!> {
|
||||||
extensionAdd("foo")
|
<!NI;NON_APPLICABLE_CALL_FOR_BUILDER_INFERENCE!>extensionAdd("foo")<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
val safeExtension = build {
|
val safeExtension = build {
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public val extension: kotlin.collections.List<kotlin.Any?>
|
public val extension: kotlin.collections.List<kotlin.String>
|
||||||
public val member: kotlin.collections.List<kotlin.Int>
|
public val member: kotlin.collections.List<kotlin.Int>
|
||||||
public val memberWithoutAnn: kotlin.collections.List<kotlin.Nothing>
|
public val memberWithoutAnn: kotlin.collections.List<kotlin.Nothing>
|
||||||
public val safeExtension: kotlin.collections.List<kotlin.String>
|
public val safeExtension: kotlin.collections.List<kotlin.String>
|
||||||
|
|||||||
+1
-1
@@ -30,7 +30,7 @@ val memberWithoutAnn = <!NI;IMPLICIT_NOTHING_AS_TYPE_PARAMETER, OI;TYPE_INFERENC
|
|||||||
}
|
}
|
||||||
|
|
||||||
val extension = <!OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>build<!> {
|
val extension = <!OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>build<!> {
|
||||||
extensionAdd("foo")
|
<!NI;NON_APPLICABLE_CALL_FOR_BUILDER_INFERENCE!>extensionAdd("foo")<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
val safeExtension = build {
|
val safeExtension = build {
|
||||||
|
|||||||
+3
-3
@@ -1,9 +1,9 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public val extension: kotlin.collections.List<kotlin.Any?>
|
public val extension: kotlin.collections.List<kotlin.String>
|
||||||
public val member: kotlin.collections.List<kotlin.Any?>
|
public val member: kotlin.collections.List<kotlin.Int>
|
||||||
public val memberWithoutAnn: kotlin.collections.List<kotlin.Nothing>
|
public val memberWithoutAnn: kotlin.collections.List<kotlin.Nothing>
|
||||||
public val safeExtension: kotlin.collections.List<kotlin.Any?>
|
public val safeExtension: kotlin.collections.List<kotlin.String>
|
||||||
public fun </*0*/ S> build(/*0*/ @kotlin.BuilderInference g: Builder<S>.() -> kotlin.Unit): kotlin.collections.List<S>
|
public fun </*0*/ S> build(/*0*/ @kotlin.BuilderInference g: Builder<S>.() -> kotlin.Unit): kotlin.collections.List<S>
|
||||||
public fun </*0*/ S> wrongBuild(/*0*/ g: Builder<S>.() -> kotlin.Unit): kotlin.collections.List<S>
|
public fun </*0*/ S> wrongBuild(/*0*/ g: Builder<S>.() -> kotlin.Unit): kotlin.collections.List<S>
|
||||||
public fun </*0*/ S> Builder<S>.extensionAdd(/*0*/ s: S): kotlin.Unit
|
public fun </*0*/ S> Builder<S>.extensionAdd(/*0*/ s: S): kotlin.Unit
|
||||||
|
|||||||
+1
-1
@@ -26,7 +26,7 @@ val normal = generate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val extension = <!OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>generate<!> {
|
val extension = <!OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>generate<!> {
|
||||||
extensionYield("foo")
|
<!NI;NON_APPLICABLE_CALL_FOR_BUILDER_INFERENCE!>extensionYield("foo")<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
val safeExtension = generate {
|
val safeExtension = generate {
|
||||||
|
|||||||
Vendored
+4
-2
@@ -1,6 +1,8 @@
|
|||||||
// !LANGUAGE: -ReleaseCoroutines -ExperimentalBuilderInference
|
// !LANGUAGE: -ReleaseCoroutines -ExperimentalBuilderInference
|
||||||
// !DIAGNOSTICS: -EXPERIMENTAL_FEATURE_WARNING
|
// !DIAGNOSTICS: -EXPERIMENTAL_FEATURE_WARNING
|
||||||
|
// !WITH_NEW_INFERENCE
|
||||||
// SKIP_TXT
|
// SKIP_TXT
|
||||||
|
|
||||||
@kotlin.coroutines.experimental.RestrictsSuspension
|
@kotlin.coroutines.experimental.RestrictsSuspension
|
||||||
class RestrictedController<T> {
|
class RestrictedController<T> {
|
||||||
suspend fun yield(<!UNUSED_PARAMETER!>x<!>: T) {}
|
suspend fun yield(<!UNUSED_PARAMETER!>x<!>: T) {}
|
||||||
@@ -75,13 +77,13 @@ fun test() {
|
|||||||
this@a.<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield<!>(1)
|
this@a.<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield<!>(1)
|
||||||
this@a.<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield2<!>(1)
|
this@a.<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield2<!>(1)
|
||||||
|
|
||||||
with(this) {
|
<!NI;NON_APPLICABLE_CALL_FOR_BUILDER_INFERENCE!>with(this) {
|
||||||
<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield<!>("")
|
<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield<!>("")
|
||||||
this@with.<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield<!>("")
|
this@with.<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield<!>("")
|
||||||
|
|
||||||
<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield2<!>("")
|
<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield2<!>("")
|
||||||
this@with.<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield2<!>("")
|
this@with.<!ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL!>yield2<!>("")
|
||||||
}
|
}<!>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user