mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Uast: less allocations in getting UastLanguagePlugin
This commit is contained in:
committed by
Nicolay Mitropolsky
parent
7dc7ca86c9
commit
2f239d6e22
@@ -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)
|
||||
|
||||
-66
@@ -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>()
|
||||
|
||||
Reference in New Issue
Block a user