From 56a12a5323aa432fb4699f4f0c8a3097c0369430 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Mon, 9 Oct 2017 20:10:20 +0300 Subject: [PATCH] Java-Uast: lazy fix for some forgotten classes --- .../jetbrains/uast/java/JavaUastLanguagePlugin.kt | 2 +- .../jetbrains/uast/java/declarations/JavaUClass.kt | 13 +++++++++---- .../uast/java/declarations/JavaUClassInitializer.kt | 4 ++-- .../uast/java/declarations/JavaUImportStatement.kt | 4 ++-- .../jetbrains/uast/java/declarations/JavaUMethod.kt | 4 ++-- .../JavaUCompositeQualifiedExpression.kt | 6 ++++-- .../java/expressions/JavaUDeclarationsExpression.kt | 4 ++-- .../uast/java/expressions/UnknownJavaExpression.kt | 4 ++-- .../uast/test/java/JavaUastPerformanceTest.kt | 7 ++++++- 9 files changed, 30 insertions(+), 18 deletions(-) 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 ba529a8ac6bf..5da1f13f37ed 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt @@ -223,7 +223,7 @@ internal object JavaConverter { requiredType.isAssignableFrom(UQualifiedReferenceExpression::class.java) || requiredType.isAssignableFrom(UCallExpression::class.java)) { val expr = JavaUCompositeQualifiedExpression(el, givenParent).apply { - receiver = convertOrEmpty(el.methodExpression.qualifierExpression!!, this) + receiverInitializer = { convertOrEmpty(el.methodExpression.qualifierExpression!!, this) } selector = JavaUCallExpression(el, this) } if (requiredType?.isAssignableFrom(UCallExpression::class.java) == true) diff --git a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClass.kt b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClass.kt index 8e29e2be383a..6c28e84fe0b8 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClass.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClass.kt @@ -23,7 +23,12 @@ import com.intellij.psi.PsiJavaCodeReferenceElement import org.jetbrains.uast.* import org.jetbrains.uast.java.internal.JavaUElementWithComments -abstract class AbstractJavaUClass : UClass, JavaUElementWithComments { +abstract class AbstractJavaUClass(givenParent: UElement?) : JavaAbstractUElement(givenParent), UClass, JavaUElementWithComments { + + @Suppress("unused") // Used in Kotlin, to be removed in 2018.1 + @Deprecated("use AbstractJavaUClass(givenParent)", ReplaceWith("AbstractJavaUClass(givenParent)")) + constructor() : this(null) + override val uastDeclarations by lz { mutableListOf().apply { addAll(fields) @@ -55,7 +60,7 @@ abstract class AbstractJavaUClass : UClass, JavaUElementWithComments { } class JavaUClass private constructor(psi: PsiClass, override val uastParent: UElement?) : - AbstractJavaUClass(), PsiClass by psi { + AbstractJavaUClass(uastParent), PsiClass by psi { override val psi = unwrap(psi) override fun getSuperClass(): UClass? = super.getSuperClass() @@ -76,8 +81,8 @@ class JavaUClass private constructor(psi: PsiClass, override val uastParent: UEl class JavaUAnonymousClass( psi: PsiAnonymousClass, - override val uastParent: UElement? -) : AbstractJavaUClass(), UAnonymousClass, PsiAnonymousClass by psi { + uastParent: UElement? +) : AbstractJavaUClass(uastParent), UAnonymousClass, PsiAnonymousClass by psi { override val psi: PsiAnonymousClass = unwrap(psi) override fun getSuperClass(): UClass? = super.getSuperClass() 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 ae554552453d..6d90db2b308d 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 @@ -22,8 +22,8 @@ import org.jetbrains.uast.java.internal.JavaUElementWithComments class JavaUClassInitializer( psi: PsiClassInitializer, - override val uastParent: UElement? -) : UClassInitializer, JavaUElementWithComments, PsiClassInitializer by psi { + uastParent: UElement? +) : JavaAbstractUElement(uastParent), UClassInitializer, JavaUElementWithComments, PsiClassInitializer by psi { override val psi = unwrap(psi) override val uastAnchor: UElement? diff --git a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUImportStatement.kt b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUImportStatement.kt index 02392e6b76ce..9264d8cef875 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUImportStatement.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUImportStatement.kt @@ -21,8 +21,8 @@ import org.jetbrains.uast.UImportStatement class JavaUImportStatement( override val psi: PsiImportStatementBase, - override val uastParent: UElement? -) : UImportStatement { + uastParent: UElement? +) : JavaAbstractUElement(uastParent), UImportStatement { override val isOnDemand: Boolean get() = psi.isOnDemand override val importReference by lz { psi.importReference?.let { JavaDumbUElement(it, this, it.qualifiedName) } } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUMethod.kt b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUMethod.kt index 535e7021a3f2..387fe592a7e8 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUMethod.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/declarations/JavaUMethod.kt @@ -24,8 +24,8 @@ import org.jetbrains.uast.java.internal.JavaUElementWithComments open class JavaUMethod( psi: PsiMethod, - override val uastParent: UElement? -) : UMethod, JavaUElementWithComments, PsiMethod by psi { + uastParent: UElement? +) : JavaAbstractUElement(uastParent), UMethod, JavaUElementWithComments, PsiMethod by psi { override val psi = unwrap(psi) override val uastBody by lz { 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 6622b801af12..467322101f42 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 @@ -23,8 +23,10 @@ class JavaUCompositeQualifiedExpression( override val psi: PsiElement, givenParent: UElement? ) : JavaAbstractUExpression(givenParent), UQualifiedReferenceExpression { - override lateinit var receiver: UExpression - internal set + + lateinit internal var receiverInitializer: () -> UExpression + + override val receiver: UExpression by lazy { receiverInitializer() } override lateinit var selector: UExpression internal set diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUDeclarationsExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUDeclarationsExpression.kt index 346487ab67ef..8163f333527f 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUDeclarationsExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUDeclarationsExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.UDeclarationsExpression import org.jetbrains.uast.UElement class JavaUDeclarationsExpression( - override val uastParent: UElement? -) : UDeclarationsExpression { + uastParent: UElement? +) : JavaAbstractUElement(uastParent), UDeclarationsExpression { override lateinit var declarations: List internal set diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/UnknownJavaExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/UnknownJavaExpression.kt index 19278398b01d..f5dffd4d8de6 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/UnknownJavaExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/UnknownJavaExpression.kt @@ -22,8 +22,8 @@ import org.jetbrains.uast.UExpression class UnknownJavaExpression( override val psi: PsiElement, - override val uastParent: UElement? -) : UExpression { + uastParent: UElement? +) : JavaAbstractUElement(uastParent), UExpression { override fun asLogString() = "[!] " + UnknownJavaExpression::class.java.simpleName + " ($psi)" override val annotations: List 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 index d0db58e87fd6..072bac1f17c8 100644 --- a/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastPerformanceTest.kt +++ b/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastPerformanceTest.kt @@ -6,6 +6,7 @@ import com.intellij.psi.PsiElementVisitor import com.intellij.testFramework.PlatformTestUtil import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase import junit.framework.TestCase +import org.jetbrains.uast.UQualifiedReferenceExpression import org.jetbrains.uast.toUElement import org.junit.Test @@ -21,6 +22,10 @@ class JavaUastPerformanceTest : LightCodeInsightFixtureTestCase() { identityChecksum = 31 * identityChecksum + System.identityHashCode(uElement) } + when (uElement) { + is UQualifiedReferenceExpression -> uElement.receiver // force lazy evaluation + } + element.acceptChildren(this) } } @@ -38,7 +43,7 @@ class JavaUastPerformanceTest : LightCodeInsightFixtureTestCase() { } """.trimIndent()) val nonCachedWalk = EachPsiToUastWalker().apply { - PlatformTestUtil.startPerformanceTest("convert each element to uast first time", 4000) { + PlatformTestUtil.startPerformanceTest("convert each element to uast first time", 2000) { clazz.accept(this) TestCase.assertEquals(expectedUElementsCount, totalCount) }.attempts(1).assertTiming()