[TASK] Improved JavaScriptLoader

To look further than just the main class
This commit is contained in:
Jeroen Ketelaar
2019-05-22 00:34:33 -05:00
parent 384d1e4085
commit 2c97fd5177
2 changed files with 45 additions and 6 deletions
@@ -60,7 +60,6 @@ public class LocalJavaScripts extends ScriptParser {
t.printStackTrace(); t.printStackTrace();
} }
} }
} }
} }
@@ -11,7 +11,7 @@ import java.util.List;
/** /**
* An environment to load a script * An environment to load a script
* *
* @author Everel * @author Everel, JKetelaar
*/ */
public class JavaScriptLoader extends ASMClassLoader { public class JavaScriptLoader extends ASMClassLoader {
private ClassPath classPath; private ClassPath classPath;
@@ -27,15 +27,55 @@ public class JavaScriptLoader extends ASMClassLoader {
* @return string array of class names that extends ServerProvider * @return string array of class names that extends ServerProvider
*/ */
public final String[] getScriptClassNames() { public final String[] getScriptClassNames() {
final List<String> classNames = new ArrayList<String>(); final List<String> classNames = new ArrayList<>();
for (ClassNode c : classPath.classes.values()) { for (ClassNode c : classPath.classes.values()) {
if (c.superName.replace('/', '.').equals( if (isScriptClass(c)) {
Script.class.getName())) {
classNames.add(c.name.replace('/', '.')); classNames.add(c.name.replace('/', '.'));
} else {
ClassNode superClass = findClassNodeForName(c.superName);
if (superClass != null && isScriptClass(superClass)) {
classNames.add(c.name.replace('/', '.'));
}
} }
} }
return classNames.toArray(new String[classNames.size()]);
String[] classes = new String[classNames.size()];
for (int i = 0; i < classNames.size(); i++) {
classes[i] = classNames.get(i);
}
return classes;
} }
/**
* Checks if given ClassNode is Script class
*
* @param classNode
*
* @return
*/
private boolean isScriptClass(ClassNode classNode) {
return classNode
.superName
.replace('/', '.')
.equals(Script.class.getName());
}
/**
* Finds a ClassNode instance for a given class name
*
* @param name
*
* @return
*/
private ClassNode findClassNodeForName(String name) {
for (ClassNode classNode : classPath.classes.values()) {
if (classNode.name.equals(name)) {
return classNode;
}
}
return null;
}
} }