@abaplint/core
Version:
abaplint - Core API
43 lines • 3.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CDSPrefixedName = void 0;
const combi_1 = require("../../abap/2_statements/combi");
const cds_name_1 = require("./cds_name");
const cds_parameters_1 = require("./cds_parameters");
const cds_parameters_select_1 = require("./cds_parameters_select");
const cds_condition_1 = require("./cds_condition");
const cds_integer_1 = require("./cds_integer");
const cds_string_1 = require("./cds_string");
class CDSPrefixedName extends combi_1.Expression {
getRunnable() {
// Path filter variants:
// [inner], [left outer], [cross] — join-type redirect
// [1:left outer], [1:inner] — cardinality + join-type
// [1: condition] — cardinality + filter condition
// [condition] — filter condition only
const joinType = (0, combi_1.altPrio)("LEFT OUTER", "INNER", "CROSS");
const joinRedirect = (0, combi_1.seq)("[", joinType, "]");
// Cardinality spec: integer or * (e.g. [*:inner], [1:inner])
const cardSpec = (0, combi_1.altPrio)(cds_integer_1.CDSInteger, "*");
const cardinalityJoin = (0, combi_1.seq)("[", cardSpec, ":", joinType, "]");
// [1: left outer where condition] — cardinality + join-type + WHERE filter
const cardinalityJoinWhere = (0, combi_1.seq)("[", cardSpec, ":", joinType, "WHERE", cds_condition_1.CDSCondition, "]");
// [left outer where condition] — join-type + WHERE filter (no cardinality prefix)
const joinWhere = (0, combi_1.seq)("[", joinType, "WHERE", cds_condition_1.CDSCondition, "]");
// Text cardinality forms: [to one: cond], [to many: cond]
const textCard = (0, combi_1.altPrio)("TO ONE", "TO MANY");
const textCardFilter = (0, combi_1.seq)("[", textCard, ":", cds_condition_1.CDSCondition, "]");
// Numeric range cardinality: [0..1: cond], [1..1: cond], [0..*: cond], [n..m: cond]
const cardNum = (0, combi_1.altPrio)(cds_integer_1.CDSInteger, "*");
const rangeCard = (0, combi_1.seq)(cds_integer_1.CDSInteger, ".", ".", cardNum);
const rangeCardFilter = (0, combi_1.seq)("[", rangeCard, ":", cds_condition_1.CDSCondition, "]");
const pathFilter = (0, combi_1.altPrio)(cardinalityJoinWhere, joinWhere, cardinalityJoin, joinRedirect, textCardFilter, rangeCardFilter, (0, combi_1.seq)("[", cardSpec, ":", cds_condition_1.CDSCondition, "]"), (0, combi_1.seq)("[", cds_condition_1.CDSCondition, "]"));
// Each dotted segment may have its own path filter: A[cond].B[cond].C
// The final segment may also be a string literal: #enum.'value'
// A segment may have a parameterized call: _Assoc( P_Key : value ) or _Assoc[filter]
const segment = (0, combi_1.seq)(".", (0, combi_1.altPrio)(cds_string_1.CDSString, cds_name_1.CDSName), (0, combi_1.optPrio)((0, combi_1.altPrio)(cds_parameters_select_1.CDSParametersSelect, cds_parameters_1.CDSParameters)), (0, combi_1.optPrio)(pathFilter));
return (0, combi_1.seq)(cds_name_1.CDSName, (0, combi_1.optPrio)((0, combi_1.altPrio)(cds_parameters_1.CDSParameters, cds_parameters_select_1.CDSParametersSelect)), (0, combi_1.optPrio)(pathFilter), (0, combi_1.star)(segment));
}
}
exports.CDSPrefixedName = CDSPrefixedName;
//# sourceMappingURL=cds_prefixed_name.js.map