diff --git a/platform/core-api/src/com/intellij/lang/LanguageExtension.java b/platform/core-api/src/com/intellij/lang/LanguageExtension.java index 5b8be4e29ff0..07505673a72c 100644 --- a/platform/core-api/src/com/intellij/lang/LanguageExtension.java +++ b/platform/core-api/src/com/intellij/lang/LanguageExtension.java @@ -63,15 +63,28 @@ public class LanguageExtension extends KeyedExtensionCollector { protected void clearCacheForDerivedLanguages(@NotNull Language language) { Set languages = LanguageUtil.getAllDerivedLanguages(language); // includes language itself for (Language derivedLanguage : languages) { - derivedLanguage.putUserData(myCacheKey, null); - derivedLanguage.putUserData(myAllCacheKey, null); + clearCacheForLanguage(derivedLanguage); Collection metaLanguages = matchingMetaLanguages(derivedLanguage); for (MetaLanguage metaLanguage : metaLanguages) { - metaLanguage.putUserData(myCacheKey, null); - metaLanguage.putUserData(myAllCacheKey, null); + clearCacheForLanguage(metaLanguage); } } + if (language instanceof MetaLanguage) { + Collection matchingLanguages = ((MetaLanguage)language).getMatchingLanguages(); + for (Language matchingLanguage : matchingLanguages) { + Set matchingDerivedLanguages = LanguageUtil.getAllDerivedLanguages(matchingLanguage); // includes language itself + for (Language derivedLanguage : matchingDerivedLanguages) { + clearCacheForLanguage(derivedLanguage); + } + } + } + } + + private void clearCacheForLanguage(Language language) { + language.putUserData(myCacheKey, null); + language.putUserData(myAllCacheKey, null); + super.invalidateCacheForExtension(language.getID()); } @Override @@ -162,15 +175,13 @@ public class LanguageExtension extends KeyedExtensionCollector { @Override public void addExplicitExtension(@NotNull Language key, @NotNull T t) { - key.putUserData(myCacheKey, null); - key.putUserData(myAllCacheKey, null); + clearCacheForLanguage(key); super.addExplicitExtension(key, t); } @Override public void removeExplicitExtension(@NotNull Language key, @NotNull T t) { - key.putUserData(myCacheKey, null); - key.putUserData(myAllCacheKey, null); + clearCacheForLanguage(key); super.removeExplicitExtension(key, t); }