@specs-feup/lara
Version:
A js port of the popular framework for building source-to-source compilers
144 lines • 4.84 kB
JavaScript
//////////////////////////////////////////////////////
// This file is generated by build-LaraJoinPoint.js //
//////////////////////////////////////////////////////
/* eslint-disable @typescript-eslint/no-explicit-any */
import JavaTypes from "./lara/util/JavaTypes.js";
export class LaraJoinPoint {
/**
* @internal
*/
static _defaultAttributeInfo = {
name: null,
};
/**
* @internal
*/
_javaObject;
constructor(obj) {
this._javaObject = obj;
}
get dump() { return wrapJoinPoint(this._javaObject.getDump()); }
get joinPointType() { return wrapJoinPoint(this._javaObject.getJoinPointType()); }
get node() { return (this._javaObject.getNode()); }
get self() { return wrapJoinPoint(this._javaObject.getSelf()); }
get super() { return wrapJoinPoint(this._javaObject.getSuper()); }
get children() { return wrapJoinPoint(this._javaObject.getChildren()); }
get descendants() { return wrapJoinPoint(this._javaObject.getDescendants()); }
get scopeNodes() { return wrapJoinPoint(this._javaObject.getScopeNodes()); }
insert(p1, p2) { return wrapJoinPoint(this._javaObject.insert(unwrapJoinPoint(p1), unwrapJoinPoint(p2))); }
toString() { return wrapJoinPoint(this._javaObject.toString()); }
equals(jp) { return wrapJoinPoint(this._javaObject.equals(unwrapJoinPoint(jp))); }
instanceOf(p1) { return wrapJoinPoint(this._javaObject.instanceOf(unwrapJoinPoint(p1))); }
}
const JoinpointMappers = [];
/**
* This function is for internal use only. DO NOT USE IT!
*/
export function clearJoinpointMappers() {
JoinpointMappers.length = 0;
}
/**
* This function is for internal use only. DO NOT USE IT!
*/
export function getJoinpointMappers() {
return JoinpointMappers;
}
export function registerJoinpointMapper(mapper) {
// Create mapper from object
const jpMapper = {
toJpClass(jpTypename) {
return mapper[jpTypename];
},
toJpInstance(jpTypename, javaJp) {
const jpClass = this.toJpClass(jpTypename);
if (jpClass) {
return new jpClass(javaJp);
}
return undefined;
},
fromJpClass(jpType) {
return Object.keys(mapper).find((key) => mapper[key] === jpType);
},
};
JoinpointMappers.push(jpMapper);
}
export function registerJoinpointMapperFunction(mapper) {
// Create mapper from function
const jpMapper = {
toJpClass(jpTypename) {
return mapper(jpTypename);
},
toJpInstance(jpTypename, javaJp) {
const jpClass = this.toJpClass(jpTypename);
if (jpClass) {
return new jpClass(javaJp);
}
return undefined;
},
// Not possible to implement with just a function
fromJpClass(jpType) {
return undefined;
},
};
JoinpointMappers.push(jpMapper);
}
export function wrapJoinPoint(obj) {
if (JoinpointMappers.length === 0) {
return obj;
}
if (obj === undefined) {
return obj;
}
if (obj instanceof LaraJoinPoint) {
return obj;
}
if (ArrayBuffer.isView(obj)) {
return Array.from(obj).map(wrapJoinPoint);
}
if (typeof obj !== "object") {
return obj;
}
if (Array.isArray(obj)) {
return obj.map(wrapJoinPoint);
}
if (!JavaTypes.isJavaObject(obj)) {
return obj;
}
if (JavaTypes.instanceOf(obj, "pt.up.fe.specs.jsengine.node.UndefinedValue")) {
return undefined;
}
if (JavaTypes.instanceOf(obj, "java.util.ArrayList")) {
return obj.toArray().map(wrapJoinPoint);
}
if (JavaTypes.instanceOf(obj, "org.suikasoft.jOptions.DataStore.DataClass") &&
!JavaTypes.instanceOf(obj, "pt.up.fe.specs.clava.ClavaNode")) {
return obj;
}
if (obj.getClass().isEnum()) {
return obj.toString();
}
const isJavaJoinPoint = JavaTypes.JoinPoint.isJoinPoint(obj);
if (!isJavaJoinPoint) {
throw new Error(`Given Java join point is a Java class but is not a JoinPoint: ${obj.getClass()}`);
}
const jpType = obj.getJoinPointType();
// Iterate in reverse order, to give priority to most recently added mappers
for (let i = JoinpointMappers.length - 1; i >= 0; i--) {
const mapper = JoinpointMappers[i];
const laraJp = mapper.toJpInstance(jpType, obj);
if (laraJp) {
return laraJp;
}
}
throw new Error("No mapper found for join point type: " + jpType);
}
export function unwrapJoinPoint(obj) {
if (obj instanceof LaraJoinPoint) {
return obj._javaObject;
}
if (Array.isArray(obj)) {
return obj.map(unwrapJoinPoint);
}
return obj;
}
//# sourceMappingURL=LaraJoinPoint.js.map