@abaplint/transpiler
Version:
87 lines • 4.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataTranspiler = void 0;
const abaplint = require("@abaplint/core");
const transpile_types_1 = require("../transpile_types");
const traversal_1 = require("../traversal");
const constant_1 = require("../expressions/constant");
const expressions_1 = require("../expressions");
const chunk_1 = require("../chunk");
class DataTranspiler {
transpile(node, traversal) {
const token = node.findFirstExpression(abaplint.Expressions.DefinitionName)?.getFirstToken();
if (token === undefined) {
throw new Error("DataTranspiler, token not found");
}
const scope = traversal.findCurrentScopeByToken(token);
if (scope === undefined) {
throw new Error("DataTranspiler, scope not found: " + node.concatTokens());
}
const found = scope.findVariable(token.getStr());
if (found === undefined) {
throw new Error("DataTranspiler, var not found, \"" + token.getStr() + "\", " + traversal.getFilename() + ", line: " + token.getRow());
}
let value = "";
if (found.getValue() !== undefined && node.concatTokens().includes(" & ")) {
value = "\n" + traversal.setValues(found, found.getName());
}
else {
value = DataTranspiler.buildValue(node, traversal_1.Traversal.prefixVariable(found.getName().toLowerCase()), traversal);
}
// for enum types, initialize with the first enum value
if (found.getType() instanceof abaplint.BasicTypes.EnumType && value === "") {
const enumDefault = DataTranspiler.findEnumDefault(scope, found.getType());
if (enumDefault) {
value = "\n" + traversal_1.Traversal.prefixVariable(found.getName().toLowerCase()) + ".set(\"" + enumDefault + "\");";
}
}
const ret = new chunk_1.Chunk()
.appendString("let ")
.appendString(traversal_1.Traversal.prefixVariable(traversal_1.Traversal.escapeNamespace(found.getName().toLowerCase())))
.appendString(" = " + transpile_types_1.TranspileTypes.toType(found.getType()))
.appendString(";")
.appendString(value);
return ret;
}
static findEnumDefault(scope, _enumType) {
let current = scope;
while (current) {
const vars = current.getData().vars;
for (const key of Object.keys(vars)) {
const v = vars[key];
if (v.getMeta().includes("enum" /* abaplint.IdentifierMeta.Enum */)) {
const structType = v.getType();
if (structType instanceof abaplint.BasicTypes.StructureType) {
const components = structType.getComponents();
if (components.length > 0) {
return components[0].name.toUpperCase();
}
}
}
}
current = current.getParent();
}
return undefined;
}
static buildValue(node, name, traversal) {
let value = "";
const val = node.findFirstExpression(abaplint.Expressions.Value);
if (val) {
let int = val.findFirstExpression(abaplint.Expressions.Integer);
if (int === undefined) {
int = val.findFirstExpression(abaplint.Expressions.ConstantString);
}
if (int) {
const escaped = constant_1.ConstantTranspiler.escape(int.concatTokens());
value = "\n" + name + ".set(" + escaped + ");";
}
else if (val.getChildren()[1].get() instanceof abaplint.Expressions.SimpleFieldChain) {
const s = new expressions_1.FieldChainTranspiler().transpile(val.getChildren()[1], traversal).getCode();
value = "\n" + name + ".set(" + s + ");";
}
}
return value;
}
}
exports.DataTranspiler = DataTranspiler;
//# sourceMappingURL=data.js.map