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 fileImportsScope: List<FirScope>
val towerDataElements: List<FirTowerDataElement>
val towerDataContext: FirTowerDataContext
val localScopes: FirLocalScopes
val towerDataContextForAnonymousFunctions: TowerDataContextForAnonymousFunctions
val noExpectedType: FirTypeRef
@@ -68,12 +69,14 @@ class FirTowerDataContext private constructor(
// i.e. implicitReceiverStack == towerDataElements.mapNotNull { it.receiver }
// i.e. localScopes == towerDataElements.mapNotNull { it.scope?.takeIf { it.isLocal } }
val implicitReceiverStack: PersistentImplicitReceiverStack,
val localScopes: FirLocalScopes
val localScopes: FirLocalScopes,
val nonLocalTowerDataElements: PersistentList<FirTowerDataElement>
) {
constructor() : this(
persistentListOf(),
PersistentImplicitReceiverStack(),
persistentListOf(),
persistentListOf()
)
@@ -84,7 +87,8 @@ class FirTowerDataContext private constructor(
return FirTowerDataContext(
towerDataElements.set(indexOfLastLocalScope, newLastScope.asTowerDataElement(isLocal = true)),
implicitReceiverStack,
localScopes.set(localScopes.lastIndex, newLastScope)
localScopes.set(localScopes.lastIndex, newLastScope),
nonLocalTowerDataElements
)
}
@@ -92,7 +96,8 @@ class FirTowerDataContext private constructor(
return FirTowerDataContext(
towerDataElements.addAll(newElements),
implicitReceiverStack.addAll(newElements.mapNotNull { it.implicitReceiver }),
localScopes
localScopes,
nonLocalTowerDataElements.addAll(newElements)
)
}
@@ -100,15 +105,18 @@ class FirTowerDataContext private constructor(
return FirTowerDataContext(
towerDataElements.add(localScope.asTowerDataElement(isLocal = true)),
implicitReceiverStack,
localScopes.add(localScope)
localScopes.add(localScope),
nonLocalTowerDataElements
)
}
fun addReceiver(name: Name?, implicitReceiverValue: ImplicitReceiverValue<*>): FirTowerDataContext {
val element = implicitReceiverValue.asTowerDataElement()
return FirTowerDataContext(
towerDataElements.add(implicitReceiverValue.asTowerDataElement()),
towerDataElements.add(element),
implicitReceiverStack.add(name, implicitReceiverValue),
localScopes
localScopes,
nonLocalTowerDataElements.add(element)
)
}
@@ -118,10 +126,12 @@ class FirTowerDataContext private constructor(
}
private fun addNonLocalScope(scope: FirScope): FirTowerDataContext {
val element = scope.asTowerDataElement(isLocal = false)
return FirTowerDataContext(
towerDataElements.add(scope.asTowerDataElement(isLocal = false)),
towerDataElements.add(element),
implicitReceiverStack,
localScopes
localScopes,
nonLocalTowerDataElements.add(element)
)
}
}
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.resolve.calls.tower
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.asReversedFrozen
import org.jetbrains.kotlin.fir.declarations.isInner
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
@@ -43,16 +44,12 @@ class FirTowerResolverSession internal constructor(
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 ->
lexical.scope?.takeIf { lexical.isLocal }
}
private val nonLocalLexical = reversedTowerDataElements.filter { !it.isLocal }
private val nonLocalTowerDataElements = components.towerDataContext.nonLocalTowerDataElements.asReversedFrozen()
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) }
}
}
@@ -404,7 +401,7 @@ class FirTowerResolverSession internal constructor(
onLocalScope(index, localScope)
}
for ((depth, lexical) in nonLocalLexical.withIndex()) {
for ((depth, lexical) in nonLocalTowerDataElements.withIndex()) {
if (!lexical.isLocal && lexical.scope != null) {
onNonLocalScope(depth, lexical.scope)
}
@@ -245,6 +245,9 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
override val fileImportsScope: List<FirScope> get() = context.fileImportsScope
override val towerDataElements: List<FirTowerDataElement> get() = context.towerDataContext.towerDataElements
override val localScopes: FirLocalScopes get() = context.towerDataContext.localScopes
override val towerDataContext: FirTowerDataContext get() = context.towerDataContext
override val file: FirFile get() = context.file
override val implicitReceiverStack: ImplicitReceiverStack get() = context.implicitReceiverStack
override val containingDeclarations: List<FirDeclaration> get() = context.containers