javadoc crashes: class cast exception com.sun.tools.javac.code.Symtab$6
authorVladimir Petko <vladimir.petko@canonical.com>
Sat, 10 Aug 2024 08:08:49 +0000 (10:08 +0200)
committerMatthias Klose <doko@ubuntu.com>
Sat, 10 Aug 2024 08:08:49 +0000 (10:08 +0200)
Bug: https://github.com/openjdk/jdk/pull/17435
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1057500
Applied-Upstream: commit, 64c3642c57719940855b220025b33758950b3980
Last-Update: 2024-01-24

Javadoc option '--ignore-source-errors' allows generating Javadoc for the packages
that contain compilation errors.
jdk.javadoc.internal.doclets.toolkit.util.ClassTree generates a type hierarchy
for javadoc that may include error types such as class Foo extends Bar {}
where Bar is undefined.
The user still wants to generate documentation for Foo and have Bar as a text label.
For the unknown class Bar it is impossible to detect the enclosing class/file and
javadoc crashes with an exception.

Gbp-Pq: Name jdk-8242564.patch

src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolEnvironment.java
test/langtools/jdk/javadoc/doclet/testClassTree/TestClassTree.java

index a8cb10651dd605e6b08bae28bc102a2db637be9a..c9a1b0e22c65944896cacde8eff3a516836bb358 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,7 @@ import java.util.*;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.util.Elements;
+import javax.lang.model.type.TypeKind;
 import javax.tools.JavaFileManager;
 import javax.tools.JavaFileObject;
 import javax.tools.JavaFileObject.Kind;
@@ -185,6 +186,8 @@ public class ToolEnvironment {
     }
 
     public Kind getFileKind(TypeElement te) {
+        if (te.asType().getKind() == TypeKind.ERROR)
+            return Kind.OTHER;
         JavaFileObject jfo = ((ClassSymbol)te).outermostClass().classfile;
         return jfo == null ? Kind.SOURCE : jfo.getKind();
     }
index 52a0e3ff55c55d8a3908c12ef4c251f9e84eea55..778a9e762e0986023ccecd90f1582a0aba3ad396 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
 
 /*
  * @test
- * @bug      4632553 4973607 8026567
+ * @bug      4632553 4973607 8026567 8242564
  * @summary  No need to include type name (class, interface, etc.) before
  *           every single type in class tree.
  *           Make sure class tree includes heirarchy for enums and annotation
  *           types.
- * @library  ../../lib
+ *           Make sure class tree handles undefined types in the class
+ *           hierarchy.
+ * @library  /tools/lib ../../lib
  * @modules jdk.javadoc/jdk.javadoc.internal.tool
- * @build    javadoc.tester.*
+ * @build    toolbox.ToolBox javadoc.tester.*
  * @run main TestClassTree
  */
 
+import java.io.IOException;
+import java.nio.file.Path;
+
 import javadoc.tester.JavadocTester;
+import toolbox.ToolBox;
 
 public class TestClassTree extends JavadocTester {
 
+    private final ToolBox tb = new ToolBox();
+
     public static void main(String... args) throws Exception {
         var tester = new TestClassTree();
         tester.runTests();
     }
 
+    @Test
+    public void testBadPkg(Path base) throws IOException {
+        // Given badpkg package containing class ChildClass with an undefined
+        //       base class, implementing undefined interface and a defined
+        //       interface
+        Path src = base.resolve("src");
+        tb.writeJavaFiles(src,
+                """
+                    package badpkg;
+                    public class ChildClass extends ParentClass
+                        implements AnInterface, Iterable {
+
+                    }
+                    """
+        );
+
+        // When  the javadoc is generated with --ignore-source-errors option
+        javadoc("--ignore-source-errors",
+                "-d", base.resolve("badout").toString(),
+                "--no-platform-links",
+                "-sourcepath", src.toString(),
+                "badpkg");
+
+        // Then javadoc exits successfully
+        checkExit(Exit.OK);
+        // And generates html for the ChildClass
+        checkOutput("badpkg/package-tree.html", true,
+                """
+                    <li class="circle">badpkg.<a href="ChildClass.html" class="type-name-link" title="\
+                    class in badpkg">ChildClass</a> (implements java.lang.Iterable&lt;T&gt;)</li>
+                    """);
+        checkOutput("badpkg/ChildClass.html", true,
+                """
+                    <div class="type-signature"><span class="modifiers">public class </span>\
+                    <span class="element-name type-name-label">ChildClass</span>
+                    <span class="extends-implements">extends ParentClass
+                    implements java.lang.Iterable</span></div>
+                    """);
+        // And undefined interface is not present in html
+        checkOutput("badpkg/ChildClass.html", false, "AnInterface");
+    }
+
     @Test
     public void test() {
         javadoc("-d", "out",