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,7 +339,9 @@ 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 }
@@ -428,6 +432,8 @@ private byte[] addModuleInfo(
428432 Map <String , List <String >> providers ,
429433 @ Nullable String version ,
430434 Set <String > autoExportedPackages ,
435+ List <String > removedPackages ,
436+ Map <String , Set <String >> ignoreServiceProviders ,
431437 @ Nullable byte [] existingModuleInfo ) {
432438 ClassReader classReader =
433439 moduleInfo .preserveExisting && existingModuleInfo != null ? new ClassReader (existingModuleInfo ) : null ;
@@ -449,6 +455,42 @@ private byte[] addModuleInfo(
449455 public ModuleVisitor visitModule (String name , int access , String version ) {
450456 ModuleVisitor moduleVisitor = super .visitModule (name , access , version );
451457 return new ModuleVisitor (Opcodes .ASM9 , moduleVisitor ) {
458+
459+ @ Override
460+ public void visitPackage (String packaze ) {
461+ if (!removedPackages .contains (pathToPackage (packaze ))) {
462+ super .visitPackage (packaze );
463+ }
464+ }
465+
466+ @ Override
467+ public void visitExport (String packaze , int access , String ... modules ) {
468+ if (!removedPackages .contains (pathToPackage (packaze ))) {
469+ super .visitExport (packaze , access , modules );
470+ }
471+ }
472+
473+ @ Override
474+ public void visitUse (String service ) {
475+ String packaze = service .substring (0 , service .lastIndexOf ("/" ));
476+ // if package is removed, also remove 'use' directives based on the package
477+ if (!removedPackages .contains (pathToPackage (packaze ))) {
478+ super .visitUse (service );
479+ }
480+ }
481+
482+ @ Override
483+ public void visitProvide (String service , String ... providers ) {
484+ String [] filteredProviders = Arrays .stream (providers )
485+ .filter (p -> ignoreServiceProviders
486+ .getOrDefault (service , emptySet ())
487+ .contains (p ))
488+ .toArray (String []::new );
489+ if (filteredProviders .length > 0 ) {
490+ super .visitProvide (service , filteredProviders );
491+ }
492+ }
493+
452494 @ Override
453495 public void visitEnd () {
454496 addModuleInfoEntires (moduleInfo , Collections .emptyMap (), autoExportedPackages , this );
0 commit comments