Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/net/fabricmc/fernflower/api/FabricJavadocStyle.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package net.fabricmc.fernflower.api;

public enum FabricJavadocStyle {
/**
* The traditional Javadoc style (default)
*/
HTML,
/**
* The Markdown Javadoc style introduced in Java 23
*/
MARKDOWN,
}
14 changes: 13 additions & 1 deletion src/net/fabricmc/fernflower/api/IFabricJavadocProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
* Provides (optional) javadoc for Classes/Methods/Fields encountered by
* {@link org.jetbrains.java.decompiler.main.ClassWriter}.
*
* May be set as a property in the constructor of {@link org.jetbrains.java.decompiler.main.Fernflower} by using
* <p>May be set as a property in the constructor of {@link org.jetbrains.java.decompiler.main.Fernflower} by using
* the key {@code IFabricJavadocProvider.PROPERTY_NAME}
*/
public interface IFabricJavadocProvider {
Expand All @@ -20,4 +20,16 @@ public interface IFabricJavadocProvider {
String getFieldDoc(StructClass structClass, StructField structField);

String getMethodDoc(StructClass structClass, StructMethod structMethod);

default FabricJavadocStyle getClassJavadocStyle(StructClass structClass) {
return FabricJavadocStyle.HTML;
}

default FabricJavadocStyle getFieldJavadocStyle(StructClass structClass, StructField structField) {
return getClassJavadocStyle(structClass);
}

default FabricJavadocStyle getMethodJavadocStyle(StructClass structClass, StructMethod structMethod) {
return getClassJavadocStyle(structClass);
}
}
27 changes: 19 additions & 8 deletions src/org/jetbrains/java/decompiler/main/ClassWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
package org.jetbrains.java.decompiler.main;

import java.util.concurrent.atomic.AtomicBoolean;

import net.fabricmc.fernflower.api.FabricJavadocStyle;
import net.fabricmc.fernflower.api.IFabricJavadocProvider;
import org.jetbrains.java.decompiler.api.plugin.StatementWriter;
import org.jetbrains.java.decompiler.code.CodeConstants;
Expand Down Expand Up @@ -689,7 +691,7 @@ private void writeClassDefinition(ClassNode node, TextBuffer buffer, int indent)
}

if (javadocProvider != null) {
appendJavadoc(buffer, javadocProvider.getClassDoc(cl), indent);
appendJavadoc(buffer, javadocProvider.getClassJavadocStyle(cl), javadocProvider.getClassDoc(cl), indent);
}

appendAnnotations(buffer, indent, cl, -1);
Expand Down Expand Up @@ -876,7 +878,7 @@ public void writeField(ClassWrapper wrapper, StructClass cl, StructField fd, Tex
}

if (javadocProvider != null) {
appendJavadoc(buffer, javadocProvider.getFieldDoc(cl, fd), indent);
appendJavadoc(buffer, javadocProvider.getFieldJavadocStyle(cl, fd), javadocProvider.getFieldDoc(cl, fd), indent);
}
Set<String> writtenAnnotations = appendAnnotations(buffer, indent, fd, TypeAnnotation.FIELD);

Expand Down Expand Up @@ -1130,7 +1132,7 @@ public boolean writeMethod(ClassNode node, StructMethod mt, int methodIndex, Tex
}

if (javadocProvider != null) {
appendJavadoc(buffer, javadocProvider.getMethodDoc(cl, mt), indent);
appendJavadoc(buffer, javadocProvider.getMethodJavadocStyle(cl, mt), javadocProvider.getMethodDoc(cl, mt), indent);
}

Set<String> writtenAnnotations = appendAnnotations(buffer, indent, mt, TypeAnnotation.METHOD_RETURN_TYPE);
Expand Down Expand Up @@ -1786,13 +1788,22 @@ private static void appendComment(TextBuffer buffer, String comment, int indent)
buffer.appendIndent(indent).append("// $VF: ").append(comment).appendLineSeparator();
}

private static void appendJavadoc(TextBuffer buffer, String javaDoc, int indent) {
private static void appendJavadoc(TextBuffer buffer, FabricJavadocStyle javadocStyle, String javaDoc, int indent) {
if (javaDoc == null) return;
buffer.appendIndent(indent).append("/**").appendLineSeparator();
for (String s : javaDoc.split("\n")) {
buffer.appendIndent(indent).append(" * ").append(s).appendLineSeparator();
switch (javadocStyle) {
case HTML -> {
buffer.appendIndent(indent).append("/**").appendLineSeparator();
for (String s : javaDoc.split("\n")) {
buffer.appendIndent(indent).append(" * ").append(s).appendLineSeparator();
}
buffer.appendIndent(indent).append(" */").appendLineSeparator();
}
case MARKDOWN -> {
for (String s : javaDoc.split("\n")) {
buffer.appendIndent(indent).append("/// ").append(s).appendLineSeparator();
}
}
}
buffer.appendIndent(indent).append(" */").appendLineSeparator();
}

public static void appendSyntheticClassComment(StructClass cl, TextBuffer buffer) {
Expand Down
24 changes: 24 additions & 0 deletions test/org/jetbrains/java/decompiler/SingleClassesTest.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler;

import net.fabricmc.fernflower.api.FabricJavadocStyle;
import net.fabricmc.fernflower.api.IFabricJavadocProvider;
import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences;
import org.jetbrains.java.decompiler.struct.StructClass;
Expand Down Expand Up @@ -98,6 +99,29 @@ public String getMethodDoc(StructClass structClass, StructMethod structMethod) {
return "Method javadoc for '" + structMethod.getName() + "'";
}
});
registerSet("Markdown Javadoc", () -> {
register(JAVA_8, "TestMarkdownJavadoc");
}, IFabricJavadocProvider.PROPERTY_NAME, new IFabricJavadocProvider() {
@Override
public String getClassDoc(StructClass structClass) {
return "Class javadoc for '" + structClass.qualifiedName + "'";
}

@Override
public String getFieldDoc(StructClass structClass, StructField structField) {
return "Field javadoc for '" + structField.getName() + "'";
}

@Override
public String getMethodDoc(StructClass structClass, StructMethod structMethod) {
return "Method javadoc for '" + structMethod.getName() + "'";
}

@Override
public FabricJavadocStyle getClassJavadocStyle(StructClass structClass) {
return FabricJavadocStyle.MARKDOWN;
}
});
// TODO: converter renaming different on different platforms?
registerSet("Renaming", () -> registerFailable(JAVA_8, "TestRenameEntities"),
IFernflowerPreferences.BYTECODE_SOURCE_MAPPING, "1",
Expand Down
11 changes: 11 additions & 0 deletions testData/results/pkg/TestMarkdownJavadoc.dec
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package pkg;

/// Class javadoc for 'pkg/TestMarkdownJavadoc'
public class TestMarkdownJavadoc {
/// Field javadoc for 'field'
public int field;

/// Method javadoc for 'method'
public void method() {
}
}
9 changes: 9 additions & 0 deletions testData/src/java8/pkg/TestMarkdownJavadoc.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package pkg;

public class TestMarkdownJavadoc {
public int field;

public void method() {

}
}