11// SPDX-License-Identifier: Apache-2.0
22package org .gradlex .javamodule .moduleinfo ;
33
4+ import static java .util .Collections .emptySet ;
45import static org .gradlex .javamodule .moduleinfo .FilePathToModuleCoordinates .gaCoordinatesFromFilePathMatch ;
56import static org .gradlex .javamodule .moduleinfo .FilePathToModuleCoordinates .versionFromFilePath ;
67import static org .gradlex .javamodule .moduleinfo .ModuleNameUtil .automaticModulNameFromFileName ;
1718import java .nio .charset .StandardCharsets ;
1819import java .nio .file .Files ;
1920import java .util .ArrayList ;
21+ import java .util .Arrays ;
2022import java .util .Calendar ;
2123import java .util .Collection ;
2224import java .util .Collections ;
@@ -337,13 +339,17 @@ private void addModuleDescriptor(File originalJar, File moduleJar, ModuleInfo mo
337339 moduleInfo ,
338340 providers ,
339341 versionFromFilePath (originalJar .toPath ()),
340- moduleInfo .exportAllPackages ? packages : Collections .emptySet (),
342+ moduleInfo .exportAllPackages ? packages : emptySet (),
343+ moduleInfo .getRemovedPackages (),
344+ moduleInfo .ignoreServiceProviders ,
341345 existingModuleInfo ));
342346 outputStream .closeEntry ();
343347 }
344348 } catch (IOException e ) {
345349 throw new RuntimeException (e );
346350 }
351+
352+ System .out .println (moduleJar );
347353 }
348354
349355 private JarOutputStream newJarOutputStream (OutputStream out , @ Nullable Manifest manifest ) throws IOException {
@@ -428,6 +434,8 @@ private byte[] addModuleInfo(
428434 Map <String , List <String >> providers ,
429435 @ Nullable String version ,
430436 Set <String > autoExportedPackages ,
437+ List <String > removedPackages ,
438+ Map <String , Set <String >> ignoreServiceProviders ,
431439 @ Nullable byte [] existingModuleInfo ) {
432440 ClassReader classReader =
433441 moduleInfo .preserveExisting && existingModuleInfo != null ? new ClassReader (existingModuleInfo ) : null ;
@@ -449,6 +457,42 @@ private byte[] addModuleInfo(
449457 public ModuleVisitor visitModule (String name , int access , String version ) {
450458 ModuleVisitor moduleVisitor = super .visitModule (name , access , version );
451459 return new ModuleVisitor (Opcodes .ASM9 , moduleVisitor ) {
460+
461+ @ Override
462+ public void visitPackage (String packaze ) {
463+ if (!removedPackages .contains (pathToPackage (packaze ))) {
464+ super .visitPackage (packaze );
465+ }
466+ }
467+
468+ @ Override
469+ public void visitExport (String packaze , int access , String ... modules ) {
470+ if (!removedPackages .contains (pathToPackage (packaze ))) {
471+ super .visitExport (packaze , access , modules );
472+ }
473+ }
474+
475+ @ Override
476+ public void visitUse (String service ) {
477+ String packaze = service .substring (0 , service .lastIndexOf ("/" ));
478+ // if package is removed, also remove 'use' directives based on the package
479+ if (!removedPackages .contains (pathToPackage (packaze ))) {
480+ super .visitUse (service );
481+ }
482+ }
483+
484+ @ Override
485+ public void visitProvide (String service , String ... providers ) {
486+ String [] filteredProviders = Arrays .stream (providers )
487+ .filter (p -> ignoreServiceProviders
488+ .getOrDefault (service , emptySet ())
489+ .contains (p ))
490+ .toArray (String []::new );
491+ if (filteredProviders .length > 0 ) {
492+ super .visitProvide (service , filteredProviders );
493+ }
494+ }
495+
452496 @ Override
453497 public void visitEnd () {
454498 addModuleInfoEntires (moduleInfo , Collections .emptyMap (), autoExportedPackages , this );
0 commit comments