From 50b8f092a45b9824e089115ea27fd15ae4c0b165 Mon Sep 17 00:00:00 2001 From: MaXFeeD Date: Wed, 14 Feb 2024 04:20:03 +0300 Subject: [PATCH] =?UTF-8?q?build:=20=D0=AD=D0=BA=D1=81=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D0=B5=20=D1=81=D0=B6=D0=B0=D1=82=D0=B8=D0=B5=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D1=8B=20=D0=BF=D0=BB?= =?UTF-8?q?=D0=B0=D0=B3=D0=B8=D0=BD=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 14 +++ .../reider745/api/hooks/RebuildJavadoc.java | 83 +++++++------ tools/package.json | 11 -- tools/rebuild-numeric-ids.ts | 109 ------------------ tools/tsconfig.json | 13 --- 5 files changed, 62 insertions(+), 168 deletions(-) delete mode 100644 tools/package.json delete mode 100644 tools/rebuild-numeric-ids.ts delete mode 100644 tools/tsconfig.json diff --git a/build.gradle b/build.gradle index c15f6cb3..2f4b7cda 100644 --- a/build.gradle +++ b/build.gradle @@ -70,4 +70,18 @@ task rebuildAndroidStubs(type: JavaExec, dependsOn: classes) { classpath = sourceSets.main.runtimeClasspath mainClass = 'com.reider745.api.hooks.RebuildJavadoc' + args '.todo/android.jar', 'iclibs/android.jar', 'proxy' +} + +task rebuildZoteStubs(type: JavaExec, dependsOn: jar) { + javaLauncher = javaToolchains.launcherFor { + def javaVersion = JavaVersion.toVersion(targetJavaVersion) + if (JavaVersion.current() < javaVersion) { + languageVersion = JavaLanguageVersion.of(targetJavaVersion) + } + } + + classpath = sourceSets.main.runtimeClasspath + mainClass = 'com.reider745.api.hooks.RebuildJavadoc' + args "build/libs/${project.name}-${project.version}.jar", ".todo/${project.name}-${project.version}.jar" } diff --git a/src/main/java/com/reider745/api/hooks/RebuildJavadoc.java b/src/main/java/com/reider745/api/hooks/RebuildJavadoc.java index 97d497ef..9c5993b5 100644 --- a/src/main/java/com/reider745/api/hooks/RebuildJavadoc.java +++ b/src/main/java/com/reider745/api/hooks/RebuildJavadoc.java @@ -25,13 +25,15 @@ public class RebuildJavadoc { private Set singletonClasses; private Set rewrittenSingletonClasses; private int offset, length; + private boolean requiresProxies; - public RebuildJavadoc() { + public RebuildJavadoc(boolean requiresProxies) { if (logger == null) { logger = LoggerFactory.getLogger(RebuildJavadoc.class); } - singletonClasses = null; - rewrittenSingletonClasses = null; + this.singletonClasses = null; + this.rewrittenSingletonClasses = null; + this.requiresProxies = requiresProxies; } private static String getStubValue(CtClass retType) { @@ -84,11 +86,13 @@ public class RebuildJavadoc { private String getStubReturnForMethod(CtMethod method) throws NotFoundException { CtClass returnType = method.getReturnType(); - if ((method.getModifiers() & AccessFlag.STATIC) == 0 && returnType.equals(method.getDeclaringClass())) { - return "this"; - } - if (returnType.getName().contains(".")) { - singletonClasses.add(returnType.getName()); + if (requiresProxies) { + if ((method.getModifiers() & AccessFlag.STATIC) == 0 && returnType.equals(method.getDeclaringClass())) { + return "this"; + } + if (returnType.getName().contains(".")) { + singletonClasses.add(returnType.getName()); + } } return getStubValue(returnType); } @@ -177,24 +181,26 @@ public class RebuildJavadoc { parameters.append(getStubValue(parameter)); } - CtField newInstanceField = new CtField(ctClass, "singletonInternalProxy", ctClass); - newInstanceField.setModifiers(AccessFlag.PRIVATE | AccessFlag.STATIC); - ctClass.addField(newInstanceField); - CtMethod newInstance = new CtMethod(ctClass, "getSingletonInternalProxy", new CtClass[0], ctClass); - newInstance.setExceptionTypes(minimumConstructor.getExceptionTypes()); - newInstance.setModifiers(AccessFlag.PUBLIC | AccessFlag.STATIC); + if (requiresProxies) { + CtField newInstanceField = new CtField(ctClass, "singletonInternalProxy", ctClass); + newInstanceField.setModifiers(AccessFlag.PRIVATE | AccessFlag.STATIC); + ctClass.addField(newInstanceField); + CtMethod newInstance = new CtMethod(ctClass, "getSingletonInternalProxy", new CtClass[0], ctClass); + newInstance.setExceptionTypes(minimumConstructor.getExceptionTypes()); + newInstance.setModifiers(AccessFlag.PUBLIC | AccessFlag.STATIC); - StringBuilder bodyBuilder = new StringBuilder(); - bodyBuilder.append("{ if (singletonInternalProxy == null) { singletonInternalProxy = new "); - if (parameters.isEmpty()) { - bodyBuilder.append(ctClass.getName() + "()"); - } else { - bodyBuilder.append(ctClass.getName() + "(" + parameters.toString() + ")"); + StringBuilder bodyBuilder = new StringBuilder(); + bodyBuilder.append("{ if (singletonInternalProxy == null) { singletonInternalProxy = new "); + if (parameters.isEmpty()) { + bodyBuilder.append(ctClass.getName() + "()"); + } else { + bodyBuilder.append(ctClass.getName() + "(" + parameters.toString() + ")"); + } + bodyBuilder.append("; } return singletonInternalProxy; }"); + newInstance.setBody(bodyBuilder.toString()); + + ctClass.addMethod(newInstance); } - bodyBuilder.append("; } return singletonInternalProxy; }"); - newInstance.setBody(bodyBuilder.toString()); - - ctClass.addMethod(newInstance); } private void overrideSingletonsInClass(CtClass ctClass) @@ -255,8 +261,8 @@ public class RebuildJavadoc { } ClassPool.releaseUnmodifiedClassFile = false; - final ClassPool classPool = new ClassPool(); - classPool.insertClassPath(jarFile.getPath()); + final ClassPool classPool = new ClassPool(!requiresProxies); + classPool.appendClassPath(jarFile.getPath()); singletonClasses = new HashSet<>(); List classes = ClassLoaderPatch.fetchClassesFromJar(jarFile); @@ -267,9 +273,13 @@ public class RebuildJavadoc { for (String className : classes) { if (!(className.startsWith("java.") || className.startsWith("javax.") || className.startsWith("org.json."))) { - CtClass ctClass = classPool.get(className); - cachedClasses.put(className, ctClass); - overrideClass(ctClass); + try { + CtClass ctClass = classPool.get(className); + overrideClass(ctClass); + cachedClasses.put(className, ctClass); + } catch (Throwable th) { + logger.warn("\r" + className + ": " + th.getLocalizedMessage()); + } } if (offset % 100 == 0) { System.out.print(String.format( @@ -281,7 +291,7 @@ public class RebuildJavadoc { } boolean singletonsRequired = !singletonClasses.isEmpty(); - if (singletonsRequired) { + if (requiresProxies && singletonsRequired) { rewrittenSingletonClasses = new HashSet<>(); length += singletonClasses.size(); for (String className : singletonClasses) { @@ -304,11 +314,11 @@ public class RebuildJavadoc { } } - for (String className : classes) { + for (String className : cachedClasses.keySet()) { if (!(className.startsWith("java.") || className.startsWith("javax.") || className.startsWith("org.json."))) { CtClass ctClass = cachedClasses.get(className); - if (singletonsRequired) { + if (requiresProxies && singletonsRequired) { overrideSingletonsInClass(ctClass); } ctClass.writeFile(outputDirectoryPath); @@ -345,8 +355,11 @@ public class RebuildJavadoc { } public static void main(String[] args) { - File jarFile = Paths.get(".todo", "android.jar").toAbsolutePath().toFile(); - File outputJarFile = Paths.get("iclibs", "android.jar").toAbsolutePath().toFile(); - new RebuildJavadoc().rebuild(jarFile, outputJarFile); + if (args.length < 2 || args[0] == null || args[1] == null) { + throw new IllegalArgumentException("in == null || out == null"); + } + File jarFile = Path.of(args[0]).toAbsolutePath().toFile(); + File outputJarFile = Path.of(args[1]).toAbsolutePath().toFile(); + new RebuildJavadoc(args.length > 2 && args[2] != null ? args[2].equalsIgnoreCase("proxy") : false).rebuild(jarFile, outputJarFile); } } diff --git a/tools/package.json b/tools/package.json deleted file mode 100644 index 9e25130f..00000000 --- a/tools/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "devDependencies": { - "@types/node": "^20.6.5" - }, - "scripts": { - "rebuildNumericIds": "tsx rebuild-numeric-ids.ts" - }, - "dependencies": { - "tsx": "^4.6.1" - } -} diff --git a/tools/rebuild-numeric-ids.ts b/tools/rebuild-numeric-ids.ts deleted file mode 100644 index a4a726cb..00000000 --- a/tools/rebuild-numeric-ids.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { readFileSync as readFile, writeFileSync as writeFile, existsSync as exists } from 'fs' - -let legacyItemIds = JSON.parse(readFile('legacy_item_ids.json', { encoding: "utf-8" })) -let numericIdsPath = 'numeric_ids.json' -let numericIds = JSON.parse(readFile(numericIdsPath, { encoding: "utf-8" })) - -for (const key of Object.keys(legacyItemIds).slice()) { - let colonIndex = key.indexOf(":") - let untokenizedKey = key.replace(/\./g, '_') - legacyItemIds[ - colonIndex != -1 ? untokenizedKey.substring(colonIndex + 1) : untokenizedKey - ] = legacyItemIds[key] - delete legacyItemIds[key] -} - -let legacyItemIdsRaw = Object.assign({}, legacyItemIds) - -let legacyItemIdsInline = {} -for (const key in legacyItemIds) { - legacyItemIdsInline[key.replace(/_/g, '')] = key -} - -const rebuildNumericIds = numericIds => { - let changes = 0 - for (const key of Object.keys(numericIds.blocks)) { - let targetKey = 'item_' + key - if (!(targetKey in legacyItemIdsRaw)) { - targetKey = key.replace('stone_', 'stone_block_') - if (!(targetKey in legacyItemIdsRaw)) { - if (key in legacyItemIdsInline) { - targetKey = legacyItemIdsInline[key] - } - if (!(targetKey in legacyItemIdsRaw)) { - targetKey = key - } - } - } - let prefix = ' '.repeat(4) + 'block/' + targetKey - if (prefix.length > 57) { - prefix = prefix.substring(0, 54) + '...' - } else { - prefix = prefix + ' '.repeat(57 - prefix.length) - } - if (targetKey in legacyItemIds && legacyItemIds[targetKey] < 256) { - let replacementId = legacyItemIds[targetKey] < 0 ? 255 - legacyItemIds[targetKey] : legacyItemIds[targetKey] - delete legacyItemIds[targetKey] - if (replacementId == numericIds.blocks[key]) { - continue - } - console.debug(prefix + numericIds.blocks[key] + ' -> ' + replacementId) - numericIds.blocks[key] = replacementId - changes++ - } else if (!(targetKey in legacyItemIdsRaw)) { - console.log(prefix + numericIds.blocks[key]) - } - } - for (const key of Object.keys(numericIds.items)) { - let prefix = ' '.repeat(4) + 'item/' + key - if (prefix.length > 57) { - prefix = prefix.substring(0, 54) + '...' - } else { - prefix = prefix + ' '.repeat(57 - prefix.length) - } - if (key in legacyItemIds && legacyItemIds[key] >= 256) { - let replacementId = legacyItemIds[key] - delete legacyItemIds[key] - if (replacementId == numericIds.items[key]) { - continue - } - console.debug(prefix + numericIds.items[key] + ' -> ' + replacementId) - numericIds.items[key] = replacementId - changes++ - } else if (!(key in legacyItemIdsRaw)) { - console.log(prefix + numericIds.items[key]) - } - } - return changes -} - -console.info('Merging numeric ids with legacy...') -let numericIdsChanges = rebuildNumericIds(numericIds) -if (numericIdsChanges > 0) console.info(`Merged ${numericIdsChanges} rebuilt ids!`) -writeFile(numericIdsPath, JSON.stringify(numericIds, null, ' '.repeat(4))) - -let index = 0, numericIdsOverridePath -while (exists(numericIdsOverridePath = `numeric_ids_override_${index}.json`)) { - console.info(`Merging numeric ids overrides ${index} with legacy...`) - let numericIdsOverride = JSON.parse(readFile(numericIdsOverridePath, { encoding: "utf-8" })) - let numericIdsOverrideChanges = rebuildNumericIds(numericIdsOverride) - if (numericIdsOverrideChanges > 0) console.info(`Merged overriden ${numericIdsOverrideChanges} rebuilt ids!`) - writeFile(numericIdsOverridePath, JSON.stringify(numericIdsOverride, null, ' '.repeat(4))) - index++ -} - -let unexpectedIds = { blocks: {}, items: {} }, unexpected = 0 - -for (const key in legacyItemIds) { - if (legacyItemIds[key] >= 256) { - unexpectedIds.items[key] = legacyItemIds[key] - } else { - unexpectedIds.blocks[key] = legacyItemIds[key] < 0 ? 255 - legacyItemIds[key] : legacyItemIds[key] - } - unexpected++ -} - -if (unexpected > 0) { - console.info(`Flushing missing ${unexpected} numeric legacy ids...`) - writeFile(numericIdsOverridePath, JSON.stringify(unexpectedIds, null, ' '.repeat(4))) -} diff --git a/tools/tsconfig.json b/tools/tsconfig.json deleted file mode 100644 index 347bf03f..00000000 --- a/tools/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "module": "ESNext", - "moduleResolution": "Node", - "target": "ES2020", - "strictNullChecks": true, - "strictFunctionTypes": true - }, - "exclude": [ - "node_modules", - "**/node_modules/*" - ] -} \ No newline at end of file