This commit is contained in:
Anuken
2020-07-30 10:51:43 -04:00
parent bc8f02666a
commit c3a073fbbf
10 changed files with 119 additions and 39 deletions

View File

@@ -1,22 +1,19 @@
package mindustry.tools;
import arc.*;
import arc.struct.Seq;
import arc.struct.*;
import arc.files.*;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.graphics.g2d.TextureAtlas.*;
import arc.math.*;
import arc.struct.*;
import arc.util.*;
import mindustry.game.*;
import mindustry.gen.*;
import org.reflections.*;
import org.reflections.scanners.*;
import org.reflections.util.*;
import java.io.*;
import java.lang.reflect.*;
import java.net.*;
import java.util.*;
public class ScriptStubGenerator{
@@ -26,28 +23,18 @@ public class ScriptStubGenerator{
Seq<String> blacklist = Seq.with("plugin", "mod", "net", "io", "tools");
Seq<String> nameBlacklist = Seq.with("ClassAccess");
Seq<Class<?>> whitelist = Seq.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class,
AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class,
Sounds.class, Musics.class, Call.class, Texture.class, TextureData.class, Pixmap.class, I18NBundle.class, Interval.class, DataInput.class, DataOutput.class,
DataInputStream.class, DataOutputStream.class, Integer.class, Float.class, Double.class, Long.class, Boolean.class, Short.class, Byte.class, Character.class);
AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class,
Sounds.class, Musics.class, Call.class, Texture.class, TextureData.class, Pixmap.class, I18NBundle.class, Interval.class, DataInput.class, DataOutput.class,
DataInputStream.class, DataOutputStream.class, Integer.class, Float.class, Double.class, Long.class, Boolean.class, Short.class, Byte.class, Character.class);
Seq<String> nopackage = Seq.with("java.lang", "java");
List<ClassLoader> classLoadersList = new LinkedList<>();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());
Reflections reflections = new Reflections(new ConfigurationBuilder()
.setScanners(new SubTypesScanner(false), new ResourcesScanner())
.setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
.filterInputsBy(new FilterBuilder()
.include(FilterBuilder.prefix("mindustry"))
.include(FilterBuilder.prefix("arc.func"))
.include(FilterBuilder.prefix("arc.struct"))
.include(FilterBuilder.prefix("arc.scene"))
.include(FilterBuilder.prefix("arc.math"))
));
Seq<Class<?>> classes = Seq.with(reflections.getSubTypesOf(Object.class));
classes.addAll(reflections.getSubTypesOf(Enum.class));
Seq<Class<?>> classes = Seq.withArrays(
getClasses("mindustry"),
getClasses("arc.func"),
getClasses("arc.struct"),
getClasses("arc.scene"),
getClasses("arc.math")
);
classes.addAll(whitelist);
classes.sort(Structs.comparing(Class::getName));
@@ -72,4 +59,35 @@ public class ScriptStubGenerator{
new Fi("core/assets/scripts/global.js").writeString(result.toString());
}
private static Seq<Class> getClasses(String packageName) throws Exception{
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Seq<File> dirs = new Seq<>();
for(URL resource : Collections.list(classLoader.getResources(packageName.replace('.', '/')))){
dirs.add(new File(resource.getFile()));
}
Seq<Class> classes = new Seq<>();
for(File directory : dirs){
classes.addAll(findClasses(directory, packageName));
}
return classes;
}
private static Seq<Class> findClasses(File directory, String packageName) throws Exception{
Seq<Class> classes = new Seq<>();
if(!directory.exists()) return classes;
File[] files = directory.listFiles();
for(File file : files){
if(file.isDirectory()){
classes.addAll(findClasses(file, packageName + "." + file.getName()));
}else if(file.getName().endsWith(".class")){
classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6), false, Thread.currentThread().getContextClassLoader()));
}
}
return classes;
}
}