You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by el...@apache.org on 2026/08/06 18:24:44 UTC
(maven-shared-jar) branch master updated: Fix #140: keep inner class references from UTF-8 pool in ImportVisitor (#149)
This is an automated email from the ASF dual-hosted git repository.
elharo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-shared-jar.git
The following commit(s) were added to refs/heads/master by this push:
new 91984bc Fix #140: keep inner class references from UTF-8 pool in ImportVisitor (#149)
91984bc is described below
commit 91984bcad70d3a1f9bdaff3b2093d81c5bc5007a
Author: Elliotte Rusty Harold <el...@users.noreply.github.com>
AuthorDate: Thu Aug 6 18:24:39 2026 +0000
Fix #140: keep inner class references from UTF-8 pool in ImportVisitor (#149)
---
.../maven/shared/jar/classes/ImportVisitor.java | 4 +--
.../shared/jar/classes/ImportVisitorTest.java | 38 ++++++++++++++++++++++
2 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java b/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java
index 7485b04..83381c5 100644
--- a/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java
+++ b/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java
@@ -47,12 +47,12 @@ public class ImportVisitor extends EmptyVisitor {
* Pattern to detect if the import is qualified and allows retrieval of the actual import name from the string via
* the group 1.
*/
- private static final Pattern QUALIFIED_IMPORT_PATTERN = Pattern.compile("L([a-zA-Z][a-zA-Z0-9\\.]+);");
+ private static final Pattern QUALIFIED_IMPORT_PATTERN = Pattern.compile("L([a-zA-Z][a-zA-Z0-9\\.$]+);");
/**
* Pattern that checks whether a string is valid UTF-8. Imports that are not are ignored.
*/
- private static final Pattern VALID_UTF8_PATTERN = Pattern.compile("^[\\(\\)\\[A-Za-z0-9;/]+$");
+ private static final Pattern VALID_UTF8_PATTERN = Pattern.compile("^[\\(\\)\\[A-Za-z0-9;/;$]+$");
/**
* Create an Import visitor.
diff --git a/src/test/java/org/apache/maven/shared/jar/classes/ImportVisitorTest.java b/src/test/java/org/apache/maven/shared/jar/classes/ImportVisitorTest.java
index 16c7f5c..6bc698c 100644
--- a/src/test/java/org/apache/maven/shared/jar/classes/ImportVisitorTest.java
+++ b/src/test/java/org/apache/maven/shared/jar/classes/ImportVisitorTest.java
@@ -18,7 +18,13 @@
*/
package org.apache.maven.shared.jar.classes;
+import javax.tools.JavaCompiler;
+import javax.tools.ToolProvider;
+
import java.io.File;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.List;
import org.apache.bcel.classfile.ClassParser;
@@ -29,8 +35,10 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
/**
* Import Visitor Test
@@ -120,4 +128,34 @@ class ImportVisitorTest extends AbstractJarAnalyzerTestCase {
assertNotNull(imports, "Import List");
assertTrue(imports.size() >= 4);
}
+
+ @Test
+ void utf8StringPoolInnerClassReferenceIsKept() throws Exception {
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+ assumeTrue(compiler != null, "requires a JDK with javac");
+
+ Path source = Files.createTempDirectory("importvisitor-src").resolve("InnerRefHolder.java");
+ Files.write(
+ source,
+ ("package org.test.innertest;\n"
+ + "public class InnerRefHolder {\n"
+ + " public static final String REF = \"org/test/innertest/Outer$Inner\";\n"
+ + "}")
+ .getBytes(StandardCharsets.UTF_8));
+
+ Path classesDir = Files.createTempDirectory("importvisitor-classes");
+ assertEquals(0, compiler.run(null, null, null, "-d", classesDir.toString(), source.toString()), "compilation");
+
+ JavaClass javaClass = new ClassParser(classesDir
+ .resolve("org/test/innertest/InnerRefHolder.class")
+ .toString())
+ .parse();
+ ImportVisitor importVisitor = new ImportVisitor(javaClass);
+ DescendingVisitor descVisitor = new DescendingVisitor(javaClass, importVisitor);
+ javaClass.accept(descVisitor);
+
+ assertTrue(
+ importVisitor.getImports().contains("org.test.innertest.Outer$Inner"),
+ "imports should keep inner class references from the UTF-8 pool");
+ }
}