diff --git a/core/src/mindustry/ui/fragments/ChatFragment.java b/core/src/mindustry/ui/fragments/ChatFragment.java index 58b7735c23..75eaac5ab0 100644 --- a/core/src/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/mindustry/ui/fragments/ChatFragment.java @@ -15,7 +15,6 @@ import arc.util.*; import mindustry.*; import mindustry.gen.*; import mindustry.input.*; -import mindustry.type.*; import mindustry.ui.*; import static arc.Core.*; @@ -206,7 +205,7 @@ public class ChatFragment extends Table{ } }else{ //sending chat has a delay; workaround for issue #1943 - Time.run(2f, () ->{ + Time.runTask(2f, () ->{ scene.setKeyboardFocus(null); shown = false; scrollPos = 0; diff --git a/gradle.properties b/gradle.properties index 67ecd167b9..7c0f949677 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=d23d0f0b3625ab2d7d97e6c89a773ab6a4ad8434 +archash=afbb1f5080df42d0629d5997a3f1b14dafc467bf diff --git a/tools/src/mindustry/tools/BindingsGenerator.java b/tools/src/mindustry/tools/BindingsGenerator.java new file mode 100644 index 0000000000..83d3dd7975 --- /dev/null +++ b/tools/src/mindustry/tools/BindingsGenerator.java @@ -0,0 +1,102 @@ +package mindustry.tools; + +import arc.files.*; +import arc.struct.*; +import arc.util.*; + +import java.lang.reflect.*; + +import static mindustry.tools.ScriptMainGenerator.*; + +//experimental +public class BindingsGenerator{ + + public static void main(String[] args) throws Exception{ + + Seq blacklist = Seq.with("mindustry.tools", "arc.backend"); + Seq> classes = Seq.withArrays( + getClasses("mindustry"), + getClasses("arc") + ); + classes.sort(Structs.comparing(Class::getName)); + + classes.removeAll(type -> type.isSynthetic() || type.isAnonymousClass() || type.getCanonicalName() == null || Modifier.isPrivate(type.getModifiers()) + || blacklist.contains(s -> type.getName().startsWith(s))); + + classes.distinct(); + classes.sortComparing(Class::getName); + + StringBuilder result = new StringBuilder(); + result.append("import jnim, jnim/java/lang\n\n{.experimental: \"codeReordering\".}\n\n"); + + for(Class type : classes){ + String name = type.getCanonicalName(); + result.append("jclass ").append(name).append("* of ") + .append(type.getSuperclass() == null ? "JVMObject" : type.getSuperclass().getSimpleName()).append(":\n"); + + for(Field field : type.getFields()){ + if(Modifier.isPublic(field.getModifiers())){ + result.append(" proc `").append(field.getName()).append("`*"); + result.append(": ").append(str(field.getType())); + result.append(" {.prop"); + if(Modifier.isStatic(field.getModifiers())) result.append(", `static`"); + if(Modifier.isStatic(field.getModifiers())) result.append(", `final`"); + result.append(".}\n"); + } + } + + Seq exec = new Seq<>(); + + exec.addAll(type.getDeclaredMethods()); + exec.addAll(type.getDeclaredConstructors()); + + for(Executable method : exec){ + if(Modifier.isPublic(method.getModifiers())){ + String mname = method.getName().equals("") || method.getName().equals(type.getCanonicalName()) ? "new" : method.getName(); + result.append(" proc `").append(mname).append("`*"); + + if(method.getParameterCount() > 0){ + result.append("("); + + for(int i = 0; i < method.getParameterCount(); i++){ + Class p = method.getParameterTypes()[i]; + + result.append(method.getParameters()[i].getName()).append(": ").append(str(p)); + + if(i != method.getParameterCount() - 1){ + result.append(", "); + } + } + + result.append(")"); + } + + if(method instanceof Method){ + Method m = (Method)method; + if(!m.getReturnType().equals(void.class)){ + result.append(": ").append(str(m.getReturnType())); + } + } + + //result.append(" {."); + //if(Modifier.isStatic(field.getModifiers())) result.append(", `static`"); + //if(Modifier.isStatic(field.getModifiers())) result.append(", `final`"); + //result.append(".}\n"); + result.append("\n"); + } + } + result.append("\n"); + } + + Fi.get(OS.userhome).child("mindustry.nim").writeString(result.toString()); + Log.info(result); + } + + static String str(Class type){ + if(type.isArray()){ + return "seq[" + str(type.getComponentType()) + "]"; + } + if(type.isPrimitive()) return "j" + type.getSimpleName(); + return type.getSimpleName(); + } +} diff --git a/tools/src/mindustry/tools/ScriptMainGenerator.java b/tools/src/mindustry/tools/ScriptMainGenerator.java index cfc248dca4..256ed66531 100644 --- a/tools/src/mindustry/tools/ScriptMainGenerator.java +++ b/tools/src/mindustry/tools/ScriptMainGenerator.java @@ -71,8 +71,7 @@ public class ScriptMainGenerator{ new Fi("core/assets/scripts/global.js").writeString(result.toString()); } - - private static Seq getClasses(String packageName) throws Exception{ + public static Seq getClasses(String packageName) throws Exception{ ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Seq dirs = new Seq<>(); @@ -87,7 +86,7 @@ public class ScriptMainGenerator{ return classes; } - private static Seq findClasses(File directory, String packageName) throws Exception{ + public static Seq findClasses(File directory, String packageName) throws Exception{ Seq classes = new Seq<>(); if(!directory.exists()) return classes;