mirror of
				https://github.com/eaglerforge/EaglerForge-old.git
				synced 2025-06-05 17:20:57 -05:00 
			
		
		
		
	NoReflect: Static functions, autoimports, sparse inclusion
This commit is contained in:
		
							parent
							
								
									b4da547505
								
							
						
					
					
						commit
						9576c62734
					
				@ -82,26 +82,26 @@ function process(file, reader, classDataDump, className) {
 | 
				
			|||||||
        reader.addEventListener("load", ()=>{
 | 
					        reader.addEventListener("load", ()=>{
 | 
				
			||||||
            var output = reader.result;
 | 
					            var output = reader.result;
 | 
				
			||||||
            classDataDump[className] = (reconJ(output, className));
 | 
					            classDataDump[className] = (reconJ(output, className));
 | 
				
			||||||
            console.log(classDataDump[className].usedClasses);
 | 
					 | 
				
			||||||
            res(output);
 | 
					            res(output);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        reader.readAsText(file);
 | 
					        reader.readAsText(file);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
function createManagerFile(managerTemplate, config, zip, dataDump) {
 | 
					function createManagerFile(managerTemplate, config, zip, dataDump, classIdMap) {
 | 
				
			||||||
    var manager = managerTemplate;
 | 
					    var manager = managerTemplate;
 | 
				
			||||||
    var filePath = config.managerFile.replaceAll(".", "/") + ".java";
 | 
					    var filePath = config.managerFile.replaceAll(".", "/") + ".java";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (let i = 0; i < config.targetFiles.length; i++) {
 | 
					    for (let i = 0; i < config.targetFiles.length; i++) {
 | 
				
			||||||
        manager = `import ${config.targetFiles[i]}` + ";\n" + manager;
 | 
					        manager = `import ${config.targetFiles[i]}` + ";\n" + manager;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    manager = `package ${config.managerFile.match(/(.*)(?=\.[^.]*$)/g)[0]}` + ";\n" + manager;
 | 
					    var imports = [];
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var classText = "";
 | 
					    var classText = "";
 | 
				
			||||||
    var classes = Object.keys(dataDump);
 | 
					    var classes = Object.keys(dataDump);
 | 
				
			||||||
    for (let i = 0; i < classes.length; i++) {
 | 
					    for (let i = 0; i < classes.length; i++) {
 | 
				
			||||||
        const className = classes[i];
 | 
					        const className = classes[i];
 | 
				
			||||||
 | 
					        imports = [...new Set(imports.concat(dataDump[className].usedClasses))];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var tmpClassText = templateClassdef;
 | 
					        var tmpClassText = templateClassdef;
 | 
				
			||||||
        tmpClassText = tmpClassText.replaceAll("%classname%", className);
 | 
					        tmpClassText = tmpClassText.replaceAll("%classname%", className);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -179,21 +179,39 @@ function createManagerFile(managerTemplate, config, zip, dataDump) {
 | 
				
			|||||||
            tmpMethodText = tmpMethodText.replaceAll("%methodimpl%", method.impl);
 | 
					            tmpMethodText = tmpMethodText.replaceAll("%methodimpl%", method.impl);
 | 
				
			||||||
            methodText += tmpMethodText;
 | 
					            methodText += tmpMethodText;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        tmpClassText = tmpClassText.replaceAll("%methoddefs%", methodText);
 | 
					        tmpClassText = tmpClassText.replaceAll("%methoddefs%", methodText);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        classText += tmpClassText;
 | 
					        classText += tmpClassText;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    for (let i = 0; i < config.imports.length; i++) {
 | 
				
			||||||
 | 
					        manager = `import ${config.imports[i]}` + ";\n" + manager;
 | 
				
			||||||
 | 
					        logTxt(`Force imported classid: ${config.imports[i]}`);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (config.attemptAutoImport) {
 | 
				
			||||||
 | 
					        for (let i = 0; i < imports.length; i++) {
 | 
				
			||||||
 | 
					            if (classIdMap.has(imports[i])) {
 | 
				
			||||||
 | 
					                manager = `import ${classIdMap.get(imports[i])}` + ";\n" + manager;
 | 
				
			||||||
 | 
					                logTxt(`Imported classid: ${classIdMap.get(imports[i])}`);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    manager = `package ${config.managerFile.match(/(.*)(?=\.[^.]*$)/g)[0]}` + ";\n" + manager;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    manager = manager.replaceAll("%classdefs%", classText);
 | 
					    manager = manager.replaceAll("%classdefs%", classText);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    zip.file(filePath, manager);
 | 
					    zip.file(filePath, manager);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
async function generate(fileList) {
 | 
					async function generate(fileList) {
 | 
				
			||||||
 | 
					    var classToLocationMap = new Map();
 | 
				
			||||||
    var cfg;
 | 
					    var cfg;
 | 
				
			||||||
    var output = new JSZip();
 | 
					    var output = new JSZip();
 | 
				
			||||||
    const reader = new FileReader();
 | 
					    const reader = new FileReader();
 | 
				
			||||||
    var classDataDump = {};
 | 
					    var classDataDump = {};
 | 
				
			||||||
    logClear();
 | 
					    logClear();
 | 
				
			||||||
    logTxt("[LOG] Build @ "+(new Date()));
 | 
					    logTxt("[INIT] Build @ "+(new Date()));
 | 
				
			||||||
    if (!fileList || fileList.length === 0) {
 | 
					    if (!fileList || fileList.length === 0) {
 | 
				
			||||||
        logTxt("[ERROR] Filelist is empty.")
 | 
					        logTxt("[ERROR] Filelist is empty.")
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@ -212,14 +230,22 @@ async function generate(fileList) {
 | 
				
			|||||||
        if (file.webkitRelativePath.endsWith(".java")) {
 | 
					        if (file.webkitRelativePath.endsWith(".java")) {
 | 
				
			||||||
            var classId = file.webkitRelativePath.replaceAll("java/", "").replaceAll(".java", "").replaceAll("/", ".");
 | 
					            var classId = file.webkitRelativePath.replaceAll("java/", "").replaceAll(".java", "").replaceAll("/", ".");
 | 
				
			||||||
            var className = classId.split(".")[classId.split(".").length - 1];
 | 
					            var className = classId.split(".")[classId.split(".").length - 1];
 | 
				
			||||||
 | 
					            classToLocationMap.set(className, classId);
 | 
				
			||||||
            if (cfg.targetFiles.includes(classId)) {
 | 
					            if (cfg.targetFiles.includes(classId)) {
 | 
				
			||||||
                logTxt("Found "+classId+" ["+file.name+"], processing...");
 | 
					                logTxt("Found "+classId+" ["+file.name+"], processing...");
 | 
				
			||||||
                output.file(file.webkitRelativePath.replaceAll("java/", ""), await process(file, reader, classDataDump, className));
 | 
					                var javaFileContent = await process(file, reader, classDataDump, className);
 | 
				
			||||||
 | 
					                if (cfg.includeReadFiles) {
 | 
				
			||||||
 | 
					                    output.file(file.webkitRelativePath.replaceAll("java/", ""), javaFileContent);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    logTxt(`Creating manager file...`);
 | 
				
			||||||
 | 
					    createManagerFile(templateManager, cfg, output, classDataDump, classToLocationMap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    logTxt(`Writing log.txt...`);
 | 
				
			||||||
    output.file("log.txt", document.querySelector("#logs").innerText);
 | 
					    output.file("log.txt", document.querySelector("#logs").innerText);
 | 
				
			||||||
    createManagerFile(templateManager, cfg, output, classDataDump);
 | 
					
 | 
				
			||||||
    output.generateAsync({type:"blob"}).then(function(content) {
 | 
					    output.generateAsync({type:"blob"}).then(function(content) {
 | 
				
			||||||
        saveAs(content, "patch.zip");
 | 
					        saveAs(content, "patch.zip");
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,7 @@
 | 
				
			|||||||
            text-shadow: 0px 0px 3px;
 | 
					            text-shadow: 0px 0px 3px;
 | 
				
			||||||
            min-height: 10rem;
 | 
					            min-height: 10rem;
 | 
				
			||||||
            min-width: 50rem;
 | 
					            min-width: 50rem;
 | 
				
			||||||
 | 
					            font-size: 0.8rem;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        textarea:focus {
 | 
					        textarea:focus {
 | 
				
			||||||
            outline: 0;
 | 
					            outline: 0;
 | 
				
			||||||
@ -56,22 +57,52 @@
 | 
				
			|||||||
            color: orange;
 | 
					            color: orange;
 | 
				
			||||||
            text-shadow: 0px 0px 2px;
 | 
					            text-shadow: 0px 0px 2px;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        .crt::after {
 | 
				
			||||||
 | 
					            content: " ";
 | 
				
			||||||
 | 
					            display: block;
 | 
				
			||||||
 | 
					            position: absolute;
 | 
				
			||||||
 | 
					            top: 0;
 | 
				
			||||||
 | 
					            left: 0;
 | 
				
			||||||
 | 
					            bottom: 0;
 | 
				
			||||||
 | 
					            right: 0;
 | 
				
			||||||
 | 
					            background: rgba(18, 16, 16, 0.1);
 | 
				
			||||||
 | 
					            opacity: 0;
 | 
				
			||||||
 | 
					            z-index: 2;
 | 
				
			||||||
 | 
					            pointer-events: none;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .crt::before {
 | 
				
			||||||
 | 
					            content: " ";
 | 
				
			||||||
 | 
					            display: block;
 | 
				
			||||||
 | 
					            position: absolute;
 | 
				
			||||||
 | 
					            top: 0;
 | 
				
			||||||
 | 
					            left: 0;
 | 
				
			||||||
 | 
					            bottom: 0;
 | 
				
			||||||
 | 
					            right: 0;
 | 
				
			||||||
 | 
					            background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.25) 50%), linear-gradient(90deg, rgba(255, 0, 0, 0.06), rgba(0, 255, 0, 0.02), rgba(0, 0, 255, 0.06));
 | 
				
			||||||
 | 
					            z-index: 2;
 | 
				
			||||||
 | 
					            background-size: 100% 2px, 3px 100%;
 | 
				
			||||||
 | 
					            pointer-events: none;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    </style>
 | 
					    </style>
 | 
				
			||||||
    <script src="FileSaver.js"></script>
 | 
					    <script src="FileSaver.js"></script>
 | 
				
			||||||
    <script src="jszip.min.js"></script>
 | 
					    <script src="jszip.min.js"></script>
 | 
				
			||||||
    <script src="javaRecon.js"></script>
 | 
					    <script src="javaRecon.js"></script>
 | 
				
			||||||
    <script src="generate.js"></script>
 | 
					    <script src="generate.js"></script>
 | 
				
			||||||
</head>
 | 
					</head>
 | 
				
			||||||
<body>
 | 
					<body class="crt">
 | 
				
			||||||
<h1>> NoReflect Generator WebUI</h1>
 | 
					<h1>> NoReflect Generator WebUI</h1>
 | 
				
			||||||
<br>
 | 
					<br>
 | 
				
			||||||
<span>Config</span>
 | 
					<span>Config</span>
 | 
				
			||||||
<br>
 | 
					<br>
 | 
				
			||||||
<textarea id="config">
 | 
					<textarea id="config" spellcheck="false">
 | 
				
			||||||
    {
 | 
					{
 | 
				
			||||||
        "targetFiles": ["net.minecraft.item.ItemStack"],
 | 
					    "targetFiles": ["net.minecraft.item.ItemStack", "net.minecraft.client.Minecraft"],
 | 
				
			||||||
        "managerFile": "net.eaglerforge.reflect.PLReflect"
 | 
					    "imports": ["java.lang.String"],
 | 
				
			||||||
    }
 | 
					    "managerFile": "net.eaglerforge.reflect.PLReflect",
 | 
				
			||||||
 | 
					    "includeReadFiles": false,
 | 
				
			||||||
 | 
					    "attemptAutoImport": true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
</textarea>
 | 
					</textarea>
 | 
				
			||||||
<br><br>
 | 
					<br><br>
 | 
				
			||||||
<input id="data" type="file" webkitdirectory>
 | 
					<input id="data" type="file" webkitdirectory>
 | 
				
			||||||
 | 
				
			|||||||
@ -103,22 +103,22 @@ function reconJ(java, className) {
 | 
				
			|||||||
                argStr += ", "
 | 
					                argStr += ", "
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        let prefix = isStatic ? className : `((${className}) params.get("_self"))`;
 | 
				
			||||||
        let impl;
 | 
					        let impl;
 | 
				
			||||||
        if (returnType === "void") {
 | 
					        if (returnType === "void") {
 | 
				
			||||||
            impl = `setCallbackVoidWithArgs("${methodName}", (BaseData params) -> {
 | 
					            impl = `setCallbackVoidWithArgs("${methodName}", (BaseData params) -> {
 | 
				
			||||||
                ((${className}) params.get("_self")).${methodName}(${argStr});
 | 
					                ${prefix}.${methodName}(${argStr});
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            `;
 | 
					            `;
 | 
				
			||||||
        } else if (callbackStatementsTypes.includes(returnType)) {
 | 
					        } else if (callbackStatementsTypes.includes(returnType)) {
 | 
				
			||||||
            impl = `${callbackStatements[returnType]}("${methodName}", (BaseData params) -> {
 | 
					            impl = `${callbackStatements[returnType]}("${methodName}", (BaseData params) -> {
 | 
				
			||||||
                return (${returnType}) ((${className}) params.get("_self")).${methodName}(${argStr});
 | 
					                return (${returnType}) ${prefix}.${methodName}(${argStr});
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            `;
 | 
					            `;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            usedClasses.push(returnType);
 | 
					            usedClasses.push(returnType);
 | 
				
			||||||
            impl = `setCallbackReflectiveWithArgs("${methodName}", (BaseData params) -> {
 | 
					            impl = `setCallbackReflectiveWithArgs("${methodName}", (BaseData params) -> {
 | 
				
			||||||
                return (${returnType}) ((${className}) params.get("_self")).${methodName}(${argStr});
 | 
					                return (${returnType}) ${prefix}.${methodName}(${argStr});
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            `;
 | 
					            `;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -129,7 +129,8 @@ function reconJ(java, className) {
 | 
				
			|||||||
            returnType: returnType,
 | 
					            returnType: returnType,
 | 
				
			||||||
            isStatic: isStatic,
 | 
					            isStatic: isStatic,
 | 
				
			||||||
            arguments: arguments,
 | 
					            arguments: arguments,
 | 
				
			||||||
            impl: impl
 | 
					            impl: impl,
 | 
				
			||||||
 | 
					            idx: methods.indexOf(method)
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user