FIR: Optimize constructor of FirTowerResolverSession

This commit is contained in:
Denis Zharkov
2020-05-08 18:24:05 +03:00
parent 2e91bf7e50
commit beb9a72e9d
4 changed files with 41 additions and 16 deletions
@@ -0,0 +1,15 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir
private open class FrozenReversedListReadOnly<out T>(
private val delegate: List<T>
) : AbstractList<T>() {
override val size: Int = delegate.size
override fun get(index: Int): T = delegate[size - 1 - index]
}
fun <T> List<T>.asReversedFrozen(): List<T> = FrozenReversedListReadOnly(this)
@@ -39,6 +39,7 @@ interface BodyResolveComponents : SessionHolder {
val containingDeclarations: List<FirDeclaration> val containingDeclarations: List<FirDeclaration>
val fileImportsScope: List<FirScope> val fileImportsScope: List<FirScope>
val towerDataElements: List<FirTowerDataElement> val towerDataElements: List<FirTowerDataElement>
val towerDataContext: FirTowerDataContext
val localScopes: FirLocalScopes val localScopes: FirLocalScopes
val towerDataContextForAnonymousFunctions: TowerDataContextForAnonymousFunctions val towerDataContextForAnonymousFunctions: TowerDataContextForAnonymousFunctions
val noExpectedType: FirTypeRef val noExpectedType: FirTypeRef
@@ -68,12 +69,14 @@ class FirTowerDataContext private constructor(
// i.e. implicitReceiverStack == towerDataElements.mapNotNull { it.receiver } // i.e. implicitReceiverStack == towerDataElements.mapNotNull { it.receiver }
// i.e. localScopes == towerDataElements.mapNotNull { it.scope?.takeIf { it.isLocal } } // i.e. localScopes == towerDataElements.mapNotNull { it.scope?.takeIf { it.isLocal } }
val implicitReceiverStack: PersistentImplicitReceiverStack, val implicitReceiverStack: PersistentImplicitReceiverStack,
val localScopes: FirLocalScopes val localScopes: FirLocalScopes,
val nonLocalTowerDataElements: PersistentList<FirTowerDataElement>
) { ) {
constructor() : this( constructor() : this(
persistentListOf(), persistentListOf(),
PersistentImplicitReceiverStack(), PersistentImplicitReceiverStack(),
persistentListOf(),
persistentListOf() persistentListOf()
) )
@@ -84,7 +87,8 @@ class FirTowerDataContext private constructor(
return FirTowerDataContext( return FirTowerDataContext(
towerDataElements.set(indexOfLastLocalScope, newLastScope.asTowerDataElement(isLocal = true)), towerDataElements.set(indexOfLastLocalScope, newLastScope.asTowerDataElement(isLocal = true)),
implicitReceiverStack, implicitReceiverStack,
localScopes.set(localScopes.lastIndex, newLastScope) localScopes.set(localScopes.lastIndex, newLastScope),
nonLocalTowerDataElements
) )
} }
@@ -92,7 +96,8 @@ class FirTowerDataContext private constructor(
return FirTowerDataContext( return FirTowerDataContext(
towerDataElements.addAll(newElements), towerDataElements.addAll(newElements),
implicitReceiverStack.addAll(newElements.mapNotNull { it.implicitReceiver }), implicitReceiverStack.addAll(newElements.mapNotNull { it.implicitReceiver }),
localScopes localScopes,
nonLocalTowerDataElements.addAll(newElements)
) )
} }
@@ -100,15 +105,18 @@ class FirTowerDataContext private constructor(
return FirTowerDataContext( return FirTowerDataContext(
towerDataElements.add(localScope.asTowerDataElement(isLocal = true)), towerDataElements.add(localScope.asTowerDataElement(isLocal = true)),
implicitReceiverStack, implicitReceiverStack,
localScopes.add(localScope) localScopes.add(localScope),
nonLocalTowerDataElements
) )
} }
fun addReceiver(name: Name?, implicitReceiverValue: ImplicitReceiverValue<*>): FirTowerDataContext { fun addReceiver(name: Name?, implicitReceiverValue: ImplicitReceiverValue<*>): FirTowerDataContext {
val element = implicitReceiverValue.asTowerDataElement()
return FirTowerDataContext( return FirTowerDataContext(
towerDataElements.add(implicitReceiverValue.asTowerDataElement()), towerDataElements.add(element),
implicitReceiverStack.add(name, implicitReceiverValue), implicitReceiverStack.add(name, implicitReceiverValue),
localScopes localScopes,
nonLocalTowerDataElements.add(element)
) )
} }
@@ -118,10 +126,12 @@ class FirTowerDataContext private constructor(
} }
private fun addNonLocalScope(scope: FirScope): FirTowerDataContext { private fun addNonLocalScope(scope: FirScope): FirTowerDataContext {
val element = scope.asTowerDataElement(isLocal = false)
return FirTowerDataContext( return FirTowerDataContext(
towerDataElements.add(scope.asTowerDataElement(isLocal = false)), towerDataElements.add(element),
implicitReceiverStack, implicitReceiverStack,
localScopes localScopes,
nonLocalTowerDataElements.add(element)
) )
} }
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.resolve.calls.tower package org.jetbrains.kotlin.fir.resolve.calls.tower
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.asReversedFrozen
import org.jetbrains.kotlin.fir.declarations.isInner import org.jetbrains.kotlin.fir.declarations.isInner
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
@@ -43,16 +44,12 @@ class FirTowerResolverSession internal constructor(
private val session: FirSession get() = components.session private val session: FirSession get() = components.session
private val reversedTowerDataElements = components.towerDataElements.asReversed() private val localScopes: List<FirScope> = components.localScopes.asReversedFrozen()
private val localScopes: List<FirScope> = reversedTowerDataElements.mapNotNull { lexical -> private val nonLocalTowerDataElements = components.towerDataContext.nonLocalTowerDataElements.asReversedFrozen()
lexical.scope?.takeIf { lexical.isLocal }
}
private val nonLocalLexical = reversedTowerDataElements.filter { !it.isLocal }
private val implicitReceivers: List<ImplicitReceiver> by lazy(LazyThreadSafetyMode.NONE) { private val implicitReceivers: List<ImplicitReceiver> by lazy(LazyThreadSafetyMode.NONE) {
reversedTowerDataElements.withIndex().mapNotNull { (index, element) -> nonLocalTowerDataElements.withIndex().mapNotNull { (index, element) ->
element.implicitReceiver?.let { ImplicitReceiver(it, index) } element.implicitReceiver?.let { ImplicitReceiver(it, index) }
} }
} }
@@ -404,7 +401,7 @@ class FirTowerResolverSession internal constructor(
onLocalScope(index, localScope) onLocalScope(index, localScope)
} }
for ((depth, lexical) in nonLocalLexical.withIndex()) { for ((depth, lexical) in nonLocalTowerDataElements.withIndex()) {
if (!lexical.isLocal && lexical.scope != null) { if (!lexical.isLocal && lexical.scope != null) {
onNonLocalScope(depth, lexical.scope) onNonLocalScope(depth, lexical.scope)
} }
@@ -245,6 +245,9 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
override val fileImportsScope: List<FirScope> get() = context.fileImportsScope override val fileImportsScope: List<FirScope> get() = context.fileImportsScope
override val towerDataElements: List<FirTowerDataElement> get() = context.towerDataContext.towerDataElements override val towerDataElements: List<FirTowerDataElement> get() = context.towerDataContext.towerDataElements
override val localScopes: FirLocalScopes get() = context.towerDataContext.localScopes override val localScopes: FirLocalScopes get() = context.towerDataContext.localScopes
override val towerDataContext: FirTowerDataContext get() = context.towerDataContext
override val file: FirFile get() = context.file override val file: FirFile get() = context.file
override val implicitReceiverStack: ImplicitReceiverStack get() = context.implicitReceiverStack override val implicitReceiverStack: ImplicitReceiverStack get() = context.implicitReceiverStack
override val containingDeclarations: List<FirDeclaration> get() = context.containers override val containingDeclarations: List<FirDeclaration> get() = context.containers