FIR: Optimize constructor of FirTowerResolverSession
This commit is contained in:
@@ -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)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-8
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user