All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlin.fir.declarations.SealedClassInheritors.kt Maven / Gradle / Ivy

There is a newer version: 2.1.20-Beta1
Show newest version
/*
 * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
 * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
 */

package org.jetbrains.kotlin.fir.declarations

import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.declarations.utils.isSealed
import org.jetbrains.kotlin.name.ClassId


@RequiresOptIn("For getting/setting sealed class inheritors, consider using getSealedClassInheritors/setSealedClassInheritors")
annotation class SealedClassInheritorsProviderInternals

abstract class SealedClassInheritorsProvider : FirSessionComponent {
    abstract fun getSealedClassInheritors(firClass: FirRegularClass): List
}

private val FirSession.sealedClassInheritorsProvider: SealedClassInheritorsProvider by FirSession.sessionComponentAccessor()

object SealedClassInheritorsProviderImpl : SealedClassInheritorsProvider() {
    @OptIn(SealedClassInheritorsProviderInternals::class)
    override fun getSealedClassInheritors(firClass: FirRegularClass): List {
        return firClass.sealedInheritorsAttr?.value ?: emptyList()
    }
}


fun FirRegularClass.getSealedClassInheritors(session: FirSession): List {
    require(this.isSealed)
    return session.sealedClassInheritorsProvider.getSealedClassInheritors(this)
}

@OptIn(SealedClassInheritorsProviderInternals::class)
fun FirRegularClass.setSealedClassInheritors(inheritors: List) {
    require(this.isSealed)
    sealedInheritorsAttr = lazyOf(inheritors.sortedBy { it.asFqNameString() })
}

@OptIn(SealedClassInheritorsProviderInternals::class)
fun FirRegularClass.setSealedClassInheritors(inheritorComputer: () -> List) {
    require(this.isSealed)
    sealedInheritorsAttr = lazy { inheritorComputer().sortedBy { it.asFqNameString() } }
}

private object SealedClassInheritorsKey : FirDeclarationDataKey()

@SealedClassInheritorsProviderInternals
var FirRegularClass.sealedInheritorsAttr: Lazy>? by FirDeclarationDataRegistry.data(SealedClassInheritorsKey)
    private set




© 2015 - 2024 Weber Informatics LLC | Privacy Policy