WIP reduce expensive frontend calls
diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt
index 523a197..6c412cf 100644
--- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt
+++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt
@@ -20,11 +20,14 @@
 import org.jetbrains.kotlin.fir.backend.*
 import org.jetbrains.kotlin.fir.backend.generators.Fir2IrDataClassGeneratedMemberBodyGenerator
 import org.jetbrains.kotlin.fir.backend.utils.generatedBuiltinsDeclarationsFileName
+import org.jetbrains.kotlin.fir.backend.utils.unsubstitutedScope
 import org.jetbrains.kotlin.fir.declarations.FirFile
 import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
 import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass
 import org.jetbrains.kotlin.fir.moduleData
 import org.jetbrains.kotlin.fir.resolve.ScopeSession
+import org.jetbrains.kotlin.fir.scopes.staticScopeForBackend
+import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
 import org.jetbrains.kotlin.ir.IrBuiltIns
 import org.jetbrains.kotlin.ir.IrElement
 import org.jetbrains.kotlin.ir.KtDiagnosticReporterWithImplicitIrBasedContext
@@ -35,12 +38,14 @@
 import org.jetbrains.kotlin.ir.overrides.IrFakeOverrideBuilder
 import org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI
 import org.jetbrains.kotlin.ir.types.IrTypeSystemContext
+import org.jetbrains.kotlin.ir.types.classOrFail
 import org.jetbrains.kotlin.ir.types.getClass
 import org.jetbrains.kotlin.ir.util.KotlinMangler
 import org.jetbrains.kotlin.ir.util.SymbolTable
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
 import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
 import org.jetbrains.kotlin.ir.visitors.acceptVoid
+import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.platform.jvm.isJvm
 import org.jetbrains.kotlin.utils.addToStdlib.runIf
 
@@ -400,21 +405,35 @@
         }
     }
 
-    @OptIn(UnsafeDuringIrConstructionAPI::class)
+    @OptIn(UnsafeDuringIrConstructionAPI::class, SymbolInternals::class)
     private fun buildFakeOverridesForLazyClass(
         clazz: Fir2IrLazyClass,
         resolver: SpecialFakeOverrideSymbolsResolver,
     ) {
+        val c: Fir2IrComponents = clazz
         val declarationStorage = clazz.declarationStorage
-        val mainScope = clazz.fir.unsubstitutedScope(clazz)
         val lookupTag = clazz.fir.symbol.toLookupTag()
 
         val allFromSuper = clazz.superTypes.flatMap { superType ->
             superType.classOrFail.owner.declarations
+        }.groupBy {
+            when (it) {
+                is Fir2IrLazySimpleFunction -> it.name
+                is Fir2IrLazyProperty -> it.name
+                else -> Unit
+            }
+        }.filterKeys { it != Unit }
+            .mapValues { it.value.first() }.values
+        if (allFromSuper.isEmpty()) return
+
+        val mainScope = clazz.fir.scopeProvider.getUseSiteMemberScope(clazz.fir, c.session, c.scopeSession, memberRequiredPhase = null)
+        val signatureEnhancement = FirSignatureEnhancement(clazz.fir, c.session) {
+            mainScope.getDirectOverriddenMembers(this.symbol).map { it.fir }
         }
+        val typeCalculator = CallableCopyTypeCalculator.Forced
 
 
-        listOfNotNull(mainScope, clazz.fir.staticScopeForBackend(clazz.session, clazz.scopeSession)).forEach { scope ->
+        /*listOfNotNull(clazz.fir.unsubstitutedScope(clazz), clazz.fir.staticScopeForBackend(c.session, c.scopeSession)).forEach { scope ->
             val functionNames = mutableSetOf<Name>()
             val propertyNames = mutableSetOf<Name>()
             for (decl in allFromSuper) {
@@ -436,27 +455,31 @@
                     }
                 }
             }
-        }
+        }*/
 
-        /*for (decl in allFromSuper) {
+        for (decl in allFromSuper) {
             when (decl) {
                 is IrSimpleFunction -> {
                     decl as Fir2IrLazySimpleFunction
+                    decl.fir.computeJvmSignature()
 
-                    scope.processOverriddenFunctionsAndSelf(decl.fir.symbol) { func ->
-                        fakeOverrides += declarationStorage.getIrFunctionSymbol(func, lookupTag).owner as IrSimpleFunction
-                        ProcessorAction.NEXT
+                    val enhanced = signatureEnhancement.enhancedFunction(decl.fir.symbol, decl.name)
+                    if (enhanced.fir.canHaveDeferredReturnTypeCalculation) {
+                        typeCalculator.computeReturnType(enhanced.fir)
                     }
+                    declarationStorage.getIrFunctionSymbol(enhanced, lookupTag)
                 }
                 is IrProperty -> {
                     decl as Fir2IrLazyProperty
-                    scope.processOverriddenProperties(decl.fir.symbol) { property ->
-                        fakeOverrides += declarationStorage.getIrPropertySymbol(property, lookupTag).owner as IrProperty
-                        ProcessorAction.NEXT
+
+                    val enhanced = signatureEnhancement.enhancedProperty(decl.fir.symbol, decl.name) as FirPropertySymbol
+                    if (enhanced.fir.canHaveDeferredReturnTypeCalculation) {
+                        typeCalculator.computeReturnType(enhanced.fir)
                     }
+                    declarationStorage.getIrPropertySymbol(enhanced, lookupTag)
                 }
             }
-        }*/
+        }
     }