diff --git a/NoReflect/generate.js b/NoReflect/generate.js index 99e62a7..81d58cc 100644 --- a/NoReflect/generate.js +++ b/NoReflect/generate.js @@ -36,7 +36,7 @@ reflect_%classname%_constructors.add(reflect_%classname%_constructor_%constructo `; const templateMethod = ` BaseData reflect_%classname%_method_%methodname%_%idx% = new ModData(); -reflect_%classname%_method_%methodname%_%idx%.set("methodName", %methodname%); +reflect_%classname%_method_%methodname%_%idx%.set("methodName", "%methodname%"); reflect_%classname%_method_%methodname%_%idx%.set("returnType", %returntype%); reflect_%classname%_method_%methodname%_%idx%.set("static", %static%); reflect_%classname%_method_%methodname%_%idx%.set("argnames", %argkeys%); @@ -82,6 +82,7 @@ function process(file, reader, classDataDump, className) { reader.addEventListener("load", ()=>{ var output = reader.result; classDataDump[className] = (reconJ(output, className)); + console.log(classDataDump[className].usedClasses); res(output); }); reader.readAsText(file); @@ -92,9 +93,9 @@ function createManagerFile(managerTemplate, config, zip, dataDump) { var filePath = config.managerFile.replaceAll(".", "/") + ".java"; 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; + manager = `package ${config.managerFile.match(/(.*)(?=\.[^.]*$)/g)[0]}` + ";\n" + manager; var classText = ""; @@ -141,6 +142,45 @@ function createManagerFile(managerTemplate, config, zip, dataDump) { } tmpClassText = tmpClassText.replaceAll("%constructordefs%", constructorText); + + var methodText = ""; + for (let i = 0; i < dataDump[className].methods.length; i++) { + const method = dataDump[className].methods[i]; + var tmpMethodText = templateMethod; + tmpMethodText = tmpMethodText.replaceAll("%classname%", className); + tmpMethodText = tmpMethodText.replaceAll("%idx%", method.idx); + tmpMethodText = tmpMethodText.replaceAll("%static%", method.isStatic); + tmpMethodText = tmpMethodText.replaceAll("%methodname%", method.name); + tmpMethodText = tmpMethodText.replaceAll("%returntype%", "\""+className+"\""); + tmpMethodText = tmpMethodText.replaceAll("%argkeys%", `new String[]{${(()=>{ + var txt = ""; + var argumentKeys = Object.keys(method.arguments); + for (let i = 0; i < argumentKeys.length; i++) { + const k = argumentKeys[i]; + txt += `"${k}"`; + if (i !== argumentKeys.length - 1) { + txt += ", "; + } + } + return txt; + })()}}`); + tmpMethodText = tmpMethodText.replaceAll("%argvalues%", `new String[]{${(()=>{ + var txt = ""; + var argumentKeys = Object.keys(method.arguments); + for (let i = 0; i < argumentKeys.length; i++) { + const k = argumentKeys[i]; + txt += `"${method.arguments[k]}"`; + if (i !== argumentKeys.length - 1) { + txt += ", "; + } + } + return txt; + })()}}`); + tmpMethodText = tmpMethodText.replaceAll("%methodimpl%", method.impl); + methodText += tmpMethodText; + } + tmpClassText = tmpClassText.replaceAll("%methoddefs%", methodText); + classText += tmpClassText; } manager = manager.replaceAll("%classdefs%", classText); diff --git a/NoReflect/index.html b/NoReflect/index.html index edd7b32..4f2b50a 100644 --- a/NoReflect/index.html +++ b/NoReflect/index.html @@ -54,6 +54,7 @@ overflow-x: hidden; margin-top: 2rem; color: orange; + text-shadow: 0px 0px 2px; } diff --git a/NoReflect/javaRecon.js b/NoReflect/javaRecon.js index 9417099..5e40c28 100644 --- a/NoReflect/javaRecon.js +++ b/NoReflect/javaRecon.js @@ -7,12 +7,26 @@ const getStatements = { "char": "params.getChar(%s)", "double": "params.getDouble(%s)", } +const callbackStatements = { + "boolean": "setCallbackBooleanWithDataArg", + "int": "setCallbackIntWithDataArg", + "String": "setCallbackStringWithDataArg", + "double": "setCallbackDoubleWithDataArg", + "float": "setCallbackFloatWithDataArg", +} const getStatementsTypes = Object.keys(getStatements); +const callbackStatementsTypes = Object.keys(callbackStatements); function reconJ(java, className) { + var usedClasses = []; + var javaText = java; + + javaText = javaText.replace(/\/\/.*$/gm, ''); + javaText = javaText.replace(/\/\*[\s\S]*?\*\//gm, ''); + let constructorRegex = /(public|protected|private|static|\s) +(\w+) *\(([^)]*)\)/g; - let constructors = [...java.matchAll(constructorRegex).filter((line)=>{ - return !line.includes(" private ") || !line.includes(" protected "); + let constructors = [...javaText.matchAll(constructorRegex).filter((line)=>{ + return !line[0].includes(" private ") && !line[0].includes(" protected "); })]; let constructorDetails = constructors.map((constructor) => { @@ -32,7 +46,9 @@ function reconJ(java, className) { var argumentsKeys = Object.keys(arguments); for (let i = 0; i < argumentsKeys.length; i++) { const key = argumentsKeys[i]; - + if (!getStatementsTypes.includes(arguments[key])) { + usedClasses.push(arguments[key]); + } argStr += `(${arguments[key]}) ${getStatementsTypes.includes(arguments[key]) ? getStatements[arguments[key]].replaceAll("%s", "\""+key+"\"") : `params.getReflective("${key}")`}`; if (i !== argumentsKeys.length - 1) { argStr += ", " @@ -40,9 +56,8 @@ function reconJ(java, className) { } - let impl = ` - setCallbackReflectiveWithArgs("${constructorName}", (BaseData params) -> { - return new ${className}(${argStr}) + let impl = `setCallbackReflectiveWithArgs("${constructorName}", (BaseData params) -> { + return new ${className}(${argStr}); }); `; @@ -53,10 +68,74 @@ function reconJ(java, className) { impl: impl }; }); - + let methodRegex = /(public|static|\s)* +([\w\<\>\[\]]+)\s+(\w+) *\(([^)]*)\)/g; + + let methods = [...javaText.matchAll(methodRegex).filter((line)=>{ + return !line[0].includes("> ") && !line[0].startsWith(" else ") && !line[0].startsWith(" new ") && !line[0].includes(" private ") && !line[0].includes(" protected "); + //Doesn't support Type yet + })]; + + let methodDetails = methods.map((method) => { + let isStatic = `${method[1]}`.includes("static"); + let returnType = method[2]; + let methodName = method[3]; + let argumentString = method[4]; + let arguments = {}; + + if (argumentString.trim().length > 0) { + let argumentList = argumentString.split(","); + argumentList.forEach((argument) => { + let [type, name] = argument.trim().split(" "); + arguments[name] = type; + }); + } + + let argStr = ""; + var argumentsKeys = Object.keys(arguments); + for (let i = 0; i < argumentsKeys.length; i++) { + const key = argumentsKeys[i]; + if (!getStatementsTypes.includes(arguments[key])) { + usedClasses.push(arguments[key]); + } + argStr += `(${arguments[key]}) ${getStatementsTypes.includes(arguments[key]) ? getStatements[arguments[key]].replaceAll("%s", "\""+key+"\"") : `params.getReflective("${key}")`}`; + if (i !== argumentsKeys.length - 1) { + argStr += ", " + } + } + + let impl; + if (returnType === "void") { + impl = `setCallbackVoidWithArgs("${methodName}", (BaseData params) -> { + ((${className}) params.get("_self")).${methodName}(${argStr}); + }); + `; + } else if (callbackStatementsTypes.includes(returnType)) { + impl = `${callbackStatements[returnType]}("${methodName}", (BaseData params) -> { + return (${returnType}) ((${className}) params.get("_self")).${methodName}(${argStr}); + }); + `; + } else { + usedClasses.push(returnType); + impl = `setCallbackReflectiveWithArgs("${methodName}", (BaseData params) -> { + return (${returnType}) ((${className}) params.get("_self")).${methodName}(${argStr}); + }); + `; + } + + + return { + name: methodName, + returnType: returnType, + isStatic: isStatic, + arguments: arguments, + impl: impl + }; + }); return { className: className, - constructors: constructorDetails + constructors: constructorDetails, + methods: methodDetails, + usedClasses: [...new Set(usedClasses)] } } \ No newline at end of file