From 9ceb6a8a8860e64b8c2ebcf8907dc9f577214012 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 23 Jul 2019 09:46:28 +0200 Subject: [PATCH] Possibility to mark a file type as secondary so it's not returned by Language.getAssociatedFileType() GitOrigin-RevId: 94fa97faccc17f778db16dda380cf029b71a175f --- .../core-api/src/com/intellij/lang/Language.java | 14 ++++++++++---- .../openapi/fileTypes/LanguageFileType.java | 16 ++++++++++++++++ .../openapi/fileTypes/impl/FileTypeBean.java | 4 ++-- python/src/META-INF/python-core-common.xml | 2 +- python/src/com/jetbrains/pyqt/QtFileType.java | 2 +- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/platform/core-api/src/com/intellij/lang/Language.java b/platform/core-api/src/com/intellij/lang/Language.java index 54fbab0d0188..d2b340738905 100644 --- a/platform/core-api/src/com/intellij/lang/Language.java +++ b/platform/core-api/src/com/intellij/lang/Language.java @@ -161,13 +161,19 @@ public abstract class Language extends UserDataHolderBase { @ApiStatus.Internal public LanguageFileType findMyFileType(FileType[] types) { for (final FileType fileType : types) { - if (fileType instanceof LanguageFileType && ((LanguageFileType)fileType).getLanguage() == this) { - return (LanguageFileType)fileType; + if (fileType instanceof LanguageFileType) { + final LanguageFileType languageFileType = (LanguageFileType)fileType; + if (languageFileType.getLanguage() == this && !languageFileType.isSecondary()) { + return languageFileType; + } } } for (final FileType fileType : types) { - if (fileType instanceof LanguageFileType && isKindOf(((LanguageFileType)fileType).getLanguage())) { - return (LanguageFileType)fileType; + if (fileType instanceof LanguageFileType) { + final LanguageFileType languageFileType = (LanguageFileType)fileType; + if (isKindOf(languageFileType.getLanguage()) && !languageFileType.isSecondary()) { + return languageFileType; + } } } return null; diff --git a/platform/core-api/src/com/intellij/openapi/fileTypes/LanguageFileType.java b/platform/core-api/src/com/intellij/openapi/fileTypes/LanguageFileType.java index 6cdf10e557d6..3e46199afe77 100644 --- a/platform/core-api/src/com/intellij/openapi/fileTypes/LanguageFileType.java +++ b/platform/core-api/src/com/intellij/openapi/fileTypes/LanguageFileType.java @@ -29,13 +29,25 @@ import java.nio.charset.Charset; */ public abstract class LanguageFileType implements FileType{ private final Language myLanguage; + private final boolean mySecondary; /** * Creates a language file type for the specified language. * @param language The language used in the files of the type. */ protected LanguageFileType(@NotNull final Language language) { + this(language, false); + } + + /** + * Creates a language file type for the specified language. + * @param language The language used in the files of the type. + * @param secondary If true, this language file type will never be returned as the associated file type for the language. + * (Used when a file type is reusing the language of another file type, e.g. XML). + */ + protected LanguageFileType(@NotNull final Language language, boolean secondary) { myLanguage = language; + mySecondary = secondary; } /** @@ -57,6 +69,10 @@ public abstract class LanguageFileType implements FileType{ return false; } + public boolean isSecondary() { + return mySecondary; + } + @Override public String getCharset(@NotNull VirtualFile file, @NotNull final byte[] content) { return null; diff --git a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeBean.java b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeBean.java index fefba78faad4..64162d68a103 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeBean.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeBean.java @@ -63,8 +63,8 @@ public class FileTypeBean extends AbstractExtensionPointBean { public String fileNamesCaseInsensitive; /** - * For file types that extend {@link LanguageFileType}, this must be set to the ID of the language - * returned by {@link LanguageFileType#getLanguage()}. + * For file types that extend {@link LanguageFileType} and are the primary file type for the corresponding language, this must be set + * to the ID of the language returned by {@link LanguageFileType#getLanguage()} */ @Attribute("language") public String language; diff --git a/python/src/META-INF/python-core-common.xml b/python/src/META-INF/python-core-common.xml index 36783a634632..036c24c118bf 100644 --- a/python/src/META-INF/python-core-common.xml +++ b/python/src/META-INF/python-core-common.xml @@ -21,7 +21,7 @@ extensions="py;pyw;" implementationClass="com.jetbrains.python.PythonFileType" fieldName="INSTANCE"/> - + diff --git a/python/src/com/jetbrains/pyqt/QtFileType.java b/python/src/com/jetbrains/pyqt/QtFileType.java index b7e7e72d8fd1..1a04052a632b 100644 --- a/python/src/com/jetbrains/pyqt/QtFileType.java +++ b/python/src/com/jetbrains/pyqt/QtFileType.java @@ -32,7 +32,7 @@ public abstract class QtFileType extends LanguageFileType implements INativeFile private final String myDefaultExtension; QtFileType(String name, String description, String defaultExtension) { - super(XMLLanguage.INSTANCE); + super(XMLLanguage.INSTANCE, true); myName = name; myDescription = description; myDefaultExtension = defaultExtension;