diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt index d5f6079117d..ceddd6d8645 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt @@ -17,11 +17,16 @@ package org.jetbrains.uast.kotlin import org.jetbrains.kotlin.psi.KtAnnotatedExpression +import org.jetbrains.kotlin.psi.KtAnnotationEntry +import org.jetbrains.kotlin.psi.KtValueArgument import org.jetbrains.uast.UAnnotation import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression -abstract class KotlinAbstractUElement : UElement { +abstract class KotlinAbstractUElement(private val givenParent: UElement?) : UElement { + + override val uastParent: UElement? by lz { convertParent(givenParent) } + override fun equals(other: Any?): Boolean { if (other !is UElement) { return false @@ -33,7 +38,30 @@ abstract class KotlinAbstractUElement : UElement { override fun hashCode() = psi?.hashCode() ?: 0 } -abstract class KotlinAbstractUExpression : KotlinAbstractUElement(), UExpression { +internal fun UElement.convertParent(givenParent: UElement?): UElement? { + return if (givenParent != null) + givenParent + else { + val parent = psi?.parent + val result = KotlinConverter.unwrapElements(parent)?.let { parentUnwrapped -> + if (parent is KtValueArgument && parentUnwrapped is KtAnnotationEntry) { + val argumentName = parent.getArgumentName()?.asName?.asString() ?: "" + (KotlinUastLanguagePlugin().convertElementWithParent(parentUnwrapped, null) as? UAnnotation) + ?.attributeValues?.find { it.name == argumentName } + } + else + KotlinUastLanguagePlugin().convertElementWithParent(parentUnwrapped, null) + } + if (result == this) { + throw IllegalStateException("Loop in parent structure") + } + result + } +} + +abstract class KotlinAbstractUExpression(givenParent: UElement?) + : KotlinAbstractUElement(givenParent), UExpression { + override val annotations: List get() { val annotatedExpression = psi?.parent as? KtAnnotatedExpression ?: return emptyList() diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt index cbc062c8d4a..8e8c11004de 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt @@ -20,7 +20,6 @@ import com.intellij.lang.Language import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.impl.source.tree.LeafPsiElement -import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade @@ -60,28 +59,17 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin { } override fun convertElement(element: PsiElement, parent: UElement?, requiredType: Class?): UElement? { - return convertDeclarationOrElement(element, parent.toCallback(), requiredType) + return convertDeclarationOrElement(element, parent, requiredType) } override fun convertElementWithParent(element: PsiElement, requiredType: Class?): UElement? { if (element is PsiFile) return convertDeclaration(element, null, requiredType) if (element is KtLightClassForFacade) return convertDeclaration(element, null, requiredType) - val parentCallback = fun(): UElement? { - val parent = element.parent - val parentUnwrapped = KotlinConverter.unwrapElements(parent) ?: return null - if (parent is KtValueArgument && parentUnwrapped is KtAnnotationEntry) { - val argumentName = parent.getArgumentName()?.asName?.asString() ?: "" - return (convertElementWithParent(parentUnwrapped, null) as? UAnnotation) - ?.attributeValues?.find { it.name == argumentName } - } - else - return convertElementWithParent(parentUnwrapped, null) - } - return convertDeclarationOrElement(element, parentCallback, requiredType) + return convertDeclarationOrElement(element, null, requiredType) } - private fun convertDeclarationOrElement(element: PsiElement, parentCallback: (() -> UElement?)?, requiredType: Class?): UElement? { + private fun convertDeclarationOrElement(element: PsiElement, givenParent: UElement?, requiredType: Class?): UElement? { if (element is UElement) return element if (element.isValid) { @@ -90,8 +78,8 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin { } } - val uElement = convertDeclaration(element, parentCallback, requiredType) - ?: KotlinConverter.convertPsiElement(element, parentCallback, requiredType) + val uElement = convertDeclaration(element, givenParent, requiredType) + ?: KotlinConverter.convertPsiElement(element, givenParent, requiredType) if (uElement != null) { element.putUserData(KOTLIN_CACHED_UELEMENT_KEY, WeakReference(uElement)) } @@ -139,13 +127,10 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin { } private fun convertDeclaration(element: PsiElement, - parentCallback: (() -> UElement?)?, + givenParent: UElement?, requiredType: Class?): UElement? { fun

build(ctor: (P, UElement?) -> UElement): () -> UElement? { - return fun(): UElement? { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - return ctor(element as P, parent) - } + return { ctor(element as P, givenParent) } } val original = element.originalElement @@ -161,24 +146,21 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin { is KtClassOrObject -> el { original.toLightClass()?.let { lightClass -> - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - KotlinUClass.create(lightClass, parent) + KotlinUClass.create(lightClass, givenParent) } } is KtFunction -> el { val lightMethod = LightClassUtil.getLightClassMethod(original) ?: return null - convertDeclaration(lightMethod, parentCallback, requiredType) + convertDeclaration(lightMethod, givenParent, requiredType) } is KtPropertyAccessor -> el { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) javaPlugin.convertOpt( - LightClassUtil.getLightClassAccessorMethod(original), parent) + LightClassUtil.getLightClassAccessorMethod(original), givenParent) } is KtProperty -> el { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) javaPlugin.convertOpt( - LightClassUtil.getLightClassBackingField(original), parent) - ?: convertDeclaration(element.parent, parentCallback, requiredType) + LightClassUtil.getLightClassBackingField(original), givenParent) + ?: convertDeclaration(element.parent, givenParent, requiredType) } is KtFile -> el { KotlinUFile(original, this@KotlinUastLanguagePlugin) } @@ -216,44 +198,39 @@ internal object KotlinConverter { is KtValueArgumentList -> unwrapElements(element.parent) is KtValueArgument -> unwrapElements(element.parent) is KtDeclarationModifierList -> unwrapElements(element.parent) + is KtContainerNode -> unwrapElements(element.parent) else -> element } internal fun convertPsiElement(element: PsiElement?, - parentCallback: (() -> UElement?)?, + givenParent: UElement?, requiredType: Class?): UElement? { fun

build(ctor: (P, UElement?) -> UElement): () -> UElement? { - return fun(): UElement? { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - return ctor(element as P, parent) - } + return { ctor(element as P, givenParent) } } return with (requiredType) { when (element) { is KtParameterList -> el { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - KotlinUDeclarationsExpression(parent).apply { + val declarationsExpression = KotlinUDeclarationsExpression(givenParent) + declarationsExpression.apply { declarations = element.parameters.mapIndexed { i, p -> - KotlinUParameter(UastKotlinPsiParameter.create(p, element, parent!!, i), this) + KotlinUParameter(UastKotlinPsiParameter.create(p, element, declarationsExpression, i), this) } } } is KtClassBody -> el(build(KotlinUExpressionList.Companion::createClassBody)) is KtCatchClause -> el(build(::KotlinUCatchClause)) - is KtExpression -> KotlinConverter.convertExpression(element, parentCallback, requiredType) - is KtLambdaArgument -> KotlinConverter.convertExpression(element.getLambdaExpression(), parentCallback, requiredType) - is KtContainerNode -> element.getExpression()?.let { - KotlinConverter.convertExpression(it, parentCallback, requiredType) - } ?: el { UastEmptyExpression } + is KtExpression -> KotlinConverter.convertExpression(element, givenParent, requiredType) + is KtLambdaArgument -> KotlinConverter.convertExpression(element.getLambdaExpression(), givenParent, requiredType) is KtLightAnnotationForSourceEntry.LightExpressionValue<*> -> { val expression = element.originalExpression when (expression) { - is KtExpression -> KotlinConverter.convertExpression(expression, parentCallback, requiredType) + is KtExpression -> KotlinConverter.convertExpression(expression, givenParent, requiredType) else -> el { UastEmptyExpression } } } is KtLiteralStringTemplateEntry, is KtEscapeStringTemplateEntry -> el(build(::KotlinStringULiteralExpression)) - is KtStringTemplateEntry -> element.expression?.let { convertExpression(it, parentCallback, requiredType) } ?: expr { UastEmptyExpression } + is KtStringTemplateEntry -> element.expression?.let { convertExpression(it, givenParent, requiredType) } ?: expr { UastEmptyExpression } else -> { if (element is LeafPsiElement && element.elementType == KtTokens.IDENTIFIER) { @@ -267,35 +244,30 @@ internal object KotlinConverter { internal fun convertEntry(entry: KtStringTemplateEntry, - parentCallback: (() -> UElement?)?, + givenParent: UElement?, requiredType: Class? = null): UExpression? { return with(requiredType) { if (entry is KtStringTemplateEntryWithExpression) { expr { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - KotlinConverter.convertOrEmpty(entry.expression, parent) + KotlinConverter.convertOrEmpty(entry.expression, givenParent) } } else { expr { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) if (entry is KtEscapeStringTemplateEntry) - KotlinStringULiteralExpression(entry, parent, entry.unescapedValue) + KotlinStringULiteralExpression(entry, givenParent, entry.unescapedValue) else - KotlinStringULiteralExpression(entry, parent) + KotlinStringULiteralExpression(entry, givenParent) } } } } internal fun convertExpression(expression: KtExpression, - parentCallback: (() -> UElement?)?, + givenParent: UElement?, requiredType: Class? = null): UExpression? { fun

build(ctor: (P, UElement?) -> UExpression): () -> UExpression? { - return fun(): UExpression? { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - return ctor(expression as P, parent) - } + return { ctor(expression as P, givenParent) } } return with (requiredType) { when (expression) { @@ -304,25 +276,22 @@ internal object KotlinConverter { is KtStringTemplateExpression -> { when { expression.entries.isEmpty() -> { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - expr { KotlinStringULiteralExpression(expression, parent, "") } + expr { KotlinStringULiteralExpression(expression, givenParent, "") } } - expression.entries.size == 1 -> convertEntry(expression.entries[0], parentCallback, requiredType) + expression.entries.size == 1 -> convertEntry(expression.entries[0], givenParent, requiredType) else -> { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - expr { KotlinStringTemplateUPolyadicExpression(expression, parent) } + expr { KotlinStringTemplateUPolyadicExpression(expression, givenParent) } } } } is KtDestructuringDeclaration -> expr { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - KotlinUDeclarationsExpression(parent).apply { - val tempAssignment = KotlinULocalVariable(UastKotlinPsiVariable.create(expression, parent!!), parent) + KotlinUDeclarationsExpression(givenParent).apply { + val tempAssignment = KotlinULocalVariable(UastKotlinPsiVariable.create(expression, uastParent!!), givenParent) val destructuringAssignments = expression.entries.mapIndexed { i, entry -> val psiFactory = KtPsiFactory(expression.project) val initializer = psiFactory.createAnalyzableExpression("${tempAssignment.name}.component${i + 1}()", expression.containingFile) - KotlinULocalVariable(UastKotlinPsiVariable.create(entry, tempAssignment.psi, parent, initializer), parent) + KotlinULocalVariable(UastKotlinPsiVariable.create(entry, tempAssignment.psi, uastParent!!, initializer), givenParent) } declarations = listOf(tempAssignment) + destructuringAssignments } @@ -364,8 +333,7 @@ internal object KotlinConverter { is KtBinaryExpressionWithTypeRHS -> expr(build(::KotlinUBinaryExpressionWithType)) is KtClassOrObject -> expr { expression.toLightClass()?.let { lightClass -> - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - KotlinUDeclarationsExpression(parent).apply { + KotlinUDeclarationsExpression(givenParent).apply { declarations = listOf(KotlinUClass.create(lightClass, this)) } } ?: UastEmptyExpression @@ -382,11 +350,11 @@ internal object KotlinConverter { } internal fun convertOrEmpty(expression: KtExpression?, parent: UElement?): UExpression { - return expression?.let { convertExpression(it, parent.toCallback(), null) } ?: UastEmptyExpression + return expression?.let { convertExpression(it, parent, null) } ?: UastEmptyExpression } internal fun convertOrNull(expression: KtExpression?, parent: UElement?): UExpression? { - return if (expression != null) convertExpression(expression, parent.toCallback(), null) else null + return if (expression != null) convertExpression(expression, parent, null) else null } internal fun KtPsiFactory.createAnalyzableExpression(text: String, context: PsiElement): KtExpression = @@ -401,19 +369,17 @@ internal object KotlinConverter { assert(declarations.size == 1) { "${declarations.size} declarations in $text" } return declarations.first() as TDeclaration } - - internal fun KtContainerNode.getExpression(): KtExpression? = - PsiTreeUtil.getChildOfType(this, KtExpression::class.java) } private fun convertVariablesDeclaration( psi: KtVariableDeclaration, parent: UElement? ): UDeclarationsExpression { + val declarationsExpression = KotlinUDeclarationsExpression(parent) val parentPsiElement = parent?.psi val variable = KotlinUAnnotatedLocalVariable( - UastKotlinPsiVariable.create(psi, parentPsiElement, parent!!), parent) { annotationParent -> + UastKotlinPsiVariable.create(psi, parentPsiElement, declarationsExpression), declarationsExpression) { annotationParent -> psi.annotationEntries.map { KotlinUAnnotation(it, annotationParent) } } - return KotlinUDeclarationsExpression(parent).apply { declarations = listOf(variable) } + return declarationsExpression.apply { declarations = listOf(variable) } } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt index e68e1e8d9b7..3f0772531a8 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt @@ -13,8 +13,10 @@ import org.jetbrains.uast.* class KotlinUAnnotation( override val psi: KtAnnotationEntry, - override val uastParent: UElement? + private val givenParent: UElement? ) : UAnnotation { + override val uastParent: UElement? by lz { convertParent(givenParent) } + private val resolvedAnnotation: AnnotationDescriptor? by lz { psi.analyze()[BindingContext.ANNOTATION, psi] } private val resolvedCall: ResolvedCall<*>? by lz { psi.getResolvedCall(psi.analyze()) } 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 d5d127ccd24..f0ec2045d8d 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 @@ -30,11 +30,13 @@ import org.jetbrains.uast.kotlin.declarations.UastLightIdentifier open class KotlinUClass private constructor( psi: KtLightClass, - override val uastParent: UElement? + private val givenParent: UElement? ) : AbstractJavaUClass(), PsiClass by psi { val ktClass = psi.kotlinOrigin + override val uastParent: UElement? by lz { convertParent(givenParent) } + override val psi = unwrap(psi) override fun getOriginalElement(): PsiElement? = super.getOriginalElement() @@ -110,9 +112,11 @@ open class KotlinUClass private constructor( class KotlinUAnonymousClass( psi: PsiAnonymousClass, - override val uastParent: UElement? + private val givenParent: UElement? ) : AbstractJavaUClass(), UAnonymousClass, PsiAnonymousClass by psi { + override val uastParent: UElement? by lz { convertParent(givenParent) } + override val psi: PsiAnonymousClass = unwrap(psi) override fun getOriginalElement(): PsiElement? = super.getOriginalElement() diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt index 3d60e606166..e8352e45ee7 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt @@ -28,8 +28,10 @@ import org.jetbrains.uast.USimpleNameReferenceExpression class KotlinUImportStatement( override val psi: KtImportDirective, - override val uastParent: UElement? + private val givenParent: UElement? ) : UImportStatement { + override val uastParent: UElement? by lz { convertParent(givenParent) } + override val isOnDemand: Boolean get() = psi.isAllUnder @@ -47,9 +49,9 @@ class KotlinUImportStatement( private class ImportReference( override val psi: KtExpression, override val identifier: String, - override val uastParent: UElement?, + givenParent: UElement?, private val importDirective: KtImportDirective - ) : KotlinAbstractUExpression(), USimpleNameReferenceExpression { + ) : KotlinAbstractUExpression(givenParent), USimpleNameReferenceExpression { override val resolvedName: String? get() = identifier diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt index ac0154d0075..ac9fe9c47f2 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt @@ -30,10 +30,12 @@ import org.jetbrains.uast.kotlin.* open class KotlinUMethod( psi: KtLightMethod, - override val uastParent: UElement? + private val givenParent: UElement? ) : UAnnotationMethod, JavaUElementWithComments, PsiMethod by psi { override val psi: KtLightMethod = unwrap(psi) + override val uastParent: UElement? by lz { convertParent(givenParent) } + override val uastDefaultValue by lz { val annotationParameter = psi.kotlinOrigin as? KtParameter ?: return@lz null val defaultValue = annotationParameter.defaultValue ?: return@lz null diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt index 22e0df3fe99..7200349e96c 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt @@ -33,7 +33,11 @@ import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable import org.jetbrains.uast.visitor.UastVisitor -abstract class AbstractKotlinUVariable : PsiVariable, UVariable, KotlinUElementWithComments { +abstract class AbstractKotlinUVariable(private val givenParent: UElement?) + : PsiVariable, UVariable, KotlinUElementWithComments { + + override val uastParent: UElement? by lz { convertParent(givenParent) } + override val uastInitializer: UExpression? get() { val psi = psi @@ -85,8 +89,8 @@ abstract class AbstractKotlinUVariable : PsiVariable, UVariable, KotlinUElementW class KotlinUVariable( psi: PsiVariable, - override val uastParent: UElement? -) : AbstractKotlinUVariable(), UVariable, PsiVariable by psi { + givenParent: UElement? +) : AbstractKotlinUVariable(givenParent), UVariable, PsiVariable by psi { override val psi = unwrap(psi) override val annotations by lz { psi.annotations.map { JavaUAnnotation(it, this) } } @@ -112,8 +116,8 @@ class KotlinUVariable( open class KotlinUParameter( psi: PsiParameter, - override val uastParent: UElement? -) : AbstractKotlinUVariable(), UParameter, PsiParameter by psi { + givenParent: UElement? +) : AbstractKotlinUVariable(givenParent), UParameter, PsiParameter by psi { override val psi = unwrap(psi) @@ -136,8 +140,8 @@ open class KotlinUParameter( open class KotlinUField( psi: PsiField, - override val uastParent: UElement? -) : AbstractKotlinUVariable(), UField, PsiField by psi { + givenParent: UElement? +) : AbstractKotlinUVariable(givenParent), UField, PsiField by psi { override val psi = unwrap(psi) @@ -172,8 +176,8 @@ open class KotlinUField( open class KotlinULocalVariable( psi: PsiLocalVariable, - override val uastParent: UElement? -) : AbstractKotlinUVariable(), ULocalVariable, PsiLocalVariable by psi { + givenParent: UElement? +) : AbstractKotlinUVariable(givenParent), ULocalVariable, PsiLocalVariable by psi { override val psi = unwrap(psi) @@ -213,8 +217,8 @@ open class KotlinUAnnotatedLocalVariable( open class KotlinUEnumConstant( psi: PsiEnumConstant, - override val uastParent: UElement? -) : AbstractKotlinUVariable(), UEnumConstant, PsiEnumConstant by psi { + givenParent: UElement? +) : AbstractKotlinUVariable(givenParent), UEnumConstant, PsiEnumConstant by psi { override fun getContainingFile(): PsiFile { return super.getContainingFile() @@ -268,8 +272,9 @@ open class KotlinUEnumConstant( private class KotlinEnumConstantClassReference( override val psi: PsiEnumConstant, - override val uastParent: UElement? + private val givenParent: UElement? ) : JavaAbstractUExpression(), USimpleNameReferenceExpression { + override val uastParent: UElement? by lz { convertParent(givenParent) } override fun resolve() = psi.containingClass override val resolvedName: String? get() = psi.containingClass?.name diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/ElvisExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/ElvisExpression.kt index ad66385d37a..1740b243e5c 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/ElvisExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/ElvisExpression.kt @@ -58,7 +58,7 @@ private fun createElvisExpressions( override val uastParent: UElement? = containingElement override val condition: UExpression by lz { createNotEqWithNullExpression(tempVariable, this) } override val thenExpression: UExpression? by lz { createVariableReferenceExpression(tempVariable, this) } - override val elseExpression: UExpression? by lz { KotlinConverter.convertExpression(right, this.toCallback() ) } + override val elseExpression: UExpression? by lz { KotlinConverter.convertExpression(right, this ) } override val isTernary: Boolean = false override val annotations: List = emptyList() override val ifIdentifier: UIdentifier = UIdentifier(null, this) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt index a84f3e89f50..5db5fbc72a4 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt @@ -24,11 +24,11 @@ import org.jetbrains.uast.UastBinaryOperator class KotlinStringTemplateUPolyadicExpression( override val psi: KtStringTemplateExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UPolyadicExpression, KotlinUElementWithType, KotlinEvaluatableUElement { - override val operands: List by lz { psi.entries.map { KotlinConverter.convertEntry(it, { this })!! } } + override val operands: List by lz { psi.entries.map { KotlinConverter.convertEntry(it, this)!! } } override val operator = UastBinaryOperator.PLUS } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt index 698eac5c661..49c8bd616bf 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.UElement class KotlinUArrayAccessExpression( override val psi: KtArrayAccessExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UArrayAccessExpression, KotlinUElementWithType, KotlinEvaluatableUElement { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UArrayAccessExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val receiver by lz { KotlinConverter.convertOrEmpty(psi.arrayExpression, this) } override val indices by lz { psi.indexExpressions.map { KotlinConverter.convertOrEmpty(it, this) } } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt index fd16ebde05f..06c62b035ea 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt @@ -28,8 +28,8 @@ import org.jetbrains.uast.* class KotlinUBinaryExpression( override val psi: KtBinaryExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UBinaryExpression, KotlinUElementWithType, KotlinEvaluatableUElement { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UBinaryExpression, KotlinUElementWithType, KotlinEvaluatableUElement { private companion object { val BITWISE_OPERATORS = mapOf( "or" to UastBinaryOperator.BITWISE_OR, @@ -88,8 +88,8 @@ class KotlinUBinaryExpression( class KotlinCustomUBinaryExpression( override val psi: PsiElement, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UBinaryExpression { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UBinaryExpression { lateinit override var leftOperand: UExpression internal set diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt index c88442e4963..1b75bac2977 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt @@ -24,8 +24,8 @@ import org.jetbrains.uast.* class KotlinUBinaryExpressionWithType( override val psi: KtBinaryExpressionWithTypeRHS, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UBinaryExpressionWithType, + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UBinaryExpressionWithType, KotlinUElementWithType, KotlinEvaluatableUElement { override val operand by lz { KotlinConverter.convertOrEmpty(psi.left, this) } @@ -44,8 +44,8 @@ class KotlinUBinaryExpressionWithType( class KotlinCustomUBinaryExpressionWithType( override val psi: PsiElement, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UBinaryExpressionWithType { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UBinaryExpressionWithType { lateinit override var operand: UExpression internal set diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt index 2c39e399174..aff3515ff67 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt @@ -23,9 +23,8 @@ import org.jetbrains.uast.* class KotlinUBlockExpression( override val psi: KtBlockExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UBlockExpression, KotlinUElementWithType { - + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UBlockExpression, KotlinUElementWithType { override val expressions by lz { psi.statements.map { KotlinConverter.convertOrEmpty(it, this) } } private class KotlinLazyUBlockExpression( diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt index 8179555aa98..cb90da55a39 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.kotlin.KotlinAbstractUExpression class KotlinUBreakExpression( override val psi: KtBreakExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UBreakExpression { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UBreakExpression { override val label: String? get() = psi.getLabelName() } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt index e1c6210b907..cffab1d1133 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt @@ -25,13 +25,13 @@ import org.jetbrains.uast.UExpression class KotlinUCallableReferenceExpression( override val psi: KtCallableReferenceExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UCallableReferenceExpression, KotlinUElementWithType { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UCallableReferenceExpression, KotlinUElementWithType { override val qualifierExpression: UExpression? get() { if (qualifierType != null) return null val receiverExpression = psi.receiverExpression ?: return null - return KotlinConverter.convertExpression(receiverExpression, { this }) + return KotlinConverter.convertExpression(receiverExpression, this) } override val qualifierType by lz { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCatchClause.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCatchClause.kt index ea9eb17c68e..c2936f10844 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCatchClause.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCatchClause.kt @@ -25,8 +25,8 @@ import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter class KotlinUCatchClause( override val psi: KtCatchClause, - override val uastParent: UElement? -) : KotlinAbstractUElement(), UCatchClause { + givenParent: UElement? +) : KotlinAbstractUElement(givenParent), UCatchClause { override val body by lz { KotlinConverter.convertOrEmpty(psi.catchBody, this) } override val parameters by lz { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt index f8693061035..28125ec5b28 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt @@ -24,8 +24,8 @@ import org.jetbrains.uast.UExpression class KotlinUClassLiteralExpression( override val psi: KtClassLiteralExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UClassLiteralExpression, KotlinUElementWithType { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UClassLiteralExpression, KotlinUElementWithType { override val type by lz { val ktType = psi.analyze()[DOUBLE_COLON_LHS, psi.receiverExpression]?.type ?: return@lz null ktType.toPsiType(this, psi, boxed = true) @@ -35,6 +35,6 @@ class KotlinUClassLiteralExpression( get() { if (type != null) return null val receiverExpression = psi.receiverExpression ?: return null - return KotlinConverter.convertExpression(receiverExpression, { this }) + return KotlinConverter.convertExpression(receiverExpression, this) } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt index f1473caa28a..b8959e3ac7a 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.kotlin.KotlinAbstractUExpression class KotlinUContinueExpression( override val psi: KtContinueExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UContinueExpression { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UContinueExpression { override val label: String? get() = psi.getLabelName() } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt index 329c63381fb..e89286d6eed 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt @@ -20,8 +20,8 @@ import org.jetbrains.uast.kotlin.KotlinAbstractUExpression class KotlinUDeclarationsExpression( override val psi: PsiElement?, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UDeclarationsExpression { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UDeclarationsExpression { constructor(uastParent: UElement?) : this(null, uastParent) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDoWhileExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDoWhileExpression.kt index 8ddfc5e91ea..8461fad28e8 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDoWhileExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDoWhileExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.UIdentifier class KotlinUDoWhileExpression( override val psi: KtDoWhileExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UDoWhileExpression { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UDoWhileExpression { override val condition by lz { KotlinConverter.convertOrEmpty(psi.condition, this) } override val body by lz { KotlinConverter.convertOrEmpty(psi.body, this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt index 1c7fe3114f8..4442162aa11 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt @@ -29,8 +29,8 @@ import org.jetbrains.uast.kotlin.kinds.KotlinSpecialExpressionKinds open class KotlinUExpressionList( override val psi: PsiElement?, override val kind: UastSpecialExpressionKind, // original element - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UExpressionList, KotlinUElementWithType, KotlinEvaluatableUElement { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UExpressionList, KotlinUElementWithType, KotlinEvaluatableUElement { override lateinit var expressions: List internal set diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUForEachExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUForEachExpression.kt index 0e9a2879185..c6ce608d15a 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUForEachExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUForEachExpression.kt @@ -26,8 +26,8 @@ import org.jetbrains.uast.psi.UastPsiParameterNotResolved class KotlinUForEachExpression( override val psi: KtForExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UForEachExpression { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UForEachExpression { override val iteratedValue by lz { KotlinConverter.convertOrEmpty(psi.loopRange, this) } override val body by lz { KotlinConverter.convertOrEmpty(psi.body, this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt index 9737cd4eca7..53c725d6c24 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt @@ -23,7 +23,10 @@ import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtAnnotationEntry +import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.resolve.CompileTimeConstantUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall @@ -34,9 +37,9 @@ import org.jetbrains.uast.visitor.UastVisitor class KotlinUFunctionCallExpression( override val psi: KtCallExpression, - override val uastParent: UElement?, + givenParent: UElement?, private val _resolvedCall: ResolvedCall<*>? -) : KotlinAbstractUExpression(), UCallExpression, KotlinUElementWithType { +) : KotlinAbstractUExpression(givenParent), UCallExpression, KotlinUElementWithType { companion object { fun resolveSource(descriptor: DeclarationDescriptor, source: PsiElement?): PsiMethod? { if (descriptor is ConstructorDescriptor && descriptor.isPrimary @@ -99,12 +102,7 @@ class KotlinUFunctionCallExpression( } override val receiver: UExpression? - get() { - return if (uastParent is UQualifiedReferenceExpression && uastParent.selector == this) - uastParent.receiver - else - null - } + get() = (uastParent as? UQualifiedReferenceExpression)?.takeIf { it.selector == this }?.receiver override fun resolve(): PsiMethod? { val descriptor = resolvedCall?.resultingDescriptor ?: return null diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUIfExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUIfExpression.kt index 84e11e2aec7..158e2642a90 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUIfExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUIfExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.UIfExpression class KotlinUIfExpression( override val psi: KtIfExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UIfExpression, KotlinUElementWithType, KotlinEvaluatableUElement { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UIfExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val condition by lz { KotlinConverter.convertOrEmpty(psi.condition, this) } override val thenExpression by lz { KotlinConverter.convertOrNull(psi.then, this) } override val elseExpression by lz { KotlinConverter.convertOrNull(psi.`else`, this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt index d274368889a..2130def4799 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.ULabeledExpression class KotlinULabeledExpression( override val psi: KtLabeledExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), ULabeledExpression { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), ULabeledExpression { override val label: String get() = psi.getLabelName().orAnonymous("label") diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt index 6ec088a76bb..3259aa4d6ce 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt @@ -26,8 +26,8 @@ import org.jetbrains.uast.withMargin class KotlinULambdaExpression( override val psi: KtLambdaExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), ULambdaExpression, KotlinUElementWithType { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), ULambdaExpression, KotlinUElementWithType { val functionalInterfaceType: PsiType? get() = getFunctionalInterfaceType() diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt index d3ab8189a7a..757d45d1d8a 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt @@ -25,8 +25,8 @@ import org.jetbrains.uast.ULiteralExpression class KotlinULiteralExpression( override val psi: KtConstantExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), ULiteralExpression, KotlinUElementWithType, KotlinEvaluatableUElement { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), ULiteralExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val isNull: Boolean get() = psi.unwrapBlockOrParenthesis().node?.elementType == KtNodeTypes.NULL @@ -35,9 +35,9 @@ class KotlinULiteralExpression( class KotlinStringULiteralExpression( override val psi: PsiElement, - override val uastParent: UElement?, + givenParent: UElement?, val text: String -) : KotlinAbstractUExpression(), ULiteralExpression, KotlinUElementWithType{ +) : KotlinAbstractUExpression(givenParent), ULiteralExpression, KotlinUElementWithType{ constructor(psi: PsiElement, uastParent: UElement?) : this(psi, uastParent, if (psi is KtEscapeStringTemplateEntry) psi.unescapedValue else psi.text) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUNamedExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUNamedExpression.kt index 1e80dfcf2c1..4e1ffd23c35 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUNamedExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUNamedExpression.kt @@ -23,7 +23,7 @@ import org.jetbrains.uast.* class KotlinUNamedExpression private constructor( override val name: String?, - override val uastParent: UElement?, + private val givenParent: UElement?, expressionProducer: (UElement) -> UExpression ) : UNamedExpression { override val expression: UExpression by lz { expressionProducer(this) } @@ -32,6 +32,8 @@ class KotlinUNamedExpression private constructor( override val psi: PsiElement? = null + override val uastParent: UElement? by lz { convertParent(givenParent) } + companion object { internal fun create(name: String?, valueArgument: ValueArgument, uastParent: UElement?): UNamedExpression { val expression = valueArgument.getArgumentExpression() @@ -45,7 +47,7 @@ class KotlinUNamedExpression private constructor( valueArguments: List, uastParent: UElement?): UNamedExpression { return KotlinUNamedExpression(name, uastParent) { expressionParent -> - object : KotlinAbstractUExpression(), UCallExpression { + object : KotlinAbstractUExpression(uastParent), UCallExpression { override val uastParent: UElement? = expressionParent override val kind: UastCallKind = UastCallKind.NESTED_ARRAY_INITIALIZER diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt index c1adc99b522..546c5c405f9 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt @@ -29,8 +29,8 @@ import org.jetbrains.uast.* class KotlinUObjectLiteralExpression( override val psi: KtObjectLiteralExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UObjectLiteralExpression, KotlinUElementWithType { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UObjectLiteralExpression, KotlinUElementWithType { override val declaration: UClass by lz { val lightClass: KtLightClass? = psi.objectDeclaration.toLightClass() if (lightClass != null) { @@ -73,8 +73,8 @@ class KotlinUObjectLiteralExpression( private class ObjectLiteralClassReference( override val psi: KtSuperTypeCallEntry, - override val uastParent: UElement? - ) : KotlinAbstractUElement(), USimpleNameReferenceExpression { + givenParent: UElement? + ) : KotlinAbstractUElement(givenParent), USimpleNameReferenceExpression { override fun resolve() = (psi.resolveCallToDeclaration(this) as? PsiMethod)?.containingClass override val annotations: List diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt index 321eaa51772..704fee58def 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt @@ -22,7 +22,7 @@ import org.jetbrains.uast.UParenthesizedExpression class KotlinUParenthesizedExpression( override val psi: KtParenthesizedExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UParenthesizedExpression, KotlinUElementWithType { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UParenthesizedExpression, KotlinUElementWithType { override val expression by lz { KotlinConverter.convertOrEmpty(psi.expression, this) } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt index 64160a0d12c..5e6963bb4fc 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.* class KotlinUPostfixExpression( override val psi: KtPostfixExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UPostfixExpression, KotlinUElementWithType, KotlinEvaluatableUElement, UResolvable { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UPostfixExpression, KotlinUElementWithType, KotlinEvaluatableUElement, UResolvable { override val operand by lz { KotlinConverter.convertOrEmpty(psi.baseExpression, this) } override val operator = when (psi.operationToken) { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt index 98db219cffb..af7d2f999d3 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt @@ -26,8 +26,8 @@ import org.jetbrains.uast.UastPrefixOperator class KotlinUPrefixExpression( override val psi: KtPrefixExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UPrefixExpression, KotlinUElementWithType, KotlinEvaluatableUElement { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UPrefixExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val operand by lz { KotlinConverter.convertOrEmpty(psi.baseExpression, this) } override val operatorIdentifier: UIdentifier? diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt index fac175f37e2..208c99837f9 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt @@ -28,8 +28,8 @@ import org.jetbrains.uast.UastQualifiedExpressionAccessType class KotlinUQualifiedReferenceExpression( override val psi: KtDotQualifiedExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UQualifiedReferenceExpression, + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UQualifiedReferenceExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val receiver by lz { KotlinConverter.convertOrEmpty(psi.receiverExpression, this) } override val selector by lz { KotlinConverter.convertOrEmpty(psi.selectorExpression, this) } @@ -43,8 +43,8 @@ class KotlinUQualifiedReferenceExpression( class KotlinUComponentQualifiedReferenceExpression( override val psi: KtDestructuringDeclarationEntry, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UQualifiedReferenceExpression, + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UQualifiedReferenceExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val accessType = UastQualifiedExpressionAccessType.SIMPLE diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt index 53080bc13f1..be9a502ac76 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt @@ -22,7 +22,7 @@ import org.jetbrains.uast.UReturnExpression class KotlinUReturnExpression( override val psi: KtReturnExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UReturnExpression, KotlinUElementWithType { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UReturnExpression, KotlinUElementWithType { override val returnExpression by lz { KotlinConverter.convertOrNull(psi.returnedExpression, this) } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt index 47764cff3e1..1dc882c71fc 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.UQualifiedReferenceExpression class KotlinUSafeQualifiedExpression( override val psi: KtSafeQualifiedExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UQualifiedReferenceExpression, + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UQualifiedReferenceExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val receiver by lz { KotlinConverter.convertOrEmpty(psi.receiverExpression, this) } override val selector by lz { KotlinConverter.convertOrEmpty(psi.selectorExpression, this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt index d013813342b..03be3102bd0 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt @@ -35,8 +35,8 @@ import org.jetbrains.uast.visitor.UastVisitor open class KotlinUSimpleReferenceExpression( override val psi: KtSimpleNameExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), USimpleNameReferenceExpression, KotlinUElementWithType, KotlinEvaluatableUElement { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), USimpleNameReferenceExpression, KotlinUElementWithType, KotlinEvaluatableUElement { private val resolvedDeclaration by lz { psi.resolveCallToDeclaration(this) } override val identifier get() = psi.getReferencedName() @@ -185,8 +185,8 @@ open class KotlinUSimpleReferenceExpression( class KotlinClassViaConstructorUSimpleReferenceExpression( override val psi: KtCallExpression, override val identifier: String, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), USimpleNameReferenceExpression, KotlinUElementWithType { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), USimpleNameReferenceExpression, KotlinUElementWithType { override val resolvedName: String? get() = (psi.getResolvedCall(psi.analyze())?.resultingDescriptor as? ConstructorDescriptor) ?.containingDeclaration?.name?.asString() @@ -201,8 +201,8 @@ class KotlinClassViaConstructorUSimpleReferenceExpression( class KotlinStringUSimpleReferenceExpression( override val identifier: String, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), USimpleNameReferenceExpression { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), USimpleNameReferenceExpression { override val psi: PsiElement? get() = null override fun resolve() = null diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt index b9f414182b9..b87476a1f9b 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt @@ -24,8 +24,8 @@ import org.jetbrains.uast.USuperExpression class KotlinUSuperExpression( override val psi: KtSuperExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), USuperExpression, KotlinUElementWithType, KotlinEvaluatableUElement { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), USuperExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val label: String? get() = psi.getLabelName() diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt index a024605f8e3..7be77f7bdfa 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.kotlin.kinds.KotlinSpecialExpressionKinds class KotlinUSwitchExpression( override val psi: KtWhenExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), USwitchExpression, KotlinUElementWithType { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), USwitchExpression, KotlinUElementWithType { override val expression by lz { KotlinConverter.convertOrNull(psi.subjectExpression, this) } override val body: UExpressionList by lz { @@ -48,8 +48,8 @@ class KotlinUSwitchExpression( class KotlinUSwitchEntry( override val psi: KtWhenEntry, - override val uastParent: UExpression -) : KotlinAbstractUExpression(), USwitchClauseExpressionWithBody { + givenParent: UExpression +) : KotlinAbstractUExpression(givenParent), USwitchClauseExpressionWithBody { override val caseValues by lz { psi.conditions.map { when (it) { is KtWhenConditionInRange -> KotlinCustomUBinaryExpression(it, this).apply { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt index 66a8d03d901..ca81276a4db 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt @@ -24,8 +24,8 @@ import org.jetbrains.uast.UThisExpression class KotlinUThisExpression( override val psi: KtThisExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UThisExpression, KotlinUElementWithType, KotlinEvaluatableUElement { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UThisExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val label: String? get() = psi.getLabelName() diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt index ef18591d5b0..63eb33c6dd5 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt @@ -22,7 +22,7 @@ import org.jetbrains.uast.UThrowExpression class KotlinUThrowExpression( override val psi: KtThrowExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UThrowExpression, KotlinUElementWithType { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UThrowExpression, KotlinUElementWithType { override val thrownExpression by lz { KotlinConverter.convertOrEmpty(psi.thrownExpression, this) } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTryExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTryExpression.kt index b9d3ef20544..544ea9db537 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTryExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTryExpression.kt @@ -24,11 +24,11 @@ import org.jetbrains.uast.UVariable class KotlinUTryExpression( override val psi: KtTryExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UTryExpression, KotlinUElementWithType { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UTryExpression, KotlinUElementWithType { override val tryClause by lz { KotlinConverter.convertOrEmpty(psi.tryBlock, this) } override val catchClauses by lz { psi.catchClauses.map { KotlinUCatchClause(it, this) } } - override val finallyClause by lz { psi.finallyBlock?.finalExpression?.let { KotlinConverter.convertExpression(it, { this }) } } + override val finallyClause by lz { psi.finallyBlock?.finalExpression?.let { KotlinConverter.convertExpression(it, this) } } override val resourceVariables: List get() = emptyList() diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt index f9033c2d953..bcc1e6e2250 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.UastBinaryExpressionWithTypeKind class KotlinUTypeCheckExpression( override val psi: KtIsExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UBinaryExpressionWithType, KotlinUElementWithType, KotlinEvaluatableUElement { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UBinaryExpressionWithType, KotlinUElementWithType, KotlinEvaluatableUElement { override val operand by lz { KotlinConverter.convertOrEmpty(psi.leftHandSide, this) } override val type by lz { psi.typeReference.toPsiType(this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt index d30188c1f84..c3930ece19e 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt @@ -8,14 +8,14 @@ import org.jetbrains.uast.UTypeReferenceExpression open class KotlinUTypeReferenceExpression( override val type: PsiType, override val psi: PsiElement?, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UTypeReferenceExpression, KotlinUElementWithType + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UTypeReferenceExpression, KotlinUElementWithType class LazyKotlinUTypeReferenceExpression( override val psi: PsiElement, - override val uastParent: UElement?, + givenParent: UElement?, private val typeSupplier: () -> PsiType -) : KotlinAbstractUExpression(), UTypeReferenceExpression { +) : KotlinAbstractUExpression(givenParent), UTypeReferenceExpression { override val type: PsiType by lz { typeSupplier() } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUWhileExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUWhileExpression.kt index bd9eb0c7b7a..2032dfa4210 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUWhileExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUWhileExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.UWhileExpression class KotlinUWhileExpression( override val psi: KtWhileExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UWhileExpression { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UWhileExpression { override val condition by lz { KotlinConverter.convertOrEmpty(psi.condition, this) } override val body by lz { KotlinConverter.convertOrEmpty(psi.body, this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/LocalFunction.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/LocalFunction.kt index f82533c6b93..f73b7eb0a47 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/LocalFunction.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/LocalFunction.kt @@ -12,8 +12,10 @@ import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable private class KotlinLocalFunctionUVariable( val function: KtFunction, override val psi: PsiVariable, - override val uastParent: UElement? + private val givenParent: UElement? ) : UVariable, PsiVariable by psi { + override val uastParent: UElement? by lz { convertParent(givenParent) } + override val uastInitializer: UExpression? by lz { createLocalFunctionLambdaExpression(function, this) } @@ -28,8 +30,8 @@ private class KotlinLocalFunctionUVariable( private class KotlinLocalFunctionULambdaExpression( override val psi: KtFunction, - override val uastParent: UElement? -): KotlinAbstractUExpression(), ULambdaExpression { + givenParent: UElement? +): KotlinAbstractUExpression(givenParent), ULambdaExpression { val functionalInterfaceType: PsiType? get() = null diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt index fd889e38740..9f25c732f1f 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt @@ -22,7 +22,7 @@ import org.jetbrains.uast.UExpression class UnknownKotlinExpression( override val psi: KtExpression, - override val uastParent: UElement? -) : KotlinAbstractUExpression(), UExpression { + givenParent: UElement? +) : KotlinAbstractUExpression(givenParent), UExpression { override fun asLogString() = "[!] UnknownKotlinExpression ($psi)" } \ No newline at end of file diff --git a/plugins/uast-kotlin/testData/IfStatement.kt b/plugins/uast-kotlin/testData/IfStatement.kt new file mode 100644 index 00000000000..9a19fa3410c --- /dev/null +++ b/plugins/uast-kotlin/testData/IfStatement.kt @@ -0,0 +1,3 @@ +fun foo() { + val x = if ("abc" != "def") 1 else 0 +} diff --git a/plugins/uast-kotlin/testData/IfStatement.log.txt b/plugins/uast-kotlin/testData/IfStatement.log.txt new file mode 100644 index 00000000000..6d3415eaa13 --- /dev/null +++ b/plugins/uast-kotlin/testData/IfStatement.log.txt @@ -0,0 +1,12 @@ +UFile (package = ) + UClass (name = IfStatementKt) + UAnnotationMethod (name = foo) + UBlockExpression + UDeclarationsExpression + ULocalVariable (name = x) + UIfExpression + UBinaryExpression (operator = !=) + ULiteralExpression (value = "abc") + ULiteralExpression (value = "def") + ULiteralExpression (value = 1) + ULiteralExpression (value = 0) diff --git a/plugins/uast-kotlin/testData/IfStatement.render.txt b/plugins/uast-kotlin/testData/IfStatement.render.txt new file mode 100644 index 00000000000..7088325bb4e --- /dev/null +++ b/plugins/uast-kotlin/testData/IfStatement.render.txt @@ -0,0 +1,5 @@ +public final class IfStatementKt { + public static final fun foo() : void { + var x: int = if ("abc" != "def") 1 else 0 + } +} diff --git a/plugins/uast-kotlin/tests/AbstractKotlinRenderLogTest.kt b/plugins/uast-kotlin/tests/AbstractKotlinRenderLogTest.kt index 9bd74ece306..cb34f9977ad 100644 --- a/plugins/uast-kotlin/tests/AbstractKotlinRenderLogTest.kt +++ b/plugins/uast-kotlin/tests/AbstractKotlinRenderLogTest.kt @@ -1,15 +1,18 @@ package org.jetbrains.uast.test.kotlin import com.intellij.psi.PsiElement +import com.intellij.psi.PsiRecursiveElementVisitor import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.utils.addToStdlib.assertedCast import org.jetbrains.uast.UDeclaration import org.jetbrains.uast.UElement import org.jetbrains.uast.UFile -import org.jetbrains.uast.UIdentifier +import org.jetbrains.uast.kotlin.KotlinUastLanguagePlugin import org.jetbrains.uast.test.common.RenderLogTestBase import org.jetbrains.uast.visitor.UastVisitor +import org.junit.Assert import java.io.File +import java.util.* abstract class AbstractKotlinRenderLogTest : AbstractKotlinUastTest(), RenderLogTestBase { override fun getTestFile(testName: String, ext: String) = @@ -17,6 +20,34 @@ abstract class AbstractKotlinRenderLogTest : AbstractKotlinUastTest(), RenderLog override fun check(testName: String, file: UFile) { super.check(testName, file) + + file.psi.accept(object : PsiRecursiveElementVisitor() { + override fun visitElement(element: PsiElement) { + KotlinUastLanguagePlugin().convertElementWithParent(element, null) + super.visitElement(element) + } + }) + + file.accept(object : UastVisitor { + private val parentStack = Stack() + + override fun visitElement(node: UElement): Boolean { + val parent = node.uastParent + if (parent == null) { + Assert.assertTrue("Wrong parent of $node", parentStack.empty()) + } + else { + Assert.assertEquals("Wrong parent of $node", parentStack.peek(), parent) + } + parentStack.push(node) + return false + } + + override fun afterVisitElement(node: UElement) { + super.afterVisitElement(node) + parentStack.pop() + } + }) file.checkContainingFileForAllElements() } @@ -36,4 +67,4 @@ abstract class AbstractKotlinRenderLogTest : AbstractKotlinUastTest(), RenderLog } }) } -} \ No newline at end of file +} diff --git a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt index 467cc501127..3f1ebfec679 100644 --- a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt +++ b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt @@ -1,11 +1,14 @@ package org.jetbrains.uast.test.kotlin import com.intellij.psi.PsiModifier +import com.intellij.testFramework.UsefulTestCase +import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry import org.jetbrains.kotlin.psi.KtStringTemplateExpression import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase import org.jetbrains.uast.* +import org.jetbrains.uast.kotlin.KotlinUastLanguagePlugin import org.jetbrains.uast.test.env.findElementByText import org.junit.Assert import org.junit.Test @@ -112,4 +115,14 @@ class KotlinUastApiTest : AbstractKotlinUastTest() { assertEquals(42, witDefaultValue.findAttributeValue(null)!!.evaluate()) } } + + @Test fun testIfCondition() { + doTest("IfStatement") { _, file -> + val psiFile = file.psi + val element = psiFile.findElementAt(psiFile.text.indexOf("\"abc\""))!! + val binaryExpression = element.getParentOfType(false)!! + val uBinaryExpression = KotlinUastLanguagePlugin().convertElementWithParent(binaryExpression, null)!! + UsefulTestCase.assertInstanceOf(uBinaryExpression.uastParent, UIfExpression::class.java) + } + } } diff --git a/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt b/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt index f61f8a538cf..f3d47239e54 100644 --- a/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt +++ b/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt @@ -31,6 +31,8 @@ class SimpleKotlinRenderLogTest : AbstractKotlinRenderLogTest() { @Test fun testPropertyWithAnnotation() = doTest("PropertyWithAnnotation") + @Test fun testIfStatement() = doTest("IfStatement") + @Test fun testInnerClasses() = doTest("InnerClasses") @Test fun testSimpleScript() = doTest("SimpleScript")