@abaplint/transpiler-cli 2.11.91 → 2.11.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/build/bundle.js +256 -644
  2. package/package.json +4 -4
package/build/bundle.js CHANGED
@@ -151,19 +151,17 @@ const virtual_position_1 = __webpack_require__(/*! ../../virtual_position */ "./
151
151
  const tokens_1 = __webpack_require__(/*! ./tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
152
152
  const lexer_buffer_1 = __webpack_require__(/*! ./lexer_buffer */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/lexer_buffer.js");
153
153
  const lexer_stream_1 = __webpack_require__(/*! ./lexer_stream */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/lexer_stream.js");
154
+ const ModeNormal = 1;
155
+ const ModePing = 2;
156
+ const ModeStr = 3;
157
+ const ModeTemplate = 4;
158
+ const ModeComment = 5;
159
+ const ModePragma = 6;
154
160
  class Lexer {
155
- constructor() {
156
- this.ModeNormal = 1;
157
- this.ModePing = 2;
158
- this.ModeStr = 3;
159
- this.ModeTemplate = 4;
160
- this.ModeComment = 5;
161
- this.ModePragma = 6;
162
- }
163
161
  run(file, virtual) {
164
162
  this.virtual = virtual;
165
163
  this.tokens = [];
166
- this.m = this.ModeNormal;
164
+ this.m = ModeNormal;
167
165
  this.process(file.getRaw());
168
166
  return { file, tokens: this.tokens };
169
167
  }
@@ -189,13 +187,13 @@ class Lexer {
189
187
  pos = new virtual_position_1.VirtualPosition(this.virtual, pos.getRow(), pos.getCol());
190
188
  }
191
189
  let tok = undefined;
192
- if (this.m === this.ModeComment) {
190
+ if (this.m === ModeComment) {
193
191
  tok = new tokens_1.Comment(pos, s);
194
192
  }
195
- else if (this.m === this.ModePing || this.m === this.ModeStr) {
193
+ else if (this.m === ModePing || this.m === ModeStr) {
196
194
  tok = new tokens_1.StringToken(pos, s);
197
195
  }
198
- else if (this.m === this.ModeTemplate) {
196
+ else if (this.m === ModeTemplate) {
199
197
  const first = s.charAt(0);
200
198
  const last = s.charAt(s.length - 1);
201
199
  if (first === "|" && last === "|") {
@@ -388,35 +386,35 @@ class Lexer {
388
386
  const buf = this.buffer.add(current);
389
387
  const ahead = this.stream.nextChar();
390
388
  const aahead = this.stream.nextNextChar();
391
- if (this.m === this.ModeNormal) {
389
+ if (this.m === ModeNormal) {
392
390
  if (splits[ahead]) {
393
391
  this.add();
394
392
  }
395
393
  else if (ahead === "'") {
396
394
  // start string
397
395
  this.add();
398
- this.m = this.ModeStr;
396
+ this.m = ModeStr;
399
397
  }
400
398
  else if (ahead === "|" || ahead === "}") {
401
399
  // start template
402
400
  this.add();
403
- this.m = this.ModeTemplate;
401
+ this.m = ModeTemplate;
404
402
  }
405
403
  else if (ahead === "`") {
406
404
  // start ping
407
405
  this.add();
408
- this.m = this.ModePing;
406
+ this.m = ModePing;
409
407
  }
410
408
  else if (aahead === "##") {
411
409
  // start pragma
412
410
  this.add();
413
- this.m = this.ModePragma;
411
+ this.m = ModePragma;
414
412
  }
415
413
  else if (ahead === "\""
416
414
  || (ahead === "*" && current === "\n")) {
417
415
  // start comment
418
416
  this.add();
419
- this.m = this.ModeComment;
417
+ this.m = ModeComment;
420
418
  }
421
419
  else if (ahead === "@" && buf.trim().length === 0) {
422
420
  this.add();
@@ -437,12 +435,12 @@ class Lexer {
437
435
  this.add();
438
436
  }
439
437
  }
440
- else if (this.m === this.ModePragma && (ahead === "," || ahead === ":" || ahead === "." || ahead === " " || ahead === "\n")) {
438
+ else if (this.m === ModePragma && (ahead === "," || ahead === ":" || ahead === "." || ahead === " " || ahead === "\n")) {
441
439
  // end of pragma
442
440
  this.add();
443
- this.m = this.ModeNormal;
441
+ this.m = ModeNormal;
444
442
  }
445
- else if (this.m === this.ModePing
443
+ else if (this.m === ModePing
446
444
  && buf.length > 1
447
445
  && current === "`"
448
446
  && aahead !== "``"
@@ -451,26 +449,26 @@ class Lexer {
451
449
  // end of ping
452
450
  this.add();
453
451
  if (ahead === `"`) {
454
- this.m = this.ModeComment;
452
+ this.m = ModeComment;
455
453
  }
456
454
  else {
457
- this.m = this.ModeNormal;
455
+ this.m = ModeNormal;
458
456
  }
459
457
  }
460
- else if (this.m === this.ModeTemplate
458
+ else if (this.m === ModeTemplate
461
459
  && buf.length > 1
462
460
  && (current === "|" || current === "{")
463
461
  && (this.stream.prevChar() !== "\\" || this.stream.prevPrevChar() === "\\\\")) {
464
462
  // end of template
465
463
  this.add();
466
- this.m = this.ModeNormal;
464
+ this.m = ModeNormal;
467
465
  }
468
- else if (this.m === this.ModeTemplate
466
+ else if (this.m === ModeTemplate
469
467
  && ahead === "}"
470
468
  && current !== "\\") {
471
469
  this.add();
472
470
  }
473
- else if (this.m === this.ModeStr
471
+ else if (this.m === ModeStr
474
472
  && current === "'"
475
473
  && buf.length > 1
476
474
  && aahead !== "''"
@@ -479,17 +477,17 @@ class Lexer {
479
477
  // end of string
480
478
  this.add();
481
479
  if (ahead === "\"") {
482
- this.m = this.ModeComment;
480
+ this.m = ModeComment;
483
481
  }
484
482
  else {
485
- this.m = this.ModeNormal;
483
+ this.m = ModeNormal;
486
484
  }
487
485
  }
488
- else if (ahead === "\n" && this.m !== this.ModeTemplate) {
486
+ else if (ahead === "\n" && this.m !== ModeTemplate) {
489
487
  this.add();
490
- this.m = this.ModeNormal;
488
+ this.m = ModeNormal;
491
489
  }
492
- else if (this.m === this.ModeTemplate && current === "\n") {
490
+ else if (this.m === ModeTemplate && current === "\n") {
493
491
  this.add();
494
492
  }
495
493
  if (!this.stream.advance()) {
@@ -4036,7 +4034,7 @@ exports.EntityAssociation = void 0;
4036
4034
  const combi_1 = __webpack_require__(/*! ../combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
4037
4035
  class EntityAssociation extends combi_1.Expression {
4038
4036
  getRunnable() {
4039
- return (0, combi_1.regex)(/^[\/\w]+(\\_|\\\\)[\_\w\\~]+$/);
4037
+ return (0, combi_1.regex)(/^[\/\w]+(\\_|\\\\)[\/\_\w\\~]+$/);
4040
4038
  }
4041
4039
  }
4042
4040
  exports.EntityAssociation = EntityAssociation;
@@ -7512,9 +7510,14 @@ class SQLFunction extends combi_1.Expression {
7512
7510
  const concat_with_space = (0, combi_1.ver)(version_1.Version.v751, (0, combi_1.seq)((0, combi_1.regex)(/^concat_with_space$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, commaParam, commaParam, (0, combi_1.tok)(tokens_1.WParenRightW)));
7513
7511
  // dunno if the version for substring is correct
7514
7512
  const substring = (0, combi_1.ver)(version_1.Version.v750, (0, combi_1.seq)((0, combi_1.regex)(/^substring$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, commaParam, commaParam, (0, combi_1.tok)(tokens_1.WParenRightW)));
7513
+ // dunno if the version for substring is correct
7514
+ const dats_is_valid = (0, combi_1.ver)(version_1.Version.v754, (0, combi_1.seq)((0, combi_1.regex)(/^dats_is_valid$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, (0, combi_1.tok)(tokens_1.WParenRightW)));
7515
+ const dats_days_between = (0, combi_1.ver)(version_1.Version.v754, (0, combi_1.seq)((0, combi_1.regex)(/^dats_days_between$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, commaParam, (0, combi_1.tok)(tokens_1.WParenRightW)));
7516
+ const dats_add_days = (0, combi_1.ver)(version_1.Version.v754, (0, combi_1.seq)((0, combi_1.regex)(/^dats_is_valid$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, commaParam, (0, combi_1.tok)(tokens_1.WParenRightW)));
7517
+ const dats_add_months = (0, combi_1.ver)(version_1.Version.v754, (0, combi_1.seq)((0, combi_1.regex)(/^dats_is_valid$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, commaParam, (0, combi_1.tok)(tokens_1.WParenRightW)));
7515
7518
  const ltrim = (0, combi_1.ver)(version_1.Version.v750, (0, combi_1.seq)((0, combi_1.regex)(/^ltrim$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, commaParam, (0, combi_1.tok)(tokens_1.WParenRightW)));
7516
7519
  const rtrim = (0, combi_1.ver)(version_1.Version.v750, (0, combi_1.seq)((0, combi_1.regex)(/^rtrim$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, commaParam, (0, combi_1.tok)(tokens_1.WParenRightW)));
7517
- return (0, combi_1.altPrio)(uuid, abs, ceil, floor, cast, div, mod, coalesce, concat, replace, length, lower, upper, round, concat_with_space, ltrim, rtrim, substring);
7520
+ return (0, combi_1.altPrio)(uuid, abs, ceil, floor, cast, div, mod, coalesce, concat, replace, length, lower, upper, round, concat_with_space, ltrim, rtrim, substring, dats_is_valid, dats_days_between, dats_add_days, dats_add_months);
7518
7521
  }
7519
7522
  }
7520
7523
  exports.SQLFunction = SQLFunction;
@@ -8362,10 +8365,11 @@ const combi_1 = __webpack_require__(/*! ../combi */ "./node_modules/@abaplint/co
8362
8365
  const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
8363
8366
  class Type extends combi_1.Expression {
8364
8367
  getRunnable() {
8368
+ const indicators = (0, combi_1.seq)("WITH INDICATORS", _1.ComponentName, "TYPE", _1.TypeName);
8365
8369
  const typeType = (0, combi_1.seq)(_1.TypeName, (0, combi_1.optPrio)(_1.Default));
8366
8370
  const like = (0, combi_1.altPrio)((0, combi_1.seq)("LINE OF", _1.FieldChain), (0, combi_1.seq)("REF TO", _1.FieldChain), _1.FieldChain);
8367
8371
  const type = (0, combi_1.altPrio)((0, combi_1.seq)("LINE OF", typeType), (0, combi_1.seq)("REF TO", typeType), (0, combi_1.seq)(typeType, (0, combi_1.optPrio)(_1.LOBHandle)));
8368
- const ret = (0, combi_1.altPrio)((0, combi_1.seq)("LIKE", like), (0, combi_1.seq)("TYPE", type));
8372
+ const ret = (0, combi_1.seq)((0, combi_1.altPrio)((0, combi_1.seq)("LIKE", like), (0, combi_1.seq)("TYPE", type)), (0, combi_1.optPrio)(indicators));
8369
8373
  return ret;
8370
8374
  }
8371
8375
  }
@@ -8514,7 +8518,7 @@ class TypeTable extends combi_1.Expression {
8514
8518
  // "WITH" is not allowed as a field name in keys
8515
8519
  const typetable = (0, combi_1.alt)(generic, (0, combi_1.seq)(normal1, (0, combi_1.alt)((0, combi_1.opt)((0, combi_1.per)(header, initial, (0, combi_1.plusPrio)(type_table_key_1.TypeTableKey))), (0, combi_1.seq)((0, combi_1.plus)(type_table_key_1.TypeTableKey), (0, combi_1.optPrio)(initial))), (0, combi_1.optPrio)("VALUE IS INITIAL")));
8516
8520
  const occurs = (0, combi_1.seq)("OCCURS", (0, combi_1.altPrio)(_1.Integer, field_chain_1.FieldChain));
8517
- const derived = (0, combi_1.ver)(version_1.Version.v754, (0, combi_1.seq)("TABLE FOR", (0, combi_1.altPrio)("ACTION IMPORT", "ACTION RESULT", "CREATE", "EVENT", "REPORTED EARLY", "FAILED EARLY", "FAILED", "LOCK", "DETERMINATION", "READ RESULT", "UPDATE"), (0, combi_1.alt)(_1.TypeName, _1.EntityAssociation)));
8521
+ const derived = (0, combi_1.ver)(version_1.Version.v754, (0, combi_1.seq)("TABLE FOR", (0, combi_1.altPrio)("ACTION IMPORT", "ACTION RESULT", "CREATE", "EVENT", "REPORTED EARLY", "READ IMPORT", "FAILED EARLY", "FAILED", "LOCK", "DETERMINATION", "READ RESULT", "UPDATE", "DELETE"), (0, combi_1.alt)(_1.TypeName, _1.EntityAssociation)));
8518
8522
  const oldType = (0, combi_1.seq)((0, combi_1.opt)("REF TO"), _1.TypeName, (0, combi_1.alt)((0, combi_1.seq)(occurs, (0, combi_1.opt)(header)), header));
8519
8523
  const oldLike = (0, combi_1.seq)((0, combi_1.opt)("REF TO"), field_chain_1.FieldChain, (0, combi_1.alt)((0, combi_1.seq)(occurs, (0, combi_1.opt)(header)), header));
8520
8524
  const typeLine = (0, combi_1.seq)("LINE OF", _1.TypeName, occurs, header);
@@ -14017,9 +14021,9 @@ class MethodDef {
14017
14021
  const forfunction = (0, combi_1.seq)("FOR FUNCTION", expressions_1.TypeName, result);
14018
14022
  const behavior = (0, combi_1.altPrio)("DDL OBJECT OPTIONS CDS SESSION CLIENT REQUIRED", // todo, this is only from version something
14019
14023
  (0, combi_1.seq)("TABLE FUNCTION", expressions_1.NamespaceSimpleName), // todo, this is only from version something
14020
- (0, combi_1.seq)("VALIDATE ON SAVE IMPORTING", expressions_1.MethodParamName, "FOR", expressions_1.TypeName), (0, combi_1.seq)("MODIFY IMPORTING", (0, combi_1.plus)((0, combi_1.seq)(expressions_1.MethodParamName, modify))), (0, combi_1.seq)("PRECHECK IMPORTING", expressions_1.MethodParamName, modify), (0, combi_1.seq)("NUMBERING IMPORTING", expressions_1.MethodParamName, modify), (0, combi_1.seq)("READ IMPORTING", expressions_1.MethodParamName, (0, combi_1.altPrio)(forRead, forfunction)), (0, combi_1.seq)("FEATURES IMPORTING", expressions_1.MethodParamName, "REQUEST", expressions_1.NamespaceSimpleName, "FOR", expressions_1.NamespaceSimpleName, result), (0, combi_1.seq)("BEHAVIOR IMPORTING", expressions_1.MethodParamName, "FOR CREATE", expressions_1.TypeName, expressions_1.MethodParamName, "FOR UPDATE", expressions_1.TypeName, expressions_1.MethodParamName, "FOR DELETE", expressions_1.TypeName), (0, combi_1.seq)("BEHAVIOR IMPORTING", expressions_1.MethodParamName, "FOR READ", expressions_1.TypeName, result), (0, combi_1.seq)((0, combi_1.alt)("BEHAVIOR", "LOCK"), "IMPORTING", expressions_1.MethodParamName, "FOR LOCK", expressions_1.TypeName), (0, combi_1.seq)("DETERMINE", (0, combi_1.alt)("ON MODIFY", "ON SAVE"), "IMPORTING", expressions_1.MethodParamName, "FOR", expressions_1.TypeName), (0, combi_1.seq)("GLOBAL AUTHORIZATION IMPORTING REQUEST", expressions_1.MethodParamName, "FOR", expressions_1.TypeName, result), (0, combi_1.seq)("GLOBAL FEATURES IMPORTING REQUEST", expressions_1.MethodParamName, "FOR", expressions_1.TypeName, result), (0, combi_1.seq)("INSTANCE AUTHORIZATION IMPORTING", expressions_1.MethodParamName, "REQUEST", expressions_1.MethodParamName, "FOR", expressions_1.TypeName, result), (0, combi_1.seq)("INSTANCE FEATURES IMPORTING", expressions_1.MethodParamName, "REQUEST", expressions_1.MethodParamName, "FOR", expressions_1.TypeName, result));
14024
+ (0, combi_1.seq)("VALIDATE ON SAVE IMPORTING", expressions_1.MethodParamName, "FOR", expressions_1.TypeName), (0, combi_1.seq)("MODIFY", (0, combi_1.opt)("IMPORTING"), (0, combi_1.plus)((0, combi_1.seq)(expressions_1.MethodParamName, modify))), (0, combi_1.seq)("PRECHECK IMPORTING", expressions_1.MethodParamName, modify), (0, combi_1.seq)("DETERMINATION", expressions_1.TypeName, "IMPORTING", expressions_1.MethodParamName, "FOR", expressions_1.TypeName), (0, combi_1.seq)("VALIDATION", expressions_1.TypeName, "IMPORTING", expressions_1.MethodParamName, "FOR", expressions_1.TypeName), (0, combi_1.seq)("NUMBERING IMPORTING", expressions_1.MethodParamName, modify), (0, combi_1.seq)("READ IMPORTING", expressions_1.MethodParamName, (0, combi_1.altPrio)(forRead, forfunction)), (0, combi_1.seq)("FEATURES IMPORTING", expressions_1.MethodParamName, "REQUEST", expressions_1.NamespaceSimpleName, "FOR", expressions_1.NamespaceSimpleName, result), (0, combi_1.seq)("BEHAVIOR IMPORTING", expressions_1.MethodParamName, "FOR CREATE", expressions_1.TypeName, expressions_1.MethodParamName, "FOR UPDATE", expressions_1.TypeName, expressions_1.MethodParamName, "FOR DELETE", expressions_1.TypeName), (0, combi_1.seq)("BEHAVIOR IMPORTING", expressions_1.MethodParamName, "FOR READ", expressions_1.TypeName, result), (0, combi_1.seq)("BEHAVIOR IMPORTING", expressions_1.MethodParamName, "FOR UPDATE", expressions_1.TypeName), (0, combi_1.seq)((0, combi_1.alt)("BEHAVIOR", "LOCK"), "IMPORTING", expressions_1.MethodParamName, "FOR LOCK", expressions_1.TypeName), (0, combi_1.seq)("DETERMINE", (0, combi_1.alt)("ON MODIFY", "ON SAVE"), "IMPORTING", expressions_1.MethodParamName, "FOR", expressions_1.TypeName), (0, combi_1.seq)("GLOBAL AUTHORIZATION IMPORTING REQUEST", expressions_1.MethodParamName, "FOR", expressions_1.TypeName, result), (0, combi_1.seq)("GLOBAL FEATURES IMPORTING REQUEST", expressions_1.MethodParamName, "FOR", expressions_1.TypeName, result), (0, combi_1.seq)((0, combi_1.seq)((0, combi_1.opt)("INSTANCE"), "AUTHORIZATION IMPORTING"), expressions_1.MethodParamName, "REQUEST", expressions_1.MethodParamName, "FOR", expressions_1.TypeName, result), (0, combi_1.seq)("INSTANCE FEATURES IMPORTING", expressions_1.MethodParamName, "REQUEST", expressions_1.MethodParamName, "FOR", expressions_1.TypeName, result));
14021
14025
  // todo, this is only from version something
14022
- const amdp = (0, combi_1.seq)("AMDP OPTIONS", (0, combi_1.optPrio)("READ-ONLY"), "CDS SESSION CLIENT CURRENT", (0, combi_1.optPrio)(expressions_1.MethodDefImporting), (0, combi_1.optPrio)(expressions_1.MethodDefExporting), (0, combi_1.optPrio)(expressions_1.MethodDefRaising));
14026
+ const amdp = (0, combi_1.seq)("AMDP OPTIONS", (0, combi_1.optPrio)("READ-ONLY"), "CDS SESSION CLIENT", (0, combi_1.alt)("CURRENT", "DEPENDENT"), (0, combi_1.optPrio)(expressions_1.MethodDefImporting), (0, combi_1.optPrio)(expressions_1.MethodDefExporting), (0, combi_1.optPrio)(expressions_1.MethodDefRaising));
14023
14027
  const ret = (0, combi_1.seq)((0, combi_1.altPrio)("CLASS-METHODS", "METHODS"), expressions_1.MethodName, (0, combi_1.alt)((0, combi_1.seq)((0, combi_1.optPrio)(expressions_1.Abstract), (0, combi_1.optPrio)(def), expressions_1.EventHandler), parameters, testing, (0, combi_1.seq)("FOR", behavior), amdp, "NOT AT END OF MODE", (0, combi_1.optPrio)(expressions_1.Redefinition)));
14024
14028
  return ret;
14025
14029
  }
@@ -14099,16 +14103,23 @@ class ModifyEntities {
14099
14103
  const fieldsWith = (0, combi_1.seq)("FIELDS (", (0, combi_1.plus)(expressions_1.SimpleName), ")", withh);
14100
14104
  const by = (0, combi_1.seq)("BY", expressions_1.AssociationName);
14101
14105
  const relating = (0, combi_1.seq)("RELATING TO", expressions_1.NamespaceSimpleName, "BY", expressions_1.NamespaceSimpleName);
14102
- const operation = (0, combi_1.alt)((0, combi_1.seq)("UPDATE SET FIELDS WITH", expressions_1.Source), (0, combi_1.seq)("CREATE SET FIELDS WITH", expressions_1.Source), (0, combi_1.seq)("UPDATE", fieldsWith), (0, combi_1.seq)("DELETE FROM", expressions_1.Source), (0, combi_1.seq)("UPDATE FROM", expressions_1.Source, relating), (0, combi_1.seq)("CREATE", (0, combi_1.opt)(by), "FROM", expressions_1.Source, (0, combi_1.opt)(relating)), (0, combi_1.seq)("EXECUTE", expressions_1.SimpleName, "FROM", expressions_1.Source), (0, combi_1.seq)("CREATE", (0, combi_1.opt)(by), (0, combi_1.optPrio)("AUTO FILL CID"), (0, combi_1.altPrio)(withh, fieldsWith)));
14106
+ const execute = (0, combi_1.seq)("EXECUTE", expressions_1.NamespaceSimpleName, "FROM", expressions_1.Source);
14107
+ const create = (0, combi_1.seq)("CREATE", (0, combi_1.opt)(by), "FROM", expressions_1.Source, (0, combi_1.opt)(relating));
14108
+ const updateFrom = (0, combi_1.seq)("UPDATE FROM", expressions_1.Source, (0, combi_1.opt)(relating));
14109
+ const deleteFrom = (0, combi_1.seq)("DELETE FROM", expressions_1.Source);
14110
+ const updateFields = (0, combi_1.seq)("UPDATE", fieldsWith);
14111
+ const operation = (0, combi_1.alt)((0, combi_1.seq)("UPDATE SET FIELDS WITH", expressions_1.Source), (0, combi_1.seq)("CREATE SET FIELDS WITH", expressions_1.Source), updateFields, deleteFrom, updateFrom, create, execute, (0, combi_1.seq)("CREATE", (0, combi_1.opt)(by), (0, combi_1.optPrio)("AUTO FILL CID"), (0, combi_1.altPrio)(withh, fieldsWith)));
14103
14112
  const failed = (0, combi_1.seq)("FAILED", expressions_1.Target);
14104
14113
  const result = (0, combi_1.seq)("RESULT", expressions_1.Target);
14105
14114
  const mapped = (0, combi_1.seq)("MAPPED", expressions_1.Target);
14106
14115
  const reported = (0, combi_1.seq)("REPORTED", expressions_1.Target);
14107
- const from = (0, combi_1.seq)("FROM", expressions_1.Source);
14108
- const execute = (0, combi_1.seq)("EXECUTE", expressions_1.NamespaceSimpleName);
14109
- const entities = (0, combi_1.seq)((0, combi_1.optPrio)("AUGMENTING"), "ENTITIES OF", expressions_1.NamespaceSimpleName, (0, combi_1.opt)("IN LOCAL MODE"), (0, combi_1.plusPrio)((0, combi_1.seq)("ENTITY", expressions_1.SimpleName, (0, combi_1.plus)(operation))), (0, combi_1.optPrio)((0, combi_1.per)(failed, result, mapped, reported)));
14110
- const entity = (0, combi_1.seq)("ENTITY", expressions_1.NamespaceSimpleName, execute, from, mapped, failed, reported);
14111
- return (0, combi_1.ver)(version_1.Version.v754, (0, combi_1.seq)("MODIFY", (0, combi_1.alt)(entities, entity)));
14116
+ const end = (0, combi_1.optPrio)((0, combi_1.per)(failed, result, mapped, reported));
14117
+ const entities = (0, combi_1.seq)((0, combi_1.optPrio)("AUGMENTING"), "ENTITIES OF", expressions_1.NamespaceSimpleName, (0, combi_1.opt)("IN LOCAL MODE"), (0, combi_1.plusPrio)((0, combi_1.seq)("ENTITY", expressions_1.NamespaceSimpleName, (0, combi_1.plus)(operation))));
14118
+ const create2 = (0, combi_1.seq)("CREATE", fieldsWith, (0, combi_1.opt)((0, combi_1.seq)("CREATE BY", expressions_1.AssociationName, fieldsWith)));
14119
+ const create3 = (0, combi_1.seq)("CREATE BY", expressions_1.AssociationName, fieldsWith);
14120
+ const create4 = (0, combi_1.seq)("CREATE FROM", expressions_1.Source, (0, combi_1.plus)((0, combi_1.seq)("CREATE BY", expressions_1.AssociationName, "FROM", expressions_1.Source)));
14121
+ const entity = (0, combi_1.seq)("ENTITY", (0, combi_1.opt)("IN LOCAL MODE"), (0, combi_1.alt)(expressions_1.NamespaceSimpleName, expressions_1.EntityAssociation), (0, combi_1.alt)(execute, create, updateFields, deleteFrom, updateFrom, create2, create3, create4));
14122
+ return (0, combi_1.ver)(version_1.Version.v754, (0, combi_1.seq)("MODIFY", (0, combi_1.alt)(entities, entity), end));
14112
14123
  }
14113
14124
  }
14114
14125
  exports.ModifyEntities = ModifyEntities;
@@ -15046,9 +15057,16 @@ class ReadEntities {
15046
15057
  const from = (0, combi_1.seq)("FROM", expressions_1.Source);
15047
15058
  const fields = (0, combi_1.seq)("FIELDS", (0, combi_1.tok)(tokens_1.WParenLeftW), (0, combi_1.plus)(expressions_1.SimpleName), (0, combi_1.tok)(tokens_1.WParenRightW), "WITH", expressions_1.Source);
15048
15059
  const all = (0, combi_1.seq)("ALL FIELDS WITH", expressions_1.Source);
15049
- const entity = (0, combi_1.seq)("ENTITY", expressions_1.NamespaceSimpleName, (0, combi_1.opt)((0, combi_1.seq)("BY", expressions_1.AssociationName)), (0, combi_1.alt)(fields, from, all), (0, combi_1.optPrio)((0, combi_1.seq)("RESULT", expressions_1.Target)));
15050
- const s = (0, combi_1.seq)("READ ENTITIES OF", expressions_1.NamespaceSimpleName, (0, combi_1.opt)("IN LOCAL MODE"), (0, combi_1.plus)(entity), (0, combi_1.optPrio)((0, combi_1.seq)("LINK", expressions_1.Target)), (0, combi_1.optPrio)((0, combi_1.seq)("FAILED", expressions_1.Target)), (0, combi_1.optPrio)((0, combi_1.seq)("REPORTED", expressions_1.Target)));
15051
- return (0, combi_1.ver)(version_1.Version.v754, s);
15060
+ const result = (0, combi_1.seq)("RESULT", expressions_1.Target);
15061
+ const failed = (0, combi_1.seq)("FAILED", expressions_1.Target);
15062
+ const reported = (0, combi_1.seq)("REPORTED", expressions_1.Target);
15063
+ const entity = (0, combi_1.seq)("ENTITY", expressions_1.NamespaceSimpleName, (0, combi_1.opt)((0, combi_1.seq)("BY", expressions_1.AssociationName)), (0, combi_1.alt)(fields, from, all), (0, combi_1.optPrio)(result));
15064
+ const s = (0, combi_1.seq)("ENTITIES OF", expressions_1.NamespaceSimpleName, (0, combi_1.opt)("IN LOCAL MODE"), (0, combi_1.plus)(entity), (0, combi_1.optPrio)((0, combi_1.seq)("LINK", expressions_1.Target)), (0, combi_1.optPrio)((0, combi_1.per)(failed, reported)));
15065
+ const byall = (0, combi_1.seq)("BY", expressions_1.AssociationName, all);
15066
+ const by = (0, combi_1.seq)("BY", expressions_1.AssociationName, fields);
15067
+ const sub = (0, combi_1.seq)((0, combi_1.alt)(all, fields, from, by, byall), result);
15068
+ const single = (0, combi_1.seq)("ENTITY", (0, combi_1.opt)("IN LOCAL MODE"), (0, combi_1.alt)(expressions_1.NamespaceSimpleName, expressions_1.EntityAssociation), (0, combi_1.plus)(sub), (0, combi_1.optPrio)(failed), (0, combi_1.optPrio)(reported));
15069
+ return (0, combi_1.ver)(version_1.Version.v754, (0, combi_1.seq)("READ", (0, combi_1.alt)(s, single)));
15052
15070
  }
15053
15071
  }
15054
15072
  exports.ReadEntities = ReadEntities;
@@ -15586,7 +15604,7 @@ const expressions_1 = __webpack_require__(/*! ../expressions */ "./node_modules/
15586
15604
  const version_1 = __webpack_require__(/*! ../../../version */ "./node_modules/@abaplint/core/build/src/version.js");
15587
15605
  class Select {
15588
15606
  getMatcher() {
15589
- const union = (0, combi_1.ver)(version_1.Version.v750, (0, combi_1.seq)("UNION", (0, combi_1.optPrio)((0, combi_1.altPrio)("DISTINCT", "ALL")), expressions_1.Select));
15607
+ const union = (0, combi_1.ver)(version_1.Version.v750, (0, combi_1.seq)("UNION", (0, combi_1.optPrio)((0, combi_1.altPrio)("DISTINCT", "ALL")), expressions_1.Select), version_1.Version.OpenABAP);
15590
15608
  return (0, combi_1.seq)(expressions_1.Select, (0, combi_1.starPrio)(union));
15591
15609
  }
15592
15610
  }
@@ -17254,7 +17272,8 @@ class UpdateDatabase {
17254
17272
  getMatcher() {
17255
17273
  const parameters = (0, combi_1.seq)(expressions_1.SQLFieldAndValue, (0, combi_1.star)((0, combi_1.seq)((0, combi_1.opt)(","), expressions_1.SQLFieldAndValue)));
17256
17274
  const set = (0, combi_1.seq)("SET", (0, combi_1.alt)(parameters, expressions_1.Dynamic), (0, combi_1.opt)((0, combi_1.seq)("WHERE", expressions_1.SQLCond)));
17257
- const fromTable = (0, combi_1.seq)("FROM", (0, combi_1.opt)("TABLE"), expressions_1.SQLSource);
17275
+ const indicators = (0, combi_1.seq)("INDICATORS SET STRUCTURE", expressions_1.ComponentName);
17276
+ const fromTable = (0, combi_1.seq)("FROM", (0, combi_1.opt)("TABLE"), expressions_1.SQLSource, (0, combi_1.opt)(indicators));
17258
17277
  const ret = (0, combi_1.seq)("UPDATE", expressions_1.DatabaseTable, (0, combi_1.opt)(expressions_1.SQLClient), (0, combi_1.opt)(expressions_1.DatabaseConnection), (0, combi_1.opt)((0, combi_1.alt)(fromTable, set)));
17259
17278
  return ret;
17260
17279
  }
@@ -23123,7 +23142,7 @@ class BasicTypes {
23123
23142
  }
23124
23143
  parseTable(node, name) {
23125
23144
  var _a, _b, _c, _d;
23126
- const typename = node.findFirstExpression(Expressions.TypeName);
23145
+ const typename = node.findFirstExpression(Expressions.TypeName) || node.findFirstExpression(Expressions.EntityAssociation);
23127
23146
  const text = (_a = node.findFirstExpression(Expressions.TypeTable)) === null || _a === void 0 ? void 0 : _a.concatTokens().toUpperCase();
23128
23147
  if (text === undefined) {
23129
23148
  return undefined;
@@ -23259,6 +23278,8 @@ class BasicTypes {
23259
23278
  return new Types.TableType(structure, options);
23260
23279
  }
23261
23280
  else if (typename && (text.startsWith("TYPE TABLE FOR CREATE ")
23281
+ || text.startsWith("TYPE TABLE FOR READ ")
23282
+ || text.startsWith("TYPE TABLE FOR DELETE ")
23262
23283
  || text.startsWith("TYPE TABLE FOR UPDATE "))) {
23263
23284
  const name = typename.concatTokens();
23264
23285
  const type = (_d = this.input.scope.getDDIC().lookupDDLS(name)) === null || _d === void 0 ? void 0 : _d.type;
@@ -28886,6 +28907,11 @@ class Append {
28886
28907
  if (sourceType instanceof basic_1.TableType) {
28887
28908
  sourceType = sourceType.getRowType();
28888
28909
  }
28910
+ else if (!(sourceType instanceof basic_1.VoidType) && !(sourceType instanceof basic_1.UnknownType)) {
28911
+ const message = "LINES OF must be a table type";
28912
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
28913
+ return;
28914
+ }
28889
28915
  if (targetType instanceof basic_1.TableType) {
28890
28916
  targetType = targetType.getRowType();
28891
28917
  }
@@ -35307,560 +35333,6 @@ exports.ArtifactsABAP = ArtifactsABAP;
35307
35333
 
35308
35334
  /***/ }),
35309
35335
 
35310
- /***/ "./node_modules/@abaplint/core/build/src/abap/flow/flow_graph.js":
35311
- /*!***********************************************************************!*\
35312
- !*** ./node_modules/@abaplint/core/build/src/abap/flow/flow_graph.js ***!
35313
- \***********************************************************************/
35314
- /***/ ((__unused_webpack_module, exports) => {
35315
-
35316
- "use strict";
35317
-
35318
- Object.defineProperty(exports, "__esModule", ({ value: true }));
35319
- exports.FlowGraph = exports.FLOW_EDGE_TYPE = void 0;
35320
- var FLOW_EDGE_TYPE;
35321
- (function (FLOW_EDGE_TYPE) {
35322
- FLOW_EDGE_TYPE["true"] = "true";
35323
- FLOW_EDGE_TYPE["false"] = "false";
35324
- FLOW_EDGE_TYPE["undefined"] = "undefined";
35325
- })(FLOW_EDGE_TYPE || (exports.FLOW_EDGE_TYPE = FLOW_EDGE_TYPE = {}));
35326
- class FlowGraph {
35327
- constructor(counter) {
35328
- this.edges = {};
35329
- this.label = "undefined";
35330
- this.startNode = "start#" + counter;
35331
- this.endNode = "end#" + counter;
35332
- }
35333
- getStart() {
35334
- return this.startNode;
35335
- }
35336
- getLabel() {
35337
- return this.label;
35338
- }
35339
- getEnd() {
35340
- return this.endNode;
35341
- }
35342
- addEdge(from, to, type) {
35343
- if (this.edges[from] === undefined) {
35344
- this.edges[from] = {};
35345
- }
35346
- this.edges[from][to] = type;
35347
- }
35348
- removeEdge(from, to) {
35349
- if (this.edges[from] === undefined) {
35350
- return;
35351
- }
35352
- delete this.edges[from][to];
35353
- if (Object.keys(this.edges[from]).length === 0) {
35354
- delete this.edges[from];
35355
- }
35356
- }
35357
- listEdges() {
35358
- const list = [];
35359
- for (const from of Object.keys(this.edges)) {
35360
- for (const to of Object.keys(this.edges[from])) {
35361
- list.push({ from, to, type: this.edges[from][to] });
35362
- }
35363
- }
35364
- return list;
35365
- }
35366
- listNodes() {
35367
- const set = new Set();
35368
- for (const l of this.listEdges()) {
35369
- set.add(l.from);
35370
- set.add(l.to);
35371
- }
35372
- return Array.from(set.values());
35373
- }
35374
- hasEdges() {
35375
- return Object.keys(this.edges).length > 0;
35376
- }
35377
- /** return value: end node of to graph */
35378
- addGraph(from, to, type) {
35379
- if (to.hasEdges() === false) {
35380
- return from;
35381
- }
35382
- this.addEdge(from, to.getStart(), type);
35383
- to.listEdges().forEach(e => this.addEdge(e.from, e.to, e.type));
35384
- return to.getEnd();
35385
- }
35386
- toJSON() {
35387
- return JSON.stringify(this.edges);
35388
- }
35389
- toTextEdges() {
35390
- let graph = "";
35391
- for (const l of this.listEdges()) {
35392
- const label = l.type === FLOW_EDGE_TYPE.undefined ? "" : ` [label="${l.type}"]`;
35393
- graph += `"${l.from}" -> "${l.to}"${label};\n`;
35394
- }
35395
- return graph.trim();
35396
- }
35397
- setLabel(label) {
35398
- this.label = label;
35399
- }
35400
- toDigraph() {
35401
- return `digraph G {
35402
- labelloc="t";
35403
- label="${this.label}";
35404
- graph [fontname = "helvetica"];
35405
- node [fontname = "helvetica", shape="box"];
35406
- edge [fontname = "helvetica"];
35407
- ${this.toTextEdges()}
35408
- }`;
35409
- }
35410
- listSources(node) {
35411
- const set = [];
35412
- for (const l of this.listEdges()) {
35413
- if (node === l.to) {
35414
- set.push({ name: l.from, type: l.type });
35415
- }
35416
- }
35417
- return set;
35418
- }
35419
- listTargets(node) {
35420
- const set = [];
35421
- for (const l of this.listEdges()) {
35422
- if (node === l.from) {
35423
- set.push({ name: l.to, type: l.type });
35424
- }
35425
- }
35426
- return set;
35427
- }
35428
- /** removes all nodes containing "#" that have one in-going and one out-going edge */
35429
- reduce() {
35430
- for (const node of this.listNodes()) {
35431
- if (node.includes("#") === false) {
35432
- continue;
35433
- }
35434
- const sources = this.listSources(node);
35435
- const targets = this.listTargets(node);
35436
- if (sources.length > 0 && targets.length > 0) {
35437
- // hash node in the middle of the graph
35438
- for (const s of sources) {
35439
- this.removeEdge(s.name, node);
35440
- }
35441
- for (const t of targets) {
35442
- this.removeEdge(node, t.name);
35443
- }
35444
- for (const s of sources) {
35445
- for (const t of targets) {
35446
- let type = FLOW_EDGE_TYPE.undefined;
35447
- if (s.type !== FLOW_EDGE_TYPE.undefined) {
35448
- type = s.type;
35449
- }
35450
- if (t.type !== FLOW_EDGE_TYPE.undefined) {
35451
- if (type !== FLOW_EDGE_TYPE.undefined) {
35452
- throw new Error("reduce: cannot merge, different edge types");
35453
- }
35454
- type = t.type;
35455
- }
35456
- this.addEdge(s.name, t.name, type);
35457
- }
35458
- }
35459
- }
35460
- if (node.startsWith("end#") && sources.length === 0) {
35461
- for (const t of targets) {
35462
- this.removeEdge(node, t.name);
35463
- }
35464
- }
35465
- }
35466
- return this;
35467
- }
35468
- }
35469
- exports.FlowGraph = FlowGraph;
35470
- //# sourceMappingURL=flow_graph.js.map
35471
-
35472
- /***/ }),
35473
-
35474
- /***/ "./node_modules/@abaplint/core/build/src/abap/flow/selection_events.js":
35475
- /*!*****************************************************************************!*\
35476
- !*** ./node_modules/@abaplint/core/build/src/abap/flow/selection_events.js ***!
35477
- \*****************************************************************************/
35478
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
35479
-
35480
- "use strict";
35481
-
35482
- Object.defineProperty(exports, "__esModule", ({ value: true }));
35483
- exports.DECLARATION_STUFF = exports.SELECTION_EVENTS = void 0;
35484
- const Statements = __webpack_require__(/*! ../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
35485
- exports.SELECTION_EVENTS = [
35486
- Statements.StartOfSelection,
35487
- Statements.AtSelectionScreen,
35488
- Statements.AtLineSelection,
35489
- Statements.AtPF,
35490
- Statements.AtUserCommand,
35491
- Statements.EndOfSelection,
35492
- Statements.Initialization,
35493
- Statements.TopOfPage,
35494
- Statements.LoadOfProgram,
35495
- Statements.EndOfPage,
35496
- ];
35497
- exports.DECLARATION_STUFF = [
35498
- Statements.Data,
35499
- Statements.DataBegin,
35500
- Statements.Constant,
35501
- Statements.Tables,
35502
- Statements.Include, // this is not super correct, but anyhow
35503
- Statements.Parameter,
35504
- Statements.SelectionScreen,
35505
- Statements.ConstantBegin,
35506
- Statements.Define,
35507
- ];
35508
- //# sourceMappingURL=selection_events.js.map
35509
-
35510
- /***/ }),
35511
-
35512
- /***/ "./node_modules/@abaplint/core/build/src/abap/flow/statement_flow.js":
35513
- /*!***************************************************************************!*\
35514
- !*** ./node_modules/@abaplint/core/build/src/abap/flow/statement_flow.js ***!
35515
- \***************************************************************************/
35516
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
35517
-
35518
- "use strict";
35519
-
35520
- Object.defineProperty(exports, "__esModule", ({ value: true }));
35521
- exports.StatementFlow = void 0;
35522
- const nodes_1 = __webpack_require__(/*! ../nodes */ "./node_modules/@abaplint/core/build/src/abap/nodes/index.js");
35523
- const Structures = __webpack_require__(/*! ../3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
35524
- const Statements = __webpack_require__(/*! ../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
35525
- const Expressions = __webpack_require__(/*! ../2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
35526
- const flow_graph_1 = __webpack_require__(/*! ./flow_graph */ "./node_modules/@abaplint/core/build/src/abap/flow/flow_graph.js");
35527
- const objects_1 = __webpack_require__(/*! ../../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
35528
- const selection_events_1 = __webpack_require__(/*! ./selection_events */ "./node_modules/@abaplint/core/build/src/abap/flow/selection_events.js");
35529
- const virtual_position_1 = __webpack_require__(/*! ../../virtual_position */ "./node_modules/@abaplint/core/build/src/virtual_position.js");
35530
- class StatementFlow {
35531
- constructor() {
35532
- this.counter = 0;
35533
- }
35534
- build(stru, obj) {
35535
- var _a, _b, _c, _d;
35536
- const ret = [];
35537
- let name = "";
35538
- const structures = stru.findAllStructuresMulti([
35539
- Structures.Form, Structures.ClassImplementation, Structures.FunctionModule, Structures.Module
35540
- ]);
35541
- for (const s of structures) {
35542
- if (s.get() instanceof Structures.Form) {
35543
- name = "FORM " + ((_a = s.findFirstExpression(Expressions.FormName)) === null || _a === void 0 ? void 0 : _a.concatTokens());
35544
- ret.push(this.run(s, name));
35545
- }
35546
- else if (s.get() instanceof Structures.ClassImplementation) {
35547
- const className = (_b = s.findFirstExpression(Expressions.ClassName)) === null || _b === void 0 ? void 0 : _b.concatTokens();
35548
- for (const method of s.findDirectStructures(Structures.Method)) {
35549
- const methodName = (_c = method.findFirstExpression(Expressions.MethodName)) === null || _c === void 0 ? void 0 : _c.concatTokens();
35550
- name = "METHOD " + methodName + ", CLASS " + className;
35551
- ret.push(this.run(method, name));
35552
- }
35553
- }
35554
- else if (s.get() instanceof Structures.FunctionModule) {
35555
- name = "FUNCTION " + ((_d = s.findFirstExpression(Expressions.Field)) === null || _d === void 0 ? void 0 : _d.concatTokens());
35556
- ret.push(this.run(s, name));
35557
- }
35558
- else if (s.get() instanceof Structures.Module) {
35559
- name = s.getFirstStatement().concatTokens().toUpperCase();
35560
- ret.push(this.run(s, name));
35561
- }
35562
- else {
35563
- throw new Error("StatementFlow, unknown structure");
35564
- }
35565
- }
35566
- if (obj instanceof objects_1.Program || obj instanceof objects_1.FunctionGroup) {
35567
- // find the top level events
35568
- let inEvent = false;
35569
- let collected = [];
35570
- for (const s of stru.getChildren() || []) {
35571
- if (selection_events_1.SELECTION_EVENTS.some(f => s.get() instanceof f)) {
35572
- if (inEvent === true) {
35573
- ret.push(this.runEvent(collected, name));
35574
- }
35575
- collected = [];
35576
- inEvent = true;
35577
- name = s.concatTokens();
35578
- }
35579
- else if (s.get() instanceof Structures.Normal) {
35580
- collected.push(s);
35581
- }
35582
- else {
35583
- if (inEvent === true) {
35584
- ret.push(this.runEvent(collected, name));
35585
- inEvent = false;
35586
- }
35587
- collected = [];
35588
- }
35589
- }
35590
- if (inEvent === true) {
35591
- ret.push(this.runEvent(collected, name));
35592
- }
35593
- else if (collected.length > 0
35594
- && !(obj instanceof objects_1.FunctionGroup)) {
35595
- // implicit START-OF-SELECTION
35596
- ret.push(this.runEvent(collected, "START-OF-SELECTION."));
35597
- }
35598
- }
35599
- return ret.map(f => f.reduce());
35600
- }
35601
- ////////////////////
35602
- runEvent(s, name) {
35603
- this.counter = 1;
35604
- const graph = this.traverseBody(s, { procedureEnd: "end#1" });
35605
- graph.setLabel(name);
35606
- return graph;
35607
- }
35608
- run(s, name) {
35609
- this.counter = 1;
35610
- const graph = this.traverseBody(this.findBody(s), { procedureEnd: "end#1" });
35611
- graph.setLabel(name);
35612
- return graph;
35613
- }
35614
- findBody(f) {
35615
- var _a;
35616
- return ((_a = f.findDirectStructure(Structures.Body)) === null || _a === void 0 ? void 0 : _a.getChildren()) || [];
35617
- }
35618
- // note: it must handle macros and chained statements
35619
- static buildName(statement) {
35620
- let token = undefined;
35621
- const colon = statement.getColon();
35622
- if (colon === undefined) {
35623
- token = statement.getFirstToken();
35624
- }
35625
- else {
35626
- for (const t of statement.getTokens()) {
35627
- if (t.getStart().isAfter(colon.getEnd())) {
35628
- token = t;
35629
- break;
35630
- }
35631
- }
35632
- }
35633
- let extra = "";
35634
- const tStart = token === null || token === void 0 ? void 0 : token.getStart();
35635
- if (tStart instanceof virtual_position_1.VirtualPosition) {
35636
- extra += "$" + tStart.vrow;
35637
- extra += "," + tStart.vcol;
35638
- }
35639
- if (token === undefined) {
35640
- return "tokenError";
35641
- }
35642
- return statement.get().constructor.name +
35643
- ":" + token.getRow() +
35644
- "," + token.getCol() + extra;
35645
- }
35646
- traverseBody(children, context) {
35647
- const graph = new flow_graph_1.FlowGraph(this.counter++);
35648
- if (children.length === 0) {
35649
- graph.addEdge(graph.getStart(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35650
- return graph;
35651
- }
35652
- let current = graph.getStart();
35653
- for (const c of children) {
35654
- if (c.get() instanceof Structures.Normal) {
35655
- const firstChild = c.getFirstChild(); // "Normal" only has one child
35656
- if (firstChild instanceof nodes_1.StatementNode) {
35657
- const name = StatementFlow.buildName(firstChild);
35658
- graph.addEdge(current, name, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35659
- current = name;
35660
- if (firstChild.get() instanceof Statements.Check) {
35661
- if (context.loopStart) {
35662
- graph.addEdge(name, context.loopStart, flow_graph_1.FLOW_EDGE_TYPE.false);
35663
- }
35664
- else {
35665
- graph.addEdge(name, context.procedureEnd, flow_graph_1.FLOW_EDGE_TYPE.false);
35666
- }
35667
- }
35668
- else if (firstChild.get() instanceof Statements.Assert) {
35669
- graph.addEdge(name, context.procedureEnd, flow_graph_1.FLOW_EDGE_TYPE.false);
35670
- }
35671
- else if (firstChild.get() instanceof Statements.Continue && context.loopStart) {
35672
- graph.addEdge(name, context.loopStart, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35673
- return graph;
35674
- }
35675
- else if (firstChild.get() instanceof Statements.Exit) {
35676
- if (context.loopEnd) {
35677
- graph.addEdge(name, context.loopEnd, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35678
- }
35679
- else {
35680
- graph.addEdge(name, context.procedureEnd, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35681
- }
35682
- return graph;
35683
- }
35684
- else if (firstChild.get() instanceof Statements.Return) {
35685
- graph.addEdge(name, context.procedureEnd, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35686
- return graph;
35687
- }
35688
- }
35689
- else if (firstChild instanceof nodes_1.StructureNode) {
35690
- const sub = this.traverseStructure(firstChild, context);
35691
- current = graph.addGraph(current, sub, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35692
- }
35693
- }
35694
- }
35695
- graph.addEdge(current, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35696
- return graph;
35697
- }
35698
- traverseStructure(n, context) {
35699
- const graph = new flow_graph_1.FlowGraph(this.counter++);
35700
- if (n === undefined) {
35701
- return graph;
35702
- }
35703
- let current = graph.getStart();
35704
- const type = n.get();
35705
- if (type instanceof Structures.If) {
35706
- const ifName = StatementFlow.buildName(n.findDirectStatement(Statements.If));
35707
- const sub = this.traverseBody(this.findBody(n), context);
35708
- graph.addEdge(current, ifName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35709
- graph.addGraph(ifName, sub, flow_graph_1.FLOW_EDGE_TYPE.true);
35710
- graph.addEdge(sub.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35711
- current = ifName;
35712
- for (const e of n.findDirectStructures(Structures.ElseIf)) {
35713
- const elseifst = e.findDirectStatement(Statements.ElseIf);
35714
- if (elseifst === undefined) {
35715
- continue;
35716
- }
35717
- const elseIfName = StatementFlow.buildName(elseifst);
35718
- const sub = this.traverseBody(this.findBody(e), context);
35719
- graph.addEdge(current, elseIfName, flow_graph_1.FLOW_EDGE_TYPE.false);
35720
- graph.addGraph(elseIfName, sub, flow_graph_1.FLOW_EDGE_TYPE.true);
35721
- graph.addEdge(sub.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35722
- current = elseIfName;
35723
- }
35724
- const els = n.findDirectStructure(Structures.Else);
35725
- const elsest = els === null || els === void 0 ? void 0 : els.findDirectStatement(Statements.Else);
35726
- if (els && elsest) {
35727
- const elseName = StatementFlow.buildName(elsest);
35728
- const sub = this.traverseBody(this.findBody(els), context);
35729
- graph.addEdge(current, elseName, flow_graph_1.FLOW_EDGE_TYPE.false);
35730
- graph.addGraph(elseName, sub, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35731
- graph.addEdge(sub.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35732
- }
35733
- else {
35734
- graph.addEdge(ifName, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.false);
35735
- }
35736
- }
35737
- else if (type instanceof Structures.Loop
35738
- || type instanceof Structures.While
35739
- || type instanceof Structures.With
35740
- || type instanceof Structures.Provide
35741
- || type instanceof Structures.Select
35742
- || type instanceof Structures.EnhancementSection
35743
- || type instanceof Structures.LoopAtScreen
35744
- || type instanceof Structures.Do) {
35745
- const loopName = StatementFlow.buildName(n.getFirstStatement());
35746
- const sub = this.traverseBody(this.findBody(n), Object.assign(Object.assign({}, context), { loopStart: loopName, loopEnd: graph.getEnd() }));
35747
- graph.addEdge(current, loopName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35748
- graph.addGraph(loopName, sub, flow_graph_1.FLOW_EDGE_TYPE.true);
35749
- graph.addEdge(sub.getEnd(), loopName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35750
- graph.addEdge(loopName, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.false);
35751
- }
35752
- else if (type instanceof Structures.Data
35753
- || type instanceof Structures.Constants
35754
- || type instanceof Structures.Statics
35755
- || type instanceof Structures.ExecSQL
35756
- || type instanceof Structures.Types) {
35757
- // these doesnt affect control flow, so just take the first statement
35758
- const statement = n.getFirstStatement();
35759
- const name = StatementFlow.buildName(statement);
35760
- graph.addEdge(current, name, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35761
- graph.addEdge(name, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35762
- }
35763
- else if (type instanceof Structures.TestSeam) {
35764
- const name = StatementFlow.buildName(n.getFirstStatement());
35765
- const sub = this.traverseBody(this.findBody(n), context);
35766
- graph.addEdge(current, name, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35767
- graph.addGraph(name, sub, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35768
- graph.addEdge(sub.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35769
- }
35770
- else if (type instanceof Structures.AtFirst
35771
- || type instanceof Structures.AtLast
35772
- || type instanceof Structures.At
35773
- || type instanceof Structures.OnChange) {
35774
- const name = StatementFlow.buildName(n.getFirstStatement());
35775
- const body = this.traverseBody(this.findBody(n), context);
35776
- graph.addEdge(current, name, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35777
- graph.addGraph(name, body, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35778
- graph.addEdge(body.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35779
- graph.addEdge(current, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35780
- }
35781
- else if (type instanceof Structures.Try) {
35782
- const tryName = StatementFlow.buildName(n.getFirstStatement());
35783
- const body = this.traverseBody(this.findBody(n), context);
35784
- graph.addEdge(current, tryName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35785
- graph.addGraph(tryName, body, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35786
- graph.addEdge(body.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35787
- for (const c of n.findDirectStructures(Structures.Catch)) {
35788
- const catchName = StatementFlow.buildName(c.getFirstStatement());
35789
- const catchBody = this.traverseBody(this.findBody(c), context);
35790
- // TODO: this does not take exceptions into account
35791
- graph.addEdge(body.getEnd(), catchName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35792
- graph.addGraph(catchName, catchBody, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35793
- graph.addEdge(catchBody.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35794
- }
35795
- // TODO, handle CLEANUP
35796
- }
35797
- else if (type instanceof Structures.CatchSystemExceptions) {
35798
- // TODO: this is not completely correct
35799
- const catchName = StatementFlow.buildName(n.getFirstStatement());
35800
- const body = this.traverseBody(this.findBody(n), context);
35801
- graph.addEdge(current, catchName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35802
- graph.addGraph(catchName, body, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35803
- graph.addEdge(body.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35804
- }
35805
- else if (type instanceof Structures.Case) {
35806
- const caseName = StatementFlow.buildName(n.getFirstStatement());
35807
- graph.addEdge(current, caseName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35808
- let othersFound = false;
35809
- for (const w of n.findDirectStructures(Structures.When)) {
35810
- const first = w.getFirstStatement();
35811
- if (first === undefined) {
35812
- continue;
35813
- }
35814
- if (first.get() instanceof Statements.WhenOthers) {
35815
- othersFound = true;
35816
- }
35817
- const firstName = StatementFlow.buildName(first);
35818
- const sub = this.traverseBody(this.findBody(w), context);
35819
- graph.addEdge(caseName, firstName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35820
- graph.addGraph(firstName, sub, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35821
- graph.addEdge(sub.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35822
- }
35823
- if (othersFound === false) {
35824
- graph.addEdge(caseName, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35825
- }
35826
- }
35827
- else if (type instanceof Structures.CaseType) {
35828
- const caseName = StatementFlow.buildName(n.getFirstStatement());
35829
- graph.addEdge(current, caseName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35830
- let othersFound = false;
35831
- for (const w of n.findDirectStructures(Structures.WhenType)) {
35832
- const first = w.getFirstStatement();
35833
- if (first === undefined) {
35834
- continue;
35835
- }
35836
- if (first.get() instanceof Statements.WhenOthers) {
35837
- othersFound = true;
35838
- }
35839
- const firstName = StatementFlow.buildName(first);
35840
- const sub = this.traverseBody(this.findBody(w), context);
35841
- graph.addEdge(caseName, firstName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35842
- graph.addGraph(firstName, sub, flow_graph_1.FLOW_EDGE_TYPE.undefined);
35843
- graph.addEdge(sub.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35844
- }
35845
- if (othersFound === false) {
35846
- graph.addEdge(caseName, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
35847
- }
35848
- }
35849
- else if (type instanceof Structures.Define
35850
- || type instanceof Structures.TestInjection) {
35851
- // do nothing
35852
- }
35853
- else {
35854
- console.dir("StatementFlow,todo, " + n.get().constructor.name);
35855
- }
35856
- return graph;
35857
- }
35858
- }
35859
- exports.StatementFlow = StatementFlow;
35860
- //# sourceMappingURL=statement_flow.js.map
35861
-
35862
- /***/ }),
35863
-
35864
35336
  /***/ "./node_modules/@abaplint/core/build/src/abap/nodes/_abstract_node.js":
35865
35337
  /*!****************************************************************************!*\
35866
35338
  !*** ./node_modules/@abaplint/core/build/src/abap/nodes/_abstract_node.js ***!
@@ -39852,6 +39324,8 @@ class MethodParameters {
39852
39324
  || concat.includes(" FOR FEATURES ")
39853
39325
  || concat.includes(" FOR INSTANCE FEATURES ")
39854
39326
  || concat.includes(" FOR READ ")
39327
+ || concat.includes(" FOR VALIDATION ")
39328
+ || concat.includes(" FOR DETERMINE ")
39855
39329
  || concat.includes(" FOR LOCK ")
39856
39330
  || concat.includes(" FOR MODIFY ")) {
39857
39331
  const token = isRap.getFirstToken();
@@ -40367,7 +39841,7 @@ const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src
40367
39841
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
40368
39842
  class CDSAggregate extends combi_1.Expression {
40369
39843
  getRunnable() {
40370
- const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.opt)((0, combi_1.seq)(".", _1.CDSName)));
39844
+ const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.star)((0, combi_1.seq)(".", _1.CDSName)));
40371
39845
  const value = (0, combi_1.alt)(name, "*", _1.CDSCast, _1.CDSCase, _1.CDSFunction);
40372
39846
  return (0, combi_1.seq)((0, combi_1.alt)("MAX", "MIN", "SUM", "AVG", "COUNT"), "(", (0, combi_1.opt)("DISTINCT"), value, ")");
40373
39847
  }
@@ -40585,8 +40059,10 @@ exports.CDSCardinality = void 0;
40585
40059
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
40586
40060
  class CDSCardinality extends combi_1.Expression {
40587
40061
  getRunnable() {
40588
- const cardinality = (0, combi_1.seq)("[", (0, combi_1.alt)("0", "1", "*"), (0, combi_1.opt)((0, combi_1.seq)(".", ".", (0, combi_1.alt)("0", "1", "*"))), "]");
40589
- return cardinality;
40062
+ const numeric = (0, combi_1.seq)("[", (0, combi_1.alt)("0", "1", "*"), (0, combi_1.opt)((0, combi_1.seq)(".", ".", (0, combi_1.alt)("0", "1", "*"))), "]");
40063
+ const num = (0, combi_1.alt)("ONE", "MANY");
40064
+ const text = (0, combi_1.seq)("OF", num, "TO", num);
40065
+ return (0, combi_1.alt)(numeric, text);
40590
40066
  }
40591
40067
  }
40592
40068
  exports.CDSCardinality = CDSCardinality;
@@ -40740,7 +40216,7 @@ class CDSDefineCustom extends combi_1.Expression {
40740
40216
  getRunnable() {
40741
40217
  const field = (0, combi_1.seq)((0, combi_1.opt)((0, combi_1.str)("KEY")), cds_name_1.CDSName, ":", cds_type_1.CDSType, ";");
40742
40218
  const compsiOrAssoci = (0, combi_1.seq)(cds_name_1.CDSName, ":", (0, combi_1.alt)(_1.CDSComposition, _1.CDSAssociation), ";");
40743
- return (0, combi_1.seq)((0, combi_1.star)(_1.CDSAnnotation), (0, combi_1.str)("DEFINE"), (0, combi_1.opt)((0, combi_1.str)("ROOT")), (0, combi_1.str)("CUSTOM ENTITY"), cds_name_1.CDSName, (0, combi_1.str)("{"), (0, combi_1.plus)((0, combi_1.seq)((0, combi_1.star)(_1.CDSAnnotation), (0, combi_1.alt)(field, compsiOrAssoci))), (0, combi_1.str)("}"), (0, combi_1.opt)(";"));
40219
+ return (0, combi_1.seq)((0, combi_1.star)(_1.CDSAnnotation), (0, combi_1.str)("DEFINE"), (0, combi_1.opt)((0, combi_1.str)("ROOT")), (0, combi_1.str)("CUSTOM ENTITY"), (0, combi_1.opt)(_1.CDSWithParameters), cds_name_1.CDSName, (0, combi_1.str)("{"), (0, combi_1.plus)((0, combi_1.seq)((0, combi_1.star)(_1.CDSAnnotation), (0, combi_1.alt)(field, compsiOrAssoci))), (0, combi_1.str)("}"), (0, combi_1.opt)(";"));
40744
40220
  }
40745
40221
  }
40746
40222
  exports.CDSDefineCustom = CDSDefineCustom;
@@ -41136,9 +40612,10 @@ exports.CDSPrefixedName = void 0;
41136
40612
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
41137
40613
  const cds_name_1 = __webpack_require__(/*! ./cds_name */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_name.js");
41138
40614
  const cds_parameters_1 = __webpack_require__(/*! ./cds_parameters */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_parameters.js");
40615
+ const cds_parameters_select_1 = __webpack_require__(/*! ./cds_parameters_select */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_parameters_select.js");
41139
40616
  class CDSPrefixedName extends combi_1.Expression {
41140
40617
  getRunnable() {
41141
- return (0, combi_1.seq)(cds_name_1.CDSName, (0, combi_1.opt)(cds_parameters_1.CDSParameters), (0, combi_1.star)((0, combi_1.seq)(".", cds_name_1.CDSName, (0, combi_1.opt)(cds_parameters_1.CDSParameters))));
40618
+ return (0, combi_1.seq)(cds_name_1.CDSName, (0, combi_1.opt)((0, combi_1.alt)(cds_parameters_1.CDSParameters, cds_parameters_select_1.CDSParametersSelect)), (0, combi_1.star)((0, combi_1.seq)(".", cds_name_1.CDSName, (0, combi_1.opt)(cds_parameters_1.CDSParameters))));
41142
40619
  }
41143
40620
  }
41144
40621
  exports.CDSPrefixedName = CDSPrefixedName;
@@ -44569,7 +44046,6 @@ const code_actions_1 = __webpack_require__(/*! ./code_actions */ "./node_modules
44569
44046
  const references_1 = __webpack_require__(/*! ./references */ "./node_modules/@abaplint/core/build/src/lsp/references.js");
44570
44047
  const implementation_1 = __webpack_require__(/*! ./implementation */ "./node_modules/@abaplint/core/build/src/lsp/implementation.js");
44571
44048
  const semantic_1 = __webpack_require__(/*! ./semantic */ "./node_modules/@abaplint/core/build/src/lsp/semantic.js");
44572
- const statement_flow_1 = __webpack_require__(/*! ../abap/flow/statement_flow */ "./node_modules/@abaplint/core/build/src/abap/flow/statement_flow.js");
44573
44049
  const code_lens_1 = __webpack_require__(/*! ./code_lens */ "./node_modules/@abaplint/core/build/src/lsp/code_lens.js");
44574
44050
  const inlay_hints_1 = __webpack_require__(/*! ./inlay_hints */ "./node_modules/@abaplint/core/build/src/lsp/inlay_hints.js");
44575
44051
  // note Ranges are zero based in LSP,
@@ -44681,23 +44157,6 @@ class LanguageServer {
44681
44157
  listWritePositions(textDocument) {
44682
44158
  return new highlight_1.Highlight(this.reg).listWritePositions(textDocument);
44683
44159
  }
44684
- dumpStatementFlows(textDocument) {
44685
- const file = _lsp_utils_1.LSPUtils.getABAPFile(this.reg, textDocument.uri);
44686
- if (file === undefined) {
44687
- return "file not found";
44688
- }
44689
- const obj = this.reg.findObjectForFile(file);
44690
- if (obj === undefined) {
44691
- return "obj not found";
44692
- }
44693
- const stru = file.getStructure();
44694
- if (stru === undefined) {
44695
- return "empty structure";
44696
- }
44697
- const graphs = new statement_flow_1.StatementFlow().build(stru, obj);
44698
- const wiz = graphs.map(g => g.toDigraph());
44699
- return JSON.stringify(wiz);
44700
- }
44701
44160
  }
44702
44161
  exports.LanguageServer = LanguageServer;
44703
44162
  //# sourceMappingURL=language_server.js.map
@@ -46654,6 +46113,37 @@ exports.BusinessObjectType = BusinessObjectType;
46654
46113
 
46655
46114
  /***/ }),
46656
46115
 
46116
+ /***/ "./node_modules/@abaplint/core/build/src/objects/cds_entity_buffer.js":
46117
+ /*!****************************************************************************!*\
46118
+ !*** ./node_modules/@abaplint/core/build/src/objects/cds_entity_buffer.js ***!
46119
+ \****************************************************************************/
46120
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
46121
+
46122
+ "use strict";
46123
+
46124
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
46125
+ exports.CDSEntityBuffer = void 0;
46126
+ const _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ "./node_modules/@abaplint/core/build/src/objects/_abstract_object.js");
46127
+ class CDSEntityBuffer extends _abstract_object_1.AbstractObject {
46128
+ getType() {
46129
+ return "DTEB";
46130
+ }
46131
+ getAllowedNaming() {
46132
+ return {
46133
+ maxLength: 30,
46134
+ allowNamespace: true,
46135
+ };
46136
+ }
46137
+ getDescription() {
46138
+ // todo
46139
+ return undefined;
46140
+ }
46141
+ }
46142
+ exports.CDSEntityBuffer = CDSEntityBuffer;
46143
+ //# sourceMappingURL=cds_entity_buffer.js.map
46144
+
46145
+ /***/ }),
46146
+
46657
46147
  /***/ "./node_modules/@abaplint/core/build/src/objects/cds_metadata_extension.js":
46658
46148
  /*!*********************************************************************************!*\
46659
46149
  !*** ./node_modules/@abaplint/core/build/src/objects/cds_metadata_extension.js ***!
@@ -49194,6 +48684,7 @@ __exportStar(__webpack_require__(/*! ./behavior_definition */ "./node_modules/@a
49194
48684
  __exportStar(__webpack_require__(/*! ./brf_plus_system_application */ "./node_modules/@abaplint/core/build/src/objects/brf_plus_system_application.js"), exports);
49195
48685
  __exportStar(__webpack_require__(/*! ./bsp_application */ "./node_modules/@abaplint/core/build/src/objects/bsp_application.js"), exports);
49196
48686
  __exportStar(__webpack_require__(/*! ./business_add_in_implementation */ "./node_modules/@abaplint/core/build/src/objects/business_add_in_implementation.js"), exports);
48687
+ __exportStar(__webpack_require__(/*! ./cds_entity_buffer */ "./node_modules/@abaplint/core/build/src/objects/cds_entity_buffer.js"), exports);
49197
48688
  __exportStar(__webpack_require__(/*! ./business_catalog_app_assignment */ "./node_modules/@abaplint/core/build/src/objects/business_catalog_app_assignment.js"), exports);
49198
48689
  __exportStar(__webpack_require__(/*! ./business_catalog */ "./node_modules/@abaplint/core/build/src/objects/business_catalog.js"), exports);
49199
48690
  __exportStar(__webpack_require__(/*! ./business_configuration_maintenance_object */ "./node_modules/@abaplint/core/build/src/objects/business_configuration_maintenance_object.js"), exports);
@@ -52284,7 +51775,7 @@ class Table extends _abstract_object_1.AbstractObject {
52284
51775
  }
52285
51776
  getAllowedNaming() {
52286
51777
  let length = 30;
52287
- const regex = /^((\/[A-Z_\d]{3,8}\/)|[a-zA-Z0-9]{3})\w+$/;
51778
+ const regex = /^((\/[A-Z_\d]{3,8}\/)|[a-zA-Z0-9]{3}|CI_)\w+$/;
52288
51779
  if (this.getTableCategory() === TableCategory.Transparent) {
52289
51780
  length = 16;
52290
51781
  }
@@ -52589,6 +52080,11 @@ class TableType extends _abstract_object_1.AbstractObject {
52589
52080
  this.parseXML();
52590
52081
  return (_a = this.parsedXML) === null || _a === void 0 ? void 0 : _a.ddtext;
52591
52082
  }
52083
+ getRowType() {
52084
+ var _a;
52085
+ this.parseXML();
52086
+ return (_a = this.parsedXML) === null || _a === void 0 ? void 0 : _a.rowtype;
52087
+ }
52592
52088
  setDirty() {
52593
52089
  this.parsedXML = undefined;
52594
52090
  super.setDirty();
@@ -53893,7 +53389,7 @@ class Registry {
53893
53389
  }
53894
53390
  static abaplintVersion() {
53895
53391
  // magic, see build script "version.sh"
53896
- return "2.113.200";
53392
+ return "2.113.210";
53897
53393
  }
53898
53394
  getDDICReferences() {
53899
53395
  return this.ddicReferences;
@@ -56597,6 +56093,7 @@ class CheckCommentsConf extends _basic_rule_config_1.BasicRuleConfig {
56597
56093
  super(...arguments);
56598
56094
  /** Allows the use of end-of-line comments. */
56599
56095
  this.allowEndOfLine = false;
56096
+ this.maxIssuesPerFile = 10;
56600
56097
  }
56601
56098
  }
56602
56099
  exports.CheckCommentsConf = CheckCommentsConf;
@@ -56642,6 +56139,10 @@ https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#put-comment
56642
56139
  if (this.conf.allowEndOfLine === true) {
56643
56140
  return [];
56644
56141
  }
56142
+ let max = this.getConfig().maxIssuesPerFile;
56143
+ if (max === undefined || max < 1) {
56144
+ max = 10;
56145
+ }
56645
56146
  const commentRows = [];
56646
56147
  for (let i = 0; i < rows.length; i++) {
56647
56148
  const row = rows[i];
@@ -56658,6 +56159,9 @@ https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#put-comment
56658
56159
  continue;
56659
56160
  }
56660
56161
  issues.push(issue_1.Issue.atStatement(file, statement, this.getDescription(IssueType.EndOfLine), this.getMetadata().key, this.conf.severity));
56162
+ if (issues.length >= max) {
56163
+ break;
56164
+ }
56661
56165
  }
56662
56166
  }
56663
56167
  return issues;
@@ -57546,9 +57050,13 @@ class CloudTypes {
57546
57050
  || obj instanceof Objects.BusinessCatalogAppAssignment
57547
57051
  || obj instanceof Objects.CDSMetadataExtension
57548
57052
  || obj instanceof Objects.Class
57053
+ || obj instanceof Objects.CDSType
57054
+ || obj instanceof Objects.ChangeDocument
57055
+ || obj instanceof Objects.CDSEntityBuffer
57549
57056
  || obj instanceof Objects.ApplicationLogObject
57550
57057
  || obj instanceof Objects.CommunicationScenario
57551
57058
  || obj instanceof Objects.DataControl
57059
+ || obj instanceof Objects.KnowledgeTransferDocument
57552
57060
  || obj instanceof Objects.DataDefinition
57553
57061
  || obj instanceof Objects.DataElement
57554
57062
  || obj instanceof Objects.Domain
@@ -62201,7 +61709,7 @@ const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./
62201
61709
  const Structures = __webpack_require__(/*! ../abap/3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
62202
61710
  const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/core/build/src/rules/_irule.js");
62203
61711
  const objects_1 = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
62204
- const selection_events_1 = __webpack_require__(/*! ../abap/flow/selection_events */ "./node_modules/@abaplint/core/build/src/abap/flow/selection_events.js");
61712
+ const stuff_1 = __webpack_require__(/*! ../stuff */ "./node_modules/@abaplint/core/build/src/stuff.js");
62205
61713
  class EmptyEventConf extends _basic_rule_config_1.BasicRuleConfig {
62206
61714
  }
62207
61715
  exports.EmptyEventConf = EmptyEventConf;
@@ -62245,7 +61753,7 @@ START-OF-SELECTION.
62245
61753
  let currentEvent = undefined;
62246
61754
  let children = [];
62247
61755
  for (const s of stru.getChildren() || []) {
62248
- if (selection_events_1.SELECTION_EVENTS.some(f => s.get() instanceof f)) {
61756
+ if (stuff_1.SELECTION_EVENTS.some(f => s.get() instanceof f)) {
62249
61757
  if (currentEvent !== undefined && children.length === 0) {
62250
61758
  issues.push(issue_1.Issue.atStatement(file, currentEvent, "Empty event", this.getMetadata().key, this.getConfig().severity));
62251
61759
  }
@@ -62255,7 +61763,7 @@ START-OF-SELECTION.
62255
61763
  else if (s.get() instanceof Structures.Normal) {
62256
61764
  const stru = s;
62257
61765
  // ignore declaration stuff
62258
- if (selection_events_1.DECLARATION_STUFF.some(d => { var _a; return ((_a = stru.getFirstStatement()) === null || _a === void 0 ? void 0 : _a.get()) instanceof d; })) {
61766
+ if (stuff_1.DECLARATION_STUFF.some(d => { var _a; return ((_a = stru.getFirstStatement()) === null || _a === void 0 ? void 0 : _a.get()) instanceof d; })) {
62259
61767
  continue;
62260
61768
  }
62261
61769
  children.push(s);
@@ -64668,7 +64176,7 @@ const Structures = __webpack_require__(/*! ../abap/3_structures/structures */ ".
64668
64176
  const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/core/build/src/rules/_irule.js");
64669
64177
  const objects_1 = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
64670
64178
  const nodes_1 = __webpack_require__(/*! ../abap/nodes */ "./node_modules/@abaplint/core/build/src/abap/nodes/index.js");
64671
- const selection_events_1 = __webpack_require__(/*! ../abap/flow/selection_events */ "./node_modules/@abaplint/core/build/src/abap/flow/selection_events.js");
64179
+ const stuff_1 = __webpack_require__(/*! ../stuff */ "./node_modules/@abaplint/core/build/src/stuff.js");
64672
64180
  class ImplicitStartOfSelectionConf extends _basic_rule_config_1.BasicRuleConfig {
64673
64181
  }
64674
64182
  exports.ImplicitStartOfSelectionConf = ImplicitStartOfSelectionConf;
@@ -64711,7 +64219,7 @@ START-OF-SELECTION.
64711
64219
  let inEvent = false;
64712
64220
  let collected = [];
64713
64221
  for (const s of stru.getChildren() || []) {
64714
- if (selection_events_1.SELECTION_EVENTS.some(f => s.get() instanceof f)) {
64222
+ if (stuff_1.SELECTION_EVENTS.some(f => s.get() instanceof f)) {
64715
64223
  if (inEvent === false && collected.length > 0) {
64716
64224
  // implicit START-OF-SELECTION
64717
64225
  let first = collected[0];
@@ -64726,7 +64234,7 @@ START-OF-SELECTION.
64726
64234
  else if (s.get() instanceof Structures.Normal) {
64727
64235
  const stru = s;
64728
64236
  // ignore declaration stuff
64729
- if (selection_events_1.DECLARATION_STUFF.some(d => { var _a; return ((_a = stru.getFirstStatement()) === null || _a === void 0 ? void 0 : _a.get()) instanceof d; })) {
64237
+ if (stuff_1.DECLARATION_STUFF.some(d => { var _a; return ((_a = stru.getFirstStatement()) === null || _a === void 0 ? void 0 : _a.get()) instanceof d; })) {
64730
64238
  continue;
64731
64239
  }
64732
64240
  collected.push(s);
@@ -64918,6 +64426,7 @@ class IndentationConf extends _basic_rule_config_1.BasicRuleConfig {
64918
64426
  this.globalClassSkipFirst = false;
64919
64427
  this.ignoreGlobalClassDefinition = false;
64920
64428
  this.ignoreGlobalInterface = false;
64429
+ this.maxIssuesPerFile = 10;
64921
64430
  }
64922
64431
  }
64923
64432
  exports.IndentationConf = IndentationConf;
@@ -64960,7 +64469,10 @@ ENDCLASS.`,
64960
64469
  }
64961
64470
  runParsed(file, obj) {
64962
64471
  var _a, _b;
64963
- const MAX_ISSUES = 100;
64472
+ let max = this.getConfig().maxIssuesPerFile;
64473
+ if (max === undefined || max < 1) {
64474
+ max = 10;
64475
+ }
64964
64476
  let skip = false;
64965
64477
  if (file.getStructure() === undefined) {
64966
64478
  return []; // syntax error in file
@@ -65032,7 +64544,7 @@ ENDCLASS.`,
65032
64544
  const message = "Indentation problem, expected " + expected + " spaces";
65033
64545
  const issue = issue_1.Issue.atPosition(file, position, message, this.getMetadata().key, this.conf.severity, fix);
65034
64546
  ret.push(issue);
65035
- if (ret.length >= MAX_ISSUES) {
64547
+ if (ret.length >= max) {
65036
64548
  break;
65037
64549
  }
65038
64550
  }
@@ -65702,6 +65214,7 @@ class KeywordCaseConf extends _basic_rule_config_1.BasicRuleConfig {
65702
65214
  this.ignoreGlobalClassBoundaries = false;
65703
65215
  /** A list of keywords to be ignored */
65704
65216
  this.ignoreKeywords = [];
65217
+ this.maxIssuesPerFile = 10;
65705
65218
  }
65706
65219
  }
65707
65220
  exports.KeywordCaseConf = KeywordCaseConf;
@@ -65812,6 +65325,10 @@ class KeywordCase extends _abap_rule_1.ABAPRule {
65812
65325
  return [];
65813
65326
  }
65814
65327
  }
65328
+ let max = this.getConfig().maxIssuesPerFile;
65329
+ if (max === undefined || max < 1) {
65330
+ max = 10;
65331
+ }
65815
65332
  const skip = new Skip(this.getConfig());
65816
65333
  let prev = undefined;
65817
65334
  for (const statement of file.getStatements()) {
@@ -65834,6 +65351,9 @@ class KeywordCase extends _abap_rule_1.ABAPRule {
65834
65351
  }
65835
65352
  prev = result[0].token;
65836
65353
  }
65354
+ if (issues.length >= max) {
65355
+ break;
65356
+ }
65837
65357
  }
65838
65358
  return issues;
65839
65359
  }
@@ -66101,6 +65621,7 @@ class LineLengthConf extends _basic_rule_config_1.BasicRuleConfig {
66101
65621
  super(...arguments);
66102
65622
  /** Maximum line length in characters, trailing whitespace ignored */
66103
65623
  this.length = 120;
65624
+ this.maxIssuesPerFile = 10;
66104
65625
  }
66105
65626
  }
66106
65627
  exports.LineLengthConf = LineLengthConf;
@@ -66129,6 +65650,10 @@ https://docs.abapopenchecks.org/checks/04/`,
66129
65650
  const issues = [];
66130
65651
  // maximum line length in abap files
66131
65652
  const maxLineLength = 255;
65653
+ let max = this.getConfig().maxIssuesPerFile;
65654
+ if (max === undefined || max < 1) {
65655
+ max = 10;
65656
+ }
66132
65657
  const array = file.getRawRows();
66133
65658
  for (let rowIndex = 0; rowIndex < array.length; rowIndex++) {
66134
65659
  const row = array[rowIndex].replace("\r", "");
@@ -66140,6 +65665,9 @@ https://docs.abapopenchecks.org/checks/04/`,
66140
65665
  const message = `Reduce line length to max ${this.conf.length}, currently ${row.length}`;
66141
65666
  issues.push(issue_1.Issue.atRow(file, rowIndex + 1, message, this.getMetadata().key, this.conf.severity));
66142
65667
  }
65668
+ if (issues.length >= max) {
65669
+ break;
65670
+ }
66143
65671
  }
66144
65672
  return issues;
66145
65673
  }
@@ -68584,6 +68112,7 @@ class NoPrefixesConf extends _basic_rule_config_1.BasicRuleConfig {
68584
68112
  /** importing, exporting, returning and changing parameters, case insensitive regex */
68585
68113
  this.methodParameters = "^[ICER].?_";
68586
68114
  this.allowIsPrefixBoolean = true;
68115
+ this.maxIssuesPerFile = 10;
68587
68116
  // todo, public localClass: string = "";
68588
68117
  // todo, public localInterface: string = "";
68589
68118
  // todo, public functionModuleParameters: string = "";
@@ -68630,21 +68159,40 @@ https://github.com/SAP/styleguides/blob/main/clean-abap/sub-sections/AvoidEncodi
68630
68159
  // syntax error, skip
68631
68160
  return [];
68632
68161
  }
68162
+ let max = config.maxIssuesPerFile;
68163
+ if (max === undefined || max < 1) {
68164
+ max = 10;
68165
+ }
68633
68166
  if (config.data !== undefined && config.data !== "") {
68634
68167
  ret.push(...this.checkData(structure, new RegExp(config.data, "i"), file));
68635
68168
  }
68169
+ if (ret.length >= max) {
68170
+ return ret;
68171
+ }
68636
68172
  if (config.statics !== undefined && config.statics !== "") {
68637
68173
  ret.push(...this.checkStatics(structure, new RegExp(config.statics, "i"), file));
68638
68174
  }
68175
+ if (ret.length >= max) {
68176
+ return ret;
68177
+ }
68639
68178
  if (config.fieldSymbols !== undefined && config.fieldSymbols !== "") {
68640
68179
  ret.push(...this.checkFieldSymbols(structure, new RegExp(config.fieldSymbols, "i"), file));
68641
68180
  }
68181
+ if (ret.length >= max) {
68182
+ return ret;
68183
+ }
68642
68184
  if (config.constants !== undefined && config.constants !== "") {
68643
68185
  ret.push(...this.checkConstants(structure, new RegExp(config.constants, "i"), file));
68644
68186
  }
68187
+ if (ret.length >= max) {
68188
+ return ret;
68189
+ }
68645
68190
  if (config.types !== undefined && config.types !== "") {
68646
68191
  ret.push(...this.checkTypes(structure, new RegExp(config.types, "i"), file));
68647
68192
  }
68193
+ if (ret.length >= max) {
68194
+ return ret;
68195
+ }
68648
68196
  if (config.methodParameters !== undefined && config.methodParameters !== "") {
68649
68197
  ret.push(...this.checkMethodParameters(structure, new RegExp(config.methodParameters, "i"), file));
68650
68198
  }
@@ -73153,16 +72701,22 @@ class SQLEscapeHostVariables extends _abap_rule_1.ABAPRule {
73153
72701
  return [];
73154
72702
  }
73155
72703
  for (const s of file.getStatements()) {
73156
- if (s.get() instanceof Statements.UpdateDatabase
73157
- || s.get() instanceof Statements.ModifyDatabase
73158
- || s.get() instanceof Statements.Select
73159
- || s.get() instanceof Statements.SelectLoop
73160
- || s.get() instanceof Statements.InsertDatabase
73161
- || s.get() instanceof Statements.DeleteDatabase) {
72704
+ const get = s.get();
72705
+ if (get instanceof Statements.UpdateDatabase
72706
+ || get instanceof Statements.ModifyDatabase
72707
+ || get instanceof Statements.Select
72708
+ || get instanceof Statements.SelectLoop
72709
+ || get instanceof Statements.InsertDatabase
72710
+ || get instanceof Statements.DeleteDatabase) {
73162
72711
  for (const o of s.findAllExpressionsMulti([Expressions.SQLSource, Expressions.SQLSourceSimple])) {
73163
72712
  const first = o.getFirstChild();
73164
72713
  if (((first === null || first === void 0 ? void 0 : first.get()) instanceof Expressions.Source && first.getChildren()[0].get() instanceof Expressions.FieldChain)
73165
72714
  || ((first === null || first === void 0 ? void 0 : first.get()) instanceof Expressions.SimpleSource3 && first.getChildren()[0].get() instanceof Expressions.FieldChain)) {
72715
+ if (get instanceof Statements.ModifyDatabase
72716
+ && first.getFirstToken().getStr().toUpperCase().startsWith("LS_")) {
72717
+ // heuristic, might not be correct in all cases
72718
+ continue;
72719
+ }
73166
72720
  const message = "Escape SQL host variables";
73167
72721
  const firstToken = o.getFirstChild().getFirstToken();
73168
72722
  const fix = edit_helper_1.EditHelper.replaceToken(file, firstToken, "@" + (firstToken === null || firstToken === void 0 ? void 0 : firstToken.getStr()));
@@ -74570,6 +74124,10 @@ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/c
74570
74124
  const edit_helper_1 = __webpack_require__(/*! ../edit_helper */ "./node_modules/@abaplint/core/build/src/edit_helper.js");
74571
74125
  const _statement_1 = __webpack_require__(/*! ../abap/2_statements/statements/_statement */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js");
74572
74126
  class UnnecessaryChainingConf extends _basic_rule_config_1.BasicRuleConfig {
74127
+ constructor() {
74128
+ super(...arguments);
74129
+ this.maxIssuesPerFile = 10;
74130
+ }
74573
74131
  }
74574
74132
  exports.UnnecessaryChainingConf = UnnecessaryChainingConf;
74575
74133
  class UnnecessaryChaining extends _abap_rule_1.ABAPRule {
@@ -74596,6 +74154,10 @@ class UnnecessaryChaining extends _abap_rule_1.ABAPRule {
74596
74154
  }
74597
74155
  runParsed(file) {
74598
74156
  const issues = [];
74157
+ let max = this.getConfig().maxIssuesPerFile;
74158
+ if (max === undefined || max < 1) {
74159
+ max = 10;
74160
+ }
74599
74161
  const statements = file.getStatements();
74600
74162
  for (let i = 0; i < statements.length; i++) {
74601
74163
  const colon = statements[i].getColon();
@@ -74626,6 +74188,9 @@ class UnnecessaryChaining extends _abap_rule_1.ABAPRule {
74626
74188
  const message = "Unnecessary chaining";
74627
74189
  const issue = issue_1.Issue.atToken(file, colon, message, this.getMetadata().key, this.conf.severity, fix);
74628
74190
  issues.push(issue);
74191
+ if (issues.length >= max) {
74192
+ break;
74193
+ }
74629
74194
  }
74630
74195
  return issues;
74631
74196
  }
@@ -77040,6 +76605,48 @@ exports.SkipLogic = SkipLogic;
77040
76605
 
77041
76606
  /***/ }),
77042
76607
 
76608
+ /***/ "./node_modules/@abaplint/core/build/src/stuff.js":
76609
+ /*!********************************************************!*\
76610
+ !*** ./node_modules/@abaplint/core/build/src/stuff.js ***!
76611
+ \********************************************************/
76612
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
76613
+
76614
+ "use strict";
76615
+
76616
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
76617
+ exports.DECLARATION_STUFF = exports.SELECTION_EVENTS = void 0;
76618
+ const Statements = __webpack_require__(/*! ./abap/2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
76619
+ exports.SELECTION_EVENTS = [
76620
+ Statements.StartOfSelection,
76621
+ Statements.AtSelectionScreen,
76622
+ Statements.AtLineSelection,
76623
+ Statements.AtPF,
76624
+ Statements.AtUserCommand,
76625
+ Statements.EndOfSelection,
76626
+ Statements.Initialization,
76627
+ Statements.TopOfPage,
76628
+ Statements.LoadOfProgram,
76629
+ Statements.EndOfPage,
76630
+ ];
76631
+ exports.DECLARATION_STUFF = [
76632
+ Statements.Type,
76633
+ Statements.TypeBegin,
76634
+ Statements.TypeEnum,
76635
+ Statements.TypeEnumBegin,
76636
+ Statements.Data,
76637
+ Statements.DataBegin,
76638
+ Statements.Constant,
76639
+ Statements.ConstantBegin,
76640
+ Statements.Tables,
76641
+ Statements.Include, // this is not super correct, but anyhow
76642
+ Statements.Parameter,
76643
+ Statements.SelectionScreen,
76644
+ Statements.Define,
76645
+ ];
76646
+ //# sourceMappingURL=stuff.js.map
76647
+
76648
+ /***/ }),
76649
+
77043
76650
  /***/ "./node_modules/@abaplint/core/build/src/utils/cyclomatic_complexity_stats.js":
77044
76651
  /*!************************************************************************************!*\
77045
76652
  !*** ./node_modules/@abaplint/core/build/src/utils/cyclomatic_complexity_stats.js ***!
@@ -84626,6 +84233,7 @@ class ClassImplementationTranspiler {
84626
84233
  }
84627
84234
  const scope = traversal.findCurrentScopeByToken(token);
84628
84235
  return new chunk_1.Chunk().append(ret + ` {
84236
+ static STATIC_SUPER = ${traversal_1.Traversal.escapeNamespace(def?.getSuperClass()?.toLowerCase())};
84629
84237
  static INTERNAL_TYPE = 'CLAS';
84630
84238
  static INTERNAL_NAME = '${traversal.buildInternalName(token.getStr(), def)}';
84631
84239
  static IMPLEMENTED_INTERFACES = [${this.findImplementedByClass(traversal, def, scope).map(e => `"` + e.toUpperCase() + `"`).join(",")}];
@@ -88692,7 +88300,10 @@ function escapeRegExp(string) {
88692
88300
  // TODO: currently SELECT into are always handled as CORRESPONDING
88693
88301
  class SelectTranspiler {
88694
88302
  transpile(node, traversal, targetOverride) {
88695
- if (node.findDirectTokenByText("ALL") !== undefined) {
88303
+ if (node.findDirectTokenByText("UNION") !== undefined) {
88304
+ return new chunk_1.Chunk(`throw new Error("SELECT UNION, not supported, transpiler, todo");`);
88305
+ }
88306
+ else if (node.findDirectTokenByText("ALL") !== undefined) {
88696
88307
  throw new Error("SelectTranspiler, UNION ALL todo");
88697
88308
  }
88698
88309
  else if (node.findDirectTokenByText("DISTINCT") !== undefined) {
@@ -90765,6 +90376,7 @@ class InterfaceTranspiler {
90765
90376
  ret += `static INTERNAL_NAME = '${traversal.buildInternalName(token.getStr(), def)}';\n`;
90766
90377
  ret += `static ATTRIBUTES = {${Array.from(traversal.buildAttributes(def, scope)).join(",\n")}};\n`;
90767
90378
  ret += `static METHODS = {${traversal.buildMethods(def, scope).join(",\n")}};\n`;
90379
+ // todo, add IMPLEMENTED_INTERFACES ?
90768
90380
  }
90769
90381
  else if (c instanceof abaplint.Nodes.StatementNode && c.get() instanceof abaplint.Statements.EndInterface) {
90770
90382
  ret += "}\n";