From b6c18fc49ac511d29a31707c99b336531a8266a2 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 21 Mar 2019 19:22:37 +0100 Subject: [PATCH] don't call expensive psi.getProject() on every attempt to get UAST element --- .../src/org/jetbrains/uast/UastContext.kt | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/uast/uast-common/src/org/jetbrains/uast/UastContext.kt b/uast/uast-common/src/org/jetbrains/uast/UastContext.kt index b311b140f3c8..2db548dff5d4 100644 --- a/uast/uast-common/src/org/jetbrains/uast/UastContext.kt +++ b/uast/uast-common/src/org/jetbrains/uast/UastContext.kt @@ -22,7 +22,7 @@ import com.intellij.openapi.util.Key import com.intellij.psi.* import com.intellij.reference.SoftReference -val CACHED_UELEMENT_KEY: Key> = Key.create>("org.jetbrains.uast.cachedElement") +internal val CACHED_UELEMENT_KEY: Key> = Key.create>("org.jetbrains.uast.cachedElement") /** * Manages the UAST to PSI conversion. @@ -60,18 +60,8 @@ class UastContext(val project: Project) : UastLanguagePlugin { return findPlugin(element)?.convertElement(element, parent, requiredType) } - override fun convertElementWithParent(element: PsiElement, requiredType: Class?): UElement? { - if (element is PsiWhiteSpace) { - return null - } - - val cachedElement = element.getUserData(CACHED_UELEMENT_KEY)?.get() - if (cachedElement != null) { - return if (requiredType == null || requiredType.isInstance(cachedElement)) cachedElement else null - } - - return findPlugin(element)?.convertElementWithParent(element, requiredType) - } + override fun convertElementWithParent(element: PsiElement, requiredType: Class?): UElement? = + doConvertElementWithParent(element, requiredType) override fun getMethodCallExpression( element: PsiElement, @@ -106,18 +96,29 @@ class UastContext(val project: Project) : UastLanguagePlugin { findPlugin(element)?.convertToAlternatives(element, requiredTypes) ?: emptySequence() } +private fun doConvertElementWithParent(element: PsiElement, requiredType: Class?): UElement? { + if (element is PsiWhiteSpace) { + return null + } + + val cachedElement = element.getUserData(CACHED_UELEMENT_KEY)?.get() + if (cachedElement != null) { + return if (requiredType == null || requiredType.isInstance(cachedElement)) cachedElement else null + } + + return UastLanguagePlugin.byLanguage(element.language)?.convertElementWithParent(element, requiredType) +} + /** * Converts the element along with its parents to UAST. */ -fun PsiElement?.toUElement(): UElement? = - this?.let { ServiceManager.getService(project, UastContext::class.java).convertElementWithParent(this, null) } +fun PsiElement?.toUElement(): UElement? = this?.let { doConvertElementWithParent(this, null) } /** * Converts the element to an UAST element of the given type. Returns null if the PSI element type does not correspond * to the given UAST element type. */ -fun PsiElement?.toUElement(cls: Class): T? = - this?.let { ServiceManager.getService(project, UastContext::class.java).convertElementWithParent(this, cls) as T? } +fun PsiElement?.toUElement(cls: Class): T? = this?.let { doConvertElementWithParent(this, cls) as T? } fun PsiElement?.toUElementOfExpectedTypes(vararg clss: Class): T? = this?.let {