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");
+    }
 }