@abaplint/transpiler-cli 2.10.22 → 2.10.24

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.
package/build/bundle.js CHANGED
@@ -4155,7 +4155,7 @@ const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src
4155
4155
  class FieldLength extends combi_1.Expression {
4156
4156
  getRunnable() {
4157
4157
  const normal = (0, combi_1.seq)((0, combi_1.optPrio)((0, combi_1.tok)(tokens_1.Plus)), (0, combi_1.altPrio)((0, combi_1.regex)(/^\d+$/), _1.SimpleFieldChain2));
4158
- const length = (0, combi_1.seq)((0, combi_1.tok)(tokens_1.ParenLeft), (0, combi_1.altPrio)(normal, "*"), (0, combi_1.tok)(tokens_1.ParenRightW));
4158
+ const length = (0, combi_1.seq)((0, combi_1.tok)(tokens_1.ParenLeft), (0, combi_1.optPrio)((0, combi_1.altPrio)(normal, "*")), (0, combi_1.tok)(tokens_1.ParenRightW));
4159
4159
  return length;
4160
4160
  }
4161
4161
  }
@@ -4201,9 +4201,10 @@ exports.FieldSub = void 0;
4201
4201
  const combi_1 = __webpack_require__(/*! ../combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
4202
4202
  const tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
4203
4203
  const table_body_1 = __webpack_require__(/*! ./table_body */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/table_body.js");
4204
+ const field_length_1 = __webpack_require__(/*! ./field_length */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/field_length.js");
4204
4205
  class FieldSub extends combi_1.Expression {
4205
4206
  getRunnable() {
4206
- const ret = (0, combi_1.seq)((0, combi_1.regex)(/^\*?!?&?(\/\w+\/)?[a-zA-Z_%$\?][\w%$\$\*]*$/), (0, combi_1.starPrio)((0, combi_1.seq)((0, combi_1.tok)(tokens_1.Dash), (0, combi_1.regex)(/^[\w%$\$\*]+$/))), (0, combi_1.opt)(table_body_1.TableBody));
4207
+ const ret = (0, combi_1.seq)((0, combi_1.regex)(/^\*?!?&?(\/\w+\/)?[a-zA-Z_%$\?][\w%$\$\*]*$/), (0, combi_1.starPrio)((0, combi_1.seq)((0, combi_1.tok)(tokens_1.Dash), (0, combi_1.regex)(/^[\w%$\$\*]+$/))), (0, combi_1.opt)(field_length_1.FieldLength), (0, combi_1.opt)(table_body_1.TableBody));
4207
4208
  return ret;
4208
4209
  }
4209
4210
  }
@@ -6844,7 +6845,7 @@ exports.SQLAliasField = void 0;
6844
6845
  const combi_1 = __webpack_require__(/*! ../combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
6845
6846
  class SQLAliasField extends combi_1.Expression {
6846
6847
  getRunnable() {
6847
- return (0, combi_1.regex)(/^(\/\w+\/)?\w+~\w+$/);
6848
+ return (0, combi_1.regex)(/^(\/\w+\/)?\w+~(\/\w+\/)?\w+$/);
6848
6849
  }
6849
6850
  }
6850
6851
  exports.SQLAliasField = SQLAliasField;
@@ -7222,7 +7223,7 @@ exports.SQLFieldName = void 0;
7222
7223
  const combi_1 = __webpack_require__(/*! ../combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
7223
7224
  class SQLFieldName extends combi_1.Expression {
7224
7225
  getRunnable() {
7225
- return (0, combi_1.regex)(/^(?!(?:SINGLE|INTO|DISTINCT|AS|WHERE|FOR|HAVING|APPENDING|UP|FROM)$)(\/\w+\/)?(\w+~(\w+|\*)|\w+)$/i);
7226
+ return (0, combi_1.regex)(/^(?!(?:SINGLE|INTO|DISTINCT|AS|WHERE|FOR|HAVING|APPENDING|UP|FROM)$)(\/\w+\/)?(\w+~(\/\w+\/)?(\w+|\*)|\w+)$/i);
7226
7227
  }
7227
7228
  }
7228
7229
  exports.SQLFieldName = SQLFieldName;
@@ -7367,7 +7368,7 @@ const integer_1 = __webpack_require__(/*! ./integer */ "./node_modules/@abaplint
7367
7368
  const sql_function_input_1 = __webpack_require__(/*! ./sql_function_input */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_function_input.js");
7368
7369
  class SQLFunction extends combi_1.Expression {
7369
7370
  getRunnable() {
7370
- const castTypes = (0, combi_1.altPrio)((0, combi_1.seq)("CHAR", (0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)), (0, combi_1.seq)("DEC", (0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, ",", integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)), "FLTP", "NUMC", "INT8");
7371
+ const castTypes = (0, combi_1.altPrio)((0, combi_1.seq)("CHAR", (0, combi_1.optPrio)((0, combi_1.seq)((0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)))), (0, combi_1.seq)("DEC", (0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, ",", integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)), (0, combi_1.seq)("NUMC", (0, combi_1.optPrio)((0, combi_1.seq)((0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)))), "FLTP", "INT2", "INT8");
7371
7372
  const commaParam = (0, combi_1.seq)(",", sql_function_input_1.SQLFunctionInput);
7372
7373
  // note: the function names are not keywords, they are usually in lower case
7373
7374
  const abs = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)((0, combi_1.regex)(/^abs$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, (0, combi_1.tok)(tokens_1.WParenRightW)));
@@ -7384,7 +7385,12 @@ class SQLFunction extends combi_1.Expression {
7384
7385
  const round = (0, combi_1.ver)(version_1.Version.v750, (0, combi_1.seq)((0, combi_1.regex)(/^round$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, commaParam, (0, combi_1.tok)(tokens_1.WParenRightW)));
7385
7386
  const upper = (0, combi_1.ver)(version_1.Version.v751, (0, combi_1.seq)((0, combi_1.regex)(/^upper$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, (0, combi_1.tok)(tokens_1.WParenRightW)));
7386
7387
  const uuid = (0, combi_1.ver)(version_1.Version.v754, (0, combi_1.seq)((0, combi_1.regex)(/^uuid$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), (0, combi_1.tok)(tokens_1.WParenRightW)));
7387
- return (0, combi_1.altPrio)(uuid, abs, ceil, floor, cast, div, mod, coalesce, concat, replace, length, lower, upper, round);
7388
+ 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)));
7389
+ // dunno if the version for substring is correct
7390
+ 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)));
7391
+ 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)));
7392
+ 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)));
7393
+ 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);
7388
7394
  }
7389
7395
  }
7390
7396
  exports.SQLFunction = SQLFunction;
@@ -8375,7 +8381,7 @@ class TypeTable extends combi_1.Expression {
8375
8381
  const rangeLike = (0, combi_1.seq)("RANGE OF", field_chain_1.FieldChain, (0, combi_1.optPrio)(header), (0, combi_1.optPrio)(initial), (0, combi_1.optPrio)("VALUE IS INITIAL"));
8376
8382
  // a maximum of 15 secondary table keys can be defined
8377
8383
  // "WITH" is not allowed as a field name in keys
8378
- 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)))));
8384
+ 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")));
8379
8385
  const occurs = (0, combi_1.seq)("OCCURS", (0, combi_1.altPrio)(_1.Integer, field_chain_1.FieldChain));
8380
8386
  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)));
8381
8387
  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));
@@ -9117,7 +9123,7 @@ class Assign {
9117
9123
  const decimals = (0, combi_1.seq)("DECIMALS", expressions_1.Source);
9118
9124
  const casting = (0, combi_1.seq)("CASTING", (0, combi_1.opt)((0, combi_1.alt)(like, handle, (0, combi_1.per)(type, decimals))));
9119
9125
  const obsoleteType = (0, combi_1.seq)("TYPE", expressions_1.Source, (0, combi_1.optPrio)(decimals));
9120
- const ret = (0, combi_1.seq)("ASSIGN", (0, combi_1.opt)((0, combi_1.seq)(expressions_1.Target, "INCREMENT")), expressions_1.AssignSource, "TO", expressions_1.FSTarget, (0, combi_1.opt)((0, combi_1.altPrio)(casting, obsoleteType)), (0, combi_1.opt)(range), (0, combi_1.opt)((0, combi_1.ver)(version_1.Version.v757, "ELSE UNASSIGN")));
9126
+ const ret = (0, combi_1.seq)("ASSIGN", (0, combi_1.opt)((0, combi_1.seq)(expressions_1.Target, "INCREMENT")), expressions_1.AssignSource, "TO", expressions_1.FSTarget, (0, combi_1.opt)((0, combi_1.altPrio)(casting, obsoleteType, decimals)), (0, combi_1.opt)(range), (0, combi_1.opt)((0, combi_1.ver)(version_1.Version.v757, "ELSE UNASSIGN")));
9121
9127
  return ret;
9122
9128
  }
9123
9129
  }
