Java-Uast: lazy fix for some forgotten classes

This commit is contained in:
Nicolay Mitropolsky
2017-10-09 22:10:48 +03:00
parent fd2d05f3bd
commit 56a12a5323
9 changed files with 30 additions and 18 deletions
@@ -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)
@@ -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<UDeclaration>().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<UClass, PsiClass>(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<UAnonymousClass, PsiAnonymousClass>(psi)
override fun getSuperClass(): UClass? = super<AbstractJavaUClass>.getSuperClass()
@@ -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<UClassInitializer, PsiClassInitializer>(psi)
override val uastAnchor: UElement?
@@ -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) } }
@@ -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<UMethod, PsiMethod>(psi)
override val uastBody by lz {
@@ -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
@@ -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<UDeclaration>
internal set
@@ -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<UAnnotation>
@@ -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()