From 7f7388619f0401180653b724c171c3772d7a258b Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 7 Mar 2018 18:16:36 +0300 Subject: [PATCH] platform: support several primary IDE languages (IDEA-CR-30098) --- .../IntelliJIdeaLanguageCustomization.java | 9 +++++++-- .../lang/IdeLanguageCustomization.java | 19 ++++++++++++------- .../navigation/GotoClassContributor.java | 2 +- .../codeStyle/CodeStyleSettingsProvider.java | 6 ++++-- .../LanguageCodeStyleSettingsProvider.java | 5 +++-- .../actions/GotoClassPresentationUpdater.kt | 11 +++++++---- .../python/PyCharmLanguageCustomization.java | 9 +++++++-- 7 files changed, 41 insertions(+), 20 deletions(-) diff --git a/java/idea-ui/src/com/intellij/ide/java/IntelliJIdeaLanguageCustomization.java b/java/idea-ui/src/com/intellij/ide/java/IntelliJIdeaLanguageCustomization.java index ec084f15a3f2..bcada91e011d 100644 --- a/java/idea-ui/src/com/intellij/ide/java/IntelliJIdeaLanguageCustomization.java +++ b/java/idea-ui/src/com/intellij/ide/java/IntelliJIdeaLanguageCustomization.java @@ -4,10 +4,15 @@ package com.intellij.ide.java; import com.intellij.lang.IdeLanguageCustomization; import com.intellij.lang.Language; import com.intellij.lang.java.JavaLanguage; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; public class IntelliJIdeaLanguageCustomization extends IdeLanguageCustomization { + @NotNull @Override - public Language getMainIdeLanguage() { - return JavaLanguage.INSTANCE; + public List getPrimaryIdeLanguages() { + return Collections.singletonList(JavaLanguage.INSTANCE); } } diff --git a/platform/lang-api/src/com/intellij/lang/IdeLanguageCustomization.java b/platform/lang-api/src/com/intellij/lang/IdeLanguageCustomization.java index 79fc5d7249f4..3a0d87513c96 100644 --- a/platform/lang-api/src/com/intellij/lang/IdeLanguageCustomization.java +++ b/platform/lang-api/src/com/intellij/lang/IdeLanguageCustomization.java @@ -2,22 +2,27 @@ package com.intellij.lang; import com.intellij.openapi.components.ServiceManager; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; /** - * Override this service in your IDE to set which language is considered as the main language. It isn't supposed to be overridden in plugins. + * Override this service in your IDE to set which languages are considered as the primary languages. It isn't supposed to be overridden in plugins. */ +@ApiStatus.Experimental public class IdeLanguageCustomization { public static IdeLanguageCustomization getInstance() { return ServiceManager.getService(IdeLanguageCustomization.class); } /** - * Returns the main language for which the IDE is supposed to be used or {@code null} if there is no single main language. This method is - * used to customize IDE's UI, e.g. to move settings pages related to the main language to the top. + * Returns the primary languages for which the IDE is supposed to be used. If there are several primary languages add them to the resulting list + * in order of importance. This method is used to customize IDE's UI, e.g. to move settings pages related to a primary language to the top. */ - @Nullable - public Language getMainIdeLanguage() { - return null; + @NotNull + public List getPrimaryIdeLanguages() { + return Collections.emptyList(); } } diff --git a/platform/lang-api/src/com/intellij/navigation/GotoClassContributor.java b/platform/lang-api/src/com/intellij/navigation/GotoClassContributor.java index a1cf059c1d9f..81912fffaaae 100644 --- a/platform/lang-api/src/com/intellij/navigation/GotoClassContributor.java +++ b/platform/lang-api/src/com/intellij/navigation/GotoClassContributor.java @@ -43,7 +43,7 @@ public interface GotoClassContributor extends ChooseByNameContributor { } /** - * If the language returned by this method is {@link IdeLanguageCustomization#getMainIdeLanguage() the main IDE language} the result of + * If the language returned by this method is one of {@link IdeLanguageCustomization#getPrimaryIdeLanguages() the primary IDE languages} the result of * {@link #getElementKind()} will be used to name `Navigate | Class' action and in 'Go to Class' popup. * @return the language to which items returned by this contributor belong */ diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsProvider.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsProvider.java index 368ca2e97a9e..c8e02db2670b 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsProvider.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsProvider.java @@ -22,6 +22,8 @@ import com.intellij.openapi.extensions.ExtensionPointName; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + /** * @author peter */ @@ -54,8 +56,8 @@ public abstract class CodeStyleSettingsProvider { } public DisplayPriority getPriority() { - Language mainIdeLanguage = IdeLanguageCustomization.getInstance().getMainIdeLanguage(); - return mainIdeLanguage != null && mainIdeLanguage.is(getLanguage()) ? DisplayPriority.KEY_LANGUAGE_SETTINGS : DisplayPriority.LANGUAGE_SETTINGS; + List primaryIdeLanguages = IdeLanguageCustomization.getInstance().getPrimaryIdeLanguages(); + return primaryIdeLanguages.contains(getLanguage()) ? DisplayPriority.KEY_LANGUAGE_SETTINGS : DisplayPriority.LANGUAGE_SETTINGS; } /** diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java b/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java index b32cd9b8eafe..4e3325d34d2e 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.List; import java.util.Set; /** @@ -111,8 +112,8 @@ public abstract class LanguageCodeStyleSettingsProvider { } public DisplayPriority getDisplayPriority() { - Language mainIdeLanguage = IdeLanguageCustomization.getInstance().getMainIdeLanguage(); - return mainIdeLanguage != null && mainIdeLanguage.is(getLanguage()) ? DisplayPriority.KEY_LANGUAGE_SETTINGS : DisplayPriority.LANGUAGE_SETTINGS; + List primaryIdeLanguages = IdeLanguageCustomization.getInstance().getPrimaryIdeLanguages(); + return primaryIdeLanguages.contains(getLanguage()) ? DisplayPriority.KEY_LANGUAGE_SETTINGS : DisplayPriority.LANGUAGE_SETTINGS; } @NotNull diff --git a/platform/lang-impl/src/com/intellij/ide/actions/GotoClassPresentationUpdater.kt b/platform/lang-impl/src/com/intellij/ide/actions/GotoClassPresentationUpdater.kt index b59dfc57f67d..4ba034d80552 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoClassPresentationUpdater.kt +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoClassPresentationUpdater.kt @@ -21,18 +21,21 @@ class GotoClassPresentationUpdater : PreloadingActivity() { companion object { @JvmStatic fun getMainElementKind(): String { - val mainIdeLanguage = IdeLanguageCustomization.getInstance().mainIdeLanguage + val primaryIdeLanguages = IdeLanguageCustomization.getInstance().primaryIdeLanguages val mainContributor = ChooseByNameRegistry.getInstance().classModelContributors .filterIsInstance(GotoClassContributor::class.java) - .firstOrNull { mainIdeLanguage != null && mainIdeLanguage.`is`(it.elementLanguage) } + .firstOrNull { it.elementLanguage in primaryIdeLanguages } return mainContributor?.elementKind ?: IdeBundle.message("go.to.class.kind.text") } private fun getElementKinds(): LinkedHashSet { - val mainIdeLanguage = IdeLanguageCustomization.getInstance().mainIdeLanguage + val primaryIdeLanguages = IdeLanguageCustomization.getInstance().primaryIdeLanguages return ChooseByNameRegistry.getInstance().classModelContributors .filterIsInstance(GotoClassContributor::class.java) - .sortedBy { if (mainIdeLanguage != null && mainIdeLanguage.`is`(it.elementLanguage)) 0 else 1 } + .sortedBy { + val index = primaryIdeLanguages.indexOf(it.elementLanguage) + if (index == -1) primaryIdeLanguages.size else index + } .mapTo(LinkedHashSet()) { it.elementKind } } } diff --git a/python/ide/src/com/jetbrains/python/PyCharmLanguageCustomization.java b/python/ide/src/com/jetbrains/python/PyCharmLanguageCustomization.java index 5681a638455b..21383d639252 100644 --- a/python/ide/src/com/jetbrains/python/PyCharmLanguageCustomization.java +++ b/python/ide/src/com/jetbrains/python/PyCharmLanguageCustomization.java @@ -3,10 +3,15 @@ package com.jetbrains.python; import com.intellij.lang.IdeLanguageCustomization; import com.intellij.lang.Language; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; public class PyCharmLanguageCustomization extends IdeLanguageCustomization { + @NotNull @Override - public Language getMainIdeLanguage() { - return PythonLanguage.getInstance(); + public List getPrimaryIdeLanguages() { + return Collections.singletonList(PythonLanguage.getInstance()); } }