FIR: convert some hot void visitors to any

reduces call indirection (Nothing -> Void bridges) and therefore
callstack depth
This commit is contained in:
Ilya Chernikov
2021-03-12 21:52:26 +01:00
parent 34694cbec5
commit 038a8af80e
21 changed files with 171 additions and 170 deletions
@@ -65,7 +65,7 @@ abstract class AbstractDiagnosticCollector(
protected open fun beforeRunningAllComponentsOnElement(element: FirElement) {} protected open fun beforeRunningAllComponentsOnElement(element: FirElement) {}
protected open fun beforeRunningSingleComponentOnElement(element: FirElement) {} protected open fun beforeRunningSingleComponentOnElement(element: FirElement) {}
private inner class Visitor : FirDefaultVisitor<Unit, Nothing?>() { private inner class Visitor : FirDefaultVisitor<Unit, Any?>() {
private fun <T : FirElement> T.runComponents() { private fun <T : FirElement> T.runComponents() {
if (currentAction.checkInCurrentDeclaration) { if (currentAction.checkInCurrentDeclaration) {
beforeRunningAllComponentsOnElement(this) beforeRunningAllComponentsOnElement(this)
@@ -76,7 +76,7 @@ abstract class AbstractDiagnosticCollector(
} }
} }
override fun visitElement(element: FirElement, data: Nothing?) { override fun visitElement(element: FirElement, data: Any?) {
if (element is FirAnnotationContainer) { if (element is FirAnnotationContainer) {
visitAnnotationContainer(element, data) visitAnnotationContainer(element, data)
return return
@@ -85,7 +85,7 @@ abstract class AbstractDiagnosticCollector(
element.acceptChildren(this, null) element.acceptChildren(this, null)
} }
override fun visitAnnotationContainer(annotationContainer: FirAnnotationContainer, data: Nothing?) { override fun visitAnnotationContainer(annotationContainer: FirAnnotationContainer, data: Any?) {
withSuppressedDiagnostics(annotationContainer) { withSuppressedDiagnostics(annotationContainer) {
annotationContainer.runComponents() annotationContainer.runComponents()
annotationContainer.acceptChildren(this, null) annotationContainer.acceptChildren(this, null)
@@ -99,11 +99,11 @@ abstract class AbstractDiagnosticCollector(
} }
} }
override fun visitBreakExpression(breakExpression: FirBreakExpression, data: Nothing?) { override fun visitBreakExpression(breakExpression: FirBreakExpression, data: Any?) {
visitJump(breakExpression) visitJump(breakExpression)
} }
override fun visitContinueExpression(continueExpression: FirContinueExpression, data: Nothing?) { override fun visitContinueExpression(continueExpression: FirContinueExpression, data: Any?) {
visitJump(continueExpression) visitJump(continueExpression)
} }
@@ -114,31 +114,31 @@ abstract class AbstractDiagnosticCollector(
visitWithDeclarationAndReceiver(klass, (klass as? FirRegularClass)?.name, typeRef) visitWithDeclarationAndReceiver(klass, (klass as? FirRegularClass)?.name, typeRef)
} }
override fun visitRegularClass(regularClass: FirRegularClass, data: Nothing?) { override fun visitRegularClass(regularClass: FirRegularClass, data: Any?) {
withSuppressedDiagnostics(regularClass) { withSuppressedDiagnostics(regularClass) {
visitClassAndChildren(regularClass, regularClass.defaultType()) visitClassAndChildren(regularClass, regularClass.defaultType())
} }
} }
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: Nothing?) { override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?) {
withSuppressedDiagnostics(anonymousObject) { withSuppressedDiagnostics(anonymousObject) {
visitClassAndChildren(anonymousObject, anonymousObject.defaultType()) visitClassAndChildren(anonymousObject, anonymousObject.defaultType())
} }
} }
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Nothing?) { override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?) {
withSuppressedDiagnostics(simpleFunction) { withSuppressedDiagnostics(simpleFunction) {
visitWithDeclarationAndReceiver(simpleFunction, simpleFunction.name, simpleFunction.receiverTypeRef) visitWithDeclarationAndReceiver(simpleFunction, simpleFunction.name, simpleFunction.receiverTypeRef)
} }
} }
override fun visitConstructor(constructor: FirConstructor, data: Nothing?) { override fun visitConstructor(constructor: FirConstructor, data: Any?) {
withSuppressedDiagnostics(constructor) { withSuppressedDiagnostics(constructor) {
visitWithDeclaration(constructor) visitWithDeclaration(constructor)
} }
} }
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: Nothing?) { override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: Any?) {
withSuppressedDiagnostics(anonymousFunction) { withSuppressedDiagnostics(anonymousFunction) {
val labelName = anonymousFunction.label?.name?.let { Name.identifier(it) } val labelName = anonymousFunction.label?.name?.let { Name.identifier(it) }
visitWithDeclarationAndReceiver( visitWithDeclarationAndReceiver(
@@ -149,13 +149,13 @@ abstract class AbstractDiagnosticCollector(
} }
} }
override fun visitProperty(property: FirProperty, data: Nothing?) { override fun visitProperty(property: FirProperty, data: Any?) {
withSuppressedDiagnostics(property) { withSuppressedDiagnostics(property) {
visitWithDeclaration(property) visitWithDeclaration(property)
} }
} }
override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: Nothing?) { override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: Any?) {
if (propertyAccessor !is FirDefaultPropertyAccessor) { if (propertyAccessor !is FirDefaultPropertyAccessor) {
val property = context.containingDeclarations.last() as FirProperty val property = context.containingDeclarations.last() as FirProperty
withSuppressedDiagnostics(propertyAccessor) { withSuppressedDiagnostics(propertyAccessor) {
@@ -164,35 +164,35 @@ abstract class AbstractDiagnosticCollector(
} }
} }
override fun visitValueParameter(valueParameter: FirValueParameter, data: Nothing?) { override fun visitValueParameter(valueParameter: FirValueParameter, data: Any?) {
withSuppressedDiagnostics(valueParameter) { withSuppressedDiagnostics(valueParameter) {
visitWithDeclaration(valueParameter) visitWithDeclaration(valueParameter)
} }
} }
override fun visitEnumEntry(enumEntry: FirEnumEntry, data: Nothing?) { override fun visitEnumEntry(enumEntry: FirEnumEntry, data: Any?) {
withSuppressedDiagnostics(enumEntry) { withSuppressedDiagnostics(enumEntry) {
visitWithDeclaration(enumEntry) visitWithDeclaration(enumEntry)
} }
} }
override fun visitFile(file: FirFile, data: Nothing?) { override fun visitFile(file: FirFile, data: Any?) {
withSuppressedDiagnostics(file) { withSuppressedDiagnostics(file) {
visitWithDeclaration(file) visitWithDeclaration(file)
} }
} }
override fun visitAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer, data: Nothing?) { override fun visitAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer, data: Any?) {
visitWithDeclaration(anonymousInitializer) visitWithDeclaration(anonymousInitializer)
} }
override fun visitBlock(block: FirBlock, data: Nothing?) { override fun visitBlock(block: FirBlock, data: Any?) {
withSuppressedDiagnostics(block) { withSuppressedDiagnostics(block) {
visitExpression(block, data) visitExpression(block, data)
} }
} }
override fun visitTypeRef(typeRef: FirTypeRef, data: Nothing?) { override fun visitTypeRef(typeRef: FirTypeRef, data: Any?) {
if (typeRef.source != null && typeRef.source?.kind !is FirFakeSourceElementKind) { if (typeRef.source != null && typeRef.source?.kind !is FirFakeSourceElementKind) {
withSuppressedDiagnostics(typeRef) { withSuppressedDiagnostics(typeRef) {
typeRef.runComponents() typeRef.runComponents()
@@ -201,20 +201,20 @@ abstract class AbstractDiagnosticCollector(
} }
} }
override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: Nothing?) { override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: Any?) {
super.visitResolvedTypeRef(resolvedTypeRef, data) super.visitResolvedTypeRef(resolvedTypeRef, data)
resolvedTypeRef.delegatedTypeRef?.accept(this, data) resolvedTypeRef.delegatedTypeRef?.accept(this, data)
} }
override fun visitFunctionCall(functionCall: FirFunctionCall, data: Nothing?) { override fun visitFunctionCall(functionCall: FirFunctionCall, data: Any?) {
visitWithQualifiedAccess(functionCall) visitWithQualifiedAccess(functionCall)
} }
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: Nothing?) { override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: Any?) {
visitWithQualifiedAccess(qualifiedAccessExpression) visitWithQualifiedAccess(qualifiedAccessExpression)
} }
override fun visitGetClassCall(getClassCall: FirGetClassCall, data: Nothing?) { override fun visitGetClassCall(getClassCall: FirGetClassCall, data: Any?) {
visitWithGetClassCall(getClassCall) visitWithGetClassCall(getClassCall)
} }
@@ -10,12 +10,12 @@ import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.backend.Fir2IrSignatureComposer import org.jetbrains.kotlin.fir.backend.Fir2IrSignatureComposer
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignature
@NoMutableState @NoMutableState
class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatureComposer { class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatureComposer {
inner class SignatureBuilder : FirVisitorVoid() { inner class SignatureBuilder : FirVisitor<Unit, Any?>() {
var hashId: Long? = null var hashId: Long? = null
var mask = 0L var mask = 0L
@@ -23,35 +23,35 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu
mask = mask or IdSignature.Flags.IS_EXPECT.encode(f) mask = mask or IdSignature.Flags.IS_EXPECT.encode(f)
} }
override fun visitElement(element: FirElement) { override fun visitElement(element: FirElement, data: Any?) {
TODO("Should not be here") TODO("Should not be here")
} }
override fun visitRegularClass(regularClass: FirRegularClass) { override fun visitRegularClass(regularClass: FirRegularClass, data: Any?) {
setExpected(regularClass.isExpect) setExpected(regularClass.isExpect)
//platformSpecificClass(descriptor) //platformSpecificClass(descriptor)
} }
override fun visitTypeAlias(typeAlias: FirTypeAlias) { override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Any?) {
setExpected(typeAlias.isExpect) setExpected(typeAlias.isExpect)
} }
override fun visitConstructor(constructor: FirConstructor) { override fun visitConstructor(constructor: FirConstructor, data: Any?) {
hashId = mangler.run { constructor.signatureMangle } hashId = mangler.run { constructor.signatureMangle }
setExpected(constructor.isExpect) setExpected(constructor.isExpect)
} }
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction) { override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?) {
hashId = mangler.run { simpleFunction.signatureMangle } hashId = mangler.run { simpleFunction.signatureMangle }
setExpected(simpleFunction.isExpect) setExpected(simpleFunction.isExpect)
} }
override fun visitProperty(property: FirProperty) { override fun visitProperty(property: FirProperty, data: Any?) {
hashId = mangler.run { property.signatureMangle } hashId = mangler.run { property.signatureMangle }
setExpected(property.isExpect) setExpected(property.isExpect)
} }
override fun visitEnumEntry(enumEntry: FirEnumEntry) { override fun visitEnumEntry(enumEntry: FirEnumEntry, data: Any?) {
setExpected(enumEntry.isExpect) setExpected(enumEntry.isExpect)
} }
} }
@@ -65,7 +65,7 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu
} }
val builder = SignatureBuilder() val builder = SignatureBuilder()
try { try {
declaration.accept(builder) declaration.accept(builder, null)
} catch (t: Throwable) { } catch (t: Throwable) {
throw IllegalStateException("Error while composing signature for ${declaration.render()}", t) throw IllegalStateException("Error while composing signature for ${declaration.render()}", t)
} }
@@ -14,10 +14,10 @@ import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
fun FirElement.validate() { fun FirElement.validate() {
accept(FirGeneratedElementsValidator) accept(FirGeneratedElementsValidator, null)
} }
/* /*
@@ -25,44 +25,44 @@ fun FirElement.validate() {
* - add proper error messages to all `require` * - add proper error messages to all `require`
* - add validation of declaration origin and resolve phase for all declarations * - add validation of declaration origin and resolve phase for all declarations
*/ */
object FirGeneratedElementsValidator : FirDefaultVisitorVoid() { object FirGeneratedElementsValidator : FirDefaultVisitor<Unit, Any?>() {
override fun visitElement(element: FirElement) { override fun visitElement(element: FirElement, data: Any?) {
element.acceptChildren(this) element.acceptChildren(this, null)
} }
override fun visitAnnotationCall(annotationCall: FirAnnotationCall) { override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: Any?) {
require(annotationCall.resolveStatus == FirAnnotationResolveStatus.Resolved) require(annotationCall.resolveStatus == FirAnnotationResolveStatus.Resolved)
annotationCall.acceptChildren(this) annotationCall.acceptChildren(this, null)
} }
override fun visitRegularClass(regularClass: FirRegularClass) { override fun visitRegularClass(regularClass: FirRegularClass, data: Any?) {
regularClass.acceptChildren(this) regularClass.acceptChildren(this, null)
} }
override fun visitArgumentList(argumentList: FirArgumentList) { override fun visitArgumentList(argumentList: FirArgumentList, data: Any?) {
require(argumentList is FirResolvedArgumentList) require(argumentList is FirResolvedArgumentList)
argumentList.acceptChildren(this) argumentList.acceptChildren(this, null)
} }
override fun visitNamedReference(namedReference: FirNamedReference) { override fun visitNamedReference(namedReference: FirNamedReference, data: Any?) {
require(namedReference is FirResolvedNamedReference) require(namedReference is FirResolvedNamedReference)
namedReference.acceptChildren(this) namedReference.acceptChildren(this, null)
} }
override fun visitTypeRef(typeRef: FirTypeRef) { override fun visitTypeRef(typeRef: FirTypeRef, data: Any?) {
require(typeRef is FirResolvedTypeRef) require(typeRef is FirResolvedTypeRef)
typeRef.acceptChildren(this) typeRef.acceptChildren(this, null)
} }
override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef) { override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: Any?) {
resolvedTypeRef.annotations.forEach { it.accept(this) } resolvedTypeRef.annotations.forEach { it.accept(this, null) }
} }
override fun visitDeclarationStatus(declarationStatus: FirDeclarationStatus) { override fun visitDeclarationStatus(declarationStatus: FirDeclarationStatus, data: Any?) {
require(declarationStatus is FirResolvedDeclarationStatus) require(declarationStatus is FirResolvedDeclarationStatus)
} }
override fun visitTypeParameterRef(typeParameterRef: FirTypeParameterRef) { override fun visitTypeParameterRef(typeParameterRef: FirTypeParameterRef, data: Any?) {
typeParameterRef.symbol.fir.accept(this) typeParameterRef.symbol.fir.accept(this, null)
} }
} }
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.types.isNothing import org.jetbrains.kotlin.fir.types.isNothing
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
import org.jetbrains.kotlin.utils.addToStdlib.runIf import org.jetbrains.kotlin.utils.addToStdlib.runIf
import kotlin.random.Random import kotlin.random.Random
@@ -1213,20 +1213,20 @@ class ControlFlowGraphBuilder {
fun dropSubgraphFromCall(call: FirFunctionCall) { fun dropSubgraphFromCall(call: FirFunctionCall) {
val graphs = mutableListOf<ControlFlowGraph>() val graphs = mutableListOf<ControlFlowGraph>()
call.acceptChildren(object : FirDefaultVisitorVoid() { call.acceptChildren(object : FirDefaultVisitor<Unit, Any?>() {
override fun visitElement(element: FirElement) { override fun visitElement(element: FirElement, data: Any?) {
element.acceptChildren(this) element.acceptChildren(this, null)
} }
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction) { override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: Any?) {
anonymousFunction.controlFlowGraphReference?.accept(this) anonymousFunction.controlFlowGraphReference?.accept(this, null)
} }
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject) { override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?) {
anonymousObject.controlFlowGraphReference?.accept(this) anonymousObject.controlFlowGraphReference?.accept(this, null)
} }
override fun visitControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference) { override fun visitControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference, data: Any?) {
val graph = controlFlowGraphReference.controlFlowGraph ?: return val graph = controlFlowGraphReference.controlFlowGraph ?: return
if (graph.owner == null) return if (graph.owner == null) return
graphs += graph graphs += graph
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType
abstract class FirAbstractTreeTransformerWithSuperTypes( abstract class FirAbstractTreeTransformerWithSuperTypes(
phase: FirResolvePhase, phase: FirResolvePhase,
protected val scopeSession: ScopeSession protected val scopeSession: ScopeSession
) : FirAbstractTreeTransformer<Nothing?>(phase) { ) : FirAbstractTreeTransformer<Any?>(phase) {
protected val scopes = mutableListOf<FirScope>() protected val scopes = mutableListOf<FirScope>()
protected val towerScope = FirCompositeScope(scopes.asReversed()) protected val towerScope = FirCompositeScope(scopes.asReversed())
@@ -48,7 +48,7 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(
protected fun resolveNestedClassesSupertypes( protected fun resolveNestedClassesSupertypes(
firClass: FirClass<*>, firClass: FirClass<*>,
data: Nothing? data: Any?
): FirStatement { ): FirStatement {
firClass.replaceResolvePhase(transformerPhase) firClass.replaceResolvePhase(transformerPhase)
return withScopeCleanup { return withScopeCleanup {
@@ -355,14 +355,14 @@ class FirCallCompletionResultsWriterTransformer(
} }
} }
private inner class TypeUpdaterForDelegateArguments : FirTransformer<Nothing?>() { private inner class TypeUpdaterForDelegateArguments : FirTransformer<Any?>() {
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformQualifiedAccessExpression( override fun transformQualifiedAccessExpression(
qualifiedAccessExpression: FirQualifiedAccessExpression, qualifiedAccessExpression: FirQualifiedAccessExpression,
data: Nothing? data: Any?
): FirStatement { ): FirStatement {
val originalType = qualifiedAccessExpression.typeRef.coneType val originalType = qualifiedAccessExpression.typeRef.coneType
val substitutedReceiverType = finalSubstitutor.substituteOrNull(originalType) ?: return qualifiedAccessExpression val substitutedReceiverType = finalSubstitutor.substituteOrNull(originalType) ?: return qualifiedAccessExpression
@@ -563,15 +563,15 @@ class FirCallCompletionResultsWriterTransformer(
private fun transformImplicitTypeRefInAnonymousFunction( private fun transformImplicitTypeRefInAnonymousFunction(
anonymousFunction: FirAnonymousFunction anonymousFunction: FirAnonymousFunction
): FirStatement { ): FirStatement {
val implicitTypeTransformer = object : FirDefaultTransformer<Nothing?>() { val implicitTypeTransformer = object : FirDefaultTransformer<Any?>() {
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
return (element.transformChildren(this, data) as E) return (element.transformChildren(this, data) as E)
} }
override fun transformImplicitTypeRef( override fun transformImplicitTypeRef(
implicitTypeRef: FirImplicitTypeRef, implicitTypeRef: FirImplicitTypeRef,
data: Nothing? data: Any?
): FirTypeRef = ): FirTypeRef =
buildErrorTypeRef { buildErrorTypeRef {
source = implicitTypeRef.source source = implicitTypeRef.source
@@ -745,19 +745,19 @@ private fun FirExpression.unwrapArgument(): FirExpression = when (this) {
else -> this else -> this
} }
class FirDeclarationCompletionResultsWriter(private val finalSubstitutor: ConeSubstitutor) : FirDefaultTransformer<Nothing?>() { class FirDeclarationCompletionResultsWriter(private val finalSubstitutor: ConeSubstitutor) : FirDefaultTransformer<Any?>() {
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformSimpleFunction(simpleFunction: FirSimpleFunction, data: Nothing?): FirDeclaration { override fun transformSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?): FirDeclaration {
simpleFunction.transformReturnTypeRef(this, data) simpleFunction.transformReturnTypeRef(this, data)
simpleFunction.transformValueParameters(this, data) simpleFunction.transformValueParameters(this, data)
simpleFunction.transformReceiverTypeRef(this, data) simpleFunction.transformReceiverTypeRef(this, data)
return simpleFunction return simpleFunction
} }
override fun transformProperty(property: FirProperty, data: Nothing?): FirDeclaration { override fun transformProperty(property: FirProperty, data: Any?): FirDeclaration {
property.transformGetter(this, data) property.transformGetter(this, data)
property.transformSetter(this, data) property.transformSetter(this, data)
property.transformReturnTypeRef(this, data) property.transformReturnTypeRef(this, data)
@@ -767,7 +767,7 @@ class FirDeclarationCompletionResultsWriter(private val finalSubstitutor: ConeSu
override fun transformPropertyAccessor( override fun transformPropertyAccessor(
propertyAccessor: FirPropertyAccessor, propertyAccessor: FirPropertyAccessor,
data: Nothing? data: Any?
): FirDeclaration { ): FirDeclaration {
propertyAccessor.transformReturnTypeRef(this, data) propertyAccessor.transformReturnTypeRef(this, data)
propertyAccessor.transformValueParameters(this, data) propertyAccessor.transformValueParameters(this, data)
@@ -776,13 +776,13 @@ class FirDeclarationCompletionResultsWriter(private val finalSubstitutor: ConeSu
override fun transformValueParameter( override fun transformValueParameter(
valueParameter: FirValueParameter, valueParameter: FirValueParameter,
data: Nothing? data: Any?
): FirStatement { ): FirStatement {
valueParameter.transformReturnTypeRef(this, data) valueParameter.transformReturnTypeRef(this, data)
return valueParameter return valueParameter
} }
override fun transformTypeRef(typeRef: FirTypeRef, data: Nothing?): FirTypeRef { override fun transformTypeRef(typeRef: FirTypeRef, data: Any?): FirTypeRef {
return finalSubstitutor.substituteOrNull(typeRef.coneType)?.let { return finalSubstitutor.substituteOrNull(typeRef.coneType)?.let {
typeRef.resolvedTypeFromPrototype(it) typeRef.resolvedTypeFromPrototype(it)
} ?: typeRef } ?: typeRef
@@ -26,8 +26,8 @@ class FirImportResolveProcessor(session: FirSession, scopeSession: ScopeSession)
open class FirImportResolveTransformer protected constructor( open class FirImportResolveTransformer protected constructor(
final override val session: FirSession, final override val session: FirSession,
phase: FirResolvePhase phase: FirResolvePhase
) : FirAbstractTreeTransformer<Nothing?>(phase) { ) : FirAbstractTreeTransformer<Any?>(phase) {
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
@@ -37,7 +37,7 @@ open class FirImportResolveTransformer protected constructor(
private var currentFile: FirFile? = null private var currentFile: FirFile? = null
override fun transformFile(file: FirFile, data: Nothing?): FirFile { override fun transformFile(file: FirFile, data: Any?): FirFile {
checkSessionConsistency(file) checkSessionConsistency(file)
file.replaceResolvePhase(transformerPhase) file.replaceResolvePhase(transformerPhase)
return file.also { return file.also {
@@ -51,7 +51,7 @@ open class FirImportResolveTransformer protected constructor(
} }
} }
override fun transformImport(import: FirImport, data: Nothing?): FirImport { override fun transformImport(import: FirImport, data: Any?): FirImport {
val fqName = import.importedFqName?.takeUnless { it.isRoot } ?: return import val fqName = import.importedFqName?.takeUnless { it.isRoot } ?: return import
if (!fqName.isAcceptable) return import if (!fqName.isAcceptable) return import
@@ -73,16 +73,16 @@ class FirSealedClassInheritorsProcessor(
} }
} }
class InheritorsTransformer(private val inheritorsMap: MutableMap<FirRegularClass, MutableList<ClassId>>) : FirTransformer<Nothing?>() { class InheritorsTransformer(private val inheritorsMap: MutableMap<FirRegularClass, MutableList<ClassId>>) : FirTransformer<Any?>() {
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformFile(file: FirFile, data: Nothing?): FirDeclaration { override fun transformFile(file: FirFile, data: Any?): FirDeclaration {
return (file.transformChildren(this, data) as FirFile) return (file.transformChildren(this, data) as FirFile)
} }
override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): FirStatement { override fun transformRegularClass(regularClass: FirRegularClass, data: Any?): FirStatement {
if (regularClass.modality == Modality.SEALED) { if (regularClass.modality == Modality.SEALED) {
val inheritors = inheritorsMap.remove(regularClass) val inheritors = inheritorsMap.remove(regularClass)
if (inheritors != null) { if (inheritors != null) {
@@ -40,19 +40,19 @@ class FirSupertypeResolverProcessor(session: FirSession, scopeSession: ScopeSess
class FirSupertypeResolverTransformer( class FirSupertypeResolverTransformer(
override val session: FirSession, override val session: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
) : FirAbstractPhaseTransformer<Nothing?>(FirResolvePhase.SUPER_TYPES) { ) : FirAbstractPhaseTransformer<Any?>(FirResolvePhase.SUPER_TYPES) {
private val supertypeComputationSession = SupertypeComputationSession() private val supertypeComputationSession = SupertypeComputationSession()
private val supertypeResolverVisitor = FirSupertypeResolverVisitor(session, supertypeComputationSession, scopeSession) private val supertypeResolverVisitor = FirSupertypeResolverVisitor(session, supertypeComputationSession, scopeSession)
private val applySupertypesTransformer = FirApplySupertypesTransformer(supertypeComputationSession) private val applySupertypesTransformer = FirApplySupertypesTransformer(supertypeComputationSession)
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformFile(file: FirFile, data: Nothing?): FirFile { override fun transformFile(file: FirFile, data: Any?): FirFile {
checkSessionConsistency(file) checkSessionConsistency(file)
file.accept(supertypeResolverVisitor) file.accept(supertypeResolverVisitor, null)
supertypeComputationSession.breakLoops(session) supertypeComputationSession.breakLoops(session)
return file.transform(applySupertypesTransformer, null) return file.transform(applySupertypesTransformer, null)
} }
@@ -71,7 +71,7 @@ fun <F : FirClassLikeDeclaration<F>> F.runSupertypeResolvePhaseForLocalClass(
localClassesNavigationInfo localClassesNavigationInfo
) )
this.accept(supertypeResolverVisitor) this.accept(supertypeResolverVisitor, null)
supertypeComputationSession.breakLoops(session) supertypeComputationSession.breakLoops(session)
val applySupertypesTransformer = FirApplySupertypesTransformer(supertypeComputationSession) val applySupertypesTransformer = FirApplySupertypesTransformer(supertypeComputationSession)
@@ -80,18 +80,18 @@ fun <F : FirClassLikeDeclaration<F>> F.runSupertypeResolvePhaseForLocalClass(
private class FirApplySupertypesTransformer( private class FirApplySupertypesTransformer(
private val supertypeComputationSession: SupertypeComputationSession private val supertypeComputationSession: SupertypeComputationSession
) : FirDefaultTransformer<Nothing?>() { ) : FirDefaultTransformer<Any?>() {
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformFile(file: FirFile, data: Nothing?): FirDeclaration { override fun transformFile(file: FirFile, data: Any?): FirDeclaration {
file.replaceResolvePhase(FirResolvePhase.SUPER_TYPES) file.replaceResolvePhase(FirResolvePhase.SUPER_TYPES)
return (file.transformChildren(this, null) as FirFile) return (file.transformChildren(this, null) as FirFile)
} }
override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): FirStatement { override fun transformRegularClass(regularClass: FirRegularClass, data: Any?): FirStatement {
applyResolvedSupertypesToClass(regularClass) applyResolvedSupertypesToClass(regularClass)
return (regularClass.transformChildren(this, null) as FirRegularClass) return (regularClass.transformChildren(this, null) as FirRegularClass)
@@ -107,7 +107,7 @@ private class FirApplySupertypesTransformer(
firClass.replaceResolvePhase(FirResolvePhase.SUPER_TYPES) firClass.replaceResolvePhase(FirResolvePhase.SUPER_TYPES)
} }
override fun transformAnonymousObject(anonymousObject: FirAnonymousObject, data: Nothing?): FirStatement { override fun transformAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?): FirStatement {
applyResolvedSupertypesToClass(anonymousObject) applyResolvedSupertypesToClass(anonymousObject)
return super.transformAnonymousObject(anonymousObject, data) return super.transformAnonymousObject(anonymousObject, data)
@@ -121,7 +121,7 @@ private class FirApplySupertypesTransformer(
return status.supertypeRefs return status.supertypeRefs
} }
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Nothing?): FirDeclaration { override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Any?): FirDeclaration {
if (typeAlias.expandedTypeRef is FirResolvedTypeRef) return typeAlias if (typeAlias.expandedTypeRef is FirResolvedTypeRef) return typeAlias
val supertypeRefs = getResolvedSupertypeRefs(typeAlias) val supertypeRefs = getResolvedSupertypeRefs(typeAlias)
@@ -176,10 +176,10 @@ private class FirSupertypeResolverVisitor(
private val scopeSession: ScopeSession, private val scopeSession: ScopeSession,
private val scopeForLocalClass: PersistentList<FirScope>? = null, private val scopeForLocalClass: PersistentList<FirScope>? = null,
private val localClassesNavigationInfo: LocalClassesNavigationInfo? = null private val localClassesNavigationInfo: LocalClassesNavigationInfo? = null
) : FirDefaultVisitorVoid() { ) : FirDefaultVisitor<Unit, Any?>() {
private val supertypeGenerationExtensions = session.extensionService.supertypeGenerators private val supertypeGenerationExtensions = session.extensionService.supertypeGenerators
override fun visitElement(element: FirElement) {} override fun visitElement(element: FirElement, data: Any?) {}
private fun prepareFileScopes(file: FirFile): ScopePersistentList { private fun prepareFileScopes(file: FirFile): ScopePersistentList {
return supertypeComputationSession.getOrPutFileScope(file) { return supertypeComputationSession.getOrPutFileScope(file) {
@@ -265,14 +265,14 @@ private class FirSupertypeResolverVisitor(
return resolvedTypesRefs return resolvedTypesRefs
} }
override fun visitRegularClass(regularClass: FirRegularClass) { override fun visitRegularClass(regularClass: FirRegularClass, data: Any?) {
resolveSpecificClassLikeSupertypes(regularClass, regularClass.superTypeRefs) resolveSpecificClassLikeSupertypes(regularClass, regularClass.superTypeRefs)
regularClass.acceptChildren(this) regularClass.acceptChildren(this, null)
} }
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject) { override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?) {
resolveSpecificClassLikeSupertypes(anonymousObject, anonymousObject.superTypeRefs) resolveSpecificClassLikeSupertypes(anonymousObject, anonymousObject.superTypeRefs)
anonymousObject.acceptChildren(this) anonymousObject.acceptChildren(this, null)
} }
fun resolveSpecificClassLikeSupertypes( fun resolveSpecificClassLikeSupertypes(
@@ -326,7 +326,7 @@ private class FirSupertypeResolverVisitor(
} }
} }
override fun visitTypeAlias(typeAlias: FirTypeAlias) { override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Any?) {
// TODO: this if is a temporary hack for built-in types (because we can't load file for them) // TODO: this if is a temporary hack for built-in types (because we can't load file for them)
if (typeAlias.expandedTypeRef is FirResolvedTypeRef) { if (typeAlias.expandedTypeRef is FirResolvedTypeRef) {
return return
@@ -346,7 +346,7 @@ private class FirSupertypeResolverVisitor(
if (type is ConeClassLikeType) { if (type is ConeClassLikeType) {
val expansionTypeAlias = type.lookupTag.toSymbol(session)?.safeAs<FirTypeAliasSymbol>()?.fir val expansionTypeAlias = type.lookupTag.toSymbol(session)?.safeAs<FirTypeAliasSymbol>()?.fir
if (expansionTypeAlias != null) { if (expansionTypeAlias != null) {
visitTypeAlias(expansionTypeAlias) visitTypeAlias(expansionTypeAlias, null)
} }
} }
@@ -354,8 +354,8 @@ private class FirSupertypeResolverVisitor(
} }
} }
override fun visitFile(file: FirFile) { override fun visitFile(file: FirFile, data: Any?) {
file.acceptChildren(this) file.acceptChildren(this, null)
} }
} }
@@ -50,7 +50,7 @@ class FirTypeResolveTransformer(
private val typeResolverTransformer: FirSpecificTypeResolverTransformer = FirSpecificTypeResolverTransformer(session) private val typeResolverTransformer: FirSpecificTypeResolverTransformer = FirSpecificTypeResolverTransformer(session)
private var currentFile: FirFile? = null private var currentFile: FirFile? = null
override fun transformFile(file: FirFile, data: Nothing?): FirFile { override fun transformFile(file: FirFile, data: Any?): FirFile {
checkSessionConsistency(file) checkSessionConsistency(file)
currentFile = file currentFile = file
return withScopeCleanup { return withScopeCleanup {
@@ -59,7 +59,7 @@ class FirTypeResolveTransformer(
} }
} }
override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): FirStatement { override fun transformRegularClass(regularClass: FirRegularClass, data: Any?): FirStatement {
withScopeCleanup { withScopeCleanup {
regularClass.addTypeParametersScope() regularClass.addTypeParametersScope()
regularClass.typeParameters.forEach { regularClass.typeParameters.forEach {
@@ -71,25 +71,25 @@ class FirTypeResolveTransformer(
return resolveNestedClassesSupertypes(regularClass, data) return resolveNestedClassesSupertypes(regularClass, data)
} }
override fun transformAnonymousObject(anonymousObject: FirAnonymousObject, data: Nothing?): FirStatement { override fun transformAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?): FirStatement {
return resolveNestedClassesSupertypes(anonymousObject, data) return resolveNestedClassesSupertypes(anonymousObject, data)
} }
override fun transformConstructor(constructor: FirConstructor, data: Nothing?): FirDeclaration { override fun transformConstructor(constructor: FirConstructor, data: Any?): FirDeclaration {
return withScopeCleanup { return withScopeCleanup {
constructor.addTypeParametersScope() constructor.addTypeParametersScope()
transformDeclaration(constructor, data) transformDeclaration(constructor, data)
} }
} }
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Nothing?): FirDeclaration { override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Any?): FirDeclaration {
return withScopeCleanup { return withScopeCleanup {
typeAlias.addTypeParametersScope() typeAlias.addTypeParametersScope()
transformDeclaration(typeAlias, data) transformDeclaration(typeAlias, data)
} }
} }
override fun transformEnumEntry(enumEntry: FirEnumEntry, data: Nothing?): FirDeclaration { override fun transformEnumEntry(enumEntry: FirEnumEntry, data: Any?): FirDeclaration {
enumEntry.replaceResolvePhase(FirResolvePhase.TYPES) enumEntry.replaceResolvePhase(FirResolvePhase.TYPES)
enumEntry.transformReturnTypeRef(this, data) enumEntry.transformReturnTypeRef(this, data)
enumEntry.transformTypeParameters(this, data) enumEntry.transformTypeParameters(this, data)
@@ -97,7 +97,7 @@ class FirTypeResolveTransformer(
return enumEntry return enumEntry
} }
override fun transformProperty(property: FirProperty, data: Nothing?): FirDeclaration { override fun transformProperty(property: FirProperty, data: Any?): FirDeclaration {
return withScopeCleanup { return withScopeCleanup {
property.addTypeParametersScope() property.addTypeParametersScope()
property.replaceResolvePhase(FirResolvePhase.TYPES) property.replaceResolvePhase(FirResolvePhase.TYPES)
@@ -119,7 +119,7 @@ class FirTypeResolveTransformer(
} }
} }
override fun transformField(field: FirField, data: Nothing?): FirDeclaration { override fun transformField(field: FirField, data: Any?): FirDeclaration {
return withScopeCleanup { return withScopeCleanup {
field.replaceResolvePhase(FirResolvePhase.TYPES) field.replaceResolvePhase(FirResolvePhase.TYPES)
field.transformReturnTypeRef(this, data).transformAnnotations(this, data) field.transformReturnTypeRef(this, data).transformAnnotations(this, data)
@@ -127,7 +127,7 @@ class FirTypeResolveTransformer(
} }
} }
override fun transformSimpleFunction(simpleFunction: FirSimpleFunction, data: Nothing?): FirDeclaration { override fun transformSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?): FirDeclaration {
return withScopeCleanup { return withScopeCleanup {
simpleFunction.addTypeParametersScope() simpleFunction.addTypeParametersScope()
transformDeclaration(simpleFunction, data).also { transformDeclaration(simpleFunction, data).also {
@@ -163,38 +163,38 @@ class FirTypeResolveTransformer(
} }
} }
override fun transformImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef, data: Nothing?): FirTypeRef { override fun transformImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef, data: Any?): FirTypeRef {
if (implicitTypeRef is FirImplicitBuiltinTypeRef) return transformTypeRef(implicitTypeRef, data) if (implicitTypeRef is FirImplicitBuiltinTypeRef) return transformTypeRef(implicitTypeRef, data)
return implicitTypeRef return implicitTypeRef
} }
override fun transformTypeRef(typeRef: FirTypeRef, data: Nothing?): FirResolvedTypeRef { override fun transformTypeRef(typeRef: FirTypeRef, data: Any?): FirResolvedTypeRef {
return typeResolverTransformer.withFile(currentFile) { typeRef.transform(typeResolverTransformer, towerScope) } return typeResolverTransformer.withFile(currentFile) { typeRef.transform(typeResolverTransformer, towerScope) }
} }
override fun transformValueParameter(valueParameter: FirValueParameter, data: Nothing?): FirStatement { override fun transformValueParameter(valueParameter: FirValueParameter, data: Any?): FirStatement {
valueParameter.transformReturnTypeRef(this, data) valueParameter.transformReturnTypeRef(this, data)
valueParameter.transformAnnotations(this, data) valueParameter.transformAnnotations(this, data)
valueParameter.transformVarargTypeToArrayType() valueParameter.transformVarargTypeToArrayType()
return valueParameter return valueParameter
} }
override fun transformBlock(block: FirBlock, data: Nothing?): FirStatement { override fun transformBlock(block: FirBlock, data: Any?): FirStatement {
return block return block
} }
override fun transformDelegatedConstructorCall( override fun transformDelegatedConstructorCall(
delegatedConstructorCall: FirDelegatedConstructorCall, delegatedConstructorCall: FirDelegatedConstructorCall,
data: Nothing? data: Any?
): FirStatement { ): FirStatement {
delegatedConstructorCall.replaceConstructedTypeRef( delegatedConstructorCall.replaceConstructedTypeRef(
delegatedConstructorCall.constructedTypeRef.transform<FirTypeRef, Nothing?>(this, data) delegatedConstructorCall.constructedTypeRef.transform<FirTypeRef, Any?>(this, data)
) )
delegatedConstructorCall.transformCalleeReference(this, data) delegatedConstructorCall.transformCalleeReference(this, data)
return delegatedConstructorCall return delegatedConstructorCall
} }
override fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: Nothing?): FirStatement { override fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: Any?): FirStatement {
annotationCall.transformAnnotationTypeRef(this, data) annotationCall.transformAnnotationTypeRef(this, data)
return annotationCall return annotationCall
} }
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
class FirWhenExhaustivenessTransformer(private val bodyResolveComponents: BodyResolveComponents) : FirTransformer<Nothing?>() { class FirWhenExhaustivenessTransformer(private val bodyResolveComponents: BodyResolveComponents) : FirTransformer<Any?>() {
companion object { companion object {
private val exhaustivenessCheckers = listOf( private val exhaustivenessCheckers = listOf(
WhenOnBooleanExhaustivenessChecker, WhenOnBooleanExhaustivenessChecker,
@@ -35,11 +35,11 @@ class FirWhenExhaustivenessTransformer(private val bodyResolveComponents: BodyRe
) )
} }
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
throw IllegalArgumentException("Should not be there") throw IllegalArgumentException("Should not be there")
} }
override fun transformWhenExpression(whenExpression: FirWhenExpression, data: Nothing?): FirStatement { override fun transformWhenExpression(whenExpression: FirWhenExpression, data: Any?): FirStatement {
processExhaustivenessCheck(whenExpression) processExhaustivenessCheck(whenExpression)
return whenExpression return whenExpression
} }
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
object InvocationKindTransformer : FirTransformer<Nothing?>() { object InvocationKindTransformer : FirTransformer<Any?>() {
private object ArgumentsTransformer : FirTransformer<Pair<Map<FirExpression, EventOccurrencesRange>, EventOccurrencesRange?>>() { private object ArgumentsTransformer : FirTransformer<Pair<Map<FirExpression, EventOccurrencesRange>, EventOccurrencesRange?>>() {
override fun <E : FirElement> transformElement(element: E, data: Pair<Map<FirExpression, EventOccurrencesRange>, EventOccurrencesRange?>): E { override fun <E : FirElement> transformElement(element: E, data: Pair<Map<FirExpression, EventOccurrencesRange>, EventOccurrencesRange?>): E {
return element return element
@@ -52,11 +52,11 @@ object InvocationKindTransformer : FirTransformer<Nothing?>() {
} }
} }
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformFunctionCall(functionCall: FirFunctionCall, data: Nothing?): FirStatement { override fun transformFunctionCall(functionCall: FirFunctionCall, data: Any?): FirStatement {
val calleeReference = functionCall.calleeReference as? FirNamedReferenceWithCandidate ?: return functionCall val calleeReference = functionCall.calleeReference as? FirNamedReferenceWithCandidate ?: return functionCall
val argumentMapping = calleeReference.candidate.argumentMapping ?: return functionCall val argumentMapping = calleeReference.candidate.argumentMapping ?: return functionCall
val function = calleeReference.candidateSymbol.fir as? FirSimpleFunction ?: return functionCall val function = calleeReference.candidateSymbol.fir as? FirSimpleFunction ?: return functionCall
@@ -42,11 +42,11 @@ class FirDummyTransformerBasedProcessor(
session: FirSession, session: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
) : FirTransformerBasedResolveProcessor(session, scopeSession) { ) : FirTransformerBasedResolveProcessor(session, scopeSession) {
override val transformer: FirTransformer<Nothing?> override val transformer: FirTransformer<Any?>
get() = DummyTransformer get() = DummyTransformer
private object DummyTransformer : FirTransformer<Nothing?>() { private object DummyTransformer : FirTransformer<Any?>() {
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
} }
@@ -21,7 +21,7 @@ class FirBodyResolveProcessor(session: FirSession, scopeSession: ScopeSession) :
} }
@AdapterForResolveProcessor @AdapterForResolveProcessor
class FirBodyResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer<Nothing?>() { class FirBodyResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer<Any?>() {
private val transformer = FirBodyResolveTransformer( private val transformer = FirBodyResolveTransformer(
session, session,
phase = FirResolvePhase.BODY_RESOLVE, phase = FirResolvePhase.BODY_RESOLVE,
@@ -29,11 +29,11 @@ class FirBodyResolveTransformerAdapter(session: FirSession, scopeSession: ScopeS
scopeSession = scopeSession scopeSession = scopeSession
) )
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformFile(file: FirFile, data: Nothing?): FirFile { override fun transformFile(file: FirFile, data: Any?): FirFile {
return file.transform(transformer, ResolutionMode.ContextIndependent) return file.transform(transformer, ResolutionMode.ContextIndependent)
} }
} }
@@ -842,12 +842,12 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
} }
} }
private object ImplicitToErrorTypeTransformer : FirTransformer<Nothing?>() { private object ImplicitToErrorTypeTransformer : FirTransformer<Any?>() {
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformValueParameter(valueParameter: FirValueParameter, data: Nothing?): FirStatement { override fun transformValueParameter(valueParameter: FirValueParameter, data: Any?): FirStatement {
if (valueParameter.returnTypeRef is FirImplicitTypeRef) { if (valueParameter.returnTypeRef is FirImplicitTypeRef) {
valueParameter.transformReturnTypeRef( valueParameter.transformReturnTypeRef(
StoreType, StoreType,
@@ -546,12 +546,12 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
}.transformOtherChildren(transformer, ResolutionMode.ContextIndependent) }.transformOtherChildren(transformer, ResolutionMode.ContextIndependent)
val conversionTypeRef = resolved.conversionTypeRef.withTypeArgumentsForBareType(resolved.argument) val conversionTypeRef = resolved.conversionTypeRef.withTypeArgumentsForBareType(resolved.argument)
resolved.transformChildren(object : FirDefaultTransformer<Nothing?>() { resolved.transformChildren(object : FirDefaultTransformer<Any?>() {
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformTypeRef(typeRef: FirTypeRef, data: Nothing?): FirTypeRef { override fun transformTypeRef(typeRef: FirTypeRef, data: Any?): FirTypeRef {
return if (typeRef === resolved.conversionTypeRef) { return if (typeRef === resolved.conversionTypeRef) {
conversionTypeRef conversionTypeRef
} else { } else {
@@ -33,7 +33,7 @@ class FirImplicitTypeBodyResolveProcessor(
} }
@AdapterForResolveProcessor @AdapterForResolveProcessor
class FirImplicitTypeBodyResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer<Nothing?>() { class FirImplicitTypeBodyResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer<Any?>() {
private val implicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession() private val implicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession()
private val returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession) private val returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession)
@@ -45,11 +45,11 @@ class FirImplicitTypeBodyResolveTransformerAdapter(session: FirSession, scopeSes
returnTypeCalculator returnTypeCalculator
) )
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformFile(file: FirFile, data: Nothing?): FirFile { override fun transformFile(file: FirFile, data: Any?): FirFile {
return file.transform(transformer, ResolutionMode.ContextIndependent) return file.transform(transformer, ResolutionMode.ContextIndependent)
} }
} }
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
import org.jetbrains.kotlin.utils.keysToMap import org.jetbrains.kotlin.utils.keysToMap
class LocalClassesNavigationInfo( class LocalClassesNavigationInfo(
@@ -40,58 +40,59 @@ class LocalClassesNavigationInfo(
fun FirClassLikeDeclaration<*>.collectLocalClassesNavigationInfo(): LocalClassesNavigationInfo = fun FirClassLikeDeclaration<*>.collectLocalClassesNavigationInfo(): LocalClassesNavigationInfo =
NavigationInfoVisitor().run { NavigationInfoVisitor().run {
this@collectLocalClassesNavigationInfo.accept(this@run) this@collectLocalClassesNavigationInfo.accept(this@run, null)
LocalClassesNavigationInfo(parentForClass, resultingMap, allMembers) LocalClassesNavigationInfo(parentForClass, resultingMap, allMembers)
} }
private class NavigationInfoVisitor : FirDefaultVisitorVoid() { private class NavigationInfoVisitor : FirDefaultVisitor<Unit, Any?>() {
val resultingMap: MutableMap<FirCallableMemberDeclaration<*>, FirClassLikeDeclaration<*>> = mutableMapOf() val resultingMap: MutableMap<FirCallableMemberDeclaration<*>, FirClassLikeDeclaration<*>> = mutableMapOf()
val parentForClass: MutableMap<FirClassLikeDeclaration<*>, FirClassLikeDeclaration<*>?> = mutableMapOf() val parentForClass: MutableMap<FirClassLikeDeclaration<*>, FirClassLikeDeclaration<*>?> = mutableMapOf()
val allMembers: MutableList<FirSymbolOwner<*>> = mutableListOf() val allMembers: MutableList<FirSymbolOwner<*>> = mutableListOf()
private var currentPath: PersistentList<FirClassLikeDeclaration<*>> = persistentListOf() private var currentPath: PersistentList<FirClassLikeDeclaration<*>> = persistentListOf()
override fun visitElement(element: FirElement) {} override fun visitElement(element: FirElement, data: Any?) {}
override fun visitRegularClass(regularClass: FirRegularClass) { override fun visitRegularClass(regularClass: FirRegularClass, data: Any?) {
visitClass(regularClass) visitClass(regularClass, null)
} }
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject) { override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?) {
visitClass(anonymousObject) visitClass(anonymousObject, null)
} }
override fun <F : FirClass<F>> visitClass(klass: FirClass<F>) { override fun <F : FirClass<F>> visitClass(klass: FirClass<F>, data: Any?) {
parentForClass[klass] = currentPath.lastOrNull() parentForClass[klass] = currentPath.lastOrNull()
val prev = currentPath val prev = currentPath
currentPath = currentPath.add(klass) currentPath = currentPath.add(klass)
klass.acceptChildren(this) klass.acceptChildren(this, null)
currentPath = prev currentPath = prev
} }
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction) { override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?) {
visitCallableMemberDeclaration(simpleFunction) visitCallableMemberDeclaration(simpleFunction, null)
} }
override fun visitProperty(property: FirProperty) { override fun visitProperty(property: FirProperty, data: Any?) {
visitCallableMemberDeclaration(property) visitCallableMemberDeclaration(property, null)
} }
override fun visitConstructor(constructor: FirConstructor) { override fun visitConstructor(constructor: FirConstructor, data: Any?) {
visitCallableMemberDeclaration(constructor) visitCallableMemberDeclaration(constructor, null)
} }
override fun <F : FirCallableMemberDeclaration<F>> visitCallableMemberDeclaration( override fun <F : FirCallableMemberDeclaration<F>> visitCallableMemberDeclaration(
callableMemberDeclaration: FirCallableMemberDeclaration<F> callableMemberDeclaration: FirCallableMemberDeclaration<F>,
data: Any?
) { ) {
allMembers += callableMemberDeclaration allMembers += callableMemberDeclaration
if (callableMemberDeclaration.returnTypeRef !is FirImplicitTypeRef) return if (callableMemberDeclaration.returnTypeRef !is FirImplicitTypeRef) return
resultingMap[callableMemberDeclaration] = currentPath.last() resultingMap[callableMemberDeclaration] = currentPath.last()
} }
override fun visitAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer) { override fun visitAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer, data: Any?) {
allMembers += anonymousInitializer allMembers += anonymousInitializer
} }
} }
@@ -25,13 +25,13 @@ class FirContractResolveProcessor(session: FirSession, scopeSession: ScopeSessio
} }
@AdapterForResolveProcessor @AdapterForResolveProcessor
class FirContractResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer<Nothing?>() { class FirContractResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer<Any?>() {
private val transformer = FirContractResolveTransformer(session, scopeSession) private val transformer = FirContractResolveTransformer(session, scopeSession)
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformFile(file: FirFile, data: Nothing?): FirDeclaration { override fun transformFile(file: FirFile, data: Any?): FirDeclaration {
return file.transform(transformer, ResolutionMode.ContextIndependent) return file.transform(transformer, ResolutionMode.ContextIndependent)
} }
} }
@@ -22,20 +22,20 @@ class FirAnnotationArgumentsResolveProcessor(
session: FirSession, session: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
) : FirTransformerBasedResolveProcessor(session, scopeSession) { ) : FirTransformerBasedResolveProcessor(session, scopeSession) {
override val transformer: FirTransformer<Nothing?> = FirAnnotationArgumentsResolveTransformerAdapter(session, scopeSession) override val transformer: FirTransformer<Any?> = FirAnnotationArgumentsResolveTransformerAdapter(session, scopeSession)
} }
@AdapterForResolveProcessor @AdapterForResolveProcessor
class FirAnnotationArgumentsResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer<Nothing?>() { class FirAnnotationArgumentsResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer<Any?>() {
private val transformer = FirAnnotationArgumentsResolveTransformer(session, scopeSession) private val transformer = FirAnnotationArgumentsResolveTransformer(session, scopeSession)
private val hasAnnotations = session.registeredPluginAnnotations.annotations.isNotEmpty() private val hasAnnotations = session.registeredPluginAnnotations.annotations.isNotEmpty()
private val predicateBasedProvider = session.predicateBasedProvider private val predicateBasedProvider = session.predicateBasedProvider
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return element return element
} }
override fun transformFile(file: FirFile, data: Nothing?): FirDeclaration { override fun transformFile(file: FirFile, data: Any?): FirDeclaration {
if (!hasAnnotations || !predicateBasedProvider.fileHasPluginAnnotations(file)) return file if (!hasAnnotations || !predicateBasedProvider.fileHasPluginAnnotations(file)) return file
return file.transform(transformer, ResolutionMode.ContextIndependent) return file.transform(transformer, ResolutionMode.ContextIndependent)
} }
@@ -31,16 +31,16 @@ class FirPluginAnnotationsResolveProcessor(session: FirSession, scopeSession: Sc
class FirPluginAnnotationsResolveTransformer( class FirPluginAnnotationsResolveTransformer(
override val session: FirSession, override val session: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
) : FirAbstractPhaseTransformer<Nothing?>(FirResolvePhase.ANNOTATIONS_FOR_PLUGINS) { ) : FirAbstractPhaseTransformer<Any?>(FirResolvePhase.ANNOTATIONS_FOR_PLUGINS) {
private val annotationTransformer = FirAnnotationResolveTransformer(session, scopeSession) private val annotationTransformer = FirAnnotationResolveTransformer(session, scopeSession)
private val importTransformer = FirPartialImportResolveTransformer(session) private val importTransformer = FirPartialImportResolveTransformer(session)
val extensionService = session.extensionService val extensionService = session.extensionService
override fun <E : FirElement> transformElement(element: E, data: Nothing?): E { override fun <E : FirElement> transformElement(element: E, data: Any?): E {
throw IllegalStateException("Should not be here") throw IllegalStateException("Should not be here")
} }
override fun transformFile(file: FirFile, data: Nothing?): FirFile { override fun transformFile(file: FirFile, data: Any?): FirFile {
checkSessionConsistency(file) checkSessionConsistency(file)
if (!extensionService.hasPredicateBasedExtensions) return file if (!extensionService.hasPredicateBasedExtensions) return file
val registeredPluginAnnotations = file.session.registeredPluginAnnotations val registeredPluginAnnotations = file.session.registeredPluginAnnotations