@abaplint/runtime
Version:
Transpiler - Runtime
198 lines • 7.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createData = createData;
const throw_error_1 = require("../throw_error");
const types_1 = require("../types");
const tableOptions = { withHeader: false, keyType: types_1.TableKeyType.default };
function createData(target, options) {
// console.dir(options);
if (target instanceof types_1.FieldSymbol) {
createData(target.getPointer(), options);
return;
}
else if (!(target instanceof types_1.DataReference)) {
throw new Error("CREATE_DATA_REFERENCE_EXPECTED");
}
if (options?.name && options?.table) {
if (abap.DDIC[options.name.trimEnd()] === undefined) {
(0, throw_error_1.throwError)("CX_SY_CREATE_DATA_ERROR");
}
target.assign(new abap.types.Table(abap.DDIC[options.name.trimEnd()].type(), tableOptions));
}
else if (options?.name !== undefined) {
if (abap.DDIC[options.name.trimEnd()]) {
target.assign(abap.DDIC[options.name.trimEnd()].type().clone());
}
else if (options.name.includes("=>")) {
const [className, typeName] = options.name.trimEnd().toUpperCase().split("=>");
if (abap.Classes[className] === undefined) {
(0, throw_error_1.throwError)("CX_SY_CREATE_DATA_ERROR");
}
if (abap.Classes[className][typeName.toLowerCase()] === undefined) {
(0, throw_error_1.throwError)("CX_SY_CREATE_DATA_ERROR");
}
target.assign(abap.Classes[className][typeName.toLowerCase()].clone());
}
else if (options.name.startsWith("\\TYPE=%")) {
// currently, only the runtime knows the references to the anonymous types
const clas = abap.Classes["KERNEL_CREATE_DATA_HANDLE"];
if (clas === undefined) {
throw new Error("CreateData, kernel class missing");
}
clas.anonymous({ name: options.name.trimEnd(), dref: target });
}
else if (options.name.trimEnd() === "ABAP_BOOL") {
// ABAP_BOOL is special, its not part of the type pool, its built-into abaplint
target.assign(new types_1.Character(1, { qualifiedName: "ABAP_BOOL", ddicName: "ABAP_BOOL" }));
}
else if (options.name.trimEnd() === "STRING") {
target.assign(new types_1.String());
}
else if (options.name.trimEnd() === "XSTRING") {
target.assign(new types_1.XString());
}
else if (options.name.trimEnd() === "UTCLONG") {
target.assign(new types_1.UTCLong());
}
else if (options.name.trimEnd() === "I") {
target.assign(new types_1.Integer());
}
else if (options.name.trimEnd() === "T") {
target.assign(new types_1.Time());
}
else if (options.name.trimEnd() === "D") {
target.assign(new types_1.Date());
}
else if (options.name.trimEnd() === "F") {
target.assign(new types_1.Float());
}
else if (options.name.trimEnd() === "INT8") {
target.assign(new types_1.Integer8());
}
else if (options.refTo === true) {
if (abap.Classes[options.name.toUpperCase()] === undefined) {
(0, throw_error_1.throwError)("CX_SY_CREATE_DATA_ERROR");
}
target.assign(new abap.types.ABAPObject({ qualifiedName: options.name, RTTIName: options.name }));
}
else {
(0, throw_error_1.throwError)("CX_SY_CREATE_DATA_ERROR");
}
if (options.typeLineOf === true) {
// @ts-ignore
target.assign(target.getPointer().getRowType().clone());
}
}
else if (options?.typeName) {
switch (options.typeName) {
case "C":
{
let length = 1;
if (options.length) {
length = options.length.get();
}
target.assign(new types_1.Character(length));
}
break;
case "N":
{
let length = 1;
if (options.length) {
length = options.length.get();
}
target.assign(new types_1.Numc({ length: length }));
}
break;
case "X":
{
let length = 1;
if (options.length) {
length = options.length.get();
}
target.assign(new types_1.Hex({ length: length }));
}
break;
case "P":
{
let length = 1;
if (options.length) {
length = options.length.get();
}
let decimals = 0;
if (options.decimals) {
decimals = options.decimals.get();
}
target.assign(new types_1.Packed({ length: length, decimals: decimals }));
}
break;
case "F":
target.assign(new types_1.Float());
break;
case "D":
target.assign(new types_1.Date());
break;
case "T":
target.assign(new types_1.Time());
break;
case "I":
target.assign(new types_1.Integer());
break;
case "STRING":
target.assign(new types_1.String());
break;
case "INT8":
target.assign(new types_1.Integer8());
break;
case "XSTRING":
target.assign(new types_1.XString());
break;
case "UTCLONG":
target.assign(new types_1.UTCLong());
break;
case "DECFLOAT34":
target.assign(new types_1.DecFloat34());
break;
default:
if (abap.DDIC[options.typeName.trimEnd()]) {
target.assign(abap.DDIC[options.typeName.trimEnd()].type().clone());
}
else if (options.typeName.includes("=>")) {
const [className, typeName] = options.typeName.toUpperCase().split("=>");
if (abap.Classes[className] === undefined) {
(0, throw_error_1.throwError)("CX_SY_CREATE_DATA_ERROR");
}
if (abap.Classes[className][typeName.toLowerCase().trimEnd()] === undefined) {
(0, throw_error_1.throwError)("CX_SY_CREATE_DATA_ERROR");
}
target.assign(abap.Classes[className][typeName.toLowerCase().trimEnd()].clone());
}
else {
throw "CREATE DATA, unknown type " + options.typeName;
}
}
}
else if (options?.type) {
target.assign(options.type.clone());
}
else if (options?.likeLineOf) {
if (options.likeLineOf instanceof types_1.FieldSymbol) {
options.likeLineOf = options.likeLineOf.getPointer();
}
target.assign(options.likeLineOf.getRowType().clone());
}
else if (options?.like) {
if (options.like instanceof types_1.FieldSymbol) {
options.like = options.like.getPointer();
}
if (options.table === true) {
target.assign(new abap.types.Table(options.like.clone(), tableOptions));
}
else {
target.assign(options.like.clone());
}
}
else {
target.assign(target.getType()?.clone());
}
}
//# sourceMappingURL=create_data.js.map