[NI] Use approximator as a component, don't recreate it during resolve
This commit is contained in:
+4
-2
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.resolve.calls.tower.*
|
||||
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
||||
import org.jetbrains.kotlin.types.StubType
|
||||
import org.jetbrains.kotlin.types.TypeApproximator
|
||||
import org.jetbrains.kotlin.types.TypeConstructor
|
||||
import org.jetbrains.kotlin.types.UnwrappedType
|
||||
import org.jetbrains.kotlin.types.expressions.DoubleColonExpressionResolver
|
||||
@@ -47,7 +48,8 @@ class CoroutineInferenceSession(
|
||||
private val argumentTypeResolver: ArgumentTypeResolver,
|
||||
private val doubleColonExpressionResolver: DoubleColonExpressionResolver,
|
||||
private val deprecationResolver: DeprecationResolver,
|
||||
private val moduleDescriptor: ModuleDescriptor
|
||||
private val moduleDescriptor: ModuleDescriptor,
|
||||
private val typeApproximator: TypeApproximator
|
||||
) : ManyCandidatesResolver<CallableDescriptor>(
|
||||
psiCallResolver, postponedArgumentsAnalyzer, kotlinConstraintSystemCompleter, callComponents, builtIns
|
||||
) {
|
||||
@@ -220,7 +222,7 @@ class CoroutineInferenceSession(
|
||||
return ResolvedAtomCompleter(
|
||||
resultSubstitutor, context, kotlinToResolvedCallTransformer,
|
||||
expressionTypingServices, argumentTypeResolver, doubleColonExpressionResolver, builtIns,
|
||||
deprecationResolver, moduleDescriptor, context.dataFlowValueFactory
|
||||
deprecationResolver, moduleDescriptor, context.dataFlowValueFactory, typeApproximator
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -161,7 +161,7 @@ class KotlinResolutionCallbacksImpl(
|
||||
psiCallResolver, postponedArgumentsAnalyzer, kotlinConstraintSystemCompleter,
|
||||
callComponents, builtIns, topLevelCallContext, stubsForPostponedVariables, trace,
|
||||
kotlinToResolvedCallTransformer, expressionTypingServices, argumentTypeResolver,
|
||||
doubleColonExpressionResolver, deprecationResolver, moduleDescriptor
|
||||
doubleColonExpressionResolver, deprecationResolver, moduleDescriptor, typeApproximator
|
||||
)
|
||||
} else {
|
||||
null
|
||||
|
||||
+9
-7
@@ -39,7 +39,6 @@ import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy
|
||||
import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant
|
||||
import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor
|
||||
import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstant
|
||||
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.CastImplicitClassReceiver
|
||||
@@ -71,7 +70,8 @@ class KotlinToResolvedCallTransformer(
|
||||
private val dataFlowValueFactory: DataFlowValueFactory,
|
||||
private val builtIns: KotlinBuiltIns,
|
||||
private val typeSystemContext: TypeSystemInferenceExtensionContextDelegate,
|
||||
private val smartCastManager: SmartCastManager
|
||||
private val smartCastManager: SmartCastManager,
|
||||
private val typeApproximator: TypeApproximator
|
||||
) {
|
||||
companion object {
|
||||
private val REPORT_MISSING_NEW_INFERENCE_DIAGNOSTIC
|
||||
@@ -128,7 +128,8 @@ class KotlinToResolvedCallTransformer(
|
||||
|
||||
val ktPrimitiveCompleter = ResolvedAtomCompleter(
|
||||
resultSubstitutor, context, this, expressionTypingServices, argumentTypeResolver,
|
||||
doubleColonExpressionResolver, builtIns, deprecationResolver, moduleDescriptor, dataFlowValueFactory
|
||||
doubleColonExpressionResolver, builtIns, deprecationResolver, moduleDescriptor, dataFlowValueFactory,
|
||||
typeApproximator
|
||||
)
|
||||
|
||||
if (!ErrorUtils.isError(candidate.candidateDescriptor)) {
|
||||
@@ -209,7 +210,7 @@ class KotlinToResolvedCallTransformer(
|
||||
return storedResolvedCall
|
||||
}
|
||||
}
|
||||
return NewResolvedCallImpl(completedSimpleAtom, resultSubstitutor, diagnostics)
|
||||
return NewResolvedCallImpl(completedSimpleAtom, resultSubstitutor, diagnostics, typeApproximator)
|
||||
}
|
||||
|
||||
fun runCallCheckers(resolvedCall: ResolvedCall<*>, callCheckerContext: CallCheckerContext) {
|
||||
@@ -609,7 +610,8 @@ sealed class NewAbstractResolvedCall<D : CallableDescriptor>() : ResolvedCall<D>
|
||||
class NewResolvedCallImpl<D : CallableDescriptor>(
|
||||
val resolvedCallAtom: ResolvedCallAtom,
|
||||
substitutor: NewTypeSubstitutor?,
|
||||
private var diagnostics: Collection<KotlinCallDiagnostic>
|
||||
private var diagnostics: Collection<KotlinCallDiagnostic>,
|
||||
private val typeApproximator: TypeApproximator
|
||||
) : NewAbstractResolvedCall<D>() {
|
||||
var isCompleted = false
|
||||
private set
|
||||
@@ -702,7 +704,7 @@ class NewResolvedCallImpl<D : CallableDescriptor>(
|
||||
// this code is very suspicious. Now it is very useful for BE, because they cannot do nothing with captured types,
|
||||
// but it seems like temporary solution.
|
||||
candidateDescriptor.substitute(resolvedCallAtom.substitutor).substituteAndApproximateCapturedTypes(
|
||||
substitutor ?: FreshVariableNewTypeSubstitutor.Empty
|
||||
substitutor ?: FreshVariableNewTypeSubstitutor.Empty, typeApproximator
|
||||
)
|
||||
else ->
|
||||
candidateDescriptor
|
||||
@@ -711,7 +713,7 @@ class NewResolvedCallImpl<D : CallableDescriptor>(
|
||||
|
||||
typeArguments = resolvedCallAtom.substitutor.freshVariables.map {
|
||||
val substituted = (substitutor ?: FreshVariableNewTypeSubstitutor.Empty).safeSubstitute(it.defaultType)
|
||||
TypeApproximator(substituted.constructor.builtIns)
|
||||
typeApproximator
|
||||
.approximateToSuperType(substituted, TypeApproximatorConfiguration.IntegerLiteralsTypesApproximation)
|
||||
?: substituted
|
||||
}
|
||||
|
||||
+8
-3
@@ -57,6 +57,7 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.*
|
||||
import org.jetbrains.kotlin.resolve.scopes.utils.canBeResolvedWithoutDeprecation
|
||||
import org.jetbrains.kotlin.types.DeferredType
|
||||
import org.jetbrains.kotlin.types.ErrorUtils
|
||||
import org.jetbrains.kotlin.types.TypeApproximator
|
||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||
import org.jetbrains.kotlin.types.isDynamic
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
@@ -72,7 +73,8 @@ class NewResolutionOldInference(
|
||||
private val syntheticScopes: SyntheticScopes,
|
||||
private val languageVersionSettings: LanguageVersionSettings,
|
||||
private val coroutineInferenceSupport: CoroutineInferenceSupport,
|
||||
private val deprecationResolver: DeprecationResolver
|
||||
private val deprecationResolver: DeprecationResolver,
|
||||
private val typeApproximator: TypeApproximator
|
||||
) {
|
||||
sealed class ResolutionKind {
|
||||
abstract internal fun createTowerProcessor(
|
||||
@@ -170,7 +172,9 @@ class NewResolutionOldInference(
|
||||
}
|
||||
|
||||
val dynamicScope = dynamicCallableDescriptors.createDynamicDescriptorScope(context.call, context.scope.ownerDescriptor)
|
||||
val scopeTower = ImplicitScopeTowerImpl(context, dynamicScope, syntheticScopes, context.call.createLookupLocation())
|
||||
val scopeTower = ImplicitScopeTowerImpl(
|
||||
context, dynamicScope, syntheticScopes, context.call.createLookupLocation(), typeApproximator
|
||||
)
|
||||
|
||||
val shouldUseOperatorRem = languageVersionSettings.supportsFeature(LanguageFeature.OperatorRem)
|
||||
val isBinaryRemOperator = isBinaryRemOperator(context.call)
|
||||
@@ -353,7 +357,8 @@ class NewResolutionOldInference(
|
||||
val resolutionContext: ResolutionContext<*>,
|
||||
override val dynamicScope: MemberScope,
|
||||
override val syntheticScopes: SyntheticScopes,
|
||||
override val location: LookupLocation
|
||||
override val location: LookupLocation,
|
||||
override val typeApproximator: TypeApproximator
|
||||
) : ImplicitScopeTower {
|
||||
private val cache = HashMap<ReceiverValue, ReceiverValueWithSmartCastInfo>()
|
||||
|
||||
|
||||
@@ -375,6 +375,7 @@ class PSICallResolver(
|
||||
override val isDebuggerContext: Boolean get() = context.isDebuggerContext
|
||||
override val isNewInferenceEnabled: Boolean get() = context.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
|
||||
override val lexicalScope: LexicalScope get() = context.scope
|
||||
override val typeApproximator: TypeApproximator get() = this@PSICallResolver.typeApproximator
|
||||
private val cache = HashMap<ReceiverParameterDescriptor, ReceiverValueWithSmartCastInfo>()
|
||||
|
||||
override fun getImplicitReceiver(scope: LexicalScope): ReceiverValueWithSmartCastInfo? {
|
||||
|
||||
+3
-2
@@ -50,7 +50,8 @@ class ResolvedAtomCompleter(
|
||||
private val builtIns: KotlinBuiltIns,
|
||||
private val deprecationResolver: DeprecationResolver,
|
||||
private val moduleDescriptor: ModuleDescriptor,
|
||||
private val dataFlowValueFactory: DataFlowValueFactory
|
||||
private val dataFlowValueFactory: DataFlowValueFactory,
|
||||
private val typeApproximator: TypeApproximator
|
||||
) {
|
||||
private val topLevelCallCheckerContext = CallCheckerContext(topLevelCallContext, deprecationResolver, moduleDescriptor)
|
||||
private val topLevelTrace = topLevelCallCheckerContext.trace
|
||||
@@ -142,7 +143,7 @@ class ResolvedAtomCompleter(
|
||||
}
|
||||
|
||||
val approximatedReturnType =
|
||||
TypeApproximator(builtIns).approximateDeclarationType(
|
||||
typeApproximator.approximateDeclarationType(
|
||||
returnType,
|
||||
local = true,
|
||||
languageVersionSettings = topLevelCallContext.languageVersionSettings
|
||||
|
||||
Reference in New Issue
Block a user