diff options
Diffstat (limited to 'plugins/kotlin/uast/uast-kotlin-base')
101 files changed, 512 insertions, 77 deletions
diff --git a/plugins/kotlin/uast/uast-kotlin-base/kotlin.uast.uast-kotlin-base.iml b/plugins/kotlin/uast/uast-kotlin-base/kotlin.uast.uast-kotlin-base.iml index 7915d756310c..b4cc704d6baa 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/kotlin.uast.uast-kotlin-base.iml +++ b/plugins/kotlin/uast/uast-kotlin-base/kotlin.uast.uast-kotlin-base.iml @@ -31,13 +31,12 @@ <orderEntry type="module" module-name="intellij.java.psi.impl" /> <orderEntry type="module" module-name="intellij.java.rt" scope="TEST" /> <orderEntry type="module" module-name="intellij.java.uast" /> - <orderEntry type="module" module-name="kotlin.fir.frontend-independent" /> <orderEntry type="library" scope="TEST" name="kotlin-test" level="project" /> <orderEntry type="module" module-name="intellij.platform.uast.tests" scope="TEST" /> <orderEntry type="module" module-name="kotlin.tests-common" scope="TEST" /> <orderEntry type="module" module-name="kotlin.test-framework" scope="TEST" /> <orderEntry type="library" scope="TEST" name="kotlinc.kotlin-compiler-cli" level="project" /> <orderEntry type="library" scope="TEST" name="kotlinc.kotlin-compiler-tests" level="project" /> - <orderEntry type="module" module-name="kotlin.core" /> + <!-- PLEASE DON'T ADD FRONTEND-SPECIFIC DEPENDENCIES: they should rather go to frontend variants, such as uast-kotlin(-fir) --> </component> </module> diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt index b1a68df59e43..577c92fc3d94 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt @@ -5,6 +5,7 @@ package org.jetbrains.uast.kotlin import com.intellij.openapi.components.ServiceManager import com.intellij.psi.* import com.intellij.psi.impl.source.tree.LeafPsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.elements.* @@ -25,6 +26,7 @@ import org.jetbrains.uast.internal.alternative import org.jetbrains.uast.expressions.UInjectionHost import org.jetbrains.uast.kotlin.psi.* +@ApiStatus.Internal interface BaseKotlinConverter { val languagePlugin: UastLanguagePlugin @@ -686,7 +688,7 @@ interface BaseKotlinConverter { fun createVarargsHolder( arguments: Collection<ValueArgument>, parent: UElement?, - ): KotlinUExpressionList = + ): UExpressionList = KotlinUExpressionList(null, UastSpecialExpressionKind.VARARGS, parent).apply { expressions = arguments.map { convertOrEmpty(it.getArgumentExpression(), parent) } } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinUastResolveProviderService.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinUastResolveProviderService.kt index 432eea11b5c5..7391563defcb 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinUastResolveProviderService.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinUastResolveProviderService.kt @@ -18,6 +18,8 @@ interface BaseKotlinUastResolveProviderService { val baseKotlinConverter: BaseKotlinConverter + fun convertToPsiAnnotation(ktElement: KtElement): PsiAnnotation? + fun convertParent(uElement: UElement): UElement? { return convertParentImpl(this, uElement) } @@ -42,6 +44,8 @@ interface BaseKotlinUastResolveProviderService { includeExplicitParameters: Boolean = false ): List<KotlinUParameter> + fun getPsiAnnotations(psiElement: PsiModifierListOwner): Array<PsiAnnotation> + // ---------- // Resolution // ---------- diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt index e25c098d22a8..b501d1d5f863 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt @@ -3,11 +3,13 @@ package org.jetbrains.uast.kotlin import com.intellij.openapi.components.ServiceManager +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.UElement import org.jetbrains.uast.UastFacade import org.jetbrains.uast.UastLanguagePlugin import org.jetbrains.uast.kotlin.internal.KotlinUElementWithComments +@ApiStatus.Internal abstract class KotlinAbstractUElement( givenParent: UElement?, ) : KotlinUElementWithComments { @@ -16,7 +18,7 @@ abstract class KotlinAbstractUElement( psi?.let { UastFacade.findPlugin(it) } } - open val baseResolveProviderService: BaseKotlinUastResolveProviderService by lz { + val baseResolveProviderService: BaseKotlinUastResolveProviderService by lz { ServiceManager.getService(BaseKotlinUastResolveProviderService::class.java) ?: error("${BaseKotlinUastResolveProviderService::class.java.name} is not available for ${this::class.simpleName}") } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/KotlinAbstractUExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/KotlinAbstractUExpression.kt index 40ad85c82fa2..c0065d583ed7 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/KotlinAbstractUExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/KotlinAbstractUExpression.kt @@ -3,12 +3,14 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtAnnotatedExpression import org.jetbrains.uast.UAnnotation import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression import org.jetbrains.uast.convertOpt +@ApiStatus.Internal abstract class KotlinAbstractUExpression( givenParent: UElement?, ) : KotlinAbstractUElement(givenParent), UExpression { diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/ElvisExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/ElvisExpression.kt index f960dd5af059..0fac67b2c553 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/ElvisExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/ElvisExpression.kt @@ -5,6 +5,7 @@ import com.intellij.openapi.components.ServiceManager import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.PsiType +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtAnnotatedExpression import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtExpression @@ -93,6 +94,7 @@ fun createElvisExpression(elvisExpression: KtBinaryExpression, givenParent: UEle return KotlinUElvisExpression(elvisExpression, left, right, givenParent) } +@ApiStatus.Internal class KotlinUElvisExpression( private val elvisExpression: KtBinaryExpression, private val left: KtExpression, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUCatchClause.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUCatchClause.kt index f8c315981374..99546301664b 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUCatchClause.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUCatchClause.kt @@ -3,12 +3,14 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtCatchClause import org.jetbrains.uast.* import org.jetbrains.uast.internal.acceptList import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.visitor.UastVisitor +@ApiStatus.Internal class KotlinUCatchClause( override val sourcePsi: KtCatchClause, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUDoWhileExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUDoWhileExpression.kt index 8dd0577cda82..d7144f9f49a7 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUDoWhileExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUDoWhileExpression.kt @@ -2,11 +2,13 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtDoWhileExpression import org.jetbrains.uast.UDoWhileExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier +@ApiStatus.Internal class KotlinUDoWhileExpression( override val sourcePsi: KtDoWhileExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUForEachExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUForEachExpression.kt index 5ebe6926d405..62a34431f168 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUForEachExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUForEachExpression.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.psi.KtForExpression import org.jetbrains.uast.UElement @@ -10,6 +11,7 @@ import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.psi.UastPsiParameterNotResolved +@ApiStatus.Internal class KotlinUForEachExpression( override val sourcePsi: KtForExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUIfExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUIfExpression.kt index b4fb618c6e31..213bf1460e84 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUIfExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUIfExpression.kt @@ -2,11 +2,13 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtIfExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.UIfExpression +@ApiStatus.Internal class KotlinUIfExpression( override val sourcePsi: KtIfExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUSwitchEntry.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUSwitchEntry.kt index ba81a93f3552..75daf9d559c8 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUSwitchEntry.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUSwitchEntry.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtWhenEntry @@ -9,6 +10,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.kinds.KotlinSpecialExpressionKinds +@ApiStatus.Internal class KotlinUSwitchEntry( override val sourcePsi: KtWhenEntry, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUSwitchExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUSwitchExpression.kt index 0ded104b4351..feadc6e0910b 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUSwitchExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUSwitchExpression.kt @@ -2,11 +2,12 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtWhenExpression import org.jetbrains.uast.* -import org.jetbrains.uast.kotlin.* import org.jetbrains.uast.kotlin.kinds.KotlinSpecialExpressionKinds +@ApiStatus.Internal class KotlinUSwitchExpression( override val sourcePsi: KtWhenExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUTryExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUTryExpression.kt index cce86bf205e0..b5594ac94f6f 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUTryExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUTryExpression.kt @@ -2,9 +2,11 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtTryExpression import org.jetbrains.uast.* +@ApiStatus.Internal class KotlinUTryExpression( override val sourcePsi: KtTryExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUWhileExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUWhileExpression.kt index 981df98799cf..93ac0e42cb67 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUWhileExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/controlStructures/KotlinUWhileExpression.kt @@ -2,11 +2,13 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtWhileExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.UWhileExpression +@ApiStatus.Internal class KotlinUWhileExpression( override val sourcePsi: KtWhileExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUClass.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUClass.kt index 27c0d1466d2d..849428388f93 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUClass.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUClass.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDelegatedSuperTypeEntry @@ -10,6 +11,7 @@ import org.jetbrains.uast.* import org.jetbrains.uast.internal.acceptList import org.jetbrains.uast.visitor.UastVisitor +@ApiStatus.Internal abstract class AbstractKotlinUClass( givenParent: UElement? ) : KotlinAbstractUElement(givenParent), UClass, UAnchorOwner { @@ -23,17 +25,19 @@ abstract class AbstractKotlinUClass( } } - open val ktClass: KtClassOrObject? get() = (psi as? KtLightClass)?.kotlinOrigin + protected open val ktClass: KtClassOrObject? + get() = (psi as? KtLightClass)?.kotlinOrigin override val uastSuperTypes: List<UTypeReferenceExpression> get() = ktClass?.superTypeListEntries.orEmpty().mapNotNull { it.typeReference }.map { KotlinUTypeReferenceExpression(it, this) } - val delegateExpressions: List<UExpression> - get() = ktClass?.superTypeListEntries.orEmpty() + private val delegateExpressions: List<UExpression> by lz { + ktClass?.superTypeListEntries.orEmpty() .filterIsInstance<KtDelegatedSuperTypeEntry>() .map { KotlinSupertypeDelegationUExpression(it, this) } + } override fun accept(visitor: UastVisitor) { if (visitor.visitClass(this)) return diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUVariable.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUVariable.kt index cfb3ffd55a90..f54c5d8316b3 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUVariable.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUVariable.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.* +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget @@ -13,6 +14,7 @@ import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable +@ApiStatus.Internal abstract class AbstractKotlinUVariable( givenParent: UElement? ) : KotlinAbstractUElement(givenParent), PsiVariable, UVariableEx, UAnchorOwner { @@ -36,7 +38,7 @@ abstract class AbstractKotlinUVariable( return languagePlugin?.convertElement(initializerExpression, this) as? UExpression ?: UastEmptyExpression(null) } - val delegateExpression: UExpression? by lz { + protected val delegateExpression: UExpression? by lz { val psi = psi val expression = when (psi) { is KtLightElement<*, *> -> (psi.kotlinOrigin as? KtProperty)?.delegateExpression @@ -103,7 +105,7 @@ abstract class AbstractKotlinUVariable( psi.parameterList.attributes.map { WrappedUNamedExpression(it, this) } } - override val uastAnchor by lazy { + override val uastAnchor: UIdentifier by lz { KotlinUIdentifier( { javaPsi.nameReferenceElement?.referenceNameElement }, sourcePsi.safeAs<KtAnnotationEntry>()?.typeReference?.nameElement, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinConstructorUMethod.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinConstructorUMethod.kt index 9e21ce02503c..c3514b55f31d 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinConstructorUMethod.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinConstructorUMethod.kt @@ -3,6 +3,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiMethod +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.utils.SmartList @@ -11,6 +12,7 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression import org.jetbrains.uast.UIdentifier +@ApiStatus.Internal open class KotlinConstructorUMethod( private val ktClass: KtClassOrObject?, override val psi: PsiMethod, @@ -26,7 +28,7 @@ open class KotlinConstructorUMethod( override val javaPsi = psi - val isPrimary: Boolean + internal val isPrimary: Boolean get() = sourcePsi is KtPrimaryConstructor || sourcePsi is KtClassOrObject override val uastBody: UExpression? by lz { diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinInvalidUClass.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinInvalidUClass.kt index bebdb99fcc6f..b60d2de85fbd 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinInvalidUClass.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinInvalidUClass.kt @@ -6,12 +6,14 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.impl.light.LightPsiClassBuilder +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.uast.* /** * implementation of [UClass] for invalid code, when it is impossible to create a [KtLightClass] */ +@ApiStatus.Internal class KotlinInvalidUClass( override val psi: PsiClass, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinNullabilityUAnnotation.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinNullabilityUAnnotation.kt index 5e0bab733cac..c912fca2d250 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinNullabilityUAnnotation.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinNullabilityUAnnotation.kt @@ -6,12 +6,14 @@ 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, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinReceiverUParameter.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinReceiverUParameter.kt index 44b1481c44f0..2d07a2c7405b 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinReceiverUParameter.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinReceiverUParameter.kt @@ -2,11 +2,13 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiParameter +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.uast.UAnnotation import org.jetbrains.uast.UElement +@ApiStatus.Internal class KotlinReceiverUParameter( psi: PsiParameter, private val receiver: KtTypeReference, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinScriptUClass.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinScriptUClass.kt index 32cdd27d3974..f6589e04affb 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinScriptUClass.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinScriptUClass.kt @@ -5,6 +5,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.* +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.classes.KtLightClassForScript import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.psi.KtClassOrObject @@ -12,6 +13,7 @@ import org.jetbrains.kotlin.psi.KtScript import org.jetbrains.kotlin.psi.KtScriptInitializer import org.jetbrains.uast.* +@ApiStatus.Internal class KotlinScriptUClass( psi: KtLightClassForScript, givenParent: UElement? @@ -20,7 +22,7 @@ class KotlinScriptUClass( override fun getNameIdentifier(): PsiIdentifier = UastLightIdentifier(psi, psi.kotlinOrigin) - override val uastAnchor by lazy { KotlinUIdentifier(nameIdentifier, sourcePsi?.nameIdentifier, this) } + override val uastAnchor: UIdentifier by lz { KotlinUIdentifier(nameIdentifier, sourcePsi?.nameIdentifier, this) } override val javaPsi: PsiClass = psi @@ -50,6 +52,7 @@ class KotlinScriptUClass( override fun getOriginalElement(): PsiElement? = psi.originalElement + @ApiStatus.Internal class KotlinScriptConstructorUMethod( script: KtScript, override val psi: KtLightMethod, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinSecondaryConstructorWithInitializersUMethod.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinSecondaryConstructorWithInitializersUMethod.kt index 9db4147640e6..5d0ba29bfbf0 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinSecondaryConstructorWithInitializersUMethod.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinSecondaryConstructorWithInitializersUMethod.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtExpression @@ -10,6 +11,7 @@ import org.jetbrains.uast.UElement // This class was created as a workaround for KT-21617 to be the only constructor which includes `init` block // when there is no primary constructors in the class. // It is expected to have only one constructor of this type in a UClass. +@ApiStatus.Internal class KotlinSecondaryConstructorWithInitializersUMethod( ktClass: KtClassOrObject?, psi: KtLightMethod, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotatedLocalVariable.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotatedLocalVariable.kt index 383b6204a173..0d0023143e8b 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotatedLocalVariable.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotatedLocalVariable.kt @@ -2,10 +2,12 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiLocalVariable +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.uast.UAnnotation import org.jetbrains.uast.UElement +@ApiStatus.Internal open class KotlinUAnnotatedLocalVariable( psi: PsiLocalVariable, sourcePsi: KtElement, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt index 5bea2bb5c638..4e659c233d6f 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt @@ -6,17 +6,15 @@ import com.intellij.psi.PsiAnnotation import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.ResolveResult -import org.jetbrains.kotlin.asJava.toLightAnnotation +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget -import org.jetbrains.kotlin.idea.util.actionUnderSafeAnalyzeBlock import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.getParentOfType -import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.internal.multiResolveResults +@ApiStatus.Internal sealed class KotlinUAnnotationBase<T : KtCallElement>( final override val sourcePsi: T, givenParent: UElement? @@ -72,13 +70,14 @@ sealed class KotlinUAnnotationBase<T : KtCallElement>( override fun multiResolve(): Iterable<ResolveResult> = sourcePsi.multiResolveResults().asIterable() } +@ApiStatus.Internal class KotlinUAnnotation( annotationEntry: KtAnnotationEntry, givenParent: UElement? ) : KotlinUAnnotationBase<KtAnnotationEntry>(annotationEntry, givenParent), UAnnotation { override val javaPsi: PsiAnnotation? by lz { - annotationEntry.actionUnderSafeAnalyzeBlock({ annotationEntry.toLightAnnotation() }, { null }) + baseResolveProviderService.convertToPsiAnnotation(annotationEntry) } override fun annotationUseSiteTarget() = sourcePsi.useSiteTarget?.getAnnotationUseSiteTarget() @@ -87,7 +86,7 @@ class KotlinUAnnotation( return baseResolveProviderService.resolveToClass(sourcePsi, this) } - override val uastAnchor by lz { + override val uastAnchor: UIdentifier by lz { KotlinUIdentifier( javaPsi?.nameReferenceElement, annotationEntry.typeReference?.nameElement, @@ -97,12 +96,15 @@ class KotlinUAnnotation( } +@ApiStatus.Internal class KotlinUNestedAnnotation private constructor( original: KtCallExpression, givenParent: UElement? ) : KotlinUAnnotationBase<KtCallExpression>(original, givenParent) { - override val javaPsi: PsiAnnotation? by lz { original.toLightAnnotation() } + override val javaPsi: PsiAnnotation? by lz { + baseResolveProviderService.convertToPsiAnnotation(original) + } override fun annotationUseSiteTarget(): AnnotationUseSiteTarget? = null @@ -110,7 +112,7 @@ class KotlinUNestedAnnotation private constructor( return baseResolveProviderService.resolveToClassIfConstructorCall(sourcePsi, this) } - override val uastAnchor by lz { + override val uastAnchor: UIdentifier by lz { KotlinUIdentifier( javaPsi?.nameReferenceElement?.referenceNameElement, (original.calleeExpression as? KtNameReferenceExpression)?.getReferencedNameElement(), @@ -129,5 +131,3 @@ class KotlinUNestedAnnotation private constructor( } } - - diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotationMethod.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotationMethod.kt index a01309976b63..64f1a09dbad0 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotationMethod.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotationMethod.kt @@ -2,10 +2,12 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.uast.* +@ApiStatus.Internal class KotlinUAnnotationMethod( psi: KtLightMethod, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnonymousClass.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnonymousClass.kt index 723431117a22..d1d5649e61fc 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnonymousClass.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnonymousClass.kt @@ -5,11 +5,13 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiAnonymousClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.uast.* +@ApiStatus.Internal class KotlinUAnonymousClass( psi: PsiAnonymousClass, givenParent: UElement? @@ -31,8 +33,8 @@ class KotlinUAnonymousClass( override fun getContainingFile(): PsiFile = unwrapFakeFileForLightClass(psi.containingFile) - override val uastAnchor by lazy { - val ktClassOrObject = (psi.originalElement as? KtLightClass)?.kotlinOrigin as? KtObjectDeclaration ?: return@lazy null + override val uastAnchor: UIdentifier? by lz { + val ktClassOrObject = (psi.originalElement as? KtLightClass)?.kotlinOrigin as? KtObjectDeclaration ?: return@lz null KotlinUIdentifier(ktClassOrObject.getObjectKeyword(), this) } } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt index a8a0ff24bdd6..6b4321f336e4 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt @@ -3,6 +3,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.* +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade import org.jetbrains.kotlin.asJava.classes.KtLightClassForScript @@ -14,6 +15,7 @@ import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.uast.* +@ApiStatus.Internal class KotlinUClass( psi: KtLightClass, givenParent: UElement? @@ -34,7 +36,9 @@ class KotlinUClass( override fun getContainingFile(): PsiFile = unwrapFakeFileForLightClass(psi.containingFile) - override val uastAnchor by lazy { getIdentifierSourcePsi()?.let { KotlinUIdentifier(nameIdentifier, it, this) } } + override val uastAnchor: UIdentifier? by lz { + getIdentifierSourcePsi()?.let { KotlinUIdentifier(nameIdentifier, it, this) } + } private fun getIdentifierSourcePsi(): PsiElement? { ktClass?.nameIdentifier?.let { return it } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUEnumConstant.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUEnumConstant.kt index de5d801cb459..97b480d86945 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUEnumConstant.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUEnumConstant.kt @@ -3,6 +3,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.* import com.intellij.psi.util.PsiTypesUtil +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.psi.KtElement @@ -11,6 +12,7 @@ import org.jetbrains.kotlin.psi.KtSuperTypeCallEntry import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve +@ApiStatus.Internal class KotlinUEnumConstant( psi: PsiEnumConstant, override val sourcePsi: KtElement?, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUField.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUField.kt index 6bebb0ab0ac1..b037a50dcde5 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUField.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUField.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.* +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtProperty @@ -11,6 +12,7 @@ import org.jetbrains.uast.UFieldEx import org.jetbrains.uast.internal.acceptList import org.jetbrains.uast.visitor.UastVisitor +@ApiStatus.Internal open class KotlinUField( psi: PsiField, override val sourcePsi: KtElement?, @@ -22,6 +24,10 @@ open class KotlinUField( override val psi = javaPsi + override fun getType(): PsiType { + return delegateExpression?.getExpressionType() ?: javaPsi.type + } + override fun acceptsAnnotationTarget(target: AnnotationUseSiteTarget?): Boolean = target == AnnotationUseSiteTarget.FIELD || target == AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD || @@ -54,4 +60,21 @@ open class KotlinUField( delegateExpression?.accept(visitor) visitor.afterVisitField(this) } + + override fun asRenderString(): String = buildString { + if (uAnnotations.isNotEmpty()) { + uAnnotations.joinTo(this, separator = " ", postfix = " ") { it.asRenderString() } + } + append(javaPsi.renderModifiers()) + // NB: use of (potentially delegated) `type`, instead of `javaPsiInternal.type`, is the only major difference. + append("var ").append(javaPsi.name).append(": ").append(type.getCanonicalText(false)) + uastInitializer?.let { initializer -> append(" = " + initializer.asRenderString()) } + } +} + +// copy of internal org.jetbrains.uast.InternalUastUtilsKt.renderModifiers +// original function should be used instead as soon as becomes public +private fun PsiModifierListOwner.renderModifiers(): String { + val modifiers = PsiModifier.MODIFIERS.filter { hasModifierProperty(it) }.joinToString(" ") + return if (modifiers.isEmpty()) "" else modifiers + " " } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUFile.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUFile.kt index 9f3b9a3ede57..7737582d0006 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUFile.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUFile.kt @@ -3,6 +3,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.* +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.findFacadeClass import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.psi.KtClassOrObject @@ -11,6 +12,7 @@ import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.internal.KotlinUElementWithComments import java.util.ArrayList +@ApiStatus.Internal class KotlinUFile( override val psi: KtFile, override val languagePlugin: UastLanguagePlugin diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUIdentifier.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUIdentifier.kt index f5a49a9f8a4a..fad4bb63366b 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUIdentifier.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUIdentifier.kt @@ -5,6 +5,7 @@ package org.jetbrains.uast.kotlin import com.intellij.openapi.application.ApplicationManager import com.intellij.psi.PsiElement import com.intellij.psi.impl.source.tree.LeafPsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.kdoc.psi.impl.KDocName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments @@ -12,7 +13,8 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.toUElement -class KotlinUIdentifier constructor( +@ApiStatus.Internal +class KotlinUIdentifier( javaPsiSupplier: () -> PsiElement?, override val sourcePsi: PsiElement?, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt index a2748915bee0..795c124fd6a3 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt @@ -3,6 +3,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtReferenceExpression @@ -12,6 +13,7 @@ import org.jetbrains.uast.UImportStatement import org.jetbrains.uast.USimpleNameReferenceExpression import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve +@ApiStatus.Internal class KotlinUImportStatement( override val psi: KtImportDirective, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinULocalVariable.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinULocalVariable.kt index 62c0eb1eb1eb..16c874fd5204 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinULocalVariable.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinULocalVariable.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.* +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.uast.UElement @@ -10,6 +11,7 @@ import org.jetbrains.uast.ULocalVariableEx import org.jetbrains.uast.internal.acceptList import org.jetbrains.uast.visitor.UastVisitor +@ApiStatus.Internal open class KotlinULocalVariable( psi: PsiLocalVariable, override val sourcePsi: KtElement?, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt index d9bb66cc0e67..2763177d99ab 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt @@ -7,11 +7,11 @@ import com.intellij.psi.PsiFile import com.intellij.psi.PsiMethod import com.intellij.psi.PsiNameIdentifierOwner import com.intellij.psi.PsiParameter +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.isGetter import org.jetbrains.kotlin.asJava.elements.isSetter -import org.jetbrains.kotlin.idea.util.actionUnderSafeAnalyzeBlock import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.getParentOfType @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter +@ApiStatus.Internal open class KotlinUMethod( psi: PsiMethod, final override val sourcePsi: KtDeclaration?, @@ -61,7 +62,9 @@ open class KotlinUMethod( override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin) override val uAnnotations: List<UAnnotation> by lz { - psi.actionUnderSafeAnalyzeBlock({ psi.annotations }, { emptyArray<PsiAnnotation>() }) + // NB: we can't use sourcePsi.annotationEntries directly due to annotation use-site targets. The given `psi` as a light element, + // which spans regular function, property accessors, etc., is already built with targeted annotation. + baseResolveProviderService.getPsiAnnotations(psi) .mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry } .map { baseResolveProviderService.baseKotlinConverter.convertAnnotation(it, this) } } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethodWithFakeLightDelegate.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethodWithFakeLightDelegate.kt index 3895b7fef965..6735950dad06 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethodWithFakeLightDelegate.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethodWithFakeLightDelegate.kt @@ -4,10 +4,12 @@ package org.jetbrains.uast.kotlin import com.intellij.openapi.util.TextRange import com.intellij.psi.* +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.* import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.psi.UastFakeLightMethod +@ApiStatus.Internal class KotlinUMethodWithFakeLightDelegate( val original: KtFunction, fakePsi: UastFakeLightMethod, @@ -17,13 +19,12 @@ class KotlinUMethodWithFakeLightDelegate( constructor(original: KtFunction, containingLightClass: PsiClass, givenParent: UElement?) : this(original, UastFakeLightMethod(original, containingLightClass), givenParent) - private val _annotations: List<UAnnotation> by lz { - original.annotationEntries.mapNotNull { it.toUElementOfType() } + override val uAnnotations: List<UAnnotation> by lz { + original.annotationEntries.map { + baseResolveProviderService.baseKotlinConverter.convertAnnotation(it, this) + } } - override val uAnnotations: List<UAnnotation> - get() = _annotations - override fun getTextRange(): TextRange { return original.textRange } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUParameter.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUParameter.kt index 3ce042b57426..3b12d85d68de 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUParameter.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUParameter.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.* +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getParentOfType @@ -9,6 +10,7 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UParameter import org.jetbrains.uast.UParameterEx +@ApiStatus.Internal open class KotlinUParameter( psi: PsiParameter, final override val sourcePsi: KtElement?, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt index 8ee45e2ab1f1..14842d4f8f95 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt @@ -2,11 +2,13 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.* +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.uast.UElement import org.jetbrains.uast.UVariable +@ApiStatus.Internal class KotlinUVariable( psi: PsiVariable, override val sourcePsi: KtElement, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/UastLightIdentifier.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/UastLightIdentifier.kt index c75f7c0bc991..884fb4f9f9a7 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/UastLightIdentifier.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/UastLightIdentifier.kt @@ -4,15 +4,11 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiFile import com.intellij.psi.PsiNameIdentifierOwner +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier -import org.jetbrains.kotlin.kdoc.psi.impl.KDocName import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments -import org.jetbrains.uast.UElement -import org.jetbrains.uast.UIdentifier -import org.jetbrains.uast.kotlin.createKDocNameSimpleNameReference -import org.jetbrains.uast.toUElement +@ApiStatus.Internal class UastLightIdentifier( lightOwner: PsiNameIdentifierOwner, ktDeclaration: KtDeclaration? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinClassViaConstructorUSimpleReferenceExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinClassViaConstructorUSimpleReferenceExpression.kt index ef1c8be61bd1..4ead113ceede 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinClassViaConstructorUSimpleReferenceExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinClassViaConstructorUSimpleReferenceExpression.kt @@ -8,12 +8,14 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.PsiNamedElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtCallElement import org.jetbrains.uast.UElement import org.jetbrains.uast.USimpleNameReferenceExpression import org.jetbrains.uast.internal.log import org.jetbrains.uast.visitor.UastVisitor +@ApiStatus.Internal class KotlinClassViaConstructorUSimpleReferenceExpression( override val sourcePsi: KtCallElement, override val identifier: String, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinCustomUBinaryExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinCustomUBinaryExpression.kt index b6f4f9e7b1fe..83118d956889 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinCustomUBinaryExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinCustomUBinaryExpression.kt @@ -3,8 +3,10 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.* +@ApiStatus.Internal class KotlinCustomUBinaryExpression( override val psi: PsiElement, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinCustomUBinaryExpressionWithType.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinCustomUBinaryExpressionWithType.kt index e4865ea9b22d..4d882b716401 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinCustomUBinaryExpressionWithType.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinCustomUBinaryExpressionWithType.kt @@ -4,8 +4,10 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiType +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.* +@ApiStatus.Internal class KotlinCustomUBinaryExpressionWithType( override val psi: PsiElement, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinDocUQualifiedReferenceExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinDocUQualifiedReferenceExpression.kt index 7b90400199f3..80874dfdfcbe 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinDocUQualifiedReferenceExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinDocUQualifiedReferenceExpression.kt @@ -4,10 +4,12 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiNamedElement import com.intellij.psi.ResolveResult +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.kdoc.psi.impl.KDocName import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.internal.multiResolveResults +@ApiStatus.Internal class KotlinDocUQualifiedReferenceExpression( override val sourcePsi: KDocName, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinEvaluatableUElement.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinEvaluatableUElement.kt index 50a668aaaa34..1e4cfafb228f 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinEvaluatableUElement.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinEvaluatableUElement.kt @@ -2,8 +2,10 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.UExpression +@ApiStatus.Internal interface KotlinEvaluatableUElement : UExpression { val baseResolveProviderService: BaseKotlinUastResolveProviderService diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLazyUBlockExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLazyUBlockExpression.kt index 542d6797b461..f688e5814910 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLazyUBlockExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLazyUBlockExpression.kt @@ -3,9 +3,11 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtAnonymousInitializer import org.jetbrains.uast.* +@ApiStatus.Internal class KotlinLazyUBlockExpression( override val uastParent: UElement?, expressionProducer: (expressionParent: UElement) -> List<UExpression> diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLocalFunctionULambdaExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLocalFunctionULambdaExpression.kt index 6df44b2f5a91..a0666bf2fd04 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLocalFunctionULambdaExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLocalFunctionULambdaExpression.kt @@ -2,10 +2,12 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiType +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter +@ApiStatus.Internal class KotlinLocalFunctionULambdaExpression( override val sourcePsi: KtFunction, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLocalFunctionUVariable.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLocalFunctionUVariable.kt index eba344dfd714..0de28430da5a 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLocalFunctionUVariable.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinLocalFunctionUVariable.kt @@ -4,10 +4,12 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiExpression import com.intellij.psi.PsiVariable +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable +@ApiStatus.Internal class KotlinLocalFunctionUVariable( val function: KtFunction, override val javaPsi: PsiVariable, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt index 50d38665bce7..450e371f4966 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt @@ -3,10 +3,12 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiLanguageInjectionHost +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtStringTemplateExpression import org.jetbrains.uast.* import org.jetbrains.uast.expressions.UInjectionHost +@ApiStatus.Internal class KotlinStringTemplateUPolyadicExpression( override val sourcePsi: KtStringTemplateExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringULiteralExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringULiteralExpression.kt index 46326bd2343f..f461e8a62ede 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringULiteralExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringULiteralExpression.kt @@ -4,12 +4,14 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiType +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtEscapeStringTemplateEntry import org.jetbrains.uast.UElement import org.jetbrains.uast.ULiteralExpression import org.jetbrains.uast.kotlin.internal.KotlinFakeUElement import org.jetbrains.uast.wrapULiteral +@ApiStatus.Internal class KotlinStringULiteralExpression( override val sourcePsi: PsiElement, givenParent: UElement?, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringUSimpleReferenceExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringUSimpleReferenceExpression.kt index 992e59faa3e3..2b045ac0fdc6 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringUSimpleReferenceExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinStringUSimpleReferenceExpression.kt @@ -4,12 +4,14 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiNamedElement import com.intellij.psi.ResolveResult +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.uast.UElement import org.jetbrains.uast.UMultiResolvable import org.jetbrains.uast.USimpleNameReferenceExpression import org.jetbrains.uast.kotlin.internal.multiResolveResults +@ApiStatus.Internal class KotlinStringUSimpleReferenceExpression( override val identifier: String, givenParent: UElement?, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinSupertypeDelegationUExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinSupertypeDelegationUExpression.kt index f5fd256d2a39..cd7e6adbee0f 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinSupertypeDelegationUExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinSupertypeDelegationUExpression.kt @@ -3,10 +3,12 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtDelegatedSuperTypeEntry import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.kinds.KotlinSpecialExpressionKinds +@ApiStatus.Internal class KotlinSupertypeDelegationUExpression( override val sourcePsi: KtDelegatedSuperTypeEntry, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt index b3413b3a6379..d0bbed38c55c 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt @@ -2,10 +2,12 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtArrayAccessExpression import org.jetbrains.uast.UArrayAccessExpression import org.jetbrains.uast.UElement +@ApiStatus.Internal class KotlinUArrayAccessExpression( override val sourcePsi: KtArrayAccessExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt index df2111bf3787..8dca70bd539e 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt @@ -3,6 +3,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiMethod +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.uast.UBinaryExpression @@ -10,6 +11,7 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.UastBinaryOperator +@ApiStatus.Internal class KotlinUBinaryExpression( override val sourcePsi: KtBinaryExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt index f9d0c0c31151..63942059b773 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt @@ -2,10 +2,12 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtBinaryExpressionWithTypeRHS import org.jetbrains.uast.* +@ApiStatus.Internal class KotlinUBinaryExpressionWithType( override val sourcePsi: KtBinaryExpressionWithTypeRHS, givenParent: UElement? @@ -20,7 +22,7 @@ class KotlinUBinaryExpressionWithType( } ?: UastErrorType } - override val typeReference by lz { + override val typeReference: UTypeReferenceExpression? by lz { sourcePsi.right?.let { KotlinUTypeReferenceExpression(it, this) { type } } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt index a9016b7debd3..0b49476d67a2 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt @@ -2,12 +2,14 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtAnonymousInitializer import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.uast.UBlockExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.getContainingUClass +@ApiStatus.Internal open class KotlinUBlockExpression( override val sourcePsi: KtBlockExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt index 4a4d7b3e305a..671c80964cbd 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt @@ -2,11 +2,12 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtBreakExpression import org.jetbrains.uast.UBreakExpression import org.jetbrains.uast.UElement -import org.jetbrains.uast.kotlin.KotlinAbstractUExpression +@ApiStatus.Internal class KotlinUBreakExpression( override val sourcePsi: KtBreakExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt index 7aa1c5b48ca8..fb7e30781aa6 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt @@ -5,10 +5,12 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiNamedElement import com.intellij.psi.ResolveResult +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtCallableReferenceExpression import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.internal.getResolveResultVariants +@ApiStatus.Internal class KotlinUCallableReferenceExpression( override val sourcePsi: KtCallableReferenceExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt index 454486b4f3b4..3840f257291d 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt @@ -2,12 +2,14 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtClassLiteralExpression import org.jetbrains.uast.DEFAULT_EXPRESSION_TYPES_LIST import org.jetbrains.uast.UClassLiteralExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression +@ApiStatus.Internal class KotlinUClassLiteralExpression( override val sourcePsi: KtClassLiteralExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUCollectionLiteralExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUCollectionLiteralExpression.kt index 6832ab6b4814..b9f27b0818af 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUCollectionLiteralExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUCollectionLiteralExpression.kt @@ -6,10 +6,12 @@ import com.intellij.psi.PsiArrayType import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.PsiType +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtCollectionLiteralExpression import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve +@ApiStatus.Internal class KotlinUCollectionLiteralExpression( override val sourcePsi: KtCollectionLiteralExpression, givenParent: UElement? @@ -19,7 +21,7 @@ class KotlinUCollectionLiteralExpression( override val kind: UastCallKind = UastCallKind.NESTED_ARRAY_INITIALIZER - override val methodIdentifier: UIdentifier? by lazy { UIdentifier(sourcePsi.leftBracket, this) } + override val methodIdentifier: UIdentifier? by lz { UIdentifier(sourcePsi.leftBracket, this) } override val methodName: String? get() = null @@ -36,7 +38,7 @@ class KotlinUCollectionLiteralExpression( override val valueArgumentCount: Int get() = sourcePsi.getInnerExpressions().size - override val valueArguments by lazy { + override val valueArguments by lz { sourcePsi.getInnerExpressions().map { baseResolveProviderService.baseKotlinConverter.convertOrEmpty(it, this) } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt index 32eeab3d30b6..f5385b2cef69 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt @@ -2,11 +2,12 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtContinueExpression import org.jetbrains.uast.UContinueExpression import org.jetbrains.uast.UElement -import org.jetbrains.uast.kotlin.KotlinAbstractUExpression +@ApiStatus.Internal class KotlinUContinueExpression( override val sourcePsi: KtContinueExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt index 2cee06b32154..c3bf4f6b38cc 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt @@ -1,9 +1,13 @@ // 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 +package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement -import org.jetbrains.uast.kotlin.KotlinAbstractUExpression +import org.jetbrains.annotations.ApiStatus +import org.jetbrains.uast.UDeclaration +import org.jetbrains.uast.UDeclarationsExpression +import org.jetbrains.uast.UElement +@ApiStatus.Internal open class KotlinUDeclarationsExpression( override val psi: PsiElement?, givenParent: UElement?, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUDestructuringDeclarationExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUDestructuringDeclarationExpression.kt index 609e1941ecfb..07d58b7b8560 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUDestructuringDeclarationExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUDestructuringDeclarationExpression.kt @@ -3,9 +3,10 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement -import org.jetbrains.uast.KotlinUDeclarationsExpression +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.UElement +@ApiStatus.Internal class KotlinUDestructuringDeclarationExpression( givenParent: UElement?, psiAnchor: PsiElement, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUElementWithType.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUElementWithType.kt index 7d7b8dc948ba..1c99531eba7a 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUElementWithType.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUElementWithType.kt @@ -3,9 +3,11 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiType +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.uast.UExpression +@ApiStatus.Internal interface KotlinUElementWithType : UExpression { val baseResolveProviderService: BaseKotlinUastResolveProviderService diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt index 19dbbca219ed..3318407cbb9c 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt @@ -3,12 +3,14 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression import org.jetbrains.uast.UExpressionList import org.jetbrains.uast.UastSpecialExpressionKind import org.jetbrains.uast.kotlin.kinds.KotlinSpecialExpressionKinds +@ApiStatus.Internal open class KotlinUExpressionList( override val sourcePsi: PsiElement?, override val kind: UastSpecialExpressionKind, // original element diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt index 16c5c76d303e..c187120c6eaa 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt @@ -4,12 +4,14 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.* import com.intellij.psi.util.PsiTypesUtil +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.* import org.jetbrains.uast.* import org.jetbrains.uast.internal.acceptList import org.jetbrains.uast.kotlin.internal.TypedResolveResult import org.jetbrains.uast.visitor.UastVisitor +@ApiStatus.Internal class KotlinUFunctionCallExpression( override val sourcePsi: KtCallElement, givenParent: UElement?, @@ -23,11 +25,11 @@ class KotlinUFunctionCallExpression( baseResolveProviderService.resolvedFunctionName(sourcePsi) } - override val classReference by lz { + override val classReference: UReferenceExpression by lz { KotlinClassViaConstructorUSimpleReferenceExpression(sourcePsi, methodName.orAnonymous("class"), this) } - override val methodIdentifier by lz { + override val methodIdentifier: UIdentifier? by lz { if (sourcePsi is KtSuperTypeCallEntry) { ((sourcePsi.parent as? KtInitializerList)?.parent as? KtEnumEntry)?.let { ktEnumEntry -> return@lz KotlinUIdentifier(ktEnumEntry.nameIdentifier, this) diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUImplicitReturnExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUImplicitReturnExpression.kt index 35816a49fab7..7e072f45fbc3 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUImplicitReturnExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUImplicitReturnExpression.kt @@ -3,11 +3,13 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression import org.jetbrains.uast.UReturnExpression import org.jetbrains.uast.kotlin.internal.KotlinFakeUElement +@ApiStatus.Internal class KotlinUImplicitReturnExpression( givenParent: UElement?, ) : KotlinAbstractUExpression(givenParent), UReturnExpression, KotlinUElementWithType, KotlinFakeUElement { diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt index 21868f00b998..e3d78eb502a4 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt @@ -2,11 +2,13 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtLabeledExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.ULabeledExpression +@ApiStatus.Internal class KotlinULabeledExpression( override val sourcePsi: KtLabeledExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt index ffcf9e7ed130..261ef717119f 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt @@ -3,11 +3,13 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiType +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtLambdaExpression import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter +@ApiStatus.Internal class KotlinULambdaExpression( override val sourcePsi: KtLambdaExpression, givenParent: UElement? @@ -20,7 +22,11 @@ class KotlinULambdaExpression( sourcePsi.bodyExpression?.let { Body(it, this) } ?: UastEmptyExpression(this) } - class Body(bodyExpression: KtBlockExpression, parent: KotlinULambdaExpression) : KotlinUBlockExpression(bodyExpression, parent) { + @ApiStatus.Internal + class Body( + bodyExpression: KtBlockExpression, + parent: KotlinULambdaExpression + ) : KotlinUBlockExpression(bodyExpression, parent) { override val expressions: List<UExpression> by lz { val statements = sourcePsi.statements diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt index d0922d5d98ca..9f92c2dec0da 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt @@ -3,6 +3,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.psi.KtConstantExpression import org.jetbrains.uast.UElement @@ -10,6 +11,7 @@ import org.jetbrains.uast.ULiteralExpression import org.jetbrains.uast.kotlin.internal.KotlinFakeUElement import org.jetbrains.uast.wrapULiteral +@ApiStatus.Internal class KotlinULiteralExpression( override val sourcePsi: KtConstantExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUNamedExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUNamedExpression.kt index 5716eb82328b..41693f321540 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUNamedExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUNamedExpression.kt @@ -3,9 +3,11 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.ValueArgument import org.jetbrains.uast.* +@ApiStatus.Internal class KotlinUNamedExpression private constructor( override val name: String?, override val sourcePsi: PsiElement?, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt index e9ad511e9929..bd5104755bda 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt @@ -4,13 +4,14 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiType +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.psi.KtObjectLiteralExpression import org.jetbrains.kotlin.psi.KtSuperTypeCallEntry import org.jetbrains.uast.* -import org.jetbrains.uast.kotlin.* import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve +@ApiStatus.Internal class KotlinUObjectLiteralExpression( override val sourcePsi: KtObjectLiteralExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt index c5a825a6571e..d17112db0381 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt @@ -2,10 +2,12 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtParenthesizedExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UParenthesizedExpression +@ApiStatus.Internal class KotlinUParenthesizedExpression( override val sourcePsi: KtParenthesizedExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt index 01d35a6ff8a0..7a87b27ce290 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt @@ -3,11 +3,13 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiMethod +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtPostfixExpression import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve +@ApiStatus.Internal class KotlinUPostfixExpression( override val sourcePsi: KtPostfixExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt index 6653326daea2..42bef8b8d4fd 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt @@ -3,6 +3,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiMethod +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtPrefixExpression import org.jetbrains.uast.UElement @@ -10,6 +11,7 @@ import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.UPrefixExpression import org.jetbrains.uast.UastPrefixOperator +@ApiStatus.Internal class KotlinUPrefixExpression( override val sourcePsi: KtPrefixExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt index 3792dcd29ef0..726ec2b29520 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt @@ -4,10 +4,12 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiNamedElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtDotQualifiedExpression import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve +@ApiStatus.Internal class KotlinUQualifiedReferenceExpression( override val sourcePsi: KtDotQualifiedExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt index 83789bbf51b6..9b4ebbaf8858 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt @@ -2,9 +2,11 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtReturnExpression import org.jetbrains.uast.* +@ApiStatus.Internal class KotlinUReturnExpression( override val sourcePsi: KtReturnExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt index b3a6e67c2bd3..c10335d62be5 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt @@ -5,12 +5,14 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiNamedElement import com.intellij.psi.ResolveResult +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UMultiResolvable import org.jetbrains.uast.UQualifiedReferenceExpression import org.jetbrains.uast.kotlin.internal.getResolveResultVariants +@ApiStatus.Internal class KotlinUSafeQualifiedExpression( override val sourcePsi: KtSafeQualifiedExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt index 0fc76ff68940..da6c189c5513 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt @@ -7,7 +7,7 @@ package org.jetbrains.uast.kotlin import com.intellij.openapi.util.Key import com.intellij.psi.* -import org.jetbrains.kotlin.idea.references.readWriteAccess +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.findAssignment import org.jetbrains.uast.* @@ -17,6 +17,7 @@ import org.jetbrains.uast.visitor.UastVisitor var PsiElement.destructuringDeclarationInitializer: Boolean? by UserDataProperty(Key.create("kotlin.uast.destructuringDeclarationInitializer")) +@ApiStatus.Internal class KotlinUSimpleReferenceExpression( override val sourcePsi: KtSimpleNameExpression, givenParent: UElement? @@ -49,7 +50,7 @@ class KotlinUSimpleReferenceExpression( private fun visitAccessorCalls(visitor: UastVisitor) { // Visit Kotlin get-set synthetic Java property calls as function calls val resolvedMethod = baseResolveProviderService.resolveAccessorCall(sourcePsi) ?: return - val access = sourcePsi.readWriteAccess(useResolveForReadWrite = false) + val access = sourcePsi.readWriteAccess() val setterValue = if (access.isWrite) { findAssignment(sourcePsi)?.right ?: run { visitor.afterVisitSimpleNameReferenceExpression(this) @@ -68,6 +69,7 @@ class KotlinUSimpleReferenceExpression( } } + @ApiStatus.Internal class KotlinAccessorCallExpression( override val sourcePsi: KtSimpleNameExpression, givenParent: KotlinUSimpleReferenceExpression, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt index 011ab457f9fb..d235b9d2293f 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt @@ -2,12 +2,14 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtSuperExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.USuperExpression import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve +@ApiStatus.Internal class KotlinUSuperExpression( override val sourcePsi: KtSuperExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt index e4e5b91921cd..29561aa0a130 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt @@ -2,12 +2,14 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtThisExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.UThisExpression import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve +@ApiStatus.Internal class KotlinUThisExpression( override val sourcePsi: KtThisExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt index a3c350102afa..cde8ae2fb5d2 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt @@ -2,10 +2,12 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtThrowExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UThrowExpression +@ApiStatus.Internal class KotlinUThrowExpression( override val sourcePsi: KtThrowExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt index 16af8bb80d55..9ceb289cebca 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt @@ -2,12 +2,14 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtIsExpression import org.jetbrains.uast.UBinaryExpressionWithType import org.jetbrains.uast.UElement import org.jetbrains.uast.UastBinaryExpressionWithTypeKind import org.jetbrains.uast.UastErrorType +@ApiStatus.Internal class KotlinUTypeCheckExpression( override val sourcePsi: KtIsExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt index 85ed54e0ba7b..2d85c49def49 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt @@ -3,11 +3,13 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiType +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.uast.UElement import org.jetbrains.uast.UTypeReferenceExpression import org.jetbrains.uast.UastErrorType +@ApiStatus.Internal class KotlinUTypeReferenceExpression( override val sourcePsi: KtTypeReference?, givenParent: UElement?, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUVarargExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUVarargExpression.kt index 804506514c29..3c4514cdad23 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUVarargExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUVarargExpression.kt @@ -4,10 +4,12 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiType +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.ValueArgument import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve +@ApiStatus.Internal class KotlinUVarargExpression( private val valueArgs: List<ValueArgument>, uastParent: UElement?, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt index afe77c7ca448..7beb9f623230 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt @@ -2,10 +2,12 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression +@ApiStatus.Internal class UnknownKotlinExpression( override val sourcePsi: KtExpression, givenParent: UElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/DelegatedMultiResolve.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/DelegatedMultiResolve.kt index cb61b7fffdc1..ef689aff6332 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/DelegatedMultiResolve.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/DelegatedMultiResolve.kt @@ -5,9 +5,11 @@ package org.jetbrains.uast.kotlin.internal import com.intellij.psi.PsiSubstitutor import com.intellij.psi.ResolveResult import com.intellij.psi.infos.CandidateInfo +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.UMultiResolvable import org.jetbrains.uast.UResolvable +@ApiStatus.Internal interface DelegatedMultiResolve : UMultiResolvable, UResolvable { override fun multiResolve(): Iterable<ResolveResult> = listOfNotNull(resolve()?.let { CandidateInfo(it, PsiSubstitutor.EMPTY) }) } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/KotlinFakeUElement.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/KotlinFakeUElement.kt index af6cfc81d63c..7e3f8debd824 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/KotlinFakeUElement.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/KotlinFakeUElement.kt @@ -3,7 +3,9 @@ package org.jetbrains.uast.kotlin.internal import com.intellij.psi.PsiElement +import org.jetbrains.annotations.ApiStatus +@ApiStatus.Internal interface KotlinFakeUElement { fun unwrapToSourcePsi(): List<PsiElement> } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/KotlinUElementWithComments.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/KotlinUElementWithComments.kt index ce8f6e91c8c4..9940568dfc27 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/KotlinUElementWithComments.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/KotlinUElementWithComments.kt @@ -5,19 +5,41 @@ package org.jetbrains.uast.kotlin.internal import com.intellij.psi.PsiComment import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace +import org.jetbrains.annotations.ApiStatus +import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtValueArgument import org.jetbrains.kotlin.psi.psiUtil.allChildren -import org.jetbrains.uast.UComment -import org.jetbrains.uast.UElement -import org.jetbrains.uast.UExpression -import org.jetbrains.uast.UParameter +import org.jetbrains.uast.* +@ApiStatus.Internal interface KotlinUElementWithComments : UElement { override val comments: List<UComment> get() { val psi = sourcePsi ?: return emptyList() - val childrenComments = psi.allChildren.filterIsInstance<PsiComment>().map { UComment(it, this) }.toList() + val childrenComments = commentsOnPsiElement(psi) + // Default property accessors + if (this is UMethod && psi is KtProperty) { + // Don't regard property's comments as accessor's comments, + // unless that property won't be materialized (e.g., property in interface) + val backingField = (uastParent as? UClass)?.fields?.find { it.sourcePsi == psi } + return if (backingField != null) + emptyList() + else + childrenComments + } + // Property accessor w/o its own comments + if (psi is KtPropertyAccessor && childrenComments.isEmpty()) { + // If the containing property does not have a backing field, + // comments on the property won't appear on any elements, so we should keep them here. + val propertyPsi = psi.parent as? KtProperty ?: return childrenComments + val backingField = (uastParent as? UClass)?.fields?.find { it.sourcePsi == propertyPsi } + return if (backingField != null) + childrenComments + else + commentsOnPsiElement(propertyPsi) + } // Property accessor w/ its own comments fall through and return those comments. if (this !is UExpression && this !is UParameter // fun (/* prior */ a: Int) <-- /* prior */ is on the level of VALUE_PARAM_LIST ) @@ -32,6 +54,10 @@ interface KotlinUElementWithComments : UElement { parent.nearestCommentSibling(forward = false)?.let { listOf(UComment(it, this)) }.orEmpty() } + private fun commentsOnPsiElement(psi: PsiElement): List<UComment> { + return psi.allChildren.filterIsInstance<PsiComment>().map { UComment(it, this) }.toList() + } + private fun PsiElement.nearestCommentSibling(forward: Boolean): PsiComment? { var sibling = if (forward) nextSibling else prevSibling while (sibling is PsiWhiteSpace && !sibling.text.contains('\n')) { diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/baseKotlinInternalUastUtils.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/baseKotlinInternalUastUtils.kt index 34c0563b2e6c..c4e1ce667639 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/baseKotlinInternalUastUtils.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/baseKotlinInternalUastUtils.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.kotlin +import com.intellij.lang.Language import com.intellij.psi.* import com.intellij.psi.util.PsiTypesUtil import org.jetbrains.kotlin.asJava.classes.KtLightClass @@ -12,13 +13,14 @@ import org.jetbrains.kotlin.asJava.findFacadeClass import org.jetbrains.kotlin.asJava.getAccessorLightMethods import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightElements -import org.jetbrains.kotlin.idea.references.readWriteAccess +import org.jetbrains.kotlin.idea.KotlinLanguage +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject -import org.jetbrains.kotlin.psi.psiUtil.getParentOfType -import org.jetbrains.kotlin.psi.psiUtil.parents +import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.ArrayFqNames +import org.jetbrains.kotlin.resolve.references.ReferenceAccess +import org.jetbrains.kotlin.utils.addToStdlib.constant import org.jetbrains.uast.* @Suppress("NOTHING_TO_INLINE") @@ -35,7 +37,7 @@ inline fun <reified T : UDeclaration, reified P : PsiElement> unwrap(element: P) fun unwrapFakeFileForLightClass(file: PsiFile): PsiFile = (file as? FakeFileForLightClass)?.ktFile ?: file -internal fun getContainingLightClass(original: KtDeclaration): KtLightClass? = +fun getContainingLightClass(original: KtDeclaration): KtLightClass? = (original.containingClassOrObject?.toLightClass() ?: original.containingKtFile.findFacadeClass()) fun getKotlinMemberOrigin(element: PsiElement?): KtDeclaration? { @@ -53,6 +55,30 @@ fun KtExpression.unwrapBlockOrParenthesis(): KtExpression { return innerExpression } +fun KtExpression.readWriteAccess(): ReferenceAccess { + var expression = getQualifiedExpressionForSelectorOrThis() + loop@ while (true) { + val parent = expression.parent + when (parent) { + is KtParenthesizedExpression, is KtAnnotatedExpression, is KtLabeledExpression -> expression = parent as KtExpression + else -> break@loop + } + } + + val assignment = expression.getAssignmentByLHS() + if (assignment != null) { + return when (assignment.operationToken) { + KtTokens.EQ -> ReferenceAccess.WRITE + else -> ReferenceAccess.READ_WRITE + } + } + + return if ((expression.parent as? KtUnaryExpression)?.operationToken in constant { setOf(KtTokens.PLUSPLUS, KtTokens.MINUSMINUS) }) + ReferenceAccess.READ_WRITE + else + ReferenceAccess.READ +} + fun KtElement.canAnalyze(): Boolean { if (!isValid) return false val containingFile = containingFile as? KtFile ?: return false // EA-114080, EA-113475, EA-134193 @@ -68,16 +94,13 @@ val KtTypeReference.nameElement: PsiElement? (it as? KtUserType)?.referenceExpression?.getReferencedNameElement() ?: it.navigationElement } -fun KtClassOrObject.toPsiType(): PsiType { +internal fun KtClassOrObject.toPsiType(): PsiType { val lightClass = toLightClass() ?: return UastErrorType - return if (lightClass is PsiAnonymousClass) - lightClass.baseClassType - else - PsiTypesUtil.getClassType(lightClass) + return PsiTypesUtil.getClassType(lightClass) } fun PsiElement.getMaybeLightElement(sourcePsi: KtExpression? = null): PsiElement? { - if (this is KtProperty && sourcePsi?.readWriteAccess(useResolveForReadWrite = false)?.isWrite == true) { + if (this is KtProperty && sourcePsi?.readWriteAccess()?.isWrite == true) { with(getAccessorLightMethods()) { (setter ?: backingField)?.let { return it } // backingField is for val property assignments in init blocks } @@ -137,3 +160,13 @@ val KtElement.typeOwnerKind: TypeOwnerKind is KtExpression -> TypeOwnerKind.EXPRESSION else -> TypeOwnerKind.UNKNOWN } + +/** Returns true if the given element is written in Kotlin. */ +fun isKotlin(element: PsiElement?): Boolean { + return element != null && isKotlin(element.language) +} + +/** Returns true if the given language is Kotlin. */ +fun isKotlin(language: Language?): Boolean { + return language == KotlinLanguage.INSTANCE +} diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinBinaryExpressionWithTypeKinds.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinBinaryExpressionWithTypeKinds.kt index a9642f0b05c4..65c23a26c034 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinBinaryExpressionWithTypeKinds.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinBinaryExpressionWithTypeKinds.kt @@ -2,12 +2,14 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.UastBinaryExpressionWithTypeKind +@ApiStatus.Internal object KotlinBinaryExpressionWithTypeKinds { @JvmField val NEGATED_INSTANCE_CHECK = UastBinaryExpressionWithTypeKind.InstanceCheck("!is") @JvmField val SAFE_TYPE_CAST = UastBinaryExpressionWithTypeKind.TypeCast("as?") -}
\ No newline at end of file +} diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinBinaryOperators.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinBinaryOperators.kt index 57f53757ef8c..6061f76cb7b9 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinBinaryOperators.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinBinaryOperators.kt @@ -2,8 +2,10 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.UastBinaryOperator +@ApiStatus.Internal object KotlinBinaryOperators { @JvmField val IN = UastBinaryOperator("in") @@ -13,4 +15,4 @@ object KotlinBinaryOperators { @JvmField val RANGE_TO = UastBinaryOperator("..") -}
\ No newline at end of file +} diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinPostfixOperators.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinPostfixOperators.kt index 7c3361d9829d..87cc7e6fe6a3 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinPostfixOperators.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinPostfixOperators.kt @@ -2,9 +2,11 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.UastPostfixOperator +@ApiStatus.Internal object KotlinPostfixOperators { @JvmField val EXCLEXCL = UastPostfixOperator("!!") -}
\ No newline at end of file +} diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinQualifiedExpressionAccessTypes.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinQualifiedExpressionAccessTypes.kt index 562476ea4214..b1826641242f 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinQualifiedExpressionAccessTypes.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinQualifiedExpressionAccessTypes.kt @@ -2,9 +2,11 @@ package org.jetbrains.uast.kotlin +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.UastQualifiedExpressionAccessType +@ApiStatus.Internal object KotlinQualifiedExpressionAccessTypes { @JvmField val SAFE = UastQualifiedExpressionAccessType("?.") -}
\ No newline at end of file +} diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinSpecialExpressionKinds.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinSpecialExpressionKinds.kt index 1bcaf0b89400..9ea4c4df704a 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinSpecialExpressionKinds.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kinds/KotlinSpecialExpressionKinds.kt @@ -2,8 +2,10 @@ package org.jetbrains.uast.kotlin.kinds +import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.UastSpecialExpressionKind +@ApiStatus.Internal object KotlinSpecialExpressionKinds { @JvmField val WHEN = UastSpecialExpressionKind("when") @@ -19,4 +21,4 @@ object KotlinSpecialExpressionKinds { @JvmField val SUPER_DELEGATION = UastSpecialExpressionKind("super_delegation") -}
\ No newline at end of file +} diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kotlinConvertParentUtils.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kotlinConvertParentUtils.kt index eaa86200530f..4bb81ad0e048 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kotlinConvertParentUtils.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/kotlinConvertParentUtils.kt @@ -21,7 +21,7 @@ import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable -fun convertParentImpl( +internal fun convertParentImpl( service: BaseKotlinUastResolveProviderService, uElement: UElement ): UElement? { @@ -122,7 +122,7 @@ fun convertParentImpl( return result } -fun convertParentImpl( +internal fun convertParentImpl( service: BaseKotlinUastResolveProviderService, element: UElement, parent: PsiElement? diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastFakeLightMethod.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastFakeLightMethod.kt index 7491bdce0a96..d1bab0e898ca 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastFakeLightMethod.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastFakeLightMethod.kt @@ -5,6 +5,7 @@ package org.jetbrains.uast.kotlin.psi import com.intellij.openapi.components.ServiceManager import com.intellij.psi.* import com.intellij.psi.impl.light.* +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.elements.KotlinLightTypeParameterBuilder import org.jetbrains.kotlin.asJava.elements.KotlinLightTypeParameterListBuilder import org.jetbrains.kotlin.asJava.elements.KtLightAnnotationForSourceEntry @@ -16,6 +17,7 @@ import org.jetbrains.uast.UastErrorType import org.jetbrains.uast.kotlin.BaseKotlinUastResolveProviderService import org.jetbrains.uast.kotlin.lz +@ApiStatus.Internal class UastFakeLightMethod( original: KtFunction, containingClass: PsiClass, @@ -92,6 +94,7 @@ class UastFakeLightMethod( override fun getParameterList(): PsiParameterList = _parameterList } +@ApiStatus.Internal class UastFakeLightPrimaryConstructor( original: KtClassOrObject, lightClass: PsiClass, @@ -99,6 +102,7 @@ class UastFakeLightPrimaryConstructor( override fun isConstructor(): Boolean = true } +@ApiStatus.Internal abstract class UastFakeLightMethodBase<T: KtDeclaration>( val original: T, containingClass: PsiClass, @@ -167,6 +171,10 @@ abstract class UastFakeLightMethodBase<T: KtDeclaration>( super.isDeprecated() } + override fun isConstructor(): Boolean { + return original is KtConstructor<*> + } + override fun getReturnType(): PsiType? { return baseResolveProviderService.getType(original, this) } diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiParameter.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiParameter.kt index 1be69135dc71..a5c73afc99f5 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiParameter.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiParameter.kt @@ -8,6 +8,7 @@ import com.intellij.psi.PsiFile import com.intellij.psi.PsiParameter import com.intellij.psi.PsiType import com.intellij.psi.impl.light.LightParameter +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression @@ -18,6 +19,7 @@ import org.jetbrains.uast.UastErrorType import org.jetbrains.uast.getParentOfType import org.jetbrains.uast.kotlin.BaseKotlinUastResolveProviderService +@ApiStatus.Internal class UastKotlinPsiParameter( name: String, type: PsiType, @@ -52,6 +54,7 @@ class UastKotlinPsiParameter( } +@ApiStatus.Internal open class UastKotlinPsiParameterBase<T : KtElement>( name: String, type: PsiType, diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiVariable.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiVariable.kt index d52555215da6..b1c2e414ee71 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiVariable.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiVariable.kt @@ -4,6 +4,7 @@ package org.jetbrains.uast.kotlin.psi import com.intellij.openapi.components.ServiceManager import com.intellij.psi.* import com.intellij.psi.impl.light.LightTypeElement +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.asJava.elements.LightVariableBuilder import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.psi.* @@ -12,6 +13,7 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.* +@ApiStatus.Internal class UastKotlinPsiVariable private constructor( manager: PsiManager, name: String, diff --git a/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastCommentLogTestBase.kt b/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastCommentLogTestBase.kt index 48c442ba5215..b36c70478dd6 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastCommentLogTestBase.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastCommentLogTestBase.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.test.common.kotlin +import com.intellij.psi.PsiNamedElement import org.jetbrains.kotlin.idea.test.KotlinTestUtils import org.jetbrains.uast.* import org.jetbrains.uast.test.common.kotlin.UastTestSuffix.TXT @@ -54,11 +55,13 @@ interface UastCommentLogTestBase : UastPluginSelection, UastFileComparisonTestBa } } + private val UElement.nameIfAvailable: String + get() = (javaPsi as? PsiNamedElement)?.name?.takeIf { it.isNotBlank() } ?: "<no name provided>" override fun visitElement(node: UElement): Boolean { if (node is UDeclaration || node is UFile) { printIndent() - appendLine("${node::class.java.simpleName}(") + appendLine("${node::class.java.simpleName}:${node.nameIfAvailable}(") level++ if (node is KotlinUElementWithComments) renderComments(node.comments) } diff --git a/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveApiFixtureTestBase.kt b/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveApiFixtureTestBase.kt index 4ef4f54f83c6..a142741d10f8 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveApiFixtureTestBase.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveApiFixtureTestBase.kt @@ -5,9 +5,12 @@ import com.intellij.openapi.project.Project import com.intellij.psi.* import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture import junit.framework.TestCase +import org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUES +import org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUE_OF import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCaseBase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCaseBase.assertContainsElements import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCaseBase.assertDoesntContain +import org.jetbrains.kotlin.psi.KtConstructor import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.KotlinUFunctionCallExpression @@ -344,6 +347,24 @@ interface UastResolveApiFixtureTestBase : UastPluginSelection { TestCase.assertEquals("bar", resolved.name) } + fun checkResolveLocalDefaultConstructor(myFixture: JavaCodeInsightTestFixture) { + myFixture.configureByText( + "MyClass.kt", """ + fun foo() { + class LocalClass + + val lc = Local<caret>Class() + } + """ + ) + + val uCallExpression = myFixture.file.findElementAt(myFixture.caretOffset).toUElement().getUCallExpression() + .orFail("cant convert to UCallExpression") + val resolved = uCallExpression.resolve() + .orFail("cant resolve from $uCallExpression") + TestCase.assertTrue("Not resolved to local class default constructor", resolved.isConstructor) + TestCase.assertEquals("LocalClass", resolved.name) + } fun checkResolveCompiledAnnotation(myFixture: JavaCodeInsightTestFixture) { myFixture.configureByText( @@ -359,6 +380,27 @@ interface UastResolveApiFixtureTestBase : UastPluginSelection { TestCase.assertEquals("message", resolved.name) } + fun checkResolveSyntheticMethod(myFixture: JavaCodeInsightTestFixture) { + myFixture.configureByText( + "MyClass.kt", """ + class Foo { + @JvmSynthetic + fun bar() {} + } + + fun test() { + Foo().ba<caret>r() + } + """ + ) + + val uCallExpression = myFixture.file.findElementAt(myFixture.caretOffset).toUElement().getUCallExpression() + .orFail("cant convert to UCallExpression") + val resolved = uCallExpression.resolve() + .orFail("cant resolve from $uCallExpression") + TestCase.assertEquals("bar", resolved.name) + } + fun checkAssigningArrayElementType(myFixture: JavaCodeInsightTestFixture) { myFixture.configureByText( "MyClass.kt", """ @@ -405,6 +447,11 @@ interface UastResolveApiFixtureTestBase : UastPluginSelection { fun test1() { } @Deprecated(level = DeprecationLevel.HIDDEN, message="no longer supported") fun test2() { } + + class Test(private val parameter: Int) { + @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) + constructor() : this(42) + } """ ) @@ -421,6 +468,85 @@ interface UastResolveApiFixtureTestBase : UastPluginSelection { TestCase.assertTrue("Hidden level, hasAnnotation", test2.javaPsi.hasAnnotation("kotlin.Deprecated")) TestCase.assertTrue("Hidden level, isDeprecated", test2.javaPsi.isDeprecated) TestCase.assertTrue("Hidden level, public", test2.javaPsi.hasModifierProperty(PsiModifier.PUBLIC)) + + val testClass = uFile.findElementByTextFromPsi<UClass>("Test", strict = false) + TestCase.assertNotNull("can't convert class Test", testClass) + testClass.methods.forEach { mtd -> + if (mtd.sourcePsi is KtConstructor<*>) { + TestCase.assertTrue("$mtd should be marked as a constructor", mtd.isConstructor) + } + } + } + + fun checkSyntheticEnumMethods(myFixture: JavaCodeInsightTestFixture) { + myFixture.configureByText( + "MyClass.kt", """ + enum class MyEnum { + FOO, + BAR; + } + + fun testValueOf() { + MyEnum.valueOf("FOO") + } + + fun testValues() { + MyEnum.values() + } + """ + ) + + val uFile = myFixture.file.toUElement()!! + val myEnum = uFile.findElementByTextFromPsi<UClass>("MyEnum", strict = false) + TestCase.assertNotNull("can't convert enum class MyEnum", myEnum) + + val syntheticMethods = setOf(ENUM_VALUES.identifier, ENUM_VALUE_OF.identifier) + var metValues = false + var metValueOf = false + myEnum.methods.forEach { mtd -> + if (!mtd.isConstructor) { + TestCase.assertNotNull("Null return type of $mtd", mtd.returnType) + } + if (mtd.name in syntheticMethods) { + when (mtd.name) { + ENUM_VALUES.identifier -> metValues = true + ENUM_VALUE_OF.identifier -> metValueOf = true + } + TestCase.assertTrue( + "Missing nullness annotations on $mtd", + mtd.javaPsi.modifierList.annotations.any { it.isNullnessAnnotation } + ) + } + } + TestCase.assertTrue("Expect to meet synthetic values() methods in an enum class", metValues) + TestCase.assertTrue("Expect to meet synthetic valueOf(String) methods in an enum class", metValueOf) + + val testValueOf = uFile.findElementByTextFromPsi<UMethod>("testValueOf", strict = false) + TestCase.assertNotNull("testValueOf should be successfully converted", testValueOf) + val valueOfCall = testValueOf.findElementByText<UElement>("valueOf").uastParent as KotlinUFunctionCallExpression + val resolvedValueOfCall = valueOfCall.resolve() + TestCase.assertNotNull("Unresolved MyEnum.valueOf(String)", resolvedValueOfCall) + TestCase.assertNotNull("Null return type of $resolvedValueOfCall", resolvedValueOfCall?.returnType) + TestCase.assertTrue( + "Missing nullness annotations on $resolvedValueOfCall", + resolvedValueOfCall!!.annotations.any { it.isNullnessAnnotation } + ) + + val testValues = uFile.findElementByTextFromPsi<UMethod>("testValues", strict = false) + TestCase.assertNotNull("testValues should be successfully converted", testValues) + val valuesCall = testValues.findElementByText<UElement>("values").uastParent as KotlinUFunctionCallExpression + val resolvedValuesCall = valuesCall.resolve() + TestCase.assertNotNull("Unresolved MyEnum.values()", resolvedValuesCall) + TestCase.assertNotNull("Null return type of $resolvedValuesCall", resolvedValuesCall?.returnType) + TestCase.assertTrue( + "Missing nullness annotations on $resolvedValuesCall", + resolvedValuesCall!!.annotations.any { it.isNullnessAnnotation } + ) } + private val PsiAnnotation.isNullnessAnnotation: Boolean + get() { + return qualifiedName?.endsWith("NotNull") == true || qualifiedName?.endsWith("Nullable") == true + } + }
\ No newline at end of file diff --git a/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveApiTestBase.kt b/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveApiTestBase.kt index 3245418f400c..76f23c465017 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveApiTestBase.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveApiTestBase.kt @@ -197,4 +197,13 @@ interface UastResolveApiTestBase : UastPluginSelection { checkRetentionAndResolve(rebuiltAnnotation) } } + + fun checkThreadSafe(uFilePath: String, uFile: UFile) { + val safeClass = uFile.classes.find { it.name == "SafeClass" } + ?: throw IllegalStateException("Target class not found at ${uFile.asRefNames()}") + val k_delegate = safeClass.fields.find { it.name == "k\$delegate" } + ?: throw IllegalStateException("Target field not found at ${safeClass.name}") + // Without retrieving delegate expression type, it would be just "Lazy" (w/o type argument). + TestCase.assertEquals("PsiType:Lazy<? extends SimpleSafeClass>", k_delegate.type.toString()) + } } diff --git a/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveEverythingTestBase.kt b/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveEverythingTestBase.kt index 53a772904c50..93c695b45d3c 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveEverythingTestBase.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/test/org/jetbrains/uast/test/common/kotlin/UastResolveEverythingTestBase.kt @@ -4,7 +4,10 @@ */ package org.jetbrains.uast.test.common.kotlin +import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement +import com.intellij.psi.PsiField +import com.intellij.psi.PsiMethod import com.intellij.psi.impl.light.LightMethodBuilder import com.intellij.psi.impl.light.LightParameter import com.intellij.psi.impl.light.LightTypeParameterBuilder @@ -51,14 +54,20 @@ interface UastResolveEverythingTestBase : UastPluginSelection, UastFileCompariso companion object { private val PsiElement?.needsDifferentRender: Boolean get() = this is KtLightElement<*, *> || + this is PsiClass || + this is PsiMethod || + this is PsiField || this is LightMethodBuilder || this is LightVariableBuilder || this is LightParameter || this is LightTypeParameterBuilder private const val TAG_CLASS = "Kotlin_Light_Class" + private const val TAG_CLASS_DECOMPILED = "Decompiled_Class" private const val TAG_METHOD = "Kotlin_Light_Method" + private const val TAG_METHOD_DECOMPILED = "Decompiled_Method" private const val TAG_VARIABLE = "Kotlin_Light_Variable" + private const val TAG_VARIABLE_DECOMPILED = "Decompiled_Variable" private const val TAG_VALUE_PARAMETER = "Kotlin_Light_Value_Parameter" private const val TAG_TYPE_PARAMETER = "Kotlin_Light_Type_Parameter" @@ -74,18 +83,34 @@ interface UastResolveEverythingTestBase : UastPluginSelection, UastFileCompariso private val REGEXES: Map<Regex, String> = mapOf( Regex("^FirLight.*Class.*Symbol:") to "$TAG_CLASS:", + Regex("^PsiClass:.+$") to TAG_CLASS_DECOMPILED, + Regex("^FirLightConstructorForSymbol:.+$") to TAG_METHOD, Regex("^FirLight.*Method.*Symbol:.+$") to TAG_METHOD, + Regex("^KtUltraLightMethodForSourceDeclaration:.+$") to TAG_METHOD, Regex("^LightMethodBuilder:.+$") to TAG_METHOD, + Regex("^KtLightMethodForDecompiledDeclaration of .+:.+$") to TAG_METHOD_DECOMPILED, + Regex("^PsiMethod:.+$") to TAG_METHOD_DECOMPILED, + Regex("^KtLightField:.+$") to TAG_VARIABLE, Regex("^LightVariableBuilder:.+$") to TAG_VARIABLE, + Regex("^KtLightFieldForDecompiledDeclaration of .+:.+$") to TAG_VARIABLE_DECOMPILED, + Regex("^KtLightEnumEntryForDecompiledDeclaration.+:.+$") to TAG_VARIABLE_DECOMPILED, + Regex("^PsiField:.+$") to TAG_VARIABLE_DECOMPILED, + Regex("^Fir Light Parameter .+$") to TAG_VALUE_PARAMETER, Regex("^FirLightTypeParameter:.+$") to TAG_TYPE_PARAMETER, Regex("^Light PSI class: .+$") to TAG_TYPE_PARAMETER, + + // NB: tags are recursively built, e.g., KtLightMethodForDecompiled... of KtLightClassForDecompiled... of ... + // Therefore, we should try regex patterns for member names before class names. + Regex("^KtLight.*ClassForDecompiled.+ of .+:.+$") to TAG_CLASS_DECOMPILED, + Regex("^KtLightClassForDecompiledFacade:.+$") to TAG_CLASS_DECOMPILED, ) + } } |