Uast: less allocations in getting UastLanguagePlugin

This commit is contained in:
peter
2018-05-21 12:55:32 +03:00
committed by Nicolay Mitropolsky
parent 7dc7ca86c9
commit 2f239d6e22
4 changed files with 5 additions and 90 deletions
@@ -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 {
@@ -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<UastLanguagePlugin> =
ExtensionPointName.create<UastLanguagePlugin>("org.jetbrains.uast.uastLanguagePlugin")
private val extensionArray: Array<UastLanguagePlugin> by lazy(LazyThreadSafetyMode.PUBLICATION) { extensionPointName.extensions }
fun getInstances(): Collection<UastLanguagePlugin> {
val rootArea = Extensions.getRootArea()
if (!rootArea.hasExtensionPoint(extensionPointName.name)) return listOf()
return rootArea.getExtensionPoint(extensionPointName).extensions.toList()
}
fun getInstances(): Collection<UastLanguagePlugin> = extensionArray.toList()
fun byLanguage(language: Language): UastLanguagePlugin? = extensionArray.firstOrNull { it.language === language }
}
data class ResolvedMethod(val call: UCallExpression, val method: PsiMethod)
@@ -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"
@@ -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 <T> UElement.findElementByText(refText: String, cls: Class<T>): T {
val matchingElements = mutableListOf<T>()