diff --git a/build.gradle.kts b/build.gradle.kts index ed7b22a0..e456fbcd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,6 +11,7 @@ configurations.compileClasspath { dependencies { implementation("org.ow2.asm:asm:9.9") + implementation("com.github.javaparser:javaparser-core:3.27.1") compileOnly("org.gradlex:extra-java-module-info:1.13.1") compileOnly("com.autonomousapps:dependency-analysis-gradle-plugin:3.5.1") } diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys index cba99fe6..5bd5d14b 100644 --- a/gradle/verification-keyring.keys +++ b/gradle/verification-keyring.keys @@ -1754,3 +1754,16 @@ CgkQuhmUn6JgkhZmBQEA3b5QhIg4LhToSGJ0sI3mPr270z+Sefyl/L8s2i7ZJKEA /1su4aPLl+FaeuZHpInOy991PXFh+IJICL1irc2DfV4G =stfL -----END PGP PUBLIC KEY BLOCK----- + +id 6DE9B8077FBB2F8A019F4904BD17A565509DEE20 +uid jean-pierre.lerbscher@jperf.com +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xjMEZl2j9RYJKwYBBAHaRw8BAQdAPzZyNkr92xKYzBrTOsN8Fwy9l2W0ez4Hu0t3 +/MoohtG0H2plYW4tcGllcnJlLmxlcmJzY2hlckBqcGVyZi5jb23OOARmXaP1Egor +BgEEAZdVAQUBAQdAoTUzjZPhQLyzRo9jIO8TrgC+mfazNL5gB+fOWhB//T4DAQgH +wn4EGBYKACYWIQRt6bgHf7svigGfSQS9F6VlUJ3uIAUCZl2j9QIbDAUJBaOKqwAK +CRC9F6VlUJ3uIIpxAP9MihNcqlK2wPp2uURiLmw16dN3o50gxWeLMjBxethg0gD/ +VLRHao8huHsPY9XMrgbHSNLZOT7geBJOdvwrTRTy3A0= +=BzAO +-----END PGP PUBLIC KEY BLOCK----- diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index aee68149..e816a246 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -17,9 +17,11 @@ - + + + diff --git a/src/main/java/org/gradlex/javamodule/dependencies/internal/utils/ModuleInfo.java b/src/main/java/org/gradlex/javamodule/dependencies/internal/utils/ModuleInfo.java index c3fe5232..1f20775c 100644 --- a/src/main/java/org/gradlex/javamodule/dependencies/internal/utils/ModuleInfo.java +++ b/src/main/java/org/gradlex/javamodule/dependencies/internal/utils/ModuleInfo.java @@ -3,12 +3,17 @@ import static org.gradlex.javamodule.dependencies.internal.utils.ModuleNamingUtil.sourceSetToModuleName; +import com.github.javaparser.JavaParser; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.modules.ModuleDeclaration; +import com.github.javaparser.ast.modules.ModuleDirective; +import com.github.javaparser.ast.modules.ModuleRequiresDirective; import java.io.Serializable; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; import org.jspecify.annotations.Nullable; public class ModuleInfo implements Serializable { @@ -37,10 +42,17 @@ public String literal() { private final List requiresRuntime = new ArrayList<>(); public ModuleInfo(String moduleInfoFileContent) { - boolean insideComment = false; - for (String line : moduleInfoFileContent.split("\n")) { - insideComment = parse(line, insideComment); + Optional result = + new JavaParser().parse(moduleInfoFileContent).getResult(); + if (!result.isPresent()) { + return; } + if (!result.get().getModule().isPresent()) { + return; + } + ModuleDeclaration moduleDeclaration = result.get().getModule().get(); + moduleName = moduleDeclaration.getNameAsString(); + processDirectives(moduleDeclaration.getDirectives()); } public String getModuleName() { @@ -90,44 +102,32 @@ public String moduleNamePrefix(String projectName, String sourceSetName, boolean return null; } - /** - * @return true, if we are inside a multi-line comment after this line - */ - private boolean parse(String moduleLine, boolean insideComment) { - if (insideComment) { - return !moduleLine.contains("*/"); - } - - List tokens = Arrays.asList(moduleLine - .replace(";", "") - .replace("{", "") - .replace("}", "") - .replace(RUNTIME_KEYWORD, "runtime") - .replaceAll("/\\*.*?\\*/", " ") - .trim() - .split("\\s+")); - int singleLineCommentStartIndex = tokens.indexOf("//"); - if (singleLineCommentStartIndex >= 0) { - tokens = tokens.subList(0, singleLineCommentStartIndex); - } - - if (tokens.contains("module")) { - moduleName = tokens.get(tokens.size() - 1); - } - if (tokens.size() > 1 && tokens.get(0).equals("requires")) { - if (tokens.size() > 3 && tokens.contains("static") && tokens.contains("transitive")) { - requiresStaticTransitive.add(tokens.get(3)); - } else if (tokens.size() > 2 && tokens.contains("transitive")) { - requiresTransitive.add(tokens.get(2)); - } else if (tokens.size() > 2 && tokens.contains("static")) { - requiresStatic.add(tokens.get(2)); - } else if (tokens.size() > 2 && tokens.contains("runtime")) { - requiresRuntime.add(tokens.get(2)); - } else { - requires.add(tokens.get(1)); + private void processDirectives(List directives) { + for (ModuleDirective d : directives) { + if (d instanceof ModuleRequiresDirective) { + ModuleRequiresDirective directive = (ModuleRequiresDirective) d; + String identifier = directive.getNameAsString(); + if (directive.isStatic() && directive.isTransitive()) { + requiresStaticTransitive.add(identifier); + } else if (directive.isTransitive()) { + requiresTransitive.add(identifier); + } else if (directive.isStatic()) { + requiresStatic.add(identifier); + } else if (isRuntime(directive)) { + requiresRuntime.add(identifier); + } else { + requires.add(identifier); + } } } - return moduleLine.lastIndexOf("/*") > moduleLine.lastIndexOf("*/"); + } + + private static boolean isRuntime(ModuleRequiresDirective directive) { + return directive + .getName() + .getComment() + .map(c -> "runtime".equals(c.getContent().trim())) + .orElse(false); } @Override