summaryrefslogtreecommitdiff
path: root/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinNullabilityUAnnotation.kt
blob: c912fca2d250956019fb2cd8bae13ee902af28cf (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.uast.kotlin

import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiAnnotation
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.annotations.NotNull
import org.jetbrains.annotations.Nullable
import org.jetbrains.kotlin.types.typeUtil.TypeNullability
import org.jetbrains.uast.*
import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve

@ApiStatus.Internal
class KotlinNullabilityUAnnotation(
    private val baseKotlinUastResolveProviderService: BaseKotlinUastResolveProviderService,
    val annotatedElement: PsiElement,
    override val uastParent: UElement?
) : UAnnotationEx, UAnchorOwner, DelegatedMultiResolve {

    override val uastAnchor: UIdentifier? = null

    override val attributeValues: List<UNamedExpression>
        get() = emptyList()
    override val psi: PsiElement?
        get() = null
    override val javaPsi: PsiAnnotation?
        get() = null
    override val sourcePsi: PsiElement?
        get() = null

    private val nullability : TypeNullability? by lz {
        baseKotlinUastResolveProviderService.nullability(annotatedElement)
    }

    override val qualifiedName: String?
        get() = when (nullability) {
            TypeNullability.NOT_NULL -> NotNull::class.qualifiedName
            TypeNullability.NULLABLE -> Nullable::class.qualifiedName
            TypeNullability.FLEXIBLE -> null
            null -> null
        }

    override fun findAttributeValue(name: String?): UExpression? = null

    override fun findDeclaredAttributeValue(name: String?): UExpression? = null

    private val _resolved: PsiClass? by lz {
        qualifiedName?.let {
            val project = annotatedElement.project
            JavaPsiFacade.getInstance(project).findClass(it, GlobalSearchScope.allScope(project))
        }
    }

    override fun resolve(): PsiClass? = _resolved
}