private static @NlsSafe @NotNull String createNotificationContent(@NotNull String projectPath, @NotNull Set<PsiJavaModule> moduleDescriptors) {
    // we may have several JPMS-modules with the same name
    MultiMap<String, String> modulesPathsByName = new MultiMap<>();
    for (PsiJavaModule moduleDescriptor : moduleDescriptors) {
      VirtualFile moduleFile = moduleDescriptor.getContainingFile().getVirtualFile();
      if (moduleFile != null) {
        modulesPathsByName.putValue(moduleDescriptor.getName(), moduleFile.getPath());
      }
    }
    HtmlBuilder contentBuilder = new HtmlBuilder();
    for (var entry : modulesPathsByName.entrySet()) {
      @NlsSafe String moduleName = entry.getKey();
      Collection<String> modulePaths = entry.getValue();
      if (modulePaths.size() == 1) {
        contentBuilder.appendLink(modulePaths.iterator().next(), PsiJavaModule.MODULE_INFO_FILE + " (" + moduleName + ")").br();
        continue;
      }
      for (@NlsSafe String modulePath : modulePaths) {
        // here we reduce an absolute module path to relative path to place it in the notification content
        String relativeModulePath = FileUtil.getRelativePath(projectPath, modulePath, '/');
        contentBuilder.appendLink(modulePath, relativeModulePath + " (" + moduleName + ")").br();
      }
    }
    return contentBuilder.toString();
  }
private static @NlsSafe @NotNull String createNotificationContent(@NotNull String projectPath, @NotNull Set<PsiJavaModule> moduleDescriptors)