diff --git a/java/java-analysis-api/src/com/intellij/uast/UastMetaLanguage.java b/java/java-analysis-api/src/com/intellij/uast/UastMetaLanguage.java index 2592398d7bfe..ccb88532c610 100644 --- a/java/java-analysis-api/src/com/intellij/uast/UastMetaLanguage.java +++ b/java/java-analysis-api/src/com/intellij/uast/UastMetaLanguage.java @@ -12,35 +12,43 @@ import java.util.HashSet; import java.util.Set; public final class UastMetaLanguage extends MetaLanguage { - private final Set myLanguages; + protected static final class Holder { + private static final Set myLanguages; + + static { + Collection languagePlugins = UastLanguagePlugin.Companion.getInstances(); + myLanguages = new HashSet<>(languagePlugins.size()); + initLanguages(languagePlugins); + + UastLanguagePlugin.Companion.getExtensionPointName().addChangeListener(() -> { + myLanguages.clear(); + initLanguages(UastLanguagePlugin.Companion.getInstances()); + }, null); + } + + private static void initLanguages(Collection languagePlugins) { + for (UastLanguagePlugin plugin : languagePlugins) { + myLanguages.add(plugin.getLanguage()); + } + } + + public static Set getLanguages() { + return myLanguages; + } + } private UastMetaLanguage() { super("UAST"); - - Collection languagePlugins = UastLanguagePlugin.Companion.getInstances(); - myLanguages = new HashSet<>(languagePlugins.size()); - initLanguages(languagePlugins); - - UastLanguagePlugin.Companion.getExtensionPointName().addChangeListener(() -> { - myLanguages.clear(); - initLanguages(UastLanguagePlugin.Companion.getInstances()); - }, null); - } - - private void initLanguages(Collection languagePlugins) { - for (UastLanguagePlugin plugin : languagePlugins) { - myLanguages.add(plugin.getLanguage()); - } } @Override public boolean matchesLanguage(@NotNull Language language) { - return myLanguages.contains(language); + return Holder.myLanguages.contains(language); } @NotNull @Override public Collection getMatchingLanguages() { - return Collections.unmodifiableSet(myLanguages); + return Collections.unmodifiableSet(Holder.myLanguages); } } diff --git a/java/java-analysis-api/src/com/intellij/uast/UastModificationTracker.kt b/java/java-analysis-api/src/com/intellij/uast/UastModificationTracker.kt index 7c87847993ae..4f4a80de1807 100644 --- a/java/java-analysis-api/src/com/intellij/uast/UastModificationTracker.kt +++ b/java/java-analysis-api/src/com/intellij/uast/UastModificationTracker.kt @@ -1,7 +1,6 @@ // 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. package com.intellij.uast -import com.intellij.lang.Language import com.intellij.openapi.Disposable import com.intellij.openapi.components.Service import com.intellij.openapi.project.Project @@ -39,8 +38,8 @@ class UastModificationTracker internal constructor(val project: Project) : Modif } @JvmStatic - private fun getLanguageTrackers(project: Project) : List { - val languages = Language.findInstance(UastMetaLanguage::class.java).matchingLanguages + private fun getLanguageTrackers(project: Project): List { + val languages = UastMetaLanguage.Holder.getLanguages() val psiManager = PsiManager.getInstance(project) return languages.map { psiManager.modificationTracker.forLanguage(it) } }