@specs-feup/lara
Version:
A js port of the popular framework for building source-to-source compilers
391 lines (333 loc) • 11 kB
text/typescript
import java from "java";
export enum Engine {
GraalVM = "GraalVM",
NodeJS = "NodeJS",
}
export const NodeJavaPrefix = "nodeJava_";
export let engine: Engine = Engine.GraalVM;
if ("Java" in globalThis) {
engine = Engine.GraalVM;
} else {
engine = Engine.NodeJS;
}
// eslint-disable-next-line @typescript-eslint/no-namespace
export namespace JavaClasses {
export interface JavaClass {
(...args: unknown[]): any;
new (...args: unknown[]): any;
[key: string]: any;
}
/* eslint-disable @typescript-eslint/no-empty-interface */
export interface LaraI extends JavaClass {}
export interface LaraApiTools extends JavaClass {}
export interface LaraSystemTools extends JavaClass {
runCommand(
command: string | JavaClasses.List<string>,
workingDir: string,
printToConsole: boolean,
timeoutNanos?: number
): JavaClasses.ProcessOutputAsString;
}
export interface LaraCli extends JavaClass {}
export interface Uuid extends JavaClass {}
export interface Gprofer extends JavaClass {}
export interface JoinPoint extends JavaClass {}
export interface SpecsStrings extends JavaClass {
escapeJson(str: string): string;
}
export interface SpecsSystem extends JavaClass {}
export interface ApacheStrings extends JavaClass {}
export interface StringLines extends JavaClass {}
export interface LaraIo extends JavaClass {}
export interface SpecsIo extends JavaClass {}
export interface System extends JavaClass {
nanoTime(): number;
}
export interface File extends JavaClass {
getParentFile(): JavaClasses.File;
getAbsolutePath(): string;
}
export interface List<T> extends JavaClass {
[Symbol.iterator](): IterableIterator<T>;
}
export interface Collections extends JavaClass {}
export interface Diff extends JavaClass {}
export interface XStreamUtils extends JavaClass {
// Otherwise TS will get confused about .toString()
toString(obj: any): string;
}
export interface Object extends JavaClass {}
export interface ReplacerHelper extends JavaClass {}
export interface CsvReader extends JavaClass {}
export interface CsvWriter extends JavaClasses.JavaClass {}
export interface CsvField extends JavaClasses.JavaClass {}
export interface DataStore extends JavaClass {}
export interface JOptionsUtils extends JavaClass {}
export interface WeaverEngine extends JavaClass {}
export interface VerboseLevel extends JavaClass {}
export interface LaraiKeys extends JavaClass {}
export interface FileList extends JavaClass {}
export interface OptionalFile extends JavaClass {}
export interface LaraIUtils extends JavaClass {}
export interface WeaverLauncher extends JavaClass {}
export interface ArrayList extends JavaClass {}
export interface HashMap extends JavaClass {}
export interface SpecsPlatforms extends JavaClass {}
export interface Runtime extends JavaClass {}
export interface LARASystem extends JavaClass {}
export interface ProcessOutputAsString extends JavaClass {
getOutput(): string;
}
export interface JsGear extends JavaClass {
setJsOnAction(onActionCallback: (d: Record<string, any>) => void): boolean;
onAction(actionEvent: any): void;
}
export interface ProgressCounter extends JavaClasses.JavaClass {}
export interface LineStream extends JavaClasses.JavaClass {}
/* eslint-enable @typescript-eslint/no-empty-interface */
}
export default class JavaTypes {
private static typeMap: Map<string, unknown> = new Map();
/**
* @beta Only for very exceptional cases. Should not be used directly, use the static methods instead.
*
* @param javaTypeName - String with the name of the Java type to be imported into the javascript environment
* @returns A Java object
*/
static getType(javaTypeName: string): any {
if (JavaTypes.typeMap.has(javaTypeName)) {
return JavaTypes.typeMap.get(javaTypeName);
}
let javaType: unknown;
switch (engine) {
case Engine.GraalVM:
javaType = Java.type(javaTypeName);
break;
case Engine.NodeJS:
javaType = java.import(javaTypeName);
break;
}
JavaTypes.typeMap.set(javaTypeName, javaType);
return javaType;
}
static instanceOf<T>(value: T, javaTypeName: string): boolean {
switch (engine) {
case Engine.GraalVM:
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
if (Java.isJavaObject(value)) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
return Java.type(javaTypeName).class.isInstance(value);
}
return Java.typeName(value) === javaTypeName;
case Engine.NodeJS:
return java.instanceOf(value, javaTypeName);
}
}
static isJavaObject<T>(value: T): boolean {
if (engine == Engine.NodeJS) {
return (
typeof value === "object" &&
value !== null &&
Object.getPrototypeOf(value).constructor.name.startsWith(
NodeJavaPrefix
)
);
}
try {
(value as any).getClass().getName();
return true;
} catch (error) {
return false;
}
}
static get LaraI() {
return JavaTypes.getType("larai.LaraI") as JavaClasses.LaraI;
}
static get LaraApiTool() {
return JavaTypes.getType(
"pt.up.fe.specs.lara.LaraApiTools"
) as JavaClasses.LaraApiTools;
}
static get LaraSystemTools() {
return JavaTypes.getType(
"pt.up.fe.specs.lara.LaraSystemTools"
) as JavaClasses.LaraSystemTools;
}
static get LaraCli() {
return JavaTypes.getType(
"org.lara.interpreter.cli.LaraCli"
) as JavaClasses.LaraCli;
}
static get Uuid() {
return JavaTypes.getType("java.util.UUID") as JavaClasses.Uuid;
}
static get Gprofer() {
return JavaTypes.getType(
"pt.up.fe.specs.gprofer.Gprofer"
) as JavaClasses.Gprofer;
}
static get JoinPoint() {
return JavaTypes.getType(
"org.lara.interpreter.weaver.interf.JoinPoint"
) as JavaClasses.JoinPoint;
}
static get SpecsStrings() {
return JavaTypes.getType(
"pt.up.fe.specs.util.SpecsStrings"
) as JavaClasses.SpecsStrings;
}
static get SpecsSystem() {
return JavaTypes.getType(
"pt.up.fe.specs.util.SpecsSystem"
) as JavaClasses.SpecsSystem;
}
static get ApacheStrings() {
return JavaTypes.getType(
"pt.up.fe.specs.lang.ApacheStrings"
) as JavaClasses.ApacheStrings;
}
static get StringLines() {
return JavaTypes.getType(
"pt.up.fe.specs.util.utilities.StringLines"
) as JavaClasses.StringLines;
}
static get LaraIo() {
return JavaTypes.getType(
"org.lara.interpreter.api.LaraIo"
) as JavaClasses.LaraIo;
}
static get SpecsIo() {
return JavaTypes.getType(
"pt.up.fe.specs.util.SpecsIo"
) as JavaClasses.SpecsIo;
}
static get System() {
return JavaTypes.getType("java.lang.System") as JavaClasses.System;
}
static get File() {
return JavaTypes.getType("java.io.File") as JavaClasses.File;
}
static get List() {
return JavaTypes.getType("java.util.List") as JavaClasses.List<any>;
}
static get Collections() {
return JavaTypes.getType(
"java.util.Collections"
) as JavaClasses.Collections;
}
static get Diff() {
return JavaTypes.getType(
"pt.up.fe.specs.lara.util.JavaDiffHelper"
) as JavaClasses.Diff;
}
static get XStreamUtils() {
return JavaTypes.getType(
"org.suikasoft.XStreamPlus.XStreamUtils"
) as JavaClasses.XStreamUtils;
}
static get Object() {
return JavaTypes.getType("java.lang.Object") as JavaClasses.Object;
}
static get ReplacerHelper() {
return JavaTypes.getType(
"pt.up.fe.specs.lara.util.ReplacerHelper"
) as JavaClasses.ReplacerHelper;
}
static get CsvReader() {
return JavaTypes.getType(
"pt.up.fe.specs.util.csv.CsvReader"
) as JavaClasses.CsvReader;
}
static get CsvField() {
return JavaTypes.getType(
"pt.up.fe.specs.util.csv.CsvField"
) as JavaClasses.CsvField;
}
static get CsvWriter() {
return JavaTypes.getType(
"pt.up.fe.specs.util.csv.CsvWriter"
) as JavaClasses.CsvWriter;
}
static get DataStore() {
return JavaTypes.getType(
"org.suikasoft.jOptions.Interfaces.DataStore"
) as JavaClasses.DataStore;
}
static get JOptionsUtils() {
return JavaTypes.getType(
"org.suikasoft.jOptions.JOptionsUtils"
) as JavaClasses.JOptionsUtils;
}
static get WeaverEngine() {
return JavaTypes.getType(
"org.lara.interpreter.weaver.interf.WeaverEngine"
) as JavaClasses.WeaverEngine;
}
static get VerboseLevel() {
return JavaTypes.getType(
"org.lara.interpreter.joptions.config.interpreter.VerboseLevel"
) as JavaClasses.VerboseLevel;
}
static get LaraiKeys() {
return JavaTypes.getType(
"org.lara.interpreter.joptions.config.interpreter.LaraiKeys"
) as JavaClasses.LaraiKeys;
}
static get FileList() {
return JavaTypes.getType(
"org.lara.interpreter.joptions.keys.FileList"
) as JavaClasses.FileList;
}
static get OptionalFile() {
return JavaTypes.getType(
"org.lara.interpreter.joptions.keys.OptionalFile"
) as JavaClasses.OptionalFile;
}
static get LaraIUtils() {
return JavaTypes.getType(
"org.lara.interpreter.utils.LaraIUtils"
) as JavaClasses.LaraIUtils;
}
static get WeaverLauncher() {
return JavaTypes.getType(
"pt.up.fe.specs.lara.WeaverLauncher"
) as JavaClasses.WeaverLauncher;
}
static get ArrayList() {
return JavaTypes.getType("java.util.ArrayList") as JavaClasses.ArrayList;
}
static get HashMap() {
return JavaTypes.getType("java.util.HashMap") as JavaClasses.HashMap;
}
static get SpecsPlatforms() {
return JavaTypes.getType(
"pt.up.fe.specs.lang.SpecsPlatforms"
) as JavaClasses.SpecsPlatforms;
}
static get Runtime() {
return JavaTypes.getType("java.lang.Runtime") as JavaClasses.Runtime;
}
static get LARASystem() {
return JavaTypes.getType("Utils.LARASystem") as JavaClasses.LARASystem;
}
static get ProcessOutputAsString() {
return JavaTypes.getType(
"pt.up.fe.specs.util.system.ProcessOutputAsString"
) as JavaClasses.ProcessOutputAsString;
}
static get JsGear() {
return JavaTypes.getType("org.lara.interpreter.utils.JsGear") as {
new (...args: any[]): JavaClasses.JsGear;
};
}
static get ProgressCounter() {
return JavaTypes.getType(
"pt.up.fe.specs.util.utilities.ProgressCounter"
) as JavaClasses.ProgressCounter;
}
static get LineStream() {
return JavaTypes.getType(
"pt.up.fe.specs.util.utilities.LineStream"
) as JavaClasses.LineStream;
}
}