diff --git a/uast/uast-java/src/org/jetbrains/uast/java/JavaAbstractUElement.kt b/uast/uast-java/src/org/jetbrains/uast/java/JavaAbstractUElement.kt index 3faecaf23378..29b2d9b666d1 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/JavaAbstractUElement.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/JavaAbstractUElement.kt @@ -16,15 +16,20 @@ package org.jetbrains.uast.java -import com.intellij.psi.JavaPsiFacade -import com.intellij.psi.PsiExpression -import com.intellij.psi.PsiType +import com.intellij.psi.* import org.jetbrains.uast.UAnnotation import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression import org.jetbrains.uast.java.internal.JavaUElementWithComments +import org.jetbrains.uast.toUElement + + +abstract class JavaAbstractUElement(givenParent: UElement?) : JavaUElementWithComments { + + @Suppress("unused") // Used in Kotlin 1.2, to be removed in 2018.1 + @Deprecated("use JavaAbstractUElement(givenParent)", ReplaceWith("JavaAbstractUElement(givenParent)")) + constructor() : this(null) -abstract class JavaAbstractUElement : JavaUElementWithComments { override fun equals(other: Any?): Boolean { if (other !is UElement || other.javaClass != this.javaClass) return false return if (this.psi != null) this.psi == other.psi else this === other @@ -37,9 +42,25 @@ abstract class JavaAbstractUElement : JavaUElementWithComments { } override fun toString() = asRenderString() + + override val uastParent: UElement? by lz { givenParent ?: convertParent() } + + protected open fun convertParent(): UElement? = + getPsiParentForLazyConversion()?.let { JavaConverter.unwrapElements(it).toUElement() }?.also { + if (it === this) throw IllegalStateException("lazy parent loop for $this") + if (it.psi != null && it.psi === this.psi) throw IllegalStateException( + "lazy parent loop: psi ${this.psi}(${this.psi?.javaClass}) for $this of ${this.javaClass}") + } + + protected open fun getPsiParentForLazyConversion() = this.psi?.parent } -abstract class JavaAbstractUExpression : JavaAbstractUElement(), UExpression { +abstract class JavaAbstractUExpression(givenParent: UElement?) : JavaAbstractUElement(givenParent), UExpression { + + @Suppress("unused") // Used in Kotlin 1.2, to be removed in 2018.1 + @Deprecated("use JavaAbstractUExpression(givenParent)", ReplaceWith("JavaAbstractUExpression(givenParent)")) + constructor() : this(null) + override fun evaluate(): Any? { val project = psi?.project ?: return null return JavaPsiFacade.getInstance(project).constantEvaluationHelper.computeConstantExpression(psi) @@ -52,4 +73,11 @@ abstract class JavaAbstractUExpression : JavaAbstractUElement(), UExpression { val expression = psi as? PsiExpression ?: return null return expression.type } -} \ No newline at end of file + + override fun getPsiParentForLazyConversion(): PsiElement? = super.getPsiParentForLazyConversion()?.let { + when (it) { + is PsiResourceExpression -> it.parent + else -> it + } + } +} diff --git a/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt b/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt index 4d5694247b6e..ba529a8ac6bf 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt @@ -83,9 +83,8 @@ class JavaUastLanguagePlugin : UastLanguagePlugin { override fun convertElement(element: PsiElement, parent: UElement?, requiredType: Class?): UElement? { if (element !is PsiElement) return null - val parentCallback = parent.toCallback() - return convertDeclaration(element, parentCallback, requiredType) ?: - JavaConverter.convertPsiElement(element, parentCallback, requiredType) + return convertDeclaration(element, parent, requiredType) ?: + JavaConverter.convertPsiElement(element, parent, requiredType) } override fun convertElementWithParent(element: PsiElement, requiredType: Class?): UElement? { @@ -93,21 +92,16 @@ class JavaUastLanguagePlugin : UastLanguagePlugin { if (element is PsiJavaFile) return requiredType.el { JavaUFile(element, this) } JavaConverter.getCached(element)?.let { return it } - val parentCallback = fun(): UElement? { - val parent = JavaConverter.unwrapElements(element.parent) ?: return null - return convertElementWithParent(parent, null) ?: return null - } - return convertDeclaration(element, parentCallback, requiredType) ?: - JavaConverter.convertPsiElement(element, parentCallback, requiredType) + return convertDeclaration(element, null, requiredType) ?: + JavaConverter.convertPsiElement(element, null, requiredType) } 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) } } @@ -119,12 +113,10 @@ class JavaUastLanguagePlugin : UastLanguagePlugin { is PsiJavaFile -> el { JavaUFile(element, this@JavaUastLanguagePlugin) } is UDeclaration -> el { element } is PsiClass -> el { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - JavaUClass.create(element, parent) + JavaUClass.create(element, givenParent) } is PsiMethod -> el { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - JavaUMethod.create(element, this@JavaUastLanguagePlugin, parent) + JavaUMethod.create(element, this@JavaUastLanguagePlugin, givenParent) } is PsiClassInitializer -> el(build(::JavaUClassInitializer)) is PsiEnumConstant -> el(build(::JavaUEnumConstant)) @@ -165,30 +157,28 @@ internal object JavaConverter { } internal fun convertPsiElement(el: PsiElement, - parentCallback: (() -> UElement?)?, + givenParent: UElement?, requiredType: Class? = null): UElement? { getCached(el)?.let { return it } fun

build(ctor: (P, UElement?) -> UElement): () -> UElement? { return fun(): UElement? { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - return ctor(el as P, parent) + return ctor(el as P, givenParent) } } return with (requiredType) { when (el) { is PsiCodeBlock -> el(build(::JavaUCodeBlockExpression)) - is PsiResourceExpression -> convertExpression(el.expression, parentCallback, requiredType) - is PsiExpression -> convertExpression(el, parentCallback, requiredType) - is PsiStatement -> convertStatement(el, parentCallback, requiredType) + is PsiResourceExpression -> convertExpression(el.expression, givenParent, requiredType) + is PsiExpression -> convertExpression(el, givenParent, requiredType) + is PsiStatement -> convertStatement(el, givenParent, requiredType) is PsiIdentifier -> el { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - JavaUSimpleNameReferenceExpression(el, el.text, parent) + JavaUSimpleNameReferenceExpression(el, el.text, givenParent) } is PsiNameValuePair -> el(build(::JavaUNamedExpression)) is PsiArrayInitializerMemberValue -> el(build(::JavaAnnotationArrayInitializerUCallExpression)) is PsiTypeElement -> el(build(::JavaUTypeReferenceExpression)) - is PsiJavaCodeReferenceElement -> convertReference(el, parentCallback, requiredType) + is PsiJavaCodeReferenceElement -> convertReference(el, givenParent, requiredType) else -> null }} } @@ -196,27 +186,25 @@ internal object JavaConverter { internal fun convertBlock(block: PsiCodeBlock, parent: UElement?): UBlockExpression = getCached(block) ?: JavaUCodeBlockExpression(block, parent) - internal fun convertReference(reference: PsiJavaCodeReferenceElement, parentCallback: (() -> UElement?)?, requiredType: Class?): UExpression? { + internal fun convertReference(reference: PsiJavaCodeReferenceElement, givenParent: UElement?, requiredType: Class?): UExpression? { return with (requiredType) { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) if (reference.isQualified) { - expr { JavaUQualifiedReferenceExpression(reference, parent) } + expr { JavaUQualifiedReferenceExpression(reference, givenParent) } } else { val name = reference.referenceName ?: "" - expr { JavaUSimpleNameReferenceExpression(reference, name, parent, reference) } + expr { JavaUSimpleNameReferenceExpression(reference, name, givenParent, reference) } } } } internal fun convertExpression(el: PsiExpression, - parentCallback: (() -> UElement?)?, + givenParent: UElement?, requiredType: Class? = null): UExpression? { getCached(el)?.let { return it } fun

build(ctor: (P, UElement?) -> UExpression): () -> UExpression? { return fun(): UExpression? { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - return ctor(el as P, parent) + return ctor(el as P, givenParent) } } @@ -234,8 +222,7 @@ internal object JavaConverter { if (requiredType == null || requiredType.isAssignableFrom(UQualifiedReferenceExpression::class.java) || requiredType.isAssignableFrom(UCallExpression::class.java)) { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - val expr = JavaUCompositeQualifiedExpression(el, parent).apply { + val expr = JavaUCompositeQualifiedExpression(el, givenParent).apply { receiver = convertOrEmpty(el.methodExpression.qualifierExpression!!, this) selector = JavaUCallExpression(el, this) } @@ -259,7 +246,7 @@ internal object JavaConverter { is PsiPostfixExpression -> expr(build(::JavaUPostfixExpression)) is PsiLiteralExpression -> expr(build(::JavaULiteralExpression)) is PsiMethodReferenceExpression -> expr(build(::JavaUCallableReferenceExpression)) - is PsiReferenceExpression -> convertReference(el, parentCallback, requiredType) + is PsiReferenceExpression -> convertReference(el, givenParent, requiredType) is PsiThisExpression -> expr(build(::JavaUThisExpression)) is PsiSuperExpression -> expr(build(::JavaUSuperExpression)) is PsiInstanceOfExpression -> expr(build(::JavaUInstanceCheckExpression)) @@ -272,29 +259,26 @@ internal object JavaConverter { } internal fun convertStatement(el: PsiStatement, - parentCallback: (() -> UElement?)?, + givenParent: UElement?, requiredType: Class? = null): UExpression? { getCached(el)?.let { return it } fun

build(ctor: (P, UElement?) -> UExpression): () -> UExpression? { return fun(): UExpression? { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - return ctor(el as P, parent) + return ctor(el as P, givenParent) } } return with (requiredType) { when (el) { is PsiDeclarationStatement -> expr { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - convertDeclarations(el.declaredElements, parent!!) + convertDeclarations(el.declaredElements, givenParent ?: JavaConverter.unwrapElements(el.parent).toUElement() !!) } is PsiExpressionListStatement -> expr { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - convertDeclarations(el.expressionList.expressions, parent!!) + convertDeclarations(el.expressionList.expressions, givenParent ?: JavaConverter.unwrapElements(el.parent).toUElement() !!) } is PsiBlockStatement -> expr(build(::JavaUBlockExpression)) is PsiLabeledStatement -> expr(build(::JavaULabeledExpression)) - is PsiExpressionStatement -> convertExpression(el.expression, parentCallback, requiredType) + is PsiExpressionStatement -> convertExpression(el.expression, givenParent, requiredType) is PsiIfStatement -> expr(build(::JavaUIfExpression)) is PsiSwitchStatement -> expr(build(::JavaUSwitchExpression)) is PsiWhileStatement -> expr(build(::JavaUWhileExpression)) @@ -329,15 +313,15 @@ internal object JavaConverter { } internal fun convertOrEmpty(statement: PsiStatement?, parent: UElement?): UExpression { - return statement?.let { convertStatement(it, parent.toCallback(), null) } ?: UastEmptyExpression + return statement?.let { convertStatement(it, parent, null) } ?: UastEmptyExpression } internal fun convertOrEmpty(expression: PsiExpression?, parent: UElement?): UExpression { - return expression?.let { convertExpression(it, parent.toCallback()) } ?: UastEmptyExpression + return expression?.let { convertExpression(it, parent) } ?: UastEmptyExpression } internal fun convertOrNull(expression: PsiExpression?, parent: UElement?): UExpression? { - return if (expression != null) convertExpression(expression, parent.toCallback()) else null + return if (expression != null) convertExpression(expression, parent) else null } internal fun convertOrEmpty(block: PsiCodeBlock?, parent: UElement?): UExpression { diff --git a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUDoWhileExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUDoWhileExpression.kt index 0edac6d1a4f2..94736f2cb1fc 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUDoWhileExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUDoWhileExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.UIdentifier class JavaUDoWhileExpression( override val psi: PsiDoWhileStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UDoWhileExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UDoWhileExpression { override val condition by lz { JavaConverter.convertOrEmpty(psi.condition, this) } override val body by lz { JavaConverter.convertOrEmpty(psi.body, this) } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUForEachExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUForEachExpression.kt index 3e81c589ee7b..f01c5be06c1e 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUForEachExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUForEachExpression.kt @@ -24,8 +24,8 @@ import org.jetbrains.uast.UParameter class JavaUForEachExpression( override val psi: PsiForeachStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UForEachExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UForEachExpression { override val variable: UParameter get() = JavaUParameter(psi.iterationParameter, this) diff --git a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUForExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUForExpression.kt index e057b8a2aa2d..9c7db395e953 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUForExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUForExpression.kt @@ -23,11 +23,11 @@ import org.jetbrains.uast.UIdentifier class JavaUForExpression( override val psi: PsiForStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UForExpression { - override val declaration by lz { psi.initialization?.let { JavaConverter.convertStatement(it, { this }) } } - override val condition by lz { psi.condition?.let { JavaConverter.convertExpression(it, { this }) } } - override val update by lz { psi.update?.let { JavaConverter.convertStatement(it, { this }) } } + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UForExpression { + override val declaration by lz { psi.initialization?.let { JavaConverter.convertStatement(it, this) } } + override val condition by lz { psi.condition?.let { JavaConverter.convertExpression(it, this) } } + override val update by lz { psi.update?.let { JavaConverter.convertStatement(it, this) } } override val body by lz { JavaConverter.convertOrEmpty(psi.body, this) } override val forIdentifier: UIdentifier diff --git a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUIfExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUIfExpression.kt index 9cae21dcd6d5..e929aa1cad11 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUIfExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUIfExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.UIfExpression class JavaUIfExpression( override val psi: PsiIfStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UIfExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UIfExpression { override val condition by lz { JavaConverter.convertOrEmpty(psi.condition, this) } override val thenExpression by lz { JavaConverter.convertOrEmpty(psi.thenBranch, this) } override val elseExpression by lz { JavaConverter.convertOrEmpty(psi.elseBranch, this) } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUSwitchExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUSwitchExpression.kt index a048e9e538b5..0de7b5261f18 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUSwitchExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUSwitchExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.java.kinds.JavaSpecialExpressionKinds class JavaUSwitchExpression( override val psi: PsiSwitchStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), USwitchExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), USwitchExpression { override val expression by lz { JavaConverter.convertOrEmpty(psi.expression, this) } override val body: UExpressionList by lz { @@ -70,8 +70,8 @@ private fun PsiCodeBlock.convertToSwitchEntryList(containingElement: UExpression class JavaUSwitchEntry( val labels: List, val statements: List, - override val uastParent: UExpression -) : JavaAbstractUExpression(), USwitchClauseExpressionWithBody { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), USwitchClauseExpressionWithBody { override val psi: PsiSwitchLabelStatement = labels.first() override val caseValues by lz { @@ -81,7 +81,7 @@ class JavaUSwitchEntry( } else { val value = it.caseValue - value?.let { JavaConverter.convertExpression(it, { this }) } + value?.let { JavaConverter.convertExpression(it, this) } } } } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUTernaryIfExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUTernaryIfExpression.kt index 0438c02686a8..d4a508ed4b06 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUTernaryIfExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUTernaryIfExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.UIfExpression class JavaUTernaryIfExpression( override val psi: PsiConditionalExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UIfExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UIfExpression { override val condition by lz { JavaConverter.convertOrEmpty(psi.condition, this) } override val thenExpression by lz { JavaConverter.convertOrEmpty(psi.thenExpression, this) } override val elseExpression by lz { JavaConverter.convertOrEmpty(psi.elseExpression, this) } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUTryExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUTryExpression.kt index 13cb8b1461a6..b788fd0f0553 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUTryExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUTryExpression.kt @@ -21,8 +21,8 @@ import org.jetbrains.uast.* class JavaUTryExpression( override val psi: PsiTryStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UTryExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UTryExpression { override val tryClause by lz { JavaConverter.convertOrEmpty(psi.tryBlock, this) } override val catchClauses by lz { psi.catchSections.map { JavaUCatchClause(it, this) } } override val finallyClause by lz { psi.finallyBlock?.let { JavaConverter.convertBlock(it, this) } } @@ -46,8 +46,8 @@ class JavaUTryExpression( class JavaUCatchClause( override val psi: PsiCatchSection, - override val uastParent: UElement? -) : JavaAbstractUElement(), UCatchClause { + givenParent: UElement? +) : JavaAbstractUElement(givenParent), UCatchClause { override val body by lz { JavaConverter.convertOrEmpty(psi.catchBlock, this) } override val parameters by lz { diff --git a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUWhileExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUWhileExpression.kt index 79739d156285..4d777779825c 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUWhileExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUWhileExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.UWhileExpression class JavaUWhileExpression( override val psi: PsiWhileStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UWhileExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UWhileExpression { override val condition by lz { JavaConverter.convertOrEmpty(psi.condition, this) } override val body by lz { JavaConverter.convertOrEmpty(psi.body, this) } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUAnnotation.kt b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUAnnotation.kt index 460a74d59473..885791cb0d8f 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUAnnotation.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUAnnotation.kt @@ -22,13 +22,12 @@ import org.jetbrains.uast.java.expressions.JavaUNamedExpression class JavaUAnnotation( override val psi: PsiAnnotation, - override val uastParent: UElement? -) : UAnnotation { + givenParent: UElement? +) : JavaAbstractUElement(givenParent), UAnnotation { override val qualifiedName: String? get() = psi.qualifiedName override val attributeValues: List by lz { - val context = getUastContext() val attributes = psi.parameterList.attributes attributes.map { attribute -> JavaUNamedExpression(attribute, this) } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUVariable.kt b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUVariable.kt index ce6b19ffbcd0..0f35c31dd961 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUVariable.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUVariable.kt @@ -20,7 +20,12 @@ import com.intellij.psi.* import org.jetbrains.uast.* import org.jetbrains.uast.java.internal.JavaUElementWithComments -abstract class AbstractJavaUVariable : PsiVariable, UVariable, JavaUElementWithComments { +abstract class AbstractJavaUVariable(givenParent: UElement?) : JavaAbstractUElement(givenParent), PsiVariable, UVariable, JavaUElementWithComments { + + @Suppress("unused") // Used in Kotlin 1.1.4, to be removed in 2018.1 + @Deprecated("use AbstractJavaUVariable(givenParent) instead", ReplaceWith("AbstractJavaUVariable(givenParent)")) + constructor() : this(null) + override val uastInitializer by lz { val initializer = psi.initializer ?: return@lz null getLanguagePlugin().convertElement(initializer, this) as? UExpression @@ -38,8 +43,8 @@ abstract class AbstractJavaUVariable : PsiVariable, UVariable, JavaUElementWithC open class JavaUVariable( psi: PsiVariable, - override val uastParent: UElement? -) : AbstractJavaUVariable(), UVariable, PsiVariable by psi { + givenParent: UElement? +) : AbstractJavaUVariable(givenParent), UVariable, PsiVariable by psi { override val psi = unwrap(psi) companion object { @@ -57,29 +62,29 @@ open class JavaUVariable( open class JavaUParameter( psi: PsiParameter, - override val uastParent: UElement? -) : AbstractJavaUVariable(), UParameter, PsiParameter by psi { + givenParent: UElement? +) : AbstractJavaUVariable(givenParent), UParameter, PsiParameter by psi { override val psi = unwrap(psi) } open class JavaUField( psi: PsiField, - override val uastParent: UElement? -) : AbstractJavaUVariable(), UField, PsiField by psi { + givenParent: UElement? +) : AbstractJavaUVariable(givenParent), UField, PsiField by psi { override val psi = unwrap(psi) } open class JavaULocalVariable( psi: PsiLocalVariable, - override val uastParent: UElement? -) : AbstractJavaUVariable(), ULocalVariable, PsiLocalVariable by psi { + givenParent: UElement? +) : AbstractJavaUVariable(givenParent), ULocalVariable, PsiLocalVariable by psi { override val psi = unwrap(psi) } open class JavaUEnumConstant( psi: PsiEnumConstant, - override val uastParent: UElement? -) : AbstractJavaUVariable(), UEnumConstant, PsiEnumConstant by psi { + givenParent: UElement? +) : AbstractJavaUVariable(givenParent), UEnumConstant, PsiEnumConstant by psi { override val initializingClass: UClass? by lz { getLanguagePlugin().convertOpt(psi.initializingClass, this) } override val psi = unwrap(psi) @@ -117,8 +122,8 @@ open class JavaUEnumConstant( private class JavaEnumConstantClassReference( override val psi: PsiEnumConstant, - override val uastParent: UElement? - ) : JavaAbstractUExpression(), USimpleNameReferenceExpression { + givenParent: UElement? + ) : JavaAbstractUExpression(givenParent), USimpleNameReferenceExpression { override fun resolve() = psi.containingClass override val resolvedName: String? get() = psi.containingClass?.name diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaDumbUElement.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaDumbUElement.kt index bc1ca4085476..5ecbf2a57b01 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaDumbUElement.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaDumbUElement.kt @@ -21,9 +21,9 @@ import org.jetbrains.uast.internal.log class JavaDumbUElement( override val psi: PsiElement, - override val uastParent: UElement?, + givenParent: UElement?, private val customRenderString: String? = null -) : JavaAbstractUElement(), UElement { +) : JavaAbstractUElement(givenParent), UElement { override fun asLogString() = log() override fun asRenderString() = customRenderString ?: "" } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUArrayAccessExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUArrayAccessExpression.kt index fc6cb42aec29..d0275aa90ae1 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUArrayAccessExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUArrayAccessExpression.kt @@ -21,8 +21,8 @@ import org.jetbrains.uast.UElement class JavaUArrayAccessExpression( override val psi: PsiArrayAccessExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UArrayAccessExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UArrayAccessExpression { override val receiver by lz { JavaConverter.convertOrEmpty(psi.arrayExpression, this) } override val indices by lz { singletonListOrEmpty(JavaConverter.convertOrNull(psi.indexExpression, this)) } } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUAssertExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUAssertExpression.kt index 8132ed64ca6a..94c5b0f5437c 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUAssertExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUAssertExpression.kt @@ -23,8 +23,8 @@ import org.jetbrains.uast.* class JavaUAssertExpression( override val psi: PsiAssertStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UCallExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UCallExpression { val condition: UExpression by lz { JavaConverter.convertOrEmpty(psi.assertCondition, this) } val message: UExpression? by lz { JavaConverter.convertOrNull(psi.assertDescription, this) } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUAssignmentExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUAssignmentExpression.kt index 855930d158ed..890bcc09b484 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUAssignmentExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUAssignmentExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.UIdentifier class JavaUAssignmentExpression( override val psi: PsiAssignmentExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UBinaryExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UBinaryExpression { override val leftOperand by lz { JavaConverter.convertOrEmpty(psi.lExpression, this) } override val rightOperand by lz { JavaConverter.convertOrEmpty(psi.rExpression, this) } override val operator by lz { psi.operationTokenType.getOperatorType() } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBinaryExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBinaryExpression.kt index 8a88a2952079..abe51e760858 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBinaryExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBinaryExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.UIdentifier class JavaUBinaryExpression( override val psi: PsiBinaryExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UBinaryExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UBinaryExpression { override val leftOperand by lz { JavaConverter.convertOrEmpty(psi.lOperand, this) } override val rightOperand by lz { JavaConverter.convertOrEmpty(psi.rOperand, this) } override val operator by lz { psi.operationTokenType.getOperatorType() } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBlockExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBlockExpression.kt index 7134554314a2..bd5367fc9c27 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBlockExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBlockExpression.kt @@ -21,7 +21,7 @@ import org.jetbrains.uast.UElement class JavaUBlockExpression( override val psi: PsiBlockStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UBlockExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UBlockExpression { override val expressions by lz { psi.codeBlock.statements.map { JavaConverter.convertOrEmpty(it, this) } } } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBreakExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBreakExpression.kt index 4c1353f4c5df..d423c1821aac 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBreakExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUBreakExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.UElement class JavaUBreakExpression( override val psi: PsiBreakStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UBreakExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UBreakExpression { override val label: String? get() = psi.labelIdentifier?.text } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCallableReferenceExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCallableReferenceExpression.kt index 2d77e6bb42e7..bba1d74a7d67 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCallableReferenceExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCallableReferenceExpression.kt @@ -15,7 +15,6 @@ */ package org.jetbrains.uast.java -import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethodReferenceExpression import com.intellij.psi.PsiNamedElement import com.intellij.psi.PsiType @@ -24,8 +23,8 @@ import org.jetbrains.uast.UElement class JavaUCallableReferenceExpression( override val psi: PsiMethodReferenceExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UCallableReferenceExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UCallableReferenceExpression { override val qualifierExpression by lz { JavaConverter.convertOrNull(psi.qualifierExpression, this) } override val qualifierType: PsiType? diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUClassLiteralExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUClassLiteralExpression.kt index e1451dabb44c..0b9a8d81f35e 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUClassLiteralExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUClassLiteralExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.UElement class JavaUClassLiteralExpression( override val psi: PsiClassObjectAccessExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UClassLiteralExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UClassLiteralExpression { override val type: PsiType get() = psi.operand.type diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCodeBlockExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCodeBlockExpression.kt index ac82f78b5d76..2f6988bb39f3 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCodeBlockExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCodeBlockExpression.kt @@ -21,7 +21,7 @@ import org.jetbrains.uast.UElement class JavaUCodeBlockExpression( override val psi: PsiCodeBlock, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UBlockExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UBlockExpression { override val expressions by lz { psi.statements.map { JavaConverter.convertOrEmpty(it, this) } } } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCompositeQualifiedExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCompositeQualifiedExpression.kt index b9c409de9a32..6622b801af12 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCompositeQualifiedExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUCompositeQualifiedExpression.kt @@ -21,8 +21,8 @@ import org.jetbrains.uast.* class JavaUCompositeQualifiedExpression( override val psi: PsiElement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UQualifiedReferenceExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UQualifiedReferenceExpression { override lateinit var receiver: UExpression internal set diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUContinueExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUContinueExpression.kt index f9336b9a949e..fd4f0717ac5d 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUContinueExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUContinueExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.UElement class JavaUContinueExpression( override val psi: PsiContinueStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UContinueExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UContinueExpression { override val label: String? get() = psi.labelIdentifier?.text } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUExpressionList.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUExpressionList.kt index a62589c34448..7b3955f650af 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUExpressionList.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUExpressionList.kt @@ -25,8 +25,8 @@ import org.jetbrains.uast.java.JavaAbstractUExpression open class JavaUExpressionList( override val psi: PsiElement, override val kind: UastSpecialExpressionKind, // original element - override val uastParent: UElement? -) : JavaAbstractUExpression(), UExpressionList { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UExpressionList { override lateinit var expressions: List internal set } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUInstanceCheckExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUInstanceCheckExpression.kt index 53c756b9353c..ed291ac27d9c 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUInstanceCheckExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUInstanceCheckExpression.kt @@ -24,8 +24,8 @@ import org.jetbrains.uast.UastErrorType class JavaUInstanceCheckExpression( override val psi: PsiInstanceOfExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UBinaryExpressionWithType { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UBinaryExpressionWithType { override val operand by lz { JavaConverter.convertOrEmpty(psi.operand, this) } override val typeReference by lz { psi.checkType?.let { JavaUTypeReferenceExpression(it, this) } } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULabeledExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULabeledExpression.kt index f5464964791e..3acf4b5767cc 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULabeledExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULabeledExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.ULabeledExpression class JavaULabeledExpression( override val psi: PsiLabeledStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), ULabeledExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), ULabeledExpression { override val label: String get() = psi.labelIdentifier.text diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULambdaExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULambdaExpression.kt index 9263fc78f38f..b2891ea7ffb5 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULambdaExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULambdaExpression.kt @@ -25,8 +25,8 @@ import org.jetbrains.uast.UastEmptyExpression class JavaULambdaExpression( override val psi: PsiLambdaExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), ULambdaExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), ULambdaExpression { override val functionalInterfaceType: PsiType? get() = psi.functionalInterfaceType diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULiteralExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULiteralExpression.kt index 10ed37cc6636..58bd97c28c21 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULiteralExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaULiteralExpression.kt @@ -21,8 +21,8 @@ import org.jetbrains.uast.ULiteralExpression class JavaULiteralExpression( override val psi: PsiLiteralExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), ULiteralExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), ULiteralExpression { override fun evaluate() = psi.value override val value by lz { evaluate() } } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUNamedExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUNamedExpression.kt index 2377f9cd1954..ade1e33b72dc 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUNamedExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUNamedExpression.kt @@ -26,13 +26,13 @@ import org.jetbrains.uast.java.lz class JavaUNamedExpression( override val psi: PsiNameValuePair, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UNamedExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UNamedExpression { override fun evaluate(): Any? = expression.evaluate() override val name: String? get() = psi.name override val expression: UExpression by lz { - psi.value?.let { value -> JavaConverter.convertPsiElement(value, { this }) } as? UExpression ?: UastEmptyExpression } + psi.value?.let { value -> JavaConverter.convertPsiElement(value, this) } as? UExpression ?: UastEmptyExpression } } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUObjectLiteralExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUObjectLiteralExpression.kt index c4eaee44539f..13c9b95482d9 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUObjectLiteralExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUObjectLiteralExpression.kt @@ -23,13 +23,13 @@ import org.jetbrains.uast.UReferenceExpression class JavaUObjectLiteralExpression( override val psi: PsiNewExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UObjectLiteralExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UObjectLiteralExpression { override val declaration by lz { JavaUClass.create(psi.anonymousClass!!, this) } override val classReference by lz { psi.classReference?.let { ref -> - JavaConverter.convertReference(ref, { this }, null) as? UReferenceExpression + JavaConverter.convertReference(ref, this, null) as? UReferenceExpression } } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUParenthesizedExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUParenthesizedExpression.kt index ce157b723754..bc00d8aaa9ba 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUParenthesizedExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUParenthesizedExpression.kt @@ -21,8 +21,8 @@ import org.jetbrains.uast.UParenthesizedExpression class JavaUParenthesizedExpression( override val psi: PsiParenthesizedExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UParenthesizedExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UParenthesizedExpression { override val expression by lz { JavaConverter.convertOrEmpty(psi.expression, this) } override fun evaluate() = expression.evaluate() } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPolyadicExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPolyadicExpression.kt index 3c194395e781..93c6677125bb 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPolyadicExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPolyadicExpression.kt @@ -16,13 +16,16 @@ package org.jetbrains.uast.java import com.intellij.psi.PsiPolyadicExpression -import org.jetbrains.uast.* +import org.jetbrains.uast.UElement +import org.jetbrains.uast.UExpression +import org.jetbrains.uast.UPolyadicExpression +import org.jetbrains.uast.UastBinaryOperator class JavaUPolyadicExpression( override val psi: PsiPolyadicExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UPolyadicExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UPolyadicExpression { override val operands: List by lz { psi.operands.map { JavaConverter.convertOrEmpty(it, this) } } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPostfixExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPostfixExpression.kt index b2bb60df5385..eaff7a642faa 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPostfixExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPostfixExpression.kt @@ -24,8 +24,8 @@ import org.jetbrains.uast.UastPostfixOperator class JavaUPostfixExpression( override val psi: PsiPostfixExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UPostfixExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UPostfixExpression { override val operand by lz { JavaConverter.convertOrEmpty(psi.operand, this) } override val operatorIdentifier: UIdentifier? diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPrefixExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPrefixExpression.kt index 113c5fe785d4..81c909e957d7 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPrefixExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPrefixExpression.kt @@ -24,8 +24,8 @@ import org.jetbrains.uast.UastPrefixOperator class JavaUPrefixExpression( override val psi: PsiPrefixExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UPrefixExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UPrefixExpression { override val operand by lz { JavaConverter.convertOrEmpty(psi.operand, this) } override val operatorIdentifier: UIdentifier? diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUQualifiedReferenceExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUQualifiedReferenceExpression.kt index bd4c288ceabc..ceaf38b28d6b 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUQualifiedReferenceExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUQualifiedReferenceExpression.kt @@ -21,10 +21,10 @@ import org.jetbrains.uast.* class JavaUQualifiedReferenceExpression( override val psi: PsiJavaCodeReferenceElement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UQualifiedReferenceExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UQualifiedReferenceExpression { override val receiver by lz { - psi.qualifier?.let { JavaConverter.convertPsiElement(it, { this }) as? UExpression } ?: UastEmptyExpression + psi.qualifier?.let { JavaConverter.convertPsiElement(it, this) as? UExpression } ?: UastEmptyExpression } override val selector by lz { diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUReturnExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUReturnExpression.kt index a2e89847fefd..dbf56ebfe8c4 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUReturnExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUReturnExpression.kt @@ -22,7 +22,7 @@ import org.jetbrains.uast.UReturnExpression class JavaUReturnExpression( override val psi: PsiReturnStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UReturnExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UReturnExpression { override val returnExpression by lz { JavaConverter.convertOrNull(psi.returnValue, this) } } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSimpleNameReferenceExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSimpleNameReferenceExpression.kt index 86e4c46834d3..b7bc9aaa4d38 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSimpleNameReferenceExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSimpleNameReferenceExpression.kt @@ -23,9 +23,9 @@ import org.jetbrains.uast.UTypeReferenceExpression class JavaUSimpleNameReferenceExpression( override val psi: PsiElement?, override val identifier: String, - override val uastParent: UElement?, + givenParent: UElement?, val reference: PsiReference? = null -) : JavaAbstractUExpression(), USimpleNameReferenceExpression { +) : JavaAbstractUExpression(givenParent), USimpleNameReferenceExpression { override fun resolve() = (reference ?: psi as? PsiReference)?.resolve() override val resolvedName: String? get() = ((reference ?: psi as? PsiReference)?.resolve() as? PsiNamedElement)?.name @@ -33,17 +33,17 @@ class JavaUSimpleNameReferenceExpression( class JavaUTypeReferenceExpression( override val psi: PsiTypeElement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UTypeReferenceExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UTypeReferenceExpression { override val type: PsiType get() = psi.type } class LazyJavaUTypeReferenceExpression( override val psi: PsiElement, - override val uastParent: UElement?, + givenParent: UElement?, private val typeSupplier: () -> PsiType -) : JavaAbstractUExpression(), UTypeReferenceExpression { +) : JavaAbstractUExpression(givenParent), UTypeReferenceExpression { override val type: PsiType by lz { typeSupplier() } } @@ -51,8 +51,8 @@ class JavaClassUSimpleNameReferenceExpression( override val identifier: String, val ref: PsiJavaReference, override val psi: PsiElement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), USimpleNameReferenceExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), USimpleNameReferenceExpression { override fun resolve() = ref.resolve() override val resolvedName: String? get() = (ref.resolve() as? PsiNamedElement)?.name diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSuperExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSuperExpression.kt index e033adbe11f9..ed85bf52da9d 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSuperExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSuperExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.USuperExpression class JavaUSuperExpression( override val psi: PsiSuperExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), USuperExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), USuperExpression { override val label: String? get() = psi.qualifier?.qualifiedName diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSynchronizedExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSynchronizedExpression.kt index 9b2e110987f8..c25cf52dc05d 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSynchronizedExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUSynchronizedExpression.kt @@ -27,8 +27,8 @@ import org.jetbrains.uast.visitor.UastVisitor class JavaUSynchronizedExpression( override val psi: PsiSynchronizedStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UBlockExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UBlockExpression { override val expressions by lz { psi.body?.statements?.map { JavaConverter.convertOrEmpty(it, this) } ?: listOf() } val lockExpression by lz { JavaConverter.convertOrEmpty(psi.lockExpression, this) } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUThisExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUThisExpression.kt index 97facc8ffaca..608b7f7fbf30 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUThisExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUThisExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.UThisExpression class JavaUThisExpression( override val psi: PsiThisExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UThisExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UThisExpression { override val label: String? get() = psi.qualifier?.qualifiedName diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUThrowExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUThrowExpression.kt index a78402d2a6a2..5fa770ede50c 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUThrowExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUThrowExpression.kt @@ -22,7 +22,7 @@ import org.jetbrains.uast.UThrowExpression class JavaUThrowExpression( override val psi: PsiThrowStatement, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UThrowExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UThrowExpression { override val thrownExpression by lz { JavaConverter.convertOrEmpty(psi.exception, this) } } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUTypeCastExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUTypeCastExpression.kt index 750bcff5cdaf..ca3d6a33d795 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUTypeCastExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUTypeCastExpression.kt @@ -24,8 +24,8 @@ import org.jetbrains.uast.UastErrorType class JavaUTypeCastExpression( override val psi: PsiTypeCastExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UBinaryExpressionWithType { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UBinaryExpressionWithType { override val operand by lz { JavaConverter.convertOrEmpty(psi.operand, this) } override val type: PsiType diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/javaUCallExpressions.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/javaUCallExpressions.kt index cd1bcd14c733..37572a4bccda 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/javaUCallExpressions.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/javaUCallExpressions.kt @@ -16,14 +16,15 @@ package org.jetbrains.uast.java import com.intellij.psi.* -import com.intellij.psi.util.* +import com.intellij.psi.util.PsiTreeUtil +import com.intellij.psi.util.PsiTypesUtil import org.jetbrains.uast.* import org.jetbrains.uast.psi.UElementWithLocation class JavaUCallExpression( override val psi: PsiMethodCallExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UCallExpression, UElementWithLocation { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UCallExpression, UElementWithLocation { override val kind: UastCallKind get() = UastCallKind.METHOD_CALL @@ -59,10 +60,12 @@ class JavaUCallExpression( override val receiver: UExpression? get() { - return if (uastParent is UQualifiedReferenceExpression && uastParent.selector == this) - uastParent.receiver - else - null + uastParent.let { uastParent -> + return if (uastParent is UQualifiedReferenceExpression && uastParent.selector == this) + uastParent.receiver + else + null + } } override val receiverType: PsiType? @@ -97,8 +100,8 @@ class JavaUCallExpression( class JavaConstructorUCallExpression( override val psi: PsiNewExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UCallExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UCallExpression { override val kind by lz { when { psi.arrayInitializer != null -> UastCallKind.NEW_ARRAY_WITH_INITIALIZER @@ -118,7 +121,7 @@ class JavaConstructorUCallExpression( override val classReference by lz { psi.classReference?.let { ref -> - JavaConverter.convertReference(ref, { this }, null) as? UReferenceExpression + JavaConverter.convertReference(ref, this, null) as? UReferenceExpression } } @@ -157,8 +160,8 @@ class JavaConstructorUCallExpression( class JavaArrayInitializerUCallExpression( override val psi: PsiArrayInitializerExpression, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UCallExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UCallExpression { override val methodIdentifier: UIdentifier? get() = null @@ -194,8 +197,8 @@ class JavaArrayInitializerUCallExpression( class JavaAnnotationArrayInitializerUCallExpression( override val psi: PsiArrayInitializerMemberValue, - override val uastParent: UElement? -) : JavaAbstractUExpression(), UCallExpression { + givenParent: UElement? +) : JavaAbstractUExpression(givenParent), UCallExpression { override val kind: UastCallKind get() = UastCallKind.NESTED_ARRAY_INITIALIZER @@ -212,7 +215,7 @@ class JavaAnnotationArrayInitializerUCallExpression( override val valueArguments by lz { psi.initializers.map { - JavaConverter.convertPsiElement(it, { this }) as? UExpression ?: UnknownJavaExpression(it, this) + JavaConverter.convertPsiElement(it, this) as? UExpression ?: UnknownJavaExpression(it, this) } } diff --git a/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastPerformanceTest.kt b/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastPerformanceTest.kt new file mode 100644 index 000000000000..d0db58e87fd6 --- /dev/null +++ b/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastPerformanceTest.kt @@ -0,0 +1,51 @@ +// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.uast.test.java + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiElementVisitor +import com.intellij.testFramework.PlatformTestUtil +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import junit.framework.TestCase +import org.jetbrains.uast.toUElement +import org.junit.Test + +class JavaUastPerformanceTest : LightCodeInsightFixtureTestCase() { + + class EachPsiToUastWalker : PsiElementVisitor() { + var totalCount = 0 + var identityChecksum = 0 + override fun visitElement(element: PsiElement) { + val uElement = element.toUElement() + if (uElement != null) { + totalCount++ + identityChecksum = 31 * identityChecksum + System.identityHashCode(uElement) + } + + element.acceptChildren(this) + } + } + + @Test + fun testVeryLongQualifiedReferenceExpression() { + val expectedUElementsCount = 4019 + val clazz = myFixture.addClass(""" + class MyClass { + String foo(){ + return new java.lang.StringBuilder() + ${(1..1000).joinToString("\n") { ".append(\"$it\")" }} + .toString(); + } + } + """.trimIndent()) + val nonCachedWalk = EachPsiToUastWalker().apply { + PlatformTestUtil.startPerformanceTest("convert each element to uast first time", 4000) { + clazz.accept(this) + TestCase.assertEquals(expectedUElementsCount, totalCount) + }.attempts(1).assertTiming() + } + + } + + + +} \ No newline at end of file