1
0
mirror of https://github.com/quinton-ashley/java2js synced 2024-12-29 10:11:54 +01:00
This commit is contained in:
Quinton Ashley 2021-11-15 20:02:30 -05:00
parent 8e4c614400
commit c66d7d7162
7 changed files with 114 additions and 66 deletions

65
jdk.js
View File

@ -182,28 +182,46 @@
let className = file.slice(classLine + 13, file.indexOf(' {', classLine + 13));
// 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;
file = file.replace(/"""([^"]*)"""/gm, (match, p1) => {
return '(' + p1.replace(/( |\t){0,3}(.*)(\n|$)/gm, '"$2\\n"+').slice(0, -1) + ')';
});
// hacky support for Array literals
file = file.replaceAll(/=\s*new \w*\[\]\s*\{/g, '= {');
file = file.replace(/new\s*\w*\s*\[\s*\]\s*\{(.*)\}/gm, 'new Array($1)');
file = file.replace(/new\s*\w*(\s*\[\s*\])*\s*\{(.*)\}/gm, (match, p1, p2) => {
return 'new Array(' + p2.replace(/\{([^\}]*)\}/gm, 'new Array($1)') + ')';
});
// workaround hack for converting lambda expressions to Runnables
let lambdaRegex = /\(\)\s*\->\s*\{(([^\{\}]*\{[^\}]*\})*[^\}]*)\}/g;
file = file.replaceAll(lambdaRegex, (match, in0) => {
// can't even do this... bruh
// file = file.replace(lambdaRegex, (match, in0) => {
// // log(in0);
// if (lambdaRegex.test(in0)) {
// in0 = in0.replace(lambdaRegex, (match, in1) => {
// return 'new Runnable() {\\n@Override\\npublic void run() {' + in1 + '}\\n}';
// });
// }
// return 'new Runnable() {\\n@Override\\npublic void run() {' + in0 + '}\\n}';
// });
// TODO fix this by adding real support for lambda
file = file.replace(lambdaRegex, (match, in0) => {
// log(in0);
if (lambdaRegex.test(in0)) {
in0 = in0.replaceAll(lambdaRegex, (match, in1) => {
return 'new Runnable() {\n@Override\npublic void run() {' + in1 + '}}';
in0 = in0.replace(lambdaRegex, (match, in1) => {
in1.replaceAll('\n', '\\n');
return 'new Runnable("' + in1 + '")';
});
}
return 'new Runnable() {\n@Override\npublic void run() {' + in0 + '}}';
in0 = in0.replaceAll('\n', '\\n');
return 'new Runnable("' + in0 + '")';
});
// convert string .length() method
file = file.replaceAll(/\.length\(\)/g, '.length');
file = file.replace(/\.length\(\)/gm, '.length');
// cast to int, truncates the number (just removes decimal value)
file = file.replace(/\(int\)\s*/gm, 'Math.floor');
@ -213,7 +231,12 @@
// log(trans);
trans = trans.replace(/(\([^\)]*\) =>)/gm, 'async $1');
// TODO fix this by adding real support for lambda
trans = trans.replace(/new\s*Runnable\('(.*)'\)/, (match, p1) => {
return '() => {' + p1.replaceAll('\\n', '\n') + '}';
});
trans = trans.replace(/(\([^\(\)]*\) =>)/gm, 'async $1');
trans = trans.replace(/([\w_\$]+\.next(Int|Float|Double|Line|Short|Long)*\(\))/gm, 'await $1');
let prefix = `((jdk.imports['games_java.${className}'] = {}).load = async () => {\n\n`;
@ -233,7 +256,7 @@
}
prefix += '\n';
let suffix = `\njdk.main = ${className}.main;\njdk.launch();\n})();`;
let suffix = `\nwindow.${className} = ${className};\njdk.main = ${className}.main;\njdk.launch();\n})();`;
trans = prefix + trans + suffix;
@ -19184,8 +19207,12 @@
case 'ArrayInitializer':
return `[${expr.expressions.map(parseExpr)}]`;
case 'ArrayCreation':
return `new Array()`; // TODOQ multiple dimensions?
return `new Array()`;
case 'ArrayAccess':
// TODO support for three dimensional arrays
if (expr.array.array) {
return `${expr.array.array.identifier}[${parseExpr(expr.array.index)}][${parseExpr(expr.index)}]`;
}
return `${expr.array.identifier}[${parseExpr(expr.index)}]`;
case 'ParenthesizedExpression':
return `(${parseExpr(expr.expression)})`;
@ -19352,7 +19379,14 @@
for (const var_ of vars) {
if (var_.value === undefined) var_.value = literalInitializers[var_.type] || 'null';
if (var_.static) staticVars.push(`${className}.${var_.name}=${var_.value};`);
else initVars.push(`this.${var_.name}=${var_.value};`);
else {
if (typeof var_.value == 'string') {
for (const vv of vars) {
var_.value = var_.value.replaceAll(vv.name, 'this.' + vv.name);
}
}
initVars.push(`this.${var_.name}=${var_.value};`);
}
}
let addedConstructor = false;
@ -19365,7 +19399,10 @@
isConstructor && addInitVars && initVars.length
? initVars.join('') + (block ? opts.separator : '')
: '';
classProps.push(`${name}(${parameters}){${preblock}${block}}`);
let method = `${name}(${parameters}){${preblock}${block}}`;
if (typeof QuintOS != 'undefined' && /(System|alert|prompt|eraseRect)/gm.test(block))
method = 'async ' + method;
classProps.push(method);
}
};

