aboutsummaryrefslogtreecommitdiff
path: root/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSDefNonNullReferenceImpl.kt
blob: 37d07c92537ce777ddfa3f4a5e94d7e95ddcda60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.google.devtools.ksp.symbol.impl.kotlin

import com.google.devtools.ksp.KSObjectCache
import com.google.devtools.ksp.findParentOfType
import com.google.devtools.ksp.symbol.*
import com.google.devtools.ksp.symbol.impl.toLocation
import org.jetbrains.kotlin.psi.KtIntersectionType
import org.jetbrains.kotlin.psi.KtTypeReference
import org.jetbrains.kotlin.psi.KtUserType

class KSDefNonNullReferenceImpl private constructor(val ktIntersectionType: KtIntersectionType) :
    KSDefNonNullReference {
    companion object : KSObjectCache<KtIntersectionType, KSDefNonNullReferenceImpl>() {
        fun getCached(ktIntersectionType: KtIntersectionType) = KSDefNonNullReferenceImpl
            .cache.getOrPut(ktIntersectionType) { KSDefNonNullReferenceImpl(ktIntersectionType) }
    }

    override val enclosedType: KSClassifierReference by lazy {
        val lhs = ktIntersectionType.getLeftTypeRef()?.typeElement
        if (lhs is KtUserType) {
            KSClassifierReferenceImpl.getCached(lhs)
        } else {
            throw IllegalStateException("LHS operand of definitely non null type should be a user type")
        }
    }

    override val typeArguments: List<KSTypeArgument>
        get() = emptyList()

    override val origin: Origin
        get() = Origin.KOTLIN

    override val location: Location
        get() = ktIntersectionType.toLocation()

    override val parent: KSNode? by lazy {
        ktIntersectionType.findParentOfType<KtTypeReference>()?.let { KSTypeReferenceImpl.getCached(it) }
    }

    override fun toString() = "${enclosedType.referencedName()} & Any"
}