diff options
Diffstat (limited to 'javadoc/src/main')
3 files changed, 0 insertions, 237 deletions
diff --git a/javadoc/src/main/java/io/github/cottonmc/cotton/gui/jd/ExperimentalTaglet.java b/javadoc/src/main/java/io/github/cottonmc/cotton/gui/jd/ExperimentalTaglet.java deleted file mode 100644 index dbd2391..0000000 --- a/javadoc/src/main/java/io/github/cottonmc/cotton/gui/jd/ExperimentalTaglet.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.github.cottonmc.cotton.gui.jd; - -import com.sun.source.doctree.DocTree; -import jdk.javadoc.doclet.Taglet; - -import java.util.List; -import java.util.Set; -import javax.lang.model.element.Element; - -public class ExperimentalTaglet implements Taglet { - @Override - public Set<Location> getAllowedLocations() { - return Set.of(Location.values()); - } - - @Override - public boolean isInlineTag() { - return false; - } - - @Override - public String getName() { - return "experimental"; - } - - @Override - public String toString(List<? extends DocTree> tags, Element element) { - return "<dt>Experimental API:</dt><dd>Might be modified or removed without prior notice until stabilised.</dd>"; - } -} diff --git a/javadoc/src/main/java/io/github/cottonmc/cotton/gui/jd/PropertyTaglet.java b/javadoc/src/main/java/io/github/cottonmc/cotton/gui/jd/PropertyTaglet.java deleted file mode 100644 index 8b7b1ec..0000000 --- a/javadoc/src/main/java/io/github/cottonmc/cotton/gui/jd/PropertyTaglet.java +++ /dev/null @@ -1,196 +0,0 @@ -package io.github.cottonmc.cotton.gui.jd; - -import com.sun.source.doctree.DocTree; -import com.sun.source.doctree.TextTree; -import com.sun.source.util.DocTrees; -import com.sun.source.util.SimpleDocTreeVisitor; -import jdk.javadoc.doclet.Doclet; -import jdk.javadoc.doclet.DocletEnvironment; -import jdk.javadoc.doclet.Taglet; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeVisitor; -import javax.lang.model.util.ElementKindVisitor8; -import javax.lang.model.util.SimpleTypeVisitor8; - -public class PropertyTaglet implements Taglet { - private static final Pattern PROPERTY_METHOD = Pattern.compile("^(.+)Property$"); - private static final String OBSERVABLE_PROPERTY = "io.github.cottonmc.cotton.gui.widget.data.ObservableProperty"; - private static final Set<Modifier> VISIBILITY_MODIFIERS = Set.of(Modifier.PUBLIC, Modifier.PROTECTED); - private DocTrees docTrees; - - @Override - public void init(DocletEnvironment env, Doclet doclet) { - docTrees = env.getDocTrees(); - } - - @Override - public Set<Location> getAllowedLocations() { - return Set.of(Location.TYPE); - } - - @Override - public boolean isInlineTag() { - return false; - } - - @Override - public String getName() { - return "properties"; - } - - @Override - public String toString(List<? extends DocTree> tags, Element element) { - if (!((element.getKind().isClass() || element.getKind().isInterface()) && element instanceof TypeElement type)) { - throw new IllegalArgumentException("Not a type: " + element); - } - - List<PropertyEntry> myEntries = scan(type); - StringBuilder builder = new StringBuilder(); - - if (!myEntries.isEmpty()) { - builder.append("<section class=\"summary\"><ul class=\"summary-list\"><li><section class=\"property-summary\">"); - builder.append("<h2>Property Summary</h2>"); - builder.append("<div class=\"caption\"><span>Properties</span></div>"); - builder.append("<div class=\"summary-table three-column-summary\">"); - builder.append("<div class=\"table-header col-first\">Modifier and Type</div>"); - builder.append("<div class=\"table-header col-second\">Property</div>"); - builder.append("<div class=\"table-header col-last\">Description</div>"); - - for (int i = 0; i < myEntries.size(); i++) { - PropertyEntry entry = myEntries.get(i); - String rowClass = (i % 2 == 0) ? "even-row-color" : "odd-row-color"; - builder.append("<div class=\"col-first ").append(rowClass).append("\"><code>").append(entry.visibility); - if (!entry.type.isEmpty()) { - builder.append(' ').append(entry.type); - } - builder.append("</code></div>"); - builder.append("<div class=\"col-second ").append(rowClass).append("\"><code><span class=\"member-name-link\">"); - builder.append("<a href=\"#").append(entry.name).append("Property()\">").append(entry.name).append("</a>"); - builder.append("</span></code></div>"); - builder.append("<div class=\"col-last block ").append(rowClass).append("\">").append(entry.doc).append("</div>"); - } - - builder.append("</div></section></li></ul></section>"); - } - - Map<String, List<PropertyEntry>> inheritedProperties = new LinkedHashMap<>(); - scanParents(type, inheritedProperties); - - inheritedProperties.forEach((name, entries) -> { - if (!entries.isEmpty()) { - builder.append("<dt>Properties from <code>").append(name).append("</code></dt>"); - builder.append("<dd>"); - builder.append(entries.stream().map(entry -> "<code>" + entry.name + "</code>").collect(Collectors.joining(", "))); - builder.append("</dd>"); - } - }); - - return builder.toString(); - } - - private static String getClassName(TypeElement cl) { - return cl.getQualifiedName().toString(); - } - - private List<PropertyEntry> scan(TypeElement cl) { - // Java classes don't have LibGui properties (yet? 😳) - if (getClassName(cl).startsWith("java.")) return List.of(); - - return cl.getEnclosedElements().stream() - .filter(el -> el.getKind() == ElementKind.METHOD) - .map(el -> (ExecutableElement) el) - .map(Util.zip(el -> el.getReturnType().accept(new ObservableTypeProbe(), null))) - .filter(pair -> pair.second().isPresent()) - .map(pair -> { - var el = pair.first(); - Modifier visibility = el.getModifiers().stream() - .filter(VISIBILITY_MODIFIERS::contains) - .findAny() - .orElse(null); - if (visibility == null) return null; // no privates or package-privates - Matcher matcher = PROPERTY_METHOD.matcher(el.getSimpleName()); - - if (matcher.matches()) { - String doc = docTrees.getDocCommentTree(el).getFirstSentence().stream() - .map(tree -> tree.accept(new SimpleDocTreeVisitor<String, Void>() { - @Override - public String visitText(TextTree node, Void o) { - return node.getBody(); - } - }, null)) - .filter(Objects::nonNull) - .findAny().orElse(""); - - return new PropertyEntry(visibility, pair.second().get(), matcher.group(1), doc); - } - - return null; - }) - .filter(Objects::nonNull) - .sorted() - .collect(Collectors.toList()); - } - - private void scanParents(TypeElement cl, Map<String, List<PropertyEntry>> inheritedProperties) { - TypeVisitor<Void, Void> typeVisitor = new SimpleTypeVisitor8<>() { - @Override - public Void visitDeclared(DeclaredType t, Void o) { - return t.asElement().accept(new ElementKindVisitor8<>() { - @Override - public Void visitType(TypeElement e, Object o) { - String fqn = e.getQualifiedName().toString(); - inheritedProperties.put(fqn, scan(e)); - scanParents(e, inheritedProperties); - return null; - } - }, null); - } - }; - - cl.getSuperclass().accept(typeVisitor, null); - cl.getInterfaces().forEach(itf -> itf.accept(typeVisitor, null)); - } - - private static final class ObservableTypeProbe extends SimpleTypeVisitor8<Optional<String>, Void> { - ObservableTypeProbe() { - super(Optional.empty()); - } - - @Override - public Optional<String> visitDeclared(DeclaredType t, Void v) { - Element type = t.asElement(); - - if (type.getKind() == ElementKind.CLASS && ((TypeElement) type).getQualifiedName().contentEquals(OBSERVABLE_PROPERTY)) { - if (!t.getTypeArguments().isEmpty()) { - return Optional.of(t.getTypeArguments().get(0).toString()); - } else { - return Optional.of(""); - } - } - - return Optional.empty(); - } - } - - private record PropertyEntry(Modifier visibility, String type, String name, String doc) implements Comparable<PropertyEntry> { - @Override - public int compareTo(PropertyEntry o) { - return name.compareTo(o.name); - } - } -} diff --git a/javadoc/src/main/java/io/github/cottonmc/cotton/gui/jd/Util.java b/javadoc/src/main/java/io/github/cottonmc/cotton/gui/jd/Util.java deleted file mode 100644 index 775de4d..0000000 --- a/javadoc/src/main/java/io/github/cottonmc/cotton/gui/jd/Util.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.github.cottonmc.cotton.gui.jd; - -import java.util.function.Function; - -public final class Util { - public static <A, B> Function<A, Pair<A, B>> zip(Function<A, B> transform) { - return a -> new Pair<>(a, transform.apply(a)); - } - - public record Pair<A, B>(A first, B second) {} -} |