Skip to content

Commit 9e07e2e

Browse files
committed
Support 'requires runtime' in 'java9/module-info.java'
Extends #18
1 parent b12d8c4 commit 9e07e2e

File tree

3 files changed

+40
-14
lines changed

3 files changed

+40
-14
lines changed

src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingExtension.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,20 +122,21 @@ public void whitebox(TestSuite jvmTestSuite, Action<WhiteboxJvmTestSuite> conf)
122122
if (jvmTestSuite instanceof JvmTestSuite) {
123123
WhiteboxJvmTestSuite whiteboxJvmTestSuite = project.getObjects().newInstance(WhiteboxJvmTestSuite.class);
124124
whiteboxJvmTestSuite.getSourcesUnderTest().convention(project.getExtensions().getByType(SourceSetContainer.class).getByName(SourceSet.MAIN_SOURCE_SET_NAME));
125-
whiteboxJvmTestSuite.getRequires().addAll(requiresFromModuleInfo((JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite.getSourcesUnderTest()));
125+
whiteboxJvmTestSuite.getRequires().addAll(requiresFromModuleInfo((JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite.getSourcesUnderTest(), false));
126+
whiteboxJvmTestSuite.getRequiresRuntime().addAll(requiresFromModuleInfo((JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite.getSourcesUnderTest(), true));
126127
conf.execute(whiteboxJvmTestSuite);
127128
configureJvmTestSuiteForWhitebox((JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite);
128129
}
129130
}
130131

131-
private Provider<List<String>> requiresFromModuleInfo(JvmTestSuite jvmTestSuite, Provider<SourceSet> sourcesUnderTest) {
132+
private Provider<List<String>> requiresFromModuleInfo(JvmTestSuite jvmTestSuite, Provider<SourceSet> sourcesUnderTest, boolean runtimeOnly) {
132133
RegularFile moduleInfoFile = project.getLayout().getProjectDirectory().file(whiteboxModuleInfo(jvmTestSuite).getAbsolutePath());
133134
Provider<String> moduleInfoContent = project.getProviders().fileContents(moduleInfoFile).getAsText();
134135
return moduleInfoContent.map(c -> {
135136
ModuleInfoParser moduleInfoParser = new ModuleInfoParser(project.getLayout(), project.getProviders());
136137
String mainModuleName = moduleInfoParser.moduleName(sourcesUnderTest.get().getAllJava().getSrcDirs());
137-
List<String> requires = ModuleInfoRequiresParser.parse(moduleInfoContent.get());
138-
if (requires.stream().anyMatch(r -> r.equals(mainModuleName))) {
138+
List<String> requires = ModuleInfoRequiresParser.parse(moduleInfoContent.get(), runtimeOnly);
139+
if (requires.stream().anyMatch(r -> r.equals(mainModuleName)) || runtimeOnly) {
139140
return requires.stream().filter(r -> !r.equals(mainModuleName)).collect(Collectors.toList());
140141
}
141142
return Collections.<String>emptyList();
@@ -235,5 +236,14 @@ private void configureJvmTestSuiteForWhitebox(JvmTestSuite jvmTestSuite, Whitebo
235236
}
236237
}
237238
});
239+
Configuration runtimeOnly = configurations.getByName(testSources.getRuntimeOnlyConfigurationName());
240+
runtimeOnly.withDependencies(d -> {
241+
for (String requiresModuleName : whiteboxJvmTestSuite.getRequiresRuntime().get()) {
242+
Provider<?> gav = JavaModuleDependenciesBridge.gav(project, requiresModuleName);
243+
if (gav != null) {
244+
dependencies.addProvider(runtimeOnly.getName(), gav);
245+
}
246+
}
247+
});
238248
}
239249
}

src/main/java/org/gradlex/javamodule/testing/WhiteboxJvmTestSuite.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ public interface WhiteboxJvmTestSuite {
3838
*/
3939
ListProperty<String> getRequires();
4040

41+
/**
42+
* Add a runtime-only dependency via Module Name when combined with
43+
* 'java-module-dependencies' plugin.
44+
*
45+
* @return modifiable list of addition 'runtimeOnly' dependencies
46+
*/
47+
ListProperty<String> getRequiresRuntime();
48+
4149
/**
4250
* Open all packages of this Whitebox Test Suite to a given Module
4351
* for reflection at runtime.

src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoRequiresParser.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,29 @@
2121
import java.util.List;
2222

2323
public class ModuleInfoRequiresParser {
24+
private static final String RUNTIME_KEYWORD = "/*runtime*/";
2425

25-
public static List<String> parse(String moduleInfoFileContent) {
26+
public static List<String> parse(String moduleInfoFileContent, boolean runtimeOnly) {
2627
List<String> requires = new ArrayList<>();
2728
boolean insideComment = false;
2829
for(String line: moduleInfoFileContent.split("\n")) {
29-
insideComment = parseLine(line, insideComment, requires);
30+
insideComment = parseLine(line, insideComment, requires, runtimeOnly);
3031
}
3132
return requires;
3233
}
3334

3435
/**
3536
* @return true, if we are inside a multi-line comment after this line
3637
*/
37-
private static boolean parseLine(String moduleLine, boolean insideComment, List<String> requires) {
38+
private static boolean parseLine(String moduleLine, boolean insideComment, List<String> requires, boolean runtimeOnly) {
3839
if (insideComment) {
3940
return !moduleLine.contains("*/");
4041
}
4142

4243
List<String> tokens = Arrays.asList(moduleLine
4344
.replace(";", "")
4445
.replace("{", "")
46+
.replace(RUNTIME_KEYWORD, "runtime")
4547
.replaceAll("/\\*.*?\\*/", " ")
4648
.trim().split("\\s+"));
4749
int singleLineCommentStartIndex = tokens.indexOf("//");
@@ -50,14 +52,20 @@ private static boolean parseLine(String moduleLine, boolean insideComment, List<
5052
}
5153

5254
if (tokens.size() > 1 && tokens.get(0).equals("requires")) {
53-
if (tokens.size() > 3 && tokens.contains("static") && tokens.contains("transitive")) {
54-
requires.add(tokens.get(3));
55-
} else if (tokens.size() > 2 && tokens.contains("transitive")) {
56-
requires.add(tokens.get(2));
57-
} else if (tokens.size() > 2 && tokens.contains("static")) {
58-
requires.add(tokens.get(2));
55+
if (runtimeOnly) {
56+
if (tokens.size() > 2 && tokens.contains("runtime")) {
57+
requires.add(tokens.get(2));
58+
}
5959
} else {
60-
requires.add(tokens.get(1));
60+
if (tokens.size() > 3 && tokens.contains("static") && tokens.contains("transitive")) {
61+
requires.add(tokens.get(3));
62+
} else if (tokens.size() > 2 && tokens.contains("transitive")) {
63+
requires.add(tokens.get(2));
64+
} else if (tokens.size() > 2 && tokens.contains("static")) {
65+
requires.add(tokens.get(2));
66+
} else if (!tokens.contains("runtime")) {
67+
requires.add(tokens.get(1));
68+
}
6169
}
6270
}
6371
return moduleLine.lastIndexOf("/*") > moduleLine.lastIndexOf("*/");

0 commit comments

Comments
 (0)