Optimization: make every FIR node extend FirPureAbstractElement

This commit is contained in:
Simon Ogorodnik
2019-06-20 14:37:49 +03:00
committed by Mikhail Glukhikh
parent d41c50d6cf
commit 0e60af95bf
11 changed files with 44 additions and 37 deletions
@@ -6,10 +6,10 @@
package org.jetbrains.kotlin.fir package org.jetbrains.kotlin.fir
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression abstract class FirPureAbstractElement : FirElement
abstract class FirAbstractElement( abstract class FirAbstractElement(
final override val session: FirSession, final override val session: FirSession,
final override val psi: PsiElement? final override val psi: PsiElement?
) : FirElement ) : FirPureAbstractElement()
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
fun <T : FirElement, D> MutableList<T>.transformInplace(transformer: FirTransformer<D>, data: D) { fun <T : FirElement, D> MutableList<T>.transformInplace(transformer: FirTransformer<D>, data: D) {
val iterator = this.listIterator() val iterator = this.listIterator()
while (iterator.hasNext()) { while (iterator.hasNext()) {
val next = iterator.next() val next = iterator.next() as FirPureAbstractElement
val result = next.transform<T, D>(transformer, data) val result = next.transform<T, D>(transformer, data)
if (result.isSingle) { if (result.isSingle) {
iterator.set(result.single) iterator.set(result.single)
@@ -26,6 +26,7 @@ fun <T : FirElement, D> MutableList<T>.transformInplace(transformer: FirTransfor
iterator.add(resultIterator.next()) iterator.add(resultIterator.next())
} }
} }
} }
} }
@@ -55,7 +56,7 @@ fun <T : FirElement, D> MutableList<T>.transformInplaceWithBeforeOperation(
} }
fun <T : FirElement, D> T.transformSingle(transformer: FirTransformer<D>, data: D): T { fun <T : FirElement, D> T.transformSingle(transformer: FirTransformer<D>, data: D): T {
return this.transform<T, D>(transformer, data).single return (this as FirPureAbstractElement).transform<T, D>(transformer, data).single
} }
fun ModuleInfo.dependenciesWithoutSelf(): Sequence<ModuleInfo> = dependencies().asSequence().filter { it != this } fun ModuleInfo.dependenciesWithoutSelf(): Sequence<ModuleInfo> = dependencies().asSequence().filter { it != this }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.declarations.impl package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
@@ -14,10 +15,10 @@ import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirAnonymousInitializerImpl( class FirAnonymousInitializerImpl(
override val session: FirSession, session: FirSession,
override val psi: PsiElement?, psi: PsiElement?,
override var body: FirBlock? override var body: FirBlock?
) : FirAnonymousInitializer { ) : FirAnonymousInitializer, FirAbstractElement(session, psi) {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
body = body?.transformSingle(transformer, data) body = body?.transformSingle(transformer, data)
return this return this
@@ -6,15 +6,16 @@
package org.jetbrains.kotlin.fir.declarations.impl package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirImport import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirImportImpl( class FirImportImpl(
override val session: FirSession, session: FirSession,
override val psi: PsiElement?, psi: PsiElement?,
override val importedFqName: FqName?, override val importedFqName: FqName?,
override val isAllUnder: Boolean, override val isAllUnder: Boolean,
override val aliasName: Name? override val aliasName: Name?
) : FirImport ) : FirImport, FirAbstractElement(session, psi)
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.types.impl package org.jetbrains.kotlin.fir.types.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
@@ -14,10 +15,10 @@ import org.jetbrains.kotlin.fir.types.FirTypeRefWithNullability
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractAnnotatedTypeRef( abstract class FirAbstractAnnotatedTypeRef(
final override val session: FirSession, session: FirSession,
final override val psi: PsiElement?, psi: PsiElement?,
final override val isMarkedNullable: Boolean final override val isMarkedNullable: Boolean
) : FirTypeRefWithNullability { ) : FirTypeRefWithNullability, FirAbstractElement(session, psi) {
override val annotations = mutableListOf<FirAnnotationCall>() override val annotations = mutableListOf<FirAnnotationCall>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.types.impl package org.jetbrains.kotlin.fir.types.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl
@@ -15,10 +16,10 @@ import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
sealed class FirImplicitBuiltinTypeRef( sealed class FirImplicitBuiltinTypeRef(
override val session: FirSession, session: FirSession,
override val psi: PsiElement?, psi: PsiElement?,
val id: ClassId val id: ClassId
) : FirResolvedTypeRef { ) : FirResolvedTypeRef, FirAbstractElement(session, psi) {
override val annotations: List<FirAnnotationCall> override val annotations: List<FirAnnotationCall>
get() = emptyList() get() = emptyList()
@@ -6,19 +6,21 @@
package org.jetbrains.kotlin.fir.types.impl package org.jetbrains.kotlin.fir.types.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
class FirImplicitTypeRefImpl( class FirImplicitTypeRefImpl(
override val session: FirSession, session: FirSession,
override val psi: PsiElement? psi: PsiElement?
) : FirImplicitTypeRef { ) : FirImplicitTypeRef, FirAbstractElement(session, psi) {
override val annotations: List<FirAnnotationCall> override val annotations: List<FirAnnotationCall>
get() = emptyList() get() = emptyList()
} }
object FirComputingImplicitTypeRef : FirImplicitTypeRef { object FirComputingImplicitTypeRef : FirImplicitTypeRef, FirPureAbstractElement() {
override val psi: PsiElement? override val psi: PsiElement?
get() = null get() = null
override val session: FirSession override val session: FirSession
@@ -6,27 +6,24 @@
package org.jetbrains.kotlin.fir.types.impl package org.jetbrains.kotlin.fir.types.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirResolvedFunctionTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedFunctionTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirResolvedFunctionTypeRefImpl( class FirResolvedFunctionTypeRefImpl(
override val psi: PsiElement?, psi: PsiElement?,
override val session: FirSession, session: FirSession,
override val isMarkedNullable: Boolean, override val isMarkedNullable: Boolean,
override val annotations: MutableList<FirAnnotationCall>, override val annotations: MutableList<FirAnnotationCall>,
override var receiverTypeRef: FirTypeRef?, override var receiverTypeRef: FirTypeRef?,
override val valueParameters: MutableList<FirValueParameter>, override val valueParameters: MutableList<FirValueParameter>,
override var returnTypeRef: FirTypeRef, override var returnTypeRef: FirTypeRef,
override val type: ConeKotlinType override val type: ConeKotlinType
) : FirResolvedFunctionTypeRef { ) : FirResolvedFunctionTypeRef, FirAbstractElement(session, psi) {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data)
@@ -6,14 +6,15 @@
package org.jetbrains.kotlin.fir.types.impl package org.jetbrains.kotlin.fir.types.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
class FirResolvedTypeRefImpl( class FirResolvedTypeRefImpl(
override val session: FirSession, session: FirSession,
override val psi: PsiElement?, psi: PsiElement?,
override val type: ConeKotlinType, override val type: ConeKotlinType,
override val annotations: List<FirAnnotationCall> = emptyList() override val annotations: List<FirAnnotationCall> = emptyList()
) : FirResolvedTypeRef ) : FirResolvedTypeRef, FirAbstractElement(session, psi)
@@ -6,10 +6,11 @@
package org.jetbrains.kotlin.fir.types.impl package org.jetbrains.kotlin.fir.types.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.types.FirStarProjection import org.jetbrains.kotlin.fir.types.FirStarProjection
class FirStarProjectionImpl( class FirStarProjectionImpl(
override val session: FirSession, session: FirSession,
override val psi: PsiElement? psi: PsiElement?
) : FirStarProjection ) : FirStarProjection, FirAbstractElement(session, psi)
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.types.impl package org.jetbrains.kotlin.fir.types.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
@@ -15,11 +16,11 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
class FirTypeProjectionWithVarianceImpl( class FirTypeProjectionWithVarianceImpl(
override val session: FirSession, session: FirSession,
override val psi: PsiElement?, psi: PsiElement?,
override val variance: Variance, override val variance: Variance,
override var typeRef: FirTypeRef override var typeRef: FirTypeRef
) : FirTypeProjectionWithVariance { ) : FirTypeProjectionWithVariance, FirAbstractElement(session, psi) {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data) typeRef = typeRef.transformSingle(transformer, data)