diff --git a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt index ca6e859f294..bc2bd0eb326 100644 --- a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt +++ b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt @@ -5,11 +5,18 @@ package org.jetbrains.uast.kotlin +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.psi.* import org.jetbrains.uast.* interface BaseKotlinConverter { + fun convertDeclaration( + element: PsiElement, + givenParent: UElement?, + requiredTypes: Array> + ): UElement? + fun convertReceiverParameter(receiver: KtTypeReference): UParameter? { val call = (receiver.parent as? KtCallableDeclaration) ?: return null if (call.receiverTypeReference != receiver) return null diff --git a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinSupertypeDelegationUExpression.kt b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinSupertypeDelegationUExpression.kt new file mode 100644 index 00000000000..c534a52cbd8 --- /dev/null +++ b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinSupertypeDelegationUExpression.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.uast.kotlin + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.psi.KtDelegatedSuperTypeEntry +import org.jetbrains.uast.* +import org.jetbrains.uast.kotlin.kinds.KotlinSpecialExpressionKinds + +class KotlinSupertypeDelegationUExpression( + override val sourcePsi: KtDelegatedSuperTypeEntry, + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UExpressionList { + + override val psi: PsiElement + get() = sourcePsi + + val typeReference: UTypeReferenceExpression? by lz { + sourcePsi.typeReference?.let { + KotlinUTypeReferenceExpression(it, this) { + baseResolveProviderService.resolveToType(it, this) ?: UastErrorType + } + } + } + + val delegateExpression: UExpression? by lz { + sourcePsi.delegateExpression?.let { languagePlugin?.convertElement(it, this, UExpression::class.java) as? UExpression } + } + + override val expressions: List + get() = listOfNotNull(typeReference, delegateExpression) + + override val kind: UastSpecialExpressionKind + get() = KotlinSpecialExpressionKinds.SUPER_DELEGATION +} diff --git a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/baseKotlinInternalUastUtils.kt b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/baseKotlinInternalUastUtils.kt index 031ec5f0824..d1e0afb2813 100644 --- a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/baseKotlinInternalUastUtils.kt +++ b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/baseKotlinInternalUastUtils.kt @@ -5,8 +5,10 @@ package org.jetbrains.uast.kotlin +import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile +import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightMember @@ -52,3 +54,6 @@ fun KtElement.canAnalyze(): Boolean { if (containingFile.doNotAnalyze != null) return false // To prevent exceptions during analysis return true } + +val PsiClass.isEnumEntryLightClass: Boolean + get() = (this as? KtLightClass)?.kotlinOrigin is KtEnumEntry diff --git a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/converterUtils.kt b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/converterUtils.kt index 9cb5663b94b..036466033a5 100644 --- a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/converterUtils.kt +++ b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/internal/converterUtils.kt @@ -6,9 +6,11 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMethod import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.internal.KotlinFakeUElement @@ -66,3 +68,19 @@ fun wrapExpressionBody(function: UElement, bodyExpression: KtExpression): UExpre } else -> function.getLanguagePlugin().convertElement(bodyExpression, function) as? UExpression } + +fun reportConvertFailure(psiMethod: PsiMethod): Nothing { + val isValid = psiMethod.isValid + val report = KotlinExceptionWithAttachments( + "cant convert $psiMethod of ${psiMethod.javaClass} to UMethod" + if (!isValid) " (method is not valid)" else "" + ) + + if (isValid) { + report.withAttachment("method", psiMethod.text) + psiMethod.containingFile?.let { + report.withAttachment("file", it.text) + } + } + + throw report +} diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt index 4d6be47e41a..85ff539d130 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt @@ -34,7 +34,7 @@ internal object FirKotlinConverter : BaseKotlinConverter { ?: convertPsiElement(element, givenParent, requiredTypes) } - internal fun convertDeclaration( + override fun convertDeclaration( element: PsiElement, givenParent: UElement?, requiredTypes: Array> @@ -104,6 +104,10 @@ internal object FirKotlinConverter : BaseKotlinConverter { // TODO: KtAnnotationEntry // TODO: KtCallExpression (for nested annotation) + is KtDelegatedSuperTypeEntry -> el { + KotlinSupertypeDelegationUExpression(original, givenParent) + } + else -> null } } diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUClass.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUClass.kt index 894f1d3c0ab..f721e0c4ab6 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUClass.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUClass.kt @@ -5,17 +5,21 @@ package org.jetbrains.uast.kotlin -import com.intellij.psi.PsiClass -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiFile -import com.intellij.psi.PsiIdentifier +import com.intellij.psi.* import org.jetbrains.kotlin.asJava.classes.KtLightClass +import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade +import org.jetbrains.kotlin.asJava.elements.KtLightMethod +import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtDelegatedSuperTypeEntry import org.jetbrains.kotlin.psi.KtObjectDeclaration +import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.uast.* import org.jetbrains.uast.internal.acceptList import org.jetbrains.uast.visitor.UastVisitor +// TODO: can be commonized once annotation is handled sealed class AbstractFirKotlinUClass( givenParent: UElement? ) : KotlinAbstractUElement(givenParent), UClass, UAnchorOwner { @@ -41,11 +45,14 @@ sealed class AbstractFirKotlinUClass( KotlinUTypeReferenceExpression(it, this) } - // TODO: delegateExpressions + val delegateExpressions: List + get() = ktClass?.superTypeListEntries.orEmpty() + .filterIsInstance() + .map { KotlinSupertypeDelegationUExpression(it, this) } override fun accept(visitor: UastVisitor) { if (visitor.visitClass(this)) return - // TODO: delegate expressions + delegateExpressions.acceptList(visitor) uAnnotations.acceptList(visitor) uastDeclarations.acceptList(visitor) visitor.afterVisitClass(this) @@ -63,6 +70,7 @@ sealed class AbstractFirKotlinUClass( } } +// TODO: can be commonized once *KotlinUClass is commonized class FirKotlinUClass( override val javaPsi: KtLightClass, givenParent: UElement?, @@ -92,8 +100,13 @@ class FirKotlinUClass( } override fun getInnerClasses(): Array { - // TODO: Not yet implemented - return super.getInnerClasses() + // filter DefaultImpls to avoid processing same methods from original interface multiple times + // filter Enum entry classes to avoid duplication with PsiEnumConstant initializer class + return psi.innerClasses.filter { + it.name != JvmAbi.DEFAULT_IMPLS_CLASS_NAME && !it.isEnumEntryLightClass + }.mapNotNull { + languagePlugin?.convertOpt(it, this) + }.toTypedArray() } override fun getSuperClass(): UClass? { @@ -101,7 +114,6 @@ class FirKotlinUClass( } override fun getFields(): Array { - // TODO: Not yet implemented return super.getFields() } @@ -111,8 +123,50 @@ class FirKotlinUClass( } override fun getMethods(): Array { - // TODO: Not yet implemented - return super.getMethods() + val hasPrimaryConstructor = ktClass?.hasPrimaryConstructor() ?: false + var secondaryConstructorsCount = 0 + + fun createUMethod(psiMethod: PsiMethod): UMethod { + return if (psiMethod is KtLightMethod && psiMethod.isConstructor) { + if (!hasPrimaryConstructor && secondaryConstructorsCount++ == 0) + FirKotlinSecondaryConstructorWithInitializersUMethod(ktClass, psiMethod, this) + else + FirKotlinConstructorUMethod(ktClass, psiMethod, this) + } else { + languagePlugin?.convertOpt(psiMethod, this) ?: reportConvertFailure(psiMethod) + } + } + + fun isDelegatedMethod(psiMethod: PsiMethod) = psiMethod is KtLightMethod && psiMethod.isDelegated + + val result = ArrayList(javaPsi.methods.size) + val handledKtDeclarations = mutableSetOf() + + for (lightMethod in javaPsi.methods) { + if (isDelegatedMethod(lightMethod)) continue + val uMethod = createUMethod(lightMethod) + result.add(uMethod) + + // Ensure we pick the main Kotlin origin, not the auxiliary one + val kotlinOrigin = (lightMethod as? KtLightMethod)?.kotlinOrigin ?: uMethod.sourcePsi + handledKtDeclarations.addIfNotNull(kotlinOrigin) + } + + val ktDeclarations: List = run ktDeclarations@{ + ktClass?.let { return@ktDeclarations it.declarations } + (javaPsi as? KtLightClassForFacade)?.let { facade -> + return@ktDeclarations facade.files.flatMap { file -> file.declarations } + } + emptyList() + } + + ktDeclarations.asSequence() + .filterNot { handledKtDeclarations.contains(it) } + .mapNotNullTo(result) { + baseResolveProviderService.baseKotlinConverter.convertDeclaration(it, this, arrayOf(UElement::class.java)) as? UMethod + } + + return result.toTypedArray() } } diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUMethod.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUMethod.kt index d4eb44298b6..da56b6c78e7 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUMethod.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUMethod.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.asJava.elements.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.utils.SmartList +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.uast.* open class FirKotlinUMethod( @@ -124,7 +125,8 @@ open class FirKotlinUMethod( } } -class FirKotlinConstructorUMethod( +// TODO: can be commonized if *KotlinUMethod is commonized +open class FirKotlinConstructorUMethod( private val ktClass: KtClassOrObject?, override val psi: PsiMethod, kotlinOrigin: KtDeclaration?, @@ -141,6 +143,29 @@ class FirKotlinConstructorUMethod( val isPrimary: Boolean get() = sourcePsi is KtPrimaryConstructor || sourcePsi is KtClassOrObject + override val uastBody: UExpression? by lz { + val delegationCall: KtCallElement? = sourcePsi.let { + when { + isPrimary -> ktClass?.superTypeListEntries?.firstIsInstanceOrNull() + it is KtSecondaryConstructor -> it.getDelegationCall() + else -> null + } + } + val bodyExpressions = getBodyExpressions() + if (delegationCall == null && bodyExpressions.isEmpty()) return@lz null + KotlinLazyUBlockExpression(this) { uastParent -> + SmartList().apply { + delegationCall?.let { + // TODO: function call for delegationCall + add(UastEmptyExpression(uastParent)) + } + bodyExpressions.forEach { + add(baseResolveProviderService.baseKotlinConverter.convertOrEmpty(it, uastParent)) + } + } + } + } + override val uastAnchor: UIdentifier? by lz { KotlinUIdentifier( javaPsi.nameIdentifier, @@ -148,4 +173,27 @@ class FirKotlinConstructorUMethod( this ) } + + protected open fun getBodyExpressions(): List { + if (isPrimary) return getInitializers() + val bodyExpression = (sourcePsi as? KtFunction)?.bodyExpression ?: return emptyList() + if (bodyExpression is KtBlockExpression) return bodyExpression.statements + return listOf(bodyExpression) + } + + protected fun getInitializers(): List { + return ktClass?.getAnonymousInitializers()?.mapNotNull { it.body } ?: emptyList() + } +} + +// TODO: can be commonized if *KotlinUMethod is commonized +// also reuse the comments there (about KT-21617) +class FirKotlinSecondaryConstructorWithInitializersUMethod( + ktClass: KtClassOrObject?, + psi: KtLightMethod, + givenParent: UElement? +) : FirKotlinConstructorUMethod(ktClass, psi, givenParent) { + override fun getBodyExpressions(): List { + return getInitializers() + super.getBodyExpressions() + } } diff --git a/plugins/uast-kotlin-fir/testData/legacyRenderLog/ConstructorDelegate.log.fir.txt b/plugins/uast-kotlin-fir/testData/legacyRenderLog/ConstructorDelegate.log.fir.txt index 9e6acc5392d..683fddb570c 100644 --- a/plugins/uast-kotlin-fir/testData/legacyRenderLog/ConstructorDelegate.log.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyRenderLog/ConstructorDelegate.log.fir.txt @@ -16,5 +16,11 @@ UFile (package = ) UBlockExpression [!] UnknownKotlinExpression (CALL_EXPRESSION) UClass (name = Derived) + UExpressionList (super_delegation) + UTypeReferenceExpression (name = Base) + [!] UnknownKotlinExpression (CALL_EXPRESSION) + UExpressionList (super_delegation) + UTypeReferenceExpression (name = java.lang.CharSequence) + ULiteralExpression (value = "abc") UMethod (name = Derived) UParameter (name = b) diff --git a/plugins/uast-kotlin-fir/testData/legacyRenderLog/Constructors.log.fir.txt b/plugins/uast-kotlin-fir/testData/legacyRenderLog/Constructors.log.fir.txt index e09da32c0be..cbc48fb637e 100644 --- a/plugins/uast-kotlin-fir/testData/legacyRenderLog/Constructors.log.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyRenderLog/Constructors.log.fir.txt @@ -5,20 +5,34 @@ UFile (package = ) UParameter (name = str) UMethod (name = A) UParameter (name = i) + UBlockExpression + UastEmptyExpression UMethod (name = getStr) UClass (name = AWithInit) UField (name = str) UMethod (name = AWithInit) UParameter (name = str) + UBlockExpression + UBlockExpression + [!] UnknownKotlinExpression (CALL_EXPRESSION) UMethod (name = AWithInit) UParameter (name = i) + UBlockExpression + UastEmptyExpression UMethod (name = getStr) UClass (name = AWith2Init) UField (name = str) UMethod (name = AWith2Init) UParameter (name = str) + UBlockExpression + UBlockExpression + [!] UnknownKotlinExpression (CALL_EXPRESSION) + UBlockExpression + [!] UnknownKotlinExpression (CALL_EXPRESSION) UMethod (name = AWith2Init) UParameter (name = i) + UBlockExpression + UastEmptyExpression UMethod (name = getStr) UClass (name = AOnlyInit) UMethod (name = AOnlyInit) @@ -27,10 +41,12 @@ UFile (package = ) UMethod (name = AWithSecondary) UParameter (name = i) UBlockExpression + UastEmptyExpression [!] UnknownKotlinExpression (BINARY_EXPRESSION) UMethod (name = AWithSecondary) UParameter (name = s) UBlockExpression + UastEmptyExpression [!] UnknownKotlinExpression (BINARY_EXPRESSION) UMethod (name = getA) UMethod (name = setA) @@ -40,10 +56,14 @@ UFile (package = ) UMethod (name = AWithSecondaryInit) UParameter (name = i) UBlockExpression + UastEmptyExpression + UBlockExpression + [!] UnknownKotlinExpression (CALL_EXPRESSION) [!] UnknownKotlinExpression (BINARY_EXPRESSION) UMethod (name = AWithSecondaryInit) UParameter (name = s) UBlockExpression + UastEmptyExpression [!] UnknownKotlinExpression (BINARY_EXPRESSION) [!] UnknownKotlinExpression (PROPERTY) [!] UnknownKotlinExpression (DOT_QUALIFIED_EXPRESSION) @@ -54,4 +74,7 @@ UFile (package = ) UField (name = a) UMethod (name = AWithFieldInit) UParameter (name = i) + UBlockExpression + UBlockExpression + [!] UnknownKotlinExpression (BINARY_EXPRESSION) UMethod (name = getA) diff --git a/plugins/uast-kotlin-fir/testData/legacyRenderLog/Constructors.render.fir.txt b/plugins/uast-kotlin-fir/testData/legacyRenderLog/Constructors.render.fir.txt index dd7b3b51df9..23654f82bb0 100644 --- a/plugins/uast-kotlin-fir/testData/legacyRenderLog/Constructors.render.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyRenderLog/Constructors.render.fir.txt @@ -1,21 +1,38 @@ public final class A { private final var str: java.lang.String public fun A(str: java.lang.String) = UastEmptyExpression - public fun A(i: int) = UastEmptyExpression + public fun A(i: int) { + UastEmptyExpression + } public final fun getStr() : java.lang.String = UastEmptyExpression } public final class AWithInit { private final var str: java.lang.String - public fun AWithInit(str: java.lang.String) = UastEmptyExpression - public fun AWithInit(i: int) = UastEmptyExpression + public fun AWithInit(str: java.lang.String) { + { + [!] UnknownKotlinExpression (CALL_EXPRESSION) + } + } + public fun AWithInit(i: int) { + UastEmptyExpression + } public final fun getStr() : java.lang.String = UastEmptyExpression } public final class AWith2Init { private final var str: java.lang.String - public fun AWith2Init(str: java.lang.String) = UastEmptyExpression - public fun AWith2Init(i: int) = UastEmptyExpression + public fun AWith2Init(str: java.lang.String) { + { + [!] UnknownKotlinExpression (CALL_EXPRESSION) + } + { + [!] UnknownKotlinExpression (CALL_EXPRESSION) + } + } + public fun AWith2Init(i: int) { + UastEmptyExpression + } public final fun getStr() : java.lang.String = UastEmptyExpression } @@ -26,9 +43,11 @@ public final class AOnlyInit { public final class AWithSecondary { private var a: java.lang.String public fun AWithSecondary(i: int) { + UastEmptyExpression [!] UnknownKotlinExpression (BINARY_EXPRESSION) } public fun AWithSecondary(s: java.lang.String) { + UastEmptyExpression [!] UnknownKotlinExpression (BINARY_EXPRESSION) } public final fun getA() : java.lang.String = UastEmptyExpression @@ -38,9 +57,14 @@ public final class AWithSecondary { public final class AWithSecondaryInit { private var a: java.lang.String public fun AWithSecondaryInit(i: int) { + UastEmptyExpression + { + [!] UnknownKotlinExpression (CALL_EXPRESSION) + } [!] UnknownKotlinExpression (BINARY_EXPRESSION) } public fun AWithSecondaryInit(s: java.lang.String) { + UastEmptyExpression [!] UnknownKotlinExpression (BINARY_EXPRESSION) [!] UnknownKotlinExpression (PROPERTY) [!] UnknownKotlinExpression (DOT_QUALIFIED_EXPRESSION) @@ -51,6 +75,10 @@ public final class AWithSecondaryInit { public final class AWithFieldInit { private final var a: java.lang.String - public fun AWithFieldInit(i: int) = UastEmptyExpression + public fun AWithFieldInit(i: int) { + { + [!] UnknownKotlinExpression (BINARY_EXPRESSION) + } + } public final fun getA() : java.lang.String = UastEmptyExpression } diff --git a/plugins/uast-kotlin-fir/testData/legacyRenderLog/PropertyReferences.log.fir.txt b/plugins/uast-kotlin-fir/testData/legacyRenderLog/PropertyReferences.log.fir.txt index 45e19b456e4..2daf75a4857 100644 --- a/plugins/uast-kotlin-fir/testData/legacyRenderLog/PropertyReferences.log.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyRenderLog/PropertyReferences.log.fir.txt @@ -22,6 +22,9 @@ UFile (package = ) UField (name = mutableProp) UMethod (name = A) UParameter (name = init) + UBlockExpression + UBlockExpression + [!] UnknownKotlinExpression (BINARY_EXPRESSION) UMethod (name = getMutableProp) UMethod (name = setMutableProp) UParameter (name = value) diff --git a/plugins/uast-kotlin-fir/testData/legacyRenderLog/PropertyReferences.render.fir.txt b/plugins/uast-kotlin-fir/testData/legacyRenderLog/PropertyReferences.render.fir.txt index 7070796728e..dd060d33d50 100644 --- a/plugins/uast-kotlin-fir/testData/legacyRenderLog/PropertyReferences.render.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyRenderLog/PropertyReferences.render.fir.txt @@ -19,7 +19,11 @@ public final class PropertyReferencesKt { public final class A { private var privateProp: int = "not-yet-compile-time-constant" private var mutableProp: int - public fun A(init: int) = UastEmptyExpression + public fun A(init: int) { + { + [!] UnknownKotlinExpression (BINARY_EXPRESSION) + } + } public final fun getMutableProp() : int = UastEmptyExpression public final fun setMutableProp(value: int) : void = UastEmptyExpression public final fun add(x: int) : int { diff --git a/plugins/uast-kotlin-fir/testData/legacyRenderLog/SuperCalls.log.fir.txt b/plugins/uast-kotlin-fir/testData/legacyRenderLog/SuperCalls.log.fir.txt index 19114c95643..3eced4e46ed 100644 --- a/plugins/uast-kotlin-fir/testData/legacyRenderLog/SuperCalls.log.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyRenderLog/SuperCalls.log.fir.txt @@ -12,6 +12,8 @@ UFile (package = ) UParameter (name = str) UMethod (name = A) UParameter (name = i) + UBlockExpression + UastEmptyExpression UMethod (name = getStr) UMethod (name = foo) UParameter (name = a) @@ -19,12 +21,17 @@ UFile (package = ) UClass (name = B) UMethod (name = B) UParameter (name = param) + UBlockExpression + UastEmptyExpression UClass (name = C) UMethod (name = C) UParameter (name = p) + UBlockExpression + UastEmptyExpression UMethod (name = C) UParameter (name = i) UBlockExpression + UastEmptyExpression [!] UnknownKotlinExpression (CALL_EXPRESSION) UMethod (name = foo) UParameter (name = a) diff --git a/plugins/uast-kotlin-fir/testData/legacyRenderLog/SuperCalls.render.fir.txt b/plugins/uast-kotlin-fir/testData/legacyRenderLog/SuperCalls.render.fir.txt index e9324c42781..5d7b928c99c 100644 --- a/plugins/uast-kotlin-fir/testData/legacyRenderLog/SuperCalls.render.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyRenderLog/SuperCalls.render.fir.txt @@ -8,19 +8,26 @@ public final class SuperCallsKt { public class A { private final var str: java.lang.String public fun A(str: java.lang.String) = UastEmptyExpression - public fun A(i: int) = UastEmptyExpression + public fun A(i: int) { + UastEmptyExpression + } public final fun getStr() : java.lang.String = UastEmptyExpression public fun foo(a: long) : void { } } public final class B : A { - public fun B(param: java.lang.String) = UastEmptyExpression + public fun B(param: java.lang.String) { + UastEmptyExpression + } } public final class C : A { - public fun C(p: java.lang.String) = UastEmptyExpression + public fun C(p: java.lang.String) { + UastEmptyExpression + } public fun C(i: int) { + UastEmptyExpression [!] UnknownKotlinExpression (CALL_EXPRESSION) } public fun foo(a: long) : void { diff --git a/plugins/uast-kotlin-fir/testData/legacyTypes/ConstructorDelegate.types.fir.txt b/plugins/uast-kotlin-fir/testData/legacyTypes/ConstructorDelegate.types.fir.txt index 0cff6eb084a..c5783e0f196 100644 --- a/plugins/uast-kotlin-fir/testData/legacyTypes/ConstructorDelegate.types.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyTypes/ConstructorDelegate.types.fir.txt @@ -16,5 +16,11 @@ UFile (package = ) [public final class ConstructorDelegateKt {...] UBlockExpression [{...}] : PsiType:Unit [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] UClass (name = Derived) [public final class Derived : Base, java.lang.CharSequence {...}] + UExpressionList (super_delegation) [super_delegation Base : [!] UnknownKotlinExpression (CALL_EXPRESSION)] + UTypeReferenceExpression (name = Base) [Base] + [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] + UExpressionList (super_delegation) [super_delegation java.lang.CharSequence : "abc"] + UTypeReferenceExpression (name = java.lang.CharSequence) [java.lang.CharSequence] + ULiteralExpression (value = "abc") ["abc"] : PsiType:String UMethod (name = Derived) [public fun Derived(b: Base) = UastEmptyExpression] UParameter (name = b) [var b: Base] diff --git a/plugins/uast-kotlin-fir/testData/legacyTypes/Constructors.types.fir.txt b/plugins/uast-kotlin-fir/testData/legacyTypes/Constructors.types.fir.txt index d8998f3fbaa..75cbfa8af90 100644 --- a/plugins/uast-kotlin-fir/testData/legacyTypes/Constructors.types.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyTypes/Constructors.types.fir.txt @@ -3,22 +3,36 @@ UFile (package = ) [public final class A {...] UField (name = str) [private final var str: java.lang.String] UMethod (name = A) [public fun A(str: java.lang.String) = UastEmptyExpression] UParameter (name = str) [var str: java.lang.String] - UMethod (name = A) [public fun A(i: int) = UastEmptyExpression] + UMethod (name = A) [public fun A(i: int) {...}] UParameter (name = i) [var i: int] + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] UMethod (name = getStr) [public final fun getStr() : java.lang.String = UastEmptyExpression] UClass (name = AWithInit) [public final class AWithInit {...}] UField (name = str) [private final var str: java.lang.String] - UMethod (name = AWithInit) [public fun AWithInit(str: java.lang.String) = UastEmptyExpression] + UMethod (name = AWithInit) [public fun AWithInit(str: java.lang.String) {...}] UParameter (name = str) [var str: java.lang.String] - UMethod (name = AWithInit) [public fun AWithInit(i: int) = UastEmptyExpression] + UBlockExpression [{...}] + UBlockExpression [{...}] : PsiType:Unit + [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] + UMethod (name = AWithInit) [public fun AWithInit(i: int) {...}] UParameter (name = i) [var i: int] + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] UMethod (name = getStr) [public final fun getStr() : java.lang.String = UastEmptyExpression] UClass (name = AWith2Init) [public final class AWith2Init {...}] UField (name = str) [private final var str: java.lang.String] - UMethod (name = AWith2Init) [public fun AWith2Init(str: java.lang.String) = UastEmptyExpression] + UMethod (name = AWith2Init) [public fun AWith2Init(str: java.lang.String) {...}] UParameter (name = str) [var str: java.lang.String] - UMethod (name = AWith2Init) [public fun AWith2Init(i: int) = UastEmptyExpression] + UBlockExpression [{...}] + UBlockExpression [{...}] : PsiType:Unit + [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] + UBlockExpression [{...}] : PsiType:Unit + [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] + UMethod (name = AWith2Init) [public fun AWith2Init(i: int) {...}] UParameter (name = i) [var i: int] + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] UMethod (name = getStr) [public final fun getStr() : java.lang.String = UastEmptyExpression] UClass (name = AOnlyInit) [public final class AOnlyInit {...}] UMethod (name = AOnlyInit) [public fun AOnlyInit() = UastEmptyExpression] @@ -26,11 +40,13 @@ UFile (package = ) [public final class A {...] UField (name = a) [private var a: java.lang.String] UMethod (name = AWithSecondary) [public fun AWithSecondary(i: int) {...}] UParameter (name = i) [var i: int] - UBlockExpression [{...}] : PsiType:Unit + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] UMethod (name = AWithSecondary) [public fun AWithSecondary(s: java.lang.String) {...}] UParameter (name = s) [var s: java.lang.String] - UBlockExpression [{...}] : PsiType:Unit + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] UMethod (name = getA) [public final fun getA() : java.lang.String = UastEmptyExpression] UMethod (name = setA) [public final fun setA(value: java.lang.String) : void = UastEmptyExpression] @@ -39,11 +55,15 @@ UFile (package = ) [public final class A {...] UField (name = a) [private var a: java.lang.String] UMethod (name = AWithSecondaryInit) [public fun AWithSecondaryInit(i: int) {...}] UParameter (name = i) [var i: int] - UBlockExpression [{...}] : PsiType:Unit + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] + UBlockExpression [{...}] : PsiType:Unit + [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] UMethod (name = AWithSecondaryInit) [public fun AWithSecondaryInit(s: java.lang.String) {...}] UParameter (name = s) [var s: java.lang.String] - UBlockExpression [{...}] : PsiType:String + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] [!] UnknownKotlinExpression (PROPERTY) [[!] UnknownKotlinExpression (PROPERTY)] [!] UnknownKotlinExpression (DOT_QUALIFIED_EXPRESSION) [[!] UnknownKotlinExpression (DOT_QUALIFIED_EXPRESSION)] @@ -52,6 +72,9 @@ UFile (package = ) [public final class A {...] UParameter (name = value) [var value: java.lang.String] UClass (name = AWithFieldInit) [public final class AWithFieldInit {...}] UField (name = a) [private final var a: java.lang.String] - UMethod (name = AWithFieldInit) [public fun AWithFieldInit(i: int) = UastEmptyExpression] + UMethod (name = AWithFieldInit) [public fun AWithFieldInit(i: int) {...}] UParameter (name = i) [var i: int] + UBlockExpression [{...}] + UBlockExpression [{...}] : PsiType:Unit + [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] UMethod (name = getA) [public final fun getA() : java.lang.String = UastEmptyExpression] diff --git a/plugins/uast-kotlin-fir/testData/legacyTypes/PropertyReferences.types.fir.txt b/plugins/uast-kotlin-fir/testData/legacyTypes/PropertyReferences.types.fir.txt index dd529ca9387..49f3f7dc909 100644 --- a/plugins/uast-kotlin-fir/testData/legacyTypes/PropertyReferences.types.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyTypes/PropertyReferences.types.fir.txt @@ -20,8 +20,11 @@ UFile (package = ) [public final class PropertyReferencesKt {...] UField (name = privateProp) [private var privateProp: int = "not-yet-compile-time-constant"] ULiteralExpression (value = "not-yet-compile-time-constant") ["not-yet-compile-time-constant"] : PsiType:int UField (name = mutableProp) [private var mutableProp: int] - UMethod (name = A) [public fun A(init: int) = UastEmptyExpression] + UMethod (name = A) [public fun A(init: int) {...}] UParameter (name = init) [var init: int] + UBlockExpression [{...}] + UBlockExpression [{...}] : PsiType:Unit + [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] UMethod (name = getMutableProp) [public final fun getMutableProp() : int = UastEmptyExpression] UMethod (name = setMutableProp) [public final fun setMutableProp(value: int) : void = UastEmptyExpression] UParameter (name = value) [var value: int] diff --git a/plugins/uast-kotlin-fir/testData/legacyTypes/SuperCalls.types.fir.txt b/plugins/uast-kotlin-fir/testData/legacyTypes/SuperCalls.types.fir.txt index b59961ac98a..67610c434dd 100644 --- a/plugins/uast-kotlin-fir/testData/legacyTypes/SuperCalls.types.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyTypes/SuperCalls.types.fir.txt @@ -10,21 +10,28 @@ UFile (package = ) [public final class SuperCallsKt {...] UField (name = str) [private final var str: java.lang.String] UMethod (name = A) [public fun A(str: java.lang.String) = UastEmptyExpression] UParameter (name = str) [var str: java.lang.String] - UMethod (name = A) [public fun A(i: int) = UastEmptyExpression] + UMethod (name = A) [public fun A(i: int) {...}] UParameter (name = i) [var i: int] + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] UMethod (name = getStr) [public final fun getStr() : java.lang.String = UastEmptyExpression] UMethod (name = foo) [public fun foo(a: long) : void {...}] UParameter (name = a) [var a: long] UBlockExpression [{...}] : PsiType:Unit UClass (name = B) [public final class B : A {...}] - UMethod (name = B) [public fun B(param: java.lang.String) = UastEmptyExpression] + UMethod (name = B) [public fun B(param: java.lang.String) {...}] UParameter (name = param) [var param: java.lang.String] + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] UClass (name = C) [public final class C : A {...}] - UMethod (name = C) [public fun C(p: java.lang.String) = UastEmptyExpression] + UMethod (name = C) [public fun C(p: java.lang.String) {...}] UParameter (name = p) [var p: java.lang.String] + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] UMethod (name = C) [public fun C(i: int) {...}] UParameter (name = i) [var i: int] - UBlockExpression [{...}] : PsiType:Unit + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] UMethod (name = foo) [public fun foo(a: long) : void {...}] UParameter (name = a) [var a: long] diff --git a/plugins/uast-kotlin-fir/testData/legacyValues/ConstructorDelegate.values.fir.txt b/plugins/uast-kotlin-fir/testData/legacyValues/ConstructorDelegate.values.fir.txt index 84da5f592ab..aa28a36aecd 100644 --- a/plugins/uast-kotlin-fir/testData/legacyValues/ConstructorDelegate.values.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyValues/ConstructorDelegate.values.fir.txt @@ -16,5 +16,11 @@ UFile (package = ) [public final class ConstructorDelegateKt {...] UBlockExpression [{...}] = Undetermined [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] = Undetermined UClass (name = Derived) [public final class Derived : Base, java.lang.CharSequence {...}] + UExpressionList (super_delegation) [super_delegation Base : [!] UnknownKotlinExpression (CALL_EXPRESSION)] = Undetermined + UTypeReferenceExpression (name = Base) [Base] = Undetermined + [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] = Undetermined + UExpressionList (super_delegation) [super_delegation java.lang.CharSequence : "abc"] = Undetermined + UTypeReferenceExpression (name = java.lang.CharSequence) [java.lang.CharSequence] = Undetermined + ULiteralExpression (value = "abc") ["abc"] = Undetermined UMethod (name = Derived) [public fun Derived(b: Base) = UastEmptyExpression] UParameter (name = b) [var b: Base] diff --git a/plugins/uast-kotlin-fir/testData/legacyValues/Constructors.values.fir.txt b/plugins/uast-kotlin-fir/testData/legacyValues/Constructors.values.fir.txt index 0db3ad508db..c2a3e51d41c 100644 --- a/plugins/uast-kotlin-fir/testData/legacyValues/Constructors.values.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyValues/Constructors.values.fir.txt @@ -3,22 +3,36 @@ UFile (package = ) [public final class A {...] UField (name = str) [private final var str: java.lang.String] UMethod (name = A) [public fun A(str: java.lang.String) = UastEmptyExpression] UParameter (name = str) [var str: java.lang.String] - UMethod (name = A) [public fun A(i: int) = UastEmptyExpression] + UMethod (name = A) [public fun A(i: int) {...}] UParameter (name = i) [var i: int] + UBlockExpression [{...}] = Undetermined + UastEmptyExpression [UastEmptyExpression] = Undetermined UMethod (name = getStr) [public final fun getStr() : java.lang.String = UastEmptyExpression] UClass (name = AWithInit) [public final class AWithInit {...}] UField (name = str) [private final var str: java.lang.String] - UMethod (name = AWithInit) [public fun AWithInit(str: java.lang.String) = UastEmptyExpression] + UMethod (name = AWithInit) [public fun AWithInit(str: java.lang.String) {...}] UParameter (name = str) [var str: java.lang.String] - UMethod (name = AWithInit) [public fun AWithInit(i: int) = UastEmptyExpression] + UBlockExpression [{...}] = Undetermined + UBlockExpression [{...}] = Undetermined + [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] = Undetermined + UMethod (name = AWithInit) [public fun AWithInit(i: int) {...}] UParameter (name = i) [var i: int] + UBlockExpression [{...}] = Undetermined + UastEmptyExpression [UastEmptyExpression] = Undetermined UMethod (name = getStr) [public final fun getStr() : java.lang.String = UastEmptyExpression] UClass (name = AWith2Init) [public final class AWith2Init {...}] UField (name = str) [private final var str: java.lang.String] - UMethod (name = AWith2Init) [public fun AWith2Init(str: java.lang.String) = UastEmptyExpression] + UMethod (name = AWith2Init) [public fun AWith2Init(str: java.lang.String) {...}] UParameter (name = str) [var str: java.lang.String] - UMethod (name = AWith2Init) [public fun AWith2Init(i: int) = UastEmptyExpression] + UBlockExpression [{...}] = Undetermined + UBlockExpression [{...}] = Undetermined + [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] = Undetermined + UBlockExpression [{...}] = Undetermined + [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] = Undetermined + UMethod (name = AWith2Init) [public fun AWith2Init(i: int) {...}] UParameter (name = i) [var i: int] + UBlockExpression [{...}] = Undetermined + UastEmptyExpression [UastEmptyExpression] = Undetermined UMethod (name = getStr) [public final fun getStr() : java.lang.String = UastEmptyExpression] UClass (name = AOnlyInit) [public final class AOnlyInit {...}] UMethod (name = AOnlyInit) [public fun AOnlyInit() = UastEmptyExpression] @@ -27,10 +41,12 @@ UFile (package = ) [public final class A {...] UMethod (name = AWithSecondary) [public fun AWithSecondary(i: int) {...}] UParameter (name = i) [var i: int] UBlockExpression [{...}] = Undetermined + UastEmptyExpression [UastEmptyExpression] = Undetermined [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] = Undetermined UMethod (name = AWithSecondary) [public fun AWithSecondary(s: java.lang.String) {...}] UParameter (name = s) [var s: java.lang.String] UBlockExpression [{...}] = Undetermined + UastEmptyExpression [UastEmptyExpression] = Undetermined [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] = Undetermined UMethod (name = getA) [public final fun getA() : java.lang.String = UastEmptyExpression] UMethod (name = setA) [public final fun setA(value: java.lang.String) : void = UastEmptyExpression] @@ -40,10 +56,14 @@ UFile (package = ) [public final class A {...] UMethod (name = AWithSecondaryInit) [public fun AWithSecondaryInit(i: int) {...}] UParameter (name = i) [var i: int] UBlockExpression [{...}] = Undetermined + UastEmptyExpression [UastEmptyExpression] = Undetermined + UBlockExpression [{...}] = Undetermined + [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] = Undetermined [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] = Undetermined UMethod (name = AWithSecondaryInit) [public fun AWithSecondaryInit(s: java.lang.String) {...}] UParameter (name = s) [var s: java.lang.String] UBlockExpression [{...}] = Undetermined + UastEmptyExpression [UastEmptyExpression] = Undetermined [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] = Undetermined [!] UnknownKotlinExpression (PROPERTY) [[!] UnknownKotlinExpression (PROPERTY)] = Undetermined [!] UnknownKotlinExpression (DOT_QUALIFIED_EXPRESSION) [[!] UnknownKotlinExpression (DOT_QUALIFIED_EXPRESSION)] = Undetermined @@ -52,6 +72,9 @@ UFile (package = ) [public final class A {...] UParameter (name = value) [var value: java.lang.String] UClass (name = AWithFieldInit) [public final class AWithFieldInit {...}] UField (name = a) [private final var a: java.lang.String] - UMethod (name = AWithFieldInit) [public fun AWithFieldInit(i: int) = UastEmptyExpression] + UMethod (name = AWithFieldInit) [public fun AWithFieldInit(i: int) {...}] UParameter (name = i) [var i: int] + UBlockExpression [{...}] = Undetermined + UBlockExpression [{...}] = Undetermined + [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] = Undetermined UMethod (name = getA) [public final fun getA() : java.lang.String = UastEmptyExpression] diff --git a/plugins/uast-kotlin-fir/testData/legacyValues/PropertyReferences.values.fir.txt b/plugins/uast-kotlin-fir/testData/legacyValues/PropertyReferences.values.fir.txt index 382b9524760..873b04bfeb2 100644 --- a/plugins/uast-kotlin-fir/testData/legacyValues/PropertyReferences.values.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyValues/PropertyReferences.values.fir.txt @@ -20,8 +20,11 @@ UFile (package = ) [public final class PropertyReferencesKt {...] UField (name = privateProp) [private var privateProp: int = "not-yet-compile-time-constant"] ULiteralExpression (value = "not-yet-compile-time-constant") ["not-yet-compile-time-constant"] = "not-yet-compile-time-constant" UField (name = mutableProp) [private var mutableProp: int] - UMethod (name = A) [public fun A(init: int) = UastEmptyExpression] + UMethod (name = A) [public fun A(init: int) {...}] UParameter (name = init) [var init: int] + UBlockExpression [{...}] = Undetermined + UBlockExpression [{...}] = Undetermined + [!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)] = Undetermined UMethod (name = getMutableProp) [public final fun getMutableProp() : int = UastEmptyExpression] UMethod (name = setMutableProp) [public final fun setMutableProp(value: int) : void = UastEmptyExpression] UParameter (name = value) [var value: int] diff --git a/plugins/uast-kotlin-fir/testData/legacyValues/SuperCalls.values.fir.txt b/plugins/uast-kotlin-fir/testData/legacyValues/SuperCalls.values.fir.txt index 6aefb21d6f9..85172325596 100644 --- a/plugins/uast-kotlin-fir/testData/legacyValues/SuperCalls.values.fir.txt +++ b/plugins/uast-kotlin-fir/testData/legacyValues/SuperCalls.values.fir.txt @@ -10,21 +10,28 @@ UFile (package = ) [public final class SuperCallsKt {...] UField (name = str) [private final var str: java.lang.String] UMethod (name = A) [public fun A(str: java.lang.String) = UastEmptyExpression] UParameter (name = str) [var str: java.lang.String] - UMethod (name = A) [public fun A(i: int) = UastEmptyExpression] + UMethod (name = A) [public fun A(i: int) {...}] UParameter (name = i) [var i: int] + UBlockExpression [{...}] = Undetermined + UastEmptyExpression [UastEmptyExpression] = Undetermined UMethod (name = getStr) [public final fun getStr() : java.lang.String = UastEmptyExpression] UMethod (name = foo) [public fun foo(a: long) : void {...}] UParameter (name = a) [var a: long] UBlockExpression [{...}] = Undetermined UClass (name = B) [public final class B : A {...}] - UMethod (name = B) [public fun B(param: java.lang.String) = UastEmptyExpression] + UMethod (name = B) [public fun B(param: java.lang.String) {...}] UParameter (name = param) [var param: java.lang.String] + UBlockExpression [{...}] = Undetermined + UastEmptyExpression [UastEmptyExpression] = Undetermined UClass (name = C) [public final class C : A {...}] - UMethod (name = C) [public fun C(p: java.lang.String) = UastEmptyExpression] + UMethod (name = C) [public fun C(p: java.lang.String) {...}] UParameter (name = p) [var p: java.lang.String] + UBlockExpression [{...}] = Undetermined + UastEmptyExpression [UastEmptyExpression] = Undetermined UMethod (name = C) [public fun C(i: int) {...}] UParameter (name = i) [var i: int] UBlockExpression [{...}] = Undetermined + UastEmptyExpression [UastEmptyExpression] = Undetermined [!] UnknownKotlinExpression (CALL_EXPRESSION) [[!] UnknownKotlinExpression (CALL_EXPRESSION)] = Undetermined UMethod (name = foo) [public fun foo(a: long) : void {...}] UParameter (name = a) [var a: long] diff --git a/plugins/uast-kotlin-fir/testData/type/unresolved.types.fir.txt b/plugins/uast-kotlin-fir/testData/type/unresolved.types.fir.txt index fa306edd8bd..49fee842d20 100644 --- a/plugins/uast-kotlin-fir/testData/type/unresolved.types.fir.txt +++ b/plugins/uast-kotlin-fir/testData/type/unresolved.types.fir.txt @@ -5,8 +5,10 @@ UFile (package = ) [public final class UnresolvedKt {...] UBlockExpression [{...}] : PsiType:Unit UClass (name = A) [public final class A : error.NonExistentClass {...}] UField (name = prop) [private final var prop: error.NonExistentClass] - UMethod (name = A) [public fun A(prop: error.NonExistentClass) = UastEmptyExpression] + UMethod (name = A) [public fun A(prop: error.NonExistentClass) {...}] UParameter (name = prop) [var prop: error.NonExistentClass] + UBlockExpression [{...}] + UastEmptyExpression [UastEmptyExpression] UMethod (name = getProp) [public final fun getProp() : error.NonExistentClass = UastEmptyExpression] UMethod (name = bar) [public fun bar() : error.NonExistentClass {...}] UBlockExpression [{...}] : PsiType:Unit diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt index b553aa9560e..3408655b717 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt @@ -306,10 +306,10 @@ internal object KotlinConverter : BaseKotlinConverter { } } - internal fun convertDeclaration( + override fun convertDeclaration( element: PsiElement, givenParent: UElement?, - expectedTypes: Array> + requiredTypes: Array> ): UElement? { val original = element.originalElement @@ -328,18 +328,18 @@ internal object KotlinConverter : BaseKotlinConverter { ctor(original as P, ktElement, givenParent) } - return with(expectedTypes) { + return with(requiredTypes) { when (original) { is KtLightMethod -> el(build(KotlinUMethod.Companion::create)) // .Companion is needed because of KT-13934 is UastFakeLightMethod -> el { val ktFunction = original.original if (ktFunction.isLocal) - convertDeclaration(ktFunction, givenParent, expectedTypes) + convertDeclaration(ktFunction, givenParent, requiredTypes) else KotlinUMethodWithFakeLightDelegate(ktFunction, original, givenParent) } is UastFakeLightPrimaryConstructor -> - convertFakeLightConstructorAlternatives(original, givenParent, expectedTypes).firstOrNull() + convertFakeLightConstructorAlternatives(original, givenParent, requiredTypes).firstOrNull() is KtLightClass -> when (original.kotlinOrigin) { is KtEnumEntry -> el { convertEnumEntry(original.kotlinOrigin as KtEnumEntry, givenParent) @@ -380,7 +380,7 @@ internal object KotlinConverter : BaseKotlinConverter { el { val lightMethod = LightClassUtil.getLightClassMethod(original) if (lightMethod != null) - convertDeclaration(lightMethod, givenParent, expectedTypes) + convertDeclaration(lightMethod, givenParent, requiredTypes) else { val ktLightClass = getLightClassForFakeMethod(original) ?: return null KotlinUMethodWithFakeLightDelegate(original, ktLightClass, givenParent) @@ -390,14 +390,14 @@ internal object KotlinConverter : BaseKotlinConverter { is KtPropertyAccessor -> el { val lightMethod = LightClassUtil.getLightClassAccessorMethod(original) ?: return null - convertDeclaration(lightMethod, givenParent, expectedTypes) + convertDeclaration(lightMethod, givenParent, requiredTypes) } is KtProperty -> if (original.isLocal) { - convertPsiElement(original, givenParent, expectedTypes) + convertPsiElement(original, givenParent, requiredTypes) } else { - convertNonLocalProperty(original, givenParent, expectedTypes).firstOrNull() + convertNonLocalProperty(original, givenParent, requiredTypes).firstOrNull() } is KtParameter -> convertParameter(original, givenParent, this).firstOrNull() @@ -406,12 +406,12 @@ internal object KotlinConverter : BaseKotlinConverter { is FakeFileForLightClass -> el { KotlinUFile(original.navigationElement, kotlinUastPlugin) } is KtAnnotationEntry -> el(build(::KotlinUAnnotation)) is KtCallExpression -> - if (expectedTypes.isAssignableFrom(KotlinUNestedAnnotation::class.java) && - !expectedTypes.isAssignableFrom(UCallExpression::class.java) + if (requiredTypes.isAssignableFrom(KotlinUNestedAnnotation::class.java) && + !requiredTypes.isAssignableFrom(UCallExpression::class.java) ) { el { KotlinUNestedAnnotation.tryCreate(original, givenParent) } } else null - is KtLightAnnotationForSourceEntry -> convertDeclarationOrElement(original.kotlinOrigin, givenParent, expectedTypes) + is KtLightAnnotationForSourceEntry -> convertDeclarationOrElement(original.kotlinOrigin, givenParent, requiredTypes) is KtDelegatedSuperTypeEntry -> el { KotlinSupertypeDelegationUExpression(original, givenParent) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt index 8ffdb170026..a96d83779e4 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt @@ -24,14 +24,12 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClassForScript import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.uast.* import org.jetbrains.uast.internal.acceptList import org.jetbrains.uast.kotlin.declarations.KotlinUMethod -import org.jetbrains.uast.kotlin.kinds.KotlinSpecialExpressionKinds import org.jetbrains.uast.visitor.UastVisitor abstract class AbstractKotlinUClass(givenParent: UElement?) : KotlinAbstractUElement(givenParent), UClassTypeSpecific, UAnchorOwner { @@ -74,26 +72,6 @@ abstract class AbstractKotlinUClass(givenParent: UElement?) : KotlinAbstractUEle } -class KotlinSupertypeDelegationUExpression(override val sourcePsi: KtDelegatedSuperTypeEntry, givenParent: UElement?) : - KotlinAbstractUExpression(givenParent), UExpressionList { - - override val psi: PsiElement? get() = sourcePsi - - val typeReference: UTypeReferenceExpression? by lazy { - sourcePsi.typeReference?.let { KotlinUTypeReferenceExpression(it, this) { it.toPsiType(this) } } - } - - val delegateExpression: UExpression? by lazy { - sourcePsi.delegateExpression?.let { kotlinUastPlugin.convertElement(it, this, UExpression::class.java) as? UExpression } - } - - override val expressions: List - get() = listOfNotNull(typeReference, delegateExpression) - - override val kind: UastSpecialExpressionKind get() = KotlinSpecialExpressionKinds.SUPER_DELEGATION - -} - open class KotlinUClass private constructor( psi: KtLightClass, givenParent: UElement? @@ -127,9 +105,9 @@ open class KotlinUClass private constructor( // filter DefaultImpls to avoid processing same methods from original interface multiple times // filter Enum entry classes to avoid duplication with PsiEnumConstant initializer class return psi.innerClasses.filter { - it.name != JvmAbi.DEFAULT_IMPLS_CLASS_NAME && !it.isEnumEntryLightClass() + it.name != JvmAbi.DEFAULT_IMPLS_CLASS_NAME && !it.isEnumEntryLightClass }.mapNotNull { - getLanguagePlugin().convertOpt(it, this) + languagePlugin?.convertOpt(it, this) }.toTypedArray() } @@ -149,7 +127,7 @@ open class KotlinUClass private constructor( else KotlinConstructorUMethod(ktClass, psiMethod, this) } else { - getLanguagePlugin().convertOpt(psiMethod, this) ?: reportConvertFailure(psiMethod) + languagePlugin?.convertOpt(psiMethod, this) ?: reportConvertFailure(psiMethod) } } @@ -178,13 +156,13 @@ open class KotlinUClass private constructor( ktDeclarations.asSequence() .filterNot { handledKtDeclarations.contains(it) } - .mapNotNullTo(result) { KotlinConverter.convertDeclaration(it, this, arrayOf(UElement::class.java)) as? UMethod } + .mapNotNullTo(result) { + baseResolveProviderService.baseKotlinConverter.convertDeclaration(it, this, arrayOf(UElement::class.java)) as? UMethod + } return result.toTypedArray() } - private fun PsiClass.isEnumEntryLightClass() = (this as? KtLightClass)?.kotlinOrigin is KtEnumEntry - companion object { fun create(psi: KtLightClass, containingElement: UElement?): UClass = when (psi) { is PsiAnonymousClass -> KotlinUAnonymousClass(psi, containingElement) @@ -374,20 +352,3 @@ class KotlinInvalidUClass( override fun getOriginalElement(): PsiElement? = null } - -private fun reportConvertFailure(psiMethod: PsiMethod): Nothing { - val isValid = psiMethod.isValid - val report = KotlinExceptionWithAttachments( - "cant convert $psiMethod of ${psiMethod.javaClass} to UMethod" - + if (!isValid) " (method is not valid)" else "" - ) - - if (isValid) { - report.withAttachment("method", psiMethod.text) - psiMethod.containingFile?.let { - report.withAttachment("file", it.text) - } - } - - throw report -}