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 eaf559550e28..8793f5b49eaa 100644 --- a/java/java-analysis-api/src/com/intellij/uast/UastMetaLanguage.java +++ b/java/java-analysis-api/src/com/intellij/uast/UastMetaLanguage.java @@ -20,6 +20,7 @@ import com.intellij.lang.MetaLanguage; import com.intellij.util.containers.HashSet; import org.jetbrains.uast.UastLanguagePlugin; +import java.util.Collection; import java.util.Set; /** @@ -39,4 +40,9 @@ public class UastMetaLanguage extends MetaLanguage { public boolean matchesLanguage(Language language) { return myLanguages.contains(language); } + + @Override + public Collection getMatchingLanguages() { + return myLanguages; + } } diff --git a/platform/analysis-impl/src/com/intellij/codeInspection/InspectionEngine.java b/platform/analysis-impl/src/com/intellij/codeInspection/InspectionEngine.java index 934d804fcb9b..8c6a51472124 100644 --- a/platform/analysis-impl/src/com/intellij/codeInspection/InspectionEngine.java +++ b/platform/analysis-impl/src/com/intellij/codeInspection/InspectionEngine.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ import com.intellij.codeInspection.reference.RefManagerImpl; import com.intellij.codeInspection.reference.RefVisitor; import com.intellij.concurrency.JobLauncher; import com.intellij.lang.Language; +import com.intellij.lang.MetaLanguage; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.progress.ProgressIndicator; @@ -281,15 +282,28 @@ public class InspectionEngine { // unknown language in plugin.xml, ignore result = Collections.singleton(langId); } + else if (language instanceof MetaLanguage) { + Collection matchingLanguages = ((MetaLanguage) language).getMatchingLanguages(); + result = new HashSet<>(); + for (Language matchingLanguage : matchingLanguages) { + result.addAll(getLanguageWithDialects(wrapper, matchingLanguage)); + } + } else { - List dialects = language.getDialects(); - boolean applyToDialects = wrapper.applyToDialects(); - result = applyToDialects && !dialects.isEmpty() ? new THashSet<>(1 + dialects.size()) : new SmartHashSet<>(); - result.add(langId); - if (applyToDialects) { - for (Language dialect : dialects) { - result.add(dialect.getID()); - } + result = getLanguageWithDialects(wrapper, language); + } + return result; + } + + @NotNull + private static Set getLanguageWithDialects(@NotNull LocalInspectionToolWrapper wrapper, Language language) { + Set result;List dialects = language.getDialects(); + boolean applyToDialects = wrapper.applyToDialects(); + result = applyToDialects && !dialects.isEmpty() ? new THashSet<>(1 + dialects.size()) : new SmartHashSet<>(); + result.add(language.getID()); + if (applyToDialects) { + for (Language dialect : dialects) { + result.add(dialect.getID()); } } return result; diff --git a/platform/core-api/src/com/intellij/lang/MetaLanguage.java b/platform/core-api/src/com/intellij/lang/MetaLanguage.java index f956c9430786..7b0ff92352cb 100644 --- a/platform/core-api/src/com/intellij/lang/MetaLanguage.java +++ b/platform/core-api/src/com/intellij/lang/MetaLanguage.java @@ -19,6 +19,9 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; import org.jetbrains.annotations.NotNull; +import java.util.Collection; +import java.util.stream.Collectors; + /** * Allows to register a language extension for a group of languages defined by a certain criterion. * To use this, specify the ID of a meta-language in the "language" attribute of an extension in plugin.xml. @@ -41,4 +44,14 @@ public abstract class MetaLanguage extends Language { * Checks if the given language matches the criterion of this meta-language. */ public abstract boolean matchesLanguage(@NotNull Language language); + + /** + * Returns the list of all languages matching this meta-language. + */ + public Collection getMatchingLanguages() { + return Language.getRegisteredLanguages() + .stream() + .filter(language -> matchesLanguage(language)) + .collect(Collectors.toList()); + } } diff --git a/plugins/devkit/resources/META-INF/plugin.xml b/plugins/devkit/resources/META-INF/plugin.xml index 36ce0e963114..0800326f69b3 100644 --- a/plugins/devkit/resources/META-INF/plugin.xml +++ b/plugins/devkit/resources/META-INF/plugin.xml @@ -125,7 +125,7 @@ -