75 lines
2.5 KiB
Java
75 lines
2.5 KiB
Java
package ᴶᐩᐩ.ᒡᒢᑊᒻᒻᓫᔿ.ᒃᣔᒃᓫᒻ;
|
||
|
||
import java.lang.instrument.ClassFileTransformer;
|
||
import java.lang.instrument.IllegalClassFormatException;
|
||
import java.lang.reflect.Method;
|
||
import java.security.ProtectionDomain;
|
||
import java.util.Optional;
|
||
|
||
import love.distributedrebirth.bassboon.DefaultBȍőnLoader;
|
||
import ᴶᐩᐩ.ᒡᒢᑊᒻᒻᓫᔿ.ᒃᣔᒃᓫᒻ.ᑊᐣᓑᖮᐪᔆ.DuytsDocAuthor注;
|
||
|
||
@DuytsDocAuthor注(name = "للَّٰهِilLצسُو", copyright = "©Δ∞ 仙上主天")
|
||
public class BabelLocalizer邪ᙾ implements ClassFileTransformer {
|
||
|
||
// not tested
|
||
@Override
|
||
public byte[] transform(Module module, ClassLoader loader, String className,
|
||
Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer)
|
||
throws IllegalClassFormatException {
|
||
if (!BabelLocalizer.class.isAssignableFrom(classBeingRedefined)) {
|
||
return null;
|
||
}
|
||
|
||
// xxxᴬᵖᶦ objects
|
||
for (Class<?> embeddedClass:classBeingRedefined.getDeclaredClasses()) {
|
||
|
||
// todo: check declared class, like this ?
|
||
if (Babelizeբᴬᵖᶦ.class.isAssignableFrom(classBeingRedefined) && BabelMethodƉěꬵḭȵᶒᴬᵖᶦ.class.isAssignableFrom(embeddedClass)) {
|
||
// check B
|
||
}
|
||
if (BabelMethodƉěꬵḭȵᶒᴬᵖᶦ.class.isAssignableFrom(classBeingRedefined) && BabelTypeTower抽.class.isAssignableFrom(embeddedClass)) {
|
||
// check T
|
||
}
|
||
}
|
||
|
||
// babel translated object interfaces
|
||
Optional<Class<?>> checkMethodNameInterface = DefaultBȍőnLoader.findInterfaceByAnnotation(classBeingRedefined, BabelMethodNameEnforcer注.class);
|
||
if (checkMethodNameInterface.isEmpty()) {
|
||
return null;
|
||
}
|
||
BabelMethodNameEnforcer注 checkMethodName = checkMethodNameInterface.get().getAnnotation(BabelMethodNameEnforcer注.class);
|
||
if (checkMethodName == null) {
|
||
return null;
|
||
}
|
||
for (Method m:classBeingRedefined.getMethods()) {
|
||
if (m.getName().startsWith("toBabel")) {
|
||
continue;
|
||
}
|
||
boolean def = false;
|
||
for (Method mo:Object.class.getMethods()) { // java is evil, junk default methods....
|
||
if (m.getName().equals(mo.getName())) {
|
||
def = true;
|
||
break;
|
||
}
|
||
}
|
||
if (def) {
|
||
continue;
|
||
}
|
||
for (int c:m.getName().codePoints().toArray()) {
|
||
boolean allow = false;
|
||
for (BabelMethodNameRange注 range:checkMethodName.ranges()) {
|
||
if (c >= range.start() || c <= range.stop()) {
|
||
allow = true;
|
||
break;
|
||
}
|
||
}
|
||
if (!allow) {
|
||
throw new IllegalClassFormatException("Illegal unicode char in method name: "+m);
|
||
}
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
}
|