Skip to content

Commit eb893f1

Browse files
authored
Support replacing exports in preserved module-info (#226)
1 parent 99f57a1 commit eb893f1

File tree

3 files changed

+52
-10
lines changed

3 files changed

+52
-10
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Extra Java Module Info Gradle Plugin - Changelog
22

33
## Version 1.13.2
4+
* [Fixed] [#179](https://github.com/gradlex-org/extra-java-module-info/issues/179) - Combine 'preserveExisting' and 'exports'
45
* [Fixed] [#219](https://github.com/gradlex-org/extra-java-module-info/issues/219) - Combine 'preserveExisting' and 'removePackage'
56
* [Fixed] [#223](https://github.com/gradlex-org/extra-java-module-info/issues/223) - Combine 'preserveExisting' and 'ignoreServiceProvider'
67

src/main/java/org/gradlex/javamodule/moduleinfo/ExtraJavaModuleInfoTransform.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Collection;
2424
import java.util.Collections;
2525
import java.util.GregorianCalendar;
26+
import java.util.HashSet;
2627
import java.util.LinkedHashMap;
2728
import java.util.LinkedHashSet;
2829
import java.util.List;
@@ -440,10 +441,11 @@ private byte[] addModuleInfo(
440441
ClassReader classReader =
441442
moduleInfo.preserveExisting && existingModuleInfo != null ? new ClassReader(existingModuleInfo) : null;
442443
ClassWriter classWriter = new ClassWriter(classReader, 0);
443-
int openModule = moduleInfo.openModule ? Opcodes.ACC_OPEN : 0;
444-
String moduleVersion = moduleInfo.getModuleVersion() == null ? version : moduleInfo.getModuleVersion();
445444

446445
if (classReader == null) {
446+
int openModule = moduleInfo.openModule ? Opcodes.ACC_OPEN : 0;
447+
String moduleVersion = moduleInfo.getModuleVersion() == null ? version : moduleInfo.getModuleVersion();
448+
447449
classWriter.visit(Opcodes.V9, Opcodes.ACC_MODULE, "module-info", null, null, null);
448450
ModuleVisitor moduleVisitor =
449451
classWriter.visitModule(moduleInfo.getModuleName(), openModule, moduleVersion);
@@ -452,23 +454,28 @@ private byte[] addModuleInfo(
452454
moduleVisitor.visitEnd();
453455
classWriter.visitEnd();
454456
} else {
457+
Set<String> explicitlyHandledPackage = new HashSet<>();
458+
explicitlyHandledPackage.addAll(moduleInfo.exports.keySet());
459+
explicitlyHandledPackage.addAll(autoExportedPackages);
460+
explicitlyHandledPackage.addAll(removedPackages);
461+
455462
ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM9, classWriter) {
456463
@Override
457464
public ModuleVisitor visitModule(String name, int access, String version) {
458-
ModuleVisitor moduleVisitor = super.visitModule(name, access, version);
465+
ModuleVisitor moduleVisitor = cv.visitModule(name, access, version);
459466
return new ModuleVisitor(Opcodes.ASM9, moduleVisitor) {
460467

461468
@Override
462469
public void visitPackage(String packaze) {
463470
if (!removedPackages.contains(pathToPackage(packaze))) {
464-
super.visitPackage(packaze);
471+
mv.visitPackage(packaze);
465472
}
466473
}
467474

468475
@Override
469476
public void visitExport(String packaze, int access, String... modules) {
470-
if (!removedPackages.contains(pathToPackage(packaze))) {
471-
super.visitExport(packaze, access, modules);
477+
if (!explicitlyHandledPackage.contains(pathToPackage(packaze))) {
478+
mv.visitExport(packaze, access, modules);
472479
}
473480
}
474481

@@ -477,7 +484,7 @@ public void visitUse(String service) {
477484
String packaze = service.substring(0, service.lastIndexOf("/"));
478485
// if package is removed, also remove 'use' directives based on the package
479486
if (!removedPackages.contains(pathToPackage(packaze))) {
480-
super.visitUse(service);
487+
mv.visitUse(service);
481488
}
482489
}
483490

@@ -489,14 +496,14 @@ public void visitProvide(String service, String... providers) {
489496
.contains(p))
490497
.toArray(String[]::new);
491498
if (filteredProviders.length > 0) {
492-
super.visitProvide(service, filteredProviders);
499+
mv.visitProvide(service, filteredProviders);
493500
}
494501
}
495502

496503
@Override
497504
public void visitEnd() {
498-
addModuleInfoEntries(moduleInfo, Collections.emptyMap(), autoExportedPackages, this);
499-
super.visitEnd();
505+
addModuleInfoEntries(moduleInfo, Collections.emptyMap(), autoExportedPackages, mv);
506+
mv.visitEnd();
500507
}
501508
};
502509
}

src/test/groovy/org/gradlex/javamodule/moduleinfo/test/RealModuleJarPreservePatchingFunctionalTest.groovy

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,38 @@ class RealModuleJarPreservePatchingFunctionalTest extends Specification {
7878
run()
7979
}
8080

81+
def "can replace a package export in a preserved module-info"() {
82+
given:
83+
buildFile << '''
84+
dependencies {
85+
implementation("org.controlsfx:controlsfx:11.2.3")
86+
// undeclared transitive dependencies of controlsfx
87+
implementation("org.openjfx:javafx-base:11:linux")
88+
implementation("org.openjfx:javafx-controls:11:linux")
89+
implementation("org.openjfx:javafx-graphics:11:linux")
90+
}
91+
extraJavaModuleInfo {
92+
// original module-info contains: exports impl.org.controlsfx.skin to org.controlsfx.samples;
93+
module("org.controlsfx:controlsfx", "org.controlsfx.controls") {
94+
preserveExisting()
95+
exports("impl.org.controlsfx.skin")
96+
}
97+
}
98+
'''
99+
file("src/main/java/module-info.java") << """
100+
module org.example {
101+
requires org.controlsfx.controls;
102+
}
103+
"""
104+
file("src/main/java/org/example/Main.java") << """
105+
package org.example;
106+
public class Main {
107+
impl.org.controlsfx.skin.DecorationPane pane;
108+
public static void main(String[] args) {}
109+
}
110+
"""
111+
112+
expect:
113+
run()
114+
}
81115
}

0 commit comments

Comments
 (0)