Extension (Module module, PsiClass psiClass) { // Try search in narrow scopes first Project project = module.getProject(); Set<DomFileElement<IdeaPlugin>> processed = new HashSet<>(); for (GlobalSearchScope scope : DescriptionCheckerUtil.searchScopes(module)) { List<DomFileElement<IdeaPlugin>> origElements = DomService.getInstance().getFileElements(IdeaPlugin.class, project, scope); origElements.removeAll(processed); List<DomFileElement<IdeaPlugin>> elements = PluginDescriptorChooser.findAppropriateIntelliJModule(module.getName(), origElements); Query<PsiReference> query = ReferencesSearch.search(psiClass, new LocalSearchScope(elements.stream().map(DomFileElement::getFile).toArray(PsiElement[]::new))); Ref<Extension> result = Ref.create(null); query.forEach(ref -> { PsiElement element = ref.getElement(); if (element instanceof XmlAttributeValue) { PsiElement parent = element.getParent(); if (parent instanceof XmlAttribute && "implementationClass".equals(((XmlAttribute)parent).getName())) { DomElement domElement = DomUtil.getDomElement(parent.getParent()); if (domElement instanceof Extension extension) { ExtensionPoint extensionPoint = extension.getExtensionPoint(); if (extensionPoint != null && InheritanceUtil.isInheritor(extensionPoint.getBeanClass().getValue(), InspectionEP.class.getName())) { result.set(extension); return false; } } } } return true; }); Extension extension = result.get(); if (extension != null) return extension; processed.addAll(origElements); } return null; }