View File

@ -32,7 +32,7 @@ jdk.imports['java.io.PrintStream'].load = async () => {
}
printf(format, ...args) {
let str = new Formatter().format(format, args);
let str = String.format(format, args);
this.log += str;
if (window?.ide) {
ide.log.value += str;

View File

@ -1,24 +1,30 @@
jdk.imports['java.lang.String'].load = async () => {};
// String is special, I just extended js String prototype
String.prototype.hashCode = () => {
let h = this._hashCode;
if (!h && this.length > 0) {
const val = this;
for (let i = 0; i < this.length; i++) {
h = 31 * h + this.charCodeAt(i);
jdk.imports['java.lang.String'].load = async () => {
const Formatter = await jdk.import('java.util.Formatter');
// String is special, I just extended js String prototype
String.prototype.hashCode = function () {
let h = this._hashCode;
if (!h && this.length > 0) {
const val = this;
for (let i = 0; i < this.length; i++) {
h = 31 * h + this.charCodeAt(i);
}
this._hashCode = h;
}
this._hashCode = h;
}
return h;
return h;
};
String.prototype.isEmpty = function () {
return this.length == 0;
};
String.prototype.contains = function (substr) {
return this.includes(substr);
};
// static methods
String.valueOf = (c) => {
return c.toString();
};
String.format = (format, ...args) => {
return new Formatter().format(format, ...args);
};
jdk.java.lang.String = String;
};
String.prototype.isEmpty = () => {
return this.length == 0;
};
String.prototype.contains = (substr) => {
return this.includes(substr);
};
// static methods
String.valueOf = (c) => {
return c.toString();
};
jdk.java.lang.String = String;

View File

@ -2,9 +2,9 @@ jdk.imports['java.util.AbstractList'].load = async () => {
const Itr = await jdk.import('java.util.Itr');
class AbstractList {
constructor() {
constructor(content) {
// TODO
this.content = [];
this.content = content || [];
}
addAll(index, vals) {

View File

@ -1,16 +1,20 @@
jdk.imports['java.util.Arrays'].load = async () => {
class Arrays {
fill(data, begin, nbElem, param) {
const max = begin + nbElem;
for (let i = begin; i < max; i++) {
data[i] = param;
}
let AbstractList = await jdk.import('java.util.AbstractList');
class Arrays {}
Arrays.fill = (data, begin, nbElem, param) => {
const max = begin + nbElem;
for (let i = begin; i < max; i++) {
data[i] = param;
}
copyOf(original, newLength, ignore) {
const copy = new Array(newLength);
jdk.java.lang.System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
return copy;
}
}
};
Arrays.copyOf = (original, newLength, ignore) => {
const copy = new Array(newLength);
jdk.java.lang.System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
return copy;
};
Arrays.asList = (array) => {
return new AbstractList(array);
};
jdk.java.util.Arrays = Arrays;
};

View File

@ -1,17 +1,18 @@
jdk.imports['java.util.Collections'].load = async () => {
class Collections {
sort(list) {
if (!list.size()) return;
if (list.get(0).compareTo) {
list.sort(list.get(0).compareTo);
} else {
list.sort();
}
class Collections {}
Collections.sort = (list) => {
if (!list.size()) return;
if (list.get(0).compareTo) {
list.sort(list.get(0).compareTo);
} else {
list.sort();
}
swap(list, i, j) {
const l = list;
l.set(i, l.set(j, l.get(i)));
}
}
};
Collections.swap = (list, i, j) => {
const l = list;
l.set(i, l.set(j, l.get(i)));
};
jdk.java.util.Collections = Collections;
};

View File

@ -1,8 +1,8 @@
{
"name": "java2js",
"version": "1.0.7",
"version": "1.0.8",
"description": "Converts Java to JavaScript with support for p5.js and QuintOS.",
"main": "java2js.js",
"main": "jdk.js",
"scripts": {
"start": "open demo.html",
"test": "echo \"Error: no test specified\" && exit 1",