From d3436274a0ea902243241b8edd26747f8748202d Mon Sep 17 00:00:00 2001 From: Jack Manning Date: Tue, 9 Dec 2025 21:04:08 -0500 Subject: [PATCH 01/16] WIP Vitepress --- build.gradle | 32 +- .../wagyourtail/doclet/mddoclet/Group.java | 7 + .../xyz/wagyourtail/doclet/mddoclet/Main.java | 139 ++++ .../doclet/mddoclet/options/Links.java | 54 ++ .../doclet/mddoclet/options/McVersion.java | 41 + .../doclet/mddoclet/parsers/ClassParser.java | 720 ++++++++++++++++++ docs/vitepress/.vitepress/config.ts | 7 + 7 files changed, 999 insertions(+), 1 deletion(-) create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Group.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Main.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/options/Links.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/options/McVersion.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java create mode 100644 docs/vitepress/.vitepress/config.ts diff --git a/build.gradle b/build.gradle index 554f10a88..49d3a68c4 100644 --- a/build.gradle +++ b/build.gradle @@ -94,10 +94,40 @@ gradle.projectsEvaluated { } } + tasks.register('generateVitepressDoc', Javadoc) { + group = 'documentation' + description = 'Generates the vitepress documentation for the project' + source(documentationSources) + classpath = documentationClasspath + destinationDir = new File(docsBuildDir, 'vitepress') + options.doclet = 'xyz.wagyourtail.doclet.mddoclet.Main' + options.docletpath = files(docletJarFile) +// (options as CoreJavadocOptions).JFlags.add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005".toString()) + (options as CoreJavadocOptions).addStringOption('v', project.version.toString()) + (options as CoreJavadocOptions).addStringOption('mcv', providers.gradleProperty('minecraft_version').get()) + (options as StandardJavadocDocletOptions).links( + 'https://docs.oracle.com/javase/8/docs/api/', + 'https://www.javadoc.io/doc/org.slf4j/slf4j-api/1.7.30/', + 'https://javadoc.io/doc/com.neovisionaries/nv-websocket-client/latest/' + ) + } + + tasks.register('copyVitepressDoc', Copy) { + group = 'documentation' + description = 'Copies the vitepress documentation to the build folder' + dependsOn('generateVitepressDoc') + from(rootProject.file('docs/vitepress')) + into(new File(docsBuildDir, 'vitepress')) + inputs.property('version', project.version.toString()) + filesMatching('index.html') { + expand(version: project.version.toString()) + } + } + tasks.register('createDistDocs', Copy) { group = 'distribution' description = 'Packages generated documentation into the dist directory' - dependsOn('prepareDist', 'copyPyDoc', 'copyTSDoc', 'copyWebDoc') + dependsOn('prepareDist', 'copyPyDoc', 'copyTSDoc', 'copyWebDoc', 'copyVitepressDoc') from(docsBuildDir) into(distDirFile) } diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Group.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Group.java new file mode 100644 index 000000000..4e12781d4 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Group.java @@ -0,0 +1,7 @@ +package xyz.wagyourtail.doclet.mddoclet; + +public enum Group { + Library, + Event, + Class +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Main.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Main.java new file mode 100644 index 000000000..2e2a8e2a0 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Main.java @@ -0,0 +1,139 @@ +package xyz.wagyourtail.doclet.mddoclet; + +import com.sun.source.util.DocTrees; +import jdk.javadoc.doclet.Doclet; +import jdk.javadoc.doclet.DocletEnvironment; +import jdk.javadoc.doclet.Reporter; +import org.jetbrains.annotations.NotNull; +import xyz.wagyourtail.FileHandler; +import xyz.wagyourtail.doclet.DocletIgnore; +import xyz.wagyourtail.doclet.options.IgnoredItem; +import xyz.wagyourtail.doclet.options.OutputDirectory; +import xyz.wagyourtail.doclet.options.Version; +import xyz.wagyourtail.doclet.mddoclet.options.Links; +import xyz.wagyourtail.doclet.mddoclet.options.McVersion; +import xyz.wagyourtail.doclet.mddoclet.parsers.ClassParser; + +import javax.lang.model.SourceVersion; +import javax.lang.model.element.*; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; +import javax.tools.Diagnostic; +import java.io.File; +import java.io.IOException; +import java.util.*; + +public class Main implements Doclet { + public static Reporter reporter; + public static String mappingViewerURL; + public static Elements elementUtils; + public static DocTrees treeUtils; + public static Types types; + public static Set elements; + public static Map internalClasses = new LinkedHashMap<>(); + + @Override + public void init(Locale locale, Reporter reporter) { + Main.reporter = reporter; + } + + @Override + public String getName() { + return "VitePressDoc Generator"; + } + + @Override + public Set getSupportedOptions() { + return Set.of( + new Version(), + new McVersion(), + new OutputDirectory(), + new Links(), + new IgnoredItem("-doctitle", 1), + new IgnoredItem("-notimestamp", 0), + new IgnoredItem("-windowtitle", 1) + ); + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.RELEASE_16; + } + + @Override + public boolean run(DocletEnvironment environment) { + mappingViewerURL = "https://wagyourtail.xyz/Projects/MinecraftMappingViewer/App?mapping=INTERMEDIARY,YARN&version=" + McVersion.mcVersion + "&search="; + elements = environment.getIncludedElements(); + treeUtils = environment.getDocTrees(); + types = environment.getTypeUtils(); + elementUtils = environment.getElementUtils(); + + elements = new HashSet<>(elements.stream().filter(element -> !shouldIgnore(element)).toList()); + + File outDir = new File(OutputDirectory.outputDir, Version.version); + + try { + if (!outDir.exists() && !outDir.mkdirs()) { + reporter.print(Diagnostic.Kind.ERROR, "Failed to create version dir\n"); + return false; + } + + //create package-list + StringBuilder pkgList = new StringBuilder(); + elements.stream().filter(e -> e.getKind() == ElementKind.PACKAGE).map(e -> (PackageElement) e).forEach(e -> { + if (Links.externalPackages.containsKey(e.getQualifiedName().toString())) { + return; + } + pkgList.append(e.getQualifiedName()).append("\n"); + }); + pkgList.setLength(pkgList.length() - 1); + new FileHandler(new File(outDir, "package-list")).write(pkgList.toString()); + + elements.stream().filter(e -> e instanceof TypeElement).map(e -> (TypeElement) e).forEach(e -> { + AnnotationMirror mirror = e.getAnnotationMirrors().stream().filter(a -> a.getAnnotationType().asElement().getSimpleName().toString().equals("Event")).findFirst().orElse(null); + //Event + if (mirror != null) { + internalClasses.put(e, new ClassParser(e, Group.Event, getAnnotationValue("value", mirror).toString())); + return; + } + + mirror = e.getAnnotationMirrors().stream().filter(a -> a.getAnnotationType().asElement().getSimpleName().toString().equals("Library")).findFirst().orElse(null); + //Library + if (mirror != null) { + internalClasses.put(e, new ClassParser(e, Group.Library, getAnnotationValue("value", mirror).toString())); + return; + } + + internalClasses.put(e, new ClassParser(e, Group.Class, null)); + }); + + for (ClassParser value : internalClasses.values()) { + File out = new File(outDir, value.getPathPart() + ".md"); + File parent = out.getParentFile(); + if (!parent.exists() && !parent.mkdirs()) { + reporter.print(Diagnostic.Kind.ERROR, "Failed to create package dir " + parent + "\n"); + return false; + } + new FileHandler(out).write(value.generateMarkdown()); + } + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } + + public static Object getAnnotationValue(String key, AnnotationMirror annotation) { + for (Map.Entry el : annotation.getElementValues().entrySet()) { + if (el.getKey().getSimpleName().toString().equals(key)) { + return el.getValue().getValue(); + } + } + return null; + } + + private static boolean shouldIgnore(@NotNull Element e) { + return e.getAnnotation(DocletIgnore.class) != null; + } + +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/options/Links.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/options/Links.java new file mode 100644 index 000000000..5d6e6db83 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/options/Links.java @@ -0,0 +1,54 @@ +package xyz.wagyourtail.doclet.mddoclet.options; + +import jdk.javadoc.doclet.Doclet; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Links implements Doclet.Option { + public static Map externalPackages = new HashMap<>(); + + @Override + public int getArgumentCount() { + return 1; + } + + @Override + public String getDescription() { + return "link external javadoc"; + } + + @Override + public Kind getKind() { + return Kind.STANDARD; + } + + @Override + public List getNames() { + return List.of("-link"); + } + + @Override + public String getParameters() { + return ""; + } + + @Override + public boolean process(String option, List arguments) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(new URL(arguments.get(0) + "package-list").openStream()))) { + String line; + while ((line = reader.readLine()) != null) { + externalPackages.put(line, arguments.get(0) + "index.html?" + line.replaceAll("\\.", "/") + "/"); + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/options/McVersion.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/options/McVersion.java new file mode 100644 index 000000000..1431ca28d --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/options/McVersion.java @@ -0,0 +1,41 @@ +package xyz.wagyourtail.doclet.mddoclet.options; + +import jdk.javadoc.doclet.Doclet; + +import java.util.List; + +public class McVersion implements Doclet.Option { + public static String mcVersion; + + @Override + public int getArgumentCount() { + return 1; + } + + @Override + public String getDescription() { + return "Minecraft Version Number"; + } + + @Override + public Kind getKind() { + return Kind.STANDARD; + } + + @Override + public List getNames() { + return List.of("-mcv", "--mcversion"); + } + + @Override + public String getParameters() { + return ""; + } + + @Override + public boolean process(String option, List arguments) { + mcVersion = arguments.get(0); + return true; + } + +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java new file mode 100644 index 000000000..bda064167 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java @@ -0,0 +1,720 @@ +package xyz.wagyourtail.doclet.mddoclet.parsers; + +import com.sun.source.doctree.*; +import com.sun.source.util.DocTreePath; +import org.jetbrains.annotations.NotNull; +import xyz.wagyourtail.Pair; +import xyz.wagyourtail.doclet.DocletIgnore; +import xyz.wagyourtail.doclet.mddoclet.Group; +import xyz.wagyourtail.doclet.mddoclet.Main; +import xyz.wagyourtail.doclet.mddoclet.options.Links; + +import javax.lang.model.element.*; +import javax.lang.model.type.*; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ClassParser { + private final Group group; + private final String alias; + public TypeElement type; + + public ClassParser(TypeElement type, Group group, String alias) { + this.type = type; + this.group = group; + this.alias = alias; + } + + /** + * @return class name with $ for inner class + */ + private static String getClassName(TypeElement type) { + StringBuilder s = new StringBuilder(type.getSimpleName()); + Element t2 = type.getEnclosingElement(); + while (t2.getKind() == ElementKind.INTERFACE || t2.getKind() == ElementKind.CLASS) { + s.insert(0, t2.getSimpleName() + "$"); + t2 = t2.getEnclosingElement(); + } + return s.toString(); + } + + /** + * @return package name with . separators + */ + private static String getPackage(TypeElement type) { + Element t2 = type; + while (t2.getKind() != ElementKind.PACKAGE) t2 = t2.getEnclosingElement(); + + return ((PackageElement) t2).getQualifiedName().toString(); + } + + public String getPathPart() { + return getPackage(type).replaceAll("\\.", "/") + "/" + getClassName(type).replaceAll("\\$", "."); + } + + /** + * nothing much + * + * @return up dir string + */ + private String getUpDir(int extra) { + StringBuilder s = new StringBuilder(); + for (String ignored : getPackage(type).split("\\.")) { + s.append("../"); + } + s.append("../".repeat(Math.max(0, extra))); + return s.toString(); + } + + public String generateMarkdown() { + StringBuilder builder = new StringBuilder(); + + builder.append("# ").append(getClassName(type)).append("\n\n"); + builder.append(String.format("**Full Class Name:** `%s.%s`", getPackage(type), getClassName(type))).append("\n\n"); + StringBuilder desc = getDescription(type.getEnclosingElement()); + builder.append(desc.isEmpty() ? "TODO: No description supplied" : desc); + if (group == Group.Library) { + // TODO: Don't use class name, get actual var name + builder.append(String.format("Accessible in scripts via the global `%s` variable.", getClassName(type))); + } + builder.append("\n\n"); + + // Constructors + if (group != Group.Library) { + List constructors = type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.CONSTRUCTOR).toList(); + + if (!constructors.isEmpty()) { + builder.append("## Constructors\n\n"); + } + + constructors.forEach(el -> { + if (!el.getModifiers().contains(Modifier.PUBLIC)) { + return; + } +// if (firstFlag.get()) { +// firstFlag.set(false); +// builder.append(new XMLBuilder("h3", true, true).append("Constructors")); +// XMLBuilder con = new XMLBuilder("div").setClass("constructorDoc"); +// builder.append(con); +// constructors.set(con); +// } +// constructors.get().append(parseConstructor(el)); + + builder.append(parseConstructor((ExecutableElement) el)); + }); + } + + // Methods + builder.append("## Methods\n\n"); + + return builder.toString(); + } + +// private XMLBuilder parseClass() { +// XMLBuilder builder = new XMLBuilder("main").setClass("classDoc"); +// XMLBuilder subClasses; +// builder.append(subClasses = new XMLBuilder("div").setId("subClasses")); +// for (Element subClass : Main.elements.stream().filter(e -> { +// if (e.getKind().isClass() || e.getKind().isInterface()) { +// return Main.types.isAssignable(e.asType(), Main.types.getDeclaredType(type)) && !e.equals(type); +// } +// return false; +// }).collect(Collectors.toList())) { +// subClasses.append(parseType(subClass.asType()), " "); +// } +// XMLBuilder cname; +// builder.append(cname = new XMLBuilder("h2", true, true).setClass("classTitle").append((getPackage(type)), ".", getClassName(type))); +// +// List params = type.getTypeParameters(); +// if (params != null && !params.isEmpty()) { +// cname.append("<"); +// for (TypeParameterElement param : params) { +// cname.append(parseType(param.asType()), ", "); +// } +// cname.pop(); +// cname.append(">"); +// } +// +// builder.append(createFlags(type, false)); +// TypeMirror sup = type.getSuperclass(); +// List ifaces = type.getInterfaces(); +// XMLBuilder ext; +// builder.append(ext = new XMLBuilder("h4", true, true).addStringOption("class", "classExtends")); +// if (sup != null && !sup.toString().equals("java.lang.Object") && !sup.getKind().equals(TypeKind.NONE)) { +// ext.append("extends ", parseType(sup)); +// } +// if (!ifaces.isEmpty()) { +// ext.append(" implements "); +// for (TypeMirror iface : ifaces) { +// ext.append(parseType(iface), " "); +// } +// } +// +// builder.append(getSince(type)); +// builder.append(getDescription(type)); +// +// AtomicBoolean firstFlag = new AtomicBoolean(true); +// AtomicReference constructors = new AtomicReference<>(); +// //CONSTRUCTORS +// if (!group.equals("Library")) { +// type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.CONSTRUCTOR).forEach(el -> { +// if (!el.getModifiers().contains(Modifier.PUBLIC)) { +// return; +// } +// if (firstFlag.get()) { +// firstFlag.set(false); +// builder.append(new XMLBuilder("h3", true, true).append("Constructors")); +// XMLBuilder con = new XMLBuilder("div").setClass("constructorDoc"); +// builder.append(con); +// constructors.set(con); +// } +// constructors.get().append(parseConstructor((ExecutableElement) el)); +// }); +// } +// +// XMLBuilder shorts; +// builder.append(shorts = new XMLBuilder("div").setClass("shortFieldMethods")); +// +// AtomicReference fieldShorts = new AtomicReference<>(); +// AtomicReference fields = new AtomicReference<>(); +// +// firstFlag.set(true); +// type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.FIELD || e.getKind() == ElementKind.ENUM_CONSTANT).forEach(el -> { +// if (!el.getModifiers().contains(Modifier.PUBLIC)) { +// return; +// } +// if (firstFlag.get()) { +// firstFlag.set(false); +// +// builder.append(new XMLBuilder("h3", true, true).append("Fields")); +// +// XMLBuilder f = new XMLBuilder("div").setClass("fieldDoc"); +// builder.append(f); +// XMLBuilder fs = new XMLBuilder("div").setClass("fieldShorts").append(new XMLBuilder("h4").append("Fields")); +// shorts.append(fs); +// +// fields.set(f); +// fieldShorts.set(fs); +// } +// +// fields.get().append(parseField(el)); +// fieldShorts.get().append( +// new XMLBuilder("div").setClass("shortField shortClassItem").append( +// new XMLBuilder("a", true, true).addStringOption("href", getURL(el).getKey()).append(memberName(el)), +// createFlags(el, true) +// ) +// ); +// }); +// +// AtomicReference methodShorts = new AtomicReference<>(); +// AtomicReference methods = new AtomicReference<>(); +// +// firstFlag.set(true); +// type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.METHOD).forEach(el -> { +// if (!el.getModifiers().contains(Modifier.PUBLIC)) { +// return; +// } +// if (firstFlag.get()) { +// firstFlag.set(false); +// +// builder.append(new XMLBuilder("h3", true, true).append("Methods")); +// +// XMLBuilder m = new XMLBuilder("div").setClass("methodDoc"); +// builder.append(m); +// XMLBuilder ms = new XMLBuilder("div").setClass("methodShorts").append(new XMLBuilder("h4").append("Methods")); +// shorts.append(ms); +// +// methods.set(m); +// methodShorts.set(ms); +// } +// methods.get().append(parseMethod((ExecutableElement) el)); +// methodShorts.get().append( +// new XMLBuilder("div").setClass("shortMethod shortClassItem").append( +// new XMLBuilder("a", true, true).addStringOption("href", getURL(el).getKey()).append(memberName(el)), +// createFlags(el, true) +// ) +// ); +// }); +// +// return builder; +// } +// + private StringBuilder parseConstructor(ExecutableElement element) { + StringBuilder builder = new StringBuilder(); + + builder.append(String.format("### `new %s(%s)`", + getClassName((TypeElement) element.getEnclosingElement()), + createTitleParams(element))) + .append("\n\n"); + + builder.append(createFlags(element)); + builder.append(getSince(element)); + builder.append(getDescription(element)); + +// StringBuilder paramTable = createParamTable(element); +// if (paramTable != null) { +// builder.append(paramTable); +// } + + +// XMLBuilder constructor = new XMLBuilder("div").setClass("constructor classItem").setId(memberId(element)); +// constructor.append(new XMLBuilder("h4").setClass("constructorTitle classItemTitle").append( +// "new ", getClassName((TypeElement) element.getEnclosingElement()), "(", +// createTitleParams(element).setClass("constructorParams"), +// ")" +// )); +// constructor.append(createFlags(element, false)); +// constructor.append(getSince(element)); +// +// constructor.append(new XMLBuilder("div").setClass("constructorDesc classItemDesc") +// .append(getDescription(element))); +// +// XMLBuilder paramTable = createParamTable(element); +// if (paramTable != null) { +// constructor.append(paramTable); +// } + + return builder; + } +// +// private XMLBuilder parseMethod(ExecutableElement element) { +// XMLBuilder method = new XMLBuilder("div").setClass("method classItem").setId(memberId(element)); +// XMLBuilder methodTitle; +// method.append(methodTitle = new XMLBuilder("h4", true).setClass("methodTitle classItemTitle").append( +// ".", element.getSimpleName() +// )); +// +// List params = element.getTypeParameters(); +// if (params.size() > 0) { +// methodTitle.append("<"); +// for (TypeParameterElement param : params) { +// methodTitle.append(parseType(param.asType()), ", "); +// } +// methodTitle.pop(); +// methodTitle.append(">"); +// } +// +// methodTitle.append("(", +// createTitleParams(element).setClass("methodParams"), +// ")" +// ); +// method.append(createFlags(element, false)); +// method.append(getSince(element)); +// +// method.append(new XMLBuilder("div").setClass("methodDesc classItemDesc").append(getDescription(element))); +// +// XMLBuilder paramTable = createParamTable(element); +// if (paramTable != null) { +// method.append(paramTable); +// } +// +// method.append(new XMLBuilder("div").setClass("methodReturn classItemType").append( +// new XMLBuilder("h5", true, true).setClass("methodReturnTitle classItemTypeTitle").append( +// "Returns: ", parseType(element.getReturnType()) +// ), +// getReturnDescription(element).setClass("methodReturnDesc classItemTypeDesc") +// )); +// +// return method; +// } +// +// private XMLBuilder getReturnDescription(ExecutableElement element) { +// DocCommentTree dct = Main.treeUtils.getDocCommentTree(element); +// if (dct == null) { +// return new XMLBuilder("p"); +// } +// ReturnTree t = (ReturnTree) dct.getBlockTags().stream().filter(e -> e.getKind() == DocTree.Kind.RETURN).findFirst().orElse(null); +// if (t == null) { +// return new XMLBuilder("p"); +// } +// return createDescription(element, t.getDescription()); +// } + + private StringBuilder createTitleParams(ExecutableElement element) { + StringBuilder builder = new StringBuilder(); + + for (VariableElement parameter : element.getParameters()) { + builder.append(parameter.getSimpleName().toString()); + builder.append(", "); + } + if (!element.getParameters().isEmpty()) { + builder.delete(builder.length() - ", ".length(), builder.length()); + } + + return builder; + } + +// private XMLBuilder createParamTable(ExecutableElement element) { +// List params = element.getParameters(); +// if (params == null || params.isEmpty()) { +// return null; +// } +// XMLBuilder body; +// XMLBuilder table = new XMLBuilder("table").setClass("paramTable").append( +// new XMLBuilder("thead").append( +// new XMLBuilder("th", true, true).append("Parameter"), +// new XMLBuilder("th", true, true).append("Type"), +// new XMLBuilder("th", true, true).append("Description") +// ), +// body = new XMLBuilder("tbody") +// ); +// Map paramDescMap = getParamDescriptions(element); +// for (VariableElement param : params) { +// body.append(new XMLBuilder("tr").append( +// new XMLBuilder("td", true, true).append(param.getSimpleName()), +// new XMLBuilder("td", true, true).append(parseType(param.asType())), +// new XMLBuilder("td", true, true).append(paramDescMap.get(param.getSimpleName().toString())) +// )); +// } +// return table; +// } +// +// private XMLBuilder parseField(Element element) { +// XMLBuilder field = new XMLBuilder("div").setClass("field classItem").setId(memberId(element)); +// field.append(new XMLBuilder("h4", true).setClass("classItemTitle").append( +// ".", memberName(element) +// )); +// field.append(createFlags(element, false)); +// field.append(getSince(element)); +// +// field.append(new XMLBuilder("div").setClass("fieldDesc classItemDesc").append(getDescription(element))); +// +// field.append(new XMLBuilder("div").setClass("fieldReturn classItemType").append( +// new XMLBuilder("h5", true, true).setClass("fieldTypeTitle classItemTypeTitle").append( +// "Type: ", parseType(element.asType()) +// ) +// )); +// +// return field; +// } +// +// public Map getParamDescriptions(ExecutableElement element) { +// Map paramMap = new HashMap<>(); +// DocCommentTree comment = Main.treeUtils.getDocCommentTree(element); +// if (comment == null) { +// return paramMap; +// } +// comment.getBlockTags().stream().filter(e -> e.getKind() == DocTree.Kind.PARAM).forEach(e -> paramMap.put(((ParamTree) e).getName().getName().toString(), createDescription(element, ((ParamTree) e).getDescription()))); +// return paramMap; +// } + + private StringBuilder getSince(Element element) { + DocCommentTree tree = Main.treeUtils.getDocCommentTree(element); + SinceTree since = tree == null ? null : (SinceTree) tree.getBlockTags().stream().filter(e -> e.getKind().equals(DocTree.Kind.SINCE)).findFirst().orElse(null); + if (since == null) { + return new StringBuilder(); + } + + return new StringBuilder(String.format("**Since:** %s", since.getBody())).append("\n\n"); + } + + private StringBuilder getDescription(Element element) { + DocCommentTree tree = Main.treeUtils.getDocCommentTree(element); + + StringBuilder builder = createDescription(element, tree == null ? List.of() : tree.getFullBody()); + if (builder.isEmpty()) { + return builder; + } + + return builder.append("\n\n"); + } + + private StringBuilder createDescription(Element el, List inlinedoc) { + StringBuilder builder = new StringBuilder(); + for (DocTree docTree : inlinedoc) { + switch (docTree.getKind()) { + case LINK, LINK_PLAIN -> { + Element ele = Main.treeUtils.getElement(new DocTreePath(new DocTreePath(Main.treeUtils.getPath(el), Main.treeUtils.getDocCommentTree(el)), ((LinkTree) docTree).getReference())); + if (ele != null) { + StringBuilder linkBuilder = new StringBuilder(); + Pair url = getURL(ele); + + // = new StringBuilder("a", true).addStringOption("href", url.getKey()) + + linkBuilder.append(String.format("[%s](%s)", "", url.getKey())); + + if (List.of(ElementKind.INTERFACE, ElementKind.CLASS, ElementKind.ANNOTATION_TYPE, ElementKind.ENUM).contains(ele.getKind())) { + linkBuilder.append(getClassName((TypeElement) ele)); + } else { +// linkBuilder.append(getClassName((TypeElement) ele.getEnclosingElement()), "#", ele.toString()); + } + +// if (url.getValue()) { +// linkBuilder.addStringOption("target", "_blank"); +// } +// if (linkBuilder.options.get("href").equals("\"\"")) { +// linkBuilder.setClass("type deadType"); +// } else { +// linkBuilder.setClass("type"); +// } + + builder.append(linkBuilder); + } else { + builder.append(((LinkTree) docTree).getReference().getSignature()); + } + } + case CODE -> + builder.append(((LiteralTree) docTree).getBody()); + default -> builder.append(docTree); + } + } + return builder; + } +// +// private XMLBuilder parseType(TypeMirror type) { +// XMLBuilder builder = new XMLBuilder("div", true).setClass("typeParameter"); +// XMLBuilder typeLink; +// switch (type.getKind()) { +// case BOOLEAN, BYTE, SHORT, INT, LONG, CHAR, FLOAT, DOUBLE, VOID, NONE -> { +// //isPrimitive +// builder.append(typeLink = new XMLBuilder("p", true).append(type)); +// typeLink.setClass("type primitiveType"); +// } +// case ARRAY -> { +// return parseType(((ArrayType) type).getComponentType()).append("[]"); +// } +// case DECLARED -> { +// Pair url = getURL(((DeclaredType) type).asElement()); +// builder.append(typeLink = new XMLBuilder("a", true).addStringOption("href", url.getKey()).append(getClassName((TypeElement) ((DeclaredType) type).asElement()))); +// +// if (url.getValue()) { +// typeLink.addStringOption("target", "_blank"); +// } +// if (typeLink.options.get("href").equals("\"\"")) { +// typeLink.setClass("type deadType"); +// } else { +// typeLink.setClass("type"); +// } +// +// List params = ((DeclaredType) type).getTypeArguments(); +// if (params != null && !params.isEmpty()) { +// builder.append("<"); +// for (TypeMirror param : params) { +// if (param instanceof TypeVariable typeVariable && typeVariable.getUpperBound().equals(type)) { +// builder.append(typeLink = new XMLBuilder("p", true)); +// typeLink.setClass("type primitiveType"); +// typeLink.append(typeVariable.asElement().getSimpleName()); +// builder.append(", "); +// } else { +// builder.append(parseType(param), ", "); +// } +// } +// builder.pop(); +// builder.append(">"); +// } +// } +// case TYPEVAR -> { +// builder.append(typeLink = new XMLBuilder("p", true)); +// typeLink.setClass("type primitiveType"); +// typeLink.append(((TypeVariable) type).asElement().getSimpleName()); +// TypeMirror ext = ((TypeVariable) type).getUpperBound(); +// if (!ext.toString().equals("java.lang.Object")) { +// typeLink.append( +// new XMLBuilder("p").setClass("classExtends").append(" extends "), +// parseType(ext) +// ); +// } +// } +// case WILDCARD -> { +// builder.append(typeLink = new XMLBuilder("p", true)); +// typeLink.setClass("type primitiveType"); +// typeLink.append("?"); +// } +// } +// return builder; +// } + + /** + * + * @param type The element to get the url to + * @return a pair containing: + * 1. the resolved URL, or "" if the element has no URL + * 2. true if the URL should open in a new tab, false otherwise + */ + private Pair getURL(Element type) { + if (type.asType().getKind().isPrimitive()) { + return new Pair<>("", false); + } + + Element clazz = type; + while (!(clazz instanceof TypeElement)) { + clazz = clazz.getEnclosingElement(); + } + + if (!clazz.equals(this.type)) { + String pkg = getPackage((TypeElement) clazz); + if (Main.internalClasses.containsKey(clazz)) { + StringBuilder s = new StringBuilder(getUpDir(0)); + s.append(Main.internalClasses.get(clazz).getPathPart()).append(".html"); + if (type != clazz) { + s.append("#").append(memberId(type)); + } + return new Pair<>(s.toString(), false); + } else if (Links.externalPackages.containsKey(pkg)) { + return new Pair<>(Links.externalPackages.get(pkg) + getClassName((TypeElement) clazz) + ".html", true); + } else if (pkg.startsWith("com.mojang") || pkg.startsWith("net.minecraft")) { + return new Pair<>(Main.mappingViewerURL + pkg.replaceAll("\\.", "/") + "/" + getClassName((TypeElement) clazz), true); + } else { + return new Pair<>("", false); + } + } else { + StringBuilder s = new StringBuilder(); + s.append("#"); + if (type != clazz) { + s.append(memberId(type)); + } + return new Pair<>(s.toString(), false); + } + } + + private static String memberId(Element member) { + StringBuilder s = new StringBuilder(); + switch (member.getKind()) { + case ENUM_CONSTANT, FIELD -> s.append(member.getSimpleName()); + case CONSTRUCTOR, METHOD -> { + if (member.getKind() == ElementKind.METHOD) { + s.append(member.getSimpleName()); + } else { + s.append("constructor"); + } + for (VariableElement parameter : ((ExecutableElement) member).getParameters()) { + s.append("-").append(getTypeMirrorName(parameter.asType())); + } + s.append("-"); + } + case TYPE_PARAMETER -> { + } + default -> throw new UnsupportedOperationException(String.valueOf(member.getKind())); + } + + return s.toString(); + } + + private static String memberName(Element member) { + StringBuilder s = new StringBuilder(); + switch (member.getKind()) { + case ENUM_CONSTANT, FIELD -> s.append(member.getSimpleName()); + case METHOD -> { + s.append(member.getSimpleName()).append("("); + for (VariableElement parameter : ((ExecutableElement) member).getParameters()) { + s.append(parameter.getSimpleName()).append(", "); + } + if (((ExecutableElement) member).getParameters().size() > 0) { + s.setLength(s.length() - 2); + } + s.append(")"); + } + default -> throw new UnsupportedOperationException(String.valueOf(member.getKind())); + } + return s.toString(); + } + + private static String getTypeMirrorName(TypeMirror type) { + switch (type.getKind()) { + case BOOLEAN -> { + return "boolean"; + } + case BYTE -> { + return "byte"; + } + case SHORT -> { + return "short"; + } + case INT -> { + return "int"; + } + case LONG -> { + return "long"; + } + case CHAR -> { + return "char"; + } + case FLOAT -> { + return "float"; + } + case DOUBLE -> { + return "double"; + } + case VOID, NONE -> { + return "void"; + } + case NULL -> { + return "null"; + } + case ARRAY -> { + return getTypeMirrorName(((ArrayType) type).getComponentType()) + "[]"; + } + case DECLARED -> { + return getClassName((TypeElement) ((DeclaredType) type).asElement()); + } + case TYPEVAR -> { + return ((TypeVariable) type).asElement().getSimpleName().toString(); + } + case WILDCARD -> { + return "?"; + } + default -> throw new UnsupportedOperationException(String.valueOf(type.getKind())); + } + } + + private static StringBuilder createFlags(Element member) { + StringBuilder builder = new StringBuilder(""); + ArrayList flags = new ArrayList<>(); + + for (Modifier modifier : member.getModifiers()) { + switch (modifier) { + case ABSTRACT -> { + if (member.getKind() != ElementKind.INTERFACE && member.getEnclosingElement().getKind() != ElementKind.INTERFACE) { + flags.add("Abstract"); + } + } + case STATIC -> flags.add("Static"); + case FINAL -> flags.add("Final"); + default -> { + } + } + } + if (member.getKind() == ElementKind.ENUM || member.getKind() == ElementKind.ENUM_CONSTANT) { + flags.add("Enum"); + } + if (member.getKind() == ElementKind.INTERFACE) { + flags.add("Interface"); + } + if (member.getAnnotation(Deprecated.class) != null) { + flags.add("Deprecated"); + } + + for (String flag : flags) { + builder.append(flag).append(", "); + } + if (!flags.isEmpty()) { + builder.delete(builder.length() - ", ".length(), builder.length()); + } + + if (!builder.isEmpty()) { + builder = new StringBuilder("<").append(builder).append(">"); + } + + return builder; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ClassParser that)) { + return false; + } + return type.equals(that.type); + } + + @Override + public int hashCode() { + return Objects.hash(type); + } + +} diff --git a/docs/vitepress/.vitepress/config.ts b/docs/vitepress/.vitepress/config.ts new file mode 100644 index 000000000..4e085b382 --- /dev/null +++ b/docs/vitepress/.vitepress/config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vitepress'; + +export default defineConfig({ + rewrites: { + cleanUrls: true + }, +}); From b49a426ddf58ec27d021553f58fed0e8c5b5d781 Mon Sep 17 00:00:00 2001 From: Jack Manning Date: Mon, 5 Jan 2026 22:58:18 -0500 Subject: [PATCH 02/16] Add missing copyVitepressDoc to stonecutter --- stonecutter.gradle.kts | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts index 174538b7f..f680ef34b 100644 --- a/stonecutter.gradle.kts +++ b/stonecutter.gradle.kts @@ -201,10 +201,39 @@ gradle.projectsEvaluated { } } + tasks.register("generateVitepressDoc", Javadoc::class.java) { + group = "documentation" + description = "Generates the vitepress documentation for the project" + source(documentationSources) + classpath = documentationClasspath + destinationDir = File(docsBuildDir, "vitepress") + options.doclet = "xyz.wagyourtail.doclet.mddoclet.Main" + options.docletpath = mutableListOf(docletJarFile) + (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) + (options as CoreJavadocOptions).addStringOption("mcv", mcVersion) + (options as StandardJavadocDocletOptions).links( + "https://docs.oracle.com/javase/8/docs/api/", + "https://www.javadoc.io/doc/org.slf4j/slf4j-api/1.7.30/", + "https://javadoc.io/doc/com.neovisionaries/nv-websocket-client/latest/" + ) + } + + tasks.register("copyVitepressDoc", Copy::class.java) { + group = "documentation" + description = "Copies the vitepress documentation to the build folder" + dependsOn("generateVitepressDoc") + from(rootProject.file("docs/vitepress")) + into(File(docsBuildDir, "vitepress")) + inputs.property("version", project.version.toString()) + filesMatching("index.html") { + expand(mapOf("version" to project.version.toString())) + } + } + tasks.register("createDistDocs", Copy::class.java) { group = "distribution" description = "Packages generated documentation into the dist directory" - dependsOn("prepareDist", "copyPyDoc", "copyTSDoc", "copyWebDoc") + dependsOn("prepareDist", "copyPyDoc", "copyTSDoc", "copyWebDoc", "copyVitepressDoc") from(docsBuildDir) into(distDirFile) } From 082c2fbbbce6d28430251523b7a051570780c0c6 Mon Sep 17 00:00:00 2001 From: Jack Manning Date: Tue, 6 Jan 2026 19:55:28 -0500 Subject: [PATCH 03/16] doclet changes --- .../doclet/mddoclet/parsers/ClassParser.java | 420 +++++++++--------- .../doclet/webdoclet/parsers/ClassParser.java | 11 +- 2 files changed, 207 insertions(+), 224 deletions(-) diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java index bda064167..87e2a19e1 100644 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java @@ -69,184 +69,152 @@ private String getUpDir(int extra) { return s.toString(); } + private StringBuilder getClassNameWithTypes(TypeElement type) { + StringBuilder s = new StringBuilder(getClassName(type)); + List params = type.getTypeParameters(); + if (params != null && !params.isEmpty()) { + s.append("<"); + for (TypeParameterElement param : params) { + s.append(parseType(param.asType())).append(", "); + } + s.delete(s.length() - 2, s.length()); + s.append(">"); + } + + return s; + } + + // TODO: Incomplete + private StringBuilder parseType(TypeMirror type) { + StringBuilder s = new StringBuilder(); + switch (type.getKind()) { + case BOOLEAN, BYTE, SHORT, INT, LONG, CHAR, FLOAT, DOUBLE, VOID, NONE -> { + // primitive types + s.append(type.toString()); + } + case ARRAY -> { + ArrayType arrayType = (ArrayType) type; + s.append(parseType(arrayType.getComponentType())).append("[]"); + } + case DECLARED -> { + DeclaredType declaredType = (DeclaredType) type; + TypeElement typeElement = (TypeElement) declaredType.asElement(); + + Pair url = getURL(declaredType.asElement()); + s.append(String.format("[%s](%s%s)", + getClassName(typeElement), + url.getKey(), + url.getValue() ? " (external)" : "" + )); + + List params = declaredType.getTypeArguments(); + if (params != null && !params.isEmpty()) { + s.append("<"); + for (TypeMirror param : params) { + if (param instanceof TypeVariable typeVariable && typeVariable.getUpperBound().equals(type)) { + s.append(typeVariable.asElement().getSimpleName()).append(", "); + } else { + s.append(parseType(param)).append(", "); + } + } + + // Remove last ", " + s.delete(s.length() - 2, s.length()); + s.append(">"); + } + } + case TYPEVAR -> { + TypeVariable typeVariable = (TypeVariable) type; + s.append(typeVariable.asElement().getSimpleName()); + TypeMirror ext = typeVariable.getUpperBound(); + if (!ext.toString().equals("java.lang.Object")) { + s.append(" extends ").append(parseType(ext)); + } + } + case WILDCARD -> { + s.append("?"); + } + } + return s; + } + public String generateMarkdown() { StringBuilder builder = new StringBuilder(); builder.append("# ").append(getClassName(type)).append("\n\n"); - builder.append(String.format("**Full Class Name:** `%s.%s`", getPackage(type), getClassName(type))).append("\n\n"); + builder.append(String.format("%s.%s", getPackage(type), getClassNameWithTypes(type))).append("\n\n"); StringBuilder desc = getDescription(type.getEnclosingElement()); builder.append(desc.isEmpty() ? "TODO: No description supplied" : desc); if (group == Group.Library) { // TODO: Don't use class name, get actual var name - builder.append(String.format("Accessible in scripts via the global `%s` variable.", getClassName(type))); + builder.append(String.format("\nAccessible in scripts via the global `%s` variable.", getClassName(type))); } builder.append("\n\n"); - // Constructors - if (group != Group.Library) { - List constructors = type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.CONSTRUCTOR).toList(); + switch (group) { + case Library -> builder.append(generateLibrary()); + case Event -> builder.append(generateEvent()); + case Class -> builder.append(generateClass()); + } - if (!constructors.isEmpty()) { - builder.append("## Constructors\n\n"); - } + return builder.toString(); + } - constructors.forEach(el -> { - if (!el.getModifiers().contains(Modifier.PUBLIC)) { - return; - } -// if (firstFlag.get()) { -// firstFlag.set(false); -// builder.append(new XMLBuilder("h3", true, true).append("Constructors")); -// XMLBuilder con = new XMLBuilder("div").setClass("constructorDoc"); -// builder.append(con); -// constructors.set(con); -// } -// constructors.get().append(parseConstructor(el)); + private StringBuilder generateLibrary() { + StringBuilder builder = new StringBuilder(); + builder.append(generateSubClasses()); + builder.append(generateMethods()); + return builder; + } + + private StringBuilder generateEvent() { + StringBuilder builder = new StringBuilder(); + builder.append(generateSubClasses()); + builder.append(generateConstructors()); + return builder; + } + + private StringBuilder generateClass() { + StringBuilder builder = new StringBuilder(); + builder.append(generateSubClasses()); + builder.append(generateConstructors()); + builder.append(generateMethods()); + return builder; + } + + private StringBuilder generateConstructors() { + StringBuilder builder = new StringBuilder(); + List constructors = type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.CONSTRUCTOR).toList(); - builder.append(parseConstructor((ExecutableElement) el)); - }); + if (constructors.isEmpty()) { + return builder; } - // Methods - builder.append("## Methods\n\n"); + builder.append("## Constructors\n\n"); - return builder.toString(); + constructors.forEach(el -> { + if (!el.getModifiers().contains(Modifier.PUBLIC)) { + return; + } + // if (firstFlag.get()) { + // firstFlag.set(false); + // builder.append(new XMLBuilder("h3", true, true).append("Constructors")); + // XMLBuilder con = new XMLBuilder("div").setClass("constructorDoc"); + // builder.append(con); + // constructors.set(con); + // } + // constructors.get().append(parseConstructor(el)); + + builder.append(parseConstructor((ExecutableElement) el)); + }); + return builder; } -// private XMLBuilder parseClass() { -// XMLBuilder builder = new XMLBuilder("main").setClass("classDoc"); -// XMLBuilder subClasses; -// builder.append(subClasses = new XMLBuilder("div").setId("subClasses")); -// for (Element subClass : Main.elements.stream().filter(e -> { -// if (e.getKind().isClass() || e.getKind().isInterface()) { -// return Main.types.isAssignable(e.asType(), Main.types.getDeclaredType(type)) && !e.equals(type); -// } -// return false; -// }).collect(Collectors.toList())) { -// subClasses.append(parseType(subClass.asType()), " "); -// } -// XMLBuilder cname; -// builder.append(cname = new XMLBuilder("h2", true, true).setClass("classTitle").append((getPackage(type)), ".", getClassName(type))); -// -// List params = type.getTypeParameters(); -// if (params != null && !params.isEmpty()) { -// cname.append("<"); -// for (TypeParameterElement param : params) { -// cname.append(parseType(param.asType()), ", "); -// } -// cname.pop(); -// cname.append(">"); -// } -// -// builder.append(createFlags(type, false)); -// TypeMirror sup = type.getSuperclass(); -// List ifaces = type.getInterfaces(); -// XMLBuilder ext; -// builder.append(ext = new XMLBuilder("h4", true, true).addStringOption("class", "classExtends")); -// if (sup != null && !sup.toString().equals("java.lang.Object") && !sup.getKind().equals(TypeKind.NONE)) { -// ext.append("extends ", parseType(sup)); -// } -// if (!ifaces.isEmpty()) { -// ext.append(" implements "); -// for (TypeMirror iface : ifaces) { -// ext.append(parseType(iface), " "); -// } -// } -// -// builder.append(getSince(type)); -// builder.append(getDescription(type)); -// -// AtomicBoolean firstFlag = new AtomicBoolean(true); -// AtomicReference constructors = new AtomicReference<>(); -// //CONSTRUCTORS -// if (!group.equals("Library")) { -// type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.CONSTRUCTOR).forEach(el -> { -// if (!el.getModifiers().contains(Modifier.PUBLIC)) { -// return; -// } -// if (firstFlag.get()) { -// firstFlag.set(false); -// builder.append(new XMLBuilder("h3", true, true).append("Constructors")); -// XMLBuilder con = new XMLBuilder("div").setClass("constructorDoc"); -// builder.append(con); -// constructors.set(con); -// } -// constructors.get().append(parseConstructor((ExecutableElement) el)); -// }); -// } -// -// XMLBuilder shorts; -// builder.append(shorts = new XMLBuilder("div").setClass("shortFieldMethods")); -// -// AtomicReference fieldShorts = new AtomicReference<>(); -// AtomicReference fields = new AtomicReference<>(); -// -// firstFlag.set(true); -// type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.FIELD || e.getKind() == ElementKind.ENUM_CONSTANT).forEach(el -> { -// if (!el.getModifiers().contains(Modifier.PUBLIC)) { -// return; -// } -// if (firstFlag.get()) { -// firstFlag.set(false); -// -// builder.append(new XMLBuilder("h3", true, true).append("Fields")); -// -// XMLBuilder f = new XMLBuilder("div").setClass("fieldDoc"); -// builder.append(f); -// XMLBuilder fs = new XMLBuilder("div").setClass("fieldShorts").append(new XMLBuilder("h4").append("Fields")); -// shorts.append(fs); -// -// fields.set(f); -// fieldShorts.set(fs); -// } -// -// fields.get().append(parseField(el)); -// fieldShorts.get().append( -// new XMLBuilder("div").setClass("shortField shortClassItem").append( -// new XMLBuilder("a", true, true).addStringOption("href", getURL(el).getKey()).append(memberName(el)), -// createFlags(el, true) -// ) -// ); -// }); -// -// AtomicReference methodShorts = new AtomicReference<>(); -// AtomicReference methods = new AtomicReference<>(); -// -// firstFlag.set(true); -// type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.METHOD).forEach(el -> { -// if (!el.getModifiers().contains(Modifier.PUBLIC)) { -// return; -// } -// if (firstFlag.get()) { -// firstFlag.set(false); -// -// builder.append(new XMLBuilder("h3", true, true).append("Methods")); -// -// XMLBuilder m = new XMLBuilder("div").setClass("methodDoc"); -// builder.append(m); -// XMLBuilder ms = new XMLBuilder("div").setClass("methodShorts").append(new XMLBuilder("h4").append("Methods")); -// shorts.append(ms); -// -// methods.set(m); -// methodShorts.set(ms); -// } -// methods.get().append(parseMethod((ExecutableElement) el)); -// methodShorts.get().append( -// new XMLBuilder("div").setClass("shortMethod shortClassItem").append( -// new XMLBuilder("a", true, true).addStringOption("href", getURL(el).getKey()).append(memberName(el)), -// createFlags(el, true) -// ) -// ); -// }); -// -// return builder; -// } -// private StringBuilder parseConstructor(ExecutableElement element) { StringBuilder builder = new StringBuilder(); - builder.append(String.format("### `new %s(%s)`", - getClassName((TypeElement) element.getEnclosingElement()), + builder.append(String.format("### new %s(%s)", + getClassNameWithTypes((TypeElement) element.getEnclosingElement()), createTitleParams(element))) .append("\n\n"); @@ -254,73 +222,77 @@ private StringBuilder parseConstructor(ExecutableElement element) { builder.append(getSince(element)); builder.append(getDescription(element)); -// StringBuilder paramTable = createParamTable(element); -// if (paramTable != null) { -// builder.append(paramTable); -// } + return builder; + } + private StringBuilder generateMethods() { + StringBuilder builder = new StringBuilder(); + List methods = type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.METHOD).toList(); + + if (methods.isEmpty()) { + return builder; + } -// XMLBuilder constructor = new XMLBuilder("div").setClass("constructor classItem").setId(memberId(element)); -// constructor.append(new XMLBuilder("h4").setClass("constructorTitle classItemTitle").append( -// "new ", getClassName((TypeElement) element.getEnclosingElement()), "(", -// createTitleParams(element).setClass("constructorParams"), -// ")" -// )); -// constructor.append(createFlags(element, false)); -// constructor.append(getSince(element)); -// -// constructor.append(new XMLBuilder("div").setClass("constructorDesc classItemDesc") -// .append(getDescription(element))); -// -// XMLBuilder paramTable = createParamTable(element); -// if (paramTable != null) { -// constructor.append(paramTable); -// } + builder.append("## Methods\n\n"); + + methods.forEach(el -> { + if (!el.getModifiers().contains(Modifier.PUBLIC)) { + return; + } + + builder.append(parseMethod((ExecutableElement) el)); + // getURL(el).getKey()).append(memberName(el) + // createFlags(el, true) + }); return builder; } -// -// private XMLBuilder parseMethod(ExecutableElement element) { -// XMLBuilder method = new XMLBuilder("div").setClass("method classItem").setId(memberId(element)); -// XMLBuilder methodTitle; -// method.append(methodTitle = new XMLBuilder("h4", true).setClass("methodTitle classItemTitle").append( -// ".", element.getSimpleName() -// )); -// -// List params = element.getTypeParameters(); -// if (params.size() > 0) { -// methodTitle.append("<"); -// for (TypeParameterElement param : params) { -// methodTitle.append(parseType(param.asType()), ", "); -// } -// methodTitle.pop(); -// methodTitle.append(">"); -// } -// -// methodTitle.append("(", -// createTitleParams(element).setClass("methodParams"), -// ")" -// ); -// method.append(createFlags(element, false)); -// method.append(getSince(element)); -// -// method.append(new XMLBuilder("div").setClass("methodDesc classItemDesc").append(getDescription(element))); -// -// XMLBuilder paramTable = createParamTable(element); -// if (paramTable != null) { -// method.append(paramTable); -// } -// -// method.append(new XMLBuilder("div").setClass("methodReturn classItemType").append( -// new XMLBuilder("h5", true, true).setClass("methodReturnTitle classItemTypeTitle").append( -// "Returns: ", parseType(element.getReturnType()) -// ), -// getReturnDescription(element).setClass("methodReturnDesc classItemTypeDesc") -// )); -// -// return method; -// } -// + + private StringBuilder parseMethod(ExecutableElement element) { + StringBuilder builder = new StringBuilder(); + + builder.append(String.format("### %s(%s)", + element.getSimpleName().toString(), + createTitleParams(element))) + .append("\n\n"); + + builder.append(createFlags(element)); + builder.append(getSince(element)); + builder.append(getDescription(element)); + + return builder; + } + + private StringBuilder generateSubClasses() { + StringBuilder builder = new StringBuilder(); + List subClasses = Main.elements.stream().filter(e -> { + if (e.getKind().isClass() || e.getKind().isInterface()) { + return Main.types.isAssignable( + e.asType(), + Main.types.getDeclaredType(type) + ) && !e.equals(type); + } + return false; + }).collect(Collectors.toList()); + + if (subClasses.isEmpty()) { + return builder; + } + + builder.append("## Subclasses\n\n"); + for (Element subClass : subClasses) { + Pair url = getURL(subClass); + builder.append(String.format("- [%s](%s)%s\n", + getClassNameWithTypes((TypeElement) subClass), + url.getKey(), + url.getValue() ? " (external)" : "" + )); + } + + builder.append("\n"); + return builder; + } + // private XMLBuilder getReturnDescription(ExecutableElement element) { // DocCommentTree dct = Main.treeUtils.getDocCommentTree(element); // if (dct == null) { @@ -434,11 +406,13 @@ private StringBuilder createDescription(Element el, List inli // = new StringBuilder("a", true).addStringOption("href", url.getKey()) - linkBuilder.append(String.format("[%s](%s)", "", url.getKey())); if (List.of(ElementKind.INTERFACE, ElementKind.CLASS, ElementKind.ANNOTATION_TYPE, ElementKind.ENUM).contains(ele.getKind())) { - linkBuilder.append(getClassName((TypeElement) ele)); + linkBuilder.append(String.format("[%s](%s)", getClassName((TypeElement) ele), url.getKey())); } else { + linkBuilder.append(String.format("[%s](%s)", memberName(ele), + url.getKey() + )); // linkBuilder.append(getClassName((TypeElement) ele.getEnclosingElement()), "#", ele.toString()); } @@ -463,7 +437,7 @@ private StringBuilder createDescription(Element el, List inli } return builder; } -// + // private XMLBuilder parseType(TypeMirror type) { // XMLBuilder builder = new XMLBuilder("div", true).setClass("typeParameter"); // XMLBuilder typeLink; @@ -528,13 +502,15 @@ private StringBuilder createDescription(Element el, List inli // } /** - * + * Resolve an element to either an internal or external URL + * * @param type The element to get the url to * @return a pair containing: * 1. the resolved URL, or "" if the element has no URL * 2. true if the URL should open in a new tab, false otherwise */ private Pair getURL(Element type) { + // TODO: Reimplement for mddoclet if (type.asType().getKind().isPrimitive()) { return new Pair<>("", false); } diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/webdoclet/parsers/ClassParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/webdoclet/parsers/ClassParser.java index f5ee30e9b..99f65a7d4 100644 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/webdoclet/parsers/ClassParser.java +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/webdoclet/parsers/ClassParser.java @@ -117,6 +117,7 @@ public String genXML() { private XMLBuilder parseClass() { XMLBuilder builder = new XMLBuilder("main").setClass("classDoc"); + // subclasses start XMLBuilder subClasses; builder.append(subClasses = new XMLBuilder("div").setId("subClasses")); for (Element subClass : Main.elements.stream().filter(e -> { @@ -127,8 +128,13 @@ private XMLBuilder parseClass() { }).collect(Collectors.toList())) { subClasses.append(parseType(subClass.asType()), " "); } - XMLBuilder cname; - builder.append(cname = new XMLBuilder("h2", true, true).setClass("classTitle").append((getPackage(type)), ".", getClassName(type))); + // subclasses end + + // class name + types start + XMLBuilder cname = new XMLBuilder("h2", true, true) + .setClass("classTitle") + .append((getPackage(type)), ".", getClassName(type)); + builder.append(cname); List params = type.getTypeParameters(); if (params != null && !params.isEmpty()) { @@ -139,6 +145,7 @@ private XMLBuilder parseClass() { cname.pop(); cname.append(">"); } + // class name + types end builder.append(createFlags(type, false)); TypeMirror sup = type.getSuperclass(); From 19a50c889acc78fe4ce2262e0730e192cb992a44 Mon Sep 17 00:00:00 2001 From: Jack Manning Date: Fri, 9 Jan 2026 11:37:15 -0500 Subject: [PATCH 04/16] WIP Core doclet replacement --- .gitignore | 4 + build.gradle.kts | 10 +- .../doclet/core/BasicDocCommentParser.java | 101 + .../doclet/core/BasicTypeResolver.java | 377 ++++ .../doclet/core/DocCommentParser.java | 9 + .../doclet/core/DocletModelBuilder.java | 648 ++++++ .../wagyourtail/doclet/core/LinkResolver.java | 9 + .../xyz/wagyourtail/doclet/core/Renderer.java | 7 + .../doclet/core/TargetLanguage.java | 8 + .../wagyourtail/doclet/core/TypeResolver.java | 14 + .../doclet/core/mddoclet/Main.java | 77 + .../doclet/core/model/ClassDoc.java | 21 + .../doclet/core/model/ClassKind.java | 8 + .../doclet/core/model/DeclaredTypeDoc.java | 4 + .../doclet/core/model/DocComment.java | 6 + .../wagyourtail/doclet/core/model/DocTag.java | 4 + .../doclet/core/model/DocTagKind.java | 11 + .../doclet/core/model/DocletModel.java | 6 + .../doclet/core/model/LinkRef.java | 4 + .../doclet/core/model/MemberDoc.java | 18 + .../doclet/core/model/MemberKind.java | 7 + .../doclet/core/model/PackageDoc.java | 6 + .../doclet/core/model/ParamDoc.java | 4 + .../doclet/core/model/TypeKind.java | 13 + .../doclet/core/model/TypeRef.java | 21 + .../doclet/core/pydoclet/Main.java | 96 + .../doclet/core/render/MarkdownWriter.java | 361 ++++ .../doclet/core/render/PythonWriter.java | 603 ++++++ .../doclet/core/render/TsRenderer.java | 891 ++++++++ .../doclet/core/tsdoclet/Main.java | 82 + .../doclet/core/util/ElementNameUtils.java | 81 + .../doclet/{ => core}/webdoclet/Main.java | 32 +- .../webdoclet/parsers/ClassParser.java | 4 +- .../wagyourtail/doclet/mddoclet/Group.java | 7 - .../xyz/wagyourtail/doclet/mddoclet/Main.java | 139 -- .../doclet/mddoclet/parsers/ClassParser.java | 696 ------- .../xyz/wagyourtail/doclet/pydoclet/Main.java | 236 --- .../doclet/pydoclet/parsers/ClassParser.java | 493 ----- .../xyz/wagyourtail/doclet/tsdoclet/Main.java | 268 --- .../doclet/tsdoclet/PackageTree.java | 149 -- .../tsdoclet/parsers/AbstractParser.java | 592 ------ .../doclet/tsdoclet/parsers/ClassParser.java | 324 --- .../doclet/tsdoclet/parsers/EventParser.java | 63 - .../tsdoclet/parsers/LibraryParser.java | 47 - docs/vitepress/.vitepress/config.mts | 30 + docs/vitepress/.vitepress/config.ts | 7 - docs/vitepress/package.json | 21 + docs/vitepress/pnpm-lock.yaml | 1837 +++++++++++++++++ stonecutter.gradle.kts | 10 +- 49 files changed, 5421 insertions(+), 3045 deletions(-) create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/BasicDocCommentParser.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/BasicTypeResolver.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocCommentParser.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocletModelBuilder.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/LinkResolver.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/Renderer.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/TargetLanguage.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/TypeResolver.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/mddoclet/Main.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassDoc.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassKind.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DeclaredTypeDoc.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocComment.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocTag.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocTagKind.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocletModel.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/LinkRef.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/MemberDoc.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/MemberKind.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/PackageDoc.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ParamDoc.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/TypeKind.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/TypeRef.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/pydoclet/Main.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/MarkdownWriter.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/PythonWriter.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/TsRenderer.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/tsdoclet/Main.java create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/core/util/ElementNameUtils.java rename buildSrc/src/main/java/xyz/wagyourtail/doclet/{ => core}/webdoclet/Main.java (83%) rename buildSrc/src/main/java/xyz/wagyourtail/doclet/{ => core}/webdoclet/parsers/ClassParser.java (99%) delete mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Group.java delete mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Main.java delete mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java delete mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/pydoclet/Main.java delete mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/pydoclet/parsers/ClassParser.java delete mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/Main.java delete mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/PackageTree.java delete mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/AbstractParser.java delete mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/ClassParser.java delete mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/EventParser.java delete mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/LibraryParser.java create mode 100644 docs/vitepress/.vitepress/config.mts delete mode 100644 docs/vitepress/.vitepress/config.ts create mode 100644 docs/vitepress/package.json create mode 100644 docs/vitepress/pnpm-lock.yaml diff --git a/.gitignore b/.gitignore index 763e98671..844dcabb8 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,7 @@ doc/ docs/web/[0-9]* /META-INF/ + +node_modules/ +**/.vitepress/cache/ +**/.vitepress/dist/ \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 4187c092c..7e81fbd36 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -100,7 +100,7 @@ if (isVersionedProject && hasMinecraftVersion) { source(documentationSources) classpath = documentationClasspath destinationDir = File(docsBuildDir, "python/JsMacrosAC") - options.doclet = "xyz.wagyourtail.doclet.pydoclet.Main" + options.doclet = "xyz.wagyourtail.doclet.core.pydoclet.Main" options.docletpath = mutableListOf(docletJarFile) (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) } @@ -119,7 +119,7 @@ if (isVersionedProject && hasMinecraftVersion) { source(documentationSources) classpath = documentationClasspath destinationDir = File(docsBuildDir, "typescript/headers") - options.doclet = "xyz.wagyourtail.doclet.tsdoclet.Main" + options.doclet = "xyz.wagyourtail.doclet.core.tsdoclet.Main" options.docletpath = mutableListOf(docletJarFile) (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) } @@ -138,7 +138,7 @@ if (isVersionedProject && hasMinecraftVersion) { source(documentationSources) classpath = documentationClasspath destinationDir = File(docsBuildDir, "web") - options.doclet = "xyz.wagyourtail.doclet.webdoclet.Main" + options.doclet = "xyz.wagyourtail.doclet.core.webdoclet.Main" options.docletpath = mutableListOf(docletJarFile) (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) (options as CoreJavadocOptions).addStringOption("mcv", mcVersion) @@ -167,7 +167,7 @@ if (isVersionedProject && hasMinecraftVersion) { source(documentationSources) classpath = documentationClasspath destinationDir = File(docsBuildDir, "vitepress") - options.doclet = "xyz.wagyourtail.doclet.mddoclet.Main" + options.doclet = "xyz.wagyourtail.doclet.core.mddoclet.Main" options.docletpath = mutableListOf(docletJarFile) (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) (options as CoreJavadocOptions).addStringOption("mcv", mcVersion) @@ -185,7 +185,7 @@ if (isVersionedProject && hasMinecraftVersion) { from(rootProject.file("docs/vitepress")) into(File(docsBuildDir, "vitepress")) inputs.property("version", project.version.toString()) - filesMatching("index.html") { + filesMatching("index.md") { expand(mapOf("version" to project.version.toString())) } } diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/BasicDocCommentParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/BasicDocCommentParser.java new file mode 100644 index 000000000..a1b919acc --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/BasicDocCommentParser.java @@ -0,0 +1,101 @@ +package xyz.wagyourtail.doclet.core; + +import com.sun.source.doctree.DocCommentTree; +import com.sun.source.doctree.DocTree; +import com.sun.source.doctree.ParamTree; +import com.sun.source.doctree.ReferenceTree; +import com.sun.source.doctree.ReturnTree; +import com.sun.source.doctree.SeeTree; +import com.sun.source.doctree.SinceTree; +import com.sun.source.doctree.TextTree; +import com.sun.source.doctree.DeprecatedTree; +import com.sun.source.doctree.LinkTree; +import com.sun.source.doctree.LiteralTree; +import com.sun.source.util.DocTrees; +import xyz.wagyourtail.doclet.core.model.DocComment; +import xyz.wagyourtail.doclet.core.model.DocTag; +import xyz.wagyourtail.doclet.core.model.DocTagKind; + +import javax.lang.model.element.Element; +import java.util.ArrayList; +import java.util.List; + +public class BasicDocCommentParser implements DocCommentParser { + private final DocTrees docTrees; + + public BasicDocCommentParser(DocTrees docTrees) { + this.docTrees = docTrees; + } + + @Override + public DocComment parse(Element element) { + DocCommentTree tree = docTrees.getDocCommentTree(element); + boolean isDeprecated = element.getAnnotation(Deprecated.class) != null; + if (tree == null) { + if (isDeprecated) { + return new DocComment("", "", List.of(new DocTag(DocTagKind.DEPRECATED, null, ""))); + } + return new DocComment("", "", List.of()); + } + + String summary = renderText(tree.getFirstSentence()); + String description = renderText(tree.getFullBody()); + List tags = new ArrayList<>(); + + for (DocTree tag : tree.getBlockTags()) { + switch (tag.getKind()) { + case PARAM -> { + ParamTree param = (ParamTree) tag; + DocTagKind kind = param.isTypeParameter() ? DocTagKind.TEMPLATE : DocTagKind.PARAM; + tags.add(new DocTag(kind, param.getName().getName().toString(), renderText(param.getDescription()))); + } + case RETURN -> { + ReturnTree ret = (ReturnTree) tag; + tags.add(new DocTag(DocTagKind.RETURN, null, renderText(ret.getDescription()))); + } + case SINCE -> { + SinceTree since = (SinceTree) tag; + tags.add(new DocTag(DocTagKind.SINCE, null, renderText(since.getBody()))); + } + case DEPRECATED -> { + DeprecatedTree dep = (DeprecatedTree) tag; + tags.add(new DocTag(DocTagKind.DEPRECATED, null, renderText(dep.getBody()))); + } + case SEE -> { + SeeTree see = (SeeTree) tag; + for (DocTree ref : see.getReference()) { + if (ref.getKind() == DocTree.Kind.REFERENCE) { + String signature = ((ReferenceTree) ref).getSignature(); + tags.add(new DocTag(DocTagKind.SEE, null, signature)); + } else { + tags.add(new DocTag(DocTagKind.SEE, null, ref.toString())); + } + } + } + default -> tags.add(new DocTag(DocTagKind.OTHER, null, tag.toString())); + } + } + + if (isDeprecated && tags.stream().noneMatch(tag -> tag.kind() == DocTagKind.DEPRECATED)) { + tags.add(new DocTag(DocTagKind.DEPRECATED, null, "")); + } + + return new DocComment(summary, description, tags); + } + + private String renderText(List trees) { + StringBuilder builder = new StringBuilder(); + for (DocTree tree : trees) { + switch (tree.getKind()) { + case TEXT -> builder.append(((TextTree) tree).getBody()); + case CODE -> builder.append("`").append(((LiteralTree) tree).getBody()).append("`"); + case LINK, LINK_PLAIN -> { + String signature = ((LinkTree) tree).getReference().getSignature(); + builder.append("{@link ").append(signature).append("}"); + } + default -> builder.append(tree.toString()); + } + } + return builder.toString().trim(); + } +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/BasicTypeResolver.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/BasicTypeResolver.java new file mode 100644 index 000000000..b522faba1 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/BasicTypeResolver.java @@ -0,0 +1,377 @@ +package xyz.wagyourtail.doclet.core; + +import xyz.wagyourtail.doclet.core.model.TypeKind; +import xyz.wagyourtail.doclet.core.model.TypeRef; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.IntersectionType; +import javax.lang.model.type.NoType; +import javax.lang.model.type.PrimitiveType; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.type.TypeVariable; +import javax.lang.model.type.UnionType; +import javax.lang.model.type.WildcardType; +import java.util.ArrayList; +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class BasicTypeResolver implements TypeResolver { + private static final Set JAVA_ALIASES = Set.of( + "java.lang.Array", + "java.lang.Class", + "java.util.Collection", + "java.util.List", + "java.util.Map", + "java.util.Set" + ); + private static final Map JAVA_NUMBER_TYPES = Map.of( + "java.lang.Integer", "int", + "java.lang.Float", "float", + "java.lang.Long", "long", + "java.lang.Short", "short", + "java.lang.Character", "char", + "java.lang.Byte", "byte", + "java.lang.Double", "double", + "java.lang.Number", "number" + ); + private static final Map FUNCTIONAL_INTERFACES = Map.of( + "java.util.function.Consumer", "MethodWrapper<$0>", + "java.util.function.BiConsumer", "MethodWrapper<$0, $1>", + "java.util.function.Function", "MethodWrapper<$0, any, $1>", + "java.util.function.BiFunction", "MethodWrapper<$0, $1, $2>", + "java.util.function.Predicate", "MethodWrapper<$0, any, boolean>", + "java.util.function.BiPredicate", "MethodWrapper<$0, $1, boolean>", + "java.util.function.Supplier", "MethodWrapper", + "java.util.Comparator", "MethodWrapper<$0, $0, int>", + "java.lang.Runnable", "MethodWrapper" + ); + + private Map typeScriptAliases = Map.of(); + private boolean pythonAliasEnabled = true; + private final Set resolving = Collections.newSetFromMap(new IdentityHashMap<>()); + + public void setTypeScriptAliases(Map typeScriptAliases) { + this.typeScriptAliases = typeScriptAliases == null ? Map.of() : typeScriptAliases; + } + + public void setPythonAliasEnabled(boolean pythonAliasEnabled) { + this.pythonAliasEnabled = pythonAliasEnabled; + } + + @Override + public TypeRef resolve(TypeMirror type) { + if (type == null) { + return new TypeRef(TypeKind.UNKNOWN, "unknown", "unknown", List.of(), false, false, null, false); + } + if (!resolving.add(type)) { + return new TypeRef(TypeKind.UNKNOWN, type.toString(), type.toString(), List.of(), false, false, null, false); + } + try { + return switch (type.getKind()) { + case BOOLEAN, BYTE, SHORT, INT, LONG, CHAR, FLOAT, DOUBLE -> + new TypeRef(TypeKind.PRIMITIVE, type.toString(), type.toString(), List.of(), false, false, null, false); + case VOID, NONE -> new TypeRef(TypeKind.VOID, "void", "void", List.of(), false, false, null, false); + case ARRAY -> { + ArrayType arrayType = (ArrayType) type; + TypeRef component = resolve(arrayType.getComponentType()); + yield new TypeRef(TypeKind.ARRAY, component.name(), component.qualifiedName(), List.of(component), true, false, null, false); + } + case DECLARED -> resolveDeclared((DeclaredType) type); + case TYPEVAR -> resolveTypeVar((TypeVariable) type); + case WILDCARD -> resolveWildcard((WildcardType) type); + case INTERSECTION -> resolveIntersection((IntersectionType) type); + case UNION -> resolveUnion((UnionType) type); + default -> new TypeRef(TypeKind.UNKNOWN, type.toString(), type.toString(), List.of(), false, false, null, false); + }; + } finally { + resolving.remove(type); + } + } + + private TypeRef resolveDeclared(DeclaredType type) { + Element el = type.asElement(); + String qualifiedName = getQualifiedName(el); + String displayName = getDisplayName(el); + List params = new ArrayList<>(); + for (TypeMirror arg : type.getTypeArguments()) { + params.add(resolve(arg)); + } + return new TypeRef(TypeKind.DECLARED, displayName, qualifiedName, params, false, false, null, false); + } + + private TypeRef resolveTypeVar(TypeVariable type) { + String name = type.asElement().getSimpleName().toString(); + TypeMirror bound = type.getUpperBound(); + TypeRef bounds = bound == null || bound.toString().equals("java.lang.Object") ? null : resolve(bound); + return new TypeRef(TypeKind.TYPEVAR, name, name, List.of(), false, false, bounds, false); + } + + private TypeRef resolveWildcard(WildcardType type) { + TypeMirror bound = type.getExtendsBound(); + if (bound == null) { + bound = type.getSuperBound(); + } + TypeRef bounds = bound == null ? null : resolve(bound); + return new TypeRef(TypeKind.WILDCARD, "?", "?", List.of(), false, false, bounds, false); + } + + private TypeRef resolveIntersection(IntersectionType type) { + List bounds = new ArrayList<>(); + for (TypeMirror bound : type.getBounds()) { + bounds.add(resolve(bound)); + } + return new TypeRef(TypeKind.INTERSECTION, "&", "&", bounds, false, false, null, false); + } + + private TypeRef resolveUnion(UnionType type) { + List bounds = new ArrayList<>(); + for (TypeMirror bound : type.getAlternatives()) { + bounds.add(resolve(bound)); + } + return new TypeRef(TypeKind.UNION, "|", "|", bounds, false, false, null, false); + } + + private String getQualifiedName(Element element) { + Element current = element; + StringBuilder name = new StringBuilder(); + while (current != null && current.getKind() != ElementKind.PACKAGE) { + if (current instanceof TypeElement typeElement) { + if (!name.isEmpty()) { + name.insert(0, "."); + } + name.insert(0, typeElement.getSimpleName()); + } + current = current.getEnclosingElement(); + } + if (current instanceof PackageElement pkg) { + String pkgName = pkg.getQualifiedName().toString(); + if (!pkgName.isEmpty()) { + name.insert(0, pkgName + "."); + } + } + return name.toString(); + } + + private String getDisplayName(Element element) { + StringBuilder name = new StringBuilder(); + Element current = element; + while (current != null && current.getKind() != ElementKind.PACKAGE) { + if (current instanceof TypeElement typeElement) { + if (!name.isEmpty()) { + name.insert(0, "."); + } + name.insert(0, typeElement.getSimpleName()); + } + current = current.getEnclosingElement(); + } + return name.toString(); + } + + @Override + public String format(TypeRef type, TargetLanguage target) { + return format(type, target, false); + } + + @Override + public String format(TypeRef type, TargetLanguage target, boolean paramType) { + if (type == null) { + return "any"; + } + return switch (target) { + case TYPESCRIPT -> formatTypeScript(type, paramType); + case PYTHON -> formatPython(type); + case MARKDOWN, HTML -> formatJavaLike(type); + }; + } + + private String formatTypeScript(TypeRef type, boolean paramType) { + return switch (type.kind()) { + case PRIMITIVE -> switch (type.name()) { + case "boolean" -> "boolean"; + case "byte", "short", "int", "long", "float", "double", "char" -> + paramType ? type.name() : "number"; + default -> "number"; + }; + case VOID -> "void"; + case ARRAY -> { + String component = formatTypeScript(type.typeArgs().get(0), paramType); + yield paramType ? component + "[]" : "JavaArray<" + component + ">"; + } + case DECLARED -> { + String alias = typeScriptAliases.get(type.qualifiedName()); + if (alias != null) { + yield alias; + } + + if (type.qualifiedName().startsWith("net.minecraft.")) { + yield maskMinecraftType(type, paramType); + } + + if (paramType && FUNCTIONAL_INTERFACES.containsKey(type.qualifiedName())) { + yield formatFunctionalInterface(type, paramType); + } + + String base = mapDeclaredTypeScript(type, paramType); + if (!type.typeArgs().isEmpty()) { + base = base + "<" + joinTypes(type.typeArgs(), TargetLanguage.TYPESCRIPT, paramType) + ">"; + } + yield base; + } + case TYPEVAR -> type.name(); + case WILDCARD -> "any"; + case INTERSECTION -> "(" + joinTypes(type.typeArgs(), TargetLanguage.TYPESCRIPT, paramType, " & ") + ")"; + case UNION -> "(" + joinTypes(type.typeArgs(), TargetLanguage.TYPESCRIPT, paramType, " | ") + ")"; + default -> "any"; + }; + } + + private String mapDeclaredTypeScript(TypeRef type, boolean paramType) { + String qualifiedName = type.qualifiedName(); + if ("xyz.wagyourtail.jsmacros.core.event.BaseEvent".equals(qualifiedName)) { + return "Events.BaseEvent"; + } + if (JAVA_NUMBER_TYPES.containsKey(qualifiedName)) { + return paramType ? JAVA_NUMBER_TYPES.get(qualifiedName) : "number"; + } + return switch (qualifiedName) { + case "java.lang.String" -> "string"; + case "java.lang.Boolean" -> "boolean"; + case "java.lang.Object" -> "any"; + default -> { + if (JAVA_ALIASES.contains(qualifiedName)) { + String base = "Java" + simpleName(qualifiedName); + if (paramType && base.equals("JavaClass")) { + base = "JavaClassArg"; + } + yield base; + } + yield "Packages." + toTsQualified(type); + } + }; + } + + private String toTsQualified(TypeRef type) { + String qualifiedName = type.qualifiedName(); + String name = type.name(); + if (qualifiedName.endsWith(name)) { + String pkg = qualifiedName.substring(0, qualifiedName.length() - name.length()); + return pkg + name.replace('.', '$'); + } + return qualifiedName.replace('.', '$'); + } + + private String formatPython(TypeRef type) { + return switch (type.kind()) { + case PRIMITIVE -> switch (type.name()) { + case "boolean" -> "bool"; + case "byte", "short", "int", "long", "char" -> "int"; + case "float", "double" -> "float"; + default -> "int"; + }; + case VOID -> "None"; + case ARRAY -> "list[" + formatPython(type.typeArgs().get(0)) + "]"; + case DECLARED -> { + String base = mapDeclaredPython(type.qualifiedName()); + if (!type.typeArgs().isEmpty()) { + base = base + "[" + joinTypes(type.typeArgs(), TargetLanguage.PYTHON) + "]"; + } + yield base; + } + case TYPEVAR -> type.name(); + case WILDCARD -> "object"; + case INTERSECTION, UNION -> "object"; + default -> "object"; + }; + } + + private String mapDeclaredPython(String qualifiedName) { + if (!pythonAliasEnabled) { + return simpleName(qualifiedName); + } + return switch (qualifiedName) { + case "java.lang.String" -> "str"; + case "java.lang.Boolean" -> "bool"; + case "java.lang.Integer", "java.lang.Long", "java.lang.Short", "java.lang.Byte" -> "int"; + case "java.lang.Float", "java.lang.Double" -> "float"; + case "java.lang.Object" -> "object"; + default -> simpleName(qualifiedName); + }; + } + + private String formatJavaLike(TypeRef type) { + return switch (type.kind()) { + case PRIMITIVE, VOID, TYPEVAR -> type.name(); + case ARRAY -> formatJavaLike(type.typeArgs().get(0)) + "[]"; + case DECLARED -> { + String base = simpleName(type.qualifiedName()); + if (!type.typeArgs().isEmpty()) { + base = base + "<" + joinTypes(type.typeArgs(), TargetLanguage.MARKDOWN) + ">"; + } + yield base; + } + case WILDCARD -> "?"; + case INTERSECTION -> "(" + joinTypes(type.typeArgs(), TargetLanguage.MARKDOWN, false, " & ") + ")"; + case UNION -> "(" + joinTypes(type.typeArgs(), TargetLanguage.MARKDOWN, false, " | ") + ")"; + default -> type.name(); + }; + } + + private String joinTypes(List types, TargetLanguage target) { + return joinTypes(types, target, false); + } + + private String joinTypes(List types, TargetLanguage target, boolean paramType) { + return joinTypes(types, target, paramType, ", "); + } + + private String joinTypes(List types, TargetLanguage target, boolean paramType, String separator) { + StringBuilder builder = new StringBuilder(); + for (TypeRef ref : types) { + builder.append(format(ref, target, paramType)).append(separator); + } + if (!types.isEmpty()) { + builder.setLength(builder.length() - separator.length()); + } + return builder.toString(); + } + + private String simpleName(String qualifiedName) { + int idx = qualifiedName.lastIndexOf('.'); + return idx == -1 ? qualifiedName : qualifiedName.substring(idx + 1); + } + + private String formatFunctionalInterface(TypeRef type, boolean paramType) { + String template = FUNCTIONAL_INTERFACES.get(type.qualifiedName()); + if (template == null) { + return formatTypeScript(type, paramType); + } + String res = template; + if (!type.typeArgs().isEmpty()) { + int size = type.typeArgs().size(); + for (int i = 0; i < size; i++) { + res = res.replace("$" + i, formatTypeScript(type.typeArgs().get(i), true)); + } + } + return res; + } + + private String maskMinecraftType(TypeRef type, boolean paramType) { + StringBuilder raw = new StringBuilder(type.qualifiedName()); + if (!type.typeArgs().isEmpty()) { + raw.append("<").append(joinTypes(type.typeArgs(), TargetLanguage.TYPESCRIPT, paramType)).append(">"); + } + String cleaned = raw.toString() + .replace("/* ", "") + .replace(" */ any", "") + .replace(" */", ""); + return "/* " + cleaned + " */ any"; + } +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocCommentParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocCommentParser.java new file mode 100644 index 000000000..dc7760d9f --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocCommentParser.java @@ -0,0 +1,9 @@ +package xyz.wagyourtail.doclet.core; + +import xyz.wagyourtail.doclet.core.model.DocComment; + +import javax.lang.model.element.Element; + +public interface DocCommentParser { + DocComment parse(Element element); +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocletModelBuilder.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocletModelBuilder.java new file mode 100644 index 000000000..4c5b8d63b --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocletModelBuilder.java @@ -0,0 +1,648 @@ +package xyz.wagyourtail.doclet.core; + +import xyz.wagyourtail.doclet.DocletDeclareType; +import xyz.wagyourtail.doclet.DocletIgnore; +import xyz.wagyourtail.doclet.DocletReplaceParams; +import xyz.wagyourtail.doclet.DocletReplaceReturn; +import xyz.wagyourtail.doclet.DocletReplaceTypeParams; +import xyz.wagyourtail.doclet.core.model.ClassDoc; +import xyz.wagyourtail.doclet.core.model.ClassKind; +import xyz.wagyourtail.doclet.core.model.DeclaredTypeDoc; +import xyz.wagyourtail.doclet.core.model.DocComment; +import xyz.wagyourtail.doclet.core.model.DocTag; +import xyz.wagyourtail.doclet.core.model.DocTagKind; +import xyz.wagyourtail.doclet.core.model.DocletModel; +import xyz.wagyourtail.doclet.core.model.MemberDoc; +import xyz.wagyourtail.doclet.core.model.MemberKind; +import xyz.wagyourtail.doclet.core.model.PackageDoc; +import xyz.wagyourtail.doclet.core.model.ParamDoc; +import xyz.wagyourtail.doclet.core.model.TypeRef; +import xyz.wagyourtail.doclet.core.util.ElementNameUtils; + +import com.sun.source.util.DocTrees; +import jdk.javadoc.doclet.DocletEnvironment; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +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.element.TypeParameterElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.util.Elements; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.type.TypeKind; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.HashSet; +import java.util.LinkedHashSet; + +public class DocletModelBuilder { + private final TypeResolver typeResolver; + private final DocCommentParser docCommentParser; + private final List declaredTypes = new ArrayList<>(); + private DocTrees docTrees; + private Elements elementUtils; + private Set objectMethods = Set.of(); + private Set objectMethodNames = Set.of(); + + public DocletModelBuilder( + TypeResolver typeResolver, + DocCommentParser docCommentParser + ) { + this.typeResolver = typeResolver; + this.docCommentParser = docCommentParser; + } + + public DocletModel build(DocletEnvironment environment) { + this.docTrees = environment.getDocTrees(); + this.elementUtils = environment.getElementUtils(); + initObjectMethods(); + + Map> packages = new HashMap<>(); + Map> mixinInterfaces = collectMixinInterfaces(environment); + + for (Element element : environment.getIncludedElements()) { + if (!(element instanceof TypeElement type)) { + addDeclaredType(element); + continue; + } + + if (type.getAnnotation(DocletIgnore.class) != null) { + continue; + } + + addDeclaredType(type); + + String packageName = ElementNameUtils.getPackageName(type); + String displayName = ElementNameUtils.getDisplayClassName(type); + String qualifiedName = ElementNameUtils.getQualifiedName(type); + + String group = "Class"; + String alias = null; + boolean eventCancellable = false; + String eventFilterer = null; + AnnotationMirror library = findAnnotation(type, "Library"); + AnnotationMirror event = findAnnotation(type, "Event"); + if (library != null) { + group = "Library"; + alias = String.valueOf(getAnnotationValue(library, "value")); + } else if (event != null) { + group = "Event"; + alias = String.valueOf(getAnnotationValue(event, "value")); + Object cancellableValue = getAnnotationValue(event, "cancellable"); + eventCancellable = Boolean.TRUE.equals(cancellableValue); + Object filtererValue = getAnnotationValue(event, "filterer"); + if (filtererValue instanceof DeclaredType declared) { + String name = declared.asElement().getSimpleName().toString(); + if (!"EventFilterer".equals(name)) { + eventFilterer = name; + } + } else if (filtererValue instanceof TypeMirror mirror && mirror.getKind() == TypeKind.DECLARED) { + String name = ((DeclaredType) mirror).asElement().getSimpleName().toString(); + if (!"EventFilterer".equals(name)) { + eventFilterer = name; + } + } + } + + ClassKind kind = switch (type.getKind()) { + case INTERFACE -> ClassKind.INTERFACE; + case ENUM -> ClassKind.ENUM; + case ANNOTATION_TYPE -> ClassKind.ANNOTATION; + default -> ClassKind.CLASS; + }; + + List typeParams = new ArrayList<>(); + for (TypeParameterElement param : type.getTypeParameters()) { + typeParams.add(typeResolver.resolve(param.asType())); + } + + List extendsTypes = new ArrayList<>(); + if (type.getSuperclass() != null && type.getSuperclass().getKind() != javax.lang.model.type.TypeKind.NONE) { + String sup = type.getSuperclass().toString(); + if (!"java.lang.Object".equals(sup)) { + extendsTypes.add(typeResolver.resolve(type.getSuperclass())); + } + } + List implementsTypes = new ArrayList<>(); + Set implemented = new HashSet<>(); + for (var iface : type.getInterfaces()) { + TypeRef resolved = typeResolver.resolve(iface); + if (implemented.add(resolved.qualifiedName())) { + implementsTypes.add(resolved); + } + } + + Set superMcTypes = new LinkedHashSet<>(); + Set superTypes = new LinkedHashSet<>(); + collectSuperTypes(type, superTypes, superMcTypes, new HashSet<>()); + + boolean directExtendsMc = isMinecraftType(type.getSuperclass()); + List mixins = mixinInterfaces.get(qualifiedName); + if (mixins != null) { + for (TypeMirror iface : mixins) { + TypeRef resolved = typeResolver.resolve(iface); + if (implemented.add(resolved.qualifiedName())) { + implementsTypes.add(resolved); + } + } + } + if (directExtendsMc && !superMcTypes.isEmpty()) { + for (TypeElement mcType : superMcTypes) { + String mcQualified = ElementNameUtils.getQualifiedName(mcType); + List extraMixins = mixinInterfaces.get(mcQualified); + if (extraMixins == null) { + continue; + } + for (TypeMirror iface : extraMixins) { + TypeRef resolved = typeResolver.resolve(iface); + if (implemented.add(resolved.qualifiedName())) { + implementsTypes.add(resolved); + } + if (iface.getKind() == TypeKind.DECLARED) { + superTypes.add((TypeElement) ((DeclaredType) iface).asElement()); + } + } + } + } + + List modifiers = new ArrayList<>(); + for (Modifier modifier : type.getModifiers()) { + modifiers.add(modifier.toString()); + } + + DocComment classComment = docCommentParser.parse(type); + List members = new ArrayList<>(); + List instanceMethods = new ArrayList<>(); + + Set eventSkipNames = new HashSet<>(); + if ("Event".equals(group)) { + Map> eventMethodsByName = new HashMap<>(); + for (Element enclosed : type.getEnclosedElements()) { + if (enclosed.getKind() != ElementKind.METHOD) { + continue; + } + if (!enclosed.getModifiers().contains(Modifier.PUBLIC)) { + continue; + } + ExecutableElement method = (ExecutableElement) enclosed; + eventMethodsByName.computeIfAbsent(method.getSimpleName().toString(), key -> new ArrayList<>()) + .add(method); + } + for (Map.Entry> entry : eventMethodsByName.entrySet()) { + String name = entry.getKey(); + if (!objectMethodNames.contains(name)) { + continue; + } + boolean allObjectMethods = true; + for (ExecutableElement method : entry.getValue()) { + if (!isObjectMethod(method, type)) { + allObjectMethods = false; + break; + } + } + if (allObjectMethods) { + eventSkipNames.add(name); + } + } + } + + for (Element enclosed : type.getEnclosedElements()) { + if (enclosed.getAnnotation(DocletIgnore.class) != null) { + continue; + } + addDeclaredType(enclosed); + if (!enclosed.getModifiers().contains(Modifier.PUBLIC)) { + continue; + } + if (enclosed.getKind() == ElementKind.FIELD || enclosed.getKind() == ElementKind.ENUM_CONSTANT) { + members.add(buildField(enclosed)); + } else if (enclosed.getKind() == ElementKind.METHOD) { + ExecutableElement method = (ExecutableElement) enclosed; + String methodName = method.getSimpleName().toString(); + if ("Event".equals(group) && eventSkipNames.contains(methodName)) { + continue; + } + if (!"Event".equals(group) && isObjectMethod(method, type)) { + continue; + } + if (isObfuscated(method, type, superMcTypes)) { + continue; + } + members.add(buildMethod(method)); + if (!method.getModifiers().contains(Modifier.STATIC)) { + instanceMethods.add(method); + } + } else if (enclosed.getKind() == ElementKind.CONSTRUCTOR) { + members.add(buildConstructor((ExecutableElement) enclosed)); + } + } + + if (!"Event".equals(group)) { + addSuperMethods(type, superTypes, superMcTypes, instanceMethods, members); + } + + members.sort(Comparator.comparing(MemberDoc::name, String.CASE_INSENSITIVE_ORDER)); + + ClassDoc classDoc = new ClassDoc( + displayName, + qualifiedName, + packageName, + kind, + group, + alias, + eventCancellable, + eventFilterer, + typeParams, + extendsTypes, + implementsTypes, + modifiers, + classComment, + members + ); + + packages.computeIfAbsent(packageName, key -> new ArrayList<>()).add(classDoc); + } + + List packageDocs = new ArrayList<>(); + for (Map.Entry> entry : packages.entrySet()) { + entry.getValue().sort(Comparator.comparing(ClassDoc::qualifiedName, String.CASE_INSENSITIVE_ORDER)); + packageDocs.add(new PackageDoc(entry.getKey(), entry.getValue())); + } + packageDocs.sort(Comparator.comparing(PackageDoc::name, String.CASE_INSENSITIVE_ORDER)); + + return new DocletModel(packageDocs, declaredTypes); + } + + private void initObjectMethods() { + TypeElement objectElement = elementUtils.getTypeElement("java.lang.Object"); + if (objectElement == null) { + objectMethods = Set.of(); + objectMethodNames = Set.of(); + return; + } + Set methods = new HashSet<>(); + Set names = new HashSet<>(); + for (Element element : objectElement.getEnclosedElements()) { + if (element.getKind() != ElementKind.METHOD) { + continue; + } + if (!element.getModifiers().contains(Modifier.PUBLIC) || element.getModifiers().contains(Modifier.STATIC)) { + continue; + } + ExecutableElement method = (ExecutableElement) element; + methods.add(method); + names.add(method.getSimpleName().toString()); + } + objectMethods = methods; + objectMethodNames = names; + } + + private boolean isObjectMethod(ExecutableElement method, TypeElement owner) { + if (!objectMethodNames.contains(method.getSimpleName().toString())) { + return false; + } + if (docTrees != null && docTrees.getDocCommentTree(method) != null) { + return false; + } + for (ExecutableElement objectMethod : objectMethods) { + if (elementUtils.overrides(method, objectMethod, owner)) { + return true; + } + } + return false; + } + + private void collectSuperTypes( + TypeElement type, + Set superTypes, + Set superMcTypes, + Set visited + ) { + if (!visited.add(type)) { + return; + } + if (!type.getKind().isInterface()) { + TypeMirror superType = type.getSuperclass(); + if (superType != null && superType.getKind() == TypeKind.DECLARED) { + TypeElement superElement = (TypeElement) ((DeclaredType) superType).asElement(); + if (isMinecraftType(superType)) { + superMcTypes.add(superElement); + } else { + superTypes.add(superElement); + } + collectSuperTypes(superElement, superTypes, superMcTypes, visited); + } + } + for (TypeMirror iface : type.getInterfaces()) { + if (iface.getKind() != TypeKind.DECLARED) { + continue; + } + TypeElement ifaceElement = (TypeElement) ((DeclaredType) iface).asElement(); + if (isMinecraftType(iface)) { + superMcTypes.add(ifaceElement); + } else { + superTypes.add(ifaceElement); + } + collectSuperTypes(ifaceElement, superTypes, superMcTypes, visited); + } + } + + private boolean isMinecraftType(TypeMirror type) { + if (type == null || type.getKind() != TypeKind.DECLARED) { + return false; + } + Element element = ((DeclaredType) type).asElement(); + if (!(element instanceof TypeElement typeElement)) { + return false; + } + String pkg = ElementNameUtils.getPackageName(typeElement); + return pkg != null && pkg.startsWith("net.minecraft."); + } + + private boolean isObfuscated(ExecutableElement method, TypeElement owner, Set superMcTypes) { + if (method.getAnnotation(Override.class) == null) { + return false; + } + for (TypeElement mcType : superMcTypes) { + for (Element element : mcType.getEnclosedElements()) { + if (element.getKind() != ElementKind.METHOD) { + continue; + } + if (elementUtils.overrides(method, (ExecutableElement) element, owner)) { + return true; + } + } + } + return false; + } + + private void addSuperMethods( + TypeElement owner, + Set superTypes, + Set superMcTypes, + List instanceMethods, + List members + ) { + if (instanceMethods.isEmpty() || superTypes.isEmpty()) { + return; + } + Set methodNames = new HashSet<>(); + for (ExecutableElement method : instanceMethods) { + methodNames.add(method.getSimpleName().toString()); + } + if (methodNames.isEmpty()) { + return; + } + + List superMethods = new ArrayList<>(); + for (TypeElement superType : superTypes) { + for (Element element : superType.getEnclosedElements()) { + if (element.getKind() != ElementKind.METHOD) { + continue; + } + if (!element.getModifiers().contains(Modifier.PUBLIC) + || element.getModifiers().contains(Modifier.STATIC)) { + continue; + } + ExecutableElement method = (ExecutableElement) element; + if (!methodNames.contains(method.getSimpleName().toString())) { + continue; + } + + boolean overridden = false; + for (ExecutableElement existing : instanceMethods) { + if (existing.getSimpleName().contentEquals(method.getSimpleName()) + && elementUtils.overrides(existing, method, owner)) { + overridden = true; + break; + } + } + if (overridden) { + continue; + } + for (ExecutableElement existing : superMethods) { + if (existing.getSimpleName().contentEquals(method.getSimpleName()) + && elementUtils.overrides(existing, method, owner)) { + overridden = true; + break; + } + } + if (overridden) { + continue; + } + if (element.getAnnotation(DocletIgnore.class) != null) { + continue; + } + if (isObfuscated(method, superType, superMcTypes)) { + continue; + } + superMethods.add(method); + } + } + + for (ExecutableElement method : superMethods) { + members.add(buildMethod(method)); + } + } + + private Map> collectMixinInterfaces(DocletEnvironment environment) { + Map> mixinInterfaces = new HashMap<>(); + for (Element element : environment.getIncludedElements()) { + if (!(element instanceof TypeElement type)) { + continue; + } + AnnotationMirror mixin = findAnnotation(type, "Mixin"); + if (mixin == null) { + continue; + } + List interfaces = type.getInterfaces(); + if (interfaces.isEmpty()) { + continue; + } + + Object targetsObj = getAnnotationValue(mixin, "value"); + if (!(targetsObj instanceof List targets) || targets.isEmpty()) { + continue; + } + + List mixinIfaces = new ArrayList<>(); + for (TypeMirror iface : interfaces) { + if (iface.getKind() != TypeKind.DECLARED) { + continue; + } + TypeElement ifaceElement = (TypeElement) ((DeclaredType) iface).asElement(); + if (ifaceElement.getAnnotation(DocletIgnore.class) != null) { + continue; + } + mixinIfaces.add(iface); + } + if (mixinIfaces.isEmpty()) { + continue; + } + + for (Object targetObj : targets) { + if (!(targetObj instanceof AnnotationValue av)) { + continue; + } + Object value = av.getValue(); + if (!(value instanceof TypeMirror mirror) || mirror.getKind() != TypeKind.DECLARED) { + continue; + } + TypeElement targetType = (TypeElement) ((DeclaredType) mirror).asElement(); + String qualifiedName = ElementNameUtils.getQualifiedName(targetType); + mixinInterfaces.computeIfAbsent(qualifiedName, key -> new ArrayList<>()) + .addAll(mixinIfaces); + } + } + return mixinInterfaces; + } + + private void addDeclaredType(Element element) { + DocletDeclareType declare = element.getAnnotation(DocletDeclareType.class); + if (declare != null) { + declaredTypes.add(new DeclaredTypeDoc(declare.name(), declare.type())); + } + } + + private MemberDoc buildField(Element element) { + DocComment comment = docCommentParser.parse(element); + List modifiers = new ArrayList<>(); + for (Modifier modifier : element.getModifiers()) { + modifiers.add(modifier.toString()); + } + + DocletReplaceReturn replaceReturn = element.getAnnotation(DocletReplaceReturn.class); + String replaceReturnValue = replaceReturn == null ? null : replaceReturn.value(); + TypeRef typeRef = typeResolver.resolve(element.asType()); + if (isNullable(element)) { + typeRef = typeRef.withNullable(true); + } + + return new MemberDoc( + MemberKind.FIELD, + element.getSimpleName().toString(), + ElementNameUtils.memberId(element), + List.of(), + List.of(), + typeRef, + null, + replaceReturnValue, + null, + modifiers, + comment + ); + } + + private MemberDoc buildConstructor(ExecutableElement element) { + return buildExecutable(element, MemberKind.CONSTRUCTOR); + } + + private MemberDoc buildMethod(ExecutableElement element) { + return buildExecutable(element, MemberKind.METHOD); + } + + private MemberDoc buildExecutable(ExecutableElement element, MemberKind kind) { + DocComment comment = docCommentParser.parse(element); + Map paramDocs = new HashMap<>(); + for (DocTag tag : comment.tags()) { + if (tag.kind() == DocTagKind.PARAM && tag.name() != null) { + paramDocs.put(tag.name(), tag.text()); + } + } + + List params = new ArrayList<>(); + List rawParams = element.getParameters(); + VariableElement varArgParam = element.isVarArgs() && !rawParams.isEmpty() + ? rawParams.get(rawParams.size() - 1) + : null; + for (VariableElement param : rawParams) { + boolean isVarArgs = param.equals(varArgParam); + TypeRef paramType = typeResolver.resolve(param.asType()); + if (isNullable(param)) { + paramType = paramType.withNullable(true); + } + params.add(new ParamDoc( + param.getSimpleName().toString(), + paramType, + isVarArgs, + paramDocs.getOrDefault(param.getSimpleName().toString(), "") + )); + } + + List typeParams = new ArrayList<>(); + for (TypeParameterElement param : element.getTypeParameters()) { + typeParams.add(typeResolver.resolve(param.asType())); + } + + List modifiers = new ArrayList<>(); + for (Modifier modifier : element.getModifiers()) { + modifiers.add(modifier.toString()); + } + + DocletReplaceParams replaceParams = element.getAnnotation(DocletReplaceParams.class); + DocletReplaceReturn replaceReturn = element.getAnnotation(DocletReplaceReturn.class); + DocletReplaceTypeParams replaceTypeParams = element.getAnnotation(DocletReplaceTypeParams.class); + + String replaceParamsValue = replaceParams == null ? null : replaceParams.value(); + String replaceReturnValue = replaceReturn == null ? null : replaceReturn.value(); + String replaceTypeParamsValue = replaceTypeParams == null ? null : replaceTypeParams.value(); + + String name = kind == MemberKind.CONSTRUCTOR + ? ElementNameUtils.getDisplayClassName((TypeElement) element.getEnclosingElement()) + : element.getSimpleName().toString(); + + TypeRef returnType = typeResolver.resolve( + kind == MemberKind.CONSTRUCTOR ? element.getEnclosingElement().asType() : element.getReturnType() + ); + if (kind == MemberKind.METHOD && isNullable(element)) { + returnType = returnType.withNullable(true); + } + + return new MemberDoc( + kind, + name, + ElementNameUtils.memberId(element), + params, + typeParams, + returnType, + replaceParamsValue, + replaceReturnValue, + replaceTypeParamsValue, + modifiers, + comment + ); + } + + private AnnotationMirror findAnnotation(TypeElement type, String name) { + for (AnnotationMirror mirror : type.getAnnotationMirrors()) { + String simpleName = mirror.getAnnotationType().asElement().getSimpleName().toString(); + if (simpleName.equals(name)) { + return mirror; + } + } + return null; + } + + private Object getAnnotationValue(AnnotationMirror annotation, String key) { + for (Map.Entry el : annotation.getElementValues().entrySet()) { + if (el.getKey().getSimpleName().toString().equals(key)) { + return el.getValue().getValue(); + } + } + return null; + } + + private boolean isNullable(Element element) { + return element.getAnnotationMirrors().stream() + .anyMatch(a -> a.getAnnotationType().asElement().getSimpleName().contentEquals("Nullable")); + } +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/LinkResolver.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/LinkResolver.java new file mode 100644 index 000000000..65e0f5168 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/LinkResolver.java @@ -0,0 +1,9 @@ +package xyz.wagyourtail.doclet.core; + +import xyz.wagyourtail.doclet.core.model.LinkRef; + +import javax.lang.model.element.Element; + +public interface LinkResolver { + LinkRef resolve(Element element); +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/Renderer.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/Renderer.java new file mode 100644 index 000000000..13d2ab418 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/Renderer.java @@ -0,0 +1,7 @@ +package xyz.wagyourtail.doclet.core; + +import xyz.wagyourtail.doclet.core.model.DocletModel; + +public interface Renderer { + String render(DocletModel model); +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/TargetLanguage.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/TargetLanguage.java new file mode 100644 index 000000000..5ed4b245b --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/TargetLanguage.java @@ -0,0 +1,8 @@ +package xyz.wagyourtail.doclet.core; + +public enum TargetLanguage { + TYPESCRIPT, + PYTHON, + MARKDOWN, + HTML +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/TypeResolver.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/TypeResolver.java new file mode 100644 index 000000000..06907aa17 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/TypeResolver.java @@ -0,0 +1,14 @@ +package xyz.wagyourtail.doclet.core; + +import xyz.wagyourtail.doclet.core.model.TypeRef; + +import javax.lang.model.type.TypeMirror; + +public interface TypeResolver { + TypeRef resolve(TypeMirror type); + String format(TypeRef type, TargetLanguage target); + + default String format(TypeRef type, TargetLanguage target, boolean paramType) { + return format(type, target); + } +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/mddoclet/Main.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/mddoclet/Main.java new file mode 100644 index 000000000..484bee155 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/mddoclet/Main.java @@ -0,0 +1,77 @@ +package xyz.wagyourtail.doclet.core.mddoclet; + +import com.sun.source.util.DocTrees; +import jdk.javadoc.doclet.Doclet; +import jdk.javadoc.doclet.DocletEnvironment; +import jdk.javadoc.doclet.Reporter; +import xyz.wagyourtail.doclet.core.BasicDocCommentParser; +import xyz.wagyourtail.doclet.core.BasicTypeResolver; +import xyz.wagyourtail.doclet.core.DocletModelBuilder; +import xyz.wagyourtail.doclet.core.render.MarkdownWriter; +import xyz.wagyourtail.doclet.mddoclet.options.Links; +import xyz.wagyourtail.doclet.mddoclet.options.McVersion; +import xyz.wagyourtail.doclet.options.IgnoredItem; +import xyz.wagyourtail.doclet.options.OutputDirectory; +import xyz.wagyourtail.doclet.options.Version; + +import javax.lang.model.SourceVersion; +import javax.tools.Diagnostic; +import java.io.File; +import java.io.IOException; +import java.util.Locale; +import java.util.Set; + +public class Main implements Doclet { + private Reporter reporter; + + @Override + public void init(Locale locale, Reporter reporter) { + this.reporter = reporter; + } + + @Override + public String getName() { + return "VitePressDoc Generator (Core)"; + } + + @Override + public Set getSupportedOptions() { + return Set.of( + new Version(), + new McVersion(), + new OutputDirectory(), + new Links(), + new IgnoredItem("-doctitle", 1), + new IgnoredItem("-notimestamp", 0), + new IgnoredItem("-windowtitle", 1) + ); + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.RELEASE_16; + } + + @Override + public boolean run(DocletEnvironment environment) { + DocTrees trees = environment.getDocTrees(); + BasicTypeResolver typeResolver = new BasicTypeResolver(); + DocletModelBuilder builder = new DocletModelBuilder(typeResolver, new BasicDocCommentParser(trees)); + var model = builder.build(environment); + + File outDir = new File(OutputDirectory.outputDir, Version.version); + if (!outDir.exists() && !outDir.mkdirs()) { + reporter.print(Diagnostic.Kind.ERROR, "Failed to create version dir\n"); + return false; + } + + MarkdownWriter writer = new MarkdownWriter(typeResolver); + try { + writer.write(model, outDir, Version.version, McVersion.mcVersion); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassDoc.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassDoc.java new file mode 100644 index 000000000..9593e8088 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassDoc.java @@ -0,0 +1,21 @@ +package xyz.wagyourtail.doclet.core.model; + +import java.util.List; + +public record ClassDoc( + String name, + String qualifiedName, + String packageName, + ClassKind kind, + String group, + String alias, + boolean eventCancellable, + String eventFilterer, + List typeParams, + List extendsTypes, + List implementsTypes, + List modifiers, + DocComment docComment, + List members +) { +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassKind.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassKind.java new file mode 100644 index 000000000..8bbd30eaf --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassKind.java @@ -0,0 +1,8 @@ +package xyz.wagyourtail.doclet.core.model; + +public enum ClassKind { + CLASS, + INTERFACE, + ENUM, + ANNOTATION +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DeclaredTypeDoc.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DeclaredTypeDoc.java new file mode 100644 index 000000000..e8ac816e3 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DeclaredTypeDoc.java @@ -0,0 +1,4 @@ +package xyz.wagyourtail.doclet.core.model; + +public record DeclaredTypeDoc(String name, String type) { +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocComment.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocComment.java new file mode 100644 index 000000000..45527e9e2 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocComment.java @@ -0,0 +1,6 @@ +package xyz.wagyourtail.doclet.core.model; + +import java.util.List; + +public record DocComment(String summary, String description, List tags) { +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocTag.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocTag.java new file mode 100644 index 000000000..aea7f4a41 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocTag.java @@ -0,0 +1,4 @@ +package xyz.wagyourtail.doclet.core.model; + +public record DocTag(DocTagKind kind, String name, String text) { +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocTagKind.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocTagKind.java new file mode 100644 index 000000000..e5992dfda --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocTagKind.java @@ -0,0 +1,11 @@ +package xyz.wagyourtail.doclet.core.model; + +public enum DocTagKind { + SINCE, + DEPRECATED, + SEE, + PARAM, + TEMPLATE, + RETURN, + OTHER +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocletModel.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocletModel.java new file mode 100644 index 000000000..25400d916 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/DocletModel.java @@ -0,0 +1,6 @@ +package xyz.wagyourtail.doclet.core.model; + +import java.util.List; + +public record DocletModel(List packages, List declaredTypes) { +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/LinkRef.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/LinkRef.java new file mode 100644 index 000000000..41b81f3fe --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/LinkRef.java @@ -0,0 +1,4 @@ +package xyz.wagyourtail.doclet.core.model; + +public record LinkRef(String url, boolean external) { +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/MemberDoc.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/MemberDoc.java new file mode 100644 index 000000000..bca5d1600 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/MemberDoc.java @@ -0,0 +1,18 @@ +package xyz.wagyourtail.doclet.core.model; + +import java.util.List; + +public record MemberDoc( + MemberKind kind, + String name, + String anchorId, + List params, + List typeParams, + TypeRef returnType, + String replaceParams, + String replaceReturn, + String replaceTypeParams, + List modifiers, + DocComment docComment +) { +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/MemberKind.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/MemberKind.java new file mode 100644 index 000000000..f2dde47b3 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/MemberKind.java @@ -0,0 +1,7 @@ +package xyz.wagyourtail.doclet.core.model; + +public enum MemberKind { + FIELD, + METHOD, + CONSTRUCTOR +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/PackageDoc.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/PackageDoc.java new file mode 100644 index 000000000..debf9a870 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/PackageDoc.java @@ -0,0 +1,6 @@ +package xyz.wagyourtail.doclet.core.model; + +import java.util.List; + +public record PackageDoc(String name, List classes) { +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ParamDoc.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ParamDoc.java new file mode 100644 index 000000000..467aeaa41 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ParamDoc.java @@ -0,0 +1,4 @@ +package xyz.wagyourtail.doclet.core.model; + +public record ParamDoc(String name, TypeRef type, boolean varArgs, String description) { +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/TypeKind.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/TypeKind.java new file mode 100644 index 000000000..c451cd512 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/TypeKind.java @@ -0,0 +1,13 @@ +package xyz.wagyourtail.doclet.core.model; + +public enum TypeKind { + PRIMITIVE, + DECLARED, + ARRAY, + TYPEVAR, + WILDCARD, + INTERSECTION, + UNION, + VOID, + UNKNOWN +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/TypeRef.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/TypeRef.java new file mode 100644 index 000000000..bd8cfe557 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/TypeRef.java @@ -0,0 +1,21 @@ +package xyz.wagyourtail.doclet.core.model; + +import java.util.List; + +public record TypeRef( + TypeKind kind, + String name, + String qualifiedName, + List typeArgs, + boolean array, + boolean varArgs, + TypeRef bounds, + boolean nullable +) { + public TypeRef withNullable(boolean nullable) { + if (this.nullable == nullable) { + return this; + } + return new TypeRef(kind, name, qualifiedName, typeArgs, array, varArgs, bounds, nullable); + } +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/pydoclet/Main.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/pydoclet/Main.java new file mode 100644 index 000000000..5dd4aec8c --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/pydoclet/Main.java @@ -0,0 +1,96 @@ +package xyz.wagyourtail.doclet.core.pydoclet; + +import com.sun.source.util.DocTrees; +import jdk.javadoc.doclet.Doclet; +import jdk.javadoc.doclet.DocletEnvironment; +import jdk.javadoc.doclet.Reporter; +import xyz.wagyourtail.doclet.core.BasicDocCommentParser; +import xyz.wagyourtail.doclet.core.BasicTypeResolver; +import xyz.wagyourtail.doclet.core.DocletModelBuilder; +import xyz.wagyourtail.doclet.core.render.PythonWriter; +import xyz.wagyourtail.doclet.options.IgnoredItem; +import xyz.wagyourtail.doclet.options.OutputDirectory; +import xyz.wagyourtail.doclet.options.Version; + +import javax.lang.model.SourceVersion; +import javax.tools.Diagnostic; +import java.io.File; +import java.io.IOException; +import java.util.Locale; +import java.util.Set; + +public class Main implements Doclet { + private Reporter reporter; + + @Override + public void init(Locale locale, Reporter reporter) { + this.reporter = reporter; + } + + @Override + public String getName() { + return "Python Generator (Core)"; + } + + @Override + public Set getSupportedOptions() { + return Set.of( + new Version(), + new OutputDirectory(), + new IgnoredItem("-doctitle", 1), + new IgnoredItem("-notimestamp", 0), + new IgnoredItem("-windowtitle", 1) + ); + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.RELEASE_16; + } + + @Override + public boolean run(DocletEnvironment environment) { + DocTrees trees = environment.getDocTrees(); + BasicTypeResolver typeResolver = new BasicTypeResolver(); + typeResolver.setPythonAliasEnabled(false); + DocletModelBuilder builder = new DocletModelBuilder(typeResolver, new BasicDocCommentParser(trees)); + var model = builder.build(environment); + + File outDir = OutputDirectory.outputDir; + if (outDir == null) { + reporter.print(Diagnostic.Kind.ERROR, "Output directory not set\n"); + return false; + } + if (outDir.exists() && !deleteRecursively(outDir)) { + reporter.print(Diagnostic.Kind.ERROR, "Failed to remove old python output\n"); + return false; + } + if (!outDir.exists() && !outDir.mkdirs()) { + reporter.print(Diagnostic.Kind.ERROR, "Failed to create output directory\n"); + return false; + } + + PythonWriter writer = new PythonWriter(); + try { + writer.write(model, outDir, Version.version); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } + + private boolean deleteRecursively(File file) { + if (file.isDirectory()) { + File[] children = file.listFiles(); + if (children != null) { + for (File child : children) { + if (!deleteRecursively(child)) { + return false; + } + } + } + } + return file.delete(); + } +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/MarkdownWriter.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/MarkdownWriter.java new file mode 100644 index 000000000..da8bf39b5 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/MarkdownWriter.java @@ -0,0 +1,361 @@ +package xyz.wagyourtail.doclet.core.render; + +import xyz.wagyourtail.FileHandler; +import xyz.wagyourtail.doclet.core.TargetLanguage; +import xyz.wagyourtail.doclet.core.TypeResolver; +import xyz.wagyourtail.doclet.core.model.ClassDoc; +import xyz.wagyourtail.doclet.core.model.DocComment; +import xyz.wagyourtail.doclet.core.model.DocTag; +import xyz.wagyourtail.doclet.core.model.DocTagKind; +import xyz.wagyourtail.doclet.core.model.DocletModel; +import xyz.wagyourtail.doclet.core.model.MemberDoc; +import xyz.wagyourtail.doclet.core.model.MemberKind; +import xyz.wagyourtail.doclet.core.model.PackageDoc; +import xyz.wagyourtail.doclet.core.model.ParamDoc; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public class MarkdownWriter { + private static final Pattern HTML_LINK = + Pattern.compile("(.*?)"); + private static final Pattern LINK_TAG = Pattern.compile("\\{@link\\s+([^}]+)}"); + private static final Map JAVA_NUMBER_TYPES = Map.of( + "java.lang.Integer", "int", + "java.lang.Float", "float", + "java.lang.Long", "long", + "java.lang.Short", "short", + "java.lang.Character", "char", + "java.lang.Byte", "byte", + "java.lang.Double", "double", + "java.lang.Number", "number" + ); + private final TypeResolver typeResolver; + + public MarkdownWriter(TypeResolver typeResolver) { + this.typeResolver = typeResolver; + } + + public void write(DocletModel model, File outDir, String version, String mcVersion) throws IOException { + for (PackageDoc pkg : model.packages()) { + for (ClassDoc clz : pkg.classes()) { + File out = new File(outDir, classPath(clz) + ".md"); + File parent = out.getParentFile(); + if (!parent.exists() && !parent.mkdirs()) { + throw new IOException("Failed to create package dir " + parent); + } + new FileHandler(out).write(renderClass(clz)); + } + } + + writeGroupIndexes(model, outDir, version, mcVersion); + } + + private String classPath(ClassDoc clz) { + String pkgPath = clz.packageName().replace('.', '/'); + String namePath = clz.name().replace('$', '.'); + return pkgPath.isEmpty() ? namePath : pkgPath + "/" + namePath; + } + + private void writeGroupIndexes(DocletModel model, File outDir, String version, String mcVersion) throws IOException { + Map> grouped = new java.util.HashMap<>(); + for (PackageDoc pkg : model.packages()) { + for (ClassDoc clz : pkg.classes()) { + grouped.computeIfAbsent(clz.group(), key -> new ArrayList<>()).add(clz); + } + } + grouped.values().forEach(list -> + list.sort(Comparator.comparing(ClassDoc::qualifiedName, String.CASE_INSENSITIVE_ORDER)) + ); + + new FileHandler(new File(outDir, "index.md")) + .write(renderOverview(grouped, version, mcVersion)); + new FileHandler(new File(outDir, "libraries.md")) + .write(renderGroupPage("Libraries", grouped.getOrDefault("Library", List.of()), true)); + new FileHandler(new File(outDir, "events.md")) + .write(renderGroupPage("Events", grouped.getOrDefault("Event", List.of()), true)); + new FileHandler(new File(outDir, "classes.md")) + .write(renderGroupPage("Classes", grouped.getOrDefault("Class", List.of()), false)); + } + + private String renderOverview(Map> grouped, String version, String mcVersion) { + StringBuilder builder = new StringBuilder(); + builder.append("---\noutline: false\n---\n\n"); + builder.append("# JsMacros API Reference\n\n"); + builder.append("Version: `").append(version).append("` \n"); + builder.append("Minecraft: `").append(mcVersion).append("`\n\n"); + builder.append("- [Libraries](./libraries.md) (").append(grouped.getOrDefault("Library", List.of()).size()).append(")\n"); + builder.append("- [Events](./events.md) (").append(grouped.getOrDefault("Event", List.of()).size()).append(")\n"); + builder.append("- [Classes](./classes.md) (").append(grouped.getOrDefault("Class", List.of()).size()).append(")\n\n"); + builder.append("Use the sidebar to browse packages and classes.\n"); + return builder.toString(); + } + + private String renderGroupPage(String title, List classes, boolean includeAlias) { + StringBuilder builder = new StringBuilder(); + builder.append("---\noutline: false\n---\n\n"); + builder.append("# ").append(title).append("\n\n"); + if (classes.isEmpty()) { + builder.append("No entries found.\n"); + return builder.toString(); + } + for (ClassDoc clz : classes) { + builder.append("- [") + .append(clz.qualifiedName()) + .append("](./") + .append(classPath(clz)) + .append(".md)"); + if (includeAlias && clz.alias() != null && !clz.alias().isEmpty()) { + builder.append(" - `").append(clz.alias()).append("`"); + } + builder.append("\n"); + } + return builder.toString(); + } + + private String renderClass(ClassDoc clz) { + StringBuilder builder = new StringBuilder(); + builder.append("---\noutline: deep\n---\n\n"); + builder.append("# ").append(clz.name()).append("\n\n"); + builder.append(clz.qualifiedName()).append("\n\n"); + String desc = formatDescription(clz.docComment()); + builder.append(desc.isEmpty() ? "TODO: No description supplied" : desc); + if ("Library".equals(clz.group())) { + String accessName = clz.alias() == null || clz.alias().isEmpty() ? clz.name() : clz.alias(); + builder.append("\nAccessible in scripts via the global `").append(accessName).append("` variable."); + } + builder.append("\n\n"); + + renderMemberSection(builder, clz, MemberKind.CONSTRUCTOR, "Constructors"); + renderMemberSection(builder, clz, MemberKind.FIELD, "Fields"); + renderMemberSection(builder, clz, MemberKind.METHOD, "Methods"); + return builder.toString(); + } + + private void renderMemberSection(StringBuilder builder, ClassDoc clz, MemberKind kind, String title) { + List members = clz.members().stream() + .filter(member -> member.kind() == kind) + .toList(); + if (members.isEmpty()) { + return; + } + builder.append("## ").append(title).append("\n\n"); + for (MemberDoc member : members) { + builder.append("### ").append(renderMemberTitle(member)).append("\n\n"); + String signature = renderSignature(member); + builder.append("**Signature:** `").append(signature.replace("`", "\\`")).append("`\n\n"); + String desc = formatDescription(member.docComment()); + if (!desc.isEmpty()) { + builder.append(desc).append("\n\n"); + } + String since = getTagText(member.docComment(), DocTagKind.SINCE); + if (!since.isEmpty()) { + builder.append("**Since:** ").append(formatDocText(since)).append("\n\n"); + } + if (hasDeprecatedTag(member.docComment())) { + String deprecated = getTagText(member.docComment(), DocTagKind.DEPRECATED); + builder.append("**Deprecated:** ").append(formatDocText(deprecated)).append("\n\n"); + } + appendParamDocs(builder, member); + if (member.kind() == MemberKind.METHOD) { + String ret = getTagText(member.docComment(), DocTagKind.RETURN); + if (!ret.isEmpty()) { + builder.append("**Returns:** ").append(formatDocText(ret)).append("\n\n"); + } + } + appendSeeDocs(builder, member.docComment()); + } + } + + private String renderMemberTitle(MemberDoc member) { + if (member.kind() == MemberKind.CONSTRUCTOR) { + return "new " + member.name() + "(" + renderParamNames(member) + ")"; + } + return member.name() + "(" + renderParamNames(member) + ")"; + } + + private String renderParamNames(MemberDoc member) { + StringBuilder builder = new StringBuilder(); + for (ParamDoc param : member.params()) { + builder.append(param.name()).append(", "); + } + if (!member.params().isEmpty()) { + builder.setLength(builder.length() - 2); + } + return builder.toString(); + } + + private String renderSignature(MemberDoc member) { + if (member.kind() == MemberKind.FIELD) { + return member.name() + ": " + renderType(member); + } + StringBuilder builder = new StringBuilder(); + if (member.kind() == MemberKind.CONSTRUCTOR) { + builder.append("new "); + } + builder.append(member.name()).append("("); + if (member.replaceParams() != null && !member.replaceParams().isBlank()) { + builder.append(member.replaceParams()); + } else { + for (ParamDoc param : member.params()) { + builder.append(renderParam(param)).append(", "); + } + if (!member.params().isEmpty()) { + builder.setLength(builder.length() - 2); + } + } + builder.append(")"); + if (member.kind() != MemberKind.CONSTRUCTOR) { + builder.append(": ").append(renderType(member)); + } + return builder.toString(); + } + + private String renderParam(ParamDoc param) { + return typeResolver.format(param.type(), TargetLanguage.MARKDOWN) + " " + param.name(); + } + + private String renderType(MemberDoc member) { + if (member.replaceReturn() != null && !member.replaceReturn().isBlank()) { + return member.replaceReturn(); + } + return typeResolver.format(member.returnType(), TargetLanguage.MARKDOWN); + } + + private String getTagText(DocComment comment, DocTagKind kind) { + for (DocTag tag : comment.tags()) { + if (tag.kind() == kind) { + return tag.text(); + } + } + return ""; + } + + private String formatDescription(DocComment comment) { + if (comment == null) { + return ""; + } + String text = comment.description(); + if (text == null || text.isBlank()) { + text = comment.summary(); + } + return text == null ? "" : formatDocText(text); + } + + private boolean hasDeprecatedTag(DocComment comment) { + if (comment == null) { + return false; + } + return comment.tags().stream().anyMatch(tag -> tag.kind() == DocTagKind.DEPRECATED); + } + + private void appendParamDocs(StringBuilder builder, MemberDoc member) { + List params = member.params(); + boolean hasDocs = params.stream().anyMatch(param -> param.description() != null && !param.description().isBlank()); + if (!hasDocs) { + return; + } + builder.append("**Parameters:**\n"); + for (ParamDoc param : params) { + String desc = param.description() == null ? "" : formatDocText(param.description()); + if (desc.isBlank()) { + continue; + } + builder.append("- `").append(param.name()).append("`: ").append(desc).append("\n"); + } + builder.append("\n"); + } + + private void appendSeeDocs(StringBuilder builder, DocComment comment) { + if (comment == null) { + return; + } + List sees = new ArrayList<>(); + for (DocTag tag : comment.tags()) { + if (tag.kind() == DocTagKind.SEE && tag.text() != null && !tag.text().isBlank()) { + sees.add(formatDocText(tag.text())); + } + } + if (sees.isEmpty()) { + return; + } + builder.append("**See:**\n"); + for (String see : sees) { + builder.append("- ").append(see).append("\n"); + } + builder.append("\n"); + } + + private String formatDocText(String text) { + if (text == null) { + return ""; + } + String formatted = text.trim(); + if (formatted.isEmpty()) { + return ""; + } + formatted = formatted.replaceAll("\n

", "\n") + .replaceAll("", "```"); + formatted = HTML_LINK.matcher(formatted).replaceAll("[$2]($1)"); + formatted = formatted.replace("<", "<").replace(">", ">"); + formatted = formatted.replaceAll("(?<=[.,:;>]) ?\n", " \n"); + formatted = convertLinkTags(formatted); + String trimmed = formatted.trim(); + if (looksLikeSignature(trimmed)) { + formatted = convertSignature(trimmed); + } + return formatted.trim(); + } + + private String convertLinkTags(String text) { + java.util.regex.Matcher matcher = LINK_TAG.matcher(text); + StringBuffer buffer = new StringBuffer(); + while (matcher.find()) { + String sig = matcher.group(1).trim(); + String mapped = mapSimpleLinkSignature(sig); + String replacement = mapped != null ? mapped : "{@link " + convertSignature(sig) + "}"; + matcher.appendReplacement(buffer, java.util.regex.Matcher.quoteReplacement(replacement)); + } + matcher.appendTail(buffer); + return buffer.toString(); + } + + private boolean looksLikeSignature(String text) { + if (text.startsWith("#")) { + return true; + } + return text.matches("^xyz\\.wagyourtail\\.[^#]+\\w$") + || text.matches("^\\w+\\.(?:\\w+\\.)+[\\w$_]+$"); + } + + private String convertSignature(String sig) { + if (sig.matches("^xyz\\.wagyourtail\\.[^#]+\\w$")) { + return sig.replaceFirst("^.+\\.(?=[^.]+$)", ""); + } + if (sig.matches("^\\w+\\.(?:\\w+\\.)+[\\w$_]+$")) { + return "Packages." + sig; + } + if (sig.startsWith("#")) { + return sig.substring(1); + } + return sig + .replaceFirst("^(?:xyz\\.wagyourtail\\.jsmacros\\.(?:client\\.api|core)\\.library\\.impl\\.)?F([A-Z]\\w+)#", "$1.") + .replaceFirst("#", "."); + } + + private String mapSimpleLinkSignature(String sig) { + if (JAVA_NUMBER_TYPES.containsKey(sig)) { + return JAVA_NUMBER_TYPES.get(sig); + } + return switch (sig) { + case "java.lang.String" -> "string"; + case "java.lang.Boolean" -> "boolean"; + default -> null; + }; + } +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/PythonWriter.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/PythonWriter.java new file mode 100644 index 000000000..c4608b751 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/PythonWriter.java @@ -0,0 +1,603 @@ +package xyz.wagyourtail.doclet.core.render; + +import xyz.wagyourtail.FileHandler; +import xyz.wagyourtail.doclet.core.model.ClassDoc; +import xyz.wagyourtail.doclet.core.model.DocComment; +import xyz.wagyourtail.doclet.core.model.DocletModel; +import xyz.wagyourtail.doclet.core.model.MemberDoc; +import xyz.wagyourtail.doclet.core.model.MemberKind; +import xyz.wagyourtail.doclet.core.model.PackageDoc; +import xyz.wagyourtail.doclet.core.model.ParamDoc; +import xyz.wagyourtail.doclet.core.model.TypeRef; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; + +public class PythonWriter { + private static final Set PYTHON_KEYWORDS = new LinkedHashSet<>(Arrays.asList( + "False", "await", "else", "import", "pass", "None", "break", "except", + "in", "raise", "True", "class", "finally", "is", "return", "and", + "continue", "for", "lambda", "try", "as", "def", "from", "nonlocal", + "while", "assert", "del", "global", "not", "with", "async", "elif", + "if", "or", "yield" + )); + + public PythonWriter() {} + + public void write(DocletModel model, File outDir, String version) throws IOException { + Map classNameByQualified = new LinkedHashMap<>(); + for (PackageDoc pkg : model.packages()) { + for (ClassDoc clz : pkg.classes()) { + classNameByQualified.put(clz.qualifiedName(), pythonClassName(clz)); + } + } + + for (PackageDoc pkg : model.packages()) { + for (ClassDoc clz : pkg.classes()) { + String fileName = pythonClassName(clz); + File out = new File(outDir, fileName + ".py"); + new FileHandler(out).write(renderClass(clz, classNameByQualified)); + } + } + + Map> grouped = groupClasses(model); + List groupOrder = List.of("libraries", "events", "helpers", "mixins", "rest"); + List groupModules = new ArrayList<>(); + for (String group : groupOrder) { + List classes = grouped.get(group); + if (classes == null || classes.isEmpty()) { + continue; + } + groupModules.add(group); + new FileHandler(new File(outDir, group + ".py")) + .write(renderGroupModule(group, classes)); + } + + StringBuilder init = new StringBuilder(); + for (String module : groupModules) { + init.append("from .").append(module).append(" import *\n"); + } + new FileHandler(new File(outDir, "__init__.py")).write(init.toString()); + + if (version != null) { + new FileHandler(new File(outDir, "setup.py")) + .write(renderSetupPy(version)); + } + } + + private String pythonClassName(ClassDoc clz) { + return clz.name().replace('.', '_'); + } + + private String renderClass(ClassDoc clz, Map classNameByQualified) { + PythonTypeContext ctx = new PythonTypeContext(classNameByQualified, pythonClassName(clz)); + StringBuilder body = new StringBuilder(); + + body.append(renderClassLine(clz, ctx)); + appendDocstring(body, 1, clz.docComment(), List.of(), false); + + for (MemberDoc member : clz.members()) { + if (member.kind() == MemberKind.FIELD) { + body.append(" ") + .append(getVarName(member.name())) + .append(": ") + .append(ctx.formatType(member.returnType(), false)) + .append("\n"); + } + } + + for (MemberDoc member : clz.members()) { + if (member.kind() == MemberKind.CONSTRUCTOR) { + body.append(renderConstructor(member, ctx)); + } else if (member.kind() == MemberKind.METHOD) { + body.append(renderMethod(member, ctx)); + } + } + + body.append(" pass\n\n"); + + StringBuilder builder = new StringBuilder(); + builder.append(ctx.renderImports()); + builder.append(body); + return builder.toString(); + } + + private String renderConstructor(MemberDoc member, PythonTypeContext ctx) { + StringBuilder builder = new StringBuilder(); + ctx.setOverloadUsed(true); + builder.append(" @overload\n"); + builder.append(" def __init__(self"); + appendParams(builder, member.params(), ctx); + builder.append(") -> None:\n"); + appendDocstring(builder, 2, member.docComment(), member.params(), false); + builder.append(" pass\n\n"); + return builder.toString(); + } + + private String renderMethod(MemberDoc member, PythonTypeContext ctx) { + StringBuilder builder = new StringBuilder(); + ctx.setOverloadUsed(true); + builder.append(" @overload\n"); + builder.append(" def ").append(getVarName(member.name())).append("(self"); + appendParams(builder, member.params(), ctx); + builder.append(") -> ").append(ctx.formatType(member.returnType(), false)).append(":\n"); + appendDocstring(builder, 2, member.docComment(), member.params(), true); + builder.append(" pass\n\n"); + return builder.toString(); + } + + private void appendParams(StringBuilder builder, List params, PythonTypeContext ctx) { + for (ParamDoc param : params) { + builder.append(", ").append(getVarName(param.name())).append(": ") + .append(ctx.formatType(param.type(), false)); + } + } + + private void appendDocstring( + StringBuilder builder, + int indent, + DocComment comment, + List params, + boolean includeReturn + ) { + String desc = formatDescription(comment); + String since = getTagText(comment, "SINCE"); + Map tagDocs = new LinkedHashMap<>(); + if (comment != null) { + comment.tags().stream() + .filter(tag -> tag.kind().name().equals("PARAM") && tag.name() != null) + .forEach(tag -> tagDocs.put(tag.name(), tag.text())); + } + Map paramDocs = new LinkedHashMap<>(); + if (params != null) { + for (ParamDoc param : params) { + if (tagDocs.containsKey(param.name())) { + paramDocs.put(param.name(), tagDocs.get(param.name())); + } + } + } + String ret = includeReturn ? getTagText(comment, "RETURN") : ""; + + if (desc.isEmpty() && since.isEmpty() && paramDocs.isEmpty() && ret.isEmpty()) { + return; + } + + String pad = " ".repeat(indent); + builder.append(pad).append("\"\"\""); + if (!desc.isEmpty()) { + builder.append(escape(desc)); + } + if (!since.isEmpty()) { + if (!desc.isEmpty()) { + builder.append("\n"); + } + builder.append("Since: ").append(escape(since)); + } + if (!paramDocs.isEmpty()) { + builder.append("\n\n").append(pad).append("Args:\n"); + for (Map.Entry entry : paramDocs.entrySet()) { + builder.append(pad).append(" ") + .append(getVarName(entry.getKey())) + .append(": ") + .append(escape(entry.getValue())) + .append("\n"); + } + builder.setLength(builder.length() - 1); + } + if (!ret.isEmpty()) { + builder.append("\n\n").append(pad).append("Returns:\n"); + builder.append(pad).append(" ").append(escape(ret)); + } + builder.append("\n").append(pad).append("\"\"\"\n"); + } + + private String renderClassLine(ClassDoc clz, PythonTypeContext ctx) { + StringBuilder builder = new StringBuilder("\nclass "); + builder.append(pythonClassName(clz)); + + List bases = new ArrayList<>(); + for (TypeRef iface : clz.implementsTypes()) { + String name = ctx.formatType(iface, true); + if (!name.isBlank()) { + bases.add(name); + } + } + if (!clz.typeParams().isEmpty()) { + ctx.setGenericUsed(true); + StringBuilder typeParams = new StringBuilder("Generic["); + for (TypeRef param : clz.typeParams()) { + String name = ctx.formatType(param, true); + typeParams.append(name).append(", "); + } + typeParams.setLength(typeParams.length() - 2); + typeParams.append("]"); + bases.add(typeParams.toString()); + } + for (TypeRef extend : clz.extendsTypes()) { + String name = ctx.formatType(extend, true); + if (!name.isBlank()) { + bases.add(name); + } + } + + if (!bases.isEmpty()) { + builder.append("("); + for (String base : bases) { + builder.append(base).append(", "); + } + builder.setLength(builder.length() - 2); + builder.append(")"); + } + builder.append(":\n"); + return builder.toString(); + } + + private String renderGroupModule(String group, List classes) { + StringBuilder builder = new StringBuilder(); + builder.append("from typing import TypeVar\n\n"); + builder.append("from .EventContainer import EventContainer\n"); + builder.append("from .BaseEvent import BaseEvent\n"); + + for (ClassDoc clz : classes) { + String name = pythonClassName(clz); + builder.append("from .").append(name).append(" import ").append(name).append("\n"); + } + + builder.append("\nFile = TypeVar(\"java.io.File\")\n\n"); + if ("libraries".equals(group)) { + builder.append("\n\n"); + for (ClassDoc clz : classes) { + String name = pythonClassName(clz); + String alias = clz.alias() == null || clz.alias().isEmpty() ? name : clz.alias(); + builder.append(alias).append(" = ").append(name).append("()\n"); + } + builder.append("context = EventContainer()\n"); + builder.append("file = File()\n"); + builder.append("event = BaseEvent()\n"); + } + + return builder.toString(); + } + + private Map> groupClasses(DocletModel model) { + Map> grouped = new LinkedHashMap<>(); + for (PackageDoc pkg : model.packages()) { + for (ClassDoc clz : pkg.classes()) { + String name = clz.name(); + String key; + if ("Library".equalsIgnoreCase(clz.group())) { + key = "libraries"; + } else if ("Event".equalsIgnoreCase(clz.group())) { + key = "events"; + } else if (name.contains("Helper")) { + key = "helpers"; + } else if (name.contains("Mixin")) { + key = "mixins"; + } else { + key = "rest"; + } + grouped.computeIfAbsent(key, value -> new ArrayList<>()).add(clz); + } + } + return grouped; + } + + private String renderSetupPy(String version) { + String cleaned = version; + if (cleaned.contains("-")) { + cleaned = cleaned.split("-", 2)[0]; + } + StringBuilder sb = new StringBuilder(); + sb.append(""" + from setuptools import setup, find_packages + from os import path + import os + import time + + this_directory = path.abspath(path.dirname(__file__)) + with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f: + long_description = f.read() + + + VERSION = '"""); + sb.append(cleaned); + sb.append(""" + ' + if "-" in VERSION: VERSION = VERSION.split("-")[0] + VERSION += "." + str(time.time()).split(".")[0][3:] + DESCRIPTION = 'A package to let your IDE know what JsMacros can do' + + def package_files(directory): + paths = [] + for (path, directories, filenames) in os.walk(directory): + for filename in filenames: + paths.append(os.path.join('..', path, filename)) + return paths + + extra_files = package_files('JsMacrosAC') + + # Setting up + setup( + name="JsMacrosAC", + version=VERSION, + author="Hasenzahn1", + author_email="", + description=DESCRIPTION, + long_description_content_type="text/markdown", + long_description=long_description, + packages=["JsMacrosAC"], + package_data = {"": extra_files}, + install_requires=[], + keywords=['python', 'JsMacros', 'Autocomplete', 'Doc'], + classifiers=[ + "Intended Audience :: Developers", + "Programming Language :: Python :: 3", + "Operating System :: Unix", + "Operating System :: MacOS :: MacOS X", + "Operating System :: Microsoft :: Windows", + ] + )"""); + return sb.toString(); + } + + private String formatDescription(DocComment comment) { + if (comment == null) { + return ""; + } + String text = comment.description(); + return text == null ? "" : text.trim(); + } + + private String getTagText(DocComment comment, String kind) { + if (comment == null) { + return ""; + } + return comment.tags().stream() + .filter(tag -> tag.kind().name().equals(kind)) + .map(tag -> tag.text()) + .findFirst() + .orElse(""); + } + + private String escape(String text) { + return text.replace("\"\"\"", "''"); + } + + private String getVarName(String name) { + return PYTHON_KEYWORDS.contains(name) ? name + "_" : name; + } + + private static class PythonTypeContext { + private static final Map TYPE_ALIASES = Map.ofEntries( + Map.entry("java.lang.Object", "object"), + Map.entry("java.lang.String", "str"), + Map.entry("java.lang.Integer", "int"), + Map.entry("java.lang.Boolean", "bool"), + Map.entry("java.lang.Double", "float"), + Map.entry("java.lang.Float", "float"), + Map.entry("java.lang.Long", "float"), + Map.entry("java.lang.Short", "float"), + Map.entry("java.lang.Byte", "float"), + Map.entry("java.lang.Character", "str"), + Map.entry("java.lang.annotation.Annotation", ""), + Map.entry("java.lang.Enum", "") + ); + private static final Set UNWANTED_CLASS = Set.of( + "java.lang.Object", + "java.lang.annotation.Annotation", + "java.lang.Enum", + "java.util.Collection" + ); + private static final Map WITH_ARG = Map.of( + "java.util.Set", "Set", + "java.util.List", "List", + "java.util.Map", "Mapping", + "java.util.Collection", "List" + ); + private static final List EXTERNAL_PREFIXES = List.of( + "net.", "com.", "io.", "org.", "java.", "javax.", "jdk." + ); + + private final Map classNameByQualified; + private final String currentClassName; + private final Set internalImports = new TreeSet<>(); + private final Map externalTypeVars = new TreeMap<>(); + private final Set typeVars = new TreeSet<>(); + private boolean overloadUsed; + private boolean importList; + private boolean importTypeVar; + private boolean importAny; + private boolean importMapping; + private boolean importSet; + private boolean importGeneric; + + private PythonTypeContext(Map classNameByQualified, String currentClassName) { + this.classNameByQualified = classNameByQualified; + this.currentClassName = currentClassName; + } + + String formatType(TypeRef type, boolean classContext) { + if (type == null) { + importAny = true; + return "Any"; + } + return switch (type.kind()) { + case PRIMITIVE -> switch (type.name()) { + case "boolean" -> "bool"; + case "int" -> "int"; + case "char" -> "str"; + case "byte", "short", "long", "float", "double" -> "float"; + default -> "int"; + }; + case VOID -> "None"; + case ARRAY -> { + importList = true; + String component = formatType(type.typeArgs().get(0), false); + yield "List[" + component + "]"; + } + case TYPEVAR -> { + importTypeVar = true; + typeVars.add(type.name()); + yield type.name(); + } + case WILDCARD -> { + importAny = true; + yield "Any"; + } + case DECLARED -> formatDeclared(type, classContext); + default -> "Any"; + }; + } + + private String formatDeclared(TypeRef type, boolean classContext) { + String qualified = type.qualifiedName(); + if (classContext && UNWANTED_CLASS.contains(qualified)) { + return ""; + } + if (TYPE_ALIASES.containsKey(qualified)) { + return TYPE_ALIASES.get(qualified); + } + if (WITH_ARG.containsKey(qualified)) { + String base = WITH_ARG.get(qualified); + if ("List".equals(base)) { + importList = true; + } else if ("Mapping".equals(base)) { + importMapping = true; + } else if ("Set".equals(base)) { + importSet = true; + } + if (type.typeArgs().isEmpty()) { + importAny = true; + return base + "[Any]"; + } + StringBuilder builder = new StringBuilder(base); + builder.append("["); + for (TypeRef arg : type.typeArgs()) { + builder.append(formatType(arg, false)).append(", "); + } + builder.setLength(builder.length() - 2); + builder.append("]"); + return builder.toString(); + } + + String className = type.name().replace('.', '_'); + if (className.equals(currentClassName)) { + return "\"" + className + "\""; + } + if (classNameByQualified.containsKey(qualified)) { + String importName = classNameByQualified.get(qualified); + if (!importName.equals(currentClassName)) { + internalImports.add(importName); + } + if (!type.typeArgs().isEmpty()) { + StringBuilder builder = new StringBuilder(importName); + builder.append("["); + for (TypeRef arg : type.typeArgs()) { + builder.append(formatType(arg, false)).append(", "); + } + builder.setLength(builder.length() - 2); + builder.append("]"); + return builder.toString(); + } + return importName; + } + + if (isExternalType(qualified)) { + importTypeVar = true; + String typeVarName = sanitizeTypeVarName(qualified); + externalTypeVars.put(className, typeVarName); + return className; + } + + if (!type.typeArgs().isEmpty()) { + StringBuilder builder = new StringBuilder(className); + builder.append("["); + for (TypeRef arg : type.typeArgs()) { + builder.append(formatType(arg, false)).append(", "); + } + builder.setLength(builder.length() - 2); + builder.append("]"); + return builder.toString(); + } + return className; + } + + private boolean isExternalType(String qualifiedName) { + for (String prefix : EXTERNAL_PREFIXES) { + if (qualifiedName.startsWith(prefix)) { + return true; + } + } + return false; + } + + private String sanitizeTypeVarName(String qualifiedName) { + return qualifiedName.replace("<", "_") + .replace(">", "_") + .replace("?", "") + .replace(".", "_"); + } + + String renderImports() { + StringBuilder builder = new StringBuilder(); + if (overloadUsed) { + builder.append("from typing import overload\n"); + } + if (importList) { + builder.append("from typing import List\n"); + } + if (importTypeVar) { + builder.append("from typing import TypeVar\n"); + } + if (importAny) { + builder.append("from typing import Any\n"); + } + if (importMapping) { + builder.append("from typing import Mapping\n"); + } + if (importSet) { + builder.append("from typing import Set\n"); + } + if (importGeneric) { + builder.append("from typing import Generic\n"); + } + for (String imp : internalImports) { + builder.append("from .").append(imp).append(" import ").append(imp).append("\n"); + } + builder.append("\n"); + + for (String typeVar : typeVars) { + builder.append(typeVar).append(" = TypeVar(\"").append(typeVar).append("\")\n"); + } + for (Map.Entry entry : externalTypeVars.entrySet()) { + String className = entry.getKey(); + String typeVarName = entry.getValue(); + if ("T".equals(typeVarName) || "U".equals(typeVarName) || "R".equals(typeVarName)) { + builder.append(typeVarName).append(" = TypeVar(\"").append(typeVarName).append("\")\n"); + } else { + builder.append(typeVarName).append(" = TypeVar(\"").append(typeVarName).append("\")\n"); + builder.append(className).append(" = ").append(typeVarName).append("\n\n"); + } + } + + return builder.toString(); + } + + void setOverloadUsed(boolean overloadUsed) { + this.overloadUsed = overloadUsed; + } + + void setGenericUsed(boolean genericUsed) { + this.importGeneric = genericUsed; + } + } +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/TsRenderer.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/TsRenderer.java new file mode 100644 index 000000000..d9522d79c --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/TsRenderer.java @@ -0,0 +1,891 @@ +package xyz.wagyourtail.doclet.core.render; + +import xyz.wagyourtail.doclet.core.BasicTypeResolver; +import xyz.wagyourtail.doclet.core.Renderer; +import xyz.wagyourtail.doclet.core.TargetLanguage; +import xyz.wagyourtail.doclet.core.TypeResolver; +import xyz.wagyourtail.doclet.core.model.ClassDoc; +import xyz.wagyourtail.doclet.core.model.ClassKind; +import xyz.wagyourtail.doclet.core.model.DeclaredTypeDoc; +import xyz.wagyourtail.doclet.core.model.DocComment; +import xyz.wagyourtail.doclet.core.model.DocTag; +import xyz.wagyourtail.doclet.core.model.DocTagKind; +import xyz.wagyourtail.doclet.core.model.DocletModel; +import xyz.wagyourtail.doclet.core.model.MemberDoc; +import xyz.wagyourtail.doclet.core.model.MemberKind; +import xyz.wagyourtail.doclet.core.model.PackageDoc; +import xyz.wagyourtail.doclet.core.model.ParamDoc; +import xyz.wagyourtail.doclet.core.model.TypeKind; +import xyz.wagyourtail.doclet.core.model.TypeRef; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.regex.Pattern; + + +public class TsRenderer implements Renderer { + private static final Pattern HTML_LINK = + Pattern.compile("(.*?)"); + private static final Pattern LINK_TAG = + Pattern.compile("\\{@link\\s+([^}]+)}"); + private static final Set TS_RESERVED_WORDS = Set.of( + "break", "case", "catch", "class", "const", "continue", "debugger", "default", + "delete", "do", "else", "enum", "export", "extends", "false", "finally", "for", + "function", "if", "import", "in", "instanceof", "new", "null", "return", "super", + "switch", "this", "throw", "true", "try", "typeof", "var", "void", "while", "with" + ); + private static final Map JAVA_NUMBER_TYPES = Map.of( + "java.lang.Integer", "int", + "java.lang.Float", "float", + "java.lang.Long", "long", + "java.lang.Short", "short", + "java.lang.Character", "char", + "java.lang.Byte", "byte", + "java.lang.Double", "double", + "java.lang.Number", "number" + ); + private final TypeResolver typeResolver; + + public TsRenderer(TypeResolver typeResolver) { + this.typeResolver = typeResolver; + } + + @Override + public String render(DocletModel model) { + Map tsAliases = buildTypeScriptAliases(model); + applyTypeScriptAliases(tsAliases); + + List events = collectByGroup(model, "Event"); + List libraries = collectByGroup(model, "Library"); + + StringBuilder out = new StringBuilder(); + appendGlobalDeclarations(out); + appendEvents(out, events); + appendEventFilterers(out, events); + appendEventTypeMap(out, events); + appendLibraries(out, libraries); + + out.append("\n\ndeclare ").append(renderPackages(model)).append("\n"); + appendAliasTypes(out, model); + appendEnumTypes(out, model.declaredTypes()); + + return out.toString(); + } + + private void appendGlobalDeclarations(StringBuilder out) { + out.append("/**\n"); + out.append(" * The global context\n"); + out.append(" * If you're trying to access the context in {@link JsMacros.on},\n"); + out.append(" * use the second param of callback\n"); + out.append(" */\n"); + out.append("declare const context: EventContainer;\n"); + out.append("/**\n"); + out.append(" * Assert and convert event type:\n"); + out.append(" * ```js\n"); + out.append(" * JsMacros.assertEvent(event, 'Service')\n"); + out.append(" * ```\n"); + out.append(" * If the type doesn't convert, that means the event type doesn't have any properties\n"); + out.append(" */\n"); + out.append("declare const event: Events.BaseEvent;\n"); + out.append("declare const file: Packages.java.io.File;\n\n"); + } + + private void appendEvents(StringBuilder out, List events) { + out.append("declare namespace Events {\n\n"); + indent(out, 1).append("interface BaseEvent extends JavaObject {\n\n"); + indent(out, 2).append("getEventName(): string;\n\n"); + indent(out, 1).append("}\n\n"); + indent(out, 1).append("interface Cancellable {\n\n"); + indent(out, 2).append("cancel(): void;\n\n"); + indent(out, 1).append("}\n"); + + for (ClassDoc event : events) { + out.append("\n"); + renderEventInterface(out, event, 1); + } + out.append("\n}\n"); + } + + private void appendEventFilterers(StringBuilder out, List events) { + out.append("\ninterface EventFilterers {\n"); + for (ClassDoc event : events) { + if (event.eventFilterer() == null || event.eventFilterer().isBlank()) { + continue; + } + indent(out, 1).append(event.alias()).append(": ").append(event.eventFilterer()).append(";\n"); + } + out.append("}\n"); + } + + private void appendEventTypeMap(StringBuilder out, List events) { + out.append("\ninterface Events {\n"); + for (ClassDoc event : events) { + indent(out, 1).append(event.alias()).append(": Events.").append(event.alias()).append(";\n"); + } + out.append("}\n"); + } + + private void appendLibraries(StringBuilder out, List libraries) { + for (ClassDoc library : libraries) { + out.append("\n"); + renderLibraryNamespace(out, library, 0); + } + } + + private void renderLibraryNamespace(StringBuilder out, ClassDoc library, int indent) { + DocComment libraryComment = sanitizeLibraryComment(library.docComment()); + appendDocComment(out, libraryComment, List.of(), false, null, library, indent); + indent(out, indent).append("declare namespace ").append(library.alias()).append(" {\n"); + for (MemberDoc member : library.members()) { + if (member.kind() != MemberKind.METHOD || hasModifier(member, "static")) { + continue; + } + appendDocComment(out, member.docComment(), member.params(), true, member, library, indent + 1); + indent(out, indent + 1).append("function ").append(member.name()); + appendTypeParams(out, member.typeParams(), member.replaceTypeParams(), false); + out.append("("); + appendParams(out, member.params()); + out.append(")"); + out.append(": ").append(formatReturn(member, library)); + out.append(";\n"); + } + indent(out, indent).append("}\n"); + } + + private void renderEventInterface(StringBuilder out, ClassDoc event, int indent) { + appendDocComment(out, event.docComment(), List.of(), false, null, event, indent); + indent(out, indent).append("interface ").append(event.alias()).append(" extends BaseEvent"); + if (event.eventCancellable()) { + out.append(", Cancellable"); + } + out.append(" {\n"); + for (MemberDoc member : event.members()) { + if (member.kind() == MemberKind.FIELD && !hasModifier(member, "static")) { + renderField(out, member, indent + 1, false, event); + } else if (member.kind() == MemberKind.METHOD && !hasModifier(member, "static")) { + renderMethod(out, member, indent + 1, false, event); + } + } + indent(out, indent).append("}\n"); + } + + private String renderPackages(DocletModel model) { + PackageNode root = buildTree(model); + PackageNode current = root; + String name = root.name; + while (current.classes.isEmpty() && current.children.size() == 1) { + PackageNode child = current.children.values().iterator().next(); + if (isReservedWord(child.name)) { + break; + } + name = name + "." + child.name; + current = child; + } + StringBuilder out = new StringBuilder(); + out.append("namespace ").append(name).append(" {\n"); + renderPackageNode(out, current, 1); + out.append("}"); + return out.toString(); + } + + private PackageNode buildTree(DocletModel model) { + PackageNode root = new PackageNode("Packages"); + for (PackageDoc pkg : model.packages()) { + for (ClassDoc clz : pkg.classes()) { + root.addClass(pkg.name(), clz); + } + } + return root; + } + + private void renderPackageNode(StringBuilder out, PackageNode node, int indent) { + for (PackageNode child : node.children.values()) { + PackageNode current = child; + String mergedName = child.name; + while (current.classes.isEmpty() && current.children.size() == 1) { + PackageNode onlyChild = current.children.values().iterator().next(); + if (isReservedWord(onlyChild.name)) { + break; + } + mergedName = mergedName + "." + onlyChild.name; + current = onlyChild; + } + String namespaceName = escapePackageName(mergedName); + indent(out, indent).append("export namespace ").append(namespaceName).append(" {\n"); + renderPackageNode(out, current, indent + 1); + indent(out, indent).append("}\n"); + if (isReservedWord(child.name)) { + indent(out, indent).append("export { ").append(namespaceName).append(" as ") + .append(child.name).append(" };\n"); + } + } + for (ClassDoc clz : node.classes) { + renderClass(out, clz, indent); + } + } + + private void renderClass(StringBuilder out, ClassDoc clz, int indent) { + if (clz.kind() == ClassKind.INTERFACE) { + appendDocComment(out, clz.docComment(), List.of(), false, null, clz, indent); + indent(out, indent).append("export abstract class ").append(tsSafeName(clz.name())) + .append(" extends java.lang.Interface {\n"); + appendClassHeader(out, clz, indent + 1); + renderStaticMembers(out, clz, indent + 1, clz); + indent(out, indent).append("}\n"); + + indent(out, indent).append("export interface ").append(tsSafeName(clz.name())); + appendTypeParams(out, clz.typeParams(), null, false); + appendImplements(out, clz); + out.append(" {\n"); + renderInstanceMembers(out, clz, indent + 1, clz); + indent(out, indent).append("}\n"); + return; + } + + if (!clz.implementsTypes().isEmpty()) { + appendDocComment(out, clz.docComment(), List.of(), false, null, clz, indent); + indent(out, indent).append("export interface ").append(tsSafeName(clz.name())); + appendTypeParams(out, clz.typeParams(), null, false); + appendImplements(out, clz); + out.append(" {}\n"); + } else { + appendDocComment(out, clz.docComment(), List.of(), false, null, clz, indent); + } + + boolean hasConstructor = clz.members().stream().anyMatch(member -> member.kind() == MemberKind.CONSTRUCTOR); + indent(out, indent).append("export ").append(hasConstructor ? "class " : "abstract class ") + .append(tsSafeName(clz.name())); + appendTypeParams(out, clz.typeParams(), null, false); + appendExtends(out, clz); + out.append(" {\n"); + appendClassHeader(out, clz, indent + 1); + renderStaticMembers(out, clz, indent + 1, clz); + renderConstructors(out, clz, indent + 1); + renderInstanceMembers(out, clz, indent + 1, clz); + indent(out, indent).append("}\n"); + } + + private void renderField(StringBuilder out, MemberDoc member, int indent, boolean includeStatic, ClassDoc owner) { + appendDocComment(out, member.docComment(), List.of(), false, member, owner, indent); + indent(out, indent); + if (includeStatic && hasModifier(member, "static")) { + out.append("static "); + } + if (hasModifier(member, "final")) { + out.append("readonly "); + } + out.append(member.name()).append(": ").append(formatReturn(member, owner)).append(";\n"); + } + + private void renderMethod(StringBuilder out, MemberDoc member, int indent, boolean includeStatic, ClassDoc owner) { + appendDocComment(out, member.docComment(), member.params(), true, member, owner, indent); + indent(out, indent); + if (includeStatic && hasModifier(member, "static")) { + out.append("static "); + } + out.append(member.name()); + appendTypeParams(out, member.typeParams(), member.replaceTypeParams(), false); + out.append("("); + if (member.replaceParams() != null && !member.replaceParams().isBlank()) { + out.append(member.replaceParams()); + } else { + appendParams(out, member.params()); + } + out.append(")"); + out.append(": ").append(formatReturn(member, owner)); + out.append(";\n"); + } + + private void renderConstructor(StringBuilder out, MemberDoc member, int indent, ClassDoc owner) { + appendDocComment(out, member.docComment(), member.params(), false, member, owner, indent); + indent(out, indent).append("constructor"); + appendTypeParams(out, member.typeParams(), member.replaceTypeParams(), false); + out.append("("); + if (member.replaceParams() != null && !member.replaceParams().isBlank()) { + out.append(member.replaceParams()); + } else { + appendParams(out, member.params()); + } + out.append(");\n"); + } + + private void renderStaticMembers(StringBuilder out, ClassDoc clz, int indent, ClassDoc owner) { + for (MemberDoc member : clz.members()) { + if (!hasModifier(member, "static")) { + continue; + } + if (member.kind() == MemberKind.FIELD) { + renderField(out, member, indent, true, owner); + } else if (member.kind() == MemberKind.METHOD) { + renderMethod(out, member, indent, true, owner); + } + } + } + + private void renderConstructors(StringBuilder out, ClassDoc clz, int indent) { + for (MemberDoc member : clz.members()) { + if (member.kind() == MemberKind.CONSTRUCTOR) { + renderConstructor(out, member, indent, clz); + } + } + } + + private void renderInstanceMembers(StringBuilder out, ClassDoc clz, int indent, ClassDoc owner) { + for (MemberDoc member : clz.members()) { + if (hasModifier(member, "static")) { + continue; + } + if (member.kind() == MemberKind.FIELD) { + renderField(out, member, indent, false, owner); + } else if (member.kind() == MemberKind.METHOD) { + renderMethod(out, member, indent, false, owner); + } + } + } + + private void appendParams(StringBuilder out, List params) { + boolean first = true; + for (ParamDoc param : params) { + if (!first) { + out.append(", "); + } + first = false; + if (param.varArgs()) { + out.append("..."); + } + String name = escapeParamName(param.name()); + out.append(name).append(": "); + if (param.varArgs()) { + String baseType = formatType(param.type(), true, false); + if (baseType.endsWith("[]")) { + baseType = baseType.substring(0, baseType.length() - "[]".length()); + } + if (param.type().nullable()) { + baseType = baseType + " | null"; + } + out.append("JavaVarArgs<").append(baseType).append(">"); + } else { + out.append(formatType(param.type(), true, true)); + } + } + } + + private void appendTypeParams( + StringBuilder out, + List typeParams, + String replaceTypeParams, + boolean defaultToAny + ) { + if (replaceTypeParams != null && !replaceTypeParams.isBlank()) { + out.append("<").append(replaceTypeParams).append(">"); + return; + } + if (typeParams == null || typeParams.isEmpty()) { + return; + } + out.append("<"); + boolean first = true; + for (TypeRef param : typeParams) { + if (!first) { + out.append(", "); + } + first = false; + out.append(formatTypeParam(param, defaultToAny)); + } + out.append(">"); + } + + private String formatTypeParam(TypeRef param, boolean defaultToAny) { + StringBuilder out = new StringBuilder(param.name()); + String ext = param.bounds() == null ? "any" : formatType(param.bounds(), false, false); + if (!ext.endsWith("any")) { + out.append(" extends ").append(ext); + if (defaultToAny) { + out.append(" = any"); + } + } else if (ext.startsWith("/* net.minecraft.")) { + out.append(" = ").append(ext); + } else if (defaultToAny) { + out.append(" = any"); + } + return out.toString(); + } + + private String formatReturn(MemberDoc member, ClassDoc owner) { + if (member.replaceReturn() != null && !member.replaceReturn().isBlank()) { + return member.replaceReturn(); + } + if (shouldReturnThis(member, owner)) { + return "this"; + } + return formatType(member.returnType(), false, true); + } + + private String formatType(TypeRef type, boolean paramType, boolean includeNull) { + String formatted = typeResolver.format(type, TargetLanguage.TYPESCRIPT, paramType); + if (includeNull && type.nullable()) { + return formatted + " | null"; + } + return formatted; + } + + private void appendAliasTypes(StringBuilder out, DocletModel model) { + List wagClasses = new ArrayList<>(); + for (PackageDoc pkg : model.packages()) { + if (pkg.name().startsWith("xyz.wagyourtail")) { + wagClasses.addAll(pkg.classes()); + } + } + wagClasses.sort(Comparator.comparing(ClassDoc::name, String.CASE_INSENSITIVE_ORDER)); + Set seen = new HashSet<>(); + Set aliases = new TreeSet<>(); + for (ClassDoc clz : wagClasses) { + if (!seen.add(clz.name())) { + continue; + } + String aliasName = buildAliasName(clz, true); + String aliasValue = formatClassType(clz); + aliases.add("type " + aliasName + " = " + aliasValue + ";"); + } + for (String alias : aliases) { + out.append("\n").append(alias); + } + } + + private String buildAliasName(ClassDoc clz, boolean defaultToAny) { + StringBuilder out = new StringBuilder(clz.name()); + if (clz.typeParams() != null && !clz.typeParams().isEmpty()) { + out.append("<"); + boolean first = true; + for (TypeRef param : clz.typeParams()) { + if (!first) { + out.append(", "); + } + first = false; + out.append(formatTypeParam(param, defaultToAny)); + } + out.append(">"); + } + return out.toString(); + } + + private String formatClassType(ClassDoc clz) { + TypeRef classType = new TypeRef( + TypeKind.DECLARED, + clz.name(), + clz.qualifiedName(), + clz.typeParams(), + false, + false, + null, + false + ); + return typeResolver.format(classType, TargetLanguage.TYPESCRIPT, false); + } + + private void appendEnumTypes(StringBuilder out, List declaredTypes) { + out.append( + """ + + // Enum types + type Bit = 1 | 0; + type Trit = 2 | Bit; + type Dit = 3 | Trit; + type Pentit = 4 | Dit; + type Hexit = 5 | Pentit; + type Septit = 6 | Hexit; + type Octit = 7 | Septit; + + type Side = Hexit; + type HotbarSlot = Octit | 8; + type HotbarSwapSlot = HotbarSlot | OffhandSlot; + type ClickSlotButton = HotbarSwapSlot | 9 | 10; + type OffhandSlot = 40; + + """ + ); + + for (DeclaredTypeDoc decl : declaredTypes) { + out.append("type ").append(decl.name()).append(" = ").append(decl.type()); + if (!decl.type().contains("\n")) { + out.append(";"); + } + out.append("\n"); + } + } + + private List collectByGroup(DocletModel model, String group) { + List result = new ArrayList<>(); + for (PackageDoc pkg : model.packages()) { + for (ClassDoc clz : pkg.classes()) { + if (group.equals(clz.group())) { + result.add(clz); + } + } + } + result.sort(Comparator.comparing(ClassDoc::alias, String.CASE_INSENSITIVE_ORDER)); + return result; + } + + private Map buildTypeScriptAliases(DocletModel model) { + Map aliases = new HashMap<>(); + aliases.put("xyz.wagyourtail.jsmacros.core.event.BaseEvent", "Events.BaseEvent"); + for (PackageDoc pkg : model.packages()) { + for (ClassDoc clz : pkg.classes()) { + if ("Event".equals(clz.group()) && clz.alias() != null) { + aliases.put(clz.qualifiedName(), "Events." + clz.alias()); + } else if ("Library".equals(clz.group()) && clz.alias() != null) { + aliases.put(clz.qualifiedName(), "typeof " + clz.alias()); + } + } + } + return aliases; + } + + private void applyTypeScriptAliases(Map aliases) { + if (typeResolver instanceof BasicTypeResolver basicTypeResolver) { + basicTypeResolver.setTypeScriptAliases(aliases); + } + } + + private StringBuilder indent(StringBuilder out, int indent) { + out.append(" ".repeat(Math.max(0, indent))); + return out; + } + + private boolean hasModifier(MemberDoc member, String modifier) { + return member.modifiers().contains(modifier); + } + + private String tsSafeName(String name) { + return name.replace('.', '$'); + } + + private String escapeParamName(String name) { + if (isReservedWord(name)) { + return "_" + name; + } + return name; + } + + private String escapePackageName(String name) { + if (isReservedWord(name)) { + return "_" + name; + } + return name; + } + + private boolean isReservedWord(String name) { + return TS_RESERVED_WORDS.contains(name); + } + + private void appendClassHeader(StringBuilder out, ClassDoc clz, int indent) { + indent(out, indent).append("static readonly class: JavaClass<") + .append(buildClassHeaderType(clz)).append(">;\n"); + indent(out, indent).append("/** @deprecated */ static prototype: undefined;\n"); + } + + private String buildClassHeaderType(ClassDoc clz) { + StringBuilder builder = new StringBuilder(tsSafeName(clz.name())); + int params = clz.typeParams().size(); + if (params > 0) { + builder.append("<"); + builder.append("any, ".repeat(params)); + builder.setLength(builder.length() - 2); + builder.append(">"); + } + return builder.toString(); + } + + private void appendExtends(StringBuilder out, ClassDoc clz) { + String extendsType; + if (clz.extendsTypes().isEmpty()) { + extendsType = "java.lang.Object"; + } else { + extendsType = formatHeritageType(clz.extendsTypes().get(0), true); + } + out.append(" extends ").append(extendsType); + } + + private void appendImplements(StringBuilder out, ClassDoc clz) { + if (clz.implementsTypes().isEmpty()) { + return; + } + out.append(" extends "); + boolean first = true; + for (TypeRef type : clz.implementsTypes()) { + if (!first) { + out.append(", "); + } + first = false; + out.append(formatHeritageType(type, false)); + } + } + + private String formatHeritageType(TypeRef type, boolean isExtends) { + String formatted = typeResolver.format(type, TargetLanguage.TYPESCRIPT, false); + if (isExtends) { + if (formatted.equals("any") || formatted.equals("JavaObject") || formatted.equals("Object") + || formatted.equals("void")) { + return "java.lang.Object"; + } + if (formatted.startsWith("/* net.minecraft.") && formatted.endsWith("any")) { + return formatted.substring(0, formatted.length() - "any".length()) + "java.lang.Object"; + } + return formatted; + } + if (formatted.startsWith("/* net.minecraft.") && formatted.endsWith("any")) { + return formatted.substring(0, formatted.length() - "any".length()) + "JavaObject"; + } + return formatted; + } + + private boolean shouldReturnThis(MemberDoc member, ClassDoc owner) { + if (owner == null || member.docComment() == null || member.kind() != MemberKind.METHOD) { + return false; + } + String returnText = getTagText(member.docComment(), DocTagKind.RETURN); + if (returnText.isBlank()) { + return false; + } + String trimmed = returnText.trim(); + if (!trimmed.equals("self") && !trimmed.startsWith("self ")) { + return false; + } + TypeRef returnType = member.returnType(); + return returnType != null && owner.qualifiedName().equals(returnType.qualifiedName()); + } + + private void appendDocComment( + StringBuilder out, + DocComment comment, + List params, + boolean includeReturn, + MemberDoc member, + ClassDoc owner, + int indent + ) { + if (comment == null) { + return; + } + String desc = formatDocText(comment.description().isBlank() ? comment.summary() : comment.description()); + List lines = new ArrayList<>(); + if (!desc.isBlank()) { + lines.add(desc); + } + + Map paramDocs = new HashMap<>(); + for (DocTag tag : comment.tags()) { + if (tag.kind() == DocTagKind.PARAM && tag.name() != null) { + paramDocs.put(tag.name(), formatDocText(tag.text())); + } + } + for (ParamDoc param : params) { + String text = paramDocs.get(param.name()); + if (text != null && !text.isBlank()) { + lines.add("@param " + escapeParamName(param.name()) + " " + text); + } + } + + if (includeReturn) { + String returnText = formatDocText(getTagText(comment, DocTagKind.RETURN)); + if (!returnText.isBlank()) { + if (returnText.startsWith("{")) { + returnText = "{*} " + returnText; + } + lines.add("@return " + returnText); + } else if (shouldReturnThis(member, owner)) { + lines.add("@return self"); + } + } + + String since = formatDocText(getTagText(comment, DocTagKind.SINCE)); + if (!since.isBlank()) { + lines.add("@since " + since); + } + String deprecated = formatDocText(getTagText(comment, DocTagKind.DEPRECATED)); + if (hasDeprecatedTag(comment)) { + lines.add(deprecated.isBlank() ? "@deprecated" : "@deprecated " + deprecated); + } + for (String see : getTagTexts(comment, DocTagKind.SEE)) { + String formatted = formatDocText(see); + if (!formatted.isBlank()) { + lines.add("@see " + formatted); + } + } + for (DocTag tag : comment.tags()) { + if (tag.kind() == DocTagKind.TEMPLATE && tag.name() != null) { + String text = formatDocText(tag.text()); + if (!text.isBlank()) { + lines.add("@template " + tag.name() + " " + text); + } + } + } + for (DocTag tag : comment.tags()) { + if (tag.kind() == DocTagKind.OTHER && tag.text() != null) { + String text = formatDocText(tag.text()); + if (!text.isBlank()) { + lines.add(text); + } + } + } + + if (lines.isEmpty()) { + return; + } + indent(out, indent).append("/**\n"); + for (String line : lines) { + indent(out, indent).append(" * ").append(line).append("\n"); + } + indent(out, indent).append(" */\n"); + } + + private boolean hasDeprecatedTag(DocComment comment) { + if (comment == null) { + return false; + } + return comment.tags().stream().anyMatch(tag -> tag.kind() == DocTagKind.DEPRECATED); + } + + private String getTagText(DocComment comment, DocTagKind kind) { + if (comment == null) { + return ""; + } + for (DocTag tag : comment.tags()) { + if (tag.kind() == kind) { + return tag.text(); + } + } + return ""; + } + + private List getTagTexts(DocComment comment, DocTagKind kind) { + if (comment == null) { + return List.of(); + } + List values = new ArrayList<>(); + for (DocTag tag : comment.tags()) { + if (tag.kind() == kind) { + values.add(tag.text()); + } + } + return values; + } + + private String formatDocText(String text) { + if (text == null) { + return ""; + } + String formatted = text.trim(); + if (formatted.isEmpty()) { + return ""; + } + formatted = formatted.replaceAll("\n

", "\n") + .replaceAll("", "```"); + formatted = HTML_LINK.matcher(formatted).replaceAll("[$2]($1)"); + formatted = formatted.replace("<", "<").replace(">", ">"); + formatted = formatted.replaceAll("(?<=[.,:;>]) ?\n", " \n"); + formatted = convertLinkTags(formatted); + String trimmed = formatted.trim(); + if (looksLikeSignature(trimmed)) { + formatted = convertSignature(trimmed); + } + return formatted.trim(); + } + + private String convertLinkTags(String text) { + java.util.regex.Matcher matcher = LINK_TAG.matcher(text); + StringBuffer buffer = new StringBuffer(); + while (matcher.find()) { + String sig = matcher.group(1).trim(); + String mapped = mapSimpleLinkSignature(sig); + String replacement = mapped != null ? mapped : "{@link " + convertSignature(sig) + "}"; + matcher.appendReplacement(buffer, java.util.regex.Matcher.quoteReplacement(replacement)); + } + matcher.appendTail(buffer); + return buffer.toString(); + } + + private boolean looksLikeSignature(String text) { + if (text.startsWith("#")) { + return true; + } + return text.matches("^xyz\\.wagyourtail\\.[^#]+\\w$") + || text.matches("^\\w+\\.(?:\\w+\\.)+[\\w$_]+$"); + } + + private String convertSignature(String sig) { + if (sig.matches("^xyz\\.wagyourtail\\.[^#]+\\w$")) { + return sig.replaceFirst("^.+\\.(?=[^.]+$)", ""); + } + if (sig.matches("^\\w+\\.(?:\\w+\\.)+[\\w$_]+$")) { + return "Packages." + sig; + } + if (sig.startsWith("#")) { + return sig.substring(1); + } + return sig + .replaceFirst("^(?:xyz\\.wagyourtail\\.jsmacros\\.(?:client\\.api|core)\\.library\\.impl\\.)?F([A-Z]\\w+)#", "$1.") + .replaceFirst("#", "."); + } + + private String mapSimpleLinkSignature(String sig) { + if (JAVA_NUMBER_TYPES.containsKey(sig)) { + return JAVA_NUMBER_TYPES.get(sig); + } + return switch (sig) { + case "java.lang.String" -> "string"; + case "java.lang.Boolean" -> "boolean"; + default -> null; + }; + } + + private DocComment sanitizeLibraryComment(DocComment comment) { + if (comment == null) { + return null; + } + String summary = stripLibraryBoilerplate(comment.summary()); + String description = stripLibraryBoilerplate(comment.description()); + if (summary.equals(comment.summary()) && description.equals(comment.description())) { + return comment; + } + return new DocComment(summary, description, comment.tags()); + } + + private String stripLibraryBoilerplate(String text) { + if (text == null || text.isBlank()) { + return text == null ? "" : text; + } + return text.replaceAll("(?m)^\\s*An instance of this class is passed to scripts as the `\\w+` variable\\.?\\s*$", "") + .trim(); + } + + private static class PackageNode { + private final String name; + private final Map children = new TreeMap<>(); + private final List classes = new ArrayList<>(); + + private PackageNode(String name) { + this.name = name; + } + + private void addClass(String packageName, ClassDoc clz) { + if (packageName == null || packageName.isEmpty()) { + classes.add(clz); + return; + } + String[] parts = packageName.split("\\."); + PackageNode current = this; + for (String part : parts) { + current = current.children.computeIfAbsent(part, PackageNode::new); + } + current.classes.add(clz); + } + } +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/tsdoclet/Main.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/tsdoclet/Main.java new file mode 100644 index 000000000..e79774dee --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/tsdoclet/Main.java @@ -0,0 +1,82 @@ +package xyz.wagyourtail.doclet.core.tsdoclet; + +import com.sun.source.util.DocTrees; +import jdk.javadoc.doclet.Doclet; +import jdk.javadoc.doclet.DocletEnvironment; +import jdk.javadoc.doclet.Reporter; +import xyz.wagyourtail.FileHandler; +import xyz.wagyourtail.doclet.core.BasicDocCommentParser; +import xyz.wagyourtail.doclet.core.BasicTypeResolver; +import xyz.wagyourtail.doclet.core.DocletModelBuilder; +import xyz.wagyourtail.doclet.core.render.TsRenderer; +import xyz.wagyourtail.doclet.options.IgnoredItem; +import xyz.wagyourtail.doclet.options.OutputDirectory; +import xyz.wagyourtail.doclet.options.Version; + +import javax.lang.model.SourceVersion; +import javax.tools.Diagnostic; +import java.io.File; +import java.io.IOException; +import java.util.*; + +public class Main implements Doclet { + public static Reporter reporter; + public static DocTrees treeUtils; + + @Override + public void init(Locale locale, Reporter reporter) { + Main.reporter = reporter; + } + + @Override + public String getName() { + return "TypeScript Generator"; + } + + @SuppressWarnings("SpellCheckingInspection") + @Override + public Set getSupportedOptions() { + return Set.of( + new Version(), + new OutputDirectory(), + new IgnoredItem("-doctitle", 1), + new IgnoredItem("-notimestamp", 0), + new IgnoredItem("-windowtitle", 1) + ); + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.RELEASE_16; + } + + @Override + public boolean run(DocletEnvironment environment) { + treeUtils = environment.getDocTrees(); + + File outDir = OutputDirectory.outputDir; + if (outDir == null) { + reporter.print(Diagnostic.Kind.ERROR, "Output directory not set\n"); + return false; + } + if (!outDir.exists() && !outDir.mkdirs()) { + reporter.print(Diagnostic.Kind.ERROR, "Failed to create version dir\n"); + return false; + } + + FileHandler outputTS = new FileHandler(new File(outDir, "JsMacros-" + Version.version + ".d.ts")); + BasicTypeResolver typeResolver = new BasicTypeResolver(); + DocletModelBuilder builder = new DocletModelBuilder(typeResolver, new BasicDocCommentParser(treeUtils)); + var model = builder.build(environment); + TsRenderer renderer = new TsRenderer(typeResolver); + + try { + outputTS.write(renderer.render(model)); + } catch (IOException e) { + reporter.print(Diagnostic.Kind.ERROR, "Failed to write TypeScript output: " + e.getMessage()); + return false; + } + return true; + } + +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/util/ElementNameUtils.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/util/ElementNameUtils.java new file mode 100644 index 000000000..499a78b83 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/util/ElementNameUtils.java @@ -0,0 +1,81 @@ +package xyz.wagyourtail.doclet.core.util; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.type.TypeVariable; + +public final class ElementNameUtils { + private ElementNameUtils() { + } + + public static String getPackageName(TypeElement type) { + Element current = type; + while (current.getKind() != ElementKind.PACKAGE) { + current = current.getEnclosingElement(); + } + return ((PackageElement) current).getQualifiedName().toString(); + } + + public static String getDisplayClassName(TypeElement type) { + StringBuilder name = new StringBuilder(type.getSimpleName()); + Element current = type.getEnclosingElement(); + while (current.getKind() == ElementKind.INTERFACE || current.getKind() == ElementKind.CLASS) { + name.insert(0, current.getSimpleName() + "."); + current = current.getEnclosingElement(); + } + return name.toString(); + } + + public static String getQualifiedName(TypeElement type) { + String pkg = getPackageName(type); + String name = getDisplayClassName(type); + return pkg.isEmpty() ? name : pkg + "." + name; + } + + public static String memberId(Element member) { + StringBuilder s = new StringBuilder(); + switch (member.getKind()) { + case ENUM_CONSTANT, FIELD -> s.append(member.getSimpleName()); + case CONSTRUCTOR, METHOD -> { + if (member.getKind() == ElementKind.METHOD) { + s.append(member.getSimpleName()); + } else { + s.append("constructor"); + } + for (VariableElement parameter : ((ExecutableElement) member).getParameters()) { + s.append("-").append(getTypeMirrorName(parameter.asType())); + } + s.append("-"); + } + default -> throw new UnsupportedOperationException(String.valueOf(member.getKind())); + } + return s.toString(); + } + + private static String getTypeMirrorName(TypeMirror type) { + return switch (type.getKind()) { + case BOOLEAN -> "boolean"; + case BYTE -> "byte"; + case SHORT -> "short"; + case INT -> "int"; + case LONG -> "long"; + case CHAR -> "char"; + case FLOAT -> "float"; + case DOUBLE -> "double"; + case VOID, NONE -> "void"; + case NULL -> "null"; + case ARRAY -> getTypeMirrorName(((ArrayType) type).getComponentType()) + "[]"; + case DECLARED -> getDisplayClassName((TypeElement) ((DeclaredType) type).asElement()); + case TYPEVAR -> ((TypeVariable) type).asElement().getSimpleName().toString(); + case WILDCARD -> "?"; + default -> type.toString(); + }; + } +} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/webdoclet/Main.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/webdoclet/Main.java similarity index 83% rename from buildSrc/src/main/java/xyz/wagyourtail/doclet/webdoclet/Main.java rename to buildSrc/src/main/java/xyz/wagyourtail/doclet/core/webdoclet/Main.java index 6b926e37b..b8a28cd35 100644 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/webdoclet/Main.java +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/webdoclet/Main.java @@ -1,19 +1,23 @@ -package xyz.wagyourtail.doclet.webdoclet; +package xyz.wagyourtail.doclet.core.webdoclet; import com.sun.source.util.DocTrees; import jdk.javadoc.doclet.Doclet; import jdk.javadoc.doclet.DocletEnvironment; import jdk.javadoc.doclet.Reporter; import xyz.wagyourtail.FileHandler; +import xyz.wagyourtail.doclet.core.webdoclet.parsers.ClassParser; import xyz.wagyourtail.doclet.options.IgnoredItem; import xyz.wagyourtail.doclet.options.OutputDirectory; import xyz.wagyourtail.doclet.options.Version; import xyz.wagyourtail.doclet.webdoclet.options.Links; import xyz.wagyourtail.doclet.webdoclet.options.McVersion; -import xyz.wagyourtail.doclet.webdoclet.parsers.ClassParser; import javax.lang.model.SourceVersion; -import javax.lang.model.element.*; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; import javax.tools.Diagnostic; @@ -40,7 +44,7 @@ public void init(Locale locale, Reporter reporter) { @Override public String getName() { - return "WebDoc Generator"; + return "WebDoc Generator (Core)"; } @Override @@ -70,22 +74,26 @@ public boolean run(DocletEnvironment environment) { elementUtils = environment.getElementUtils(); File outDir = new File(OutputDirectory.outputDir, Version.version); - try { if (!outDir.exists() && !outDir.mkdirs()) { reporter.print(Diagnostic.Kind.ERROR, "Failed to create version dir\n"); return false; } - //create package-list StringBuilder pkgList = new StringBuilder(); - elements.stream().filter(e -> e.getKind() == ElementKind.PACKAGE).map(e -> (PackageElement) e).forEach(e -> { - if (Links.externalPackages.containsKey(e.getQualifiedName().toString())) { - return; + for (Element element : elements) { + if (element.getKind() != javax.lang.model.element.ElementKind.PACKAGE) { + continue; } - pkgList.append(e.getQualifiedName()).append("\n"); - }); - pkgList.setLength(pkgList.length() - 1); + String name = ((javax.lang.model.element.PackageElement) element).getQualifiedName().toString(); + if (Links.externalPackages.containsKey(name)) { + continue; + } + pkgList.append(name).append("\n"); + } + if (pkgList.length() > 0) { + pkgList.setLength(pkgList.length() - 1); + } new FileHandler(new File(outDir, "package-list")).write(pkgList.toString()); elements.stream().filter(e -> e instanceof TypeElement).map(e -> (TypeElement) e).forEach(e -> { diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/webdoclet/parsers/ClassParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/webdoclet/parsers/ClassParser.java similarity index 99% rename from buildSrc/src/main/java/xyz/wagyourtail/doclet/webdoclet/parsers/ClassParser.java rename to buildSrc/src/main/java/xyz/wagyourtail/doclet/core/webdoclet/parsers/ClassParser.java index 99f65a7d4..4a33e2169 100644 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/webdoclet/parsers/ClassParser.java +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/webdoclet/parsers/ClassParser.java @@ -1,10 +1,10 @@ -package xyz.wagyourtail.doclet.webdoclet.parsers; +package xyz.wagyourtail.doclet.core.webdoclet.parsers; import com.sun.source.doctree.*; import com.sun.source.util.DocTreePath; import xyz.wagyourtail.Pair; import xyz.wagyourtail.XMLBuilder; -import xyz.wagyourtail.doclet.webdoclet.Main; +import xyz.wagyourtail.doclet.core.webdoclet.Main; import xyz.wagyourtail.doclet.webdoclet.options.Links; import javax.lang.model.element.*; diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Group.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Group.java deleted file mode 100644 index 4e12781d4..000000000 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Group.java +++ /dev/null @@ -1,7 +0,0 @@ -package xyz.wagyourtail.doclet.mddoclet; - -public enum Group { - Library, - Event, - Class -} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Main.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Main.java deleted file mode 100644 index 2e2a8e2a0..000000000 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/Main.java +++ /dev/null @@ -1,139 +0,0 @@ -package xyz.wagyourtail.doclet.mddoclet; - -import com.sun.source.util.DocTrees; -import jdk.javadoc.doclet.Doclet; -import jdk.javadoc.doclet.DocletEnvironment; -import jdk.javadoc.doclet.Reporter; -import org.jetbrains.annotations.NotNull; -import xyz.wagyourtail.FileHandler; -import xyz.wagyourtail.doclet.DocletIgnore; -import xyz.wagyourtail.doclet.options.IgnoredItem; -import xyz.wagyourtail.doclet.options.OutputDirectory; -import xyz.wagyourtail.doclet.options.Version; -import xyz.wagyourtail.doclet.mddoclet.options.Links; -import xyz.wagyourtail.doclet.mddoclet.options.McVersion; -import xyz.wagyourtail.doclet.mddoclet.parsers.ClassParser; - -import javax.lang.model.SourceVersion; -import javax.lang.model.element.*; -import javax.lang.model.util.Elements; -import javax.lang.model.util.Types; -import javax.tools.Diagnostic; -import java.io.File; -import java.io.IOException; -import java.util.*; - -public class Main implements Doclet { - public static Reporter reporter; - public static String mappingViewerURL; - public static Elements elementUtils; - public static DocTrees treeUtils; - public static Types types; - public static Set elements; - public static Map internalClasses = new LinkedHashMap<>(); - - @Override - public void init(Locale locale, Reporter reporter) { - Main.reporter = reporter; - } - - @Override - public String getName() { - return "VitePressDoc Generator"; - } - - @Override - public Set getSupportedOptions() { - return Set.of( - new Version(), - new McVersion(), - new OutputDirectory(), - new Links(), - new IgnoredItem("-doctitle", 1), - new IgnoredItem("-notimestamp", 0), - new IgnoredItem("-windowtitle", 1) - ); - } - - @Override - public SourceVersion getSupportedSourceVersion() { - return SourceVersion.RELEASE_16; - } - - @Override - public boolean run(DocletEnvironment environment) { - mappingViewerURL = "https://wagyourtail.xyz/Projects/MinecraftMappingViewer/App?mapping=INTERMEDIARY,YARN&version=" + McVersion.mcVersion + "&search="; - elements = environment.getIncludedElements(); - treeUtils = environment.getDocTrees(); - types = environment.getTypeUtils(); - elementUtils = environment.getElementUtils(); - - elements = new HashSet<>(elements.stream().filter(element -> !shouldIgnore(element)).toList()); - - File outDir = new File(OutputDirectory.outputDir, Version.version); - - try { - if (!outDir.exists() && !outDir.mkdirs()) { - reporter.print(Diagnostic.Kind.ERROR, "Failed to create version dir\n"); - return false; - } - - //create package-list - StringBuilder pkgList = new StringBuilder(); - elements.stream().filter(e -> e.getKind() == ElementKind.PACKAGE).map(e -> (PackageElement) e).forEach(e -> { - if (Links.externalPackages.containsKey(e.getQualifiedName().toString())) { - return; - } - pkgList.append(e.getQualifiedName()).append("\n"); - }); - pkgList.setLength(pkgList.length() - 1); - new FileHandler(new File(outDir, "package-list")).write(pkgList.toString()); - - elements.stream().filter(e -> e instanceof TypeElement).map(e -> (TypeElement) e).forEach(e -> { - AnnotationMirror mirror = e.getAnnotationMirrors().stream().filter(a -> a.getAnnotationType().asElement().getSimpleName().toString().equals("Event")).findFirst().orElse(null); - //Event - if (mirror != null) { - internalClasses.put(e, new ClassParser(e, Group.Event, getAnnotationValue("value", mirror).toString())); - return; - } - - mirror = e.getAnnotationMirrors().stream().filter(a -> a.getAnnotationType().asElement().getSimpleName().toString().equals("Library")).findFirst().orElse(null); - //Library - if (mirror != null) { - internalClasses.put(e, new ClassParser(e, Group.Library, getAnnotationValue("value", mirror).toString())); - return; - } - - internalClasses.put(e, new ClassParser(e, Group.Class, null)); - }); - - for (ClassParser value : internalClasses.values()) { - File out = new File(outDir, value.getPathPart() + ".md"); - File parent = out.getParentFile(); - if (!parent.exists() && !parent.mkdirs()) { - reporter.print(Diagnostic.Kind.ERROR, "Failed to create package dir " + parent + "\n"); - return false; - } - new FileHandler(out).write(value.generateMarkdown()); - } - } catch (IOException e) { - e.printStackTrace(); - return false; - } - return true; - } - - public static Object getAnnotationValue(String key, AnnotationMirror annotation) { - for (Map.Entry el : annotation.getElementValues().entrySet()) { - if (el.getKey().getSimpleName().toString().equals(key)) { - return el.getValue().getValue(); - } - } - return null; - } - - private static boolean shouldIgnore(@NotNull Element e) { - return e.getAnnotation(DocletIgnore.class) != null; - } - -} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java deleted file mode 100644 index 87e2a19e1..000000000 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/mddoclet/parsers/ClassParser.java +++ /dev/null @@ -1,696 +0,0 @@ -package xyz.wagyourtail.doclet.mddoclet.parsers; - -import com.sun.source.doctree.*; -import com.sun.source.util.DocTreePath; -import org.jetbrains.annotations.NotNull; -import xyz.wagyourtail.Pair; -import xyz.wagyourtail.doclet.DocletIgnore; -import xyz.wagyourtail.doclet.mddoclet.Group; -import xyz.wagyourtail.doclet.mddoclet.Main; -import xyz.wagyourtail.doclet.mddoclet.options.Links; - -import javax.lang.model.element.*; -import javax.lang.model.type.*; -import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class ClassParser { - private final Group group; - private final String alias; - public TypeElement type; - - public ClassParser(TypeElement type, Group group, String alias) { - this.type = type; - this.group = group; - this.alias = alias; - } - - /** - * @return class name with $ for inner class - */ - private static String getClassName(TypeElement type) { - StringBuilder s = new StringBuilder(type.getSimpleName()); - Element t2 = type.getEnclosingElement(); - while (t2.getKind() == ElementKind.INTERFACE || t2.getKind() == ElementKind.CLASS) { - s.insert(0, t2.getSimpleName() + "$"); - t2 = t2.getEnclosingElement(); - } - return s.toString(); - } - - /** - * @return package name with . separators - */ - private static String getPackage(TypeElement type) { - Element t2 = type; - while (t2.getKind() != ElementKind.PACKAGE) t2 = t2.getEnclosingElement(); - - return ((PackageElement) t2).getQualifiedName().toString(); - } - - public String getPathPart() { - return getPackage(type).replaceAll("\\.", "/") + "/" + getClassName(type).replaceAll("\\$", "."); - } - - /** - * nothing much - * - * @return up dir string - */ - private String getUpDir(int extra) { - StringBuilder s = new StringBuilder(); - for (String ignored : getPackage(type).split("\\.")) { - s.append("../"); - } - s.append("../".repeat(Math.max(0, extra))); - return s.toString(); - } - - private StringBuilder getClassNameWithTypes(TypeElement type) { - StringBuilder s = new StringBuilder(getClassName(type)); - List params = type.getTypeParameters(); - if (params != null && !params.isEmpty()) { - s.append("<"); - for (TypeParameterElement param : params) { - s.append(parseType(param.asType())).append(", "); - } - s.delete(s.length() - 2, s.length()); - s.append(">"); - } - - return s; - } - - // TODO: Incomplete - private StringBuilder parseType(TypeMirror type) { - StringBuilder s = new StringBuilder(); - switch (type.getKind()) { - case BOOLEAN, BYTE, SHORT, INT, LONG, CHAR, FLOAT, DOUBLE, VOID, NONE -> { - // primitive types - s.append(type.toString()); - } - case ARRAY -> { - ArrayType arrayType = (ArrayType) type; - s.append(parseType(arrayType.getComponentType())).append("[]"); - } - case DECLARED -> { - DeclaredType declaredType = (DeclaredType) type; - TypeElement typeElement = (TypeElement) declaredType.asElement(); - - Pair url = getURL(declaredType.asElement()); - s.append(String.format("[%s](%s%s)", - getClassName(typeElement), - url.getKey(), - url.getValue() ? " (external)" : "" - )); - - List params = declaredType.getTypeArguments(); - if (params != null && !params.isEmpty()) { - s.append("<"); - for (TypeMirror param : params) { - if (param instanceof TypeVariable typeVariable && typeVariable.getUpperBound().equals(type)) { - s.append(typeVariable.asElement().getSimpleName()).append(", "); - } else { - s.append(parseType(param)).append(", "); - } - } - - // Remove last ", " - s.delete(s.length() - 2, s.length()); - s.append(">"); - } - } - case TYPEVAR -> { - TypeVariable typeVariable = (TypeVariable) type; - s.append(typeVariable.asElement().getSimpleName()); - TypeMirror ext = typeVariable.getUpperBound(); - if (!ext.toString().equals("java.lang.Object")) { - s.append(" extends ").append(parseType(ext)); - } - } - case WILDCARD -> { - s.append("?"); - } - } - return s; - } - - public String generateMarkdown() { - StringBuilder builder = new StringBuilder(); - - builder.append("# ").append(getClassName(type)).append("\n\n"); - builder.append(String.format("%s.%s", getPackage(type), getClassNameWithTypes(type))).append("\n\n"); - StringBuilder desc = getDescription(type.getEnclosingElement()); - builder.append(desc.isEmpty() ? "TODO: No description supplied" : desc); - if (group == Group.Library) { - // TODO: Don't use class name, get actual var name - builder.append(String.format("\nAccessible in scripts via the global `%s` variable.", getClassName(type))); - } - builder.append("\n\n"); - - switch (group) { - case Library -> builder.append(generateLibrary()); - case Event -> builder.append(generateEvent()); - case Class -> builder.append(generateClass()); - } - - return builder.toString(); - } - - private StringBuilder generateLibrary() { - StringBuilder builder = new StringBuilder(); - builder.append(generateSubClasses()); - builder.append(generateMethods()); - return builder; - } - - private StringBuilder generateEvent() { - StringBuilder builder = new StringBuilder(); - builder.append(generateSubClasses()); - builder.append(generateConstructors()); - return builder; - } - - private StringBuilder generateClass() { - StringBuilder builder = new StringBuilder(); - builder.append(generateSubClasses()); - builder.append(generateConstructors()); - builder.append(generateMethods()); - return builder; - } - - private StringBuilder generateConstructors() { - StringBuilder builder = new StringBuilder(); - List constructors = type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.CONSTRUCTOR).toList(); - - if (constructors.isEmpty()) { - return builder; - } - - builder.append("## Constructors\n\n"); - - constructors.forEach(el -> { - if (!el.getModifiers().contains(Modifier.PUBLIC)) { - return; - } - // if (firstFlag.get()) { - // firstFlag.set(false); - // builder.append(new XMLBuilder("h3", true, true).append("Constructors")); - // XMLBuilder con = new XMLBuilder("div").setClass("constructorDoc"); - // builder.append(con); - // constructors.set(con); - // } - // constructors.get().append(parseConstructor(el)); - - builder.append(parseConstructor((ExecutableElement) el)); - }); - return builder; - } - - private StringBuilder parseConstructor(ExecutableElement element) { - StringBuilder builder = new StringBuilder(); - - builder.append(String.format("### new %s(%s)", - getClassNameWithTypes((TypeElement) element.getEnclosingElement()), - createTitleParams(element))) - .append("\n\n"); - - builder.append(createFlags(element)); - builder.append(getSince(element)); - builder.append(getDescription(element)); - - return builder; - } - - private StringBuilder generateMethods() { - StringBuilder builder = new StringBuilder(); - List methods = type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.METHOD).toList(); - - if (methods.isEmpty()) { - return builder; - } - - builder.append("## Methods\n\n"); - - methods.forEach(el -> { - if (!el.getModifiers().contains(Modifier.PUBLIC)) { - return; - } - - builder.append(parseMethod((ExecutableElement) el)); - // getURL(el).getKey()).append(memberName(el) - // createFlags(el, true) - }); - - return builder; - } - - private StringBuilder parseMethod(ExecutableElement element) { - StringBuilder builder = new StringBuilder(); - - builder.append(String.format("### %s(%s)", - element.getSimpleName().toString(), - createTitleParams(element))) - .append("\n\n"); - - builder.append(createFlags(element)); - builder.append(getSince(element)); - builder.append(getDescription(element)); - - return builder; - } - - private StringBuilder generateSubClasses() { - StringBuilder builder = new StringBuilder(); - List subClasses = Main.elements.stream().filter(e -> { - if (e.getKind().isClass() || e.getKind().isInterface()) { - return Main.types.isAssignable( - e.asType(), - Main.types.getDeclaredType(type) - ) && !e.equals(type); - } - return false; - }).collect(Collectors.toList()); - - if (subClasses.isEmpty()) { - return builder; - } - - builder.append("## Subclasses\n\n"); - for (Element subClass : subClasses) { - Pair url = getURL(subClass); - builder.append(String.format("- [%s](%s)%s\n", - getClassNameWithTypes((TypeElement) subClass), - url.getKey(), - url.getValue() ? " (external)" : "" - )); - } - - builder.append("\n"); - return builder; - } - -// private XMLBuilder getReturnDescription(ExecutableElement element) { -// DocCommentTree dct = Main.treeUtils.getDocCommentTree(element); -// if (dct == null) { -// return new XMLBuilder("p"); -// } -// ReturnTree t = (ReturnTree) dct.getBlockTags().stream().filter(e -> e.getKind() == DocTree.Kind.RETURN).findFirst().orElse(null); -// if (t == null) { -// return new XMLBuilder("p"); -// } -// return createDescription(element, t.getDescription()); -// } - - private StringBuilder createTitleParams(ExecutableElement element) { - StringBuilder builder = new StringBuilder(); - - for (VariableElement parameter : element.getParameters()) { - builder.append(parameter.getSimpleName().toString()); - builder.append(", "); - } - if (!element.getParameters().isEmpty()) { - builder.delete(builder.length() - ", ".length(), builder.length()); - } - - return builder; - } - -// private XMLBuilder createParamTable(ExecutableElement element) { -// List params = element.getParameters(); -// if (params == null || params.isEmpty()) { -// return null; -// } -// XMLBuilder body; -// XMLBuilder table = new XMLBuilder("table").setClass("paramTable").append( -// new XMLBuilder("thead").append( -// new XMLBuilder("th", true, true).append("Parameter"), -// new XMLBuilder("th", true, true).append("Type"), -// new XMLBuilder("th", true, true).append("Description") -// ), -// body = new XMLBuilder("tbody") -// ); -// Map paramDescMap = getParamDescriptions(element); -// for (VariableElement param : params) { -// body.append(new XMLBuilder("tr").append( -// new XMLBuilder("td", true, true).append(param.getSimpleName()), -// new XMLBuilder("td", true, true).append(parseType(param.asType())), -// new XMLBuilder("td", true, true).append(paramDescMap.get(param.getSimpleName().toString())) -// )); -// } -// return table; -// } -// -// private XMLBuilder parseField(Element element) { -// XMLBuilder field = new XMLBuilder("div").setClass("field classItem").setId(memberId(element)); -// field.append(new XMLBuilder("h4", true).setClass("classItemTitle").append( -// ".", memberName(element) -// )); -// field.append(createFlags(element, false)); -// field.append(getSince(element)); -// -// field.append(new XMLBuilder("div").setClass("fieldDesc classItemDesc").append(getDescription(element))); -// -// field.append(new XMLBuilder("div").setClass("fieldReturn classItemType").append( -// new XMLBuilder("h5", true, true).setClass("fieldTypeTitle classItemTypeTitle").append( -// "Type: ", parseType(element.asType()) -// ) -// )); -// -// return field; -// } -// -// public Map getParamDescriptions(ExecutableElement element) { -// Map paramMap = new HashMap<>(); -// DocCommentTree comment = Main.treeUtils.getDocCommentTree(element); -// if (comment == null) { -// return paramMap; -// } -// comment.getBlockTags().stream().filter(e -> e.getKind() == DocTree.Kind.PARAM).forEach(e -> paramMap.put(((ParamTree) e).getName().getName().toString(), createDescription(element, ((ParamTree) e).getDescription()))); -// return paramMap; -// } - - private StringBuilder getSince(Element element) { - DocCommentTree tree = Main.treeUtils.getDocCommentTree(element); - SinceTree since = tree == null ? null : (SinceTree) tree.getBlockTags().stream().filter(e -> e.getKind().equals(DocTree.Kind.SINCE)).findFirst().orElse(null); - if (since == null) { - return new StringBuilder(); - } - - return new StringBuilder(String.format("**Since:** %s", since.getBody())).append("\n\n"); - } - - private StringBuilder getDescription(Element element) { - DocCommentTree tree = Main.treeUtils.getDocCommentTree(element); - - StringBuilder builder = createDescription(element, tree == null ? List.of() : tree.getFullBody()); - if (builder.isEmpty()) { - return builder; - } - - return builder.append("\n\n"); - } - - private StringBuilder createDescription(Element el, List inlinedoc) { - StringBuilder builder = new StringBuilder(); - for (DocTree docTree : inlinedoc) { - switch (docTree.getKind()) { - case LINK, LINK_PLAIN -> { - Element ele = Main.treeUtils.getElement(new DocTreePath(new DocTreePath(Main.treeUtils.getPath(el), Main.treeUtils.getDocCommentTree(el)), ((LinkTree) docTree).getReference())); - if (ele != null) { - StringBuilder linkBuilder = new StringBuilder(); - Pair url = getURL(ele); - - // = new StringBuilder("a", true).addStringOption("href", url.getKey()) - - - if (List.of(ElementKind.INTERFACE, ElementKind.CLASS, ElementKind.ANNOTATION_TYPE, ElementKind.ENUM).contains(ele.getKind())) { - linkBuilder.append(String.format("[%s](%s)", getClassName((TypeElement) ele), url.getKey())); - } else { - linkBuilder.append(String.format("[%s](%s)", memberName(ele), - url.getKey() - )); -// linkBuilder.append(getClassName((TypeElement) ele.getEnclosingElement()), "#", ele.toString()); - } - -// if (url.getValue()) { -// linkBuilder.addStringOption("target", "_blank"); -// } -// if (linkBuilder.options.get("href").equals("\"\"")) { -// linkBuilder.setClass("type deadType"); -// } else { -// linkBuilder.setClass("type"); -// } - - builder.append(linkBuilder); - } else { - builder.append(((LinkTree) docTree).getReference().getSignature()); - } - } - case CODE -> - builder.append(((LiteralTree) docTree).getBody()); - default -> builder.append(docTree); - } - } - return builder; - } - -// private XMLBuilder parseType(TypeMirror type) { -// XMLBuilder builder = new XMLBuilder("div", true).setClass("typeParameter"); -// XMLBuilder typeLink; -// switch (type.getKind()) { -// case BOOLEAN, BYTE, SHORT, INT, LONG, CHAR, FLOAT, DOUBLE, VOID, NONE -> { -// //isPrimitive -// builder.append(typeLink = new XMLBuilder("p", true).append(type)); -// typeLink.setClass("type primitiveType"); -// } -// case ARRAY -> { -// return parseType(((ArrayType) type).getComponentType()).append("[]"); -// } -// case DECLARED -> { -// Pair url = getURL(((DeclaredType) type).asElement()); -// builder.append(typeLink = new XMLBuilder("a", true).addStringOption("href", url.getKey()).append(getClassName((TypeElement) ((DeclaredType) type).asElement()))); -// -// if (url.getValue()) { -// typeLink.addStringOption("target", "_blank"); -// } -// if (typeLink.options.get("href").equals("\"\"")) { -// typeLink.setClass("type deadType"); -// } else { -// typeLink.setClass("type"); -// } -// -// List params = ((DeclaredType) type).getTypeArguments(); -// if (params != null && !params.isEmpty()) { -// builder.append("<"); -// for (TypeMirror param : params) { -// if (param instanceof TypeVariable typeVariable && typeVariable.getUpperBound().equals(type)) { -// builder.append(typeLink = new XMLBuilder("p", true)); -// typeLink.setClass("type primitiveType"); -// typeLink.append(typeVariable.asElement().getSimpleName()); -// builder.append(", "); -// } else { -// builder.append(parseType(param), ", "); -// } -// } -// builder.pop(); -// builder.append(">"); -// } -// } -// case TYPEVAR -> { -// builder.append(typeLink = new XMLBuilder("p", true)); -// typeLink.setClass("type primitiveType"); -// typeLink.append(((TypeVariable) type).asElement().getSimpleName()); -// TypeMirror ext = ((TypeVariable) type).getUpperBound(); -// if (!ext.toString().equals("java.lang.Object")) { -// typeLink.append( -// new XMLBuilder("p").setClass("classExtends").append(" extends "), -// parseType(ext) -// ); -// } -// } -// case WILDCARD -> { -// builder.append(typeLink = new XMLBuilder("p", true)); -// typeLink.setClass("type primitiveType"); -// typeLink.append("?"); -// } -// } -// return builder; -// } - - /** - * Resolve an element to either an internal or external URL - * - * @param type The element to get the url to - * @return a pair containing: - * 1. the resolved URL, or "" if the element has no URL - * 2. true if the URL should open in a new tab, false otherwise - */ - private Pair getURL(Element type) { - // TODO: Reimplement for mddoclet - if (type.asType().getKind().isPrimitive()) { - return new Pair<>("", false); - } - - Element clazz = type; - while (!(clazz instanceof TypeElement)) { - clazz = clazz.getEnclosingElement(); - } - - if (!clazz.equals(this.type)) { - String pkg = getPackage((TypeElement) clazz); - if (Main.internalClasses.containsKey(clazz)) { - StringBuilder s = new StringBuilder(getUpDir(0)); - s.append(Main.internalClasses.get(clazz).getPathPart()).append(".html"); - if (type != clazz) { - s.append("#").append(memberId(type)); - } - return new Pair<>(s.toString(), false); - } else if (Links.externalPackages.containsKey(pkg)) { - return new Pair<>(Links.externalPackages.get(pkg) + getClassName((TypeElement) clazz) + ".html", true); - } else if (pkg.startsWith("com.mojang") || pkg.startsWith("net.minecraft")) { - return new Pair<>(Main.mappingViewerURL + pkg.replaceAll("\\.", "/") + "/" + getClassName((TypeElement) clazz), true); - } else { - return new Pair<>("", false); - } - } else { - StringBuilder s = new StringBuilder(); - s.append("#"); - if (type != clazz) { - s.append(memberId(type)); - } - return new Pair<>(s.toString(), false); - } - } - - private static String memberId(Element member) { - StringBuilder s = new StringBuilder(); - switch (member.getKind()) { - case ENUM_CONSTANT, FIELD -> s.append(member.getSimpleName()); - case CONSTRUCTOR, METHOD -> { - if (member.getKind() == ElementKind.METHOD) { - s.append(member.getSimpleName()); - } else { - s.append("constructor"); - } - for (VariableElement parameter : ((ExecutableElement) member).getParameters()) { - s.append("-").append(getTypeMirrorName(parameter.asType())); - } - s.append("-"); - } - case TYPE_PARAMETER -> { - } - default -> throw new UnsupportedOperationException(String.valueOf(member.getKind())); - } - - return s.toString(); - } - - private static String memberName(Element member) { - StringBuilder s = new StringBuilder(); - switch (member.getKind()) { - case ENUM_CONSTANT, FIELD -> s.append(member.getSimpleName()); - case METHOD -> { - s.append(member.getSimpleName()).append("("); - for (VariableElement parameter : ((ExecutableElement) member).getParameters()) { - s.append(parameter.getSimpleName()).append(", "); - } - if (((ExecutableElement) member).getParameters().size() > 0) { - s.setLength(s.length() - 2); - } - s.append(")"); - } - default -> throw new UnsupportedOperationException(String.valueOf(member.getKind())); - } - return s.toString(); - } - - private static String getTypeMirrorName(TypeMirror type) { - switch (type.getKind()) { - case BOOLEAN -> { - return "boolean"; - } - case BYTE -> { - return "byte"; - } - case SHORT -> { - return "short"; - } - case INT -> { - return "int"; - } - case LONG -> { - return "long"; - } - case CHAR -> { - return "char"; - } - case FLOAT -> { - return "float"; - } - case DOUBLE -> { - return "double"; - } - case VOID, NONE -> { - return "void"; - } - case NULL -> { - return "null"; - } - case ARRAY -> { - return getTypeMirrorName(((ArrayType) type).getComponentType()) + "[]"; - } - case DECLARED -> { - return getClassName((TypeElement) ((DeclaredType) type).asElement()); - } - case TYPEVAR -> { - return ((TypeVariable) type).asElement().getSimpleName().toString(); - } - case WILDCARD -> { - return "?"; - } - default -> throw new UnsupportedOperationException(String.valueOf(type.getKind())); - } - } - - private static StringBuilder createFlags(Element member) { - StringBuilder builder = new StringBuilder(""); - ArrayList flags = new ArrayList<>(); - - for (Modifier modifier : member.getModifiers()) { - switch (modifier) { - case ABSTRACT -> { - if (member.getKind() != ElementKind.INTERFACE && member.getEnclosingElement().getKind() != ElementKind.INTERFACE) { - flags.add("Abstract"); - } - } - case STATIC -> flags.add("Static"); - case FINAL -> flags.add("Final"); - default -> { - } - } - } - if (member.getKind() == ElementKind.ENUM || member.getKind() == ElementKind.ENUM_CONSTANT) { - flags.add("Enum"); - } - if (member.getKind() == ElementKind.INTERFACE) { - flags.add("Interface"); - } - if (member.getAnnotation(Deprecated.class) != null) { - flags.add("Deprecated"); - } - - for (String flag : flags) { - builder.append(flag).append(", "); - } - if (!flags.isEmpty()) { - builder.delete(builder.length() - ", ".length(), builder.length()); - } - - if (!builder.isEmpty()) { - builder = new StringBuilder("<").append(builder).append(">"); - } - - return builder; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof ClassParser that)) { - return false; - } - return type.equals(that.type); - } - - @Override - public int hashCode() { - return Objects.hash(type); - } - -} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/pydoclet/Main.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/pydoclet/Main.java deleted file mode 100644 index 1a4b471ea..000000000 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/pydoclet/Main.java +++ /dev/null @@ -1,236 +0,0 @@ -package xyz.wagyourtail.doclet.pydoclet; - -import com.sun.source.util.DocTrees; -import jdk.javadoc.doclet.Doclet; -import jdk.javadoc.doclet.DocletEnvironment; -import jdk.javadoc.doclet.Reporter; -import xyz.wagyourtail.FileHandler; -import xyz.wagyourtail.doclet.options.IgnoredItem; -import xyz.wagyourtail.doclet.options.OutputDirectory; -import xyz.wagyourtail.doclet.options.Version; -import xyz.wagyourtail.doclet.pydoclet.parsers.ClassParser; - -import javax.lang.model.SourceVersion; -import javax.lang.model.element.*; -import javax.lang.model.util.Elements; -import javax.lang.model.util.Types; -import javax.tools.Diagnostic; -import java.io.File; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - -public class Main implements Doclet { - public static Reporter reporter; - public static DocTrees treeUtils; - public static Elements elementUtils; - public static Types typeUtils; - public static Set elements; - public static Map internalClasses; - - @Override - public void init(Locale locale, Reporter reporter) { - Main.reporter = reporter; - } - - @Override - public String getName() { - return "Python generator"; - } - - @Override - public Set getSupportedOptions() { - return Set.of( - new Version(), - new OutputDirectory(), - new IgnoredItem("-doctitle", 1), - new IgnoredItem("-notimestamp", 0), - new IgnoredItem("-windowtitle", 1) - ); - } - - @Override - public SourceVersion getSupportedSourceVersion() { - return SourceVersion.RELEASE_16; - } - - @Override - public boolean run(DocletEnvironment environment) { - typeUtils = environment.getTypeUtils(); - treeUtils = environment.getDocTrees(); - elements = environment.getIncludedElements(); - elementUtils = environment.getElementUtils(); - internalClasses = new HashMap<>(); - HashMap> classes = new HashMap<>(); - - //reporter.print(Diagnostic.Kind.NOTE, elements + ""); - - File outDir = new File(OutputDirectory.outputDir, ""); - - try { - //Remove Folder - if (outDir.exists() && !outDir.delete()) { - reporter.print(Diagnostic.Kind.ERROR, "Failed to remove old py output\n"); - return false; - } - - //Create Out Folder - if (!outDir.exists() && !outDir.mkdirs()) { - reporter.print(Diagnostic.Kind.ERROR, "Failed to create version dir\n"); - return false; - } - - //Create ClassParser - elements.stream().filter(e -> e instanceof TypeElement).map(e -> (TypeElement) e).forEach(e -> { - // filter elements, if e is TypeElement, then it can be - internalClasses.put(e, new ClassParser(e)); - - AnnotationMirror mirror = e.getAnnotationMirrors().stream().filter(a -> a.getAnnotationType().asElement().getSimpleName().toString().equals("Library")).findFirst().orElse(null); - //Library - if (mirror != null) { - //Library - if (!classes.containsKey("libraries")) { - classes.put("libraries", new HashMap<>()); - } - classes.get("libraries").put(ClassParser.getClassName(e), getAnnotationValue("value", mirror) + ""); - } else if (e.getAnnotationMirrors().stream().filter(a -> a.getAnnotationType().asElement().getSimpleName().toString().equals("Event")).findFirst().orElse(null) != null) { - //Event - if (!classes.containsKey("events")) { - classes.put("events", new HashMap<>()); - } - classes.get("events").put(ClassParser.getClassName(e), getAnnotationValue("value", e.getAnnotationMirrors().stream().filter(a -> a.getAnnotationType().asElement().getSimpleName().toString().equals("Event")).findFirst().orElse(null)) + ""); - } else if (ClassParser.getClassName(e).contains("Helper")) { - if (!classes.containsKey("helpers")) { - classes.put("helpers", new HashMap<>()); - } - classes.get("helpers").put(ClassParser.getClassName(e), ClassParser.getClassName(e)); - } else if (ClassParser.getClassName(e).contains("Mixin")) { - if (!classes.containsKey("mixins")) { - classes.put("mixins", new HashMap<>()); - } - classes.get("mixins").put(ClassParser.getClassName(e), ClassParser.getClassName(e)); - } else { - if (!classes.containsKey("rest")) { - classes.put("rest", new HashMap<>()); - } - classes.get("rest").put(ClassParser.getClassName(e), ClassParser.getClassName(e)); - } - - }); - - //Create Sum Up Files - reporter.print(Diagnostic.Kind.NOTE, classes + ""); - for (Map.Entry> entry : classes.entrySet()) { - StringBuilder sb = new StringBuilder(); - - sb.append("from typing import TypeVar\n\n"); - sb.append("from .EventContainer import EventContainer\n"); - sb.append("from .BaseEvent import BaseEvent\n"); - - for (Map.Entry args : entry.getValue().entrySet()) { - sb.append("from .").append(args.getKey()).append(" import ").append(args.getKey()).append("\n"); - } - - sb.append("\nFile = TypeVar(\"java.io.File\")\n\n"); // TypeVar should be () - - if (entry.getKey().equalsIgnoreCase("libraries")) { - sb.append("\n\n"); - for (Map.Entry args : entry.getValue().entrySet()) { - sb.append(args.getValue()).append(" = ").append(args.getKey()).append("()\n"); - } - - sb.append("context = EventContainer()\n"); - sb.append("file = File()\n"); - sb.append("event = BaseEvent()\n"); - } - new FileHandler(new File(outDir, entry.getKey() + ".py")).write(sb.toString()); - } - - //Create Classes - for (ClassParser value : internalClasses.values()) { - File out = new File(outDir, ClassParser.getClassName(value.type) + ".py"); - File parent = out.getParentFile(); - if (!parent.exists() && !parent.mkdirs()) { - reporter.print(Diagnostic.Kind.ERROR, "Failed to create package dir " + parent + "\n"); - return false; - } - new FileHandler(out).write(value.parseClass()); - } - - //Create __init__.py - StringBuilder sb = new StringBuilder(); - for (String file : classes.keySet()) { - sb.append("from .").append(file).append(" import *\n"); - } - new FileHandler(new File(outDir, "__init__.py")).write(sb.toString()); - - sb.delete(0, sb.length()); - sb.append(""" - from setuptools import setup, find_packages - from os import path - import os - import time - - this_directory = path.abspath(path.dirname(__file__)) - with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f: - long_description = f.read() - - - VERSION = '"""); - sb.append(Version.version); - sb.append(""" - ' - if "-" in VERSION: VERSION = VERSION.split("-")[0] - VERSION += "." + str(time.time()).split(".")[0][3:] - DESCRIPTION = 'A package to let your IDE know what JsMacros can do' - - def package_files(directory): - paths = [] - for (path, directories, filenames) in os.walk(directory): - for filename in filenames: - paths.append(os.path.join('..', path, filename)) - return paths - - extra_files = package_files('JsMacrosAC') - - # Setting up - setup( - name="JsMacrosAC", - version=VERSION, - author="Hasenzahn1", - author_email="", - description=DESCRIPTION, - long_description_content_type="text/markdown", - long_description=long_description, - packages=["JsMacrosAC"], - package_data = {"": extra_files}, - install_requires=[], - keywords=['python', 'JsMacros', 'Autocomplete', 'Doc'], - classifiers=[ - "Intended Audience :: Developers", - "Programming Language :: Python :: 3", - "Operating System :: Unix", - "Operating System :: MacOS :: MacOS X", - "Operating System :: Microsoft :: Windows", - ] - )"""); - new FileHandler(new File(outDir.getParent(), "setup.py")).write(sb.toString()); - - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - - public static Object getAnnotationValue(String key, AnnotationMirror annotation) { - for (Map.Entry el : annotation.getElementValues().entrySet()) { - if (el.getKey().getSimpleName().toString().equals(key)) { - return el.getValue().getValue(); - } - } - return null; - } - -} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/pydoclet/parsers/ClassParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/pydoclet/parsers/ClassParser.java deleted file mode 100644 index ca0b39467..000000000 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/pydoclet/parsers/ClassParser.java +++ /dev/null @@ -1,493 +0,0 @@ -package xyz.wagyourtail.doclet.pydoclet.parsers; - -import com.sun.source.doctree.*; -import com.sun.source.util.DocTreePath; -import xyz.wagyourtail.doclet.pydoclet.Main; - -import javax.lang.model.element.*; -import javax.lang.model.type.*; -import java.util.*; - -public class ClassParser { - public final TypeElement type; - private final List imports = new LinkedList<>(); - private boolean importOverload = false, importList = false, importTypeVar = false, importAny = false, importMapping = false, importSet = false, importGeneric = false; - HashMap> typeVars = new HashMap<>(); - private final HashMap types = new HashMap<>(), - withArg = new HashMap<>(), - unwantedClass = new HashMap<>(); - private final ArrayList keywords = new ArrayList<>(Arrays.asList("False", "await", "else", "import", "pass", "", "None", "break", "except", "in", "raise", "", "True", "class", "finally", "is", "return", "", "and", "continue", "for", "lambda", "try", "", "as", "def", "from", "nonlocal", "while", "", "assert", "del", "global", "not", "with", "", "async", "elif", "if", "or", "yield")); - - public ClassParser(TypeElement type) { - this.type = type; - - types.put("java.lang.Object", "object"); - types.put("java.lang.String", "str"); - types.put("java.lang.Integer", "int"); - types.put("java.lang.Boolean", "bool"); - types.put("java.lang.Double", "float"); - types.put("java.lang.annotation.Annotation", ""); - types.put("java.lang.Enum", ""); - types.put("java.util.Iterator", "iter"); - - withArg.put("java.util.Set", "Set"); - withArg.put("java.util.List", "List"); - withArg.put("java.util.Map", "Mapping"); - withArg.put("java.util.Collection", "List"); - - unwantedClass.put("java.lang.Object", ""); - unwantedClass.put("java.lang.annotation.Annotation", ""); - unwantedClass.put("java.lang.Enum", ""); - unwantedClass.put("java.util.Collection", ""); - } - - public String parseClass() { - StringBuilder sb = new StringBuilder(); - - //ClassLine e.g class Test(AbstractTest, ): - sb.append(getClassLine()); - - //Fields - sb.append(getFields()).append("\n"); - - //Methods / Constructor - sb.append(getMethods()); - - //safety pass - sb.append(getTabs(1)).append("pass\n\n"); - - //imports + abstract types - sb.insert(0, getImports()).append("\n"); - - return sb.toString(); - } - - private String getMethods() { - StringBuilder sb = new StringBuilder(); - - type.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.METHOD || e.getKind() == ElementKind.CONSTRUCTOR).forEach(el -> { - if (!el.getModifiers().contains(Modifier.PUBLIC)) { - return; - } - ExecutableElement method = (ExecutableElement) el; - importOverload = true; - sb.append(getTabs(1)).append("@overload\n"); - sb.append(getTabs(1)).append("def "); - if (el.getKind() == ElementKind.CONSTRUCTOR) { - sb.append("__init__"); - } else { - sb.append(getVarName(method.getSimpleName().toString())); - } - - sb.append("(self"); - - method.getParameters().forEach(parameter -> sb.append(", ").append(getVarName(parameter.getSimpleName().toString())).append(": ").append(getTypeMirrorName(parameter.asType(), false))); - sb.append(") -> "); - if (method.getReceiverType() != null) { - String return_type = getTypeMirrorName(method.getReturnType(), false); - - sb.append(return_type); - }; - sb.append(":\n"); - - sb.append(getMethodDoc(method)); - sb.append(getTabs(2)).append("pass\n\n"); - }); - - return sb.toString(); - } - - private String getSince(Element element) { - DocCommentTree tree = Main.treeUtils.getDocCommentTree(element); - SinceTree since = tree == null ? null : (SinceTree) tree.getBlockTags().stream().filter(e -> e.getKind().equals(DocTree.Kind.SINCE)).findFirst().orElse(null); - if (since != null) { - return createDescription(element, since.getBody()); - } else { - return ""; - } - } - - private String getClassDoc(Element element) { - StringBuilder sb = new StringBuilder(); - DocCommentTree tree = Main.treeUtils.getDocCommentTree(element); - if (tree != null) { - sb.append(getTabs(1)).append("\"\"\"").append(createDescription(element, tree.getFullBody()).strip()); - String since = getSince(element); - if (since.length() > 0) { - if (sb.length() > 4) { - sb.append("\\n"); - } - sb.append("\n"); - sb.append(getTabs(1)).append("Since: ").append(since).append("\n"); - } else { - sb.append("\n"); - } - sb.append(getTabs(1)).append("\"\"\"\n"); - } - - return sb.toString(); - } - - private String getMethodDoc(ExecutableElement element) { - StringBuilder sb = new StringBuilder(); - DocCommentTree tree = Main.treeUtils.getDocCommentTree(element); - if (tree != null) { - sb.append(getTabs(2)).append("\"\"\"").append(createDescription(element, tree.getFullBody()).strip()); - String since = getSince(element); - if (since.length() > 0) { - if (sb.length() > 5) { - sb.append("\\n"); - } - sb.append("\n"); - sb.append(getTabs(2)).append("Since: ").append(since).append("\n"); - } else { - sb.append("\n"); - } - - Map paramMap = getParamDescriptions(element); - if (paramMap.size() > 0) { - sb.append("\n").append(getTabs(2)).append("Args:\n"); - for (Map.Entry entry : paramMap.entrySet()) { - sb.append(getTabs(3)).append(entry.getKey()).append(": ").append(entry.getValue()).append("\n"); - } - } - - String returnString = getReturnDescription(element); - if (returnString.length() > 0) { - sb.append("\n").append(getTabs(2)).append("Returns:\n"); - sb.append(getTabs(3)).append(returnString).append("\n"); - } - - sb.append(getTabs(2)).append("\"\"\"\n"); - } - - return sb.toString(); - } - - public Map getParamDescriptions(ExecutableElement element) { - Map paramMap = new HashMap<>(); - DocCommentTree comment = Main.treeUtils.getDocCommentTree(element); - if (comment == null) { - return paramMap; - } - comment.getBlockTags().stream().filter(e -> e.getKind() == DocTree.Kind.PARAM).forEach(e -> paramMap.put(((ParamTree) e).getName().getName().toString(), createDescription(element, ((ParamTree) e).getDescription()))); - return paramMap; - } - - private String getReturnDescription(ExecutableElement element) { - DocCommentTree dct = Main.treeUtils.getDocCommentTree(element); - if (dct == null) { - return ""; - } - ReturnTree t = (ReturnTree) dct.getBlockTags().stream().filter(e -> e.getKind() == DocTree.Kind.RETURN).findFirst().orElse(null); - if (t == null) { - return ""; - } - return createDescription(element, t.getDescription()); - } - - private String getVarName(String simpleName) { - return keywords.contains(simpleName) ? simpleName + "_" : simpleName; - } - - private String createDescription(Element element, List inlineDoc) { - StringBuilder sb = new StringBuilder(); - - for (DocTree docTree : inlineDoc) { - switch (docTree.getKind()) { - case TEXT -> sb.append(docTree.toString().strip()).append(" "); //.replace("\n", "") - case CODE -> sb.append("'").append(((LiteralTree) docTree).getBody()).append("' "); - case LINK, LINK_PLAIN -> { - Element ele = Main.treeUtils.getElement(new DocTreePath(new DocTreePath(Main.treeUtils.getPath(element), Main.treeUtils.getDocCommentTree(element)), ((LinkTree) docTree).getReference())); - - if (ele != null) { - - if (List.of(ElementKind.INTERFACE, ElementKind.CLASS, ElementKind.ANNOTATION_TYPE, ElementKind.ENUM).contains(ele.getKind())) { - sb.append(getClassName((TypeElement) ele)); - } else { - sb.append(getClassName((TypeElement) ele.getEnclosingElement())).append("#").append(ele); - } - - } else { - sb.append(((LinkTree) docTree).getReference().getSignature().replace("\n", "")); - } - sb.append(" "); - } - case START_ELEMENT -> { - if (Objects.equals(docTree.toString(), "

  • ")) { - sb.append("\n - "); - } - if (Objects.equals(docTree.toString(), "

    ")) { - sb.append("\n"); - } - } - } - } - - return sb.toString().replace("\n ", "\n"); - } - - private String getImports() { - StringBuilder sb = new StringBuilder(); - - List imp = new LinkedList<>(); - - imports.forEach(t -> { - if (!types.containsKey(getClearedNameFromTypeMirror(t))) { - if (!withArg.containsKey(getClearedNameFromTypeMirror(t))) { - if ((t + "").startsWith("xyz")) { - if (Main.typeUtils.asElement(t) != null) { - if (!getClassName((TypeElement) Main.typeUtils.asElement(t)).equals(getClassName(type))) { - String path = getClassName((TypeElement) Main.typeUtils.asElement(t)); //getPackage((TypeElement) Main.typeUtils.asElement(t)) + "." + - if (!imp.contains(path)) { - imp.add(path); - } - } - } - } else if ((t + "").startsWith("net") || (t + "").startsWith("com") || (t + "").startsWith("io") || (t + "").startsWith("java.util") || - (t + "").startsWith("java.lang.Runnable") || (t + "").startsWith("java.lang.Thread") || (t + "").startsWith("java.lang.Throwable") || - (t + "").startsWith("java.util.function") || (t + "").startsWith("java.lang.ref") || (t + "").startsWith("java.io") || (t + "").startsWith("org") || (t + "").startsWith("java.lang.Iterable") || - (t + "").startsWith("java.lang.StackTraceElement")) { - if (!importTypeVar) { - importTypeVar = true; - } - if (t.getKind() == TypeKind.ARRAY) { - t = ((ArrayType) t).getComponentType(); - } - typeVars.put( - getClassName((TypeElement) Main.typeUtils.asElement(t)), - new AbstractMap.SimpleEntry<>(t + "", false) - ); - }; - } - } - }); - - if (importOverload) { - sb.append("from typing import overload\n"); - } - if (importList) { - sb.append("from typing import List\n"); - } - if (importTypeVar) { - sb.append("from typing import TypeVar\n"); - } - if (importAny) { - sb.append("from typing import Any\n"); - } - if (importMapping) { - sb.append("from typing import Mapping\n"); - } - if (importSet) { - sb.append("from typing import Set\n"); - } - if (importGeneric) { - sb.append("from typing import Generic\n"); - } - - imp.forEach(s -> sb.append("from .").append(s).append(" import ").append(s).append("\n")); - - sb.append("\n"); - String type_name; - for(Map.Entry> entry : typeVars.entrySet()){ - type_name = entry.getValue().getKey().replace("<", "_").replace(">", "_").replace("?", "").replace(".", "_"); - if(Objects.equals(type_name.toString(), "T") || Objects.equals(type_name.toString(), "U") || Objects.equals(type_name.toString(), "R")){ - sb.append(entry.getKey()).append(" = TypeVar(\"").append(entry.getKey()).append("\")\n"); - } else { - sb.append(type_name).append(" = TypeVar(\"").append(type_name).append("\")\n"); - sb.append(entry.getKey()).append(" = ").append(type_name).append("\n\n"); - }; - } - - return sb.toString(); - } - - private String getClearedNameFromTypeMirror(TypeMirror type) { - StringBuilder s = new StringBuilder(type + ""); - if (s.indexOf("<") != -1) { - s.delete(s.indexOf("<"), s.length()); - } - if (s.indexOf(" ") != -1) { - s.delete(0, s.indexOf(" ") + 1); - } - return s.toString(); - } - - private String getFields() { - StringBuilder sb = new StringBuilder(); - - type.getEnclosedElements().stream().filter(e -> e.getKind().equals(ElementKind.FIELD) || e.getKind().equals(ElementKind.ENUM_CONSTANT)).forEach(el -> { - if (!el.getModifiers().contains(Modifier.PUBLIC)) { - return; - } - addImport(el.asType()); - sb.append(getTabs(1)); - sb.append(getVarName(el.getSimpleName().toString())); - sb.append(": "); - sb.append(getTypeMirrorName(el.asType(), false)); - sb.append("\n"); - }); - - return sb.toString(); - } - - private String getTabs(int amount) { - return new String(new char[amount]).replace("\0", "\t"); - } - - private String getClassLine(){ - StringBuilder sb = new StringBuilder("\nclass "); // for PEP8 - sb.append(getClassName(type)); - - List implement = type.getInterfaces(); - TypeMirror extend = type.getSuperclass(); - - if (!(implement.size() == 0 && extend.getKind().equals(TypeKind.NONE))) { - sb.append("("); - implement.forEach(i -> { - sb.append(getTypeMirrorName(i, true)).append(", "); - addImport(i); - }); - if (type.getTypeParameters().size() > 0) { - importGeneric = true; - addImport(type.getTypeParameters().get(0).asType()); - sb.append("Generic["); - sb.append(getTypeMirrorName(type.getTypeParameters().get(0).asType(), true)); - for (int i = 1; i < type.getTypeParameters().size(); i++) { - sb.append(", ").append(getTypeMirrorName(type.getTypeParameters().get(i).asType(), true)); - addImport(type.getTypeParameters().get(0).asType()); - } - sb.append("], "); - } - if (!extend.getKind().equals(TypeKind.NONE)) { - sb.append(getTypeMirrorName(extend, true)); - addImport(extend); - } - if (sb.lastIndexOf(", ") == sb.length() - 2) { - sb.delete(sb.length() - 2, sb.length()); - } - sb.append(")"); - if (sb.lastIndexOf("()") != -1) { - sb.delete(sb.length() - 2, sb.length()); - } - } - - sb.append(":\n"); - - sb.append(getClassDoc(type)); - - return sb.toString(); - } - - private void addImport(TypeMirror type) { - if (type != null) { - if (!imports.contains(type)) { - imports.add(type); - } - if (type.getKind().equals(TypeKind.ARRAY)) { - addImport(((ArrayType) type).getComponentType()); - } - } - - } - - private String getTypeMirrorName(TypeMirror type, boolean cls) { - imports.add(type); - switch (type.getKind()) { - case BOOLEAN -> { - return "bool"; - } - case BYTE, SHORT, LONG, FLOAT, DOUBLE -> { - return "float"; - } - case INT -> { - return "int"; - } - case CHAR -> { - return "str"; - } - case VOID, NONE, NULL -> { - return "None"; - } - case ARRAY -> { - //List[NAME] - importList = true; - return "List[" + getTypeMirrorName(((ArrayType) type).getComponentType(), false) + "]"; - } - case DECLARED -> { - return parseDeclared(type, cls); - } - case TYPEVAR -> { - typeVars.put( - ((TypeVariable) type).asElement().getSimpleName().toString(), - new AbstractMap.SimpleEntry<>(((TypeVariable) type).asElement().getSimpleName().toString(), true) - ); - importTypeVar = true; - return ((TypeVariable) type).asElement().getSimpleName().toString(); - } - case WILDCARD -> { - importAny = true; - return "Any"; - } - default -> throw new UnsupportedOperationException(String.valueOf(type.getKind())); - } - } - - private String parseDeclared(TypeMirror type, boolean cls) { - if (cls) { - if (unwantedClass.containsKey(getClearedNameFromTypeMirror(type))) { - return unwantedClass.get(getClearedNameFromTypeMirror(type)); - } - } - if (types.containsKey(getClearedNameFromTypeMirror(type))) { - - if (types.get(getClearedNameFromTypeMirror(type)).contains("List")) { - importList = true; - } - return types.get(getClearedNameFromTypeMirror(type)); - } - - if (getClearedNameFromTypeMirror(this.type.asType()).equals(getClearedNameFromTypeMirror(type))) { - return "\"" + getClassName((TypeElement) Main.typeUtils.asElement(type)) + "\""; - } - - if (withArg.containsKey(getClearedNameFromTypeMirror(type))) { - if (withArg.get(getClearedNameFromTypeMirror(type)).contains("List")) { - importList = true; - } else if (withArg.get(getClearedNameFromTypeMirror(type)).contains("Mapping")) { - importMapping = true; - } else if (withArg.get(getClearedNameFromTypeMirror(type)).contains("Set")) { - importSet = true; - } - - if (((DeclaredType) type).getTypeArguments().size() > 0) { - //Main.reporter.print(Diagnostic.Kind.NOTE, this.type + ", " + type + ": " + ((DeclaredType) type).getTypeArguments()); - StringBuilder sb = new StringBuilder(withArg.get(getClearedNameFromTypeMirror(type)) + "[" + getTypeMirrorName(((DeclaredType) type).getTypeArguments().get(0), false)); - for (int i = 1; i < ((DeclaredType) type).getTypeArguments().size(); i++) { - sb.append(", ").append(getTypeMirrorName(((DeclaredType) type).getTypeArguments().get(i), false)); - } - sb.append("]"); - //System.out.println(sb.toString()); - return sb.toString(); - } else { - System.out.println("ERROR: " + type); - return withArg.get(getClearedNameFromTypeMirror(type)) + "[]"; - } - } - return getClassName((TypeElement) Main.typeUtils.asElement(type)); - } - - /** - * @return class name with _ for inner class - */ - public static String getClassName(TypeElement type) { - StringBuilder s = new StringBuilder(type.getSimpleName()); - Element t2 = type.getEnclosingElement(); - while (t2.getKind() == ElementKind.INTERFACE || t2.getKind() == ElementKind.CLASS) { - s.insert(0, t2.getSimpleName() + "_"); - t2 = t2.getEnclosingElement(); - } - return s.toString(); - } - -} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/Main.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/Main.java deleted file mode 100644 index ee6c19d7e..000000000 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/Main.java +++ /dev/null @@ -1,268 +0,0 @@ -package xyz.wagyourtail.doclet.tsdoclet; - -import com.sun.source.util.DocTrees; -import jdk.javadoc.doclet.Doclet; -import jdk.javadoc.doclet.DocletEnvironment; -import jdk.javadoc.doclet.Reporter; -import xyz.wagyourtail.FileHandler; -import xyz.wagyourtail.StringHelpers; -import xyz.wagyourtail.doclet.options.IgnoredItem; -import xyz.wagyourtail.doclet.options.OutputDirectory; -import xyz.wagyourtail.doclet.options.Version; -import xyz.wagyourtail.doclet.tsdoclet.parsers.AbstractParser; -import xyz.wagyourtail.doclet.tsdoclet.parsers.ClassParser; -import xyz.wagyourtail.doclet.tsdoclet.parsers.EventParser; -import xyz.wagyourtail.doclet.tsdoclet.parsers.LibraryParser; - -import javax.lang.model.SourceVersion; -import javax.lang.model.element.*; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.util.Elements; -import javax.tools.Diagnostic; -import java.io.File; -import java.io.IOException; -import java.util.*; - -import static xyz.wagyourtail.doclet.tsdoclet.parsers.AbstractParser.shouldIgnore; -import static xyz.wagyourtail.doclet.tsdoclet.parsers.ClassParser.mixinInterfaceMap; - -public class Main implements Doclet { - public static Reporter reporter; - public static FileHandler outputTS; - public static final PackageTree classes = new PackageTree("Packages"); - public static DocTrees treeUtils; - public static Elements elementUtils; - public static final Map enumTypes = new TreeMap<>(); - private final Map filterableEvents = new TreeMap<>(); - - public static final List includedClassPath = List.of( - "xyz.wagyourtail.jsmacros.client.api.helpers.", - "xyz.wagyourtail.jsmacros.client.api.classes.inventory." - ); - - @Override - public void init(Locale locale, Reporter reporter) { - Main.reporter = reporter; - } - - @Override - public String getName() { - return "TypeScript Generator"; - } - - @SuppressWarnings("SpellCheckingInspection") - @Override - public Set getSupportedOptions() { - return Set.of( - new Version(), - new OutputDirectory(), - new IgnoredItem("-doctitle", 1), - new IgnoredItem("-notimestamp", 0), - new IgnoredItem("-windowtitle", 1) - ); - } - - @Override - public SourceVersion getSupportedSourceVersion() { - return SourceVersion.RELEASE_16; - } - - @Override - public boolean run(DocletEnvironment environment) { - Set elements = environment.getIncludedElements(); - treeUtils = environment.getDocTrees(); - elementUtils = environment.getElementUtils(); - - AbstractParser.initObjectElement(); - - Set libraryClasses = new TreeSet<>((a, b) -> String.CASE_INSENSITIVE_ORDER.compare(a.name, b.name)); - Set eventClasses = new TreeSet<>((a, b) -> String.CASE_INSENSITIVE_ORDER.compare(a.getName(), b.getName())); - - outputTS = new FileHandler(new File(OutputDirectory.outputDir, "JsMacros-" + Version.version + ".d.ts")); - - if (!OutputDirectory.outputDir.exists() && !OutputDirectory.outputDir.mkdirs()) { - reporter.print(Diagnostic.Kind.ERROR, "Failed to create version dir\n"); - return false; - } - - if (outputTS.getFile().exists() && !outputTS.getFile().delete()) { - reporter.print(Diagnostic.Kind.ERROR, "Failed to remove old ts output\n"); - return false; - } - - for (Element v : elements) if (v instanceof TypeElement e) { - for (AnnotationMirror annotationMirror : e.getAnnotationMirrors()) { - String annotationName = annotationMirror.getAnnotationType().asElement().getSimpleName().toString(); - switch (annotationName) { - case "Library" -> - libraryClasses.add(new LibraryParser(e, getAnnotationValue(annotationMirror).toString())); - case "Event" -> { - Boolean cancellableValue = (Boolean) getAnnotationValue(annotationMirror, "cancellable"); - boolean cancellable = Boolean.TRUE.equals(cancellableValue); - String name = getAnnotationValue(annotationMirror).toString(); - eventClasses.add(new EventParser(e, name, cancellable)); - DeclaredType filterer = (DeclaredType) getAnnotationValue(annotationMirror, "filterer"); - if (filterer != null) { - String filtererName = filterer.asElement().getSimpleName().toString(); - if (!filtererName.equals("EventFilterer")) { - classes.addClass(filterer.asElement()); - filterableEvents.put(name, filtererName); - } - } - } - case "Mixin" -> { - List interfaces = e.getInterfaces().stream() - .filter(t -> t.getKind() == TypeKind.DECLARED) - .map(t -> (TypeElement) ((DeclaredType) t).asElement()) - .filter(i -> !shouldIgnore(i)) - .toList(); - if (interfaces.isEmpty()) continue; - - @SuppressWarnings("unchecked") - List targets = (List) getAnnotationValue(annotationMirror); - if (targets == null || targets.isEmpty()) continue; - - for (AnnotationValue target : targets) { - TypeMirror type = (TypeMirror) target.getValue(); - if (type.getKind() != TypeKind.DECLARED) continue; - - TypeElement el = (TypeElement) ((DeclaredType) type).asElement(); - mixinInterfaceMap.computeIfAbsent(el, k -> new HashSet<>()).addAll(interfaces); - } - } - } - } - String qualifiedName = e.getQualifiedName().toString(); - if (includedClassPath.stream().anyMatch(qualifiedName::startsWith)) { - classes.addClass(e); - } - if (e.getSimpleName().contentEquals("EventContainer")) { - classes.addClass(e); - System.out.println(e); - } - } - - try { - // `\n\` to prevent java compiler from trimming the string - outputTS.append( - """ - \n\ - /** - * The global context \n\ - * If you're trying to access the context in {@link JsMacros.on}, \n\ - * use the second param of callback - */ - declare const context: EventContainer; - /** - * Assert and convert event type: - * ```js - * JsMacros.assertEvent(event, 'Service') - * ``` - * If the type doesn't convert, that means the event type doesn't have any properties - */ - declare const event: Events.BaseEvent; - declare const file: Packages.java.io.File; - - declare namespace Events { - - interface BaseEvent extends JavaObject { - - getEventName(): string; - - } - - interface Cancellable { - - cancel(): void; - - }""" - ); - for (EventParser event : eventClasses) { - outputTS.append("\n\n" + StringHelpers.tabIn(event.genTSInterface())); - } - - outputTS.append("\n\n}\n\ninterface EventFilterers {\n"); - for (String name : filterableEvents.keySet()) { - outputTS.append("\n ").append(name) - .append(": ").append(filterableEvents.get(name)).append(";"); - } - - // for type-safe event listener - outputTS.append("\n\n}\n\ninterface Events {\n"); - for (EventParser event : eventClasses) { - outputTS.append("\n ").append(event.getName()) - .append(": Events.").append(event.getName()).append(";"); - } - outputTS.append("\n\n}"); - - for (LibraryParser lib : libraryClasses) { - outputTS.append("\n\n").append(lib.genTSInterface()); - } - - outputTS.append("\n\ndeclare ").append(classes.genTSTree()).append("\n"); - - // short alias of jsmacros types, for jsdoc / type casting / type annotation and more - // also used by some DocletReplace annotations - Set duplicateCheck = new HashSet<>(); - Set sorter = new TreeSet<>(); - for (ClassParser clz : classes.getWagClasses()) { - if (!duplicateCheck.add(clz.getClassName(false))) continue; - clz.isPackage = false; // to trick it transfer full type - sorter.add("\ntype " + clz.getClassName(true, true) + " = " + - clz.getQualifiedType() + ";"); - clz.isPackage = true; - } - outputTS.append(String.join("", sorter)); - - // append number enums here because they are very unlikely to change - //noinspection SpellCheckingInspection - outputTS.append( - """ - \n - // Enum types - type Bit = 1 | 0; - type Trit = 2 | Bit; - type Dit = 3 | Trit; - type Pentit = 4 | Dit; - type Hexit = 5 | Pentit; - type Septit = 6 | Hexit; - type Octit = 7 | Septit; - - type Side = Hexit; - type HotbarSlot = Octit | 8; - type HotbarSwapSlot = HotbarSlot | OffhandSlot; - type ClickSlotButton = HotbarSwapSlot | 9 | 10; - type OffhandSlot = 40; - - """ - ); - - for (Map.Entry ent : enumTypes.entrySet()) { - outputTS.append("type ").append(ent.getKey()).append(" = ").append(ent.getValue()); - if (!ent.getValue().contains("\n")) outputTS.append(";\n"); - } - - } catch (IOException e) { - e.printStackTrace(); - return false; - } - - return true; - } - - public static Object getAnnotationValue(AnnotationMirror annotation) { - return getAnnotationValue(annotation, "value"); - } - - public static Object getAnnotationValue(AnnotationMirror annotation, String key) { - for (Map.Entry el : annotation.getElementValues().entrySet()) { - if (el.getKey().getSimpleName().contentEquals(key)) { - return el.getValue().getValue(); - } - } - return null; - } - -} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/PackageTree.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/PackageTree.java deleted file mode 100644 index cfd281d2f..000000000 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/PackageTree.java +++ /dev/null @@ -1,149 +0,0 @@ -package xyz.wagyourtail.doclet.tsdoclet; - -import xyz.wagyourtail.StringHelpers; -import xyz.wagyourtail.doclet.tsdoclet.parsers.AbstractParser; -import xyz.wagyourtail.doclet.tsdoclet.parsers.ClassParser; - -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.PackageElement; -import javax.lang.model.element.TypeElement; -import java.util.*; -import java.util.stream.Stream; - -public class PackageTree { - public final static Set predefinedClasses = Set.of( - "java.lang.Class", "java.lang.Object", "java.lang.Iterable", - "java.lang.Throwable", "java.lang.StackTraceElement", - "java.util.Collection", "java.util.List", "java.util.Map", "java.util.Set", - "java.io.Serializable", "java.io.File", "java.net.URL", "java.net.URI" - ); - // List of reserved keywords #2536 - // https://github.com/microsoft/TypeScript/issues/2536 - public final static Set tsReservedWords = Set.of( - "break", "case", "catch", "class", "const", "continue", "debugger", "default", - "delete", "do", "else", "enum", "export", "extends", "false", "finally", "for", - "function", "if", "import", "in", "instanceof", "new", "null", "return", "super", - "switch", "this", "throw", "true", "try", "typeof", "var", "void", "while", "with" - ); - private String pkgName; - private final Map children = new TreeMap<>(); - private final Set classes = new LinkedHashSet<>(); - private final Map compiledClasses = new TreeMap<>((a, b) -> String.CASE_INSENSITIVE_ORDER.compare(a.className, b.className)); - - public boolean dirty = true; - - public PackageTree(String pkgName) { - this.pkgName = pkgName; - } - - public void addClass(Element clazz) { - if (AbstractParser.shouldIgnore(clazz)) return; - Stack enclosing = new Stack<>(); - Element enclose = clazz; - - while (enclose != null && enclose.getKind() != ElementKind.PACKAGE) enclose = enclose.getEnclosingElement(); - - if (enclose != null) { - String[] pkg = ((PackageElement)enclose).getQualifiedName().toString().split("\\."); - for (int i = pkg.length - 1; i >= 0; --i) { - if (!pkg[i].isEmpty()) enclosing.push(pkg[i]); - } - String path = String.join(".", pkg); - if (predefinedClasses.contains(path + "." + clazz.getSimpleName())) { - return; - } - if (path.startsWith("org.joml")) return; - } - addClassInternal(enclosing, clazz); - } - - private boolean addClassInternal(Stack enclosing, Element clazz) { - if (enclosing.empty()) { - this.dirty = classes.add(new ClassParser((TypeElement) clazz)) || this.dirty; - } else { - this.dirty = children.computeIfAbsent(enclosing.pop(), PackageTree::new) - .addClassInternal(enclosing, clazz) || this.dirty; - } - return this.dirty; - } - - private void prepareTSTree() { - while (this.dirty) { - this.dirty = false; - for (ClassParser aClass : Set.copyOf(classes)) { - compiledClasses.computeIfAbsent(aClass, ClassParser::genTSInterface); - } - for (PackageTree value : Set.copyOf(children.values())) { - value.prepareTSTree(); - } - } - } - - public String genTSTree() { - prepareTSTree(); - return genTSTreeIntern().replaceAll("\\bPackages\\.", ""); - } - - private String genTSTreeIntern() { - if (classes.isEmpty() && children.size() == 1) { - PackageTree onlyChild = children.values().iterator().next(); - if (!tsReservedWords.contains(onlyChild.pkgName)) { - onlyChild.pkgName = pkgName + "." + onlyChild.pkgName; - return onlyChild.genTSTreeIntern(); - } - } - - StringBuilder exports = new StringBuilder(); - // string builder for elements that needs export - StringBuilder se = new StringBuilder("namespace "); - if (tsReservedWords.contains(pkgName)) { - System.out.println("Escaped typescript reserved word: " + pkgName + " -> _" + pkgName); - se.append("_"); - } - se.append(pkgName).append(" {"); - // string builder for elements that doesn't need export - StringBuilder sn = new StringBuilder(se); - - for (Map.Entry ent : compiledClasses.entrySet()) { - exports.append(ent.getKey().getClassName(false)).append(",\n"); - se.append("\n\n").append(StringHelpers.tabIn(ent.getValue())); - } - for (PackageTree value : children.values()) { - if (tsReservedWords.contains(value.pkgName)) { - exports.append("_").append(value.pkgName).append(" as ").append(value.pkgName).append(",\n"); - se.append("\n\n").append(StringHelpers.tabIn(value.genTSTreeIntern())); - } else sn.append("\n\n").append(StringHelpers.tabIn(value.genTSTreeIntern())); - } - - if (!exports.isEmpty()) { - exports.setLength(exports.length() - ",\n".length()); - se.append("\n\n export {"); - if (exports.length() < 64) { - se.append(" ").append(exports.toString().replaceAll("\n", " ")).append(" }"); - } else { - se.append("\n") - .append(StringHelpers.tabIn(exports.toString(), 2)) - .append("\n }"); - } - se.append("\n\n}"); - } else se.setLength(0); - - if (!sn.toString().endsWith(" {")) { - if (se.isEmpty()) se = sn; - else se.append("\n").append(sn); - se.append("\n\n}"); - } - - return se.toString(); - } - - public List getWagClasses() { - return children.get("xyz").children.get("wagyourtail").streamAllClasses().toList(); - } - - private Stream streamAllClasses() { - return Stream.concat(classes.stream(), children.values().stream().flatMap(PackageTree::streamAllClasses)); - } - -} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/AbstractParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/AbstractParser.java deleted file mode 100644 index 4e51765d1..000000000 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/AbstractParser.java +++ /dev/null @@ -1,592 +0,0 @@ -package xyz.wagyourtail.doclet.tsdoclet.parsers; - -import com.sun.source.doctree.*; -import org.jetbrains.annotations.NotNull; -import xyz.wagyourtail.StringHelpers; -import xyz.wagyourtail.doclet.*; -import xyz.wagyourtail.doclet.tsdoclet.Main; -import xyz.wagyourtail.doclet.tsdoclet.PackageTree; - -import javax.lang.model.element.*; -import javax.lang.model.type.*; -import java.util.*; -import java.util.stream.Collectors; - -import static xyz.wagyourtail.doclet.tsdoclet.PackageTree.tsReservedWords; - -public abstract class AbstractParser { - static final public Set javaAliases = Set.of( - "java.lang.Array", - "java.lang.Class", - "java.util.Collection", - "java.util.List", - "java.util.Map", - "java.util.Set" - ); - static final public Map javaNumberType = Map.of( - "java.lang.Integer", "int", - "java.lang.Float", "float", - "java.lang.Long", "long", - "java.lang.Short", "short", - "java.lang.Character", "char", - "java.lang.Byte", "byte", - "java.lang.Double", "double", - "java.lang.Number", "number" - ); - static final public Map functionalInterfaces = Map.of( - "java.util.function.Consumer", "MethodWrapper<$0>", - "java.util.function.BiConsumer", "MethodWrapper<$0, $1>", - "java.util.function.Function", "MethodWrapper<$0, any, $1>", - "java.util.function.BiFunction", "MethodWrapper<$0, $1, $2>", - "java.util.function.Predicate", "MethodWrapper<$0, any, boolean>", - "java.util.function.BiPredicate", "MethodWrapper<$0, $1, boolean>", - "java.util.function.Supplier", "MethodWrapper", - "java.util.Comparator", "MethodWrapper<$0, $0, int>", - "java.lang.Runnable", "MethodWrapper" - ); - - private static final Set loggedTypes = new HashSet<>(); - private final String path; - protected final TypeElement type; - public boolean isPackage = true; - private transient boolean returnsSelf = false; - - public static TypeElement objectElement; - public static Set objectMethods; - public static Set objectMethodNames; - - public static void initObjectElement() { - objectElement = Main.elementUtils.getTypeElement("java.lang.Object"); - objectMethods = objectElement.getEnclosedElements().stream() - .filter(e -> e.getKind() == ElementKind.METHOD && checkModifier(e, false)) - .map(e -> (ExecutableElement) e) - .collect(Collectors.toUnmodifiableSet()); - objectMethodNames = objectMethods.stream() - .map(ExecutableElement::getSimpleName) - .collect(Collectors.toUnmodifiableSet()); - } - - public AbstractParser(TypeElement type) { - this.type = type; - Element elem = type.getEnclosingElement(); - while (!(elem instanceof PackageElement)) elem = elem.getEnclosingElement(); - this.path = ((PackageElement) elem).getQualifiedName().toString(); - } - - public String genFields(Set fields) { - final StringBuilder s = new StringBuilder(); - for (Element field : fields) { - if (checkModifier(field, false) && !shouldIgnore(field)) { - s.append(genField(field)).append("\n"); - } - } - return s.toString(); - } - - public String genStaticFields(Set fields) { - final StringBuilder s = new StringBuilder(); - for (Element field : fields) { - if (checkModifier(field, true) && !shouldIgnore(field)) { - s.append(genField(field)).append("\n"); - } - } - return s.toString(); - } - - public String genMethods(Set methods) { - final StringBuilder s = new StringBuilder(); - for (Element method : methods) { - if (checkModifier(method, false) && !shouldIgnore(method)) { - s.append(genMethod((ExecutableElement) method)).append("\n"); - } - } - return s.toString(); - } - - public String genStaticMethods(Set methods) { - final StringBuilder s = new StringBuilder(); - for (Element method : methods) { - if (checkModifier(method, true) && !shouldIgnore(method)) { - s.append(genMethod((ExecutableElement) method)).append("\n"); - } - } - return s.toString(); - } - - public String genConstructors(Set methods) { - final StringBuilder s = new StringBuilder(); - for (Element method : methods) { - if (!method.getModifiers().contains(Modifier.PUBLIC)) continue; - if (shouldIgnore(method)) continue; - s.append(genConstructor((ExecutableElement) method)).append("\n"); - } - return s.toString(); - } - - public String genField(Element field) { - StringBuilder s = new StringBuilder(); - s.append(genComment(field)); - - // modifiers - Set mods = field.getModifiers(); - if (mods.contains(Modifier.STATIC)) s.append("static "); - if (mods.contains(Modifier.FINAL)) s.append("readonly "); - - // name - s.append(field.getSimpleName()).append(": "); - - // type - DocletReplaceReturn replace = field.getAnnotation(DocletReplaceReturn.class); - if (replace != null) { - s.append(replace.value()); - } else { - s.append(transformType(field)); - if (isNullable(field)) s.append(" | null"); - } - - s.append(";"); - - return s.toString(); - } - - public String genMethod(ExecutableElement method) { - return genExecutable(method, false); - } - - public String genConstructor(ExecutableElement constructor) { - return genExecutable(constructor, true); - } - - public String genExecutable(ExecutableElement e, boolean isConstructor) { - final StringBuilder s = new StringBuilder(); - s.append(genComment(e)); - if (!isConstructor && e.getModifiers().contains(Modifier.STATIC)) s.append("static "); - - // name - s.append(isConstructor ? "constructor " : e.getSimpleName()); - - // type params - DocletReplaceTypeParams replace = e.getAnnotation(DocletReplaceTypeParams.class); - if (replace != null) { - if (!replace.value().isEmpty()) s.append("<").append(replace.value()).append(">"); - } else { - List typeParams = (isConstructor ? type : e).getTypeParameters(); - if (!typeParams.isEmpty()) { - s.append("<"); - for (TypeParameterElement param : typeParams) { - s.append(transformType(param)); - String ext = transformType(((TypeVariable) param.asType()).getUpperBound()); - if (!ext.equals("any")) { - s.append(" extends ").append(ext); - } - s.append(", "); - } - s.setLength(s.length() - ", ".length()); - s.append(">"); - } - } - - // params - s.append("("); - DocletReplaceParams replace2 = e.getAnnotation(DocletReplaceParams.class); - if (replace2 != null) { - s.append(replace2.value()); - } else { - List params = e.getParameters(); - if (!params.isEmpty()) { - VariableElement restParam = e.isVarArgs() ? params.get(params.size() - 1) : null; - for (VariableElement param : params) { - String name = param.getSimpleName().toString(); - if (restParam == param) { - s.append("..."); - if (tsReservedWords.contains(name)) s.append("_"); - s.append(name).append(": ").append("JavaVarArgs<").append(transformType(param, true)); - int sl2 = s.length() - "[]".length(); - if (s.substring(sl2).equals("[]")) s.setLength(sl2); - else System.out.println("varargs type is not array?? " + type.getSimpleName() + "." + e.getSimpleName()); - if (isNullable(param)) s.append(" | null"); - s.append(">"); - } else { - if (tsReservedWords.contains(name)) s.append("_"); - s.append(name).append(": ").append(transformType(param, true)); - if (isNullable(param)) s.append(" | null"); - } - s.append(", "); - } - s.setLength(s.length() - ", ".length()); - } - } - s.append(")"); - - // return type - if (!isConstructor) { - s.append(": "); - DocletReplaceReturn replace3 = e.getAnnotation(DocletReplaceReturn.class); - if (replace3 != null) { - transformType(e.getReturnType()); // to add type to the Packages - s.append(replace3.value()); - } else if (returnsSelf && type.asType().equals(e.getReturnType())) { - s.append("this"); - } else { - s.append(transformType(e.getReturnType())); - if (isNullable(e)) s.append(" | null"); - } - } - - s.append(";"); - - return s.toString(); - } - - public String transformType(Element elem) { - return transformType(elem.asType(), false, false); - } - - public String transformType(Element elem, boolean isParamType) { - return transformType(elem.asType(), isParamType, false); - } - - @SuppressWarnings("unused") - public String transformType(Element elem, boolean isParamType, boolean isExtends) { - return transformType(elem.asType(), isParamType, isExtends); - } - - public String transformType(TypeMirror type) { - return transformType(type, false, false); - } - - @SuppressWarnings("unused") - public String transformType(TypeMirror type, boolean isParamType) { - return transformType(type, isParamType, false); - } - - public String transformType(TypeMirror type, boolean isParamType, boolean isExtends) { - switch (type.getKind()) { - case BOOLEAN -> { - return "boolean"; - } - case BYTE -> { - return isParamType ? "byte" : "number"; - } - case SHORT -> { - return isParamType ? "short" : "number"; - } - case INT -> { - return isParamType ? "int" : "number"; - } - case LONG -> { - return isParamType ? "long" : "number"; - } - case FLOAT -> { - return isParamType ? "float" : "number"; - } - case DOUBLE -> { - return isParamType ? "double" : "number"; - } - case CHAR -> { - return isParamType ? "char" : "number"; - } - case VOID, NONE -> { - return "void"; - } - case DECLARED -> { - final Element typeElement = ((DeclaredType) type).asElement(); - StringBuilder rawType = new StringBuilder(typeElement.getSimpleName().toString()); - Element enclosing = typeElement.getEnclosingElement(); - // full class name - while (enclosing.getKind() == ElementKind.CLASS || enclosing.getKind() == ElementKind.INTERFACE) { - rawType.insert(0, enclosing.getSimpleName().toString() + "$"); - enclosing = enclosing.getEnclosingElement(); - } - - String classpath = ((QualifiedNameable) enclosing).getQualifiedName().toString(); - // check Event and Library type (probably none Library) - if (classpath.startsWith("xyz.wagyourtail.")) { - Optional special = typeElement.getAnnotationMirrors().stream() - .map(a -> switch (a.getAnnotationType().asElement().getSimpleName().toString()) { - case "Event" -> "Events." + Main.getAnnotationValue(a); - case "Library" -> "typeof " + Main.getAnnotationValue(a); - default -> null; - }) - .filter(Objects::nonNull) - .findFirst(); - if (special.isPresent()) return special.get(); - } - - // detect types defined in Graal.d.ts - boolean aliased = false; - if (!isExtends && javaAliases.contains(classpath + "." + rawType)) { - aliased = true; - rawType.insert(0, "Java"); - if (isParamType && rawType.toString().equals("JavaClass")) rawType.append("Arg"); - } else rawType.insert(0, classpath + "."); - - // type params - List params = ((DeclaredType) type).getTypeArguments(); - if (isParamType && functionalInterfaces.containsKey(rawType.toString())) { - // convert to MethodWrapper - String res = functionalInterfaces.get(rawType.toString()); - if (!params.isEmpty()) { - int size = params.size(); - for (int i = 0; i < size; i++) { - res = res.replace("$" + i, transformType(params.get(i), true, false)); - } - } - return res; - } - - if (!params.isEmpty()) { - rawType.append("<"); - for (TypeMirror param : params) { - rawType.append(transformType(param, isParamType, isExtends)).append(", "); - } - rawType.setLength(rawType.length() - 2); - rawType.append(">"); - } - - String res = rawType.toString(); - - // comment out minecraft types because it's obfuscated - // + including minecraft types will make the file large asf - // + don't even know how to get obfuscated names in doclet environment - if (res.startsWith("net.minecraft.")) { - return "/* " + res.replaceAll("/\\* ", "").replaceAll(" \\*/(?: any)?", "") + " */ any"; - } - - // check BaseEvent - if (res.equals("xyz.wagyourtail.jsmacros.core.event.BaseEvent")) { - return "Events.BaseEvent"; - } - - // register this type to the package tree for further type generation - Main.classes.addClass(((DeclaredType) type).asElement()); - - // primitive/aliased check - if (!isExtends && res.startsWith("java.lang")) { - if (javaNumberType.containsKey(res)) { - return isParamType ? javaNumberType.get(res) : "number"; - } - - switch (res) { - case "java.lang.Boolean" -> { return "boolean"; } - case "java.lang.String" -> { return "string"; } - case "java.lang.Object" -> { return "any"; } - } - } else { - if (aliased) return res; - } - - // insert root name to be able to actually reference this type - // if it's redundant, the regex in PackageTree#genTSTree() will take care of it - if (!isPackage || !res.startsWith(this.path + ".")) return "Packages." + res; - // at this point, res must be starts with this.path, because of the condition above - - String withoutTypeParams = res.contains("<") ? res.substring(0, res.indexOf("<")) : res; - - // if res isn't in the same package as this.type - if (withoutTypeParams.substring(this.path.length() + 1).contains(".")) return "Packages." + res; - // if res is defined in Graal.d.ts, don't trim the path (as the next line did) - // because otherwise this won't be able to reference it - if (PackageTree.predefinedClasses.contains(withoutTypeParams)) return res; - // trim the path - return res.substring(this.path.length() + 1); - } - case TYPEVAR -> { - return ((TypeVariable) type).asElement().getSimpleName().toString(); - } - case ARRAY -> { - String component = transformType(((ArrayType) type).getComponentType(), isParamType, isExtends); - return isParamType ? component + "[]" : "JavaArray<" + component + ">"; - } - case WILDCARD -> { - TypeMirror bound = ((WildcardType) type).getExtendsBound(); - if (bound == null) bound = ((WildcardType) type).getSuperBound(); - return bound == null ? "any" : transformType(bound, isParamType, isExtends); - } - case INTERSECTION -> { - StringBuilder s = new StringBuilder("("); - for (TypeMirror t : ((IntersectionType) type).getBounds()) { - s.append(transformType(t, isParamType, isExtends)).append(" & "); - } - s.setLength(s.length() - " & ".length()); - s.append(")"); - return s.toString(); - } - case UNION -> { - StringBuilder s = new StringBuilder("("); - for (TypeMirror t : ((UnionType) type).getAlternatives()) { - s.append(transformType(t, isParamType, isExtends)).append(" | "); - } - s.setLength(s.length() - " | ".length()); - s.append(")"); - return s.toString(); - } - } - throw new UnsupportedOperationException(String.valueOf(type.getKind())); - } - - public String genComment(Element element) { - checkEnumType(element); - returnsSelf = false; - - DocCommentTree tree = Main.treeUtils.getDocCommentTree(element); - boolean isDeprecated = Main.elementUtils.isDeprecated(element); - if (tree == null) return isDeprecated ? "/** @deprecated */\n" : ""; - - StringBuilder b = new StringBuilder(); - b.append(genCommentDesc(tree.getFullBody()).replaceAll("(?<=[.,:;>]) ?\n", " \n")); - - for (DocTree blockTag : tree.getBlockTags()) { - switch (blockTag.getKind()) { - case SEE -> { - for (DocTree see : ((SeeTree) blockTag).getReference()) { - b.append("\n@see "); - if (see.getKind() == DocTree.Kind.REFERENCE) { - b.append(convertSignature(((ReferenceTree) see).getSignature())); - } else { - b.append(see); - } - } - } - case PARAM -> { - ParamTree param = (ParamTree) blockTag; - List description = param.getDescription(); - if (!description.isEmpty()) { - b.append(param.isTypeParameter() ? "\n@template " : "\n@param ") - .append(param.getName().getName()).append(" ") - .append(genCommentDesc(description)); - } - } - case RETURN -> { - List description = ((ReturnTree) blockTag).getDescription(); - if (!description.isEmpty()) { - String desc = genCommentDesc(description); - if (desc.startsWith("self") && (desc.length() == "self".length() || desc.charAt("self".length()) == ' ')) returnsSelf = true; - b.append("\n@return "); - // to prevent vscode from parsing the description as type - // typescript already provided the type, so assign it as any is fine - if (desc.startsWith("{")) b.append("{*} "); - b.append(desc); - } - } - case SINCE -> b.append("\n@since ").append(genCommentDesc(((SinceTree) blockTag).getBody())); - case DEPRECATED -> b.append("\n@deprecated ").append(genCommentDesc(((DeprecatedTree) blockTag).getBody())); - default -> b.append("\n").append(blockTag); - } - } - - String fin = b.toString().trim() - .replaceAll("\n

    ", "\n") - .replaceAll("", "```") - // is there any better way to parse html tag? - .replaceAll("((?:\n|.)*?)", "[$2]($1)") - .replaceAll("<", "<") - .replaceAll(">", ">"); - if (fin.isBlank()) return isDeprecated ? "/** @deprecated */\n" : ""; - - if (isDeprecated && !b.toString().contains("@deprecated")) { - fin += "\n@deprecated"; - } - - if (fin.startsWith("@since") && !fin.contains("\n")) return "/** " + fin + " */\n"; - - return ("\n/**\n" + - StringHelpers.addToLineStarts(fin, " * ") + - "\n */\n").replaceAll("\n \\* +\n", "\n *\n"); - } - - private String genCommentDesc(List desc) { - final StringBuilder s = new StringBuilder(); - for (DocTree docTree : desc) { - switch (docTree.getKind()) { - case LINK, LINK_PLAIN -> { - String sig = ((LinkTree) docTree).getReference().getSignature(); - if (javaNumberType.containsKey(sig)) s.append(javaNumberType.get(sig)); - else if (sig.equals("java.lang.String")) s.append("string"); - else if (sig.equals("java.lang.Boolean")) s.append("boolean"); - else { - String str = convertSignature(sig); - int i = str.indexOf("<"); - if (i == -1) i = str.indexOf("("); - s.append("{@link "); - if (i == -1) { - s.append(str).append("}"); - } else { - s.append(str, 0, i).append("}").append(str.substring(i)); - } - } - } - case CODE -> s.append("`").append(((LiteralTree) docTree).getBody()).append("`"); - default -> s.append(docTree); - } - } - return s.toString(); - } - - private String convertSignature(String sig) { - if (sig.matches("^xyz\\.wagyourtail\\.[^#]+\\w$")) return sig.replaceFirst("^.+\\.(?=[^.]+$)", ""); - if (sig.matches("^\\w+\\.(?:\\w+\\.)+[\\w$_]+$")) return "Packages." + sig; -// sig = sig.replaceFirst("(?<=\\S)(?=[<(])", " "); - return sig.startsWith("#") - ? sig.substring(1) - : sig.replaceFirst("^(?:xyz\\.wagyourtail\\.jsmacros\\.(?:client\\.api|core)\\.library\\.impl\\.)?F([A-Z]\\w+)#", "$1.").replaceFirst("#", "."); - } - - public abstract String genTSInterface(); - - public String getQualifiedType() { - return isPackage ? this.path + "." + transformType(type) : transformType(type); - } - - public static void checkEnumType(Element element) { - DocletDeclareType enumType = element.getAnnotation(DocletDeclareType.class); - if (enumType == null) return; - - if (Main.enumTypes.containsKey(enumType.name()) - && !loggedTypes.contains(enumType.name()) - && !Objects.equals(Main.enumTypes.get(enumType.name()), enumType.type()) - ) { - System.out.println("Duplicate enum type name: " + enumType.name()); - loggedTypes.add(enumType.name()); - } - Main.enumTypes.put(enumType.name(), enumType.type()); - } - - public static boolean checkModifier(@NotNull Element e, boolean shouldBeStatic) { - Set mods = e.getModifiers(); - return mods.contains(Modifier.PUBLIC) && mods.contains(Modifier.STATIC) == shouldBeStatic; - } - - public static boolean shouldIgnore(@NotNull Element e) { - return e.getAnnotation(DocletIgnore.class) != null; - } - - @SuppressWarnings("BooleanMethodIsAlwaysInverted") - protected boolean isObjectMethod(Element m) { - if (!objectMethodNames.contains(m.getSimpleName()) - || m.getKind() != ElementKind.METHOD - || Main.treeUtils.getDocCommentTree(m) != null) return false; - for (ExecutableElement om : objectMethods) { - if (Main.elementUtils.overrides((ExecutableElement) m, om, type)) return true; - } - return false; - } - - public boolean isNullable(Element e) { - return e.getAnnotationMirrors().stream() - .anyMatch(a -> a.getAnnotationType().asElement().getSimpleName().contentEquals("Nullable")); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof AbstractParser that)) return false; - return type.equals(that.type); - } - - @Override - public int hashCode() { - return Objects.hash(type); - } - -} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/ClassParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/ClassParser.java deleted file mode 100644 index a2fb85731..000000000 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/ClassParser.java +++ /dev/null @@ -1,324 +0,0 @@ -package xyz.wagyourtail.doclet.tsdoclet.parsers; - -import xyz.wagyourtail.StringHelpers; -import xyz.wagyourtail.doclet.tsdoclet.Main; - -import javax.lang.model.element.*; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.type.TypeVariable; -import java.util.*; - -public class ClassParser extends AbstractParser { - private static final Set objectAliases = Set.of("void", "any", "JavaObject", "Object"); - public static final Map> mixinInterfaceMap = new LinkedHashMap<>(); - public final String className; - private final Set superMcClasses = new LinkedHashSet<>(); - private boolean doesDirectExtendMc = false; - private Set mixinInterfaces; - - public ClassParser(TypeElement type) { - super(type); - StringBuilder s = new StringBuilder(type.getSimpleName()); - - Element enclosing = type.getEnclosingElement(); - while (enclosing.getKind() == ElementKind.INTERFACE || enclosing.getKind() == ElementKind.CLASS) { - s.insert(0, enclosing.getSimpleName() + "$"); - enclosing = enclosing.getEnclosingElement(); - } - - className = s.toString(); - } - - public String getClassName(boolean typeParams) { - return getClassName(typeParams, false); - } - - public String getClassName(boolean typeParams, boolean defaultToAny) { - if (!typeParams) return className; - StringBuilder s = new StringBuilder(className); - - List params = this.type.getTypeParameters(); - if (params != null && !params.isEmpty()) { - s.append("<"); - for (TypeParameterElement param : params) { - s.append(transformType(param)); - String ext = transformType(((TypeVariable) param.asType()).getUpperBound()); - if (!ext.endsWith("any")) { - s.append(" extends ").append(ext); - if (defaultToAny) s.append(" = any"); - } else if (ext.startsWith("/* net.minecraft.")) { - s.append(" = ").append(ext); - } else if (defaultToAny) s.append(" = any"); - s.append(", "); - } - s.setLength(s.length() - ", ".length()); - s.append(">"); - } - - return s.toString(); - } - - private String getClassHeader() { - StringBuilder s = new StringBuilder("static readonly class: JavaClass<"); - s.append(getClassName(false)); - - int params = type.getTypeParameters().size(); - if (params > 0) { - s.append("<").append( - ", any".repeat(params).substring(", ".length()) - ).append(">"); - } - - s.append(">;\n/** @deprecated */ static prototype: undefined;\n"); - return s.toString(); - } - - private String buildExtends() { - StringBuilder s = new StringBuilder(" extends "); - - String sup = transformType(type.getSuperclass(), false, true); - if (objectAliases.contains(sup)) { - s.append("java.lang.Object"); - } else if (sup.startsWith("/* net.minecraft.")) { - s.append(sup, 0, sup.length() - "any".length()).append("java.lang.Object"); - } else { - s.append(sup); - } - - return s.toString(); - } - - private String buildImplements() { - Set interfaces = new HashSet<>(type.getInterfaces()); - if (doesDirectExtendMc) for (TypeElement e : mixinInterfaces) { - interfaces.add(e.asType()); - System.out.println("Added mixin interface " + e.getSimpleName() + " on class " + type.getSimpleName()); - } - if (interfaces.isEmpty()) return ""; - - Set strings = new TreeSet<>(); - for (TypeMirror ifa : interfaces) { - strings.add(transformType(ifa, false, true)); - } - - StringBuilder s = new StringBuilder(" extends "); - for (String sup : strings) { - if (sup.startsWith("/* net.minecraft.")) { - s.append(sup, 0, sup.length() - "any".length()).append("JavaObject"); - } else { - s.append(sup); - } - s.append(", "); - } - s.setLength(s.length() - ", ".length()); - - return s.toString(); - } - - private void getSuperClasses(Set set, TypeElement c) { - if (!c.getKind().isInterface()) { - TypeMirror t = c.getSuperclass(); - if (t instanceof DeclaredType) { - TypeElement e = (TypeElement) ((DeclaredType) t).asElement(); - if (isMinecraftClass(t)) { - superMcClasses.add(e); - if (doesDirectExtendMc) { - Set ifs = mixinInterfaceMap.get(e); - if (ifs != null) { - set.addAll(ifs); - mixinInterfaces.addAll(ifs); - } - } - } else { - set.add(e); - } - getSuperClasses(set, e); - } - } - - for (TypeMirror t : c.getInterfaces()) { - TypeElement e = (TypeElement) ((DeclaredType) t).asElement(); - if (isMinecraftClass(t)) { - superMcClasses.add(e); - } else { - set.add(e); - } - getSuperClasses(set, e); - } - } - - private boolean isObfuscated(Element m) { - return isObfuscated(m, type); - } - - private boolean isObfuscated(Element m, TypeElement type) { - // probably doesn't cover edge cases because this annotation is optional - if (m.getAnnotation(Override.class) == null) return false; - if (m.getKind() != ElementKind.METHOD) return false; - for (TypeElement clz : superMcClasses) { - for (Element e : clz.getEnclosedElements()) { - if (e.getKind() != ElementKind.METHOD) continue; - if (overrides(m, e, type)) return true; - } - } - return false; - } - - private boolean isMinecraftClass(TypeMirror type) { - if (type.getKind() != TypeKind.DECLARED) return false; - Element e = ((DeclaredType) type).asElement(); - do { - e = e.getEnclosingElement(); - } while (e.getKind() == ElementKind.CLASS || e.getKind() == ElementKind.INTERFACE); - - return ((PackageElement) e).getQualifiedName().toString().startsWith("net.minecraft."); - } - - private boolean overrides(Element overrider, Element overridden) { - return overrides(overrider, overridden, type); - } - - private boolean overrides(Element overrider, Element overridden, TypeElement type) { - return Main.elementUtils.overrides( - (ExecutableElement) overrider, - (ExecutableElement) overridden, - type - ); - } - - @Override - public String genTSInterface() { - superMcClasses.clear(); - Set superClasses = new LinkedHashSet<>(); - Set fields = new LinkedHashSet<>(); - Set methods = new LinkedHashSet<>(); - Set constructors = new LinkedHashSet<>(); - - if (isMinecraftClass(type.getSuperclass())) { - doesDirectExtendMc = true; - mixinInterfaces = new LinkedHashSet<>(); - } - getSuperClasses(superClasses, type); - - for (Element el : type.getEnclosedElements()) { - if (el.getModifiers().contains(Modifier.PUBLIC)) { - switch (el.getKind()) { - case METHOD -> { - if (!isObfuscated(el) && !isObjectMethod(el)) methods.add(el); - } - case FIELD, ENUM_CONSTANT -> fields.add(el); - case CONSTRUCTOR -> constructors.add(el); - } - } - } - - Set methodNames = new LinkedHashSet<>(); - for (Element m : methods) { - if (!m.getModifiers().contains(Modifier.STATIC)) { - methodNames.add(m.getSimpleName()); - } - } - - // add super methods with same name to this class because js extending works a bit different - if (!methodNames.isEmpty()) { - Set superMethods = new LinkedHashSet<>(); - for (TypeElement clz : superClasses) { - outer: - for (Element e : clz.getEnclosedElements()) { - if (e.getKind() != ElementKind.METHOD) continue; - if (e.getModifiers().contains(Modifier.STATIC)) continue; - Name name = e.getSimpleName(); - if (!methodNames.contains(name)) continue; - - // if this class's method overrides the method, continue outer - for (Element m : methods) { - if (!m.getSimpleName().equals(name)) continue; - if (overrides(m, e)) continue outer; - } - - // if the method already added to the set, continue outer - for (Element m : superMethods) { - if (!m.getSimpleName().equals(name)) continue; - if (overrides(m, e)) continue outer; - } - - if (!isObfuscated(e, clz)) superMethods.add(e); - } - } - if (!superMethods.isEmpty()) { - // try to insert methods by name - Set merged = new LinkedHashSet<>(); - Set superMethodNames = new LinkedHashSet<>(); - Name next = null; - for (Element m : superMethods) superMethodNames.add(m.getSimpleName()); - for (Element m : methods) { - if (next != null) { - if (m.getSimpleName().equals(next)) { - merged.add(m); - continue; - } - - for (Element sm : superMethods) { - if (sm.getSimpleName().equals(next)) merged.add(sm); - } - superMethodNames.remove(next); - next = null; - } - - Name name = m.getSimpleName(); - if (superMethodNames.contains(name)) next = name; - merged.add(m); - } - - if (next != null) { - for (Element sm : superMethods) { - if (sm.getSimpleName().equals(next)) merged.add(sm); - } - } - methods = merged; - } - } - - StringBuilder s = new StringBuilder(genComment(type)); - if (!s.isEmpty() && s.charAt(0) == '\n') s.deleteCharAt(0); - - String className = getClassName(true); - String temp; - if (type.getKind().isInterface()) { - s.append("abstract class ").append(className).append(" extends java.lang.Interface {\n") - .append(StringHelpers.tabIn(getClassHeader())); - if (!(temp = genStaticFields(fields)).isEmpty()) s.append("\n").append(StringHelpers.tabIn(temp)); - if (!(temp = genStaticMethods(methods)).isEmpty()) s.append("\n").append(StringHelpers.tabIn(temp)).append("\n"); - s.append("}\ninterface ").append(className).append(buildImplements()).append(" {\n"); - int len = s.length(); - if (!(temp = genFields(fields)).isEmpty()) s.append(StringHelpers.tabIn(temp)); - if (!(temp = genMethods(methods)).isEmpty()) s.append("\n").append(StringHelpers.tabIn(temp)).append("\n"); - if (len == s.length()) s.setLength(len - "\n".length()); - s.append("}"); - } else { - //noinspection SpellCheckingInspection - String constrs = genConstructors(constructors); - String implementS = buildImplements(); - if (!implementS.isEmpty()) s.append("interface ").append(className).append(implementS).append(" {}\n"); - if (constrs.isBlank()) s.append("abstract "); - s.append("class ").append(className).append(buildExtends()).append(" {\n") - .append(StringHelpers.tabIn(getClassHeader())); - if (!(temp = genStaticFields(fields)).isEmpty()) s.append("\n").append(StringHelpers.tabIn(temp)); - int len = s.length(); - if (!(temp = genStaticMethods(methods)).isEmpty()) s.append("\n").append(StringHelpers.tabIn(temp)); - if (!constrs.isBlank()) s.append("\n").append(StringHelpers.tabIn(constrs)); - if (!(temp = genFields(fields)).isEmpty()) { - s.append("\n").append(StringHelpers.tabIn(temp)); - len = s.length(); - } - if (!(temp = genMethods(methods)).isEmpty()) s.append("\n").append(StringHelpers.tabIn(temp)); - if (len != s.length()) s.append("\n"); - s.append("}"); - } - - return s.toString().replaceAll("\n\n\n+", "\n\n"); - } - -} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/EventParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/EventParser.java deleted file mode 100644 index 850e847ea..000000000 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/EventParser.java +++ /dev/null @@ -1,63 +0,0 @@ -package xyz.wagyourtail.doclet.tsdoclet.parsers; - -import xyz.wagyourtail.StringHelpers; - -import javax.lang.model.element.Element; -import javax.lang.model.element.Name; -import javax.lang.model.element.TypeElement; -import java.util.*; - -public class EventParser extends AbstractParser { - protected final String name; - protected final boolean cancellable; - - public EventParser(TypeElement type, String name, boolean cancellable) { - super(type); - this.name = name; - this.isPackage = false; - this.cancellable = cancellable; - } - - public String getName() { - return name; - } - - @Override - public String genTSInterface() { - Set fields = new LinkedHashSet<>(); - Set methods = new LinkedHashSet<>(); - - for (Element el : type.getEnclosedElements()) { - if (checkModifier(el, false)) { - switch (el.getKind()) { - case FIELD, ENUM_CONSTANT -> fields.add(el); - case METHOD -> methods.add(el); - } - } - } - - Map> methodMap = new LinkedHashMap<>(); - for (Element m : methods) { - methodMap.computeIfAbsent(m.getSimpleName(), k -> new HashSet<>()).add(m); - } - - // remove unnecessary object method overrides - // mainly toString(): string; - outer: - for (Map.Entry> ent : methodMap.entrySet()) { - if (!objectMethodNames.contains(ent.getKey())) continue; - for (Element m : ent.getValue()) if (!isObjectMethod(m)) continue outer; - methods.removeAll(ent.getValue()); - } - - StringBuilder s = new StringBuilder("interface ").append(name).append(" extends BaseEvent"); - if (cancellable) s.append(", Cancellable"); - s.append(" {\n").append(StringHelpers.tabIn(genFields(fields))); - String m = genMethods(methods); - if (!m.isEmpty()) s.append("\n").append(StringHelpers.tabIn(m)).append("\n"); - s.append("}"); - - return s.toString().replaceAll("\\{[\n ]+\\}", "{}").replaceAll("\n\n\n+", "\n\n"); - } - -} diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/LibraryParser.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/LibraryParser.java deleted file mode 100644 index b442728ec..000000000 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/tsdoclet/parsers/LibraryParser.java +++ /dev/null @@ -1,47 +0,0 @@ -package xyz.wagyourtail.doclet.tsdoclet.parsers; - -import xyz.wagyourtail.StringHelpers; - -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.TypeElement; -import java.util.LinkedHashSet; -import java.util.Set; - -public class LibraryParser extends AbstractParser { - public final String name; - - public LibraryParser(TypeElement type, String name) { - super(type); - this.name = name; - this.isPackage = false; - } - - @Override - public String genComment(Element comment) { - return super.genComment(comment) + "function "; - } - - @Override - public String genTSInterface() { - String comment = super.genComment(type).trim() - .replaceAll("\n \\* An instance of this class is passed to scripts as the `\\w+` variable\\.", ""); - StringBuilder s = new StringBuilder(comment); - if (!s.isEmpty()) s.append("\n"); - - Set methods = new LinkedHashSet<>(); - - for (Element el : type.getEnclosedElements()) { - if (checkModifier(el, false) && el.getKind() == ElementKind.METHOD) { - methods.add(el); - } - } - - s.append("declare namespace ").append(name).append(" {\n") - .append(StringHelpers.tabIn(genMethods(methods))) - .append("\n}"); - - return s.toString(); - } - -} diff --git a/docs/vitepress/.vitepress/config.mts b/docs/vitepress/.vitepress/config.mts new file mode 100644 index 000000000..a6a3a0366 --- /dev/null +++ b/docs/vitepress/.vitepress/config.mts @@ -0,0 +1,30 @@ +import { defineConfig } from 'vitepress' + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + cleanUrls: true, + srcDir: "2.0.0", + title: "JsMacros", + description: "Minecraft Fabric mod for JavaScript based macros.", + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + nav: [ + { text: 'Home', link: '/' }, + { text: 'Examples', link: '/markdown-examples' } + ], + + sidebar: [ + { + text: 'Examples', + items: [ + { text: 'Markdown Examples', link: '/markdown-examples' }, + { text: 'Runtime API Examples', link: '/api-examples' } + ] + } + ], + + socialLinks: [ + { icon: 'github', link: 'https://github.com/vuejs/vitepress' } + ] + }, +}) diff --git a/docs/vitepress/.vitepress/config.ts b/docs/vitepress/.vitepress/config.ts deleted file mode 100644 index 4e085b382..000000000 --- a/docs/vitepress/.vitepress/config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vitepress'; - -export default defineConfig({ - rewrites: { - cleanUrls: true - }, -}); diff --git a/docs/vitepress/package.json b/docs/vitepress/package.json new file mode 100644 index 000000000..27a279e21 --- /dev/null +++ b/docs/vitepress/package.json @@ -0,0 +1,21 @@ +{ + "name": "@jsmacros/vitepress", + "type": "module", + "version": "1.0.0", + "description": "Generated documentation for JsMacros using VitePress", + "scripts": { + "dev": "vitepress dev", + "build": "vitepress build", + "preview": "vitepress preview" + }, + "keywords": [ + "vitepress", + "jsmacros" + ], + "author": "Jack Manning", + "license": "MPL-2.0", + "packageManager": "pnpm@10.25.0", + "devDependencies": { + "vitepress": "2.0.0-alpha.15" + } +} \ No newline at end of file diff --git a/docs/vitepress/pnpm-lock.yaml b/docs/vitepress/pnpm-lock.yaml new file mode 100644 index 000000000..5183cd048 --- /dev/null +++ b/docs/vitepress/pnpm-lock.yaml @@ -0,0 +1,1837 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + vitepress: + specifier: 2.0.0-alpha.15 + version: 2.0.0-alpha.15(@algolia/client-search@5.46.2)(postcss@8.5.6)(react@19.2.3)(search-insights@2.17.3) + +packages: + + '@ai-sdk/gateway@2.0.24': + resolution: {integrity: sha512-mflk80YF8hj8vrF9e1IHhovGKC1ubX+sY88pesSk3pUiXfH5VPO8dgzNnxjwsqsCZrnkHcztxS5cSl4TzSiEuA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@3.0.20': + resolution: {integrity: sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@2.0.1': + resolution: {integrity: sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==} + engines: {node: '>=18'} + + '@ai-sdk/react@2.0.120': + resolution: {integrity: sha512-x7Oa2LDRURc8uRnAdcEfydbHLSXGYjNaFlQrGuxZAMfqhLJQ+7x4K8Z6O5vnLt414mrPaVvgirfRqsP/nsxtnw==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 + zod: ^3.25.76 || ^4.1.8 + peerDependenciesMeta: + zod: + optional: true + + '@algolia/abtesting@1.12.2': + resolution: {integrity: sha512-oWknd6wpfNrmRcH0vzed3UPX0i17o4kYLM5OMITyMVM2xLgaRbIafoxL0e8mcrNNb0iORCJA0evnNDKRYth5WQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/autocomplete-core@1.19.2': + resolution: {integrity: sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==} + + '@algolia/autocomplete-plugin-algolia-insights@1.19.2': + resolution: {integrity: sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-shared@1.19.2': + resolution: {integrity: sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.46.2': + resolution: {integrity: sha512-oRSUHbylGIuxrlzdPA8FPJuwrLLRavOhAmFGgdAvMcX47XsyM+IOGa9tc7/K5SPvBqn4nhppOCEz7BrzOPWc4A==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.46.2': + resolution: {integrity: sha512-EPBN2Oruw0maWOF4OgGPfioTvd+gmiNwx0HmD9IgmlS+l75DatcBkKOPNJN+0z3wBQWUO5oq602ATxIfmTQ8bA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.46.2': + resolution: {integrity: sha512-Hj8gswSJNKZ0oyd0wWissqyasm+wTz1oIsv5ZmLarzOZAp3vFEda8bpDQ8PUhO+DfkbiLyVnAxsPe4cGzWtqkg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.46.2': + resolution: {integrity: sha512-6dBZko2jt8FmQcHCbmNLB0kCV079Mx/DJcySTL3wirgDBUH7xhY1pOuUTLMiGkqM5D8moVZTvTdRKZUJRkrwBA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.46.2': + resolution: {integrity: sha512-1waE2Uqh/PHNeDXGn/PM/WrmYOBiUGSVxAWqiJIj73jqPqvfzZgzdakHscIVaDl6Cp+j5dwjsZ5LCgaUr6DtmA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.46.2': + resolution: {integrity: sha512-EgOzTZkyDcNL6DV0V/24+oBJ+hKo0wNgyrOX/mePBM9bc9huHxIY2352sXmoZ648JXXY2x//V1kropF/Spx83w==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.46.2': + resolution: {integrity: sha512-ZsOJqu4HOG5BlvIFnMU0YKjQ9ZI6r3C31dg2jk5kMWPSdhJpYL9xa5hEe7aieE+707dXeMI4ej3diy6mXdZpgA==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.46.2': + resolution: {integrity: sha512-1Uw2OslTWiOFDtt83y0bGiErJYy5MizadV0nHnOoHFWMoDqWW0kQoMFI65pXqRSkVvit5zjXSLik2xMiyQJDWQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.46.2': + resolution: {integrity: sha512-xk9f+DPtNcddWN6E7n1hyNNsATBCHIqAvVGG2EAGHJc4AFYL18uM/kMTiOKXE/LKDPyy1JhIerrh9oYb7RBrgw==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.46.2': + resolution: {integrity: sha512-NApbTPj9LxGzNw4dYnZmj2BoXiAc8NmbbH6qBNzQgXklGklt/xldTvu+FACN6ltFsTzoNU6j2mWNlHQTKGC5+Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.46.2': + resolution: {integrity: sha512-ekotpCwpSp033DIIrsTpYlGUCF6momkgupRV/FA3m62SreTSZUKjgK6VTNyG7TtYfq9YFm/pnh65bATP/ZWJEg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.46.2': + resolution: {integrity: sha512-gKE+ZFi/6y7saTr34wS0SqYFDcjHW4Wminv8PDZEi0/mE99+hSrbKgJWxo2ztb5eqGirQTgIh1AMVacGGWM1iw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.46.2': + resolution: {integrity: sha512-ciPihkletp7ttweJ8Zt+GukSVLp2ANJHU+9ttiSxsJZThXc4Y2yJ8HGVWesW5jN1zrsZsezN71KrMx/iZsOYpg==} + engines: {node: '>= 14.0.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@docsearch/core@4.4.0': + resolution: {integrity: sha512-kiwNo5KEndOnrf5Kq/e5+D9NBMCFgNsDoRpKQJ9o/xnSlheh6b8AXppMuuUVVdAUIhIfQFk/07VLjjk/fYyKmw==} + peerDependencies: + '@types/react': '>= 16.8.0 < 20.0.0' + react: '>= 16.8.0 < 20.0.0' + react-dom: '>= 16.8.0 < 20.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + + '@docsearch/css@4.4.0': + resolution: {integrity: sha512-e9vPgtih6fkawakmYo0Y6V4BKBmDV7Ykudn7ADWXUs5b6pmtBRwDbpSG/WiaUG63G28OkJDEnsMvgIAnZgGwYw==} + + '@docsearch/js@4.4.0': + resolution: {integrity: sha512-vCiKzjYD54bugUIMZA6YzuLDilkD3TNH/kfbvqsnzxiLTMu8F13psD+hdMSEOn7j+dFJOaf49fZ+gwr+rXctMw==} + + '@docsearch/react@4.4.0': + resolution: {integrity: sha512-z12zeg1mV7WD4Ag4pKSuGukETJLaucVFwszDXL/qLaEgRqxEaVacO9SR1qqnCXvZztlvz2rt7cMqryi/7sKfjA==} + peerDependencies: + '@types/react': '>= 16.8.0 < 20.0.0' + react: '>= 16.8.0 < 20.0.0' + react-dom: '>= 16.8.0 < 20.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@iconify-json/simple-icons@1.2.65': + resolution: {integrity: sha512-v/O0UeqrDz6ASuRVE5g2Puo5aWyej4M/CxX6WYDBARgswwxK0mp3VQbGgPFEAAUU9QN02IjTgjMuO021gpWf2w==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + + '@rollup/rollup-android-arm-eabi@4.55.1': + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.55.1': + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.55.1': + resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.55.1': + resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.55.1': + resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.55.1': + resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.55.1': + resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.55.1': + resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.55.1': + resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.55.1': + resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.55.1': + resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.55.1': + resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.55.1': + resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.55.1': + resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.55.1': + resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + cpu: [x64] + os: [win32] + + '@shikijs/core@3.20.0': + resolution: {integrity: sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==} + + '@shikijs/engine-javascript@3.20.0': + resolution: {integrity: sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg==} + + '@shikijs/engine-oniguruma@3.20.0': + resolution: {integrity: sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==} + + '@shikijs/langs@3.20.0': + resolution: {integrity: sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==} + + '@shikijs/themes@3.20.0': + resolution: {integrity: sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==} + + '@shikijs/transformers@3.20.0': + resolution: {integrity: sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g==} + + '@shikijs/types@3.20.0': + resolution: {integrity: sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vercel/oidc@3.0.5': + resolution: {integrity: sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==} + engines: {node: '>= 20'} + + '@vitejs/plugin-vue@6.0.3': + resolution: {integrity: sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.26': + resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==} + + '@vue/compiler-dom@3.5.26': + resolution: {integrity: sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==} + + '@vue/compiler-sfc@3.5.26': + resolution: {integrity: sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==} + + '@vue/compiler-ssr@3.5.26': + resolution: {integrity: sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==} + + '@vue/devtools-api@8.0.5': + resolution: {integrity: sha512-DgVcW8H/Nral7LgZEecYFFYXnAvGuN9C3L3DtWekAncFBedBczpNW8iHKExfaM559Zm8wQWrwtYZ9lXthEHtDw==} + + '@vue/devtools-kit@8.0.5': + resolution: {integrity: sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==} + + '@vue/devtools-shared@8.0.5': + resolution: {integrity: sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==} + + '@vue/reactivity@3.5.26': + resolution: {integrity: sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==} + + '@vue/runtime-core@3.5.26': + resolution: {integrity: sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==} + + '@vue/runtime-dom@3.5.26': + resolution: {integrity: sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==} + + '@vue/server-renderer@3.5.26': + resolution: {integrity: sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==} + peerDependencies: + vue: 3.5.26 + + '@vue/shared@3.5.26': + resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==} + + '@vueuse/core@14.1.0': + resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/integrations@14.1.0': + resolution: {integrity: sha512-eNQPdisnO9SvdydTIXnTE7c29yOsJBD/xkwEyQLdhDC/LKbqrFpXHb3uS//7NcIrQO3fWVuvMGp8dbK6mNEMCA==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 || ^8 + vue: ^3.5.0 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@14.1.0': + resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} + + '@vueuse/shared@14.1.0': + resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} + peerDependencies: + vue: ^3.5.0 + + ai@5.0.118: + resolution: {integrity: sha512-sKJHfhJkvAyq5NC3yJJ4R8Z3tn4pSHF760/jInKAtmLwPLWTHfGo293DSO4un8QUAgJOagHd09VSXOXv+STMNQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + algoliasearch@5.46.2: + resolution: {integrity: sha512-qqAXW9QvKf2tTyhpDA4qXv1IfBwD2eduSW6tUEBFIfCeE9gn9HQ9I5+MaKoenRuHrzk5sQoNh1/iof8mY7uD6Q==} + engines: {node: '>= 14.0.0'} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + entities@7.0.0: + resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==} + engines: {node: '>=0.12'} + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + focus-trap@7.7.1: + resolution: {integrity: sha512-Pkp8m55GjxBLnhBoT6OXdMvfRr4TjMAKLvFM566zlIryq5plbhaTmLAJWTGR0EkRwLjEte1lCOG9MxF1ipJrOg==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + htm@3.1.1: + resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.55.1: + resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + + shiki@3.20.0: + resolution: {integrity: sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + swr@2.3.8: + resolution: {integrity: sha512-gaCPRVoMq8WGDcWj9p4YWzCMPHzE0WNl6W8ADIx9c3JBEIdMkJGMzW+uzXvxHMltwcYACr9jP+32H8/hgwMR7w==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@7.3.0: + resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitepress@2.0.0-alpha.15: + resolution: {integrity: sha512-jhjSYd10Z6RZiKOa7jy0xMVf5NB5oSc/lS3bD/QoUc6V8PrvQR5JhC9104NEt6+oTGY/ftieVWxY9v7YI+1IjA==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + oxc-minify: '*' + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + oxc-minify: + optional: true + postcss: + optional: true + + vue@3.5.26: + resolution: {integrity: sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + zod@4.3.5: + resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@ai-sdk/gateway@2.0.24(zod@4.3.5)': + dependencies: + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@4.3.5) + '@vercel/oidc': 3.0.5 + zod: 4.3.5 + + '@ai-sdk/provider-utils@3.0.20(zod@4.3.5)': + dependencies: + '@ai-sdk/provider': 2.0.1 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 4.3.5 + + '@ai-sdk/provider@2.0.1': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@2.0.120(react@19.2.3)(zod@4.3.5)': + dependencies: + '@ai-sdk/provider-utils': 3.0.20(zod@4.3.5) + ai: 5.0.118(zod@4.3.5) + react: 19.2.3 + swr: 2.3.8(react@19.2.3) + throttleit: 2.1.0 + optionalDependencies: + zod: 4.3.5 + + '@algolia/abtesting@1.12.2': + dependencies: + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 + + '@algolia/autocomplete-core@1.19.2(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.19.2(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.46.2)(algoliasearch@5.46.2) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.19.2(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.46.2)(algoliasearch@5.46.2) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-shared@1.19.2(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)': + dependencies: + '@algolia/client-search': 5.46.2 + algoliasearch: 5.46.2 + + '@algolia/client-abtesting@5.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 + + '@algolia/client-analytics@5.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 + + '@algolia/client-common@5.46.2': {} + + '@algolia/client-insights@5.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 + + '@algolia/client-personalization@5.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 + + '@algolia/client-query-suggestions@5.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 + + '@algolia/client-search@5.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 + + '@algolia/ingestion@1.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 + + '@algolia/monitoring@1.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 + + '@algolia/recommend@5.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 + + '@algolia/requester-browser-xhr@5.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + + '@algolia/requester-fetch@5.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + + '@algolia/requester-node-http@5.46.2': + dependencies: + '@algolia/client-common': 5.46.2 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@docsearch/core@4.4.0(react@19.2.3)': + optionalDependencies: + react: 19.2.3 + + '@docsearch/css@4.4.0': {} + + '@docsearch/js@4.4.0(@algolia/client-search@5.46.2)(react@19.2.3)(search-insights@2.17.3)': + dependencies: + '@docsearch/react': 4.4.0(@algolia/client-search@5.46.2)(react@19.2.3)(search-insights@2.17.3) + htm: 3.1.1 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + + '@docsearch/react@4.4.0(@algolia/client-search@5.46.2)(react@19.2.3)(search-insights@2.17.3)': + dependencies: + '@ai-sdk/react': 2.0.120(react@19.2.3)(zod@4.3.5) + '@algolia/autocomplete-core': 1.19.2(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)(search-insights@2.17.3) + '@docsearch/core': 4.4.0(react@19.2.3) + '@docsearch/css': 4.4.0 + ai: 5.0.118(zod@4.3.5) + algoliasearch: 5.46.2 + marked: 16.4.2 + zod: 4.3.5 + optionalDependencies: + react: 19.2.3 + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + + '@esbuild/aix-ppc64@0.27.2': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@iconify-json/simple-icons@1.2.65': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@opentelemetry/api@1.9.0': {} + + '@rolldown/pluginutils@1.0.0-beta.53': {} + + '@rollup/rollup-android-arm-eabi@4.55.1': + optional: true + + '@rollup/rollup-android-arm64@4.55.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.55.1': + optional: true + + '@rollup/rollup-darwin-x64@4.55.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.55.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.55.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.55.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.55.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.55.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.55.1': + optional: true + + '@shikijs/core@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + + '@shikijs/engine-oniguruma@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + + '@shikijs/themes@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + + '@shikijs/transformers@3.20.0': + dependencies: + '@shikijs/core': 3.20.0 + '@shikijs/types': 3.20.0 + + '@shikijs/types@3.20.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@standard-schema/spec@1.1.0': {} + + '@types/estree@1.0.8': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.21': {} + + '@ungap/structured-clone@1.3.0': {} + + '@vercel/oidc@3.0.5': {} + + '@vitejs/plugin-vue@6.0.3(vite@7.3.0)(vue@3.5.26)': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.53 + vite: 7.3.0 + vue: 3.5.26 + + '@vue/compiler-core@3.5.26': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.26 + entities: 7.0.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.26': + dependencies: + '@vue/compiler-core': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/compiler-sfc@3.5.26': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.26 + '@vue/compiler-dom': 3.5.26 + '@vue/compiler-ssr': 3.5.26 + '@vue/shared': 3.5.26 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.26': + dependencies: + '@vue/compiler-dom': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/devtools-api@8.0.5': + dependencies: + '@vue/devtools-kit': 8.0.5 + + '@vue/devtools-kit@8.0.5': + dependencies: + '@vue/devtools-shared': 8.0.5 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 2.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@8.0.5': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.26': + dependencies: + '@vue/shared': 3.5.26 + + '@vue/runtime-core@3.5.26': + dependencies: + '@vue/reactivity': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/runtime-dom@3.5.26': + dependencies: + '@vue/reactivity': 3.5.26 + '@vue/runtime-core': 3.5.26 + '@vue/shared': 3.5.26 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.26(vue@3.5.26)': + dependencies: + '@vue/compiler-ssr': 3.5.26 + '@vue/shared': 3.5.26 + vue: 3.5.26 + + '@vue/shared@3.5.26': {} + + '@vueuse/core@14.1.0(vue@3.5.26)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.1.0 + '@vueuse/shared': 14.1.0(vue@3.5.26) + vue: 3.5.26 + + '@vueuse/integrations@14.1.0(focus-trap@7.7.1)(vue@3.5.26)': + dependencies: + '@vueuse/core': 14.1.0(vue@3.5.26) + '@vueuse/shared': 14.1.0(vue@3.5.26) + vue: 3.5.26 + optionalDependencies: + focus-trap: 7.7.1 + + '@vueuse/metadata@14.1.0': {} + + '@vueuse/shared@14.1.0(vue@3.5.26)': + dependencies: + vue: 3.5.26 + + ai@5.0.118(zod@4.3.5): + dependencies: + '@ai-sdk/gateway': 2.0.24(zod@4.3.5) + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@4.3.5) + '@opentelemetry/api': 1.9.0 + zod: 4.3.5 + + algoliasearch@5.46.2: + dependencies: + '@algolia/abtesting': 1.12.2 + '@algolia/client-abtesting': 5.46.2 + '@algolia/client-analytics': 5.46.2 + '@algolia/client-common': 5.46.2 + '@algolia/client-insights': 5.46.2 + '@algolia/client-personalization': 5.46.2 + '@algolia/client-query-suggestions': 5.46.2 + '@algolia/client-search': 5.46.2 + '@algolia/ingestion': 1.46.2 + '@algolia/monitoring': 1.46.2 + '@algolia/recommend': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 + + birpc@2.9.0: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + comma-separated-tokens@2.0.3: {} + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + csstype@3.2.3: {} + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + entities@7.0.0: {} + + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + + estree-walker@2.0.2: {} + + eventsource-parser@3.0.6: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + focus-trap@7.7.1: + dependencies: + tabbable: 6.4.0 + + fsevents@2.3.3: + optional: true + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hookable@5.5.3: {} + + htm@3.1.1: {} + + html-void-elements@3.0.0: {} + + is-what@5.5.0: {} + + json-schema@0.4.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mark.js@8.11.1: {} + + marked@16.4.2: {} + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + minisearch@7.2.0: {} + + mitt@3.0.1: {} + + nanoid@3.3.11: {} + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.4: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 + + perfect-debounce@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + property-information@7.1.0: {} + + react@19.2.3: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rfdc@1.4.1: {} + + rollup@4.55.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.55.1 + '@rollup/rollup-android-arm64': 4.55.1 + '@rollup/rollup-darwin-arm64': 4.55.1 + '@rollup/rollup-darwin-x64': 4.55.1 + '@rollup/rollup-freebsd-arm64': 4.55.1 + '@rollup/rollup-freebsd-x64': 4.55.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 + '@rollup/rollup-linux-arm-musleabihf': 4.55.1 + '@rollup/rollup-linux-arm64-gnu': 4.55.1 + '@rollup/rollup-linux-arm64-musl': 4.55.1 + '@rollup/rollup-linux-loong64-gnu': 4.55.1 + '@rollup/rollup-linux-loong64-musl': 4.55.1 + '@rollup/rollup-linux-ppc64-gnu': 4.55.1 + '@rollup/rollup-linux-ppc64-musl': 4.55.1 + '@rollup/rollup-linux-riscv64-gnu': 4.55.1 + '@rollup/rollup-linux-riscv64-musl': 4.55.1 + '@rollup/rollup-linux-s390x-gnu': 4.55.1 + '@rollup/rollup-linux-x64-gnu': 4.55.1 + '@rollup/rollup-linux-x64-musl': 4.55.1 + '@rollup/rollup-openbsd-x64': 4.55.1 + '@rollup/rollup-openharmony-arm64': 4.55.1 + '@rollup/rollup-win32-arm64-msvc': 4.55.1 + '@rollup/rollup-win32-ia32-msvc': 4.55.1 + '@rollup/rollup-win32-x64-gnu': 4.55.1 + '@rollup/rollup-win32-x64-msvc': 4.55.1 + fsevents: 2.3.3 + + search-insights@2.17.3: {} + + shiki@3.20.0: + dependencies: + '@shikijs/core': 3.20.0 + '@shikijs/engine-javascript': 3.20.0 + '@shikijs/engine-oniguruma': 3.20.0 + '@shikijs/langs': 3.20.0 + '@shikijs/themes': 3.20.0 + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + + speakingurl@14.0.1: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + + swr@2.3.8(react@19.2.3): + dependencies: + dequal: 2.0.3 + react: 19.2.3 + use-sync-external-store: 1.6.0(react@19.2.3) + + tabbable@6.4.0: {} + + throttleit@2.1.0: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + trim-lines@3.0.1: {} + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + use-sync-external-store@1.6.0(react@19.2.3): + dependencies: + react: 19.2.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@7.3.0: + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.55.1 + tinyglobby: 0.2.15 + optionalDependencies: + fsevents: 2.3.3 + + vitepress@2.0.0-alpha.15(@algolia/client-search@5.46.2)(postcss@8.5.6)(react@19.2.3)(search-insights@2.17.3): + dependencies: + '@docsearch/css': 4.4.0 + '@docsearch/js': 4.4.0(@algolia/client-search@5.46.2)(react@19.2.3)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.65 + '@shikijs/core': 3.20.0 + '@shikijs/transformers': 3.20.0 + '@shikijs/types': 3.20.0 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 6.0.3(vite@7.3.0)(vue@3.5.26) + '@vue/devtools-api': 8.0.5 + '@vue/shared': 3.5.26 + '@vueuse/core': 14.1.0(vue@3.5.26) + '@vueuse/integrations': 14.1.0(focus-trap@7.7.1)(vue@3.5.26) + focus-trap: 7.7.1 + mark.js: 8.11.1 + minisearch: 7.2.0 + shiki: 3.20.0 + vite: 7.3.0 + vue: 3.5.26 + optionalDependencies: + postcss: 8.5.6 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jiti + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - tsx + - typescript + - universal-cookie + - yaml + + vue@3.5.26: + dependencies: + '@vue/compiler-dom': 3.5.26 + '@vue/compiler-sfc': 3.5.26 + '@vue/runtime-dom': 3.5.26 + '@vue/server-renderer': 3.5.26(vue@3.5.26) + '@vue/shared': 3.5.26 + + zod@4.3.5: {} + + zwitch@2.0.4: {} diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts index f680ef34b..956412700 100644 --- a/stonecutter.gradle.kts +++ b/stonecutter.gradle.kts @@ -140,7 +140,7 @@ gradle.projectsEvaluated { source(documentationSources) classpath = documentationClasspath destinationDir = File(docsBuildDir, "python/JsMacrosAC") - options.doclet = "xyz.wagyourtail.doclet.pydoclet.Main" + options.doclet = "xyz.wagyourtail.doclet.core.pydoclet.Main" options.docletpath = mutableListOf(docletJarFile) (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) } @@ -159,7 +159,7 @@ gradle.projectsEvaluated { source(documentationSources) classpath = documentationClasspath destinationDir = File(docsBuildDir, "typescript/headers") - options.doclet = "xyz.wagyourtail.doclet.tsdoclet.Main" + options.doclet = "xyz.wagyourtail.doclet.core.tsdoclet.Main" options.docletpath = mutableListOf(docletJarFile) (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) } @@ -178,7 +178,7 @@ gradle.projectsEvaluated { source(documentationSources) classpath = documentationClasspath destinationDir = File(docsBuildDir, "web") - options.doclet = "xyz.wagyourtail.doclet.webdoclet.Main" + options.doclet = "xyz.wagyourtail.doclet.core.webdoclet.Main" options.docletpath = mutableListOf(docletJarFile) (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) (options as CoreJavadocOptions).addStringOption("mcv", mcVersion) @@ -207,7 +207,7 @@ gradle.projectsEvaluated { source(documentationSources) classpath = documentationClasspath destinationDir = File(docsBuildDir, "vitepress") - options.doclet = "xyz.wagyourtail.doclet.mddoclet.Main" + options.doclet = "xyz.wagyourtail.doclet.core.mddoclet.Main" options.docletpath = mutableListOf(docletJarFile) (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) (options as CoreJavadocOptions).addStringOption("mcv", mcVersion) @@ -225,7 +225,7 @@ gradle.projectsEvaluated { from(rootProject.file("docs/vitepress")) into(File(docsBuildDir, "vitepress")) inputs.property("version", project.version.toString()) - filesMatching("index.html") { + filesMatching("index.md") { expand(mapOf("version" to project.version.toString())) } } From d29536bc8e315284cb8900ba0b480e1124eed6f9 Mon Sep 17 00:00:00 2001 From: Jack Manning Date: Fri, 9 Jan 2026 16:40:33 -0500 Subject: [PATCH 05/16] Add DocletCategory --- .../xyz/wagyourtail/doclet/DocletCategory.java | 17 +++++++++++++++++ .../xyz/wagyourtail/doclet/DocletCategory.java | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 buildSrc/src/main/java/xyz/wagyourtail/doclet/DocletCategory.java create mode 100644 common/src/main/java/xyz/wagyourtail/doclet/DocletCategory.java diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/DocletCategory.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/DocletCategory.java new file mode 100644 index 000000000..439518c63 --- /dev/null +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/DocletCategory.java @@ -0,0 +1,17 @@ +package xyz.wagyourtail.doclet; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Documented +@Retention(RetentionPolicy.SOURCE) +@Target(ElementType.TYPE) +public @interface DocletCategory { + /** + * The category name used for organizing classes or events. + */ + String value(); +} diff --git a/common/src/main/java/xyz/wagyourtail/doclet/DocletCategory.java b/common/src/main/java/xyz/wagyourtail/doclet/DocletCategory.java new file mode 100644 index 000000000..051628399 --- /dev/null +++ b/common/src/main/java/xyz/wagyourtail/doclet/DocletCategory.java @@ -0,0 +1,17 @@ +package xyz.wagyourtail.doclet; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Documented +@Retention(RetentionPolicy.SOURCE) +@Target(ElementType.TYPE) +public @interface DocletCategory { + /** + * Category used for grouping doclet-generated pages. + */ + String value(); +} From 010ea5857414f5721b14acea1cd14d1474511742 Mon Sep 17 00:00:00 2001 From: Jack Manning Date: Fri, 9 Jan 2026 16:40:52 -0500 Subject: [PATCH 06/16] Add DocletCategory to all Entity Helpers --- .../api/helper/world/entity/ClientPlayerEntityHelper.java | 2 ++ .../jsmacros/client/api/helper/world/entity/EntityHelper.java | 2 ++ .../client/api/helper/world/entity/ItemEntityHelper.java | 2 ++ .../client/api/helper/world/entity/LivingEntityHelper.java | 2 ++ .../client/api/helper/world/entity/MerchantEntityHelper.java | 2 ++ .../client/api/helper/world/entity/MobEntityHelper.java | 2 ++ .../client/api/helper/world/entity/PlayerAbilitiesHelper.java | 1 + .../client/api/helper/world/entity/PlayerEntityHelper.java | 2 ++ .../client/api/helper/world/entity/TradeOfferHelper.java | 1 + .../client/api/helper/world/entity/VillagerEntityHelper.java | 2 ++ .../world/entity/specialized/boss/EnderDragonEntityHelper.java | 2 ++ .../world/entity/specialized/boss/WitherEntityHelper.java | 2 ++ .../entity/specialized/decoration/ArmorStandEntityHelper.java | 2 ++ .../entity/specialized/decoration/EndCrystalEntityHelper.java | 2 ++ .../entity/specialized/decoration/ItemFrameEntityHelper.java | 2 ++ .../entity/specialized/decoration/PaintingEntityHelper.java | 2 ++ .../entity/specialized/display/BlockDisplayEntityHelper.java | 2 ++ .../world/entity/specialized/display/DisplayEntityHelper.java | 2 ++ .../entity/specialized/display/ItemDisplayEntityHelper.java | 2 ++ .../entity/specialized/display/TextDisplayEntityHelper.java | 2 ++ .../entity/specialized/mob/AbstractPiglinEntityHelper.java | 2 ++ .../helper/world/entity/specialized/mob/BlazeEntityHelper.java | 2 ++ .../world/entity/specialized/mob/CreeperEntityHelper.java | 2 ++ .../world/entity/specialized/mob/DrownedEntityHelper.java | 2 ++ .../world/entity/specialized/mob/EndermanEntityHelper.java | 2 ++ .../helper/world/entity/specialized/mob/GhastEntityHelper.java | 2 ++ .../world/entity/specialized/mob/GuardianEntityHelper.java | 2 ++ .../world/entity/specialized/mob/IllagerEntityHelper.java | 2 ++ .../world/entity/specialized/mob/PhantomEntityHelper.java | 2 ++ .../helper/world/entity/specialized/mob/PiglinEntityHelper.java | 2 ++ .../world/entity/specialized/mob/PillagerEntityHelper.java | 2 ++ .../world/entity/specialized/mob/ShulkerEntityHelper.java | 2 ++ .../helper/world/entity/specialized/mob/SlimeEntityHelper.java | 2 ++ .../entity/specialized/mob/SpellcastingIllagerEntityHelper.java | 2 ++ .../helper/world/entity/specialized/mob/SpiderEntityHelper.java | 2 ++ .../helper/world/entity/specialized/mob/VexEntityHelper.java | 2 ++ .../world/entity/specialized/mob/VindicatorEntityHelper.java | 2 ++ .../helper/world/entity/specialized/mob/WardenEntityHelper.java | 2 ++ .../helper/world/entity/specialized/mob/WitchEntityHelper.java | 2 ++ .../helper/world/entity/specialized/mob/ZombieEntityHelper.java | 2 ++ .../entity/specialized/mob/ZombieVillagerEntityHelper.java | 2 ++ .../entity/specialized/other/AreaEffectCloudEntityHelper.java | 2 ++ .../entity/specialized/other/FallingBlockEntityHelper.java | 2 ++ .../world/entity/specialized/other/InteractionEntityHelper.java | 2 ++ .../helper/world/entity/specialized/other/TntEntityHelper.java | 2 ++ .../entity/specialized/passive/AbstractHorseEntityHelper.java | 2 ++ .../world/entity/specialized/passive/AllayEntityHelper.java | 2 ++ .../world/entity/specialized/passive/AnimalEntityHelper.java | 2 ++ .../world/entity/specialized/passive/AxolotlEntityHelper.java | 2 ++ .../world/entity/specialized/passive/BatEntityHelper.java | 2 ++ .../world/entity/specialized/passive/BeeEntityHelper.java | 2 ++ .../world/entity/specialized/passive/CatEntityHelper.java | 2 ++ .../world/entity/specialized/passive/DolphinEntityHelper.java | 2 ++ .../world/entity/specialized/passive/DonkeyEntityHelper.java | 2 ++ .../world/entity/specialized/passive/FishEntityHelper.java | 2 ++ .../world/entity/specialized/passive/FoxEntityHelper.java | 2 ++ .../world/entity/specialized/passive/FrogEntityHelper.java | 2 ++ .../world/entity/specialized/passive/GoatEntityHelper.java | 2 ++ .../world/entity/specialized/passive/HorseEntityHelper.java | 2 ++ .../world/entity/specialized/passive/IronGolemEntityHelper.java | 2 ++ .../world/entity/specialized/passive/LlamaEntityHelper.java | 2 ++ .../world/entity/specialized/passive/MooshroomEntityHelper.java | 2 ++ .../world/entity/specialized/passive/OcelotEntityHelper.java | 2 ++ .../world/entity/specialized/passive/PandaEntityHelper.java | 2 ++ .../world/entity/specialized/passive/ParrotEntityHelper.java | 2 ++ .../world/entity/specialized/passive/PigEntityHelper.java | 2 ++ .../world/entity/specialized/passive/PolarBearEntityHelper.java | 2 ++ .../entity/specialized/passive/PufferfishEntityHelper.java | 2 ++ .../world/entity/specialized/passive/RabbitEntityHelper.java | 2 ++ .../world/entity/specialized/passive/SheepEntityHelper.java | 2 ++ .../world/entity/specialized/passive/SnowGolemEntityHelper.java | 2 ++ .../world/entity/specialized/passive/StriderEntityHelper.java | 2 ++ .../world/entity/specialized/passive/TameableEntityHelper.java | 2 ++ .../entity/specialized/passive/TropicalFishEntityHelper.java | 2 ++ .../world/entity/specialized/passive/WolfEntityHelper.java | 2 ++ .../world/entity/specialized/projectile/ArrowEntityHelper.java | 2 ++ .../specialized/projectile/FishingBobberEntityHelper.java | 2 ++ .../entity/specialized/projectile/TridentEntityHelper.java | 2 ++ .../entity/specialized/projectile/WitherSkullEntityHelper.java | 2 ++ .../world/entity/specialized/vehicle/BoatEntityHelper.java | 2 ++ .../entity/specialized/vehicle/FurnaceMinecartEntityHelper.java | 2 ++ .../entity/specialized/vehicle/TntMinecartEntityHelper.java | 2 ++ 82 files changed, 162 insertions(+) diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/ClientPlayerEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/ClientPlayerEntityHelper.java index 240ec217e..ae0e43f4b 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/ClientPlayerEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/ClientPlayerEntityHelper.java @@ -26,6 +26,7 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.api.math.Pos3D; @@ -50,6 +51,7 @@ * @see PlayerEntityHelper * @since 1.0.3 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class ClientPlayerEntityHelper extends PlayerEntityHelper { protected final Minecraft mc = Minecraft.getInstance(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/EntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/EntityHelper.java index e7c147e87..f42447b9e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/EntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/EntityHelper.java @@ -49,6 +49,7 @@ import net.minecraft.world.phys.HitResult; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.doclet.DocletReplaceTypeParams; @@ -92,6 +93,7 @@ /** * @author Wagyourtail */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class EntityHelper extends BaseHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/ItemEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/ItemEntityHelper.java index 89ba28b7d..cebef8d0b 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/ItemEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/ItemEntityHelper.java @@ -1,8 +1,10 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity; import net.minecraft.world.entity.item.ItemEntity; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class ItemEntityHelper extends EntityHelper { public ItemEntityHelper(ItemEntity e) { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/LivingEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/LivingEntityHelper.java index af1519832..45aa65ff7 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/LivingEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/LivingEntityHelper.java @@ -17,6 +17,7 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.classes.RegistryHelper; @@ -27,6 +28,7 @@ import java.util.List; import java.util.function.Function; +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class LivingEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/MerchantEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/MerchantEntityHelper.java index 686159714..eb2caac75 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/MerchantEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/MerchantEntityHelper.java @@ -2,11 +2,13 @@ import net.minecraft.world.entity.npc.AbstractVillager; import net.minecraft.world.item.trading.MerchantOffer; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.access.IMerchantEntity; import java.util.ArrayList; import java.util.List; +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class MerchantEntityHelper extends LivingEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/MobEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/MobEntityHelper.java index 33cf67762..690e79d18 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/MobEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/MobEntityHelper.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity; import net.minecraft.world.entity.Mob; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class MobEntityHelper extends LivingEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/PlayerAbilitiesHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/PlayerAbilitiesHelper.java index 9e08c9f6b..b1aada6cf 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/PlayerAbilitiesHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/PlayerAbilitiesHelper.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity; import net.minecraft.world.entity.player.Abilities; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.core.helpers.BaseHelper; /** diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/PlayerEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/PlayerEntityHelper.java index 19eb5b789..e3cb53028 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/PlayerEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/PlayerEntityHelper.java @@ -2,12 +2,14 @@ import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.projectile.FishingBobberEntityHelper; /** * @author Wagyourtail */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class PlayerEntityHelper extends LivingEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/TradeOfferHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/TradeOfferHelper.java index fcecc2915..9d4662827 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/TradeOfferHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/TradeOfferHelper.java @@ -3,6 +3,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.trading.MerchantOffer; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.classes.RegistryHelper; import xyz.wagyourtail.jsmacros.client.api.classes.inventory.VillagerInventory; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/VillagerEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/VillagerEntityHelper.java index f302957bc..b6184efe1 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/VillagerEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/VillagerEntityHelper.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity; import net.minecraft.world.entity.npc.Villager; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; /** * @since 1.6.3 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class VillagerEntityHelper extends MerchantEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/boss/EnderDragonEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/boss/EnderDragonEntityHelper.java index 304ca0997..f8bdb9e61 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/boss/EnderDragonEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/boss/EnderDragonEntityHelper.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.boss; import net.minecraft.world.entity.boss.enderdragon.EnderDragon; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; @@ -15,6 +16,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class EnderDragonEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/boss/WitherEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/boss/WitherEntityHelper.java index 920a00e55..45b263a08 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/boss/WitherEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/boss/WitherEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.boss; import net.minecraft.world.entity.boss.wither.WitherBoss; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class WitherEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/ArmorStandEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/ArmorStandEntityHelper.java index 0b599db85..16729bb16 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/ArmorStandEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/ArmorStandEntityHelper.java @@ -2,12 +2,14 @@ import net.minecraft.core.Rotations; import net.minecraft.world.entity.decoration.ArmorStand; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.LivingEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class ArmorStandEntityHelper extends LivingEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/EndCrystalEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/EndCrystalEntityHelper.java index f50a922a3..f163a9a6e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/EndCrystalEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/EndCrystalEntityHelper.java @@ -2,6 +2,7 @@ import net.minecraft.world.entity.boss.enderdragon.EndCrystal; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockPosHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; @@ -9,6 +10,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class EndCrystalEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/ItemFrameEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/ItemFrameEntityHelper.java index e9812a5e3..c595536c3 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/ItemFrameEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/ItemFrameEntityHelper.java @@ -2,6 +2,7 @@ import net.minecraft.world.entity.decoration.GlowItemFrame; import net.minecraft.world.entity.decoration.ItemFrame; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; @@ -9,6 +10,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class ItemFrameEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/PaintingEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/PaintingEntityHelper.java index 2520e8db2..418a59687 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/PaintingEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/decoration/PaintingEntityHelper.java @@ -2,6 +2,7 @@ import net.minecraft.world.entity.decoration.Painting; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; @@ -9,6 +10,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class PaintingEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/BlockDisplayEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/BlockDisplayEntityHelper.java index e80d2c7e8..6fe727b52 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/BlockDisplayEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/BlockDisplayEntityHelper.java @@ -2,12 +2,14 @@ import net.minecraft.world.entity.Display; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockStateHelper; /** * @author aMelonRind * @since 1.9.1 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class BlockDisplayEntityHelper extends DisplayEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/DisplayEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/DisplayEntityHelper.java index 10fc3f4c2..d4d971e7b 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/DisplayEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/DisplayEntityHelper.java @@ -3,6 +3,7 @@ import net.minecraft.util.Brightness; import net.minecraft.world.entity.Display; import net.minecraft.world.phys.AABB; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.api.math.Vec3D; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinDisplayEntity; @@ -11,6 +12,7 @@ * @author aMelonRind * @since 1.9.1 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class DisplayEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/ItemDisplayEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/ItemDisplayEntityHelper.java index ece7ecc8c..319840922 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/ItemDisplayEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/ItemDisplayEntityHelper.java @@ -2,12 +2,14 @@ import net.minecraft.world.entity.Display; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; /** * @author aMelonRind * @since 1.9.1 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class ItemDisplayEntityHelper extends DisplayEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/TextDisplayEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/TextDisplayEntityHelper.java index 45fe0d8bd..7d2a80a2f 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/TextDisplayEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/display/TextDisplayEntityHelper.java @@ -2,6 +2,7 @@ import net.minecraft.world.entity.Display; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.TextHelper; import xyz.wagyourtail.jsmacros.core.helpers.BaseHelper; @@ -9,6 +10,7 @@ * @author aMelonRind * @since 1.9.1 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class TextDisplayEntityHelper extends DisplayEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/AbstractPiglinEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/AbstractPiglinEntityHelper.java index 6e9d5e61b..acc5852f4 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/AbstractPiglinEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/AbstractPiglinEntityHelper.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.piglin.AbstractPiglin; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinAbstractPiglinEntity; @@ -8,6 +9,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class AbstractPiglinEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/BlazeEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/BlazeEntityHelper.java index 7cebd688c..04727e919 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/BlazeEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/BlazeEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.Blaze; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class BlazeEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/CreeperEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/CreeperEntityHelper.java index 501670ef8..e2d7f9392 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/CreeperEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/CreeperEntityHelper.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.Creeper; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinCreeperEntity; @@ -8,6 +9,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class CreeperEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/DrownedEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/DrownedEntityHelper.java index 9fd2f5e5d..4e3845799 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/DrownedEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/DrownedEntityHelper.java @@ -2,11 +2,13 @@ import net.minecraft.world.entity.monster.Drowned; import net.minecraft.world.item.Items; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class DrownedEntityHelper extends ZombieEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/EndermanEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/EndermanEntityHelper.java index c3c3baa62..72a2faf5c 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/EndermanEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/EndermanEntityHelper.java @@ -2,6 +2,7 @@ import net.minecraft.world.entity.monster.EnderMan; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockStateHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; @@ -9,6 +10,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class EndermanEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/GhastEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/GhastEntityHelper.java index 4d4a39425..4b3126248 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/GhastEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/GhastEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.Ghast; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class GhastEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/GuardianEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/GuardianEntityHelper.java index 067c71cff..34e74a507 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/GuardianEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/GuardianEntityHelper.java @@ -3,6 +3,7 @@ import net.minecraft.world.entity.monster.ElderGuardian; import net.minecraft.world.entity.monster.Guardian; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; @@ -10,6 +11,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class GuardianEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/IllagerEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/IllagerEntityHelper.java index dbd34186d..135b18364 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/IllagerEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/IllagerEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.AbstractIllager; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class IllagerEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PhantomEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PhantomEntityHelper.java index bc15a32a0..c78c4a0f0 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PhantomEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PhantomEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.Phantom; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class PhantomEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PiglinEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PiglinEntityHelper.java index 4ddb815ac..a59bb22b5 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PiglinEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PiglinEntityHelper.java @@ -2,11 +2,13 @@ import net.minecraft.world.entity.monster.piglin.Piglin; import net.minecraft.world.entity.monster.piglin.PiglinArmPose; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class PiglinEntityHelper extends AbstractPiglinEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PillagerEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PillagerEntityHelper.java index bd0f6c73a..af534c420 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PillagerEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/PillagerEntityHelper.java @@ -3,11 +3,13 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.monster.Pillager; import net.minecraft.world.item.Items; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class PillagerEntityHelper extends IllagerEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ShulkerEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ShulkerEntityHelper.java index ea5c91b55..19b76ba56 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ShulkerEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ShulkerEntityHelper.java @@ -2,6 +2,7 @@ import net.minecraft.world.entity.monster.Shulker; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.DyeColorHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.DirectionHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; @@ -11,6 +12,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class ShulkerEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SlimeEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SlimeEntityHelper.java index 3c2101fd3..3aa3b9c96 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SlimeEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SlimeEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.Slime; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class SlimeEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SpellcastingIllagerEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SpellcastingIllagerEntityHelper.java index 2200951b7..b710c9b6b 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SpellcastingIllagerEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SpellcastingIllagerEntityHelper.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.SpellcasterIllager; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletDeclareType; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinSpellcastingIllagerEntityHelper; @@ -9,6 +10,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class SpellcastingIllagerEntityHelper extends IllagerEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SpiderEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SpiderEntityHelper.java index b37fba24f..cb3beb948 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SpiderEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/SpiderEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.Spider; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class SpiderEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/VexEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/VexEntityHelper.java index 181f15bf5..b3cb03634 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/VexEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/VexEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.Vex; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class VexEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/VindicatorEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/VindicatorEntityHelper.java index 23a55b9b5..bb5583173 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/VindicatorEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/VindicatorEntityHelper.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.Vindicator; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class VindicatorEntityHelper extends IllagerEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/WardenEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/WardenEntityHelper.java index eb0cc2cbd..facd28577 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/WardenEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/WardenEntityHelper.java @@ -2,12 +2,14 @@ import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.monster.warden.Warden; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class WardenEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/WitchEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/WitchEntityHelper.java index 3eb9db5c1..059ed73fc 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/WitchEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/WitchEntityHelper.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.Witch; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; @@ -8,6 +9,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class WitchEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ZombieEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ZombieEntityHelper.java index 733578f94..f795a34c9 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ZombieEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ZombieEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.mob; import net.minecraft.world.entity.monster.Zombie; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class ZombieEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ZombieVillagerEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ZombieVillagerEntityHelper.java index 3f04b8ef0..abc9354e4 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ZombieVillagerEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/mob/ZombieVillagerEntityHelper.java @@ -2,11 +2,13 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.entity.monster.ZombieVillager; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class ZombieVillagerEntityHelper extends ZombieEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/AreaEffectCloudEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/AreaEffectCloudEntityHelper.java index 159580f07..5d53ef0a5 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/AreaEffectCloudEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/AreaEffectCloudEntityHelper.java @@ -2,6 +2,7 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.entity.AreaEffectCloud; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; @@ -9,6 +10,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class AreaEffectCloudEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/FallingBlockEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/FallingBlockEntityHelper.java index e249d82a1..15a0e19ec 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/FallingBlockEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/FallingBlockEntityHelper.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.other; import net.minecraft.world.entity.item.FallingBlockEntity; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockPosHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockStateHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; @@ -9,6 +10,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class FallingBlockEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/InteractionEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/InteractionEntityHelper.java index ec91bcf35..0a6da54e7 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/InteractionEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/InteractionEntityHelper.java @@ -3,6 +3,7 @@ import net.minecraft.world.entity.Interaction; import net.minecraft.world.entity.LivingEntity; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.access.IMixinInteractionEntity; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinInteractionEntity2; @@ -11,6 +12,7 @@ * @author aMelonRind * @since 1.9.1 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class InteractionEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/TntEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/TntEntityHelper.java index cc4da4911..01d3b90d9 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/TntEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/other/TntEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.other; import net.minecraft.world.entity.item.PrimedTnt; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class TntEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AbstractHorseEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AbstractHorseEntityHelper.java index 8fb9e1be3..d33252656 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AbstractHorseEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AbstractHorseEntityHelper.java @@ -4,12 +4,14 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.horse.AbstractHorse; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinAbstractHorseEntity; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class AbstractHorseEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AllayEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AllayEntityHelper.java index 6ec2e1d1c..7cd029ef3 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AllayEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AllayEntityHelper.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.allay.Allay; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinAllayEntity; @@ -8,6 +9,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class AllayEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AnimalEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AnimalEntityHelper.java index 0851aaec8..54590a2ac 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AnimalEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AnimalEntityHelper.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.Animal; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemHelper; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; @@ -9,6 +10,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class AnimalEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AxolotlEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AxolotlEntityHelper.java index 2d9feeb4e..31eee1fae 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AxolotlEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/AxolotlEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.axolotl.Axolotl; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class AxolotlEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/BatEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/BatEntityHelper.java index 541cc78db..8497351aa 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/BatEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/BatEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.ambient.Bat; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class BatEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/BeeEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/BeeEntityHelper.java index e8b6d340b..a945bec06 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/BeeEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/BeeEntityHelper.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.Bee; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class BeeEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/CatEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/CatEntityHelper.java index d46207ed7..735324a5e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/CatEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/CatEntityHelper.java @@ -3,12 +3,14 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.animal.Cat; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.DyeColorHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class CatEntityHelper extends TameableEntityHelper { private static final Minecraft mc = Minecraft.getInstance(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/DolphinEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/DolphinEntityHelper.java index eeeec538b..149cec11e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/DolphinEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/DolphinEntityHelper.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.Dolphin; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockPosHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; @@ -8,6 +9,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class DolphinEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/DonkeyEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/DonkeyEntityHelper.java index 41c958170..b2242aea3 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/DonkeyEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/DonkeyEntityHelper.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.horse.AbstractChestedHorse; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class DonkeyEntityHelper extends AbstractHorseEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FishEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FishEntityHelper.java index e0d5b6894..70217aba1 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FishEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FishEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.AbstractFish; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class FishEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FoxEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FoxEntityHelper.java index f28ed7e33..2a51717e1 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FoxEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FoxEntityHelper.java @@ -4,6 +4,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.animal.Fox; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinFoxEntity; @@ -14,6 +15,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class FoxEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FrogEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FrogEntityHelper.java index 2e2a28e82..60874e3aa 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FrogEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/FrogEntityHelper.java @@ -4,6 +4,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.animal.frog.Frog; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; @@ -11,6 +12,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class FrogEntityHelper extends AnimalEntityHelper { Minecraft mc = Minecraft.getInstance(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/GoatEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/GoatEntityHelper.java index 1b37dee5d..a56f270ac 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/GoatEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/GoatEntityHelper.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.goat.Goat; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class GoatEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/HorseEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/HorseEntityHelper.java index d28cc5432..9d35d0fd9 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/HorseEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/HorseEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.horse.Horse; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinHorseEntity; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class HorseEntityHelper extends AbstractHorseEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/IronGolemEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/IronGolemEntityHelper.java index 7abbf51b4..a4668b88e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/IronGolemEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/IronGolemEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.IronGolem; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class IronGolemEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/LlamaEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/LlamaEntityHelper.java index 7747a03fd..d69c671bb 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/LlamaEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/LlamaEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.horse.Llama; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class LlamaEntityHelper extends DonkeyEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/MooshroomEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/MooshroomEntityHelper.java index 40ccbc9e5..9053a4579 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/MooshroomEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/MooshroomEntityHelper.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.MushroomCow; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class MooshroomEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/OcelotEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/OcelotEntityHelper.java index bf3d3cdbc..10a5ca2b7 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/OcelotEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/OcelotEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.Ocelot; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinOcelotEntity; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class OcelotEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PandaEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PandaEntityHelper.java index 9ae3ddef0..c6831ce1f 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PandaEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PandaEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.Panda; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class PandaEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/ParrotEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/ParrotEntityHelper.java index 2107707bd..c48125b40 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/ParrotEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/ParrotEntityHelper.java @@ -3,6 +3,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.UUIDUtil; import net.minecraft.world.entity.animal.Parrot; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import java.util.Objects; @@ -12,6 +13,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class ParrotEntityHelper extends TameableEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PigEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PigEntityHelper.java index 2136ca68d..a22ad1698 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PigEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PigEntityHelper.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.Pig; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class PigEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PolarBearEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PolarBearEntityHelper.java index ffc678eee..0d64af111 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PolarBearEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PolarBearEntityHelper.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.PolarBear; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class PolarBearEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PufferfishEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PufferfishEntityHelper.java index cffc5a9fb..92bdee554 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PufferfishEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/PufferfishEntityHelper.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.Pufferfish; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class PufferfishEntityHelper extends FishEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/RabbitEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/RabbitEntityHelper.java index 57b1832ca..9341fb954 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/RabbitEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/RabbitEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.Rabbit; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class RabbitEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/SheepEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/SheepEntityHelper.java index dc9962e67..8cbfee350 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/SheepEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/SheepEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.sheep.Sheep; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.DyeColorHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class SheepEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/SnowGolemEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/SnowGolemEntityHelper.java index 7da18c080..d3a487c6e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/SnowGolemEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/SnowGolemEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.SnowGolem; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.MobEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class SnowGolemEntityHelper extends MobEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/StriderEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/StriderEntityHelper.java index 0fc12d76f..b89168328 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/StriderEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/StriderEntityHelper.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.monster.Strider; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class StriderEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/TameableEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/TameableEntityHelper.java index 678f077b9..0f0456eaa 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/TameableEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/TameableEntityHelper.java @@ -2,12 +2,14 @@ import net.minecraft.world.entity.TamableAnimal; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.LivingEntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class TameableEntityHelper extends AnimalEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/TropicalFishEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/TropicalFishEntityHelper.java index 1efa6b181..51756824c 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/TropicalFishEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/TropicalFishEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.TropicalFish; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class TropicalFishEntityHelper extends FishEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/WolfEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/WolfEntityHelper.java index d0b890fd9..2d07c0822 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/WolfEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/passive/WolfEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive; import net.minecraft.world.entity.animal.wolf.Wolf; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.DyeColorHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class WolfEntityHelper extends TameableEntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/ArrowEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/ArrowEntityHelper.java index 6242f7520..c1b7a6e83 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/ArrowEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/ArrowEntityHelper.java @@ -2,12 +2,14 @@ import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.Arrow; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class ArrowEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/FishingBobberEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/FishingBobberEntityHelper.java index cf027f55f..3290c02ca 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/FishingBobberEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/FishingBobberEntityHelper.java @@ -2,6 +2,7 @@ import net.minecraft.world.entity.projectile.FishingHook; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinFishingBobberEntity; @@ -9,6 +10,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class FishingBobberEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/TridentEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/TridentEntityHelper.java index 557a891ab..9c8575148 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/TridentEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/TridentEntityHelper.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.projectile; import net.minecraft.world.entity.projectile.ThrownTrident; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinTridentEntity; @@ -8,6 +9,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class TridentEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/WitherSkullEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/WitherSkullEntityHelper.java index 06fbffd23..d0bf4fa42 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/WitherSkullEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/projectile/WitherSkullEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.projectile; import net.minecraft.world.entity.projectile.WitherSkull; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class WitherSkullEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/BoatEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/BoatEntityHelper.java index 03b51f3ac..901f48b56 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/BoatEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/BoatEntityHelper.java @@ -3,6 +3,7 @@ import net.minecraft.world.entity.vehicle.AbstractBoat; import net.minecraft.world.entity.vehicle.Boat; import net.minecraft.world.entity.vehicle.ChestBoat; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; @@ -10,6 +11,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class BoatEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/FurnaceMinecartEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/FurnaceMinecartEntityHelper.java index 2860e6d56..9b666ac28 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/FurnaceMinecartEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/FurnaceMinecartEntityHelper.java @@ -2,12 +2,14 @@ import net.minecraft.world.entity.vehicle.MinecartFurnace; import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class FurnaceMinecartEntityHelper extends EntityHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/TntMinecartEntityHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/TntMinecartEntityHelper.java index 693e0b864..40386ce4e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/TntMinecartEntityHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/world/entity/specialized/vehicle/TntMinecartEntityHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.vehicle; import net.minecraft.world.entity.vehicle.MinecartTNT; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Entity Helpers") @SuppressWarnings("unused") public class TntMinecartEntityHelper extends EntityHelper { From bc45cc2cd844029bfcf775c2bfc87fabeabe57f8 Mon Sep 17 00:00:00 2001 From: Jack Manning Date: Fri, 9 Jan 2026 17:47:39 -0500 Subject: [PATCH 07/16] Fix missing DocletCategory places --- .../xyz/wagyourtail/doclet/core/DocletModelBuilder.java | 7 +++++++ .../java/xyz/wagyourtail/doclet/core/model/ClassDoc.java | 1 + 2 files changed, 8 insertions(+) diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocletModelBuilder.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocletModelBuilder.java index 4c5b8d63b..993e2e886 100644 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocletModelBuilder.java +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/DocletModelBuilder.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.doclet.core; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletDeclareType; import xyz.wagyourtail.doclet.DocletIgnore; import xyz.wagyourtail.doclet.DocletReplaceParams; @@ -89,6 +90,7 @@ public DocletModel build(DocletEnvironment environment) { String alias = null; boolean eventCancellable = false; String eventFilterer = null; + String category = null; AnnotationMirror library = findAnnotation(type, "Library"); AnnotationMirror event = findAnnotation(type, "Event"); if (library != null) { @@ -112,6 +114,10 @@ public DocletModel build(DocletEnvironment environment) { } } } + DocletCategory categoryAnnotation = type.getAnnotation(DocletCategory.class); + if (categoryAnnotation != null) { + category = categoryAnnotation.value(); + } ClassKind kind = switch (type.getKind()) { case INTERFACE -> ClassKind.INTERFACE; @@ -259,6 +265,7 @@ public DocletModel build(DocletEnvironment environment) { kind, group, alias, + category, eventCancellable, eventFilterer, typeParams, diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassDoc.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassDoc.java index 9593e8088..344aaeb21 100644 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassDoc.java +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/model/ClassDoc.java @@ -9,6 +9,7 @@ public record ClassDoc( ClassKind kind, String group, String alias, + String category, boolean eventCancellable, String eventFilterer, List typeParams, From fd579a1e00f2223fe5996a3a1fcd211b8789d768 Mon Sep 17 00:00:00 2001 From: Jack Manning Date: Fri, 9 Jan 2026 17:48:16 -0500 Subject: [PATCH 08/16] Improve markdown rendering --- build.gradle.kts | 16 +- .../doclet/core/mddoclet/Main.java | 3 +- .../doclet/core/render/MarkdownWriter.java | 147 ++++++++++++++++-- docs/vitepress/.vitepress/config.mts | 118 +++++++++++--- docs/vitepress/content/2.0.0/classes.md | 3 + docs/vitepress/content/2.0.0/events.md | 3 + docs/vitepress/content/2.0.0/libraries.md | 3 + docs/vitepress/content/index.md | 24 +++ docs/vitepress/package.json | 1 + docs/vitepress/pnpm-lock.yaml | 30 +++- stonecutter.gradle.kts | 16 +- 11 files changed, 314 insertions(+), 50 deletions(-) create mode 100644 docs/vitepress/content/2.0.0/classes.md create mode 100644 docs/vitepress/content/2.0.0/events.md create mode 100644 docs/vitepress/content/2.0.0/libraries.md create mode 100644 docs/vitepress/content/index.md diff --git a/build.gradle.kts b/build.gradle.kts index 7e81fbd36..9755c5018 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,6 +22,14 @@ val distDirFile = distDir.asFile val docsBuildDir = layout.buildDirectory.dir("docs").get().asFile val docletJarFile = layout.projectDirectory.file("buildSrc/build/libs/buildSrc.jar").asFile +repositories { + mavenCentral() +} + +val docletClasspath = configurations.detachedConfiguration( + dependencies.create("com.google.code.gson:gson:2.9.0") +) + // Root-level properties (available in root gradle.properties) val modIdProvider = providers.gradleProperty("mod_id") val channelProvider = providers.gradleProperty("channel").orElse("release") @@ -101,7 +109,7 @@ if (isVersionedProject && hasMinecraftVersion) { classpath = documentationClasspath destinationDir = File(docsBuildDir, "python/JsMacrosAC") options.doclet = "xyz.wagyourtail.doclet.core.pydoclet.Main" - options.docletpath = mutableListOf(docletJarFile) + options.docletpath = (listOf(docletJarFile) + docletClasspath.files).toMutableList() (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) } @@ -120,7 +128,7 @@ if (isVersionedProject && hasMinecraftVersion) { classpath = documentationClasspath destinationDir = File(docsBuildDir, "typescript/headers") options.doclet = "xyz.wagyourtail.doclet.core.tsdoclet.Main" - options.docletpath = mutableListOf(docletJarFile) + options.docletpath = (listOf(docletJarFile) + docletClasspath.files).toMutableList() (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) } @@ -139,7 +147,7 @@ if (isVersionedProject && hasMinecraftVersion) { classpath = documentationClasspath destinationDir = File(docsBuildDir, "web") options.doclet = "xyz.wagyourtail.doclet.core.webdoclet.Main" - options.docletpath = mutableListOf(docletJarFile) + options.docletpath = (listOf(docletJarFile) + docletClasspath.files).toMutableList() (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) (options as CoreJavadocOptions).addStringOption("mcv", mcVersion) (options as StandardJavadocDocletOptions).links( @@ -168,7 +176,7 @@ if (isVersionedProject && hasMinecraftVersion) { classpath = documentationClasspath destinationDir = File(docsBuildDir, "vitepress") options.doclet = "xyz.wagyourtail.doclet.core.mddoclet.Main" - options.docletpath = mutableListOf(docletJarFile) + options.docletpath = (listOf(docletJarFile) + docletClasspath.files).toMutableList() (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) (options as CoreJavadocOptions).addStringOption("mcv", mcVersion) (options as StandardJavadocDocletOptions).links( diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/mddoclet/Main.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/mddoclet/Main.java index 484bee155..bb7e31471 100644 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/mddoclet/Main.java +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/mddoclet/Main.java @@ -18,6 +18,7 @@ import javax.tools.Diagnostic; import java.io.File; import java.io.IOException; +import java.nio.file.Path; import java.util.Locale; import java.util.Set; @@ -59,7 +60,7 @@ public boolean run(DocletEnvironment environment) { DocletModelBuilder builder = new DocletModelBuilder(typeResolver, new BasicDocCommentParser(trees)); var model = builder.build(environment); - File outDir = new File(OutputDirectory.outputDir, Version.version); + File outDir = new File(OutputDirectory.outputDir.toPath().resolve("content").toString(), Version.version); if (!outDir.exists() && !outDir.mkdirs()) { reporter.print(Diagnostic.Kind.ERROR, "Failed to create version dir\n"); return false; diff --git a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/MarkdownWriter.java b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/MarkdownWriter.java index da8bf39b5..0d22fcc46 100644 --- a/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/MarkdownWriter.java +++ b/buildSrc/src/main/java/xyz/wagyourtail/doclet/core/render/MarkdownWriter.java @@ -13,12 +13,15 @@ import xyz.wagyourtail.doclet.core.model.PackageDoc; import xyz.wagyourtail.doclet.core.model.ParamDoc; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.TreeMap; import java.util.regex.Pattern; public class MarkdownWriter { @@ -35,6 +38,8 @@ public class MarkdownWriter { "java.lang.Double", "double", "java.lang.Number", "number" ); + private static final String DEFAULT_CATEGORY = "Uncategorized"; + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); private final TypeResolver typeResolver; public MarkdownWriter(TypeResolver typeResolver) { @@ -42,6 +47,16 @@ public MarkdownWriter(TypeResolver typeResolver) { } public void write(DocletModel model, File outDir, String version, String mcVersion) throws IOException { + Map> classCategories = groupByCategory(model, "Class"); + Map> eventCategories = groupByCategory(model, "Event"); + Map> libraryCategories = groupByCategory(model, "Library"); + SidebarData sidebarData = new SidebarData( + version, + mapToSidebarCategories(classCategories, version), + mapToSidebarCategories(eventCategories, version), + mapToSidebarCategories(libraryCategories, version) + ); + for (PackageDoc pkg : model.packages()) { for (ClassDoc clz : pkg.classes()) { File out = new File(outDir, classPath(clz) + ".md"); @@ -53,16 +68,36 @@ public void write(DocletModel model, File outDir, String version, String mcVersi } } - writeGroupIndexes(model, outDir, version, mcVersion); + writeGroupIndexes(model, outDir, version, mcVersion, classCategories, eventCategories, libraryCategories); + writeSidebarData(outDir, sidebarData); } private String classPath(ClassDoc clz) { String pkgPath = clz.packageName().replace('.', '/'); String namePath = clz.name().replace('$', '.'); - return pkgPath.isEmpty() ? namePath : pkgPath + "/" + namePath; + String basePath = pkgPath.isEmpty() ? namePath : pkgPath + "/" + namePath; + String groupPrefix = groupPathPrefix(clz); + return groupPrefix.isEmpty() ? basePath : groupPrefix + "/" + basePath; + } + + private String groupPathPrefix(ClassDoc clz) { + return switch (clz.group()) { + case "Event" -> "events"; + case "Class" -> "classes"; + case "Library" -> "libraries"; + default -> ""; + }; } - private void writeGroupIndexes(DocletModel model, File outDir, String version, String mcVersion) throws IOException { + private void writeGroupIndexes( + DocletModel model, + File outDir, + String version, + String mcVersion, + Map> classCategories, + Map> eventCategories, + Map> libraryCategories + ) throws IOException { Map> grouped = new java.util.HashMap<>(); for (PackageDoc pkg : model.packages()) { for (ClassDoc clz : pkg.classes()) { @@ -76,11 +111,11 @@ private void writeGroupIndexes(DocletModel model, File outDir, String version, S new FileHandler(new File(outDir, "index.md")) .write(renderOverview(grouped, version, mcVersion)); new FileHandler(new File(outDir, "libraries.md")) - .write(renderGroupPage("Libraries", grouped.getOrDefault("Library", List.of()), true)); + .write(renderGroupPage("Libraries", grouped.getOrDefault("Library", List.of()), true, libraryCategories)); new FileHandler(new File(outDir, "events.md")) - .write(renderGroupPage("Events", grouped.getOrDefault("Event", List.of()), true)); + .write(renderGroupPage("Events", grouped.getOrDefault("Event", List.of()), true, eventCategories)); new FileHandler(new File(outDir, "classes.md")) - .write(renderGroupPage("Classes", grouped.getOrDefault("Class", List.of()), false)); + .write(renderGroupPage("Classes", grouped.getOrDefault("Class", List.of()), false, classCategories)); } private String renderOverview(Map> grouped, String version, String mcVersion) { @@ -96,32 +131,107 @@ private String renderOverview(Map> grouped, String versio return builder.toString(); } - private String renderGroupPage(String title, List classes, boolean includeAlias) { + private String renderGroupPage(String title, List classes, boolean preferAlias, Map> categories) { StringBuilder builder = new StringBuilder(); builder.append("---\noutline: false\n---\n\n"); builder.append("# ").append(title).append("\n\n"); - if (classes.isEmpty()) { + if ((categories == null || categories.isEmpty()) && classes.isEmpty()) { builder.append("No entries found.\n"); return builder.toString(); } - for (ClassDoc clz : classes) { + if (categories != null && !categories.isEmpty()) { + for (Map.Entry> entry : categories.entrySet()) { + builder.append("### ").append(entry.getKey()).append("\n\n"); + renderGroupEntries(entry.getValue(), preferAlias, builder); + builder.append("\n"); + } + return builder.toString(); + } + renderGroupEntries(classes, preferAlias, builder); + return builder.toString(); + } + + private void renderGroupEntries(List entries, boolean preferAlias, StringBuilder builder) { + if (entries == null || entries.isEmpty()) { + builder.append("No entries found.\n"); + return; + } + for (ClassDoc clz : entries) { + String linkText = preferAlias && hasAlias(clz) + ? clz.alias() + : clz.qualifiedName(); builder.append("- [") - .append(clz.qualifiedName()) + .append(linkText) .append("](./") .append(classPath(clz)) .append(".md)"); - if (includeAlias && clz.alias() != null && !clz.alias().isEmpty()) { - builder.append(" - `").append(clz.alias()).append("`"); + if (preferAlias && hasAlias(clz) && !linkText.equals(clz.qualifiedName())) { + builder.append(" (`").append(clz.qualifiedName()).append("`)"); } builder.append("\n"); } - return builder.toString(); } + private boolean hasAlias(ClassDoc clz) { + return clz.alias() != null && !clz.alias().isBlank(); + } + + private Map> groupByCategory(DocletModel model, String targetGroup) { + Map> categories = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + for (PackageDoc pkg : model.packages()) { + for (ClassDoc clz : pkg.classes()) { + if (!targetGroup.equals(clz.group())) { + continue; + } + String category = clz.category(); + if (category == null || category.isBlank()) { + category = DEFAULT_CATEGORY; + } + categories.computeIfAbsent(category, key -> new ArrayList<>()).add(clz); + } + } + for (List list : categories.values()) { + list.sort(Comparator.comparing(this::sidebarSortKey, String.CASE_INSENSITIVE_ORDER)); + } + return categories; + } + + private String sidebarSortKey(ClassDoc clz) { + return hasAlias(clz) ? clz.alias() : clz.name(); + } + + private List mapToSidebarCategories(Map> categories, String version) { + List sections = new ArrayList<>(); + for (Map.Entry> entry : categories.entrySet()) { + List items = new ArrayList<>(); + for (ClassDoc clz : entry.getValue()) { + String link = "/" + version + "/" + classPath(clz); + items.add(new SidebarItem(displayLabel(clz), link)); + } + sections.add(new SidebarCategory(entry.getKey(), items)); + } + return sections; + } + + private String displayLabel(ClassDoc clz) { + if (hasAlias(clz)) { + return clz.alias(); + } + return clz.name(); + } + + private void writeSidebarData(File outDir, SidebarData data) throws IOException { + new FileHandler(new File(outDir, "sidebar-data.json")).write(GSON.toJson(data)); + } + + private record SidebarItem(String text, String link) {} + private record SidebarCategory(String name, List items) {} + private record SidebarData(String version, List classes, List events, List libraries) {} + private String renderClass(ClassDoc clz) { StringBuilder builder = new StringBuilder(); builder.append("---\noutline: deep\n---\n\n"); - builder.append("# ").append(clz.name()).append("\n\n"); + builder.append("# ").append(displayTitle(clz)).append("\n\n"); builder.append(clz.qualifiedName()).append("\n\n"); String desc = formatDescription(clz.docComment()); builder.append(desc.isEmpty() ? "TODO: No description supplied" : desc); @@ -137,6 +247,13 @@ private String renderClass(ClassDoc clz) { return builder.toString(); } + private String displayTitle(ClassDoc clz) { + if ("Event".equals(clz.group()) && hasAlias(clz)) { + return clz.alias(); + } + return clz.name(); + } + private void renderMemberSection(StringBuilder builder, ClassDoc clz, MemberKind kind, String title) { List members = clz.members().stream() .filter(member -> member.kind() == kind) @@ -175,6 +292,8 @@ private void renderMemberSection(StringBuilder builder, ClassDoc clz, MemberKind private String renderMemberTitle(MemberDoc member) { if (member.kind() == MemberKind.CONSTRUCTOR) { return "new " + member.name() + "(" + renderParamNames(member) + ")"; + } else if (member.kind() == MemberKind.FIELD) { + return member.name(); } return member.name() + "(" + renderParamNames(member) + ")"; } diff --git a/docs/vitepress/.vitepress/config.mts b/docs/vitepress/.vitepress/config.mts index a6a3a0366..d8199f7ea 100644 --- a/docs/vitepress/.vitepress/config.mts +++ b/docs/vitepress/.vitepress/config.mts @@ -1,30 +1,108 @@ +import fs from 'node:fs' +import path from 'node:path' import { defineConfig } from 'vitepress' -// https://vitepress.dev/reference/site-config +const contentDir = path.resolve(__dirname, '../content') +const versionDir = resolveVersionDir(contentDir) +const versionPrefix = `/${versionDir}` +const sidebarData = loadSidebarData(versionDir) + export default defineConfig({ cleanUrls: true, - srcDir: "2.0.0", - title: "JsMacros", - description: "Minecraft Fabric mod for JavaScript based macros.", + srcDir: './content', + title: 'JsMacrosCE', + description: 'Minecraft Fabric mod for JavaScript based macros.', themeConfig: { - // https://vitepress.dev/reference/default-theme-config nav: [ { text: 'Home', link: '/' }, - { text: 'Examples', link: '/markdown-examples' } - ], - - sidebar: [ - { - text: 'Examples', - items: [ - { text: 'Markdown Examples', link: '/markdown-examples' }, - { text: 'Runtime API Examples', link: '/api-examples' } - ] - } + { text: 'Libraries', link: `${versionPrefix}/libraries` }, + { text: 'Classes', link: `${versionPrefix}/classes` }, + { text: 'Events', link: `${versionPrefix}/events` } ], - + sidebar: { + [`${versionPrefix}/libraries`]: buildSidebar(sidebarData.libraries, `${versionPrefix}/libraries`, 'Libraries'), + [`${versionPrefix}/classes`]: buildSidebar(sidebarData.classes, `${versionPrefix}/classes`, 'Classes'), + [`${versionPrefix}/events`]: buildSidebar(sidebarData.events, `${versionPrefix}/events`, 'Events') + }, socialLinks: [ - { icon: 'github', link: 'https://github.com/vuejs/vitepress' } - ] - }, + { icon: 'github', link: 'https://github.com/JsMacrosCE/JsMacros' } + ], + search: { + provider: 'local' + }, + outline: { + level: [2, 3], + } + } }) + +function resolveVersionDir(dir: string): string { + if (!fs.existsSync(dir)) { + return 'latest' + } + const entries = fs.readdirSync(dir, { withFileTypes: true }) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + if (entries.length === 0) { + return 'latest' + } + entries.sort((a, b) => a.localeCompare(b, undefined, { numeric: true })) + return entries[entries.length - 1] +} + +type SidebarDataNode = Array<{ name: string; items: Array<{ text: string; link: string }> }> +type SidebarData = { + classes: SidebarDataNode; + events: SidebarDataNode; + libraries: SidebarDataNode; +} +function loadSidebarData(version: string): SidebarData { + const dataPath = path.join(contentDir, version, 'sidebar-data.json') + if (!fs.existsSync(dataPath)) { + return { classes: [], events: [], libraries: [] } + } + try { + return JSON.parse(fs.readFileSync(dataPath, 'utf8')) + } catch (error) { + console.warn('Failed to load sidebar data:', error) + return { classes: [], events: [], libraries: [] } + } +} + +function buildSidebar(entries: SidebarDataNode, fallbackLink: string, mainTitle: string) { + if (Array.isArray(entries) && entries.length > 0) { + // Flatten the sidebar on pages like "Libraries" where we don't categorize things + if (entries.length === 1 && entries[0].name === 'Uncategorized') { + return [{ + text: mainTitle, + items: entries[0].items.map((item) => ({ + text: item.text, + link: item.link + })) + }]; + } + + return [{ + text: mainTitle, + items: entries.map((section) => ({ + text: section.name, + collapsed: true, + items: (section.items ?? []).map((item) => ({ + text: item.text, + link: item.link + })) + })) + }]; + } + return [ + { + text: mainTitle, + items: [ + { + text: `Browse ${mainTitle}`, + link: fallbackLink + } + ] + } + ] +} diff --git a/docs/vitepress/content/2.0.0/classes.md b/docs/vitepress/content/2.0.0/classes.md new file mode 100644 index 000000000..103da02be --- /dev/null +++ b/docs/vitepress/content/2.0.0/classes.md @@ -0,0 +1,3 @@ +# Classes + +TODO: General overview of classes diff --git a/docs/vitepress/content/2.0.0/events.md b/docs/vitepress/content/2.0.0/events.md new file mode 100644 index 000000000..787e426fd --- /dev/null +++ b/docs/vitepress/content/2.0.0/events.md @@ -0,0 +1,3 @@ +# Events + +TODO: General overview of events diff --git a/docs/vitepress/content/2.0.0/libraries.md b/docs/vitepress/content/2.0.0/libraries.md new file mode 100644 index 000000000..9575f561c --- /dev/null +++ b/docs/vitepress/content/2.0.0/libraries.md @@ -0,0 +1,3 @@ +# Libraries + +TODO: General overview of libraries diff --git a/docs/vitepress/content/index.md b/docs/vitepress/content/index.md new file mode 100644 index 000000000..88a70a6c3 --- /dev/null +++ b/docs/vitepress/content/index.md @@ -0,0 +1,24 @@ +# JsMacros Community Edition Documentation + +Welcome to the complete API documentation for JsMacros Community Edition - a Minecraft mod that allows you to write macros in various languages to automate and enhance your gameplay. + +## Getting Started + +Use the sidebar to navigate through: + +- **Libraries**: Core global libraries available in scripts +- **Classes**: Helper classes and utilities +- **Events**: Available events and their properties + +## Quick Links + +- [World API](/apis/World) - Interact with the Minecraft world +- [Player API](/apis/Player) - Control the player +- [Chat API](/apis/Chat) - Send and receive chat messages +- [Hud API](/apis/Hud) - Manipulate the HUD + +## Resources + +- [GitHub Repository](https://github.com/JsMacrosCE/JsMacros/) +- [Modrinth Page](https://modrinth.com/mod/jsmacrosce) +- [Discord Community](https://discord.gg/P6W58J8) diff --git a/docs/vitepress/package.json b/docs/vitepress/package.json index 27a279e21..15bb3983f 100644 --- a/docs/vitepress/package.json +++ b/docs/vitepress/package.json @@ -16,6 +16,7 @@ "license": "MPL-2.0", "packageManager": "pnpm@10.25.0", "devDependencies": { + "@types/node": "^25.0.3", "vitepress": "2.0.0-alpha.15" } } \ No newline at end of file diff --git a/docs/vitepress/pnpm-lock.yaml b/docs/vitepress/pnpm-lock.yaml index 5183cd048..84c6fa221 100644 --- a/docs/vitepress/pnpm-lock.yaml +++ b/docs/vitepress/pnpm-lock.yaml @@ -8,9 +8,12 @@ importers: .: devDependencies: + '@types/node': + specifier: ^25.0.3 + version: 25.0.3 vitepress: specifier: 2.0.0-alpha.15 - version: 2.0.0-alpha.15(@algolia/client-search@5.46.2)(postcss@8.5.6)(react@19.2.3)(search-insights@2.17.3) + version: 2.0.0-alpha.15(@algolia/client-search@5.46.2)(@types/node@25.0.3)(postcss@8.5.6)(react@19.2.3)(search-insights@2.17.3) packages: @@ -506,6 +509,9 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/node@25.0.3': + resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -840,6 +846,9 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -1341,6 +1350,10 @@ snapshots: '@types/mdurl@2.0.0': {} + '@types/node@25.0.3': + dependencies: + undici-types: 7.16.0 + '@types/unist@3.0.3': {} '@types/web-bluetooth@0.0.21': {} @@ -1349,10 +1362,10 @@ snapshots: '@vercel/oidc@3.0.5': {} - '@vitejs/plugin-vue@6.0.3(vite@7.3.0)(vue@3.5.26)': + '@vitejs/plugin-vue@6.0.3(vite@7.3.0(@types/node@25.0.3))(vue@3.5.26)': dependencies: '@rolldown/pluginutils': 1.0.0-beta.53 - vite: 7.3.0 + vite: 7.3.0(@types/node@25.0.3) vue: 3.5.26 '@vue/compiler-core@3.5.26': @@ -1724,6 +1737,8 @@ snapshots: trim-lines@3.0.1: {} + undici-types@7.16.0: {} + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -1761,7 +1776,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@7.3.0: + vite@7.3.0(@types/node@25.0.3): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -1770,9 +1785,10 @@ snapshots: rollup: 4.55.1 tinyglobby: 0.2.15 optionalDependencies: + '@types/node': 25.0.3 fsevents: 2.3.3 - vitepress@2.0.0-alpha.15(@algolia/client-search@5.46.2)(postcss@8.5.6)(react@19.2.3)(search-insights@2.17.3): + vitepress@2.0.0-alpha.15(@algolia/client-search@5.46.2)(@types/node@25.0.3)(postcss@8.5.6)(react@19.2.3)(search-insights@2.17.3): dependencies: '@docsearch/css': 4.4.0 '@docsearch/js': 4.4.0(@algolia/client-search@5.46.2)(react@19.2.3)(search-insights@2.17.3) @@ -1781,7 +1797,7 @@ snapshots: '@shikijs/transformers': 3.20.0 '@shikijs/types': 3.20.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.3(vite@7.3.0)(vue@3.5.26) + '@vitejs/plugin-vue': 6.0.3(vite@7.3.0(@types/node@25.0.3))(vue@3.5.26) '@vue/devtools-api': 8.0.5 '@vue/shared': 3.5.26 '@vueuse/core': 14.1.0(vue@3.5.26) @@ -1790,7 +1806,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.2.0 shiki: 3.20.0 - vite: 7.3.0 + vite: 7.3.0(@types/node@25.0.3) vue: 3.5.26 optionalDependencies: postcss: 8.5.6 diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts index 956412700..86fa919b1 100644 --- a/stonecutter.gradle.kts +++ b/stonecutter.gradle.kts @@ -27,6 +27,14 @@ val distDirFile = distDir.asFile val docsBuildDir = layout.buildDirectory.dir("docs").get().asFile val docletJarFile = layout.projectDirectory.file("buildSrc/build/libs/buildSrc.jar").asFile +repositories { + mavenCentral() +} + +val docletClasspath = configurations.detachedConfiguration( + dependencies.create("com.google.code.gson:gson:2.9.0") +) + // Root-level properties val modIdProvider = providers.gradleProperty("mod_id") val channelProvider = providers.gradleProperty("channel").orElse("release") @@ -141,7 +149,7 @@ gradle.projectsEvaluated { classpath = documentationClasspath destinationDir = File(docsBuildDir, "python/JsMacrosAC") options.doclet = "xyz.wagyourtail.doclet.core.pydoclet.Main" - options.docletpath = mutableListOf(docletJarFile) + options.docletpath = (listOf(docletJarFile) + docletClasspath.files).toMutableList() (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) } @@ -160,7 +168,7 @@ gradle.projectsEvaluated { classpath = documentationClasspath destinationDir = File(docsBuildDir, "typescript/headers") options.doclet = "xyz.wagyourtail.doclet.core.tsdoclet.Main" - options.docletpath = mutableListOf(docletJarFile) + options.docletpath = (listOf(docletJarFile) + docletClasspath.files).toMutableList() (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) } @@ -179,7 +187,7 @@ gradle.projectsEvaluated { classpath = documentationClasspath destinationDir = File(docsBuildDir, "web") options.doclet = "xyz.wagyourtail.doclet.core.webdoclet.Main" - options.docletpath = mutableListOf(docletJarFile) + options.docletpath = (listOf(docletJarFile) + docletClasspath.files).toMutableList() (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) (options as CoreJavadocOptions).addStringOption("mcv", mcVersion) (options as StandardJavadocDocletOptions).links( @@ -208,7 +216,7 @@ gradle.projectsEvaluated { classpath = documentationClasspath destinationDir = File(docsBuildDir, "vitepress") options.doclet = "xyz.wagyourtail.doclet.core.mddoclet.Main" - options.docletpath = mutableListOf(docletJarFile) + options.docletpath = (listOf(docletJarFile) + docletClasspath.files).toMutableList() (options as CoreJavadocOptions).addStringOption("v", project.version.toString()) (options as CoreJavadocOptions).addStringOption("mcv", mcVersion) (options as StandardJavadocDocletOptions).links( From d28fe8ffc81dc007bcb81dda18fd5651186d0d8d Mon Sep 17 00:00:00 2001 From: Jack Manning Date: Fri, 9 Jan 2026 19:01:25 -0500 Subject: [PATCH 09/16] Add WIP categories --- .../jsmacros/client/api/classes/CustomImage.java | 2 ++ .../client/api/classes/inventory/AnvilInventory.java | 2 ++ .../client/api/classes/inventory/BeaconInventory.java | 2 ++ .../api/classes/inventory/BrewingStandInventory.java | 2 ++ .../api/classes/inventory/CartographyInventory.java | 2 ++ .../client/api/classes/inventory/CommandBuilder.java | 2 ++ .../client/api/classes/inventory/CommandManager.java | 2 ++ .../client/api/classes/inventory/ContainerInventory.java | 2 ++ .../client/api/classes/inventory/CraftingInventory.java | 2 ++ .../client/api/classes/inventory/CreativeInventory.java | 2 ++ .../client/api/classes/inventory/EnchantInventory.java | 2 ++ .../client/api/classes/inventory/FurnaceInventory.java | 2 ++ .../client/api/classes/inventory/GrindStoneInventory.java | 2 ++ .../client/api/classes/inventory/HorseInventory.java | 2 ++ .../jsmacros/client/api/classes/inventory/Inventory.java | 6 ++---- .../client/api/classes/inventory/LoomInventory.java | 2 ++ .../client/api/classes/inventory/PlayerInventory.java | 2 ++ .../client/api/classes/inventory/RecipeInventory.java | 2 ++ .../client/api/classes/inventory/SmithingInventory.java | 2 ++ .../api/classes/inventory/StoneCutterInventory.java | 2 ++ .../client/api/classes/inventory/VillagerInventory.java | 2 ++ .../jsmacros/client/api/classes/render/Draw2D.java | 2 ++ .../jsmacros/client/api/classes/render/Draw3D.java | 2 ++ .../jsmacros/client/api/classes/render/IDraw2D.java | 2 ++ .../jsmacros/client/api/classes/render/IScreen.java | 2 ++ .../jsmacros/client/api/classes/render/ScriptScreen.java | 2 ++ .../api/classes/render/components/Draw2DElement.java | 2 ++ .../client/api/classes/render/components/Image.java | 3 +++ .../client/api/classes/render/components/Item.java | 3 +++ .../client/api/classes/render/components/Line.java | 3 +++ .../client/api/classes/render/components/Rect.java | 3 +++ .../api/classes/render/components/RenderElement.java | 2 ++ .../classes/render/components/RenderElementBuilder.java | 2 ++ .../client/api/classes/render/components/Text.java | 3 +++ .../client/api/classes/render/components3d/Box.java | 3 +++ .../api/classes/render/components3d/EntityTraceLine.java | 3 +++ .../client/api/classes/render/components3d/Line3D.java | 3 +++ .../api/classes/render/components3d/RenderElement3D.java | 2 ++ .../client/api/classes/render/components3d/Surface.java | 3 +++ .../client/api/classes/render/components3d/TraceLine.java | 3 +++ .../api/classes/worldscanner/filter/BasicFilter.java | 2 ++ .../classes/worldscanner/filter/ClassWrapperFilter.java | 2 ++ .../api/classes/worldscanner/filter/GroupFilter.java | 6 ++++++ .../classes/worldscanner/filter/api/IAdvancedFilter.java | 3 +++ .../api/classes/worldscanner/filter/api/ICompare.java | 3 +++ .../api/classes/worldscanner/filter/api/IFilter.java | 3 +++ .../worldscanner/filter/compare/BooleanCompareFilter.java | 2 ++ .../worldscanner/filter/compare/CharCompareFilter.java | 2 ++ .../worldscanner/filter/compare/NumberCompareFilter.java | 2 ++ .../worldscanner/filter/compare/StringCompareFilter.java | 3 +++ .../api/classes/worldscanner/filter/impl/BlockFilter.java | 2 ++ .../worldscanner/filter/impl/BlockStateFilter.java | 2 ++ .../classes/worldscanner/filter/impl/StringifyFilter.java | 2 ++ .../classes/worldscanner/filter/logical/AndFilter.java | 2 ++ .../classes/worldscanner/filter/logical/NotFilter.java | 2 ++ .../api/classes/worldscanner/filter/logical/OrFilter.java | 2 ++ .../classes/worldscanner/filter/logical/XorFilter.java | 2 ++ .../client/api/event/filterer/FiltererBlockUpdate.java | 2 ++ .../client/api/event/filterer/FiltererRecvPacket.java | 2 ++ .../client/api/event/filterer/FiltererSendPacket.java | 2 ++ .../jsmacros/client/api/event/impl/EventKey.java | 2 ++ .../jsmacros/client/api/event/impl/EventLaunchGame.java | 2 ++ .../jsmacros/client/api/event/impl/EventMouseScroll.java | 2 ++ .../jsmacros/client/api/event/impl/EventQuitGame.java | 2 ++ .../jsmacros/client/api/event/impl/EventRecvMessage.java | 2 ++ .../jsmacros/client/api/event/impl/EventRecvPacket.java | 2 ++ .../client/api/event/impl/EventResourcePackLoaded.java | 2 ++ .../jsmacros/client/api/event/impl/EventSendMessage.java | 2 ++ .../jsmacros/client/api/event/impl/EventSendPacket.java | 2 ++ .../jsmacros/client/api/event/impl/EventTitle.java | 2 ++ .../client/api/event/impl/inventory/EventClickSlot.java | 2 ++ .../api/event/impl/inventory/EventContainerUpdate.java | 2 ++ .../client/api/event/impl/inventory/EventDropSlot.java | 2 ++ .../client/api/event/impl/inventory/EventItemDamage.java | 2 ++ .../client/api/event/impl/inventory/EventItemPickup.java | 2 ++ .../api/event/impl/inventory/EventOpenContainer.java | 2 ++ .../client/api/event/impl/inventory/EventSlotUpdate.java | 2 ++ .../client/api/event/impl/player/EventAirChange.java | 2 ++ .../client/api/event/impl/player/EventArmorChange.java | 2 ++ .../client/api/event/impl/player/EventAttackBlock.java | 2 ++ .../client/api/event/impl/player/EventAttackEntity.java | 2 ++ .../client/api/event/impl/player/EventDamage.java | 2 ++ .../jsmacros/client/api/event/impl/player/EventDeath.java | 2 ++ .../client/api/event/impl/player/EventEXPChange.java | 2 ++ .../client/api/event/impl/player/EventFallFlying.java | 2 ++ .../jsmacros/client/api/event/impl/player/EventHeal.java | 2 ++ .../client/api/event/impl/player/EventHealthChange.java | 2 ++ .../client/api/event/impl/player/EventHeldItemChange.java | 2 ++ .../client/api/event/impl/player/EventHungerChange.java | 2 ++ .../client/api/event/impl/player/EventInteractBlock.java | 2 ++ .../client/api/event/impl/player/EventInteractEntity.java | 2 ++ .../client/api/event/impl/player/EventOpenScreen.java | 2 ++ .../client/api/event/impl/player/EventRiding.java | 2 ++ .../client/api/event/impl/player/EventSignEdit.java | 2 ++ .../api/event/impl/player/EventStatusEffectUpdate.java | 2 ++ .../client/api/event/impl/world/EventBlockUpdate.java | 2 ++ .../client/api/event/impl/world/EventBossbar.java | 2 ++ .../client/api/event/impl/world/EventChunkLoad.java | 2 ++ .../client/api/event/impl/world/EventChunkUnload.java | 2 ++ .../client/api/event/impl/world/EventDimensionChange.java | 2 ++ .../client/api/event/impl/world/EventDisconnect.java | 2 ++ .../client/api/event/impl/world/EventEntityDamaged.java | 2 ++ .../client/api/event/impl/world/EventEntityHealed.java | 2 ++ .../client/api/event/impl/world/EventEntityLoad.java | 2 ++ .../client/api/event/impl/world/EventEntityUnload.java | 2 ++ .../client/api/event/impl/world/EventJoinServer.java | 2 ++ .../client/api/event/impl/world/EventNameChange.java | 2 ++ .../client/api/event/impl/world/EventPlayerJoin.java | 2 ++ .../client/api/event/impl/world/EventPlayerLeave.java | 2 ++ .../jsmacros/client/api/event/impl/world/EventSound.java | 2 ++ .../jsmacros/client/api/event/impl/world/EventTick.java | 2 ++ .../jsmacros/client/api/helper/CommandContextHelper.java | 1 + .../jsmacros/client/api/helper/CommandNodeHelper.java | 2 ++ .../jsmacros/client/api/helper/OptionsHelper.java | 8 ++++++++ .../api/helper/inventory/CreativeItemStackHelper.java | 2 ++ .../client/api/helper/inventory/EnchantmentHelper.java | 2 ++ .../client/api/helper/inventory/FoodComponentHelper.java | 2 ++ .../jsmacros/client/api/helper/inventory/ItemHelper.java | 2 ++ .../client/api/helper/inventory/ItemStackHelper.java | 2 ++ .../client/api/helper/inventory/RecipeHelper.java | 2 ++ .../client/api/helper/screen/ButtonWidgetHelper.java | 4 ++++ .../client/api/helper/screen/CheckBoxWidgetHelper.java | 3 +++ .../client/api/helper/screen/ClickableWidgetHelper.java | 2 ++ .../api/helper/screen/CyclingButtonWidgetHelper.java | 3 +++ .../client/api/helper/screen/LockButtonWidgetHelper.java | 3 +++ .../client/api/helper/screen/SliderWidgetHelper.java | 3 +++ .../client/api/helper/screen/TextFieldWidgetHelper.java | 3 +++ .../wagyourtail/jsmacros/client/config/ClientProfile.java | 2 ++ .../editor/highlighting/scriptimpl/CodeCompileEvent.java | 2 ++ .../jsmacros/client/gui/overlays/FileChooser.java | 4 ++++ .../xyz/wagyourtail/jsmacros/core/config/BaseProfile.java | 2 ++ .../wagyourtail/jsmacros/core/config/ConfigManager.java | 2 ++ .../xyz/wagyourtail/jsmacros/core/event/BaseEvent.java | 2 ++ .../jsmacros/core/event/BaseEventRegistry.java | 2 ++ .../java/xyz/wagyourtail/jsmacros/core/event/Event.java | 3 +++ .../wagyourtail/jsmacros/core/event/EventFilterer.java | 3 +++ .../wagyourtail/jsmacros/core/event/impl/EventCustom.java | 4 +++- .../jsmacros/core/event/impl/EventProfileLoad.java | 2 ++ .../jsmacros/core/event/impl/EventWrappedScript.java | 2 ++ .../jsmacros/core/event/impl/FiltererComposed.java | 2 ++ .../jsmacros/core/event/impl/FiltererInverted.java | 2 ++ .../jsmacros/core/event/impl/FiltererModulus.java | 2 ++ .../xyz/wagyourtail/jsmacros/core/helpers/BaseHelper.java | 1 + .../jsmacros/core/language/EventContainer.java | 2 ++ .../wagyourtail/jsmacros/core/library/impl/FJsMacros.java | 2 ++ .../wagyourtail/jsmacros/core/service/EventService.java | 2 ++ .../wagyourgui/containers/CheckBoxContainer.java | 2 ++ .../wagyourtail/wagyourgui/containers/ListContainer.java | 2 ++ .../wagyourgui/containers/MultiElementContainer.java | 2 ++ .../xyz/wagyourtail/wagyourgui/elements/Scrollbar.java | 2 ++ .../java/xyz/wagyourtail/wagyourgui/elements/Slider.java | 2 ++ .../wagyourgui/overlays/SelectorDropdownOverlay.java | 2 ++ 152 files changed, 338 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/CustomImage.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/CustomImage.java index 97e8a2737..adecc298b 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/CustomImage.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/CustomImage.java @@ -5,6 +5,7 @@ import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import javax.imageio.ImageIO; @@ -22,6 +23,7 @@ * @since 1.8.4 */ @SuppressWarnings("unused") +@DocletCategory("Rendering and Graphics") public class CustomImage { public static final Map IMAGES = new HashMap<>(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/AnvilInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/AnvilInventory.java index 5eeb29de6..715e4b080 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/AnvilInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/AnvilInventory.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.classes.inventory; import net.minecraft.client.gui.screens.inventory.AnvilScreen; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinAnvilScreen; @@ -8,6 +9,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class AnvilInventory extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/BeaconInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/BeaconInventory.java index 44a0beda6..c37bdf53a 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/BeaconInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/BeaconInventory.java @@ -8,6 +8,7 @@ import net.minecraft.world.effect.MobEffects; import net.minecraft.world.level.block.entity.BeaconBlockEntity; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.doclet.DocletReplaceReturn; @@ -16,6 +17,7 @@ /** * @since 1.5.1 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class BeaconInventory extends Inventory { protected BeaconInventory(BeaconScreen inventory) { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/BrewingStandInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/BrewingStandInventory.java index 698c0994e..c2fb2ad81 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/BrewingStandInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/BrewingStandInventory.java @@ -6,6 +6,7 @@ import net.minecraft.world.item.alchemy.PotionBrewing; import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.level.block.entity.BrewingStandBlockEntity; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import java.util.Arrays; @@ -17,6 +18,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class BrewingStandInventory extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CartographyInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CartographyInventory.java index eee9bd88f..4d815f9ef 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CartographyInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CartographyInventory.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.classes.inventory; import net.minecraft.client.gui.screens.inventory.CartographyTableScreen; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class CartographyInventory extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CommandBuilder.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CommandBuilder.java index 77c364d03..2f1383b7e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CommandBuilder.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CommandBuilder.java @@ -17,6 +17,7 @@ import net.minecraft.commands.arguments.item.ItemPredicateArgument; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.CommandContextHelper; import xyz.wagyourtail.jsmacros.client.api.helper.SuggestionsBuilderHelper; @@ -40,6 +41,7 @@ /** * @since 1.4.2 */ +@DocletCategory("Commands") @SuppressWarnings("unused") public abstract class CommandBuilder implements Registrable { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CommandManager.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CommandManager.java index 07a5f5ede..d666ec262 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CommandManager.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CommandManager.java @@ -11,6 +11,7 @@ import net.minecraft.client.multiplayer.ClientSuggestionProvider; import net.minecraft.commands.CommandSource; import net.minecraft.commands.SharedSuggestionProvider; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.CommandNodeHelper; import xyz.wagyourtail.jsmacros.core.MethodWrapper; @@ -21,6 +22,7 @@ /** * @since 1.7.0 */ +@DocletCategory("Commands") public abstract class CommandManager { public static CommandManager instance; private static final Minecraft mc = Minecraft.getInstance(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/ContainerInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/ContainerInventory.java index 28f567961..c4c3a6f5c 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/ContainerInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/ContainerInventory.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.classes.inventory; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import xyz.wagyourtail.doclet.DocletCategory; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class ContainerInventory> extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CraftingInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CraftingInventory.java index 668b8a803..720427586 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CraftingInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CraftingInventory.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.classes.inventory; import net.minecraft.client.gui.screens.inventory.CraftingScreen; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") public class CraftingInventory extends RecipeInventory { protected CraftingInventory(CraftingScreen inventory) { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CreativeInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CreativeInventory.java index 676e78527..ea7818974 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CreativeInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/CreativeInventory.java @@ -9,6 +9,7 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.ItemStack; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.RegistryHelper; import xyz.wagyourtail.jsmacros.client.api.helper.TextHelper; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; @@ -22,6 +23,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class CreativeInventory extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/EnchantInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/EnchantInventory.java index 021d360d5..ee14eee6f 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/EnchantInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/EnchantInventory.java @@ -5,6 +5,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.world.inventory.EnchantmentMenu; import net.minecraft.world.item.enchantment.Enchantment; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.TextHelper; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.EnchantmentHelper; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; @@ -12,6 +13,7 @@ /** * @since 1.3.1 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class EnchantInventory extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/FurnaceInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/FurnaceInventory.java index 63dde558f..e22ee9349 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/FurnaceInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/FurnaceInventory.java @@ -6,6 +6,7 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.inventory.ContainerData; import net.minecraft.world.item.Item; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.client.mixin.access.MixinAbstractFurnaceScreenHandler; @@ -15,6 +16,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class FurnaceInventory extends RecipeInventory> { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/GrindStoneInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/GrindStoneInventory.java index 51f236115..35cb5513b 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/GrindStoneInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/GrindStoneInventory.java @@ -8,12 +8,14 @@ import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.ItemEnchantments; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class GrindStoneInventory extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/HorseInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/HorseInventory.java index e41c38cf6..6e7a786f2 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/HorseInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/HorseInventory.java @@ -4,6 +4,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.animal.horse.AbstractChestedHorse; import net.minecraft.world.entity.animal.horse.AbstractHorse; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.access.IHorseScreen; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.specialized.passive.AbstractHorseEntityHelper; @@ -16,6 +17,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class HorseInventory extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/Inventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/Inventory.java index 7259bb772..6106308ab 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/Inventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/Inventory.java @@ -16,10 +16,7 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; -import xyz.wagyourtail.doclet.DocletDeclareType; -import xyz.wagyourtail.doclet.DocletReplaceParams; -import xyz.wagyourtail.doclet.DocletReplaceReturn; -import xyz.wagyourtail.doclet.DocletReplaceTypeParams; +import xyz.wagyourtail.doclet.*; import xyz.wagyourtail.jsmacros.api.math.Pos2D; import xyz.wagyourtail.jsmacros.client.JsMacros; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; @@ -39,6 +36,7 @@ * @author Wagyourtail * @since 1.0.8 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class Inventory> { protected T inventory; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/LoomInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/LoomInventory.java index 1769f5ba7..fbaf1c8f9 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/LoomInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/LoomInventory.java @@ -9,6 +9,7 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BannerPattern; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.access.ILoomScreen; import java.util.List; @@ -19,6 +20,7 @@ /** * @since 1.5.1 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class LoomInventory extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/PlayerInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/PlayerInventory.java index a6c328d6a..f3d931ac8 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/PlayerInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/PlayerInventory.java @@ -2,12 +2,14 @@ import net.minecraft.client.gui.screens.inventory.InventoryScreen; import net.minecraft.world.inventory.InventoryMenu; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") public class PlayerInventory extends RecipeInventory { protected PlayerInventory(InventoryScreen inventory) { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/RecipeInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/RecipeInventory.java index 8f532d63e..bca8cf10d 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/RecipeInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/RecipeInventory.java @@ -8,6 +8,7 @@ import net.minecraft.world.inventory.RecipeBookMenu; import net.minecraft.world.item.crafting.display.RecipeDisplayEntry; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.classes.render.IScreen; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; @@ -21,6 +22,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public abstract class RecipeInventory> extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/SmithingInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/SmithingInventory.java index 264c63d9b..44d0c2315 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/SmithingInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/SmithingInventory.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.classes.inventory; import net.minecraft.client.gui.screens.inventory.SmithingScreen; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class SmithingInventory extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/StoneCutterInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/StoneCutterInventory.java index 16f6f97f0..ffec17869 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/StoneCutterInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/StoneCutterInventory.java @@ -3,6 +3,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.inventory.StonecutterScreen; import net.minecraft.world.item.crafting.display.SlotDisplayContext; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import java.util.List; @@ -12,6 +13,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class StoneCutterInventory extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/VillagerInventory.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/VillagerInventory.java index 2bb69a9ad..23b0bc440 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/VillagerInventory.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/inventory/VillagerInventory.java @@ -2,6 +2,7 @@ import net.minecraft.client.gui.screens.inventory.MerchantScreen; import net.minecraft.world.item.trading.MerchantOffer; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.access.IMerchantScreen; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.TradeOfferHelper; @@ -11,6 +12,7 @@ /** * @since 1.3.1 */ +@DocletCategory("Inventory") @SuppressWarnings("unused") public class VillagerInventory extends Inventory { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/Draw2D.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/Draw2D.java index 7f0914e3b..a9018d38e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/Draw2D.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/Draw2D.java @@ -5,6 +5,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Renderable; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletIgnore; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; @@ -25,6 +26,7 @@ * @see IDraw2D * @since 1.0.5 */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("deprecation") public class Draw2D implements IDraw2D, Registrable { protected final Set elements = new LinkedHashSet<>(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/Draw3D.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/Draw3D.java index 913fa232b..2342bc8b6 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/Draw3D.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/Draw3D.java @@ -5,6 +5,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.world.phys.Vec3; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletIgnore; import xyz.wagyourtail.jsmacros.api.math.Pos2D; import xyz.wagyourtail.jsmacros.api.math.Pos3D; @@ -24,6 +25,7 @@ * @author Wagyourtail * @since 1.0.6 */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class Draw3D implements Registrable { private final List> elements = new ArrayList<>(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/IDraw2D.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/IDraw2D.java index 0a3887abe..404cdba0a 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/IDraw2D.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/IDraw2D.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.classes.render; import net.minecraft.client.gui.GuiGraphics; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletIgnore; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.jsmacros.client.api.classes.render.components.*; @@ -16,6 +17,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Rendering and Graphics") public interface IDraw2D { /** diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/IScreen.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/IScreen.java index 797778990..c9272aef3 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/IScreen.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/IScreen.java @@ -2,6 +2,7 @@ import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.api.math.Pos2D; import xyz.wagyourtail.jsmacros.api.math.Vec2D; import xyz.wagyourtail.jsmacros.client.api.helper.TextHelper; @@ -16,6 +17,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Screen and UI Elements") public interface IScreen extends IDraw2D { /** diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/ScriptScreen.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/ScriptScreen.java index 624db4cb3..867f427f0 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/ScriptScreen.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/ScriptScreen.java @@ -6,6 +6,7 @@ import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.api.math.Pos3D; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.access.IScreenInternal; @@ -20,6 +21,7 @@ * @see IScreen * @since 1.0.5 */ +@DocletCategory("Screen and UI Elements") public class ScriptScreen extends BaseScreen { public boolean drawTitle; /** diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Draw2DElement.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Draw2DElement.java index 772133c49..1da207229 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Draw2DElement.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Draw2DElement.java @@ -5,6 +5,7 @@ import org.jetbrains.annotations.Nullable; import org.joml.Matrix3x2fStack; import org.joml.Quaternionf; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.render.Draw2D; import xyz.wagyourtail.jsmacros.client.api.classes.render.IDraw2D; @@ -14,6 +15,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class Draw2DElement implements RenderElement, Alignable { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Image.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Image.java index 510e1ad5d..535c0d4b2 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Image.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Image.java @@ -9,6 +9,7 @@ import net.minecraft.util.Mth; import org.jetbrains.annotations.Nullable; import org.joml.Matrix3x2fStack; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.CustomImage; import xyz.wagyourtail.jsmacros.client.api.classes.RegistryHelper; import xyz.wagyourtail.jsmacros.client.api.classes.render.IDraw2D; @@ -18,6 +19,7 @@ * @author Wagyourtail * @since 1.2.3 */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class Image implements RenderElement, Alignable { @@ -379,6 +381,7 @@ public Image moveTo(int x, int y) { * @author Etheradon * @since 1.8.4 */ + @DocletCategory("Rendering and Graphics") public static final class Builder extends RenderElementBuilder implements Alignable { private String identifier; private int x = 0; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Item.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Item.java index c4407fe67..c1d67a1ec 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Item.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Item.java @@ -8,6 +8,7 @@ import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; import org.joml.Matrix3x2fStack; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletIgnore; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.jsmacros.client.api.classes.RegistryHelper; @@ -18,6 +19,7 @@ * @author Wagyourtail * @since 1.0.5 */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class Item implements RenderElement, Alignable { @@ -360,6 +362,7 @@ public Item moveTo(int x, int y) { * @author Etheradon * @since 1.8.4 */ + @DocletCategory("Rendering and Graphics") public static final class Builder extends RenderElementBuilder implements Alignable { private int x = 0; private int y = 0; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Line.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Line.java index 5b448319a..3750da83a 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Line.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Line.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable; import org.joml.Matrix3x2fStack; import org.joml.Quaternionf; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.render.IDraw2D; import xyz.wagyourtail.jsmacros.client.util.ColorUtil; @@ -13,6 +14,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class Line implements RenderElement, Alignable { @@ -352,6 +354,7 @@ public int getScaledTop() { * @author Etheradon * @since 1.8.4 */ + @DocletCategory("Rendering and Graphics") public static class Builder extends RenderElementBuilder implements Alignable { private int x1 = 0; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Rect.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Rect.java index 185dc9929..9fd3d5422 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Rect.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Rect.java @@ -5,6 +5,7 @@ import net.minecraft.util.Mth; import org.jetbrains.annotations.Nullable; import org.joml.Matrix3x2fStack; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.render.IDraw2D; import xyz.wagyourtail.jsmacros.client.util.ColorUtil; @@ -12,6 +13,7 @@ * @author Wagyourtail * @since 1.0.5 */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class Rect implements RenderElement, Alignable { @@ -368,6 +370,7 @@ public Rect moveTo(int x, int y) { * @author Etheradon * @since 1.8.4 */ + @DocletCategory("Rendering and Graphics") public static final class Builder extends RenderElementBuilder implements Alignable { private int x1 = 0; private int y1 = 0; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/RenderElement.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/RenderElement.java index 319bb2324..2f5d5f8b4 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/RenderElement.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/RenderElement.java @@ -6,11 +6,13 @@ import net.minecraft.client.gui.components.Renderable; import org.joml.Matrix3x2fStack; import org.joml.Quaternionf; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletIgnore; /** * @author Wagyourtail */ +@DocletCategory("Rendering and Graphics") public interface RenderElement extends Renderable { Minecraft mc = Minecraft.getInstance(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/RenderElementBuilder.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/RenderElementBuilder.java index 3609ec047..2bbf0e8bc 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/RenderElementBuilder.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/RenderElementBuilder.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.classes.render.components; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.render.IDraw2D; /** @@ -7,6 +8,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Rendering and Graphics") public abstract class RenderElementBuilder { protected final IDraw2D parent; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Text.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Text.java index b5428a39f..79ae0b3a5 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Text.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components/Text.java @@ -10,6 +10,7 @@ import org.joml.Matrix3x2fStack; import org.joml.Matrix4f; import org.lwjgl.system.MemoryStack; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletIgnore; import xyz.wagyourtail.jsmacros.client.api.classes.TextBuilder; import xyz.wagyourtail.jsmacros.client.api.classes.render.IDraw2D; @@ -22,6 +23,7 @@ * @author Wagyourtail * @since 1.0.5 */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class Text implements RenderElement, Alignable { @@ -373,6 +375,7 @@ public Text moveTo(int x, int y) { * @author Etheradon * @since 1.8.4 */ + @DocletCategory("Rendering and Graphics") public static class Builder extends RenderElementBuilder implements Alignable { private int x = 0; private int y = 0; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Box.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Box.java index 13dba17d9..119cd8795 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Box.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Box.java @@ -6,6 +6,7 @@ import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.ShapeRenderer; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletIgnore; import xyz.wagyourtail.jsmacros.api.math.Pos3D; import xyz.wagyourtail.jsmacros.api.math.Vec3D; @@ -19,6 +20,7 @@ /** * @author Wagyourtail */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class Box implements RenderElement3D { private static final Field lineDepthTestFunction; @@ -255,6 +257,7 @@ public void render(PoseStack matrixStack, MultiBufferSource consumers, float tic * @author Etheradon * @since 1.8.4 */ + @DocletCategory("Rendering and Graphics") public static class Builder { private final Draw3D parent; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/EntityTraceLine.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/EntityTraceLine.java index 3d3e44a92..6c7fbd461 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/EntityTraceLine.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/EntityTraceLine.java @@ -5,6 +5,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.render.Draw3D; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; @@ -14,6 +15,7 @@ * @author aMelonRind * @since 1.9.0 */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class EntityTraceLine extends TraceLine { public static boolean dirty = false; @@ -66,6 +68,7 @@ public void render(PoseStack matrixStack, MultiBufferSource consumers, float tic super.render(matrixStack, consumers, tickDelta); } + @DocletCategory("Rendering and Graphics") public static class Builder { private final Draw3D parent; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Line3D.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Line3D.java index a69debe81..5e7b1894b 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Line3D.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Line3D.java @@ -5,6 +5,7 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.RenderType; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletIgnore; import xyz.wagyourtail.jsmacros.api.math.Pos3D; import xyz.wagyourtail.jsmacros.api.math.Vec3D; @@ -18,6 +19,7 @@ /** * @author Wagyourtail */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class Line3D implements RenderElement3D { private static final Field lineDepthTestFunction; @@ -144,6 +146,7 @@ public void render(PoseStack matrixStack, MultiBufferSource consumers, float tic * @author Etheradon * @since 1.8.4 */ + @DocletCategory("Rendering and Graphics") public static class Builder { private final Draw3D parent; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/RenderElement3D.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/RenderElement3D.java index 2a02d9a3f..48300916f 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/RenderElement3D.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/RenderElement3D.java @@ -3,8 +3,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.MultiBufferSource; import org.jetbrains.annotations.NotNull; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletIgnore; +@DocletCategory("Rendering and Graphics") public interface RenderElement3D> extends Comparable> { @DocletIgnore diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Surface.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Surface.java index e51352b98..989baff65 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Surface.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/Surface.java @@ -12,6 +12,7 @@ import org.joml.Matrix3x2fStack; import org.joml.Quaternionf; import org.joml.Vector3f; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletIgnore; import xyz.wagyourtail.jsmacros.api.math.Pos2D; import xyz.wagyourtail.jsmacros.api.math.Pos3D; @@ -29,6 +30,7 @@ * @author Wagyourtail * @since 1.6.5 */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class Surface extends Draw2D implements RenderElement, RenderElement3D { public boolean rotateToPlayer; @@ -420,6 +422,7 @@ public void render(GuiGraphics drawContext, int mouseX, int mouseY, float delta) * @author Etheradon * @since 1.8.4 */ + @DocletCategory("Rendering and Graphics") public static class Builder { private final Draw3D parent; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/TraceLine.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/TraceLine.java index af1723f7a..e194bc568 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/TraceLine.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/render/components3d/TraceLine.java @@ -5,6 +5,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.world.phys.Vec3; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.api.math.Pos3D; import xyz.wagyourtail.jsmacros.client.api.classes.render.Draw3D; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockPosHelper; @@ -15,6 +16,7 @@ * @author aMelonRind * @since 1.9.0 */ +@DocletCategory("Rendering and Graphics") @SuppressWarnings("unused") public class TraceLine implements RenderElement3D { private final Line3D render; @@ -106,6 +108,7 @@ public void render(PoseStack matrixStack, MultiBufferSource consumers, float tic render.render(matrixStack, consumers, tickDelta); } + @DocletCategory("Rendering and Graphics") public static class Builder { private final Draw3D parent; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/BasicFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/BasicFilter.java index 4c343d66c..d291ccde8 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/BasicFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/BasicFilter.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IAdvancedFilter; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IFilter; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.logical.AndFilter; @@ -11,6 +12,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public abstract class BasicFilter implements IAdvancedFilter { @Override diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/ClassWrapperFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/ClassWrapperFilter.java index c44ff4de7..e5fa87d25 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/ClassWrapperFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/ClassWrapperFilter.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IFilter; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.compare.BooleanCompareFilter; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.compare.CharCompareFilter; @@ -17,6 +18,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public abstract class ClassWrapperFilter extends BasicFilter { protected final String methodName; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/GroupFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/GroupFilter.java index 50ec96d22..0676d8059 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/GroupFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/GroupFilter.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter; import com.google.common.collect.ImmutableList; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IFilter; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.compare.NumberCompareFilter; @@ -11,6 +12,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public abstract class GroupFilter implements IFilter { protected List> filters; @@ -43,6 +45,7 @@ public List> getFilters() { return ImmutableList.copyOf(filters); } + @DocletCategory("Filters and Predicates") public static class AllMatchFilter extends GroupFilter { public AllMatchFilter() { @@ -56,6 +59,7 @@ public Boolean apply(T t) { } + @DocletCategory("Filters and Predicates") public static class AnyMatchFilter extends GroupFilter { public AnyMatchFilter() { @@ -69,6 +73,7 @@ public Boolean apply(T t) { } + @DocletCategory("Filters and Predicates") public static class NoneMatchFilter extends GroupFilter { public NoneMatchFilter() { @@ -82,6 +87,7 @@ public Boolean apply(T t) { } + @DocletCategory("Filters and Predicates") public static class CountMatchFilter extends GroupFilter { private final IFilter filter; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/IAdvancedFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/IAdvancedFilter.java index b70d98f65..ab47dfe1f 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/IAdvancedFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/IAdvancedFilter.java @@ -1,9 +1,12 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api; +import xyz.wagyourtail.doclet.DocletCategory; + /** * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public interface IAdvancedFilter extends IFilter { IAdvancedFilter and(IFilter filter); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/ICompare.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/ICompare.java index dc7d74fd7..bfd6c4728 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/ICompare.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/ICompare.java @@ -1,6 +1,9 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api; +import xyz.wagyourtail.doclet.DocletCategory; + @FunctionalInterface +@DocletCategory("Filters and Predicates") public interface ICompare { boolean compare(T obj1, T obj2); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/IFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/IFilter.java index bbb7bba88..1efa5960e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/IFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/api/IFilter.java @@ -1,11 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api; +import xyz.wagyourtail.doclet.DocletCategory; + import java.util.function.Function; /** * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public interface IFilter extends Function { @Override diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/BooleanCompareFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/BooleanCompareFilter.java index b2e53b015..11f0d5877 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/BooleanCompareFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/BooleanCompareFilter.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.compare; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IFilter; /** * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public class BooleanCompareFilter implements IFilter { private final boolean compareTo; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/CharCompareFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/CharCompareFilter.java index e9e46124f..53bb681c0 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/CharCompareFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/CharCompareFilter.java @@ -1,7 +1,9 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.compare; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IFilter; +@DocletCategory("Filters and Predicates") public class CharCompareFilter implements IFilter { private final char compareTo; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/NumberCompareFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/NumberCompareFilter.java index 8edd1a47c..3630e41bd 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/NumberCompareFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/NumberCompareFilter.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.compare; import com.google.common.math.DoubleMath; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IFilter; import java.util.Locale; @@ -9,6 +10,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public class NumberCompareFilter implements IFilter { private final static double EPSILON = 0.000001d; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/StringCompareFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/StringCompareFilter.java index d0933391b..a17c0438c 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/StringCompareFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/compare/StringCompareFilter.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.compare; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.ICompare; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IFilter; @@ -7,6 +8,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public class StringCompareFilter implements IFilter { private final String compareTo; @@ -23,6 +25,7 @@ public Boolean apply(String val) { return filter.compare(val, compareTo); } + @DocletCategory("Filters and Predicates") public enum FilterMethod { CONTAINS(String::contains), EQUALS(String::equals), diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/BlockFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/BlockFilter.java index cb6c4d21f..8de839f6b 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/BlockFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/BlockFilter.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.impl; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.ClassWrapperFilter; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockHelper; @@ -10,6 +11,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public class BlockFilter extends ClassWrapperFilter { private static final Map METHOD_LOOKUP = getPublicNoParameterMethods(BlockHelper.class); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/BlockStateFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/BlockStateFilter.java index 6afb92bd4..9f8477105 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/BlockStateFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/BlockStateFilter.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.impl; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.ClassWrapperFilter; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockStateHelper; @@ -10,6 +11,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public class BlockStateFilter extends ClassWrapperFilter { private static final Map METHOD_LOOKUP = getPublicNoParameterMethods(BlockStateHelper.class); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/StringifyFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/StringifyFilter.java index 0e49b9dd0..c1bef87e7 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/StringifyFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/impl/StringifyFilter.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.impl; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.BasicFilter; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.ICompare; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.compare.StringCompareFilter; @@ -12,6 +13,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public class StringifyFilter extends BasicFilter { private final Set filterObjects; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/AndFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/AndFilter.java index 3f30972bb..9625922da 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/AndFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/AndFilter.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.logical; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.BasicFilter; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IFilter; @@ -7,6 +8,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public class AndFilter extends BasicFilter { private final IFilter filterOne; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/NotFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/NotFilter.java index 11cb14d7b..f5636e70b 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/NotFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/NotFilter.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.logical; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.BasicFilter; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IFilter; @@ -7,6 +8,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public class NotFilter extends BasicFilter { private final IFilter filter; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/OrFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/OrFilter.java index e06c961dc..6ba1ff2fc 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/OrFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/OrFilter.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.logical; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.BasicFilter; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IFilter; @@ -7,6 +8,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public class OrFilter extends BasicFilter { private final IFilter filterOne; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/XorFilter.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/XorFilter.java index 9ebbf282f..248db7bbf 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/XorFilter.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/classes/worldscanner/filter/logical/XorFilter.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.logical; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.BasicFilter; import xyz.wagyourtail.jsmacros.client.api.classes.worldscanner.filter.api.IFilter; @@ -7,6 +8,7 @@ * @author Etheradon * @since 1.6.5 */ +@DocletCategory("Filters and Predicates") public class XorFilter extends BasicFilter { private final IFilter filterOne; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererBlockUpdate.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererBlockUpdate.java index 61b904a20..56ff3cb96 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererBlockUpdate.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererBlockUpdate.java @@ -2,6 +2,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.classes.RegistryHelper; @@ -18,6 +19,7 @@ * @author aMelonRind * @since 1.9.1 */ +@DocletCategory("Event Filterers") @SuppressWarnings("unused") public class FiltererBlockUpdate implements EventFilterer { @Nullable diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererRecvPacket.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererRecvPacket.java index 569ecbff2..b5ec8d95e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererRecvPacket.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererRecvPacket.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.filterer; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.event.impl.EventRecvPacket; @@ -11,6 +12,7 @@ * @author aMelonRind * @since 1.9.1 */ +@DocletCategory("Event Filterers") @SuppressWarnings("unused") public class FiltererRecvPacket implements EventFilterer { @Nullable diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererSendPacket.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererSendPacket.java index f9c6cee36..4756ae3d6 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererSendPacket.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/filterer/FiltererSendPacket.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.filterer; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.event.impl.EventSendPacket; @@ -11,6 +12,7 @@ * @author aMelonRind * @since 1.9.1 */ +@DocletCategory("Event Filterers") @SuppressWarnings("unused") public class FiltererSendPacket implements EventFilterer { @Nullable diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventKey.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventKey.java index 041a44acb..0749bf13a 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventKey.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventKey.java @@ -5,6 +5,7 @@ import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletDeclareType; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; @@ -22,6 +23,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Inputs & Interactions") @Event(value = "Key", oldName = "KEY", cancellable = true) public class EventKey extends BaseEvent { static final Minecraft mc = Minecraft.getInstance(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventLaunchGame.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventLaunchGame.java index 1c4cd14c4..394d7297d 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventLaunchGame.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventLaunchGame.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -8,6 +9,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("System & Lifecycle") @Event(value = "LaunchGame") public class EventLaunchGame extends BaseEvent { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventMouseScroll.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventMouseScroll.java index 134c7c54d..16bdd0617 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventMouseScroll.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventMouseScroll.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -8,6 +9,7 @@ * @author aMelonRind * @since 1.9.0 */ +@DocletCategory("Inputs & Interactions") @Event(value = "MouseScroll", cancellable = true) public class EventMouseScroll extends BaseEvent { public final double deltaX; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventQuitGame.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventQuitGame.java index d4acb44f4..856607b8d 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventQuitGame.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventQuitGame.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -8,6 +9,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("System & Lifecycle") @Event(value = "QuitGame") public class EventQuitGame extends BaseEvent { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventRecvMessage.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventRecvMessage.java index 33460e0e9..abe403858 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventRecvMessage.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventRecvMessage.java @@ -4,6 +4,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MessageSignature; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.TextHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -13,6 +14,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Network & Chat") @Event(value = "RecvMessage", oldName = "RECV_MESSAGE", cancellable = true) public class EventRecvMessage extends BaseEvent { @Nullable diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventRecvPacket.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventRecvPacket.java index 894410471..825b7a81f 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventRecvPacket.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventRecvPacket.java @@ -3,6 +3,7 @@ import net.minecraft.network.protocol.Packet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.event.filterer.FiltererRecvPacket; @@ -14,6 +15,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Network & Chat") @Event(value = "RecvPacket", cancellable = true, filterer = FiltererRecvPacket.class) @SuppressWarnings("unused") public class EventRecvPacket extends BaseEvent { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventResourcePackLoaded.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventResourcePackLoaded.java index 7036a8cca..df1403b03 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventResourcePackLoaded.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventResourcePackLoaded.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl; import net.minecraft.client.Minecraft; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -15,6 +16,7 @@ * * @since 1.5.1 */ +@DocletCategory("System & Lifecycle") @Event("ResourcePackLoaded") public class EventResourcePackLoaded extends BaseEvent { public final boolean isGameStart; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventSendMessage.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventSendMessage.java index 9f474a934..ccdf64963 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventSendMessage.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventSendMessage.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -9,6 +10,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Network & Chat") @Event(value = "SendMessage", oldName = "SEND_MESSAGE", cancellable = true) public class EventSendMessage extends BaseEvent { @Nullable diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventSendPacket.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventSendPacket.java index b39be41b6..2f3e7bdad 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventSendPacket.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventSendPacket.java @@ -3,6 +3,7 @@ import net.minecraft.network.protocol.Packet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.event.filterer.FiltererSendPacket; @@ -15,6 +16,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Network & Chat") @Event(value = "SendPacket", cancellable = true, filterer = FiltererSendPacket.class) @SuppressWarnings("unused") public class EventSendPacket extends BaseEvent { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventTitle.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventTitle.java index 98ea6ce8e..63ab78dde 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventTitle.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/EventTitle.java @@ -2,6 +2,7 @@ import net.minecraft.network.chat.Component; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletDeclareType; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; @@ -13,6 +14,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Render & UI") @Event(value = "Title", oldName = "TITLE", cancellable = true) public class EventTitle extends BaseEvent { @DocletReplaceReturn("TitleType") diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventClickSlot.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventClickSlot.java index dc499d8f6..5e539636c 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventClickSlot.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventClickSlot.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.inventory; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.classes.inventory.Inventory; @@ -13,6 +14,7 @@ * @author Wagyourtail * @since 1.6.4 */ +@DocletCategory("Inventory") @Event(value = "ClickSlot", cancellable = true) public class EventClickSlot extends BaseEvent { protected final AbstractContainerScreen screen; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventContainerUpdate.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventContainerUpdate.java index fc6d8c9bd..e498748a0 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventContainerUpdate.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventContainerUpdate.java @@ -2,12 +2,14 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.classes.inventory.Inventory; import xyz.wagyourtail.jsmacros.client.api.classes.render.IScreen; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; +@DocletCategory("Inventory") @Event(value = "ContainerUpdate") public class EventContainerUpdate extends BaseEvent { public final Inventory inventory; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventDropSlot.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventDropSlot.java index 034d47e4c..57d81dcd9 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventDropSlot.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventDropSlot.java @@ -3,6 +3,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.classes.inventory.Inventory; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -14,6 +15,7 @@ * @author Wagyourtail * @since 1.6.4 */ +@DocletCategory("Inventory") @Event(value = "DropSlot", cancellable = true) public class EventDropSlot extends BaseEvent { protected static final Minecraft mc = Minecraft.getInstance(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventItemDamage.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventItemDamage.java index 2f508aca0..0b4888617 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventItemDamage.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventItemDamage.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.inventory; import net.minecraft.world.item.ItemStack; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -10,6 +11,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Inventory") @Event(value = "ItemDamage", oldName = "ITEM_DAMAGE") public class EventItemDamage extends BaseEvent { public final ItemStackHelper item; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventItemPickup.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventItemPickup.java index 5e0dbe9d6..182e8e7d3 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventItemPickup.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventItemPickup.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.inventory; import net.minecraft.world.item.ItemStack; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -10,6 +11,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Inventory") @Event(value = "ItemPickup", oldName = "ITEM_PICKUP") public class EventItemPickup extends BaseEvent { public final ItemStackHelper item; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventOpenContainer.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventOpenContainer.java index 22f3fb456..45f98ae80 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventOpenContainer.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventOpenContainer.java @@ -2,6 +2,7 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.classes.inventory.Inventory; import xyz.wagyourtail.jsmacros.client.api.classes.render.IScreen; @@ -12,6 +13,7 @@ * @author Wagyourtail * @since 1.6.5 */ +@DocletCategory("Inventory") @Event(value = "OpenContainer", cancellable = true) public class EventOpenContainer extends BaseEvent { public final Inventory inventory; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventSlotUpdate.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventSlotUpdate.java index 45497a7b1..a658f33f7 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventSlotUpdate.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/inventory/EventSlotUpdate.java @@ -2,6 +2,7 @@ import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.world.item.ItemStack; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletDeclareType; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; @@ -13,6 +14,7 @@ /** * @since 1.9.0 */ +@DocletCategory("Inventory") @Event(value = "SlotUpdate") public class EventSlotUpdate extends BaseEvent { protected final AbstractContainerScreen screen; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAirChange.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAirChange.java index 24d2fb0fe..a2ea8b8fe 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAirChange.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAirChange.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -8,6 +9,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Player & Stats") @Event(value = "AirChange", oldName = "AIR_CHANGE") public class EventAirChange extends BaseEvent { public final int air; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventArmorChange.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventArmorChange.java index a47266ba3..6cc1791f9 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventArmorChange.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventArmorChange.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; import net.minecraft.world.item.ItemStack; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletDeclareType; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; @@ -12,6 +13,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Player & Stats") @Event(value = "ArmorChange", oldName = "ARMOR_CHANGE") public class EventArmorChange extends BaseEvent { @DocletReplaceReturn("ArmorSlot") diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAttackBlock.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAttackBlock.java index fc5618c87..d9cda1530 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAttackBlock.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAttackBlock.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockDataHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; +@DocletCategory("Inputs & Interactions") @Event("AttackBlock") public class EventAttackBlock extends BaseEvent { public final BlockDataHelper block; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAttackEntity.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAttackEntity.java index 702338d01..1d3d02ef8 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAttackEntity.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventAttackEntity.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; import net.minecraft.world.entity.Entity; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; +@DocletCategory("Inputs & Interactions") @Event("AttackEntity") public class EventAttackEntity extends BaseEvent { public final EntityHelper entity; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventDamage.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventDamage.java index b3d4fb724..4b86f8df7 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventDamage.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventDamage.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; import net.minecraft.world.damagesource.DamageSource; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; @@ -11,6 +12,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Player & Stats") @Event(value = "Damage", oldName = "DAMAGE") public class EventDamage extends BaseEvent { /** diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventDeath.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventDeath.java index 6a5031c33..7b1c9a722 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventDeath.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventDeath.java @@ -3,6 +3,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.entity.player.Inventory; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockPosHelper; @@ -16,6 +17,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Player & Stats") @Event(value = "Death", oldName = "DEATH") public class EventDeath extends BaseEvent { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventEXPChange.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventEXPChange.java index 3eaf6ad4a..3f5a1e83f 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventEXPChange.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventEXPChange.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -8,6 +9,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Player & Stats") @Event(value = "EXPChange", oldName = "EXP_CHANGE") public class EventEXPChange extends BaseEvent { public final float progress; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventFallFlying.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventFallFlying.java index 387f79a2e..56fa4b3e6 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventFallFlying.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventFallFlying.java @@ -1,9 +1,11 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; +@DocletCategory("Player & Stats") @Event("FallFlying") public class EventFallFlying extends BaseEvent { public final boolean state; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHeal.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHeal.java index 61fb61e1f..e6a49815f 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHeal.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHeal.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; import net.minecraft.world.damagesource.DamageSource; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletDeclareType; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; @@ -11,6 +12,7 @@ * @author FlareStormGaming * @since 1.6.5 */ +@DocletCategory("Player & Stats") @Event("Heal") public class EventHeal extends BaseEvent { @DocletReplaceReturn("HealSource") diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHealthChange.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHealthChange.java index 095143be6..adf9f9ecc 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHealthChange.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHealthChange.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -8,6 +9,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Player & Stats") @Event(value = "HealthChange") public class EventHealthChange extends BaseEvent { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHeldItemChange.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHeldItemChange.java index 516e4176d..25798f348 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHeldItemChange.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHeldItemChange.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; import net.minecraft.world.item.ItemStack; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.inventory.ItemStackHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -10,6 +11,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Inventory & Items") @Event(value = "HeldItemChange", oldName = "HELD_ITEM") public class EventHeldItemChange extends BaseEvent { public final boolean offHand; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHungerChange.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHungerChange.java index 12831a70e..d38cd3354 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHungerChange.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventHungerChange.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -8,6 +9,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Player & Stats") @Event(value = "HungerChange", oldName = "HUNGER_CHANGE") public class EventHungerChange extends BaseEvent { public final int foodLevel; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventInteractBlock.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventInteractBlock.java index 4f4be68cc..12eadf488 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventInteractBlock.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventInteractBlock.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockDataHelper; @@ -10,6 +11,7 @@ * @author Wagyourtail * @since 1.8.0 */ +@DocletCategory("Inputs & Interactions") @Event("InteractBlock") public class EventInteractBlock extends BaseEvent { public final boolean offhand; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventInteractEntity.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventInteractEntity.java index fa3ce8004..29f10a1a5 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventInteractEntity.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventInteractEntity.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; import net.minecraft.world.entity.Entity; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; +@DocletCategory("Inputs & Interactions") @Event("InteractEntity") public class EventInteractEntity extends BaseEvent { public final boolean offhand; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventOpenScreen.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventOpenScreen.java index 3151b6aad..d8cd90036 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventOpenScreen.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventOpenScreen.java @@ -2,6 +2,7 @@ import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.classes.render.IScreen; @@ -12,6 +13,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Render & UI") @Event(value = "OpenScreen", oldName = "OPEN_SCREEN") public class EventOpenScreen extends BaseEvent { @Nullable diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventRiding.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventRiding.java index 03b0ec30b..3f734ecbb 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventRiding.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventRiding.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; import net.minecraft.world.entity.Entity; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -9,6 +10,7 @@ /** * @since 1.5.0 */ +@DocletCategory("Player & Stats") @Event("Riding") public class EventRiding extends BaseEvent { public final boolean state; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventSignEdit.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventSignEdit.java index 49db31faf..a834f0503 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventSignEdit.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventSignEdit.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.api.math.Pos3D; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -12,6 +13,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Inputs & Interactions") @Event(value = "SignEdit", oldName = "SIGN_EDIT", cancellable = true) public class EventSignEdit extends BaseEvent { public final Pos3D pos; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventStatusEffectUpdate.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventStatusEffectUpdate.java index dbe50069f..419753ec4 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventStatusEffectUpdate.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/player/EventStatusEffectUpdate.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.player; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.StatusEffectHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -9,6 +10,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Player & Stats") @Event(value = "StatusEffectUpdate") public class EventStatusEffectUpdate extends BaseEvent { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventBlockUpdate.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventBlockUpdate.java index 6b7da958c..80c318b29 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventBlockUpdate.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventBlockUpdate.java @@ -3,6 +3,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletDeclareType; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; @@ -15,6 +16,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("World") @Event(value = "BlockUpdate", oldName = "BLOCK_UPDATE", filterer = FiltererBlockUpdate.class) public class EventBlockUpdate extends BaseEvent { public final BlockDataHelper block; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventBossbar.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventBossbar.java index 6c6a527b5..d19d1fdf9 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventBossbar.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventBossbar.java @@ -2,6 +2,7 @@ import net.minecraft.client.gui.components.LerpingBossEvent; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletDeclareType; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; @@ -15,6 +16,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Render & UI") @Event(value = "Bossbar", oldName = "BOSSBAR_UPDATE") public class EventBossbar extends BaseEvent { @Nullable diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventChunkLoad.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventChunkLoad.java index 091a9e57b..3a7827651 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventChunkLoad.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventChunkLoad.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -8,6 +9,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("World") @Event(value = "ChunkLoad", oldName = "CHUNK_LOAD") public class EventChunkLoad extends BaseEvent { public final int x; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventChunkUnload.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventChunkUnload.java index fcef30671..95dce5fd5 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventChunkUnload.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventChunkUnload.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -8,6 +9,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("World") @Event(value = "ChunkUnload", oldName = "CHUNK_UNLOAD") public class EventChunkUnload extends BaseEvent { public final int x; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventDimensionChange.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventDimensionChange.java index 83a460c0d..bae4796ad 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventDimensionChange.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventDimensionChange.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -9,6 +10,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("World") @Event(value = "DimensionChange", oldName = "DIMENSION_CHANGE") public class EventDimensionChange extends BaseEvent { @DocletReplaceReturn("Dimension") diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventDisconnect.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventDisconnect.java index 64a469e9f..ce0411e7b 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventDisconnect.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventDisconnect.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; import net.minecraft.network.chat.Component; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.TextHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -10,6 +11,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Network & Chat") @Event(value = "Disconnect", oldName = "DISCONNECT") public class EventDisconnect extends BaseEvent { /** diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityDamaged.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityDamaged.java index 9d9d5526e..433663afc 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityDamaged.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityDamaged.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; import net.minecraft.world.entity.Entity; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; +@DocletCategory("World") @Event("EntityDamaged") public class EventEntityDamaged extends BaseEvent { public final EntityHelper entity; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityHealed.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityHealed.java index 754bc5bd6..5ec0fdc09 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityHealed.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityHealed.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; import net.minecraft.world.entity.Entity; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -11,6 +12,7 @@ * @since 1.6.5 */ +@DocletCategory("World") @Event("EntityHealed") public class EventEntityHealed extends BaseEvent { public final EntityHelper entity; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityLoad.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityLoad.java index f6f45a896..687f2813c 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityLoad.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityLoad.java @@ -1,11 +1,13 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; import net.minecraft.world.entity.Entity; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; +@DocletCategory("World") @Event("EntityLoad") public class EventEntityLoad extends BaseEvent { public final EntityHelper entity; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityUnload.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityUnload.java index f911e3494..dd8d4c713 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityUnload.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventEntityUnload.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; import net.minecraft.world.entity.Entity; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; +@DocletCategory("World") @Event("EntityUnload") public class EventEntityUnload extends BaseEvent { public final EntityHelper entity; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventJoinServer.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventJoinServer.java index 5a57f7afc..00bc36f09 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventJoinServer.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventJoinServer.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; import net.minecraft.client.player.LocalPlayer; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.ClientPlayerEntityHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -10,6 +11,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Network & Chat") @Event(value = "JoinServer", oldName = "JOIN_SERVER") public class EventJoinServer extends BaseEvent { public final ClientPlayerEntityHelper player; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventNameChange.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventNameChange.java index 26392a651..e734645d6 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventNameChange.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventNameChange.java @@ -3,6 +3,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.TextHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.entity.EntityHelper; @@ -13,6 +14,7 @@ * @author aMelonRind * @since 1.9.1 */ +@DocletCategory("Other") @Event(value = "NameChange", cancellable = true) public class EventNameChange extends BaseEvent { public final EntityHelper entity; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventPlayerJoin.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventPlayerJoin.java index 09e91dab6..2a854b398 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventPlayerJoin.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventPlayerJoin.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; import net.minecraft.client.multiplayer.PlayerInfo; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.PlayerListEntryHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -12,6 +13,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Network & Chat") @Event(value = "PlayerJoin", oldName = "PLAYER_JOIN") public class EventPlayerJoin extends BaseEvent { public final String UUID; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventPlayerLeave.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventPlayerLeave.java index a6c71f7a1..e8a2e6f95 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventPlayerLeave.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventPlayerLeave.java @@ -1,6 +1,7 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; import net.minecraft.client.multiplayer.PlayerInfo; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.helper.world.PlayerListEntryHelper; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; @@ -12,6 +13,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("Network & Chat") @Event(value = "PlayerLeave", oldName = "PLAYER_LEAVE") public class EventPlayerLeave extends BaseEvent { public final String UUID; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventSound.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventSound.java index fa602e647..ae54d9f07 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventSound.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventSound.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.api.math.Pos3D; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; @@ -10,6 +11,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("World") @Event(value = "Sound", oldName = "SOUND", cancellable = true) public class EventSound extends BaseEvent { @DocletReplaceReturn("SoundId") diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventTick.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventTick.java index 66c086596..b28c703ea 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventTick.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/event/impl/world/EventTick.java @@ -1,5 +1,6 @@ package xyz.wagyourtail.jsmacros.client.api.event.impl.world; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.core.event.BaseEvent; import xyz.wagyourtail.jsmacros.core.event.Event; @@ -8,6 +9,7 @@ * @author Wagyourtail * @since 1.2.7 */ +@DocletCategory("World") @Event(value = "Tick", oldName = "TICK") public class EventTick extends BaseEvent { public EventTick() { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/CommandContextHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/CommandContextHelper.java index c6c2f467e..9ba52ac4d 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/CommandContextHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/CommandContextHelper.java @@ -39,6 +39,7 @@ /** * @since 1.4.2 */ +@DocletCategory("System & Lifecycle") @Event("CommandContext") @SuppressWarnings("unused") public class CommandContextHelper extends BaseEvent { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/CommandNodeHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/CommandNodeHelper.java index 86502a8ce..a03fee401 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/CommandNodeHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/CommandNodeHelper.java @@ -1,8 +1,10 @@ package xyz.wagyourtail.jsmacros.client.api.helper; import com.mojang.brigadier.tree.CommandNode; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.core.helpers.BaseHelper; +@DocletCategory("Commands") public class CommandNodeHelper extends BaseHelper { public final CommandNode fabric; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/OptionsHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/OptionsHelper.java index f1e4a8540..92fd0002d 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/OptionsHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/OptionsHelper.java @@ -19,6 +19,7 @@ import net.minecraft.world.entity.player.PlayerModelPart; import org.apache.commons.lang3.ArrayUtils; import org.lwjgl.glfw.GLFW; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletDeclareType; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.doclet.DocletReplaceReturn; @@ -39,6 +40,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Configuration and Profiles") @SuppressWarnings("unused") public class OptionsHelper extends BaseHelper { @@ -390,6 +392,7 @@ private MixinSimpleOption getBase(OptionInstance option) { return (MixinSimpleOption) (Object) option; } + @DocletCategory("Configuration and Profiles") public class SkinOptionsHelper { public final OptionsHelper parent; @@ -567,6 +570,7 @@ public SkinOptionsHelper toggleMainHand(String hand) { } + @DocletCategory("Configuration and Profiles") public class VideoOptionsHelper { public final OptionsHelper parent; @@ -1125,6 +1129,7 @@ public VideoOptionsHelper enableAutosaveIndicator(boolean val) { } + @DocletCategory("Configuration and Profiles") public class MusicOptionsHelper { public final OptionsHelper parent; @@ -1406,6 +1411,7 @@ public MusicOptionsHelper showSubtitles(boolean val) { } + @DocletCategory("Configuration and Profiles") public class ControlOptionsHelper { public final OptionsHelper parent; @@ -1685,6 +1691,7 @@ public Map> getKeyBindsByCategory() { } + @DocletCategory("Configuration and Profiles") public class ChatOptionsHelper { public final OptionsHelper parent; @@ -2035,6 +2042,7 @@ public ChatOptionsHelper reduceDebugInfo(boolean val) { } + @DocletCategory("Configuration and Profiles") public class AccessibilityOptionsHelper { public final OptionsHelper parent; diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/CreativeItemStackHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/CreativeItemStackHelper.java index 2288254a9..627ff2605 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/CreativeItemStackHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/CreativeItemStackHelper.java @@ -12,6 +12,7 @@ import net.minecraft.world.item.component.TooltipDisplay; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.ItemEnchantments; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.jsmacros.client.api.classes.TextBuilder; import xyz.wagyourtail.jsmacros.client.api.helper.TextHelper; @@ -24,6 +25,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Items and Enchantments") @SuppressWarnings("unused") public class CreativeItemStackHelper extends ItemStackHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/EnchantmentHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/EnchantmentHelper.java index c8e7fcd6f..771b177cb 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/EnchantmentHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/EnchantmentHelper.java @@ -8,6 +8,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.EnchantmentTags; import net.minecraft.world.item.enchantment.Enchantment; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.helper.TextHelper; @@ -20,6 +21,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Items and Enchantments") @SuppressWarnings("unused") public class EnchantmentHelper extends BaseHelper> { private static final Minecraft mc = Minecraft.getInstance(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/FoodComponentHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/FoodComponentHelper.java index acde99f7e..6a8fed8b6 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/FoodComponentHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/FoodComponentHelper.java @@ -1,12 +1,14 @@ package xyz.wagyourtail.jsmacros.client.api.helper.inventory; import net.minecraft.world.food.FoodProperties; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.core.helpers.BaseHelper; /** * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Items and Enchantments") @SuppressWarnings("unused") public class FoodComponentHelper extends BaseHelper { diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/ItemHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/ItemHelper.java index 47119a121..8df0c0279 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/ItemHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/ItemHelper.java @@ -9,6 +9,7 @@ import net.minecraft.tags.DamageTypeTags; import net.minecraft.world.item.*; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.helper.TextHelper; import xyz.wagyourtail.jsmacros.client.api.helper.world.BlockHelper; @@ -24,6 +25,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Items and Enchantments") @SuppressWarnings("unused") public class ItemHelper extends BaseHelper { private static final Minecraft mc = Minecraft.getInstance(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/ItemStackHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/ItemStackHelper.java index 2392d4c98..2261f3f37 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/ItemStackHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/ItemStackHelper.java @@ -22,6 +22,7 @@ import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.ItemEnchantments; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.doclet.DocletReplaceParams; import xyz.wagyourtail.doclet.DocletReplaceReturn; import xyz.wagyourtail.jsmacros.client.api.classes.RegistryHelper; @@ -42,6 +43,7 @@ /** * @author Wagyourtail */ +@DocletCategory("Items and Enchantments") @SuppressWarnings("unused") public class ItemStackHelper extends BaseHelper { private static final Style LORE_STYLE = Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE).withItalic(true); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/RecipeHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/RecipeHelper.java index fed1a7cb9..08abf1d7e 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/RecipeHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/inventory/RecipeHelper.java @@ -9,6 +9,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.display.RecipeDisplayEntry; import net.minecraft.world.item.crafting.display.SlotDisplayContext; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.core.helpers.BaseHelper; import java.util.ArrayList; @@ -19,6 +20,7 @@ * @author Wagyourtail * @since 1.3.1 */ +@DocletCategory("Items and Enchantments") @SuppressWarnings("unused") public class RecipeHelper extends BaseHelper { private static final Minecraft mc = Minecraft.getInstance(); diff --git a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/screen/ButtonWidgetHelper.java b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/screen/ButtonWidgetHelper.java index 0a37fe3e6..ee1a8fc9b 100644 --- a/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/screen/ButtonWidgetHelper.java +++ b/common/src/main/java/xyz/wagyourtail/jsmacros/client/api/helper/screen/ButtonWidgetHelper.java @@ -5,6 +5,7 @@ import net.minecraft.client.gui.components.WidgetSprites; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; +import xyz.wagyourtail.doclet.DocletCategory; import xyz.wagyourtail.jsmacros.client.JsMacrosClient; import xyz.wagyourtail.jsmacros.client.api.classes.render.IScreen; import xyz.wagyourtail.jsmacros.core.MethodWrapper; @@ -15,6 +16,7 @@ * @author Etheradon * @since 1.8.4 */ +@DocletCategory("Screen and UI Elements") public class ButtonWidgetHelper extends ClickableWidgetHelper, T> { public ButtonWidgetHelper(T btn) { @@ -29,6 +31,7 @@ public ButtonWidgetHelper(T btn, int zIndex) { * @author Etheradon * @since 1.8.4 */ + @DocletCategory("Screen and UI Elements") public static class ButtonBuilder extends AbstractWidgetBuilder> { @Nullable @@ -103,6 +106,7 @@ public ButtonWidgetHelper