@NotNull
  @Override
  public List<? extends GotoRelatedItem> getItems(@NotNull DataContext context) {
    PsiFile descriptionFile = context.getData(CommonDataKeys.PSI_FILE);
    if (descriptionFile == null || descriptionFile.getFileType() != HtmlFileType.INSTANCE) {
      return Collections.emptyList();
    }

    Module module = context.getData(PlatformCoreDataKeys.MODULE);
    if (module == null) {
      return Collections.emptyList();
    }
    Project project = module.getProject();
    if (!PsiUtil.isPluginProject(project)) {
      return Collections.emptyList();
    }

    VirtualFile virtualFile = descriptionFile.getVirtualFile();
    if (virtualFile == null) {
      return Collections.emptyList();
    }
    VirtualFile folder = virtualFile.getParent();

    //TODO support others (intentions, postfix templates)
    if (folder == null || !folder.getName().equals(DescriptionType.INSPECTION.getDescriptionFolder())) {
      return Collections.emptyList();
    }

    PsiClass baseClass = JavaPsiFacade.getInstance(project).findClass(InspectionProfileEntry.class.getCanonicalName(),
                                                                      GlobalSearchScope.allScope(project));
    if (baseClass == null) {
      return Collections.emptyList();
    }

    // Try to find class by description name first. It may improve performance significantly.
    PsiShortNamesCache psiShortNamesCache = PsiShortNamesCache.getInstance(project);
    String possibleImplementationName = FileUtilRt.getNameWithoutExtension(descriptionFile.getName());
    if (!StringUtil.endsWith(possibleImplementationName, INSPECTION_CLASS_NAME_SUFFIX)) {
      possibleImplementationName += INSPECTION_CLASS_NAME_SUFFIX;
    }
    Set<PsiClass> checkedPossibleImplementation = new HashSet<>();
    for (GlobalSearchScope scope : DescriptionCheckerUtil.searchScopes(module)) {
      PsiClass[] possibleImplementations = psiShortNamesCache.getClassesByName(possibleImplementationName, scope);
      for (PsiClass possibleImplementation : possibleImplementations) {
        if (isTargetInspectionPsiClass(possibleImplementation, descriptionFile, module)) {
          return createGotoRelatedItem(possibleImplementation);
        }
        checkedPossibleImplementation.add(possibleImplementation);
      }
    }

    for (GlobalSearchScope scope : DescriptionCheckerUtil.searchScopes(module)) {
      Query<PsiClass> query = ClassInheritorsSearch.search(baseClass, scope, true, true, false);
      Ref<List<GotoRelatedItem>> resultItems = new Ref<>();
      query.forEach(psiClass -> {
        if (checkedPossibleImplementation.contains(psiClass)) {
          return true; // already tried this class
        }

        if (!PsiUtil.isInstantiable(psiClass)) {
          return true; // only check actual inspection
        }

        if (isTargetInspectionPsiClass(psiClass, descriptionFile, module)) {
          resultItems.set(createGotoRelatedItem(psiClass));
          return false;
        }

        return true;
      });

      if (!resultItems.isNull()) {
        return resultItems.get();
      }
    }

    return Collections.emptyList();
  }
@NotNull
  @Override
  public List<? extends GotoRelatedItem> getItems(@NotNull DataContext context)