~ get rid of customCompletionHandling
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt
index 768d13f..bea4727 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt
@@ -75,25 +75,18 @@
 
         val completionMode = candidate.computeCompletionMode(
             session.inferenceComponents, resolutionMode, initialType
-        )
+        ).let {
+            if (it == ConstraintSystemCompletionMode.FULL && inferenceSession.shouldAvoidFullCompletion(call))
+                ConstraintSystemCompletionMode.PARTIAL
+            else
+                it
+        }
 
         val analyzer = createPostponedArgumentsAnalyzer(transformer.resolutionContext)
         if (call is FirFunctionCall) {
             call.replaceLambdaArgumentInvocationKinds(session)
         }
 
-        if (inferenceSession.customCompletionHandling(call, resolutionMode, completionMode) { chosenCompletionMode ->
-                runCompletionForCall(
-                    candidate,
-                    chosenCompletionMode,
-                    call,
-                    initialType
-                )
-            }
-        ) {
-            return call
-        }
-
         return when (completionMode) {
             ConstraintSystemCompletionMode.FULL -> {
                 if (inferenceSession.shouldRunCompletion(call)) {
@@ -114,13 +107,16 @@
                     inferenceSession.addCompletedCall(completedCall, candidate)
                     completedCall
                 } else {
-                    inferenceSession.addPartiallyResolvedCall(call)
+                    inferenceSession.processPartiallyResolvedCall(call, resolutionMode)
                     call
                 }
             }
 
             ConstraintSystemCompletionMode.PARTIAL -> {
                 runCompletionForCall(candidate, completionMode, call, initialType, analyzer)
+                if (inferenceSession is FirDelegatedPropertyInferenceSession) {
+                    inferenceSession.processPartiallyResolvedCall(call, resolutionMode)
+                }
                 call
             }
 
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt
index a58bcc7..230131d 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt
@@ -47,30 +47,15 @@
             )
     }
 
-    override fun <T> customCompletionHandling(
-        call: T,
-        resolutionMode: ResolutionMode,
-        completionMode: ConstraintSystemCompletionMode,
-        runCompletionCallback: (ConstraintSystemCompletionMode) -> Unit,
-    ): Boolean where T : FirResolvable, T : FirStatement {
-        val candidate = call.candidate
+    override fun <T> shouldAvoidFullCompletion(call: T): Boolean where T : FirResolvable, T : FirStatement = call.isAnyOfDelegateOperators()
 
-
-        // Do not run completion for provideDelegate/getValue/setValue because they might affect each other
-        if (completionMode == ConstraintSystemCompletionMode.FULL && resolutionMode == ResolutionMode.ContextDependent.Delegate) return false
-
-        if (resolutionMode != ResolutionMode.ContextDependent.Delegate && !call.isAnyOfDelegateOperators()) return false
+    override fun <T> processPartiallyResolvedCall(call: T, resolutionMode: ResolutionMode) where T : FirResolvable, T : FirStatement {
+        if (resolutionMode != ResolutionMode.ContextDependent.Delegate && !call.isAnyOfDelegateOperators()) return
 
         val candidateSystem = call.candidate.system
-        val isProvideDelegateOperator = call.isOperatorCallWithName { it == OperatorNameConventions.PROVIDE_DELEGATE }
-        if (!isProvideDelegateOperator) {
-            runCompletionCallback(ConstraintSystemCompletionMode.PARTIAL)
-        }
 
         partiallyResolvedCalls.add(call to call.candidate)
         currentConstraintSystem = candidateSystem
-
-        return true
     }
 
     private fun <T> T.isAnyOfDelegateOperators(): Boolean where T : FirResolvable, T : FirStatement = isOperatorCallWithName {
@@ -148,8 +133,6 @@
 
 
     override fun <T> addCompletedCall(call: T, candidate: Candidate) where T : FirResolvable, T : FirStatement {}
-    override fun <T> addPartiallyResolvedCall(call: T) where T : FirResolvable, T : FirStatement {
-        error("")
-    }
+
     override fun <T> shouldRunCompletion(call: T): Boolean where T : FirResolvable, T : FirStatement = true
 }
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirInferenceSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirInferenceSession.kt
index 71d053a..7ec558e 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirInferenceSession.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirInferenceSession.kt
@@ -26,15 +26,9 @@
     }
 
     abstract fun <T> shouldRunCompletion(call: T): Boolean where T : FirResolvable, T : FirStatement
+    open fun <T> shouldAvoidFullCompletion(call: T): Boolean where T : FirResolvable, T : FirStatement = false
 
-    open fun <T> customCompletionHandling(
-        call: T,
-        resolutionMode: ResolutionMode,
-        completionMode: ConstraintSystemCompletionMode,
-        runCompletionCallback: (ConstraintSystemCompletionMode) -> Unit,
-    ): Boolean where T : FirResolvable, T : FirStatement = false
-
-    abstract fun <T> addPartiallyResolvedCall(call: T) where T : FirResolvable, T : FirStatement
+    abstract fun <T> processPartiallyResolvedCall(call: T, resolutionMode: ResolutionMode) where T : FirResolvable, T : FirStatement
     abstract fun <T> addCompletedCall(call: T, candidate: Candidate) where T : FirResolvable, T : FirStatement
 
     abstract fun registerStubTypes(map: Map<TypeVariableMarker, StubTypeMarker>)
@@ -54,7 +48,7 @@
 abstract class FirStubInferenceSession : FirInferenceSession() {
     override fun <T> shouldRunCompletion(call: T): Boolean where T : FirResolvable, T : FirStatement = true
 
-    override fun <T> addPartiallyResolvedCall(call: T) where T : FirResolvable, T : FirStatement {}
+    override fun <T> processPartiallyResolvedCall(call: T, resolutionMode: ResolutionMode) where T : FirResolvable, T : FirStatement {}
     override fun <T> addCompletedCall(call: T, candidate: Candidate) where T : FirResolvable, T : FirStatement {}
 
     override fun inferPostponedVariables(
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirInferenceSessionForChainedResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirInferenceSessionForChainedResolve.kt
index 70d0405..25a9a9e 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirInferenceSessionForChainedResolve.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirInferenceSessionForChainedResolve.kt
@@ -8,6 +8,7 @@
 import org.jetbrains.kotlin.fir.expressions.FirResolvable
 import org.jetbrains.kotlin.fir.expressions.FirStatement
 import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
+import org.jetbrains.kotlin.fir.resolve.ResolutionMode
 import org.jetbrains.kotlin.fir.resolve.calls.Candidate
 import org.jetbrains.kotlin.fir.resolve.calls.ResolutionContext
 import org.jetbrains.kotlin.fir.resolve.calls.candidate
@@ -32,7 +33,7 @@
         // do nothing
     }
 
-    override fun <T> addPartiallyResolvedCall(call: T) where T : FirResolvable, T : FirStatement {
+    override fun <T> processPartiallyResolvedCall(call: T, resolutionMode: ResolutionMode) where T : FirResolvable, T : FirStatement {
         partiallyResolvedCalls += call to call.candidate
     }