UNPKG

@abaplint/transpiler

Version:
87 lines 4.07 kB
"use strict"; 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