UastMetaLanguage - do not use static init

GitOrigin-RevId: 6573f40b8c9091977178b5b9efcacc0b07dc0084
This commit is contained in:
Vladimir Krivosheev
2024-06-14 13:26:14 +02:00
committed by intellij-monorepo-bot
parent 6334491a93
commit cf88750587
6 changed files with 29 additions and 52 deletions

View File

@@ -1,43 +1,21 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
@file:Suppress("ReplaceJavaStaticMethodWithKotlinAnalog")
package com.intellij.uast
import com.intellij.java.analysis.JavaAnalysisBundle
import com.intellij.lang.Language
import com.intellij.lang.MetaLanguage
import com.intellij.util.containers.ContainerUtil
import org.jetbrains.annotations.Unmodifiable
import org.jetbrains.uast.UastLanguagePlugin
import org.jetbrains.uast.UastLanguagePlugin.Companion.extensionPointName
import org.jetbrains.uast.UastLanguagePlugin.Companion.getInstances
import kotlin.concurrent.Volatile
import org.jetbrains.uast.UastLanguagePlugin.Companion.EP
internal fun getUastMetaLanguages(): Set<Language> {
return EP.computeIfAbsent(UastMetaLanguage::class.java) { EP.lazySequence().mapTo(HashSet()) { it.language } }
}
class UastMetaLanguage private constructor() : MetaLanguage("UAST") {
internal object Holder {
@Volatile
var myLanguages: @Unmodifiable MutableSet<Language> = initLanguages()
override fun matchesLanguage(language: Language): Boolean = getUastMetaLanguages().contains(language)
init {
extensionPointName.addChangeListener(
{ myLanguages = initLanguages() }, null)
}
override fun getMatchingLanguages(): Collection<Language> = getUastMetaLanguages()
private fun initLanguages(): @Unmodifiable MutableSet<Language> {
return java.util.Set.of(*ContainerUtil.map2Array(getInstances(), EMPTY_ARRAY) { plugin: UastLanguagePlugin -> plugin.language })
}
val languages: Set<Language>
get() = myLanguages
}
override fun matchesLanguage(language: Language): Boolean {
return Holder.myLanguages.contains(language)
}
override fun getMatchingLanguages(): Collection<Language> {
return Holder.myLanguages
}
override fun getDisplayName(): String {
return JavaAnalysisBundle.message("uast.language.display.name")
}
}
override fun getDisplayName(): String = JavaAnalysisBundle.message("uast.language.display.name")
}

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.uast
import com.intellij.openapi.Disposable
@@ -9,13 +9,13 @@ import com.intellij.psi.PsiManager
import org.jetbrains.uast.UastLanguagePlugin
@Service(Service.Level.PROJECT)
class UastModificationTracker internal constructor(val project: Project) : ModificationTracker, Disposable {
class UastModificationTracker internal constructor(private val project: Project) : ModificationTracker, Disposable {
private var languageTrackers: List<ModificationTracker>
init {
languageTrackers = getLanguageTrackers(project)
UastLanguagePlugin.extensionPointName.addChangeListener(Runnable {
UastLanguagePlugin.EP.addChangeListener(Runnable {
languageTrackers = getLanguageTrackers(project)
}, this)
}
@@ -34,11 +34,9 @@ class UastModificationTracker internal constructor(val project: Project) : Modif
return project.getService(UastModificationTracker::class.java)
}
@JvmStatic
private fun getLanguageTrackers(project: Project): List<ModificationTracker> {
val languages = UastMetaLanguage.Holder.getLanguages()
val psiManager = PsiManager.getInstance(project)
return languages.map { psiManager.modificationTracker.forLanguage(it) }
return getUastMetaLanguages().map { psiManager.modificationTracker.forLanguage(it) }
}
}
}

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.fir.uast.test.env.kotlin
@@ -46,9 +46,9 @@ abstract class AbstractFirUastTest : KotlinLightCodeInsightFixtureTestCase() {
private fun registerExtensionPointAndServiceIfNeeded() {
val area = Extensions.getRootArea()
CoreApplicationEnvironment.registerExtensionPoint(
area,
UastLanguagePlugin.extensionPointName,
UastLanguagePlugin::class.java
area,
UastLanguagePlugin.EP,
UastLanguagePlugin::class.java
)
area.getExtensionPoint(UEvaluatorExtension.EXTENSION_POINT_NAME).registerExtension(KotlinEvaluatorExtension(), project)
val service = FirCliKotlinUastResolveProviderService()

View File

@@ -125,8 +125,8 @@ abstract class AbstractKotlinUastTest : TestCase(),
private fun initializeCoreEnvironment() {
CoreApplicationEnvironment.registerApplicationExtensionPoint(
UastLanguagePlugin.extensionPointName,
UastLanguagePlugin::class.java,
UastLanguagePlugin.EP,
UastLanguagePlugin::class.java,
)
CoreApplicationEnvironment.registerApplicationExtensionPoint(
@@ -140,7 +140,7 @@ abstract class AbstractKotlinUastTest : TestCase(),
)
project.registerService(UastContext::class.java)
Extensions.getRootArea().getExtensionPoint(UastLanguagePlugin.extensionPointName)
Extensions.getRootArea().getExtensionPoint(UastLanguagePlugin.EP)
.registerExtension(JavaUastLanguagePlugin())
AnalysisHandlerExtension.registerExtension(
@@ -151,7 +151,7 @@ abstract class AbstractKotlinUastTest : TestCase(),
private fun initializeKotlinEnvironment() {
val area = Extensions.getRootArea()
area.getExtensionPoint(UastLanguagePlugin.extensionPointName)
area.getExtensionPoint(UastLanguagePlugin.EP)
.registerExtension(KotlinUastLanguagePlugin(), project)
area.getExtensionPoint(UEvaluatorExtension.EXTENSION_POINT_NAME)
.registerExtension(KotlinEvaluatorExtension(), project)

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.uast
import com.intellij.ide.plugins.DynamicPluginListener
@@ -111,7 +111,7 @@ object UastFacade : UastLanguagePlugin {
clearCachedPlugin()
}
})
UastLanguagePlugin.extensionPointName.addChangeListener({ exposedListeners.forEach(UastPluginListener::onPluginsChanged) }, null)
UastLanguagePlugin.EP.addChangeListener({ exposedListeners.forEach(UastPluginListener::onPluginsChanged) }, null)
}
override fun getPossiblePsiSourceTypes(vararg uastTypes: Class<out UElement>): ClassSet<PsiElement> =

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.uast
import com.intellij.lang.Language
@@ -20,9 +20,10 @@ import org.jetbrains.uast.util.classSetOf
@JvmDefaultWithCompatibility
interface UastLanguagePlugin {
companion object {
val extensionPointName: ExtensionPointName<UastLanguagePlugin> = ExtensionPointName("org.jetbrains.uast.uastLanguagePlugin")
@JvmField
val EP: ExtensionPointName<UastLanguagePlugin> = ExtensionPointName("org.jetbrains.uast.uastLanguagePlugin")
fun getInstances(): Collection<UastLanguagePlugin> = extensionPointName.extensionList
fun getInstances(): Collection<UastLanguagePlugin> = EP.extensionList
fun byLanguage(language: Language): UastLanguagePlugin? = UastFacade.findPlugin(language)
}