From 43054c298f0444dab81ced794cc0e43d5db61ce2 Mon Sep 17 00:00:00 2001 From: Vladimir Petko Date: Tue, 30 Jul 2024 08:37:36 +0200 Subject: [PATCH] javadoc crashes: class cast exeception com.sun.tools.javac.code.Symtab$6 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 This is a proposed fix for JDK-8242564. 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 --- .../internal/tool/ToolEnvironment.java | 5 +- .../doclet/testClassTree/TestClassTree.java | 58 +++++++++++++++++-- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolEnvironment.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolEnvironment.java index a8cb10651..c9a1b0e22 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolEnvironment.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolEnvironment.java @@ -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(); } diff --git a/test/langtools/jdk/javadoc/doclet/testClassTree/TestClassTree.java b/test/langtools/jdk/javadoc/doclet/testClassTree/TestClassTree.java index 52a0e3ff5..778a9e762 100644 --- a/test/langtools/jdk/javadoc/doclet/testClassTree/TestClassTree.java +++ b/test/langtools/jdk/javadoc/doclet/testClassTree/TestClassTree.java @@ -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 @@ -23,26 +23,76 @@ /* * @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, + """ +
  • badpkg.ChildClass (implements java.lang.Iterable<T>)
  • + """); + checkOutput("badpkg/ChildClass.html", true, + """ +
    public class \ + ChildClass + extends ParentClass + implements java.lang.Iterable
    + """); + // And undefined interface is not present in html + checkOutput("badpkg/ChildClass.html", false, "AnInterface"); + } + @Test public void test() { javadoc("-d", "out", -- 2.30.2