@Override
  protected Set<String> getStringsToSearch(final PsiElement element) {
    if (element instanceof PsiDirectory) { // normalize a directory to a corresponding package
      return getStringsToSearch(
          JavaDirectoryService.getInstance().getPackage((PsiDirectory) element));
    }

    final Set<String> result = new HashSet<String>();

    ApplicationManager.getApplication()
        .runReadAction(
            new Runnable() {
              @Override
              public void run() {
                if (element instanceof PsiPackage) {
                  ContainerUtil.addIfNotNull(result, ((PsiPackage) element).getQualifiedName());
                } else if (element instanceof PsiClass) {
                  final String qname = ((PsiClass) element).getQualifiedName();
                  if (qname != null) {
                    result.add(qname);
                    PsiClass topLevelClass = PsiUtil.getTopLevelClass(element);
                    if (topLevelClass != null) {
                      String topName = topLevelClass.getQualifiedName();
                      assert topName != null;
                      result.add(topName + qname.substring(topName.length()).replace('.', '$'));
                    }
                  }
                } else if (element instanceof PsiMethod) {
                  ContainerUtil.addIfNotNull(result, ((PsiMethod) element).getName());
                } else if (element instanceof PsiVariable) {
                  ContainerUtil.addIfNotNull(result, ((PsiVariable) element).getName());
                } else if (element instanceof PsiMetaOwner) {
                  final PsiMetaData metaData = ((PsiMetaOwner) element).getMetaData();
                  if (metaData != null) {
                    ContainerUtil.addIfNotNull(result, metaData.getName());
                  }
                } else if (element instanceof PsiNamedElement) {
                  ContainerUtil.addIfNotNull(result, ((PsiNamedElement) element).getName());
                } else if (element instanceof XmlAttributeValue) {
                  ContainerUtil.addIfNotNull(result, ((XmlAttributeValue) element).getValue());
                } else {
                  LOG.error("Unknown element type: " + element);
                }
              }
            });

    return result;
  }