From 2f239d6e2293856e44aff96baf570f044fe97284 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 21 May 2018 12:55:32 +0300 Subject: [PATCH] Uast: less allocations in getting `UastLanguagePlugin` --- .../src/org/jetbrains/uast/UastContext.kt | 2 +- .../org/jetbrains/uast/UastLanguagePlugin.kt | 10 ++- .../env/AbstractTestWithCoreEnvironment.kt | 66 ------------------- .../uast/test/env/AbstractUastTest.kt | 17 ----- 4 files changed, 5 insertions(+), 90 deletions(-) diff --git a/uast/uast-common/src/org/jetbrains/uast/UastContext.kt b/uast/uast-common/src/org/jetbrains/uast/UastContext.kt index 24e53e733e0f..2fb0953007d4 100644 --- a/uast/uast-common/src/org/jetbrains/uast/UastContext.kt +++ b/uast/uast-common/src/org/jetbrains/uast/UastContext.kt @@ -93,7 +93,7 @@ class UastContext(val project: Project) : UastLanguagePlugin { override fun isExpressionValueUsed(element: UExpression): Boolean { val language = element.getLanguage() - return (languagePlugins.firstOrNull { it.language == language })?.isExpressionValueUsed(element) ?: false + return UastLanguagePlugin.byLanguage(language)?.isExpressionValueUsed(element) ?: false } private tailrec fun UElement.getLanguage(): Language { diff --git a/uast/uast-common/src/org/jetbrains/uast/UastLanguagePlugin.kt b/uast/uast-common/src/org/jetbrains/uast/UastLanguagePlugin.kt index 19aac16396e4..30a0c7509ec9 100644 --- a/uast/uast-common/src/org/jetbrains/uast/UastLanguagePlugin.kt +++ b/uast/uast-common/src/org/jetbrains/uast/UastLanguagePlugin.kt @@ -17,19 +17,17 @@ package org.jetbrains.uast import com.intellij.lang.Language import com.intellij.openapi.extensions.ExtensionPointName -import com.intellij.openapi.extensions.Extensions import com.intellij.psi.* interface UastLanguagePlugin { companion object { val extensionPointName: ExtensionPointName = ExtensionPointName.create("org.jetbrains.uast.uastLanguagePlugin") + private val extensionArray: Array by lazy(LazyThreadSafetyMode.PUBLICATION) { extensionPointName.extensions } - fun getInstances(): Collection { - val rootArea = Extensions.getRootArea() - if (!rootArea.hasExtensionPoint(extensionPointName.name)) return listOf() - return rootArea.getExtensionPoint(extensionPointName).extensions.toList() - } + fun getInstances(): Collection = extensionArray.toList() + + fun byLanguage(language: Language): UastLanguagePlugin? = extensionArray.firstOrNull { it.language === language } } data class ResolvedMethod(val call: UCallExpression, val method: PsiMethod) diff --git a/uast/uast-tests/src/org/jetbrains/uast/test/env/AbstractTestWithCoreEnvironment.kt b/uast/uast-tests/src/org/jetbrains/uast/test/env/AbstractTestWithCoreEnvironment.kt index c655a161c812..9ba256780742 100644 --- a/uast/uast-tests/src/org/jetbrains/uast/test/env/AbstractTestWithCoreEnvironment.kt +++ b/uast/uast-tests/src/org/jetbrains/uast/test/env/AbstractTestWithCoreEnvironment.kt @@ -15,77 +15,11 @@ */ package org.jetbrains.uast.test.env -import com.intellij.core.CoreApplicationEnvironment -import com.intellij.mock.MockProject -import com.intellij.openapi.components.ServiceManager -import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.util.text.StringUtil -import com.intellij.psi.PsiManager import com.intellij.rt.execution.junit.FileComparisonFailure import junit.framework.TestCase -import org.jetbrains.uast.UastContext -import org.jetbrains.uast.UastLanguagePlugin -import org.jetbrains.uast.evaluation.UEvaluatorExtension -import org.jetbrains.uast.java.JavaUastLanguagePlugin import java.io.File -abstract class AbstractTestWithCoreEnvironment : TestCase() { - private var myEnvironment: AbstractCoreEnvironment? = null - - protected val environment: AbstractCoreEnvironment - get() = myEnvironment!! - - protected lateinit var project: MockProject - - protected val uastContext: UastContext by lazy { - ServiceManager.getService(project, UastContext::class.java) - } - - protected val psiManager: PsiManager by lazy { - PsiManager.getInstance(project) - } - - override fun tearDown() { - disposeEnvironment() - } - - protected abstract fun createEnvironment(source: File): AbstractCoreEnvironment - - protected fun initializeEnvironment(source: File) { - if (myEnvironment != null) { - error("Environment is already initialized") - } - myEnvironment = createEnvironment(source) - project = environment.project - - CoreApplicationEnvironment.registerExtensionPoint( - Extensions.getRootArea(), - UastLanguagePlugin.extensionPointName, - UastLanguagePlugin::class.java) - - CoreApplicationEnvironment.registerExtensionPoint( - Extensions.getRootArea(), - UEvaluatorExtension.EXTENSION_POINT_NAME, - UEvaluatorExtension::class.java) - - project.registerService(UastContext::class.java, UastContext::class.java) - - registerUastLanguagePlugins() - } - - private fun registerUastLanguagePlugins() { - val area = Extensions.getRootArea() - - area.getExtensionPoint(UastLanguagePlugin.extensionPointName) - .registerExtension(JavaUastLanguagePlugin()) - } - - protected fun disposeEnvironment() { - myEnvironment?.dispose() - myEnvironment = null - } -} - private fun String.trimTrailingWhitespacesAndAddNewlineAtEOF(): String = this.split('\n').map(String::trimEnd).joinToString(separator = "\n").let { result -> if (result.endsWith("\n")) result else result + "\n" diff --git a/uast/uast-tests/src/org/jetbrains/uast/test/env/AbstractUastTest.kt b/uast/uast-tests/src/org/jetbrains/uast/test/env/AbstractUastTest.kt index 9945fe5eb31c..26584b864cac 100644 --- a/uast/uast-tests/src/org/jetbrains/uast/test/env/AbstractUastTest.kt +++ b/uast/uast-tests/src/org/jetbrains/uast/test/env/AbstractUastTest.kt @@ -25,7 +25,6 @@ import org.jetbrains.uast.UFile import org.jetbrains.uast.UastContext import org.jetbrains.uast.toUElementOfType import org.jetbrains.uast.visitor.UastVisitor -import java.io.File abstract class AbstractUastFixtureTest : LightCodeInsightFixtureTestCase() { protected val uastContext: UastContext by lazy { @@ -44,22 +43,6 @@ abstract class AbstractUastFixtureTest : LightCodeInsightFixtureTestCase() { } } -abstract class AbstractUastTest : AbstractTestWithCoreEnvironment() { - protected companion object { - val TEST_DATA_DIR = File("testData") - } - - abstract fun getVirtualFile(testName: String): VirtualFile - abstract fun check(testName: String, file: UFile) - - fun doTest(testName: String, checkCallback: (String, UFile) -> Unit = { testName, file -> check(testName, file) }) { - val virtualFile = getVirtualFile(testName) - - val psiFile = psiManager.findFile(virtualFile) ?: error("Can't get psi file for $testName") - val uFile = uastContext.convertElementWithParent(psiFile, null) ?: error("Can't get UFile for $testName") - checkCallback(testName, uFile as UFile) - } -} fun UElement.findElementByText(refText: String, cls: Class): T { val matchingElements = mutableListOf()