From 92795f0d272fa353464af75a483e8ecadb393f15 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Mon, 27 Nov 2017 20:03:00 +0300 Subject: [PATCH] Uast: `UastEmptyExpression` is not a singleton object anymore --- .../org/jetbrains/uast/UastLanguagePlugin.kt | 2 +- .../jetbrains/uast/baseElements/UExpression.kt | 17 ++++++++++++++--- .../org/jetbrains/uast/declarations/UMethod.kt | 2 +- .../uast/java/JavaUastLanguagePlugin.kt | 8 ++++---- .../uast/java/declarations/JavaUAnnotation.kt | 4 ++-- .../java/declarations/JavaUClassInitializer.kt | 2 +- .../uast/java/declarations/JavaUVariable.kt | 2 +- .../java/expressions/JavaULambdaExpression.kt | 2 +- .../java/expressions/JavaUNamedExpression.kt | 2 +- .../JavaUQualifiedReferenceExpression.kt | 2 +- uast/uast-tests/java/Simple/DoWhile.values.txt | 2 +- .../java/Simple/DoWhileInfinite.values.txt | 2 +- .../java/Simple/DoWhileWithReturn.values.txt | 2 +- .../EnumSwitchConditionalBreak.values.txt | 2 +- uast/uast-tests/java/Simple/Labeled.values.txt | 2 +- .../java/Simple/LabeledOuter.values.txt | 2 +- .../java/Simple/WhileWithContinue.values.txt | 4 ++-- .../java/Simple/WhileWithIncrement.values.txt | 2 +- .../java/Simple/WhileWithReturn.values.txt | 2 +- .../uast/test/java/AbstractJavaRenderLogTest.kt | 2 -- 20 files changed, 37 insertions(+), 28 deletions(-) diff --git a/uast/uast-common/src/org/jetbrains/uast/UastLanguagePlugin.kt b/uast/uast-common/src/org/jetbrains/uast/UastLanguagePlugin.kt index e5e48269e870..19aac16396e4 100644 --- a/uast/uast-common/src/org/jetbrains/uast/UastLanguagePlugin.kt +++ b/uast/uast-common/src/org/jetbrains/uast/UastLanguagePlugin.kt @@ -93,7 +93,7 @@ interface UastLanguagePlugin { fun getInitializerBody(element: PsiClassInitializer): UExpression { if (element is UClassInitializer) return element.uastBody - return (convertElementWithParent(element, null) as? UClassInitializer)?.uastBody ?: UastEmptyExpression + return (convertElementWithParent(element, null) as? UClassInitializer)?.uastBody ?: UastEmptyExpression(null) } fun getInitializerBody(element: PsiVariable): UExpression? { diff --git a/uast/uast-common/src/org/jetbrains/uast/baseElements/UExpression.kt b/uast/uast-common/src/org/jetbrains/uast/baseElements/UExpression.kt index 2445c6928aa2..154876189c24 100644 --- a/uast/uast-common/src/org/jetbrains/uast/baseElements/UExpression.kt +++ b/uast/uast-common/src/org/jetbrains/uast/baseElements/UExpression.kt @@ -84,9 +84,7 @@ interface ULabeled : UElement { * * Use [UastEmptyExpression] in this case. */ -object UastEmptyExpression : UExpression, JvmDeclarationUElement { - override val uastParent: UElement? - get() = null +open class UastEmptyExpression(override val uastParent: UElement?) : UExpression, JvmDeclarationUElement { override val annotations: List get() = emptyList() @@ -95,4 +93,17 @@ object UastEmptyExpression : UExpression, JvmDeclarationUElement { get() = null override fun asLogString() = log() + + override fun hashCode(): Int = uastParent?.hashCode() ?: super.hashCode() + + override fun equals(other: Any?): Boolean = + if (other is UastEmptyExpression) other.uastParent == uastParent + else false + + @Deprecated("create class instance instead") + companion object : UastEmptyExpression(null) { + @JvmField + val INSTANCE: UastEmptyExpression = this + } + } \ No newline at end of file diff --git a/uast/uast-common/src/org/jetbrains/uast/declarations/UMethod.kt b/uast/uast-common/src/org/jetbrains/uast/declarations/UMethod.kt index 9832198c462b..6bbd96b620b3 100644 --- a/uast/uast-common/src/org/jetbrains/uast/declarations/UMethod.kt +++ b/uast/uast-common/src/org/jetbrains/uast/declarations/UMethod.kt @@ -75,7 +75,7 @@ interface UMethod : UDeclaration, PsiMethod { val body = uastBody append(when (body) { is UBlockExpression -> " " + body.asRenderString() - else -> " = " + ((body ?: UastEmptyExpression).asRenderString()) + else -> " = " + ((body ?: UastEmptyExpression(this@UMethod)).asRenderString()) }) } 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 af63f1d8c58f..76eaeb2bafd7 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt @@ -304,7 +304,7 @@ internal object JavaConverter { is PsiThrowStatement -> expr(build(::JavaUThrowExpression)) is PsiSynchronizedStatement -> expr(build(::JavaUSynchronizedExpression)) is PsiTryStatement -> expr(build(::JavaUTryExpression)) - is PsiEmptyStatement -> expr { UastEmptyExpression } + is PsiEmptyStatement -> expr { UastEmptyExpression(el.parent?.toUElement()) } is PsiSwitchLabelStatement -> expr { when { givenParent is UExpressionList && givenParent.kind == JavaSpecialExpressionKinds.SWITCH -> findUSwitchEntry(givenParent, el) @@ -335,11 +335,11 @@ internal object JavaConverter { } internal fun convertOrEmpty(statement: PsiStatement?, parent: UElement?): UExpression { - return statement?.let { convertStatement(it, parent, null) } ?: UastEmptyExpression + return statement?.let { convertStatement(it, parent, null) } ?: UastEmptyExpression(parent) } internal fun convertOrEmpty(expression: PsiExpression?, parent: UElement?): UExpression { - return expression?.let { convertExpression(it, parent) } ?: UastEmptyExpression + return expression?.let { convertExpression(it, parent) } ?: UastEmptyExpression(parent) } internal fun convertOrNull(expression: PsiExpression?, parent: UElement?): UExpression? { @@ -347,6 +347,6 @@ internal object JavaConverter { } internal fun convertOrEmpty(block: PsiCodeBlock?, parent: UElement?): UExpression { - return if (block != null) convertBlock(block, parent) else UastEmptyExpression + return if (block != null) convertBlock(block, parent) else UastEmptyExpression(parent) } } \ No newline at end of file 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 259f65115cc9..b04035e15673 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 @@ -38,13 +38,13 @@ class JavaUAnnotation( override fun findAttributeValue(name: String?): UExpression? { val context = getUastContext() val attributeValue = psi.findAttributeValue(name) ?: return null - return context.convertElement(attributeValue, this, null) as? UExpression ?: UastEmptyExpression + return context.convertElement(attributeValue, this, null) as? UExpression ?: UastEmptyExpression(this) } override fun findDeclaredAttributeValue(name: String?): UExpression? { val context = getUastContext() val attributeValue = psi.findDeclaredAttributeValue(name) ?: return null - return context.convertElement(attributeValue, this, null) as? UExpression ?: UastEmptyExpression + return context.convertElement(attributeValue, this, null) as? UExpression ?: UastEmptyExpression(this) } companion object { diff --git a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClassInitializer.kt b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClassInitializer.kt index 3beff74068e8..eb16ddbac398 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClassInitializer.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClassInitializer.kt @@ -33,7 +33,7 @@ class JavaUClassInitializer( get() = null override val uastBody by lz { - getLanguagePlugin().convertElement(psi.body, this, null) as? UExpression ?: UastEmptyExpression + getLanguagePlugin().convertElement(psi.body, this, null) as? UExpression ?: UastEmptyExpression(this) } override val annotations by lz { psi.annotations.map { JavaUAnnotation(it, 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 2d3df12d3eea..2eb829877fb0 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 @@ -134,7 +134,7 @@ open class JavaUEnumConstant( override val valueArguments by lz { psi.argumentList?.expressions?.map { - getLanguagePlugin().convertElement(it, this) as? UExpression ?: UastEmptyExpression + getLanguagePlugin().convertElement(it, this) as? UExpression ?: UastEmptyExpression(this) } ?: emptyList() } 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 73cbc886722d..d130c9ab2e44 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 @@ -39,7 +39,7 @@ class JavaULambdaExpression( when (b) { is PsiCodeBlock -> JavaConverter.convertBlock(b, this) is PsiExpression -> JavaConverter.convertOrEmpty(b, this) - else -> UastEmptyExpression + else -> UastEmptyExpression(this) } } } \ 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 7d56ae492135..6dfed6aab9a5 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 @@ -34,6 +34,6 @@ class JavaUNamedExpression( 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(this) } } 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 2b82e3f3f08b..b6b18dd8d93c 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 @@ -24,7 +24,7 @@ class JavaUQualifiedReferenceExpression( 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(this) } override val selector by lz { diff --git a/uast/uast-tests/java/Simple/DoWhile.values.txt b/uast/uast-tests/java/Simple/DoWhile.values.txt index 3a6d7afc2287..ac8604f6f880 100644 --- a/uast/uast-tests/java/Simple/DoWhile.values.txt +++ b/uast/uast-tests/java/Simple/DoWhile.values.txt @@ -22,7 +22,7 @@ UFile (package = ) [public class DoWhile {...] UBlockExpression [{...}] = (var count = Undetermined) UPostfixExpression (operator = ++) [count++] = (var count = Undetermined) USimpleNameReferenceExpression (identifier = count) [count] = (var count = Undetermined) - UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED + UastEmptyExpression [UastEmptyExpression] = Undetermined UBinaryExpression (operator = =) [number = number / 10] = Undetermined (depending on: (var number = Undetermined)) USimpleNameReferenceExpression (identifier = number) [number] = (var number = Undetermined) UBinaryExpression (operator = /) [number / 10] = Undetermined (depending on: (var number = Undetermined)) diff --git a/uast/uast-tests/java/Simple/DoWhileInfinite.values.txt b/uast/uast-tests/java/Simple/DoWhileInfinite.values.txt index a7284fb9f22b..e668733bdf39 100644 --- a/uast/uast-tests/java/Simple/DoWhileInfinite.values.txt +++ b/uast/uast-tests/java/Simple/DoWhileInfinite.values.txt @@ -22,6 +22,6 @@ UFile (package = ) [public class DoWhileInfinite {...] UBlockExpression [{...}] = (var count = 0) UPostfixExpression (operator = ++) [count++] = (var count = 0) USimpleNameReferenceExpression (identifier = count) [count] = (var count = 0) - UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED + UastEmptyExpression [UastEmptyExpression] = Undetermined UReturnExpression [return count] = Nothing USimpleNameReferenceExpression (identifier = count) [count] = (var count = 0) diff --git a/uast/uast-tests/java/Simple/DoWhileWithReturn.values.txt b/uast/uast-tests/java/Simple/DoWhileWithReturn.values.txt index 52c9ea094139..42194a60f153 100644 --- a/uast/uast-tests/java/Simple/DoWhileWithReturn.values.txt +++ b/uast/uast-tests/java/Simple/DoWhileWithReturn.values.txt @@ -19,7 +19,7 @@ UFile (package = ) [public class DoWhileWithReturn {...] ULiteralExpression (value = 0) [0] = 0 UReturnExpression [return count] = Nothing USimpleNameReferenceExpression (identifier = count) [count] = (var count = 0) - UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED + UastEmptyExpression [UastEmptyExpression] = Undetermined UPostfixExpression (operator = ++) [count++] = Undetermined USimpleNameReferenceExpression (identifier = count) [count] = Undetermined UPostfixExpression (operator = --) [number--] = Undetermined diff --git a/uast/uast-tests/java/Simple/EnumSwitchConditionalBreak.values.txt b/uast/uast-tests/java/Simple/EnumSwitchConditionalBreak.values.txt index 380f99421510..bb5900f762e1 100644 --- a/uast/uast-tests/java/Simple/EnumSwitchConditionalBreak.values.txt +++ b/uast/uast-tests/java/Simple/EnumSwitchConditionalBreak.values.txt @@ -32,7 +32,7 @@ UFile (package = ) [public final enum EnumSwitchConditionalBreak {...] UPostfixExpression (operator = ++) [counter++] = (var counter = 0) USimpleNameReferenceExpression (identifier = counter) [counter] = (var counter = 0) UBreakExpression (label = null) [break] = Nothing(break) - UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED + UastEmptyExpression [UastEmptyExpression] = Undetermined UPostfixExpression (operator = ++) [counter++] = (var counter = 0) USimpleNameReferenceExpression (identifier = counter) [counter] = (var counter = 0) USwitchClauseExpressionWithBody [else -> {...] = Undetermined diff --git a/uast/uast-tests/java/Simple/Labeled.values.txt b/uast/uast-tests/java/Simple/Labeled.values.txt index d4a8f817c70c..e0fa02bda527 100644 --- a/uast/uast-tests/java/Simple/Labeled.values.txt +++ b/uast/uast-tests/java/Simple/Labeled.values.txt @@ -20,6 +20,6 @@ UFile (package = ) [public class Labeled {...] USimpleNameReferenceExpression (identifier = first) [first] = (var first = 1) ULiteralExpression (value = 0) [0] = 0 UBreakExpression (label = labeled) [break@labeled] = Nothing(break) - UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED + UastEmptyExpression [UastEmptyExpression] = Undetermined UReturnExpression [return second] = Nothing USimpleNameReferenceExpression (identifier = second) [second] = (var second = 3) diff --git a/uast/uast-tests/java/Simple/LabeledOuter.values.txt b/uast/uast-tests/java/Simple/LabeledOuter.values.txt index b80ce313c03b..f9fba44b5ce0 100644 --- a/uast/uast-tests/java/Simple/LabeledOuter.values.txt +++ b/uast/uast-tests/java/Simple/LabeledOuter.values.txt @@ -29,7 +29,7 @@ UFile (package = ) [public class LabeledOuter {...] USimpleNameReferenceExpression (identifier = first) [first] = (var first = 1) ULiteralExpression (value = 0) [0] = 0 UBreakExpression (label = labeled) [break@labeled] = Nothing(break) - UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED + UastEmptyExpression [UastEmptyExpression] = Undetermined UBinaryExpression (operator = =) [second = 4] = 4 USimpleNameReferenceExpression (identifier = second) [second] = Undetermined ULiteralExpression (value = 4) [4] = 4 diff --git a/uast/uast-tests/java/Simple/WhileWithContinue.values.txt b/uast/uast-tests/java/Simple/WhileWithContinue.values.txt index e2c43a2a3a78..cd1869449442 100644 --- a/uast/uast-tests/java/Simple/WhileWithContinue.values.txt +++ b/uast/uast-tests/java/Simple/WhileWithContinue.values.txt @@ -24,7 +24,7 @@ UFile (package = ) [public class WhileWithContinue {...] USimpleNameReferenceExpression (identifier = first) [first] = (var first = 1) ULiteralExpression (value = 0) [0] = 0 UContinueExpression (label = null) [continue] = Nothing(continue) - UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED + UastEmptyExpression [UastEmptyExpression] = Undetermined UBinaryExpression (operator = =) [second = 4] = 4 USimpleNameReferenceExpression (identifier = second) [second] = Undetermined ULiteralExpression (value = 4) [4] = 4 @@ -52,7 +52,7 @@ UFile (package = ) [public class WhileWithContinue {...] USimpleNameReferenceExpression (identifier = first) [first] = (var first = Undetermined) ULiteralExpression (value = 0) [0] = 0 UContinueExpression (label = null) [continue] = Nothing(continue) - UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED + UastEmptyExpression [UastEmptyExpression] = Undetermined UBinaryExpression (operator = =) [second = 4] = 4 USimpleNameReferenceExpression (identifier = second) [second] = (var second = 3) ULiteralExpression (value = 4) [4] = 4 diff --git a/uast/uast-tests/java/Simple/WhileWithIncrement.values.txt b/uast/uast-tests/java/Simple/WhileWithIncrement.values.txt index 81689361becd..1a3b370a667c 100644 --- a/uast/uast-tests/java/Simple/WhileWithIncrement.values.txt +++ b/uast/uast-tests/java/Simple/WhileWithIncrement.values.txt @@ -17,6 +17,6 @@ UFile (package = ) [public class WhileWithIncrement {...] ULiteralExpression (value = 42) [42] = 42 ULiteralExpression (value = 0) [0] = 0 UBreakExpression (label = null) [break] = Nothing(break) - UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED + UastEmptyExpression [UastEmptyExpression] = Undetermined UReturnExpression [return i] = Nothing USimpleNameReferenceExpression (identifier = i) [i] = (var i = Undetermined) diff --git a/uast/uast-tests/java/Simple/WhileWithReturn.values.txt b/uast/uast-tests/java/Simple/WhileWithReturn.values.txt index af54a54ae2ee..1b13429edf66 100644 --- a/uast/uast-tests/java/Simple/WhileWithReturn.values.txt +++ b/uast/uast-tests/java/Simple/WhileWithReturn.values.txt @@ -22,6 +22,6 @@ UFile (package = ) [public class WhileWithReturn {...] ULiteralExpression (value = 0) [0] = 0 UReturnExpression [return second] = Nothing USimpleNameReferenceExpression (identifier = second) [second] = (var second = 3) - UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED + UastEmptyExpression [UastEmptyExpression] = Undetermined UReturnExpression [return second] = Nothing USimpleNameReferenceExpression (identifier = second) [second] = Undetermined diff --git a/uast/uast-tests/test/org/jetbrains/uast/test/java/AbstractJavaRenderLogTest.kt b/uast/uast-tests/test/org/jetbrains/uast/test/java/AbstractJavaRenderLogTest.kt index dba340f8a63d..0e64c7a2d4de 100644 --- a/uast/uast-tests/test/org/jetbrains/uast/test/java/AbstractJavaRenderLogTest.kt +++ b/uast/uast-tests/test/org/jetbrains/uast/test/java/AbstractJavaRenderLogTest.kt @@ -53,7 +53,6 @@ abstract class AbstractJavaRenderLogTest : AbstractJavaUastTest(), RenderLogTest private val parentStack = Stack() override fun visitElement(node: UElement): Boolean { - if (node is UastEmptyExpression) return true // skip UastEmptyExpression they do not have parents (but why?) val parent = node.uastParent if (parent == null) { @@ -74,7 +73,6 @@ abstract class AbstractJavaRenderLogTest : AbstractJavaUastTest(), RenderLogTest } override fun afterVisitElement(node: UElement) { - if (node is UastEmptyExpression) return // skip UastEmptyExpression they do not have parents (but why?) super.afterVisitElement(node) parentStack.pop() }