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