DocumentationProvider (@Nullable PsiElement element, @Nullable PsiElement originalElement) { if (element != null && !element.isValid()) { element = null; } if (originalElement != null && !originalElement.isValid()) { originalElement = null; } if (originalElement == null) { originalElement = getOriginalElement(element); } PsiFile containingFile = originalElement != null ? originalElement.getContainingFile() : element != null ? element.getContainingFile() : null; Set<DocumentationProvider> result = new LinkedHashSet<>(); Language containingFileLanguage = containingFile != null ? containingFile.getLanguage() : null; DocumentationProvider originalProvider = containingFile != null ? LanguageDocumentation.INSTANCE.forLanguage(containingFileLanguage) : null; Language elementLanguage = element != null ? element.getLanguage() : null; DocumentationProvider elementProvider = element == null || elementLanguage.is(containingFileLanguage) ? null : LanguageDocumentation.INSTANCE.forLanguage(elementLanguage); ContainerUtil.addIfNotNull(result, elementProvider); ContainerUtil.addIfNotNull(result, originalProvider); if (containingFile != null) { Language baseLanguage = containingFile.getViewProvider().getBaseLanguage(); if (!baseLanguage.is(containingFileLanguage)) { ContainerUtil.addIfNotNull(result, LanguageDocumentation.INSTANCE.forLanguage(baseLanguage)); } } else if (element instanceof PsiDirectory) { Set<Language> set = new HashSet<>(); for (PsiFile file : ((PsiDirectory)element).getFiles()) { Language baseLanguage = file.getViewProvider().getBaseLanguage(); if (!set.contains(baseLanguage)) { set.add(baseLanguage); ContainerUtil.addIfNotNull(result, LanguageDocumentation.INSTANCE.forLanguage(baseLanguage)); } } } return CompositeDocumentationProvider.wrapProviders(result); }