diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SnippetTaglet.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SnippetTaglet.java index 93f83c5ba90c1..88769c23f26c6 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SnippetTaglet.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SnippetTaglet.java @@ -133,7 +133,7 @@ private Content snippetTagOutput(Element element, SnippetTree tag, StyledText co if (lang != null && !lang.isBlank()) { code.addStyle("language-" + lang); } - + //todo err: ambigious link (location) content.consumeBy((styles, sequence) -> { CharSequence text = Text.normalizeNewlines(sequence); if (styles.isEmpty()) { @@ -145,6 +145,7 @@ private Content snippetTagOutput(Element element, SnippetTree tag, StyledText co boolean markupEncountered = false; Set classes = new HashSet<>(); for (Style s : styles) { + // different jvm runs use a differnet salt when creating hash if (s instanceof Style.Name n) { classes.add(n.name()); } else if (s instanceof Style.Link l) { diff --git a/test/langtools/jdk/javadoc/doclet/ReproducibleSnippet/ReproducibleSnippetTest.java b/test/langtools/jdk/javadoc/doclet/ReproducibleSnippet/ReproducibleSnippetTest.java new file mode 100644 index 0000000000000..9bf78cee46049 --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/ReproducibleSnippet/ReproducibleSnippetTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2024, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8346128 8346095 + * @summary Check that snippet generation is reproducible + * @library /tools/lib ../../lib + * @modules jdk.javadoc/jdk.javadoc.internal.tool + * @build toolbox.ToolBox javadoc.tester.* + * @run main ReproducibleSnippetTest + */ + +import javadoc.tester.JavadocTester; +import toolbox.ToolBox; + +import java.nio.file.Path; + +public class ReproducibleSnippetTest extends JavadocTester { + ToolBox tb = new ToolBox(); + + public static void main(String... args) throws Exception { + var tester = new ReproducibleSnippetTest(); + tester.runTests(); + } + + @Test + public void test(Path base) throws Exception { + + Path src = base.resolve("src"); + tb.writeJavaFiles(src, + """ + package p; + public interface One { + /** + * {@code One obj1} + * {@snippet lang = java: + * // @link substring="ab" target="One#ab" : + * obj1.ab(a()); // @link substring="a" target="#a" + *} class comment + */ + void start(); + + int a(); + void with(); + + void ab(int i); + } + """); + + + javadoc("-d", + "out", + "-sourcepath", + src.toString(), + "p"); + checkExit(Exit.OK); + + checkOutput("p/One.html", false, + """ +
 obj1.a
+                        """,
+                """
+                        
 obj1." +
+                        """);
+    }
+}
diff --git a/test/langtools/jdk/javadoc/doclet/ReproducibleSnippet/ReproducibleSnippetTest.out b/test/langtools/jdk/javadoc/doclet/ReproducibleSnippet/ReproducibleSnippetTest.out
new file mode 100644
index 0000000000000..e69de29bb2d1d