diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..caf7fc7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +*.log +package-lock.json +node_modules +dev diff --git a/README.md b/README.md index 6387276..a2da9bf 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Java to Javascript for QuintOS -I've built on top of the "Java to Javascript" transpiler by @wyattades and got inspiration from the JavaDevelopmentKit implementation in "java2javascript" by @BobHanson and others. +I've built on top of the [java-to-javascript](https://github.com/wyattades/java-to-javascript) transpiler by @wyattades and got inspiration from the JDK (Java Development Kit) implementation in [java2javascript](https://github.com/java2script/java2script) by @BobHanson, @zhourenjian, @abego, and others. -The purpose of this project was to allow intro level CS students to write Java code but still use my QuintOS library which is web based instead of just having them run their programs in a Java console which is boring. I made a barebones JavaDevelopmentKit implementation in modern Javascript to acheive this. +My purpose in creating this project is to allow intro level CS students to write Java code but still use my QuintOS library which is web based. Yes, I went to all this trouble just so some teenagers don't have to run their programs in a boring Java console! I made a barebones JDK implementation in modern Javascript to acheive this. ## Known limitations diff --git a/demo.html b/demo.html index 7984a31..3c43d81 100755 --- a/demo.html +++ b/demo.html @@ -31,6 +31,7 @@ + diff --git a/jdk.js b/jdk.js index 11ec439..3f699a5 100755 --- a/jdk.js +++ b/jdk.js @@ -127,7 +127,7 @@ let classes = []; for (let className of classNames) { - log('importing ' + className); + // log('importing ' + className); let imp = this.imports[className]; if (imp) { // class is ready for use @@ -175,7 +175,7 @@ let userName = window?.QuintOS?.userName || 'quinton-ashley'; let className = file.slice(classLine + 13, file.indexOf(' {', classLine + 13)); - // hacky support for Java 15 triple quotes + // workaround hack for converting triple quotes to a normal string file = file.replaceAll(/"""([^"]*)"""/g, (match, str) => { str = str.replaceAll(/(.*)(\n|$)/g, '"$1\\n"+').slice(0, -1); return str; @@ -184,6 +184,18 @@ // hacky support for Array literals file = file.replaceAll(/=\s*new \w*\[\]\s*\{/g, '= {'); + // workaround hack for converting lambda expressions to Runnables + let lambdaRegex = /\(\)\s*\->\s*\{(([^\{\}]*\{[^\}]*\})*[^\}]*)\}/g; + file = file.replaceAll(lambdaRegex, (match, in0) => { + log(in0); + if (lambdaRegex.test(in0)) { + in0 = in0.replaceAll(lambdaRegex, (match, in1) => { + return 'new Runnable() {\n@Override\npublic void run() {' + in1 + '}}'; + }); + } + return 'new Runnable() {\n@Override\npublic void run() {' + in0 + '}}'; + }); + // convert string .length() method file = file.replaceAll(/\.length\(\)/g, '.length'); @@ -191,9 +203,7 @@ file = file.replace(/\(int\)\s*/gm, 'Math.floor'); file = file.replace(/\(int\)\s*\-/gm, 'Math.ceil'); - // log(file); - - window.file0 = file; + log(file); let trans = java_to_javascript(file); @@ -202,14 +212,20 @@ trans = trans.replace(/(\([^\)]*\) =>)/gm, 'async $1'); trans = trans.replace(/([\w_\$]+\.next(Int|Float|Double|Line|Short|Long)*\(\))/gm, 'await $1'); - let prefix = `((jdk.imports['com.${userName}.${className}'] = {}).load = async () => {\n\n`; + let prefix = `((jdk.imports['games_java.${className}'] = {}).load = async () => {\n\n`; // handle Java class imports for (let i = 0; i < imports.length; i++) { let imp = imports[i]; + // skip static imports for now (like QuintOS) + if (imp.includes('static')) continue; let impPath = imp.split('.'); let impName = impPath[impPath.length - 1]; - prefix += `let ${impName} = await jdk.import('${imp}');\n`; + if (impName == '*') { + prefix += `await jdk.import('${imp}');\n`; + } else { + prefix += `let ${impName} = await jdk.import('${imp}');\n`; + } } prefix += '\n'; @@ -243,8 +259,6 @@ ? define(factory) : ((global = global || self), (global.javaToJavascript = factory())); })(this, function () { - 'use strict'; - function unwrapExports(x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x.default : x; } @@ -19405,7 +19419,7 @@ * @return {string} - Converted JavaScript */ const javaToJavascript = (javaString, options = {}, progress) => { - if (typeof javaString !== 'string') throw new Error('java-to-javascript: First argument must be a string'); + if (typeof javaString !== 'string') throw 'java-to-javascript: First argument must be a string'; // Reset opts parameters Object.assign(opts, DEFAULT_OPTIONS); @@ -19426,7 +19440,8 @@ try { javaAST$$1 = javaAST.parse(javaString); } catch (e) { - if (e.location) throw new Error(`Line ${e.location.start.line}\n\n${e.stack}`); + let line = e.location.start.line; + if (e.location) throw `on line ${line}: \n\n${javaString.split('\n')[line - 1].trim()}\n\n${e.stack}`; else throw e; } diff --git a/package.json b/package.json index 43a0f34..692092f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "java2js", - "version": "1.0.5", + "version": "1.0.6", "description": "Converts Java to JavaScript with support for p5.js and QuintOS.", "main": "java2js.js", "scripts": {