@@ -9597,7 +9603,7 @@ const version_1 = __webpack_require__(/*! ../../../version */ "./node_modules/@a
9597
9603
  class CallOLE {
9598
9604
  getMatcher() {
9599
9605
  const rc = (0, combi_1.seq)("=", expressions_1.Target);
9600
- const ret = (0, combi_1.seq)("CALL METHOD OF", expressions_1.Source, expressions_1.Source, (0, combi_1.opt)(rc), (0, combi_1.opt)("NO FLUSH"), (0, combi_1.opt)("QUEUEONLY"), (0, combi_1.opt)(expressions_1.OLEExporting));
9606
+ const ret = (0, combi_1.seq)("CALL METHOD OF", expressions_1.Source, expressions_1.Source, (0, combi_1.opt)(rc), (0, combi_1.opt)("NO FLUSH"), (0, combi_1.opt)("QUEUE-ONLY"), (0, combi_1.opt)(expressions_1.OLEExporting));
9601
9607
  return (0, combi_1.verNot)(version_1.Version.Cloud, ret);
9602
9608
  }
9603
9609
  }
@@ -10275,10 +10281,12 @@ const version_1 = __webpack_require__(/*! ../../../version */ "./node_modules/@a
10275
10281
  class Communication {
10276
10282
  getMatcher() {
10277
10283
  const length = (0, combi_1.seq)("LENGTH", expressions_1.Target);
10284
+ const returncode = (0, combi_1.seq)("RETURNCODE", expressions_1.Source);
10285
+ const buffer = (0, combi_1.seq)("BUFFER", expressions_1.Target);
10278
10286
  const init = (0, combi_1.seq)("INIT ID", expressions_1.Source, "DESTINATION", expressions_1.Target);
10279
- const allocate = (0, combi_1.seq)("ALLOCATE ID", expressions_1.Source);
10280
- const send = (0, combi_1.seq)("SEND ID", expressions_1.Source, "BUFFER", expressions_1.Target, (0, combi_1.opt)(length));
10281
- const deallocate = (0, combi_1.seq)("DEALLOCATE ID", expressions_1.Source);
10287
+ const allocate = (0, combi_1.seq)("ALLOCATE ID", expressions_1.Source, (0, combi_1.opt)(returncode));
10288
+ const send = (0, combi_1.seq)("SEND ID", expressions_1.Source, (0, combi_1.opt)((0, combi_1.per)(buffer, length)), (0, combi_1.opt)(returncode));
10289
+ const deallocate = (0, combi_1.seq)("DEALLOCATE ID", expressions_1.Source, (0, combi_1.opt)(returncode));
10282
10290
  const accept = (0, combi_1.seq)("ACCEPT ID", expressions_1.Source);
10283
10291
  const receive = (0, combi_1.seq)("RECEIVE ID", expressions_1.Source, "BUFFER", expressions_1.Source, (0, combi_1.opt)(length), "DATAINFO", expressions_1.Target, "STATUSINFO", expressions_1.Target, "RECEIVED", expressions_1.Target);
10284
10292
  const ret = (0, combi_1.seq)("COMMUNICATION", (0, combi_1.alt)(init, allocate, send, deallocate, receive, accept));
@@ -10791,7 +10799,8 @@ class DeleteDatabase {
10791
10799
  getMatcher() {
10792
10800
  const where = (0, combi_1.seq)("WHERE", (0, combi_1.altPrio)(expressions_1.SQLCond, expressions_1.Dynamic));
10793
10801
  const from = (0, combi_1.seq)("FROM", expressions_1.DatabaseTable, (0, combi_1.optPrio)(sql_client_1.SQLClient), (0, combi_1.optPrio)(expressions_1.DatabaseConnection), (0, combi_1.opt)(where));
10794
- const table = (0, combi_1.seq)(expressions_1.DatabaseTable, (0, combi_1.optPrio)(sql_client_1.SQLClient), (0, combi_1.optPrio)(expressions_1.DatabaseConnection), "FROM", (0, combi_1.opt)("TABLE"), expressions_1.SQLSourceSimple);
10802
+ const fromSomething = (0, combi_1.seq)("FROM", (0, combi_1.opt)("TABLE"), expressions_1.SQLSourceSimple);
10803
+ const table = (0, combi_1.seq)(expressions_1.DatabaseTable, (0, combi_1.optPrio)(sql_client_1.SQLClient), (0, combi_1.optPrio)(expressions_1.DatabaseConnection), (0, combi_1.optPrio)(fromSomething));
10795
10804
  const ret = (0, combi_1.seq)("DELETE", (0, combi_1.altPrio)(from, table));
10796
10805
  return ret;
10797
10806
  }
@@ -10867,13 +10876,13 @@ class DeleteInternal {
10867
10876
  const index = (0, combi_1.seq)("INDEX", expressions_1.Source);
10868
10877
  const keyName = (0, combi_1.altPrio)(expressions_1.SimpleName, expressions_1.Dynamic);
10869
10878
  const using = (0, combi_1.seq)("USING KEY", keyName);
10870
- const from = (0, combi_1.optPrio)((0, combi_1.seq)("FROM", expressions_1.Source));
10871
- const fromTo = (0, combi_1.seq)(from, (0, combi_1.optPrio)((0, combi_1.seq)("TO", expressions_1.Source)));
10879
+ const from = (0, combi_1.seq)("FROM", expressions_1.Source);
10880
+ const fromTo = (0, combi_1.seq)((0, combi_1.optPrio)(from), (0, combi_1.optPrio)((0, combi_1.seq)("TO", expressions_1.Source)));
10872
10881
  const where = (0, combi_1.seq)("WHERE", (0, combi_1.alt)(expressions_1.ComponentCond, expressions_1.Dynamic));
10873
10882
  const key = (0, combi_1.seq)("WITH TABLE KEY", (0, combi_1.opt)((0, combi_1.seq)(keyName, "COMPONENTS")), (0, combi_1.plus)(expressions_1.ComponentCompare));
10874
- const table = (0, combi_1.seq)("TABLE", expressions_1.Target, (0, combi_1.alt)((0, combi_1.per)(index, using), from, key));
10883
+ const table = (0, combi_1.seq)("TABLE", expressions_1.Target, (0, combi_1.alt)((0, combi_1.per)(index, using), (0, combi_1.seq)((0, combi_1.optPrio)(from), (0, combi_1.optPrio)(using)), key));
10875
10884
  const other = (0, combi_1.seq)(expressions_1.Target, (0, combi_1.alt)((0, combi_1.per)(index, using), fromTo, key), (0, combi_1.opt)(where));
10876
- const f = (0, combi_1.seq)(expressions_1.FieldSub, (0, combi_1.optPrio)(expressions_1.FieldOffset), (0, combi_1.optPrio)(expressions_1.FieldLength));
10885
+ const f = (0, combi_1.seq)(expressions_1.SimpleFieldChain2, (0, combi_1.optPrio)(expressions_1.FieldOffset), (0, combi_1.optPrio)(expressions_1.FieldLength));
10877
10886
  const adjacent = (0, combi_1.seq)("ADJACENT DUPLICATES FROM", expressions_1.Target, (0, combi_1.optPrio)(using), (0, combi_1.opt)((0, combi_1.seq)("COMPARING", (0, combi_1.altPrio)("ALL FIELDS", (0, combi_1.plus)((0, combi_1.altPrio)(f, expressions_1.Dynamic))))), (0, combi_1.optPrio)(using));
10878
10887
  return (0, combi_1.seq)("DELETE", (0, combi_1.alt)(table, adjacent, other));
10879
10888
  }
@@ -10901,7 +10910,7 @@ class DeleteMemory {
10901
10910
  const memory = (0, combi_1.seq)("MEMORY ID", expressions_1.Source);
10902
10911
  const id = (0, combi_1.seq)("ID", expressions_1.Source);
10903
10912
  const client = (0, combi_1.seq)("CLIENT", expressions_1.Source);
10904
- const shared = (0, combi_1.seq)("SHARED", (0, combi_1.altPrio)("MEMORY", "BUFFER"), expressions_1.Field, "(", expressions_1.Field, ")", (0, combi_1.optPrio)(client), id);
10913
+ const shared = (0, combi_1.seq)("SHARED", (0, combi_1.altPrio)("MEMORY", "BUFFER"), expressions_1.Field, "(", (0, combi_1.regex)(/^[\w%]+$/), ")", (0, combi_1.optPrio)(client), id);
10905
10914
  const ret = (0, combi_1.seq)("DELETE FROM", (0, combi_1.alt)(memory, shared));
10906
10915
  return (0, combi_1.verNot)(version_1.Version.Cloud, ret);
10907
10916
  }
@@ -11911,11 +11920,11 @@ const expressions_1 = __webpack_require__(/*! ../expressions */ "./node_modules/
11911
11920
  // todo, cloud, split?
11912
11921
  class Export {
11913
11922
  getMatcher() {
11914
- const from = (0, combi_1.seq)("FROM", expressions_1.Source);
11923
+ const from = (0, combi_1.seq)((0, combi_1.altPrio)("FROM", "="), expressions_1.Source);
11915
11924
  const client = (0, combi_1.seq)("CLIENT", expressions_1.Source);
11916
11925
  const id = (0, combi_1.seq)("ID", expressions_1.Source);
11917
11926
  const using = (0, combi_1.seq)("USING", expressions_1.Source);
11918
- const cluster = (0, combi_1.seq)(expressions_1.NamespaceSimpleName, (0, combi_1.tok)(tokens_1.ParenLeft), (0, combi_1.regex)(/^[\w$%\^]{2}$/), (0, combi_1.tok)(tokens_1.ParenRightW));
11927
+ const cluster = (0, combi_1.seq)(expressions_1.NamespaceSimpleName, (0, combi_1.tok)(tokens_1.ParenLeft), (0, combi_1.regex)(/^[\w$%\^~]{2}$/), (0, combi_1.tok)(tokens_1.ParenRightW));
11919
11928
  const buffer = (0, combi_1.seq)("DATA BUFFER", expressions_1.Target);
11920
11929
  const memory = (0, combi_1.seq)("MEMORY", (0, combi_1.opt)((0, combi_1.seq)("ID", expressions_1.Source)));
11921
11930
  const table = (0, combi_1.seq)("INTERNAL TABLE", expressions_1.Target);
@@ -11923,7 +11932,7 @@ class Export {
11923
11932
  const database = (0, combi_1.seq)("DATABASE", cluster, (0, combi_1.per)(from, client, id, using));
11924
11933
  const target = (0, combi_1.alt)(buffer, memory, database, table, shared);
11925
11934
  const left = (0, combi_1.alt)(expressions_1.FieldSub, expressions_1.FieldSymbol);
11926
- const source = (0, combi_1.alt)((0, combi_1.plus)((0, combi_1.altPrio)(expressions_1.ParameterS, (0, combi_1.seq)(left, from), left)), expressions_1.Dynamic, expressions_1.Constant);
11935
+ const source = (0, combi_1.alt)((0, combi_1.plus)((0, combi_1.altPrio)((0, combi_1.seq)(left, from), left)), expressions_1.Dynamic, expressions_1.Constant);
11927
11936
  const compression = (0, combi_1.seq)("COMPRESSION", (0, combi_1.alt)("ON", "OFF"));
11928
11937
  const hint = (0, combi_1.seq)("CODE PAGE HINT", expressions_1.Source);
11929
11938
  return (0, combi_1.seq)("EXPORT", source, "TO", target, (0, combi_1.opt)(compression), (0, combi_1.opt)(hint));
@@ -12021,9 +12030,12 @@ exports.Field = void 0;
12021
12030
  const combi_1 = __webpack_require__(/*! ../combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
12022
12031
  const expressions_1 = __webpack_require__(/*! ../expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
12023
12032
  const version_1 = __webpack_require__(/*! ../../../version */ "./node_modules/@abaplint/core/build/src/version.js");
12033
+ const tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
12024
12034
  class Field {
12025
12035
  getMatcher() {
12026
- const ret = (0, combi_1.seq)("FIELD", expressions_1.FieldChain, (0, combi_1.opt)((0, combi_1.seq)("MODULE", expressions_1.FormName, (0, combi_1.opt)((0, combi_1.alt)("ON INPUT", "ON REQUEST")))));
12036
+ const module = (0, combi_1.seq)("MODULE", expressions_1.FormName, (0, combi_1.opt)((0, combi_1.alt)("ON INPUT", "ON REQUEST")));
12037
+ const values = (0, combi_1.seq)("VALUES", (0, combi_1.tok)(tokens_1.WParenLeft), "BETWEEN", expressions_1.Constant, "AND", expressions_1.Constant, (0, combi_1.tok)(tokens_1.ParenRightW));
12038
+ const ret = (0, combi_1.seq)("FIELD", expressions_1.FieldChain, (0, combi_1.opt)((0, combi_1.alt)(module, values)));
12027
12039
  return (0, combi_1.verNot)(version_1.Version.Cloud, ret);
12028
12040
  }
12029
12041
  }
@@ -12666,7 +12678,7 @@ const expressions_1 = __webpack_require__(/*! ../expressions */ "./node_modules/
12666
12678
  const version_1 = __webpack_require__(/*! ../../../version */ "./node_modules/@abaplint/core/build/src/version.js");
12667
12679
  class GetProperty {
12668
12680
  getMatcher() {
12669
- const ret = (0, combi_1.seq)("GET PROPERTY OF", expressions_1.FieldSub, expressions_1.Source, "=", expressions_1.Source, (0, combi_1.opt)("NO FLUSH"), (0, combi_1.opt)("QUEUEONLY"), (0, combi_1.opt)(expressions_1.OLEExporting));
12681
+ const ret = (0, combi_1.seq)("GET PROPERTY OF", expressions_1.FieldSub, (0, combi_1.alt)(expressions_1.Source, expressions_1.ConstantString), "=", expressions_1.Source, (0, combi_1.opt)("NO FLUSH"), (0, combi_1.opt)((0, combi_1.alt)("QUEUE-ONLY", "QUEUEONLY")), (0, combi_1.opt)(expressions_1.OLEExporting));
12670
12682
  return (0, combi_1.verNot)(version_1.Version.Cloud, ret);
12671
12683
  }
12672
12684
  }
@@ -13264,6 +13276,7 @@ __exportStar(__webpack_require__(/*! ./set_locks */ "./node_modules/@abaplint/co
13264
13276
  __exportStar(__webpack_require__(/*! ./enhancement */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/enhancement.js"), exports);
13265
13277
  __exportStar(__webpack_require__(/*! ./end_enhancement */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/end_enhancement.js"), exports);
13266
13278
  __exportStar(__webpack_require__(/*! ./form_definition */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/form_definition.js"), exports);
13279
+ __exportStar(__webpack_require__(/*! ./verification_message */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/verification_message.js"), exports);
13267
13280
  //# sourceMappingURL=index.js.map
13268
13281
 
13269
13282
  /***/ }),
@@ -13800,7 +13813,7 @@ class MethodDef {
13800
13813
  const forfunction = (0, combi_1.seq)("FOR FUNCTION", expressions_1.TypeName, result);
13801
13814
  const behavior = (0, combi_1.altPrio)((0, combi_1.seq)("VALIDATE ON SAVE IMPORTING", expressions_1.MethodParamName, "FOR", expressions_1.TypeName), (0, combi_1.seq)("MODIFY 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)("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));
13802
13815
  // todo, this is only from version something
13803
- const amdp = (0, combi_1.seq)("AMDP OPTIONS 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));
13816
+ 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));
13804
13817
  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", (0, combi_1.alt)(tableFunction, ddl, behavior)), amdp, "NOT AT END OF MODE", (0, combi_1.optPrio)(expressions_1.Redefinition)));
13805
13818
  return ret;
13806
13819
  }
@@ -13918,9 +13931,9 @@ class ModifyInternal {
13918
13931
  const using = (0, combi_1.seq)("USING KEY", expressions_1.SimpleName);
13919
13932
  const additions = (0, combi_1.per)(where, assigning, using);
13920
13933
  const target = (0, combi_1.alt)(expressions_1.Target, expressions_1.Dynamic);
13921
- const options = (0, combi_1.alt)((0, combi_1.per)(index, transporting), (0, combi_1.seq)(from, (0, combi_1.opt)((0, combi_1.per)(index, transporting))), (0, combi_1.seq)((0, combi_1.per)(index, transporting), from, (0, combi_1.opt)((0, combi_1.per)(index, transporting))));
13934
+ const options = (0, combi_1.alt)((0, combi_1.per)(index, transporting), (0, combi_1.seq)(from, (0, combi_1.opt)((0, combi_1.per)(index, transporting, using))), (0, combi_1.seq)((0, combi_1.per)(index, transporting), from, (0, combi_1.opt)((0, combi_1.per)(index, transporting))));
13922
13935
  const long = (0, combi_1.seq)("MODIFY", (0, combi_1.opt)("TABLE"), target, (0, combi_1.opt)(options), (0, combi_1.opt)(additions));
13923
- const simple = (0, combi_1.seq)("MODIFY TABLE", target, from, (0, combi_1.opt)(using));
13936
+ const simple = (0, combi_1.seq)("MODIFY TABLE", target, (0, combi_1.per)(from, using));
13924
13937
  return (0, combi_1.alt)(long, simple);
13925
13938
  }
13926
13939
  }
@@ -13946,7 +13959,7 @@ class ModifyLine {
13946
13959
  getMatcher() {
13947
13960
  const onOff = (0, combi_1.alt)("ON", "OFF");
13948
13961
  const eq = (0, combi_1.seq)("=", expressions_1.Source);
13949
- const form = (0, combi_1.seq)((0, combi_1.alt)("INVERSE", "INPUT", "COLOR"), (0, combi_1.alt)(eq, onOff));
13962
+ const form = (0, combi_1.seq)((0, combi_1.alt)("INVERSE", "INPUT", "COLOR", "HOTSPOT"), (0, combi_1.opt)((0, combi_1.alt)(eq, onOff)));
13950
13963
  const from = (0, combi_1.seq)("FROM", expressions_1.Source);
13951
13964
  const value = (0, combi_1.seq)("FIELD VALUE", (0, combi_1.plus)((0, combi_1.seq)(expressions_1.Source, (0, combi_1.optPrio)(from))));
13952
13965
  const format = (0, combi_1.seq)("FIELD FORMAT", expressions_1.Source, (0, combi_1.opt)(form));
@@ -14006,7 +14019,8 @@ const expressions_1 = __webpack_require__(/*! ../expressions */ "./node_modules/
14006
14019
  const version_1 = __webpack_require__(/*! ../../../version */ "./node_modules/@abaplint/core/build/src/version.js");
14007
14020
  class Module {
14008
14021
  getMatcher() {
14009
- const ret = (0, combi_1.seq)("MODULE", expressions_1.FormName, (0, combi_1.opt)((0, combi_1.alt)("INPUT", "OUTPUT", "ON CHAIN-REQUEST")));
14022
+ const sw = (0, combi_1.seq)("SWITCH", expressions_1.NamespaceSimpleName);
14023
+ const ret = (0, combi_1.seq)("MODULE", expressions_1.FormName, (0, combi_1.opt)((0, combi_1.alt)("INPUT", "OUTPUT", "ON CHAIN-REQUEST", "ON CHAIN-INPUT", "AT EXIT-COMMAND", sw)));
14010
14024
  return (0, combi_1.verNot)(version_1.Version.Cloud, ret);
14011
14025
  }
14012
14026
  }
@@ -14343,7 +14357,7 @@ class Parameter {
14343
14357
  const type = (0, combi_1.seq)((0, combi_1.altPrio)("TYPE", "LIKE"), (0, combi_1.altPrio)(expressions_1.TypeName, expressions_1.Dynamic));
14344
14358
  const memory = (0, combi_1.seq)("MEMORY ID", expressions_1.SimpleSource1);
14345
14359
  const listbox = (0, combi_1.str)("AS LISTBOX");
14346
- const cmd = (0, combi_1.seq)("USER-COMMAND", (0, combi_1.regex)(/^\w+$/));
14360
+ const cmd = (0, combi_1.seq)("USER-COMMAND", (0, combi_1.regex)(/^[\w\?\/]+$/));
14347
14361
  const modif = (0, combi_1.seq)("MODIF ID", expressions_1.Modif);
14348
14362
  const visible = (0, combi_1.seq)("VISIBLE LENGTH", expressions_1.Constant);
14349
14363
  const length = (0, combi_1.seq)("LENGTH", expressions_1.Constant);
@@ -15290,7 +15304,8 @@ class ScrollList {
15290
15304
  const line = (0, combi_1.seq)("LINE", expressions_1.Source);
15291
15305
  const column = (0, combi_1.seq)("TO COLUMN", expressions_1.Source);
15292
15306
  const to = (0, combi_1.seq)("TO", (0, combi_1.alt)("FIRST PAGE", "LAST PAGE", (0, combi_1.seq)("PAGE", expressions_1.Source)));
15293
- const ret = (0, combi_1.seq)("SCROLL LIST", (0, combi_1.per)(index, (0, combi_1.alt)(to, "BACKWARD", "FORWARD"), (0, combi_1.seq)((0, combi_1.alt)("LEFT", "RIGHT"), (0, combi_1.opt)((0, combi_1.seq)("BY", expressions_1.Source, "PLACES"))), column, line));
15307
+ const pages = (0, combi_1.seq)(expressions_1.Source, "PAGES");
15308
+ const ret = (0, combi_1.seq)("SCROLL LIST", (0, combi_1.per)(index, (0, combi_1.seq)((0, combi_1.alt)(to, "BACKWARD", "FORWARD"), (0, combi_1.opt)(pages)), (0, combi_1.seq)((0, combi_1.alt)("LEFT", "RIGHT"), (0, combi_1.opt)((0, combi_1.seq)("BY", expressions_1.Source, "PLACES"))), column, line));
15294
15309
  return (0, combi_1.verNot)(version_1.Version.Cloud, ret);
15295
15310
  }
15296
15311
  }
@@ -15422,7 +15437,7 @@ class SelectionScreen {
15422
15437
  const exclude = (0, combi_1.seq)("EXCLUDE", (0, combi_1.alt)("IDS", "PARAMETERS"), (0, combi_1.regex)(/^\w+$/));
15423
15438
  const beginVersion = (0, combi_1.seq)("BEGIN OF VERSION", (0, combi_1.regex)(/^\w+$/), expressions_1.TextElement);
15424
15439
  const endVersion = (0, combi_1.seq)("END OF VERSION", (0, combi_1.regex)(/^\w+$/));
15425
- const ret = (0, combi_1.seq)("SELECTION-SCREEN", (0, combi_1.altPrio)(comment, func, skip, pos, incl, iso, push, tab, uline, beginBlock, tabbed, endBlock, beginLine, endLine, param, beginScreen, endScreen, exclude, beginVersion, endVersion));
15440
+ const ret = (0, combi_1.seq)("SELECTION-SCREEN", (0, combi_1.altPrio)(comment, func, skip, pos, incl, iso, push, tab, uline, beginBlock, tabbed, endBlock, beginLine, endLine, param, beginScreen, endScreen, exclude, beginVersion, endVersion, def));
15426
15441
  return (0, combi_1.verNot)(version_1.Version.Cloud, ret);
15427
15442
  }
15428
15443
  }
@@ -15452,7 +15467,7 @@ class SelectOption {
15452
15467
  const option = (0, combi_1.seq)("OPTION", (0, combi_1.alt)("CP", expressions_1.Field));
15453
15468
  const sign = (0, combi_1.seq)("SIGN", expressions_1.Field);
15454
15469
  const memory = (0, combi_1.seq)("MEMORY ID", expressions_1.SimpleSource1);
15455
- const match = (0, combi_1.seq)("MATCHCODE OBJECT", expressions_1.Field);
15470
+ const match = (0, combi_1.seq)("MATCHCODE OBJECT", expressions_1.SimpleFieldChain);
15456
15471
  const modif = (0, combi_1.seq)("MODIF ID", expressions_1.Modif);
15457
15472
  const visible = (0, combi_1.seq)("VISIBLE LENGTH", expressions_1.Source);
15458
15473
  const options = (0, combi_1.per)(def, option, sign, memory, match, visible, modif, "NO DATABASE SELECTION", "LOWER CASE", "NO-EXTENSION", "NO INTERVALS", "NO-DISPLAY", "OBLIGATORY");
@@ -16219,7 +16234,7 @@ const version_1 = __webpack_require__(/*! ../../../version */ "./node_modules/@a
16219
16234
  class Submit {
16220
16235
  getMatcher() {
16221
16236
  const sign = (0, combi_1.seq)("SIGN", expressions_1.Source);
16222
- const eq = (0, combi_1.alt)("=", "EQ", "IN", "NE", "CP", "GE", "LE", "INCL");
16237
+ const eq = (0, combi_1.alt)("=", "EQ", "IN", "NE", "CP", "GE", "LE", "INCL", "GT", "LT");
16223
16238
  const compare = (0, combi_1.seq)(eq, expressions_1.Source);
16224
16239
  const between = (0, combi_1.seq)("BETWEEN", expressions_1.Source, "AND", expressions_1.Source);
16225
16240
  const selectionTable = (0, combi_1.seq)("WITH SELECTION-TABLE", expressions_1.Source);
@@ -17018,6 +17033,31 @@ exports.UpdateDatabase = UpdateDatabase;
17018
17033
 
17019
17034
  /***/ }),
17020
17035
 
17036
+ /***/ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/verification_message.js":
17037
+ /*!****************************************************************************************************!*\
17038
+ !*** ./node_modules/@abaplint/core/build/src/abap/2_statements/statements/verification_message.js ***!
17039
+ \****************************************************************************************************/
17040
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
17041
+
17042
+ "use strict";
17043
+
17044
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
17045
+ exports.VerificationMessage = void 0;
17046
+ const combi_1 = __webpack_require__(/*! ../combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
17047
+ const expressions_1 = __webpack_require__(/*! ../expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
17048
+ const version_1 = __webpack_require__(/*! ../../../version */ "./node_modules/@abaplint/core/build/src/version.js");
17049
+ class VerificationMessage {
17050
+ getMatcher() {
17051
+ const priority = (0, combi_1.seq)("PRIORITY", expressions_1.Source);
17052
+ const ret = (0, combi_1.seq)("VERIFICATION-MESSAGE", expressions_1.Source, expressions_1.Source, (0, combi_1.opt)(priority));
17053
+ return (0, combi_1.verNot)(version_1.Version.Cloud, ret);
17054
+ }
17055
+ }
17056
+ exports.VerificationMessage = VerificationMessage;
17057
+ //# sourceMappingURL=verification_message.js.map
17058
+
17059
+ /***/ }),
17060
+
17021
17061
  /***/ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/wait.js":
17022
17062
  /*!************************************************************************************!*\
17023
17063
  !*** ./node_modules/@abaplint/core/build/src/abap/2_statements/statements/wait.js ***!
@@ -18121,15 +18161,11 @@ exports.Do = Do;
18121
18161
 
18122
18162
  Object.defineProperty(exports, "__esModule", ({ value: true }));
18123
18163
  exports.DynproLogic = void 0;
18124
- const Statements = __webpack_require__(/*! ../../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
18164
+ const Structures = __webpack_require__(/*! ./ */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
18125
18165
  const _combi_1 = __webpack_require__(/*! ./_combi */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/_combi.js");
18126
- const chain_1 = __webpack_require__(/*! ./chain */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/chain.js");
18127
18166
  class DynproLogic {
18128
18167
  getMatcher() {
18129
- const pai = (0, _combi_1.star)((0, _combi_1.alt)((0, _combi_1.sta)(Statements.Module), (0, _combi_1.sta)(Statements.Field), (0, _combi_1.sta)(Statements.CallSubscreen), (0, _combi_1.sub)(chain_1.Chain)));
18130
- const pbo = (0, _combi_1.star)((0, _combi_1.alt)((0, _combi_1.sta)(Statements.Module), (0, _combi_1.sta)(Statements.Field), (0, _combi_1.sta)(Statements.CallSubscreen)));
18131
- const pov = (0, _combi_1.star)((0, _combi_1.sta)(Statements.Field));
18132
- return (0, _combi_1.seq)((0, _combi_1.sta)(Statements.ProcessBeforeOutput), pbo, (0, _combi_1.sta)(Statements.ProcessAfterInput), pai, (0, _combi_1.opt)((0, _combi_1.seq)((0, _combi_1.sta)(Statements.ProcessOnValueRequest), pov)));
18168
+ return (0, _combi_1.seq)((0, _combi_1.sub)(Structures.ProcessBeforeOutput), (0, _combi_1.sub)(Structures.ProcessAfterInput), (0, _combi_1.opt)((0, _combi_1.sub)(Structures.ProcessOnValueRequest)));
18133
18169
  }
18134
18170
  }
18135
18171
  exports.DynproLogic = DynproLogic;
@@ -18360,10 +18396,10 @@ __exportStar(__webpack_require__(/*! ./case_type */ "./node_modules/@abaplint/co
18360
18396
  __exportStar(__webpack_require__(/*! ./case */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/case.js"), exports);
18361
18397
  __exportStar(__webpack_require__(/*! ./catch_system_exceptions */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/catch_system_exceptions.js"), exports);
18362
18398
  __exportStar(__webpack_require__(/*! ./catch */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/catch.js"), exports);
18399
+ __exportStar(__webpack_require__(/*! ./chain */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/chain.js"), exports);
18363
18400
  __exportStar(__webpack_require__(/*! ./class_data */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/class_data.js"), exports);
18364
18401
  __exportStar(__webpack_require__(/*! ./class_definition */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/class_definition.js"), exports);
18365
18402
  __exportStar(__webpack_require__(/*! ./class_global */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/class_global.js"), exports);
18366
- __exportStar(__webpack_require__(/*! ./chain */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/chain.js"), exports);
18367
18403
  __exportStar(__webpack_require__(/*! ./class_implementation */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/class_implementation.js"), exports);
18368
18404
  __exportStar(__webpack_require__(/*! ./cleanup */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/cleanup.js"), exports);
18369
18405
  __exportStar(__webpack_require__(/*! ./constants */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/constants.js"), exports);
@@ -18388,6 +18424,9 @@ __exportStar(__webpack_require__(/*! ./module */ "./node_modules/@abaplint/core/
18388
18424
  __exportStar(__webpack_require__(/*! ./normal */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/normal.js"), exports);
18389
18425
  __exportStar(__webpack_require__(/*! ./on_change */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/on_change.js"), exports);
18390
18426
  __exportStar(__webpack_require__(/*! ./private_section */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/private_section.js"), exports);
18427
+ __exportStar(__webpack_require__(/*! ./process_after_input */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/process_after_input.js"), exports);
18428
+ __exportStar(__webpack_require__(/*! ./process_before_output */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/process_before_output.js"), exports);
18429
+ __exportStar(__webpack_require__(/*! ./process_on_value_request */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/process_on_value_request.js"), exports);
18391
18430
  __exportStar(__webpack_require__(/*! ./protected_section */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/protected_section.js"), exports);
18392
18431
  __exportStar(__webpack_require__(/*! ./provide */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/provide.js"), exports);
18393
18432
  __exportStar(__webpack_require__(/*! ./public_section */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/public_section.js"), exports);
@@ -18620,6 +18659,76 @@ exports.PrivateSection = PrivateSection;
18620
18659
 
18621
18660
  /***/ }),
18622
18661
 
18662
+ /***/ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/process_after_input.js":
18663
+ /*!***************************************************************************************************!*\
18664
+ !*** ./node_modules/@abaplint/core/build/src/abap/3_structures/structures/process_after_input.js ***!
18665
+ \***************************************************************************************************/
18666
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
18667
+
18668
+ "use strict";
18669
+
18670
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
18671
+ exports.ProcessAfterInput = void 0;
18672
+ const Statements = __webpack_require__(/*! ../../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
18673
+ const _combi_1 = __webpack_require__(/*! ./_combi */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/_combi.js");
18674
+ const chain_1 = __webpack_require__(/*! ./chain */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/chain.js");
18675
+ class ProcessAfterInput {
18676
+ getMatcher() {
18677
+ const pai = (0, _combi_1.star)((0, _combi_1.alt)((0, _combi_1.sta)(Statements.Module), (0, _combi_1.sta)(Statements.Field), (0, _combi_1.sta)(Statements.CallSubscreen), (0, _combi_1.sub)(chain_1.Chain)));
18678
+ return (0, _combi_1.seq)((0, _combi_1.sta)(Statements.ProcessAfterInput), pai);
18679
+ }
18680
+ }
18681
+ exports.ProcessAfterInput = ProcessAfterInput;
18682
+ //# sourceMappingURL=process_after_input.js.map
18683
+
18684
+ /***/ }),
18685
+
18686
+ /***/ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/process_before_output.js":
18687
+ /*!*****************************************************************************************************!*\
18688
+ !*** ./node_modules/@abaplint/core/build/src/abap/3_structures/structures/process_before_output.js ***!
18689
+ \*****************************************************************************************************/
18690
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
18691
+
18692
+ "use strict";
18693
+
18694
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
18695
+ exports.ProcessBeforeOutput = void 0;
18696
+ const Statements = __webpack_require__(/*! ../../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
18697
+ const _combi_1 = __webpack_require__(/*! ./_combi */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/_combi.js");
18698
+ class ProcessBeforeOutput {
18699
+ getMatcher() {
18700
+ const pbo = (0, _combi_1.star)((0, _combi_1.alt)((0, _combi_1.sta)(Statements.Module), (0, _combi_1.sta)(Statements.Field), (0, _combi_1.sta)(Statements.CallSubscreen)));
18701
+ return (0, _combi_1.seq)((0, _combi_1.sta)(Statements.ProcessBeforeOutput), pbo);
18702
+ }
18703
+ }
18704
+ exports.ProcessBeforeOutput = ProcessBeforeOutput;
18705
+ //# sourceMappingURL=process_before_output.js.map
18706
+
18707
+ /***/ }),
18708
+
18709
+ /***/ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/process_on_value_request.js":
18710
+ /*!********************************************************************************************************!*\
18711
+ !*** ./node_modules/@abaplint/core/build/src/abap/3_structures/structures/process_on_value_request.js ***!
18712
+ \********************************************************************************************************/
18713
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
18714
+
18715
+ "use strict";
18716
+
18717
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
18718
+ exports.ProcessOnValueRequest = void 0;
18719
+ const Statements = __webpack_require__(/*! ../../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
18720
+ const _combi_1 = __webpack_require__(/*! ./_combi */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/_combi.js");
18721
+ class ProcessOnValueRequest {
18722
+ getMatcher() {
18723
+ const pov = (0, _combi_1.star)((0, _combi_1.sta)(Statements.Field));
18724
+ return (0, _combi_1.seq)((0, _combi_1.sta)(Statements.ProcessOnValueRequest), pov);
18725
+ }
18726
+ }
18727
+ exports.ProcessOnValueRequest = ProcessOnValueRequest;
18728
+ //# sourceMappingURL=process_on_value_request.js.map
18729
+
18730
+ /***/ }),
18731
+
18623
18732
  /***/ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/protected_section.js":
18624
18733
  /*!*************************************************************************************************!*\
18625
18734
  !*** ./node_modules/@abaplint/core/build/src/abap/3_structures/structures/protected_section.js ***!
@@ -22133,6 +22242,9 @@ class TypeUtils {
22133
22242
  }
22134
22243
  return true;
22135
22244
  }
22245
+ else if (target instanceof basic_1.SimpleType) {
22246
+ return this.isCharLikeStrict(source);
22247
+ }
22136
22248
  else if (target instanceof basic_1.CLikeType) {
22137
22249
  return this.isCharLikeStrict(source);
22138
22250
  }
@@ -26280,10 +26392,55 @@ class Select {
26280
26392
  for (const s of node.findDirectExpressions(Expressions.SQLOrderBy)) {
26281
26393
  new sql_order_by_1.SQLOrderBy().runSyntax(s, input);
26282
26394
  }
26395
+ if (this.isStrictMode(node)) {
26396
+ this.strictModeChecks(node, input);
26397
+ }
26283
26398
  if (input.scope.getType() === _scope_type_1.ScopeType.OpenSQL) {
26284
26399
  input.scope.pop(node.getLastToken().getEnd());
26285
26400
  }
26286
26401
  }
26402
+ // there are multiple rules, but gotta start somewhere
26403
+ isStrictMode(node) {
26404
+ const into = node.findDirectExpressionsMulti([Expressions.SQLIntoList, Expressions.SQLIntoStructure, Expressions.SQLIntoTable])[0];
26405
+ const where = node.findDirectExpression(Expressions.SQLCond);
26406
+ // INTO is after WHERE
26407
+ if (into && where && into.getFirstToken().getStart().isAfter(where.getFirstToken().getStart())) {
26408
+ return true;
26409
+ }
26410
+ // FIELDS is used
26411
+ if (node.findFirstExpression(Expressions.SQLFields)) {
26412
+ return true;
26413
+ }
26414
+ // any field is escaped with @
26415
+ for (const source of node.findAllExpressions(Expressions.SQLSource)) {
26416
+ if (source.getFirstToken().getStr() === "@") {
26417
+ return true;
26418
+ }
26419
+ }
26420
+ // comma used in FROM
26421
+ const fieldList = node.findFirstExpression(Expressions.SQLFieldList);
26422
+ if (fieldList && fieldList.findDirectTokenByText(",")) {
26423
+ return true;
26424
+ }
26425
+ return false;
26426
+ }
26427
+ strictModeChecks(node, input) {
26428
+ const sources = node.findAllExpressions(Expressions.SQLSource);
26429
+ for (const source of sources) {
26430
+ const first = source.getFirstChild();
26431
+ if ((first === null || first === void 0 ? void 0 : first.get()) instanceof Expressions.SQLAliasField) {
26432
+ continue;
26433
+ }
26434
+ else if ((first === null || first === void 0 ? void 0 : first.getFirstToken().getStr()) === "@") {
26435
+ continue;
26436
+ }
26437
+ else if ((first === null || first === void 0 ? void 0 : first.getChildren()[0].get()) instanceof Expressions.Constant) {
26438
+ continue;
26439
+ }
26440
+ const message = `SELECT: "${source.concatTokens()}" must be escaped with @ in strict mode`;
26441
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
26442
+ }
26443
+ }
26287
26444
  handleInto(node, input, fields, dbSources) {
26288
26445
  const intoTable = node.findDirectExpression(Expressions.SQLIntoTable);
26289
26446
  if (intoTable) {
@@ -26584,9 +26741,10 @@ class Source {
26584
26741
  if (foundType === undefined && s) {
26585
26742
  return new basic_1.DataReference(s);
26586
26743
  }
26587
- else {
26588
- return foundType;
26744
+ else if (foundType) {
26745
+ return new basic_1.DataReference(foundType);
26589
26746
  }
26747
+ return undefined;
26590
26748
  }
26591
26749
  case "FILTER":
26592
26750
  {
@@ -26613,7 +26771,12 @@ class Source {
26613
26771
  return foundType;
26614
26772
  }
26615
26773
  case "EXACT":
26616
- return this.determineType(node, input, targetType);
26774
+ {
26775
+ const foundType = this.determineType(node, input, targetType);
26776
+ new Source().runSyntax(node.findDirectExpression(Expressions.Source), input, foundType);
26777
+ this.addIfInferred(node, input, foundType);
26778
+ return foundType;
26779
+ }
26617
26780
  case "VALUE":
26618
26781
  {
26619
26782
  const foundType = this.determineType(node, input, targetType);
@@ -30869,12 +31032,11 @@ class Loop {
30869
31032
  const message = "No source type determined";
30870
31033
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30871
31034
  }
30872
- return;
30873
31035
  }
30874
31036
  else if (sourceType instanceof basic_1.UnknownType) {
30875
31037
  const message = "Loop, not a table type, " + sourceType.getError();
30876
31038
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30877
- return;
31039
+ sourceType = new basic_1.VoidType("Loop, not a table type");
30878
31040
  }
30879
31041
  else if (sourceType instanceof basic_1.TableType
30880
31042
  && target === undefined
@@ -30882,7 +31044,6 @@ class Loop {
30882
31044
  && node.getChildren().length === 4) {
30883
31045
  const message = "Loop, no header line";
30884
31046
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30885
- return;
30886
31047
  }
30887
31048
  else if (!(sourceType instanceof basic_1.TableType)
30888
31049
  && !(sourceType instanceof basic_1.AnyType)
@@ -30891,14 +31052,12 @@ class Loop {
30891
31052
  && concat.startsWith("LOOP AT GROUP ") === false) {
30892
31053
  const message = "Loop, not a table type";
30893
31054
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30894
- return;
30895
31055
  }
30896
31056
  else if (loopTarget === undefined
30897
31057
  && sourceType instanceof basic_1.TableType
30898
31058
  && sourceType.isWithHeader() === false) {
30899
31059
  const message = "Loop, no header";
30900
31060
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30901
- return;
30902
31061
  }
30903
31062
  const targetConcat = loopTarget === null || loopTarget === void 0 ? void 0 : loopTarget.concatTokens().toUpperCase();
30904
31063
  if (sourceType instanceof basic_1.TableType) {
@@ -32106,6 +32265,7 @@ const Expressions = __webpack_require__(/*! ../../2_statements/expressions */ ".
32106
32265
  const select_1 = __webpack_require__(/*! ../expressions/select */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/select.js");
32107
32266
  class Select {
32108
32267
  runSyntax(node, input) {
32268
+ // for UNION statements there are multiple select parts
32109
32269
  const selects = node.findDirectExpressions(Expressions.Select);
32110
32270
  for (let i = 0; i < selects.length; i++) {
32111
32271
  const last = i === selects.length - 1;
@@ -34689,6 +34849,7 @@ exports.DECLARATION_STUFF = [
34689
34849
  Statements.Parameter,
34690
34850
  Statements.SelectionScreen,
34691
34851
  Statements.ConstantBegin,
34852
+ Statements.Define,
34692
34853
  ];
34693
34854
  //# sourceMappingURL=selection_events.js.map
34694
34855
 
@@ -39145,6 +39306,13 @@ class CDSDetermineTypes {
39145
39306
  continue;
39146
39307
  }
39147
39308
  if ((source === null || source === void 0 ? void 0 : source.name) === undefined) {
39309
+ if (prefixUpper.startsWith("_")) {
39310
+ components.push({
39311
+ name: f.name,
39312
+ type: new basic_1.VoidType("DDLS:association"),
39313
+ });
39314
+ continue;
39315
+ }
39148
39316
  components.push({
39149
39317
  name: f.name,
39150
39318
  type: new basic_1.UnknownType("CDS parser error, unknown source, " + ddlsName),
@@ -39408,6 +39576,9 @@ class CDSParser {
39408
39576
  if (res === undefined || !(res[0] instanceof nodes_1.ExpressionNode)) {
39409
39577
  res = combi_1.Combi.run(new Expressions.CDSDefineCustom(), tokens, version_1.defaultVersion);
39410
39578
  }
39579
+ if (res === undefined || !(res[0] instanceof nodes_1.ExpressionNode)) {
39580
+ res = combi_1.Combi.run(new Expressions.CDSDefineTableFunction(), tokens, version_1.defaultVersion);
39581
+ }
39411
39582
  if (res === undefined || !(res[0] instanceof nodes_1.ExpressionNode)) {
39412
39583
  res = combi_1.Combi.run(new Expressions.CDSExtendView(), tokens, version_1.defaultVersion);
39413
39584
  }
@@ -39483,7 +39654,8 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
39483
39654
  const cds_annotation_array_1 = __webpack_require__(/*! ./cds_annotation_array */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_annotation_array.js");
39484
39655
  class CDSAnnotation extends combi_1.Expression {
39485
39656
  getRunnable() {
39486
- return (0, combi_1.seq)((0, combi_1.regex)(/^@\w+$/), (0, combi_1.star)((0, combi_1.seq)(".", (0, combi_1.regex)(/^\w+$/))), (0, combi_1.opt)(":"), (0, combi_1.opt)((0, combi_1.alt)(cds_annotation_array_1.CDSAnnotationArray, _1.CDSAnnotationObject, _1.CDSAnnotationSimple)));
39657
+ const nameWithSlash = (0, combi_1.seq)((0, combi_1.regex)(/^\w+$/), (0, combi_1.star)((0, combi_1.seq)("/", (0, combi_1.regex)(/^\w+$/))));
39658
+ return (0, combi_1.seq)((0, combi_1.regex)(/^@\w+$/), (0, combi_1.star)((0, combi_1.seq)(".", nameWithSlash)), (0, combi_1.opt)(":"), (0, combi_1.opt)((0, combi_1.alt)(cds_annotation_array_1.CDSAnnotationArray, _1.CDSAnnotationObject, _1.CDSAnnotationSimple)));
39487
39659
  }
39488
39660
  }
39489
39661
  exports.CDSAnnotation = CDSAnnotation;
@@ -39580,14 +39752,14 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
39580
39752
  const cds_integer_1 = __webpack_require__(/*! ./cds_integer */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_integer.js");
39581
39753
  class CDSArithmetics extends combi_1.Expression {
39582
39754
  getRunnable() {
39583
- const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.opt)((0, combi_1.seq)(".", _1.CDSName)));
39584
- const val = (0, combi_1.alt)(cds_integer_1.CDSInteger, name, _1.CDSFunction, _1.CDSCase, _1.CDSCast, _1.CDSString);
39755
+ const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.optPrio)((0, combi_1.seq)(".", _1.CDSName)));
39756
+ const val = (0, combi_1.altPrio)(cds_integer_1.CDSInteger, _1.CDSFunction, _1.CDSCase, _1.CDSCast, _1.CDSString, name);
39585
39757
  const operator = (0, combi_1.altPrio)("+", "-", "*", "/");
39586
39758
  const operatorValue = (0, combi_1.seq)(operator, val);
39587
- const paren = (0, combi_1.seq)("(", val, (0, combi_1.plus)(operatorValue), ")");
39588
- const noParen = (0, combi_1.seq)(val, (0, combi_1.plus)(operatorValue));
39759
+ const paren = (0, combi_1.seq)("(", val, (0, combi_1.plusPrio)(operatorValue), ")");
39760
+ const noParen = (0, combi_1.seq)(val, (0, combi_1.plusPrio)(operatorValue));
39589
39761
  // todo: this is pretty bad, it needs a rewrite
39590
- return (0, combi_1.altPrio)((0, combi_1.seq)(paren, (0, combi_1.plus)(operatorValue)), paren, noParen);
39762
+ return (0, combi_1.altPrio)((0, combi_1.seq)(paren, (0, combi_1.starPrio)(operatorValue)), noParen);
39591
39763
  }
39592
39764
  }
39593
39765
  exports.CDSArithmetics = CDSArithmetics;
@@ -39653,7 +39825,7 @@ exports.CDSCardinality = void 0;
39653
39825
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
39654
39826
  class CDSCardinality extends combi_1.Expression {
39655
39827
  getRunnable() {
39656
- 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", "*"))), "]");
39828
+ 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", "*"))), "]");
39657
39829
  return cardinality;
39658
39830
  }
39659
39831
  }
@@ -39677,10 +39849,11 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
39677
39849
  class CDSCase extends combi_1.Expression {
39678
39850
  getRunnable() {
39679
39851
  const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.optPrio)((0, combi_1.seq)(".", _1.CDSName)));
39680
- const value = (0, combi_1.alt)(name, _1.CDSString, _1.CDSFunction, CDSCase, _1.CDSCast, _1.CDSArithmetics);
39681
- const simple = (0, combi_1.seq)("CASE", (0, combi_1.alt)(name, _1.CDSFunction), (0, combi_1.plus)((0, combi_1.seq)("WHEN", value, "THEN", value)), "ELSE", value, "END");
39682
- const complex = (0, combi_1.seq)("CASE", (0, combi_1.plus)((0, combi_1.seq)("WHEN", _1.CDSCondition, "THEN", value)), (0, combi_1.opt)((0, combi_1.seq)("ELSE", value)), "END");
39683
- return (0, combi_1.altPrio)(simple, complex);
39852
+ const value = (0, combi_1.altPrio)(_1.CDSFunction, _1.CDSString, CDSCase, _1.CDSCast, _1.CDSArithmetics, name);
39853
+ const thenValue = (0, combi_1.altPrio)((0, combi_1.seq)("(", value, ")"), value);
39854
+ const simple = (0, combi_1.seq)((0, combi_1.altPrio)(_1.CDSFunction, name), (0, combi_1.plusPrio)((0, combi_1.seq)("WHEN", value, "THEN", thenValue)));
39855
+ const complex = (0, combi_1.plusPrio)((0, combi_1.seq)("WHEN", _1.CDSCondition, "THEN", thenValue));
39856
+ return (0, combi_1.seq)("CASE", (0, combi_1.altPrio)(complex, simple), (0, combi_1.optPrio)((0, combi_1.seq)("ELSE", value)), "END");
39684
39857
  }
39685
39858
  }
39686
39859
  exports.CDSCase = CDSCase;
@@ -39702,8 +39875,8 @@ const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src
39702
39875
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
39703
39876
  class CDSCast extends combi_1.Expression {
39704
39877
  getRunnable() {
39705
- const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.opt)((0, combi_1.seq)(".", _1.CDSName)));
39706
- return (0, combi_1.seq)("CAST", "(", (0, combi_1.alt)(name, _1.CDSFunction, _1.CDSCase, _1.CDSAggregate, CDSCast, _1.CDSString, _1.CDSArithmetics), "AS", _1.CDSType, (0, combi_1.opt)((0, combi_1.seq)("PRESERVING", "TYPE")), ")");
39878
+ const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.optPrio)((0, combi_1.seq)(".", _1.CDSName)));
39879
+ return (0, combi_1.seq)("CAST", "(", (0, combi_1.altPrio)(_1.CDSFunction, _1.CDSCase, _1.CDSAggregate, CDSCast, _1.CDSString, _1.CDSArithmetics, name), "AS", _1.CDSType, (0, combi_1.optPrio)((0, combi_1.seq)("PRESERVING", "TYPE")), ")");
39707
39880
  }
39708
39881
  }
39709
39882
  exports.CDSCast = CDSCast;
@@ -39749,13 +39922,15 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
39749
39922
  const cds_integer_1 = __webpack_require__(/*! ./cds_integer */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_integer.js");
39750
39923
  class CDSCondition extends combi_1.Expression {
39751
39924
  getRunnable() {
39752
- const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.optPrio)((0, combi_1.seq)(".", (0, combi_1.alt)(_1.CDSName, _1.CDSString))));
39753
- const left = (0, combi_1.alt)(name, _1.CDSFunction, _1.CDSString);
39754
- const compare = (0, combi_1.seq)(left, (0, combi_1.alt)("=", (0, combi_1.seq)("!", "="), (0, combi_1.seq)("<", ">"), "<", ">", (0, combi_1.seq)(">", "="), (0, combi_1.seq)("<", "="), "LIKE", "NOT LIKE"), (0, combi_1.alt)(left, cds_integer_1.CDSInteger, _1.CDSFunction, _1.CDSString));
39755
- const is = (0, combi_1.seq)(left, "IS", (0, combi_1.optPrio)("NOT"), (0, combi_1.altPrio)("INITIAL", "NULL"));
39756
- const condition = (0, combi_1.seq)((0, combi_1.optPrio)("NOT"), (0, combi_1.alt)(compare, is));
39925
+ const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.optPrio)((0, combi_1.seq)(".", (0, combi_1.altPrio)(_1.CDSString, _1.CDSName))));
39926
+ const left = (0, combi_1.altPrio)(_1.CDSString, _1.CDSFunction, _1.CDSAggregate, name);
39927
+ const operators = (0, combi_1.altPrio)("=", (0, combi_1.seq)("!", "="), (0, combi_1.seq)("<", ">"), (0, combi_1.seq)(">", "="), (0, combi_1.seq)("<", "="), "<", ">", "LIKE", "NOT LIKE");
39928
+ const compare = (0, combi_1.seq)(operators, (0, combi_1.altPrio)(left, cds_integer_1.CDSInteger));
39929
+ const is = (0, combi_1.seq)("IS", (0, combi_1.optPrio)("NOT"), (0, combi_1.altPrio)("INITIAL", "NULL"));
39930
+ const between = (0, combi_1.seq)("BETWEEN", left, "AND", left);
39931
+ const condition = (0, combi_1.seq)((0, combi_1.optPrio)("NOT"), left, (0, combi_1.altPrio)(compare, is, between));
39757
39932
  const paren = (0, combi_1.seq)("(", CDSCondition, ")");
39758
- return (0, combi_1.seq)((0, combi_1.alt)(condition, paren), (0, combi_1.starPrio)((0, combi_1.seq)((0, combi_1.altPrio)("AND", "OR"), (0, combi_1.altPrio)(condition, paren))));
39933
+ return (0, combi_1.seq)((0, combi_1.altPrio)(condition, paren), (0, combi_1.starPrio)((0, combi_1.seq)((0, combi_1.altPrio)("AND", "OR"), (0, combi_1.altPrio)(condition, paren))));
39759
39934
  }
39760
39935
  }
39761
39936
  exports.CDSCondition = CDSCondition;
@@ -39835,6 +40010,30 @@ exports.CDSDefineProjection = CDSDefineProjection;
39835
40010
 
39836
40011
  /***/ }),
39837
40012
 
40013
+ /***/ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_table_function.js":
40014
+ /*!********************************************************************************************!*\
40015
+ !*** ./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_table_function.js ***!
40016
+ \********************************************************************************************/
40017
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
40018
+
40019
+ "use strict";
40020
+
40021
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
40022
+ exports.CDSDefineTableFunction = void 0;
40023
+ const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src/cds/expressions/index.js");
40024
+ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
40025
+ const cds_name_1 = __webpack_require__(/*! ./cds_name */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_name.js");
40026
+ class CDSDefineTableFunction extends combi_1.Expression {
40027
+ getRunnable() {
40028
+ const methodName = (0, combi_1.seq)(cds_name_1.CDSName, "=", ">", cds_name_1.CDSName);
40029
+ return (0, combi_1.seq)((0, combi_1.star)(_1.CDSAnnotation), (0, combi_1.str)("DEFINE TABLE FUNCTION"), cds_name_1.CDSName, (0, combi_1.optPrio)(_1.CDSWithParameters), (0, combi_1.str)("RETURNS {"), (0, combi_1.plus)((0, combi_1.seq)((0, combi_1.optPrio)("KEY"), cds_name_1.CDSName, ":", _1.CDSType, ";")), (0, combi_1.str)("} IMPLEMENTED BY METHOD"), methodName, (0, combi_1.opt)(";"));
40030
+ }
40031
+ }
40032
+ exports.CDSDefineTableFunction = CDSDefineTableFunction;
40033
+ //# sourceMappingURL=cds_define_table_function.js.map
40034
+
40035
+ /***/ }),
40036
+
39838
40037
  /***/ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_view.js":
39839
40038
  /*!**********************************************************************************!*\
39840
40039
  !*** ./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_view.js ***!
@@ -39877,7 +40076,7 @@ const cds_as_1 = __webpack_require__(/*! ./cds_as */ "./node_modules/@abaplint/c
39877
40076
  const cds_cast_1 = __webpack_require__(/*! ./cds_cast */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_cast.js");
39878
40077
  class CDSElement extends combi_1.Expression {
39879
40078
  getRunnable() {
39880
- return (0, combi_1.seq)((0, combi_1.starPrio)(_1.CDSAnnotation), (0, combi_1.optPrio)("KEY"), (0, combi_1.altPrio)(_1.CDSAggregate, _1.CDSString, _1.CDSArithmetics, _1.CDSFunction, cds_cast_1.CDSCast, _1.CDSCase, (0, combi_1.seq)(_1.CDSName, ": REDIRECTED TO", (0, combi_1.opt)((0, combi_1.alt)("PARENT", "COMPOSITION CHILD")), _1.CDSName), _1.CDSPrefixedName, (0, combi_1.regex)(/^\d+$/)), (0, combi_1.opt)(cds_as_1.CDSAs));
40079
+ return (0, combi_1.seq)((0, combi_1.starPrio)(_1.CDSAnnotation), (0, combi_1.optPrio)("KEY"), (0, combi_1.altPrio)(_1.CDSAggregate, _1.CDSString, _1.CDSArithmetics, _1.CDSFunction, cds_cast_1.CDSCast, _1.CDSCase, (0, combi_1.seq)("(", _1.CDSCase, ")"), (0, combi_1.seq)(_1.CDSName, ": REDIRECTED TO", (0, combi_1.opt)((0, combi_1.alt)("PARENT", "COMPOSITION CHILD")), _1.CDSName), _1.CDSPrefixedName, _1.CDSInteger), (0, combi_1.opt)(cds_as_1.CDSAs));
39881
40080
  }
39882
40081
  }
39883
40082
  exports.CDSElement = CDSElement;
@@ -39953,6 +40152,13 @@ class CDSFunction extends combi_1.Expression {
39953
40152
  const abap_system_timezone = (0, combi_1.seq)("ABAP_SYSTEM_TIMEZONE", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
39954
40153
  const abap_user_timezone = (0, combi_1.seq)("ABAP_USER_TIMEZONE", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
39955
40154
  const mod = (0, combi_1.seq)("MOD", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
40155
+ const replace = (0, combi_1.seq)("REPLACE", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
40156
+ const lpad = (0, combi_1.seq)("LPAD", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
40157
+ const rpad = (0, combi_1.seq)("RPAD", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
40158
+ const instr = (0, combi_1.seq)("INSTR", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
40159
+ const length = (0, combi_1.seq)("LENGTH", "(", _1.CDSFunctionInput, ")");
40160
+ const ltrim = (0, combi_1.seq)("LTRIM", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
40161
+ const rtrim = (0, combi_1.seq)("RTRIM", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
39956
40162
  const left = (0, combi_1.seq)("LEFT", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
39957
40163
  const right = (0, combi_1.seq)("RIGHT", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
39958
40164
  const conversionInput = (0, combi_1.seq)(_1.CDSName, "=", ">", _1.CDSFunctionInput);
@@ -39960,7 +40166,7 @@ class CDSFunction extends combi_1.Expression {
39960
40166
  const unitConversion = (0, combi_1.seq)("UNIT_CONVERSION", "(", conversionInputs, ")");
39961
40167
  const currencyConversion = (0, combi_1.seq)("CURRENCY_CONVERSION", "(", conversionInputs, ")");
39962
40168
  const decimalShift = (0, combi_1.seq)("DECIMAL_SHIFT", "(", conversionInputs, ")");
39963
- return (0, combi_1.altPrio)(substring, coalesce, tstmp_to_dats, concat, tstmp_to_tims, upper, lower, abs, ceil, floor, round, div, division, concat_with_space, dats_is_valid, dats_days_between, tstmp_add_seconds, tstmp_seconds_between, tstmp_current_utctimestamp, tstmp_is_valid, abap_system_timezone, abap_user_timezone, bintohex, hextobin, dats_add_days, dats_add_months, tstmp_to_dst, dats_tims_to_tstmp, mod, left, right, unitConversion, currencyConversion, decimalShift);
40169
+ return (0, combi_1.altPrio)(substring, coalesce, tstmp_to_dats, concat, tstmp_to_tims, upper, lower, abs, ceil, floor, round, div, division, concat_with_space, dats_is_valid, dats_days_between, tstmp_add_seconds, tstmp_seconds_between, tstmp_current_utctimestamp, tstmp_is_valid, abap_system_timezone, abap_user_timezone, bintohex, hextobin, dats_add_days, dats_add_months, tstmp_to_dst, dats_tims_to_tstmp, mod, left, right, lpad, rpad, instr, length, ltrim, rtrim, replace, unitConversion, currencyConversion, decimalShift);
39964
40170
  }
39965
40171
  }
39966
40172
  exports.CDSFunction = CDSFunction;
@@ -39983,7 +40189,7 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
39983
40189
  class CDSFunctionInput extends combi_1.Expression {
39984
40190
  getRunnable() {
39985
40191
  const qualified = (0, combi_1.seq)(_1.CDSName, (0, combi_1.opt)(_1.CDSParameters), (0, combi_1.starPrio)((0, combi_1.seq)(".", _1.CDSName, (0, combi_1.opt)(_1.CDSParameters))));
39986
- const input = (0, combi_1.altPrio)(_1.CDSCast, _1.CDSFunction, _1.CDSArithmetics, _1.CDSCase, _1.CDSString, qualified, (0, combi_1.regex)(/^\d+$/));
40192
+ const input = (0, combi_1.altPrio)(_1.CDSCast, _1.CDSFunction, _1.CDSArithmetics, _1.CDSCase, _1.CDSString, qualified, _1.CDSInteger);
39987
40193
  return input;
39988
40194
  }
39989
40195
  }
@@ -40050,7 +40256,7 @@ exports.CDSInteger = void 0;
40050
40256
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
40051
40257
  class CDSInteger extends combi_1.Expression {
40052
40258
  getRunnable() {
40053
- return (0, combi_1.regex)(/^\d+$/);
40259
+ return (0, combi_1.seq)((0, combi_1.opt)("-"), (0, combi_1.regex)(/^\d+$/));
40054
40260
  }
40055
40261
  }
40056
40262
  exports.CDSInteger = CDSInteger;
@@ -40073,7 +40279,9 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
40073
40279
  const cds_condition_1 = __webpack_require__(/*! ./cds_condition */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_condition.js");
40074
40280
  class CDSJoin extends combi_1.Expression {
40075
40281
  getRunnable() {
40076
- return (0, combi_1.seq)((0, combi_1.opt)((0, combi_1.alt)("INNER", "LEFT OUTER", "LEFT OUTER TO ONE")), "JOIN", _1.CDSSource, "ON", cds_condition_1.CDSCondition);
40282
+ const cond = (0, combi_1.seq)(_1.CDSSource, "ON", cds_condition_1.CDSCondition);
40283
+ const foo = (0, combi_1.altPrio)((0, combi_1.seq)("(", cond, ")"), cond);
40284
+ return (0, combi_1.seq)((0, combi_1.optPrio)((0, combi_1.altPrio)("LEFT OUTER TO ONE", "LEFT OUTER", "INNER")), "JOIN", foo);
40077
40285
  }
40078
40286
  }
40079
40287
  exports.CDSJoin = CDSJoin;
@@ -40095,7 +40303,7 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
40095
40303
  class CDSName extends combi_1.Expression {
40096
40304
  getRunnable() {
40097
40305
  const pre = (0, combi_1.seq)("/", (0, combi_1.regex)(/^[\w_]+$/), "/");
40098
- return (0, combi_1.seq)((0, combi_1.opt)(":"), (0, combi_1.opt)(pre), (0, combi_1.regex)(/^\$?#?[\w_]+$/));
40306
+ return (0, combi_1.seq)((0, combi_1.optPrio)(":"), (0, combi_1.optPrio)(pre), (0, combi_1.regex)(/^\$?#?[\w_]+$/));
40099
40307
  }
40100
40308
  }
40101
40309
  exports.CDSName = CDSName;
@@ -40237,8 +40445,9 @@ class CDSSelect extends combi_1.Expression {
40237
40445
  getRunnable() {
40238
40446
  const fields = (0, combi_1.seq)((0, combi_1.star)((0, combi_1.seq)(_1.CDSElement, ",")), _1.CDSElement);
40239
40447
  const distinct = (0, combi_1.str)("DISTINCT");
40240
- const elements = (0, combi_1.seq)((0, combi_1.str)("{"), _1.CDSElement, (0, combi_1.starPrio)((0, combi_1.seq)(",", _1.CDSElement)), (0, combi_1.str)("}"));
40241
- return (0, combi_1.seq)("SELECT", (0, combi_1.optPrio)(distinct), (0, combi_1.opt)(fields), "FROM", _1.CDSSource, (0, combi_1.star)(cds_join_1.CDSJoin), (0, combi_1.star)(_1.CDSComposition), (0, combi_1.star)(cds_association_1.CDSAssociation), (0, combi_1.star)(_1.CDSComposition), (0, combi_1.opt)(elements), (0, combi_1.optPrio)(_1.CDSWhere), (0, combi_1.optPrio)(_1.CDSGroupBy), (0, combi_1.optPrio)(_1.CDSHaving), (0, combi_1.optPrio)((0, combi_1.seq)("UNION", (0, combi_1.optPrio)("ALL"), CDSSelect)));
40448
+ const elementList = (0, combi_1.seq)(_1.CDSElement, (0, combi_1.starPrio)((0, combi_1.seq)(",", _1.CDSElement)));
40449
+ const elements = (0, combi_1.seq)((0, combi_1.str)("{"), (0, combi_1.altPrio)("*", elementList), (0, combi_1.str)("}"));
40450
+ return (0, combi_1.seq)("SELECT", (0, combi_1.optPrio)(distinct), (0, combi_1.opt)((0, combi_1.alt)("*", fields)), "FROM", _1.CDSSource, (0, combi_1.star)(cds_join_1.CDSJoin), (0, combi_1.star)(_1.CDSComposition), (0, combi_1.star)(cds_association_1.CDSAssociation), (0, combi_1.star)(_1.CDSComposition), (0, combi_1.opt)(elements), (0, combi_1.optPrio)(_1.CDSWhere), (0, combi_1.optPrio)(_1.CDSGroupBy), (0, combi_1.optPrio)(_1.CDSHaving), (0, combi_1.optPrio)((0, combi_1.seq)("UNION", (0, combi_1.optPrio)("ALL"), CDSSelect)));
40242
40451
  }
40243
40452
  }
40244
40453
  exports.CDSSelect = CDSSelect;
@@ -40260,7 +40469,7 @@ const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src
40260
40469
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
40261
40470
  class CDSSource extends combi_1.Expression {
40262
40471
  getRunnable() {
40263
- return (0, combi_1.seq)(_1.CDSName, (0, combi_1.opt)(_1.CDSParametersSelect), (0, combi_1.opt)(_1.CDSAs));
40472
+ return (0, combi_1.seq)(_1.CDSName, (0, combi_1.optPrio)(_1.CDSParametersSelect), (0, combi_1.optPrio)(_1.CDSAs));
40264
40473
  }
40265
40474
  }
40266
40475
  exports.CDSSource = CDSSource;
@@ -40349,7 +40558,7 @@ const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src
40349
40558
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
40350
40559
  class CDSWithParameters extends combi_1.Expression {
40351
40560
  getRunnable() {
40352
- const param = (0, combi_1.seq)(_1.CDSName, ":", _1.CDSType);
40561
+ const param = (0, combi_1.seq)((0, combi_1.starPrio)(_1.CDSAnnotation), _1.CDSName, ":", _1.CDSType);
40353
40562
  return (0, combi_1.seq)("WITH PARAMETERS", param, (0, combi_1.star)((0, combi_1.seq)(",", param)));
40354
40563
  }
40355
40564
  }
@@ -40398,11 +40607,12 @@ __exportStar(__webpack_require__(/*! ./cds_condition */ "./node_modules/@abaplin
40398
40607
  __exportStar(__webpack_require__(/*! ./cds_define_abstract */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_abstract.js"), exports);
40399
40608
  __exportStar(__webpack_require__(/*! ./cds_define_custom */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_custom.js"), exports);
40400
40609
  __exportStar(__webpack_require__(/*! ./cds_define_projection */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_projection.js"), exports);
40610
+ __exportStar(__webpack_require__(/*! ./cds_define_table_function */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_table_function.js"), exports);
40401
40611
  __exportStar(__webpack_require__(/*! ./cds_define_view */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_view.js"), exports);
40402
40612
  __exportStar(__webpack_require__(/*! ./cds_element */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_element.js"), exports);
40403
40613
  __exportStar(__webpack_require__(/*! ./cds_extend_view */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_extend_view.js"), exports);
40404
- __exportStar(__webpack_require__(/*! ./cds_function */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_function.js"), exports);
40405
40614
  __exportStar(__webpack_require__(/*! ./cds_function_input */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_function_input.js"), exports);
40615
+ __exportStar(__webpack_require__(/*! ./cds_function */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_function.js"), exports);
40406
40616
  __exportStar(__webpack_require__(/*! ./cds_group_by */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_group_by.js"), exports);
40407
40617
  __exportStar(__webpack_require__(/*! ./cds_having */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_having.js"), exports);
40408
40618
  __exportStar(__webpack_require__(/*! ./cds_integer */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_integer.js"), exports);
@@ -43000,17 +43210,48 @@ const syntax_1 = __webpack_require__(/*! ../abap/5_syntax/syntax */ "./node_modu
43000
43210
  const _abap_object_1 = __webpack_require__(/*! ../objects/_abap_object */ "./node_modules/@abaplint/core/build/src/objects/_abap_object.js");
43001
43211
  const dump_scope_1 = __webpack_require__(/*! ./dump_scope */ "./node_modules/@abaplint/core/build/src/lsp/dump_scope.js");
43002
43212
  const virtual_position_1 = __webpack_require__(/*! ../virtual_position */ "./node_modules/@abaplint/core/build/src/virtual_position.js");
43213
+ const objects_1 = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
43214
+ const cds_lexer_1 = __webpack_require__(/*! ../cds/cds_lexer */ "./node_modules/@abaplint/core/build/src/cds/cds_lexer.js");
43003
43215
  class Help {
43004
43216
  static find(reg, textDocument, position) {
43005
- const file = _lsp_utils_1.LSPUtils.getABAPFile(reg, textDocument.uri);
43217
+ const abapFile = _lsp_utils_1.LSPUtils.getABAPFile(reg, textDocument.uri);
43218
+ if (abapFile !== undefined) {
43219
+ return this.dumpABAP(abapFile, reg, textDocument, position);
43220
+ }
43221
+ const file = reg.getFileByName(textDocument.uri);
43006
43222
  if (file === undefined) {
43007
- return "file not found";
43223
+ return "File not found: " + textDocument.uri;
43008
43224
  }
43009
- else {
43010
- return this.dumpABAP(file, reg, textDocument, position);
43225
+ const obj = reg.findObjectForFile(file);
43226
+ if (obj instanceof objects_1.DataDefinition) {
43227
+ return this.dumpDDLS(obj, reg);
43011
43228
  }
43229
+ return "Unhandled object type: " + obj.getType();
43012
43230
  }
43013
43231
  /////////////////////////////////////////////////
43232
+ static dumpDDLS(obj, reg) {
43233
+ let content = "";
43234
+ content += "<h1>" + obj.getType() + " " + obj.getName() + "</h1>\n";
43235
+ content += obj.getDescription() + "\n";
43236
+ content += obj.getParsingIssues().map(i => i.getMessage()).join("<br>\n");
43237
+ content += `<hr>\n`;
43238
+ const parsed = obj.getParsedData();
43239
+ parsed === null || parsed === void 0 ? true : delete parsed.tree;
43240
+ content += `<pre>` + JSON.stringify(parsed, null, 2) + "</pre>\n";
43241
+ content += `<hr>\n`;
43242
+ content += `<pre>` + obj.parseType(reg).toText(0) + "</pre>\n";
43243
+ content += `<hr>\n`;
43244
+ const file = obj.findSourceFile();
43245
+ if (file) {
43246
+ const tokens = cds_lexer_1.CDSLexer.run(file);
43247
+ content += `<h3>Tokens</h3>\n<pre>\n`;
43248
+ for (const t of tokens) {
43249
+ content += JSON.stringify(t) + "\n";
43250
+ }
43251
+ content += `</pre>\n`;
43252
+ }
43253
+ return content;
43254
+ }
43014
43255
  static dumpABAP(file, reg, textDocument, position) {
43015
43256
  let content = "";
43016
43257
  content = `
@@ -44397,7 +44638,10 @@ class ABAPObject extends _abstract_object_1.AbstractObject {
44397
44638
  }
44398
44639
  // uri fallback,
44399
44640
  for (const file of this.getABAPFiles()) {
44400
- if (file.getFilename().endsWith(".abap")) {
44641
+ if (file.getFilename().includes(".prog.screen_")) {
44642
+ continue;
44643
+ }
44644
+ else if (file.getFilename().endsWith(".abap")) {
44401
44645
  return file;
44402
44646
  }
44403
44647
  }
@@ -47158,13 +47402,13 @@ class FunctionGroup extends _abap_object_1.ABAPObject {
47158
47402
  if (namespaced) {
47159
47403
  search = search.replace(/\//g, "#");
47160
47404
  }
47161
- if ((i.startsWith("L") || namespaced) && f.getFilename().includes(search.toLowerCase())) {
47405
+ if ((i.startsWith("L") || namespaced) && f.getFilename().includes(search.toLowerCase() + ".")) {
47162
47406
  ret.push({ file: f, name: i });
47163
47407
  }
47164
47408
  // fix for URL encoded? Uris
47165
47409
  if (namespaced) {
47166
47410
  search = i.replace(/\//g, "%23");
47167
- if (f.getFilename().includes(search.toLowerCase())) {
47411
+ if (f.getFilename().includes(search.toLowerCase() + ".")) {
47168
47412
  ret.push({ file: f, name: i });
47169
47413
  }
47170
47414
  }
@@ -51370,6 +51614,9 @@ class TableType extends _abstract_object_1.AbstractObject {
51370
51614
  return;
51371
51615
  }
51372
51616
  const values = parsed.abapGit["asx:abap"]["asx:values"];
51617
+ if (values === undefined) {
51618
+ return;
51619
+ }
51373
51620
  const dd40v = values.DD40V;
51374
51621
  this.parsedXML.rowtype = dd40v.ROWTYPE ? dd40v.ROWTYPE : "";
51375
51622
  this.parsedXML.rowkind = dd40v.ROWKIND ? dd40v.ROWKIND : "";
@@ -52179,6 +52426,7 @@ class Indent {
52179
52426
  || type instanceof Statements.EndModule
52180
52427
  || type instanceof Statements.EndSelect
52181
52428
  || type instanceof Statements.EndMethod
52429
+ || type instanceof Statements.EndChain
52182
52430
  || type instanceof Statements.EndAt
52183
52431
  || type instanceof Statements.Else
52184
52432
  || type instanceof Statements.EndExec
@@ -52287,6 +52535,7 @@ class Indent {
52287
52535
  || type instanceof Statements.Else
52288
52536
  || type instanceof Statements.ElseIf
52289
52537
  || type instanceof Statements.MethodImplementation
52538
+ || type instanceof Statements.Chain
52290
52539
  || type instanceof Statements.TestInjection
52291
52540
  || type instanceof Statements.TestSeam
52292
52541
  || (this.options.selectionScreenBlockIndentation === true
@@ -52492,7 +52741,7 @@ class Registry {
52492
52741
  }
52493
52742
  static abaplintVersion() {
52494
52743
  // magic, see build script "version.sh"
52495
- return "2.113.79";
52744
+ return "2.113.99";
52496
52745
  }
52497
52746
  getDDICReferences() {
52498
52747
  return this.ddicReferences;
@@ -54634,6 +54883,7 @@ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/c
54634
54883
  const version_1 = __webpack_require__(/*! ../version */ "./node_modules/@abaplint/core/build/src/version.js");
54635
54884
  const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js");
54636
54885
  const objects_1 = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
54886
+ const expressions_1 = __webpack_require__(/*! ../cds/expressions */ "./node_modules/@abaplint/core/build/src/cds/expressions/index.js");
54637
54887
  class CDSLegacyViewConf extends _basic_rule_config_1.BasicRuleConfig {
54638
54888
  }
54639
54889
  exports.CDSLegacyViewConf = CDSLegacyViewConf;
@@ -54670,19 +54920,17 @@ v755 and up`,
54670
54920
  && this.reg.getConfig().getVersion() !== version_1.Version.Cloud) {
54671
54921
  return [];
54672
54922
  }
54673
- if (o.getType() !== "DDLS") {
54923
+ if (o.getType() !== "DDLS" || !(o instanceof objects_1.DataDefinition)) {
54674
54924
  return [];
54675
54925
  }
54676
- if (o instanceof objects_1.DataDefinition) {
54677
- const tree = o.getTree();
54678
- if (tree === undefined) {
54679
- return []; // parser error
54680
- }
54681
- if (tree.findDirectTokenByText("ENTITY") === undefined) {
54682
- const file = o.findSourceFile();
54683
- if (file) {
54684
- issues.push(issue_1.Issue.atRow(file, 1, "CDS Legacy View", this.getMetadata().key, this.getConfig().severity));
54685
- }
54926
+ const tree = o.getTree();
54927
+ if (tree === undefined) {
54928
+ return []; // parser error
54929
+ }
54930
+ if (tree.get() instanceof expressions_1.CDSDefineView && tree.findDirectTokenByText("ENTITY") === undefined) {
54931
+ const file = o.findSourceFile();
54932
+ if (file) {
54933
+ issues.push(issue_1.Issue.atRow(file, 1, "CDS Legacy View", this.getMetadata().key, this.getConfig().severity));
54686
54934
  }
54687
54935
  }
54688
54936
  return issues;
@@ -54739,7 +54987,9 @@ class CDSParserError {
54739
54987
  const hasError = object.hasParserError();
54740
54988
  const file = object.findSourceFile();
54741
54989
  if (hasError === true && file) {
54742
- issues.push(issue_1.Issue.atRow(file, 1, "CDS Parser error", this.getMetadata().key, this.getConfig().severity));
54990
+ const empty = file.getRaw().length === 0 ? ", empty file" : "";
54991
+ const message = "CDS Parser error" + empty;
54992
+ issues.push(issue_1.Issue.atRow(file, 1, message, this.getMetadata().key, this.getConfig().severity));
54743
54993
  }
54744
54994
  }
54745
54995
  return issues;
@@ -57578,32 +57828,32 @@ exports.DoubleSpace = DoubleSpace;
57578
57828
  Object.defineProperty(exports, "__esModule", ({ value: true }));
57579
57829
  exports.Downport = exports.DownportConf = void 0;
57580
57830
  /* eslint-disable max-len */
57581
- const Statements = __webpack_require__(/*! ../abap/2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
57831
+ const crypto = __webpack_require__(/*! crypto */ "crypto");
57832
+ const tokens_1 = __webpack_require__(/*! ../abap/1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
57582
57833
  const Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
57583
- const Structures = __webpack_require__(/*! ../abap/3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
57584
- const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js");
57585
- const issue_1 = __webpack_require__(/*! ../issue */ "./node_modules/@abaplint/core/build/src/issue.js");
57586
- const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/core/build/src/rules/_irule.js");
57834
+ const Statements = __webpack_require__(/*! ../abap/2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
57835
+ const statements_1 = __webpack_require__(/*! ../abap/2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
57587
57836
  const _statement_1 = __webpack_require__(/*! ../abap/2_statements/statements/_statement */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js");
57588
- const nodes_1 = __webpack_require__(/*! ../abap/nodes */ "./node_modules/@abaplint/core/build/src/abap/nodes/index.js");
57589
- const edit_helper_1 = __webpack_require__(/*! ../edit_helper */ "./node_modules/@abaplint/core/build/src/edit_helper.js");
57590
- const position_1 = __webpack_require__(/*! ../position */ "./node_modules/@abaplint/core/build/src/position.js");
57591
- const virtual_position_1 = __webpack_require__(/*! ../virtual_position */ "./node_modules/@abaplint/core/build/src/virtual_position.js");
57592
- const _abap_object_1 = __webpack_require__(/*! ../objects/_abap_object */ "./node_modules/@abaplint/core/build/src/objects/_abap_object.js");
57593
- const version_1 = __webpack_require__(/*! ../version */ "./node_modules/@abaplint/core/build/src/version.js");
57594
- const registry_1 = __webpack_require__(/*! ../registry */ "./node_modules/@abaplint/core/build/src/registry.js");
57595
- const syntax_1 = __webpack_require__(/*! ../abap/5_syntax/syntax */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js");
57837
+ const Structures = __webpack_require__(/*! ../abap/3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
57838
+ const _builtin_1 = __webpack_require__(/*! ../abap/5_syntax/_builtin */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_builtin.js");
57596
57839
  const _reference_1 = __webpack_require__(/*! ../abap/5_syntax/_reference */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js");
57840
+ const _scope_type_1 = __webpack_require__(/*! ../abap/5_syntax/_scope_type */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js");
57841
+ const syntax_1 = __webpack_require__(/*! ../abap/5_syntax/syntax */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js");
57842
+ const nodes_1 = __webpack_require__(/*! ../abap/nodes */ "./node_modules/@abaplint/core/build/src/abap/nodes/index.js");
57597
57843
  const _typed_identifier_1 = __webpack_require__(/*! ../abap/types/_typed_identifier */ "./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js");
57598
57844
  const basic_1 = __webpack_require__(/*! ../abap/types/basic */ "./node_modules/@abaplint/core/build/src/abap/types/basic/index.js");
57599
57845
  const config_1 = __webpack_require__(/*! ../config */ "./node_modules/@abaplint/core/build/src/config.js");
57600
- const tokens_1 = __webpack_require__(/*! ../abap/1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
57601
- const include_graph_1 = __webpack_require__(/*! ../utils/include_graph */ "./node_modules/@abaplint/core/build/src/utils/include_graph.js");
57846
+ const edit_helper_1 = __webpack_require__(/*! ../edit_helper */ "./node_modules/@abaplint/core/build/src/edit_helper.js");
57847
+ const issue_1 = __webpack_require__(/*! ../issue */ "./node_modules/@abaplint/core/build/src/issue.js");
57602
57848
  const objects_1 = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
57603
- const _builtin_1 = __webpack_require__(/*! ../abap/5_syntax/_builtin */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_builtin.js");
57604
- const _scope_type_1 = __webpack_require__(/*! ../abap/5_syntax/_scope_type */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js");
57605
- const statements_1 = __webpack_require__(/*! ../abap/2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
57606
- const crypto = __webpack_require__(/*! crypto */ "crypto");
57849
+ const _abap_object_1 = __webpack_require__(/*! ../objects/_abap_object */ "./node_modules/@abaplint/core/build/src/objects/_abap_object.js");
57850
+ const position_1 = __webpack_require__(/*! ../position */ "./node_modules/@abaplint/core/build/src/position.js");
57851
+ const registry_1 = __webpack_require__(/*! ../registry */ "./node_modules/@abaplint/core/build/src/registry.js");
57852
+ const include_graph_1 = __webpack_require__(/*! ../utils/include_graph */ "./node_modules/@abaplint/core/build/src/utils/include_graph.js");
57853
+ const version_1 = __webpack_require__(/*! ../version */ "./node_modules/@abaplint/core/build/src/version.js");
57854
+ const virtual_position_1 = __webpack_require__(/*! ../virtual_position */ "./node_modules/@abaplint/core/build/src/virtual_position.js");
57855
+ const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js");
57856
+ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/core/build/src/rules/_irule.js");
57607
57857
  // todo: refactor each sub-rule to new classes?
57608
57858
  // todo: add configuration
57609
57859
  class DownportConf extends _basic_rule_config_1.BasicRuleConfig {
@@ -57979,6 +58229,10 @@ Make sure to test the downported code, it might not always be completely correct
57979
58229
  if (found) {
57980
58230
  return found;
57981
58231
  }
58232
+ found = this.downportSQLMoveInto(low, high, lowFile, highSyntax);
58233
+ if (found) {
58234
+ return found;
58235
+ }
57982
58236
  found = this.downportSQLExtras(low, high, lowFile, highSyntax);
57983
58237
  if (found) {
57984
58238
  return found;
@@ -58112,7 +58366,40 @@ Make sure to test the downported code, it might not always be completely correct
58112
58366
  return undefined;
58113
58367
  }
58114
58368
  //////////////////////////////////////////
58115
- /** removes @'s */
58369
+ /** move INTO from after WHERE to after FROM */
58370
+ downportSQLMoveInto(low, high, lowFile, _highSyntax) {
58371
+ var _a;
58372
+ if (!(low.get() instanceof _statement_1.Unknown)) {
58373
+ return undefined;
58374
+ }
58375
+ // note: SQLCond is also used in JOIN(FROM) conditions
58376
+ const where = (_a = high.findFirstExpression(Expressions.Select)) === null || _a === void 0 ? void 0 : _a.findDirectExpression(Expressions.SQLCond);
58377
+ if (where === undefined) {
58378
+ return undefined;
58379
+ }
58380
+ let into = high.findFirstExpression(Expressions.SQLIntoList);
58381
+ if (into === undefined) {
58382
+ into = high.findFirstExpression(Expressions.SQLIntoStructure);
58383
+ }
58384
+ if (into === undefined) {
58385
+ into = high.findFirstExpression(Expressions.SQLIntoTable);
58386
+ }
58387
+ if (into === undefined) {
58388
+ return undefined;
58389
+ }
58390
+ if (where.getLastToken().getEnd().isBefore(into.getFirstToken().getStart()) === false) {
58391
+ return undefined;
58392
+ }
58393
+ const from = high.findFirstExpression(Expressions.SQLFrom);
58394
+ if (from === undefined) {
58395
+ return undefined;
58396
+ }
58397
+ const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, from.getLastToken().getEnd(), ` ` + into.concatTokens());
58398
+ const fix2 = edit_helper_1.EditHelper.deleteRange(lowFile, into.getFirstToken().getStart(), into.getLastToken().getEnd());
58399
+ const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
58400
+ return issue_1.Issue.atToken(lowFile, low.getFirstToken(), "SQL, move INTO", this.getMetadata().key, this.conf.severity, fix);
58401
+ }
58402
+ /** removes @'s and commas */
58116
58403
  downportSQLExtras(low, high, lowFile, highSyntax) {
58117
58404
  if (!(low.get() instanceof _statement_1.Unknown)) {
58118
58405
  return undefined;
@@ -58156,7 +58443,7 @@ Make sure to test the downported code, it might not always be completely correct
58156
58443
  }
58157
58444
  }
58158
58445
  }
58159
- for (const fieldList of high.findAllExpressionsMulti([Expressions.SQLFieldList, Expressions.SQLFieldListLoop], true)) {
58446
+ for (const fieldList of high.findAllExpressionsMulti([Expressions.SQLFieldList, Expressions.SQLFieldListLoop, Expressions.SQLOrderBy], true)) {
58160
58447
  for (const token of fieldList.getDirectTokens()) {
58161
58448
  if (token.getStr() === ",") {
58162
58449
  addFix(token);
@@ -59356,24 +59643,33 @@ ${indentation} output = ${uniqueName}.\n`;
59356
59643
  return issue_1.Issue.atToken(lowFile, high.getFirstToken(), "Outline LOOP input", this.getMetadata().key, this.conf.severity, fix);
59357
59644
  }
59358
59645
  outlineLoopTarget(node, lowFile, highSyntax) {
59359
- var _a, _b, _c, _d, _e, _f, _g;
59646
+ var _a, _b, _c, _d, _e, _f;
59360
59647
  // also allows outlining of voided types
59361
59648
  if (!(node.get() instanceof Statements.Loop)) {
59362
59649
  return undefined;
59363
59650
  }
59364
- const sourceName = (_a = node.findDirectExpression(Expressions.SimpleSource2)) === null || _a === void 0 ? void 0 : _a.concatTokens();
59651
+ const source = node.findDirectExpression(Expressions.SimpleSource2);
59652
+ if (source === undefined) {
59653
+ return undefined;
59654
+ }
59655
+ const sourceName = source === null || source === void 0 ? void 0 : source.concatTokens();
59365
59656
  if (sourceName === undefined) {
59366
59657
  return undefined;
59367
59658
  }
59659
+ let foundType = undefined;
59660
+ const spag = highSyntax.spaghetti.lookupPosition(source.getFirstToken().getStart(), lowFile.getFilename());
59661
+ if (spag) {
59662
+ foundType = spag.findVariable(source.concatTokens());
59663
+ }
59368
59664
  const concat = node.concatTokens().toUpperCase();
59369
59665
  if (concat.includes(" GROUP BY ") || concat.startsWith("LOOP AT GROUP ")) {
59370
59666
  return undefined;
59371
59667
  }
59372
59668
  const isReference = concat.includes(" REFERENCE INTO ");
59373
59669
  const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
59374
- const dataTarget = (_c = (_b = node.findDirectExpression(Expressions.LoopTarget)) === null || _b === void 0 ? void 0 : _b.findDirectExpression(Expressions.Target)) === null || _c === void 0 ? void 0 : _c.findDirectExpression(Expressions.InlineData);
59670
+ const dataTarget = (_b = (_a = node.findDirectExpression(Expressions.LoopTarget)) === null || _a === void 0 ? void 0 : _a.findDirectExpression(Expressions.Target)) === null || _b === void 0 ? void 0 : _b.findDirectExpression(Expressions.InlineData);
59375
59671
  if (dataTarget) {
59376
- const targetName = ((_d = dataTarget.findDirectExpression(Expressions.TargetField)) === null || _d === void 0 ? void 0 : _d.concatTokens()) || "DOWNPORT_ERROR";
59672
+ const targetName = ((_c = dataTarget.findDirectExpression(Expressions.TargetField)) === null || _c === void 0 ? void 0 : _c.concatTokens()) || "DOWNPORT_ERROR";
59377
59673
  let code = `DATA ${targetName} LIKE LINE OF ${sourceName}.\n${indentation}`;
59378
59674
  if (isReference) {
59379
59675
  const likeName = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
@@ -59384,10 +59680,15 @@ ${indentation} output = ${uniqueName}.\n`;
59384
59680
  const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
59385
59681
  return issue_1.Issue.atToken(lowFile, node.getFirstToken(), "Outline LOOP data target", this.getMetadata().key, this.conf.severity, fix);
59386
59682
  }
59387
- const fsTarget = (_f = (_e = node.findDirectExpression(Expressions.LoopTarget)) === null || _e === void 0 ? void 0 : _e.findDirectExpression(Expressions.FSTarget)) === null || _f === void 0 ? void 0 : _f.findDirectExpression(Expressions.InlineFS);
59683
+ const fsTarget = (_e = (_d = node.findDirectExpression(Expressions.LoopTarget)) === null || _d === void 0 ? void 0 : _d.findDirectExpression(Expressions.FSTarget)) === null || _e === void 0 ? void 0 : _e.findDirectExpression(Expressions.InlineFS);
59388
59684
  if (fsTarget) {
59389
- const targetName = ((_g = fsTarget.findDirectExpression(Expressions.TargetFieldSymbol)) === null || _g === void 0 ? void 0 : _g.concatTokens()) || "DOWNPORT_ERROR";
59390
- const code = `FIELD-SYMBOLS ${targetName} LIKE LINE OF ${sourceName}.\n${indentation}`;
59685
+ const targetName = ((_f = fsTarget.findDirectExpression(Expressions.TargetFieldSymbol)) === null || _f === void 0 ? void 0 : _f.concatTokens()) || "DOWNPORT_ERROR";
59686
+ let type = `LIKE LINE OF ${sourceName}`;
59687
+ const f = foundType === null || foundType === void 0 ? void 0 : foundType.getType();
59688
+ if (f instanceof basic_1.TableType && f.getRowType() instanceof basic_1.AnyType) {
59689
+ type = "TYPE ANY";
59690
+ }
59691
+ const code = `FIELD-SYMBOLS ${targetName} ${type}.\n${indentation}`;
59391
59692
  const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, node.getFirstToken().getStart(), code);
59392
59693
  const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, fsTarget.getFirstToken().getStart(), fsTarget.getLastToken().getEnd(), targetName);
59393
59694
  const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
@@ -61923,7 +62224,7 @@ DATA lt_bar TYPE STANDARD TABLE OF ty.`,
61923
62224
  runParsed(file) {
61924
62225
  const issues = [];
61925
62226
  for (const statement of file.getStatements()) {
61926
- if (!(statement.get() instanceof Statements.Data)) {
62227
+ if (!(statement.get() instanceof Statements.Data || statement.get() instanceof Statements.Type)) {
61927
62228
  continue;
61928
62229
  }
61929
62230
  const tt = statement.findFirstExpression(Expressions.TypeTable);
@@ -64874,7 +65175,7 @@ class LocalTestclassConsistency extends _abap_rule_1.ABAPRule {
64874
65175
  this.conf = conf;
64875
65176
  }
64876
65177
  runParsed(file, obj) {
64877
- var _a;
65178
+ var _a, _b, _c;
64878
65179
  const issues = [];
64879
65180
  if (this.reg.getConfig().getVersion() === version_1.Version.v700) {
64880
65181
  // 700 does not have testclass includes
@@ -64900,6 +65201,16 @@ class LocalTestclassConsistency extends _abap_rule_1.ABAPRule {
64900
65201
  issues.push(issue);
64901
65202
  }
64902
65203
  }
65204
+ if (file.getFilename() === ((_b = obj.getMainABAPFile()) === null || _b === void 0 ? void 0 : _b.getFilename())
65205
+ && obj.getTestclassFile() === undefined
65206
+ && ((_c = obj.getXML()) === null || _c === void 0 ? void 0 : _c.includes("<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>")) === true) {
65207
+ const id = obj.getIdentifier();
65208
+ if (id) {
65209
+ const message = "Has <WITH_UNIT_TESTS> set in XML, but no testclasses";
65210
+ const issue = issue_1.Issue.atIdentifier(id, message, this.getMetadata().key, this.conf.severity);
65211
+ issues.push(issue);
65212
+ }
65213
+ }
64903
65214
  return issues;
64904
65215
  }
64905
65216
  }
@@ -75981,6 +76292,26 @@ class VirtualPosition extends position_1.Position {
75981
76292
  const casted = p;
75982
76293
  return super.equals(this) && this.vrow === casted.vrow && this.vcol === casted.vcol;
75983
76294
  }
76295
+ isAfter(p) {
76296
+ if (p instanceof VirtualPosition) {
76297
+ if (this.getRow() > p.getRow()) {
76298
+ return true;
76299
+ }
76300
+ if (this.getRow() === p.getRow() && this.getCol() > p.getCol()) {
76301
+ return true;
76302
+ }
76303
+ if (this.getRow() === p.getRow() && this.getCol() === p.getCol() && this.vrow > p.vrow) {
76304
+ return true;
76305
+ }
76306
+ if (this.getRow() === p.getRow() && this.getCol() === p.getCol() && this.vrow === p.vrow && this.vcol > p.vcol) {
76307
+ return true;
76308
+ }
76309
+ return false;
76310
+ }
76311
+ else {
76312
+ return super.isAfter(p);
76313
+ }
76314
+ }
75984
76315
  }
75985
76316
  exports.VirtualPosition = VirtualPosition;
75986
76317
  //# sourceMappingURL=virtual_position.js.map
@@ -82120,7 +82451,7 @@ class DeleteInternalTranspiler {
82120
82451
  if (node.findDirectTokenByText("ADJACENT")) {
82121
82452
  extra.push("adjacent: true");
82122
82453
  if (node.findDirectTokenByText("COMPARING") && !concat.includes("COMPARING ALL FIELDS")) {
82123
- const comparing = node.findAllExpressions(abaplint.Expressions.FieldSub);
82454
+ const comparing = node.findAllExpressions(abaplint.Expressions.SimpleFieldChain2);
82124
82455
  if (comparing) {
82125
82456
  const compareFields = comparing.map(i => "'" + i.getFirstToken().getStr() + "'").join(",");
82126
82457
  extra.push("comparing: [" + compareFields + "]");
@@ -90297,6 +90628,7 @@ function readDocType(xmlData, i){
90297
90628
  if (xmlData[i] === '<' && !comment) { //Determine the tag type
90298
90629
  if( hasBody && isEntity(xmlData, i)){
90299
90630
  i += 7;
90631
+ let entityName, val;
90300
90632
  [entityName, val,i] = readEntityExp(xmlData,i+1);
90301
90633
  if(val.indexOf("&") === -1) //Parameter entities are not supported
90302
90634
  entities[ validateEntityName(entityName) ] = {
@@ -93386,10 +93718,10 @@ if (typeof Object.create === 'function') {
93386
93718
  module.exports = minimatch
93387
93719
  minimatch.Minimatch = Minimatch
93388
93720
 
93389
- var path = { sep: '/' }
93390
- try {
93391
- path = __webpack_require__(/*! path */ "path")
93392
- } catch (er) {}
93721
+ var path = (function () { try { return __webpack_require__(/*! path */ "path") } catch (e) {}}()) || {
93722
+ sep: '/'
93723
+ }
93724
+ minimatch.sep = path.sep
93393
93725
 
93394
93726
  var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
93395
93727
  var expand = __webpack_require__(/*! brace-expansion */ "./node_modules/brace-expansion/index.js")
@@ -93441,43 +93773,64 @@ function filter (pattern, options) {
93441
93773
  }
93442
93774
 
93443
93775
  function ext (a, b) {
93444
- a = a || {}
93445
93776
  b = b || {}
93446
93777
  var t = {}
93447
- Object.keys(b).forEach(function (k) {
93448
- t[k] = b[k]
93449
- })
93450
93778
  Object.keys(a).forEach(function (k) {
93451
93779
  t[k] = a[k]
93452
93780
  })
93781
+ Object.keys(b).forEach(function (k) {
93782
+ t[k] = b[k]
93783
+ })
93453
93784
  return t
93454
93785
  }
93455
93786
 
93456
93787
  minimatch.defaults = function (def) {
93457
- if (!def || !Object.keys(def).length) return minimatch
93788
+ if (!def || typeof def !== 'object' || !Object.keys(def).length) {
93789
+ return minimatch
93790
+ }
93458
93791
 
93459
93792
  var orig = minimatch
93460
93793
 
93461
93794
  var m = function minimatch (p, pattern, options) {
93462
- return orig.minimatch(p, pattern, ext(def, options))
93795
+ return orig(p, pattern, ext(def, options))
93463
93796
  }
93464
93797
 
93465
93798
  m.Minimatch = function Minimatch (pattern, options) {
93466
93799
  return new orig.Minimatch(pattern, ext(def, options))
93467
93800
  }
93801
+ m.Minimatch.defaults = function defaults (options) {
93802
+ return orig.defaults(ext(def, options)).Minimatch
93803
+ }
93804
+
93805
+ m.filter = function filter (pattern, options) {
93806
+ return orig.filter(pattern, ext(def, options))
93807
+ }
93808
+
93809
+ m.defaults = function defaults (options) {
93810
+ return orig.defaults(ext(def, options))
93811
+ }
93812
+
93813
+ m.makeRe = function makeRe (pattern, options) {
93814
+ return orig.makeRe(pattern, ext(def, options))
93815
+ }
93816
+
93817
+ m.braceExpand = function braceExpand (pattern, options) {
93818
+ return orig.braceExpand(pattern, ext(def, options))
93819
+ }
93820
+
93821
+ m.match = function (list, pattern, options) {
93822
+ return orig.match(list, pattern, ext(def, options))
93823
+ }
93468
93824
 
93469
93825
  return m
93470
93826
  }
93471
93827
 
93472
93828
  Minimatch.defaults = function (def) {
93473
- if (!def || !Object.keys(def).length) return Minimatch
93474
93829
  return minimatch.defaults(def).Minimatch
93475
93830
  }
93476
93831
 
93477
93832
  function minimatch (p, pattern, options) {
93478
- if (typeof pattern !== 'string') {
93479
- throw new TypeError('glob pattern string required')
93480
- }
93833
+ assertValidPattern(pattern)
93481
93834
 
93482
93835
  if (!options) options = {}
93483
93836
 
@@ -93486,9 +93839,6 @@ function minimatch (p, pattern, options) {
93486
93839
  return false
93487
93840
  }
93488
93841
 
93489
- // "" only matches ""
93490
- if (pattern.trim() === '') return p === ''
93491
-
93492
93842
  return new Minimatch(pattern, options).match(p)
93493
93843
  }
93494
93844
 
@@ -93497,15 +93847,14 @@ function Minimatch (pattern, options) {
93497
93847
  return new Minimatch(pattern, options)
93498
93848
  }
93499
93849
 
93500
- if (typeof pattern !== 'string') {
93501
- throw new TypeError('glob pattern string required')
93502
- }
93850
+ assertValidPattern(pattern)
93503
93851
 
93504
93852
  if (!options) options = {}
93853
+
93505
93854
  pattern = pattern.trim()
93506
93855
 
93507
93856
  // windows support: need to use /, not \
93508
- if (path.sep !== '/') {
93857
+ if (!options.allowWindowsEscape && path.sep !== '/') {
93509
93858
  pattern = pattern.split(path.sep).join('/')
93510
93859
  }
93511
93860
 
@@ -93516,6 +93865,7 @@ function Minimatch (pattern, options) {
93516
93865
  this.negate = false
93517
93866
  this.comment = false
93518
93867
  this.empty = false
93868
+ this.partial = !!options.partial
93519
93869
 
93520
93870
  // make the set of regexps etc.
93521
93871
  this.make()
@@ -93525,9 +93875,6 @@ Minimatch.prototype.debug = function () {}
93525
93875
 
93526
93876
  Minimatch.prototype.make = make
93527
93877
  function make () {
93528
- // don't do it more than once.
93529
- if (this._made) return
93530
-
93531
93878
  var pattern = this.pattern
93532
93879
  var options = this.options
93533
93880
 
@@ -93547,7 +93894,7 @@ function make () {
93547
93894
  // step 2: expand braces
93548
93895
  var set = this.globSet = this.braceExpand()
93549
93896
 
93550
- if (options.debug) this.debug = console.error
93897
+ if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
93551
93898
 
93552
93899
  this.debug(this.pattern, set)
93553
93900
 
@@ -93627,12 +93974,11 @@ function braceExpand (pattern, options) {
93627
93974
  pattern = typeof pattern === 'undefined'
93628
93975
  ? this.pattern : pattern
93629
93976
 
93630
- if (typeof pattern === 'undefined') {
93631
- throw new TypeError('undefined pattern')
93632
- }
93977
+ assertValidPattern(pattern)
93633
93978
 
93634
- if (options.nobrace ||
93635
- !pattern.match(/\{.*\}/)) {
93979
+ // Thanks to Yeting Li <https://github.com/yetingli> for
93980
+ // improving this regexp to avoid a ReDOS vulnerability.
93981
+ if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
93636
93982
  // shortcut. no need to expand.
93637
93983
  return [pattern]
93638
93984
  }
@@ -93640,6 +93986,17 @@ function braceExpand (pattern, options) {
93640
93986
  return expand(pattern)
93641
93987
  }
93642
93988
 
93989
+ var MAX_PATTERN_LENGTH = 1024 * 64
93990
+ var assertValidPattern = function (pattern) {
93991
+ if (typeof pattern !== 'string') {
93992
+ throw new TypeError('invalid pattern')
93993
+ }
93994
+
93995
+ if (pattern.length > MAX_PATTERN_LENGTH) {
93996
+ throw new TypeError('pattern is too long')
93997
+ }
93998
+ }
93999
+
93643
94000
  // parse a component of the expanded set.
93644
94001
  // At this point, no pattern may contain "/" in it
93645
94002
  // so we're going to return a 2d array, where each entry is the full
@@ -93654,14 +94011,17 @@ function braceExpand (pattern, options) {
93654
94011
  Minimatch.prototype.parse = parse
93655
94012
  var SUBPARSE = {}
93656
94013
  function parse (pattern, isSub) {
93657
- if (pattern.length > 1024 * 64) {
93658
- throw new TypeError('pattern is too long')
93659
- }
94014
+ assertValidPattern(pattern)
93660
94015
 
93661
94016
  var options = this.options
93662
94017
 
93663
94018
  // shortcuts
93664
- if (!options.noglobstar && pattern === '**') return GLOBSTAR
94019
+ if (pattern === '**') {
94020
+ if (!options.noglobstar)
94021
+ return GLOBSTAR
94022
+ else
94023
+ pattern = '*'
94024
+ }
93665
94025
  if (pattern === '') return ''
93666
94026
 
93667
94027
  var re = ''
@@ -93717,10 +94077,12 @@ function parse (pattern, isSub) {
93717
94077
  }
93718
94078
 
93719
94079
  switch (c) {
93720
- case '/':
94080
+ /* istanbul ignore next */
94081
+ case '/': {
93721
94082
  // completely not allowed, even escaped.
93722
94083
  // Should already be path-split by now.
93723
94084
  return false
94085
+ }
93724
94086
 
93725
94087
  case '\\':
93726
94088
  clearStateChar()
@@ -93839,25 +94201,23 @@ function parse (pattern, isSub) {
93839
94201
 
93840
94202
  // handle the case where we left a class open.
93841
94203
  // "[z-a]" is valid, equivalent to "\[z-a\]"
93842
- if (inClass) {
93843
- // split where the last [ was, make sure we don't have
93844
- // an invalid re. if so, re-walk the contents of the
93845
- // would-be class to re-translate any characters that
93846
- // were passed through as-is
93847
- // TODO: It would probably be faster to determine this
93848
- // without a try/catch and a new RegExp, but it's tricky
93849
- // to do safely. For now, this is safe and works.
93850
- var cs = pattern.substring(classStart + 1, i)
93851
- try {
93852
- RegExp('[' + cs + ']')
93853
- } catch (er) {
93854
- // not a valid class!
93855
- var sp = this.parse(cs, SUBPARSE)
93856
- re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
93857
- hasMagic = hasMagic || sp[1]
93858
- inClass = false
93859
- continue
93860
- }
94204
+ // split where the last [ was, make sure we don't have
94205
+ // an invalid re. if so, re-walk the contents of the
94206
+ // would-be class to re-translate any characters that
94207
+ // were passed through as-is
94208
+ // TODO: It would probably be faster to determine this
94209
+ // without a try/catch and a new RegExp, but it's tricky
94210
+ // to do safely. For now, this is safe and works.
94211
+ var cs = pattern.substring(classStart + 1, i)
94212
+ try {
94213
+ RegExp('[' + cs + ']')
94214
+ } catch (er) {
94215
+ // not a valid class!
94216
+ var sp = this.parse(cs, SUBPARSE)
94217
+ re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
94218
+ hasMagic = hasMagic || sp[1]
94219
+ inClass = false
94220
+ continue
93861
94221
  }
93862
94222
 
93863
94223
  // finish up the class.
@@ -93941,9 +94301,7 @@ function parse (pattern, isSub) {
93941
94301
  // something that could conceivably capture a dot
93942
94302
  var addPatternStart = false
93943
94303
  switch (re.charAt(0)) {
93944
- case '.':
93945
- case '[':
93946
- case '(': addPatternStart = true
94304
+ case '[': case '.': case '(': addPatternStart = true
93947
94305
  }
93948
94306
 
93949
94307
  // Hack to work around lack of negative lookbehind in JS
@@ -94005,7 +94363,7 @@ function parse (pattern, isSub) {
94005
94363
  var flags = options.nocase ? 'i' : ''
94006
94364
  try {
94007
94365
  var regExp = new RegExp('^' + re + '$', flags)
94008
- } catch (er) {
94366
+ } catch (er) /* istanbul ignore next - should be impossible */ {
94009
94367
  // If it was an invalid regular expression, then it can't match
94010
94368
  // anything. This trick looks for a character after the end of
94011
94369
  // the string, which is of course impossible, except in multi-line
@@ -94063,7 +94421,7 @@ function makeRe () {
94063
94421
 
94064
94422
  try {
94065
94423
  this.regexp = new RegExp(re, flags)
94066
- } catch (ex) {
94424
+ } catch (ex) /* istanbul ignore next - should be impossible */ {
94067
94425
  this.regexp = false
94068
94426
  }
94069
94427
  return this.regexp
@@ -94081,8 +94439,8 @@ minimatch.match = function (list, pattern, options) {
94081
94439
  return list
94082
94440
  }
94083
94441
 
94084
- Minimatch.prototype.match = match
94085
- function match (f, partial) {
94442
+ Minimatch.prototype.match = function match (f, partial) {
94443
+ if (typeof partial === 'undefined') partial = this.partial
94086
94444
  this.debug('match', f, this.pattern)
94087
94445
  // short-circuit in the case of busted things.
94088
94446
  // comments, etc.
@@ -94164,6 +94522,7 @@ Minimatch.prototype.matchOne = function (file, pattern, partial) {
94164
94522
 
94165
94523
  // should be impossible.
94166
94524
  // some invalid regexp stuff in the set.
94525
+ /* istanbul ignore if */
94167
94526
  if (p === false) return false
94168
94527
 
94169
94528
  if (p === GLOBSTAR) {
@@ -94237,6 +94596,7 @@ Minimatch.prototype.matchOne = function (file, pattern, partial) {
94237
94596
  // no match was found.
94238
94597
  // However, in partial mode, we can't say this is necessarily over.
94239
94598
  // If there's more *pattern* left, then
94599
+ /* istanbul ignore if */
94240
94600
  if (partial) {
94241
94601
  // ran out of file
94242
94602
  this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
@@ -94250,11 +94610,7 @@ Minimatch.prototype.matchOne = function (file, pattern, partial) {
94250
94610
  // patterns with magic have been turned into regexps.
94251
94611
  var hit
94252
94612
  if (typeof p === 'string') {
94253
- if (options.nocase) {
94254
- hit = f.toLowerCase() === p.toLowerCase()
94255
- } else {
94256
- hit = f === p
94257
- }
94613
+ hit = f === p
94258
94614
  this.debug('string match', p, f, hit)
94259
94615
  } else {
94260
94616
  hit = f.match(p)
@@ -94285,16 +94641,16 @@ Minimatch.prototype.matchOne = function (file, pattern, partial) {
94285
94641
  // this is ok if we're doing the match as part of
94286
94642
  // a glob fs traversal.
94287
94643
  return partial
94288
- } else if (pi === pl) {
94644
+ } else /* istanbul ignore else */ if (pi === pl) {
94289
94645
  // ran out of pattern, still have file left.
94290
94646
  // this is only acceptable if we're on the very last
94291
94647
  // empty segment of a file with a trailing slash.
94292
94648
  // a/* should match a/b/
94293
- var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')
94294
- return emptyFileEnd
94649
+ return (fi === fl - 1) && (file[fi] === '')
94295
94650
  }
94296
94651
 
94297
94652
  // should be unreachable.
94653
+ /* istanbul ignore next */
94298
94654
  throw new Error('wtf?')
94299
94655
  }
94300
94656