docs: private void preprocessClasspathElementsByType(final List<ClasspathElement> finalTraditionalClasspathEltOrder,
              final LogNode classpathFinderLog) {
          final List<SimpleEntry<String, ClasspathElement>> classpathEltDirs = new ArrayList<>();
          final List<SimpleEntry<String, ClasspathElement>> classpathEltZips = new ArrayList<>();
          for (final ClasspathElement classpathElt : finalTraditionalClasspathEltOrder) {
              if (classpathElt instanceof ClasspathElementDir) {
                  // Separate out ClasspathElementDir elements from other types
                  classpathEltDirs.add(
                          new SimpleEntry<>(((ClasspathElementDir) classpathElt).getFile().getPath(), classpathElt));
  
              } else if (classpathElt instanceof ClasspathElementZip) {
                  // Separate out ClasspathElementZip elements from other types
                  final ClasspathElementZip classpathEltZip = (ClasspathElementZip) classpathElt;
                  classpathEltZips.add(new SimpleEntry<>(classpathEltZip.getZipFilePath(), classpathElt));
  
                  // Handle module-related manifest entries
                  if (classpathEltZip.logicalZipFile != null) {
                      // From JEP 261:
                      // "A <module>/<package> pair in the value of an Add-Exports attribute has the same
                      // meaning as the command-line option --add-exports <module>/<package>=ALL-UNNAMED. 
                      // A <module>/<package> pair in the value of an Add-Opens attribute has the same 
                      // meaning as the command-line option --add-opens <module>/<package>=ALL-UNNAMED."
                      if (classpathEltZip.logicalZipFile.addExportsManifestEntryValue != null) {
                          for (final String addExports : JarUtils
                                  .smartPathSplit(classpathEltZip.logicalZipFile.addExportsManifestEntryValue, ' ')) {
                              scanSpec.modulePathInfo.addExports.add(addExports + "=ALL-UNNAMED");
                          }
                      }
                      if (classpathEltZip.logicalZipFile.addOpensManifestEntryValue != null) {
                          for (final String addOpens : JarUtils
                                  .smartPathSplit(classpathEltZip.logicalZipFile.addOpensManifestEntryValue, ' ')) {
                              scanSpec.modulePathInfo.addOpens.add(addOpens + "=ALL-UNNAMED");
                          }
                      }
                      // Retrieve Automatic-Module-Name manifest entry, if present
                      if (classpathEltZip.logicalZipFile.automaticModuleNameManifestEntryValue != null) {
                          classpathEltZip.moduleNameFromManifestFile = //
                                  classpathEltZip.logicalZipFile.automaticModuleNameManifestEntryValue;
                      }
                  }
              }
              // (Ignore ClasspathElementModule, no preprocessing to perform)
          }
          // Find nested classpath elements (writes to ClasspathElement#nestedClasspathRootPrefixes)
          findNestedClasspathElements(classpathEltDirs, classpathFinderLog);
          findNestedClasspathElements(classpathEltZips, classpathFinderLog);
      }