@abaplint/transpiler-cli 2.10.23 → 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
  {
@@ -30874,12 +31032,11 @@ class Loop {
30874
31032
  const message = "No source type determined";
30875
31033
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30876
31034
  }
30877
- return;
30878
31035
  }
30879
31036
  else if (sourceType instanceof basic_1.UnknownType) {
30880
31037
  const message = "Loop, not a table type, " + sourceType.getError();
30881
31038
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30882
- return;
31039
+ sourceType = new basic_1.VoidType("Loop, not a table type");
30883
31040
  }
30884
31041
  else if (sourceType instanceof basic_1.TableType
30885
31042
  && target === undefined
@@ -30887,7 +31044,6 @@ class Loop {
30887
31044
  && node.getChildren().length === 4) {
30888
31045
  const message = "Loop, no header line";
30889
31046
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30890
- return;
30891
31047
  }
30892
31048
  else if (!(sourceType instanceof basic_1.TableType)
30893
31049
  && !(sourceType instanceof basic_1.AnyType)
@@ -30896,14 +31052,12 @@ class Loop {
30896
31052
  && concat.startsWith("LOOP AT GROUP ") === false) {
30897
31053
  const message = "Loop, not a table type";
30898
31054
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30899
- return;
30900
31055
  }
30901
31056
  else if (loopTarget === undefined
30902
31057
  && sourceType instanceof basic_1.TableType
30903
31058
  && sourceType.isWithHeader() === false) {
30904
31059
  const message = "Loop, no header";
30905
31060
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30906
- return;
30907
31061
  }
30908
31062
  const targetConcat = loopTarget === null || loopTarget === void 0 ? void 0 : loopTarget.concatTokens().toUpperCase();
30909
31063
  if (sourceType instanceof basic_1.TableType) {
@@ -32111,6 +32265,7 @@ const Expressions = __webpack_require__(/*! ../../2_statements/expressions */ ".
32111
32265
  const select_1 = __webpack_require__(/*! ../expressions/select */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/select.js");
32112
32266
  class Select {
32113
32267
  runSyntax(node, input) {
32268
+ // for UNION statements there are multiple select parts
32114
32269
  const selects = node.findDirectExpressions(Expressions.Select);
32115
32270
  for (let i = 0; i < selects.length; i++) {
32116
32271
  const last = i === selects.length - 1;
@@ -34694,6 +34849,7 @@ exports.DECLARATION_STUFF = [
34694
34849
  Statements.Parameter,
34695
34850
  Statements.SelectionScreen,
34696
34851
  Statements.ConstantBegin,
34852
+ Statements.Define,
34697
34853
  ];
34698
34854
  //# sourceMappingURL=selection_events.js.map
34699
34855
 
@@ -39150,6 +39306,13 @@ class CDSDetermineTypes {
39150
39306
  continue;
39151
39307
  }
39152
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
+ }
39153
39316
  components.push({
39154
39317
  name: f.name,
39155
39318
  type: new basic_1.UnknownType("CDS parser error, unknown source, " + ddlsName),
@@ -39413,6 +39576,9 @@ class CDSParser {
39413
39576
  if (res === undefined || !(res[0] instanceof nodes_1.ExpressionNode)) {
39414
39577
  res = combi_1.Combi.run(new Expressions.CDSDefineCustom(), tokens, version_1.defaultVersion);
39415
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
+ }
39416
39582
  if (res === undefined || !(res[0] instanceof nodes_1.ExpressionNode)) {
39417
39583
  res = combi_1.Combi.run(new Expressions.CDSExtendView(), tokens, version_1.defaultVersion);
39418
39584
  }
@@ -39488,7 +39654,8 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
39488
39654
  const cds_annotation_array_1 = __webpack_require__(/*! ./cds_annotation_array */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_annotation_array.js");
39489
39655
  class CDSAnnotation extends combi_1.Expression {
39490
39656
  getRunnable() {
39491
- 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)));
39492
39659
  }
39493
39660
  }
39494
39661
  exports.CDSAnnotation = CDSAnnotation;
@@ -39585,14 +39752,14 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
39585
39752
  const cds_integer_1 = __webpack_require__(/*! ./cds_integer */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_integer.js");
39586
39753
  class CDSArithmetics extends combi_1.Expression {
39587
39754
  getRunnable() {
39588
- const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.opt)((0, combi_1.seq)(".", _1.CDSName)));
39589
- 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);
39590
39757
  const operator = (0, combi_1.altPrio)("+", "-", "*", "/");
39591
39758
  const operatorValue = (0, combi_1.seq)(operator, val);
39592
- const paren = (0, combi_1.seq)("(", val, (0, combi_1.plus)(operatorValue), ")");
39593
- 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));
39594
39761
  // todo: this is pretty bad, it needs a rewrite
39595
- 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);
39596
39763
  }
39597
39764
  }
39598
39765
  exports.CDSArithmetics = CDSArithmetics;
@@ -39658,7 +39825,7 @@ exports.CDSCardinality = void 0;
39658
39825
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
39659
39826
  class CDSCardinality extends combi_1.Expression {
39660
39827
  getRunnable() {
39661
- 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", "*"))), "]");
39662
39829
  return cardinality;
39663
39830
  }
39664
39831
  }
@@ -39682,10 +39849,11 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
39682
39849
  class CDSCase extends combi_1.Expression {
39683
39850
  getRunnable() {
39684
39851
  const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.optPrio)((0, combi_1.seq)(".", _1.CDSName)));
39685
- const value = (0, combi_1.alt)(name, _1.CDSString, _1.CDSFunction, CDSCase, _1.CDSCast, _1.CDSArithmetics);
39686
- const simple = (0, combi_1.seq)("CASE", (0, combi_1.alt)(name, _1.CDSFunction), (0, combi_1.plusPrio)((0, combi_1.seq)("WHEN", value, "THEN", value)), "ELSE", value, "END");
39687
- const complex = (0, combi_1.seq)("CASE", (0, combi_1.plusPrio)((0, combi_1.seq)("WHEN", _1.CDSCondition, "THEN", value)), (0, combi_1.opt)((0, combi_1.seq)("ELSE", value)), "END");
39688
- 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");
39689
39857
  }
39690
39858
  }
39691
39859
  exports.CDSCase = CDSCase;
@@ -39707,8 +39875,8 @@ const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src
39707
39875
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
39708
39876
  class CDSCast extends combi_1.Expression {
39709
39877
  getRunnable() {
39710
- const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.opt)((0, combi_1.seq)(".", _1.CDSName)));
39711
- 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")), ")");
39712
39880
  }
39713
39881
  }
39714
39882
  exports.CDSCast = CDSCast;
@@ -39754,13 +39922,15 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
39754
39922
  const cds_integer_1 = __webpack_require__(/*! ./cds_integer */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_integer.js");
39755
39923
  class CDSCondition extends combi_1.Expression {
39756
39924
  getRunnable() {
39757
- const name = (0, combi_1.seq)(_1.CDSName, (0, combi_1.optPrio)((0, combi_1.seq)(".", (0, combi_1.alt)(_1.CDSName, _1.CDSString))));
39758
- const left = (0, combi_1.alt)(name, _1.CDSFunction, _1.CDSString);
39759
- 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));
39760
- const is = (0, combi_1.seq)(left, "IS", (0, combi_1.optPrio)("NOT"), (0, combi_1.altPrio)("INITIAL", "NULL"));
39761
- 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));
39762
39932
  const paren = (0, combi_1.seq)("(", CDSCondition, ")");
39763
- 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))));
39764
39934
  }
39765
39935
  }
39766
39936
  exports.CDSCondition = CDSCondition;
@@ -39840,6 +40010,30 @@ exports.CDSDefineProjection = CDSDefineProjection;
39840
40010
 
39841
40011
  /***/ }),
39842
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
+
39843
40037
  /***/ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_view.js":
39844
40038
  /*!**********************************************************************************!*\
39845
40039
  !*** ./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_view.js ***!
@@ -39882,7 +40076,7 @@ const cds_as_1 = __webpack_require__(/*! ./cds_as */ "./node_modules/@abaplint/c
39882
40076
  const cds_cast_1 = __webpack_require__(/*! ./cds_cast */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_cast.js");
39883
40077
  class CDSElement extends combi_1.Expression {
39884
40078
  getRunnable() {
39885
- 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));
39886
40080
  }
39887
40081
  }
39888
40082
  exports.CDSElement = CDSElement;
@@ -39958,6 +40152,13 @@ class CDSFunction extends combi_1.Expression {
39958
40152
  const abap_system_timezone = (0, combi_1.seq)("ABAP_SYSTEM_TIMEZONE", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
39959
40153
  const abap_user_timezone = (0, combi_1.seq)("ABAP_USER_TIMEZONE", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
39960
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, ")");
39961
40162
  const left = (0, combi_1.seq)("LEFT", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
39962
40163
  const right = (0, combi_1.seq)("RIGHT", "(", _1.CDSFunctionInput, ",", _1.CDSFunctionInput, ")");
39963
40164
  const conversionInput = (0, combi_1.seq)(_1.CDSName, "=", ">", _1.CDSFunctionInput);
@@ -39965,7 +40166,7 @@ class CDSFunction extends combi_1.Expression {
39965
40166
  const unitConversion = (0, combi_1.seq)("UNIT_CONVERSION", "(", conversionInputs, ")");
39966
40167
  const currencyConversion = (0, combi_1.seq)("CURRENCY_CONVERSION", "(", conversionInputs, ")");
39967
40168
  const decimalShift = (0, combi_1.seq)("DECIMAL_SHIFT", "(", conversionInputs, ")");
39968
- 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);
39969
40170
  }
39970
40171
  }
39971
40172
  exports.CDSFunction = CDSFunction;
@@ -39988,7 +40189,7 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
39988
40189
  class CDSFunctionInput extends combi_1.Expression {
39989
40190
  getRunnable() {
39990
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))));
39991
- 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);
39992
40193
  return input;
39993
40194
  }
39994
40195
  }
@@ -40055,7 +40256,7 @@ exports.CDSInteger = void 0;
40055
40256
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
40056
40257
  class CDSInteger extends combi_1.Expression {
40057
40258
  getRunnable() {
40058
- return (0, combi_1.regex)(/^\d+$/);
40259
+ return (0, combi_1.seq)((0, combi_1.opt)("-"), (0, combi_1.regex)(/^\d+$/));
40059
40260
  }
40060
40261
  }
40061
40262
  exports.CDSInteger = CDSInteger;
@@ -40078,7 +40279,9 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
40078
40279
  const cds_condition_1 = __webpack_require__(/*! ./cds_condition */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_condition.js");
40079
40280
  class CDSJoin extends combi_1.Expression {
40080
40281
  getRunnable() {
40081
- 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);
40082
40285
  }
40083
40286
  }
40084
40287
  exports.CDSJoin = CDSJoin;
@@ -40100,7 +40303,7 @@ const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node
40100
40303
  class CDSName extends combi_1.Expression {
40101
40304
  getRunnable() {
40102
40305
  const pre = (0, combi_1.seq)("/", (0, combi_1.regex)(/^[\w_]+$/), "/");
40103
- 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_]+$/));
40104
40307
  }
40105
40308
  }
40106
40309
  exports.CDSName = CDSName;
@@ -40242,8 +40445,9 @@ class CDSSelect extends combi_1.Expression {
40242
40445
  getRunnable() {
40243
40446
  const fields = (0, combi_1.seq)((0, combi_1.star)((0, combi_1.seq)(_1.CDSElement, ",")), _1.CDSElement);
40244
40447
  const distinct = (0, combi_1.str)("DISTINCT");
40245
- 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)("}"));
40246
- 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)));
40247
40451
  }
40248
40452
  }
40249
40453
  exports.CDSSelect = CDSSelect;
@@ -40265,7 +40469,7 @@ const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src
40265
40469
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
40266
40470
  class CDSSource extends combi_1.Expression {
40267
40471
  getRunnable() {
40268
- 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));
40269
40473
  }
40270
40474
  }
40271
40475
  exports.CDSSource = CDSSource;
@@ -40354,7 +40558,7 @@ const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src
40354
40558
  const combi_1 = __webpack_require__(/*! ../../abap/2_statements/combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
40355
40559
  class CDSWithParameters extends combi_1.Expression {
40356
40560
  getRunnable() {
40357
- 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);
40358
40562
  return (0, combi_1.seq)("WITH PARAMETERS", param, (0, combi_1.star)((0, combi_1.seq)(",", param)));
40359
40563
  }
40360
40564
  }
@@ -40403,11 +40607,12 @@ __exportStar(__webpack_require__(/*! ./cds_condition */ "./node_modules/@abaplin
40403
40607
  __exportStar(__webpack_require__(/*! ./cds_define_abstract */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_abstract.js"), exports);
40404
40608
  __exportStar(__webpack_require__(/*! ./cds_define_custom */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_custom.js"), exports);
40405
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);
40406
40611
  __exportStar(__webpack_require__(/*! ./cds_define_view */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_define_view.js"), exports);
40407
40612
  __exportStar(__webpack_require__(/*! ./cds_element */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_element.js"), exports);
40408
40613
  __exportStar(__webpack_require__(/*! ./cds_extend_view */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_extend_view.js"), exports);
40409
- __exportStar(__webpack_require__(/*! ./cds_function */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_function.js"), exports);
40410
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);
40411
40616
  __exportStar(__webpack_require__(/*! ./cds_group_by */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_group_by.js"), exports);
40412
40617
  __exportStar(__webpack_require__(/*! ./cds_having */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_having.js"), exports);
40413
40618
  __exportStar(__webpack_require__(/*! ./cds_integer */ "./node_modules/@abaplint/core/build/src/cds/expressions/cds_integer.js"), exports);
@@ -43005,17 +43210,48 @@ const syntax_1 = __webpack_require__(/*! ../abap/5_syntax/syntax */ "./node_modu
43005
43210
  const _abap_object_1 = __webpack_require__(/*! ../objects/_abap_object */ "./node_modules/@abaplint/core/build/src/objects/_abap_object.js");
43006
43211
  const dump_scope_1 = __webpack_require__(/*! ./dump_scope */ "./node_modules/@abaplint/core/build/src/lsp/dump_scope.js");
43007
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");
43008
43215
  class Help {
43009
43216
  static find(reg, textDocument, position) {
43010
- 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);
43011
43222
  if (file === undefined) {
43012
- return "file not found";
43223
+ return "File not found: " + textDocument.uri;
43013
43224
  }
43014
- else {
43015
- 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);
43016
43228
  }
43229
+ return "Unhandled object type: " + obj.getType();
43017
43230
  }
43018
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
+ }
43019
43255
  static dumpABAP(file, reg, textDocument, position) {
43020
43256
  let content = "";
43021
43257
  content = `
@@ -44402,7 +44638,10 @@ class ABAPObject extends _abstract_object_1.AbstractObject {
44402
44638
  }
44403
44639
  // uri fallback,
44404
44640
  for (const file of this.getABAPFiles()) {
44405
- if (file.getFilename().endsWith(".abap")) {
44641
+ if (file.getFilename().includes(".prog.screen_")) {
44642
+ continue;
44643
+ }
44644
+ else if (file.getFilename().endsWith(".abap")) {
44406
44645
  return file;
44407
44646
  }
44408
44647
  }
@@ -47163,13 +47402,13 @@ class FunctionGroup extends _abap_object_1.ABAPObject {
47163
47402
  if (namespaced) {
47164
47403
  search = search.replace(/\//g, "#");
47165
47404
  }
47166
- if ((i.startsWith("L") || namespaced) && f.getFilename().includes(search.toLowerCase())) {
47405
+ if ((i.startsWith("L") || namespaced) && f.getFilename().includes(search.toLowerCase() + ".")) {
47167
47406
  ret.push({ file: f, name: i });
47168
47407
  }
47169
47408
  // fix for URL encoded? Uris
47170
47409
  if (namespaced) {
47171
47410
  search = i.replace(/\//g, "%23");
47172
- if (f.getFilename().includes(search.toLowerCase())) {
47411
+ if (f.getFilename().includes(search.toLowerCase() + ".")) {
47173
47412
  ret.push({ file: f, name: i });
47174
47413
  }
47175
47414
  }
@@ -51375,6 +51614,9 @@ class TableType extends _abstract_object_1.AbstractObject {
51375
51614
  return;
51376
51615
  }
51377
51616
  const values = parsed.abapGit["asx:abap"]["asx:values"];
51617
+ if (values === undefined) {
51618
+ return;
51619
+ }
51378
51620
  const dd40v = values.DD40V;
51379
51621
  this.parsedXML.rowtype = dd40v.ROWTYPE ? dd40v.ROWTYPE : "";
51380
51622
  this.parsedXML.rowkind = dd40v.ROWKIND ? dd40v.ROWKIND : "";
@@ -52184,6 +52426,7 @@ class Indent {
52184
52426
  || type instanceof Statements.EndModule
52185
52427
  || type instanceof Statements.EndSelect
52186
52428
  || type instanceof Statements.EndMethod
52429
+ || type instanceof Statements.EndChain
52187
52430
  || type instanceof Statements.EndAt
52188
52431
  || type instanceof Statements.Else
52189
52432
  || type instanceof Statements.EndExec
@@ -52292,6 +52535,7 @@ class Indent {
52292
52535
  || type instanceof Statements.Else
52293
52536
  || type instanceof Statements.ElseIf
52294
52537
  || type instanceof Statements.MethodImplementation
52538
+ || type instanceof Statements.Chain
52295
52539
  || type instanceof Statements.TestInjection
52296
52540
  || type instanceof Statements.TestSeam
52297
52541
  || (this.options.selectionScreenBlockIndentation === true
@@ -52497,7 +52741,7 @@ class Registry {
52497
52741
  }
52498
52742
  static abaplintVersion() {
52499
52743
  // magic, see build script "version.sh"
52500
- return "2.113.82";
52744
+ return "2.113.99";
52501
52745
  }
52502
52746
  getDDICReferences() {
52503
52747
  return this.ddicReferences;
@@ -54639,6 +54883,7 @@ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/c
54639
54883
  const version_1 = __webpack_require__(/*! ../version */ "./node_modules/@abaplint/core/build/src/version.js");
54640
54884
  const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js");
54641
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");
54642
54887
  class CDSLegacyViewConf extends _basic_rule_config_1.BasicRuleConfig {
54643
54888
  }
54644
54889
  exports.CDSLegacyViewConf = CDSLegacyViewConf;
@@ -54675,19 +54920,17 @@ v755 and up`,
54675
54920
  && this.reg.getConfig().getVersion() !== version_1.Version.Cloud) {
54676
54921
  return [];
54677
54922
  }
54678
- if (o.getType() !== "DDLS") {
54923
+ if (o.getType() !== "DDLS" || !(o instanceof objects_1.DataDefinition)) {
54679
54924
  return [];
54680
54925
  }
54681
- if (o instanceof objects_1.DataDefinition) {
54682
- const tree = o.getTree();
54683
- if (tree === undefined) {
54684
- return []; // parser error
54685
- }
54686
- if (tree.findDirectTokenByText("ENTITY") === undefined) {
54687
- const file = o.findSourceFile();
54688
- if (file) {
54689
- issues.push(issue_1.Issue.atRow(file, 1, "CDS Legacy View", this.getMetadata().key, this.getConfig().severity));
54690
- }
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));
54691
54934
  }
54692
54935
  }
54693
54936
  return issues;
@@ -54744,7 +54987,9 @@ class CDSParserError {
54744
54987
  const hasError = object.hasParserError();
54745
54988
  const file = object.findSourceFile();
54746
54989
  if (hasError === true && file) {
54747
- 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));
54748
54993
  }
54749
54994
  }
54750
54995
  return issues;
@@ -57984,6 +58229,10 @@ Make sure to test the downported code, it might not always be completely correct
57984
58229
  if (found) {
57985
58230
  return found;
57986
58231
  }
58232
+ found = this.downportSQLMoveInto(low, high, lowFile, highSyntax);
58233
+ if (found) {
58234
+ return found;
58235
+ }
57987
58236
  found = this.downportSQLExtras(low, high, lowFile, highSyntax);
57988
58237
  if (found) {
57989
58238
  return found;
@@ -58117,6 +58366,39 @@ Make sure to test the downported code, it might not always be completely correct
58117
58366
  return undefined;
58118
58367
  }
58119
58368
  //////////////////////////////////////////
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
+ }
58120
58402
  /** removes @'s and commas */
58121
58403
  downportSQLExtras(low, high, lowFile, highSyntax) {
58122
58404
  if (!(low.get() instanceof _statement_1.Unknown)) {
@@ -61942,7 +62224,7 @@ DATA lt_bar TYPE STANDARD TABLE OF ty.`,
61942
62224
  runParsed(file) {
61943
62225
  const issues = [];
61944
62226
  for (const statement of file.getStatements()) {
61945
- if (!(statement.get() instanceof Statements.Data)) {
62227
+ if (!(statement.get() instanceof Statements.Data || statement.get() instanceof Statements.Type)) {
61946
62228
  continue;
61947
62229
  }
61948
62230
  const tt = statement.findFirstExpression(Expressions.TypeTable);
@@ -64893,7 +65175,7 @@ class LocalTestclassConsistency extends _abap_rule_1.ABAPRule {
64893
65175
  this.conf = conf;
64894
65176
  }
64895
65177
  runParsed(file, obj) {
64896
- var _a;
65178
+ var _a, _b, _c;
64897
65179
  const issues = [];
64898
65180
  if (this.reg.getConfig().getVersion() === version_1.Version.v700) {
64899
65181
  // 700 does not have testclass includes
@@ -64919,6 +65201,16 @@ class LocalTestclassConsistency extends _abap_rule_1.ABAPRule {
64919
65201
  issues.push(issue);
64920
65202
  }
64921
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
+ }
64922
65214
  return issues;
64923
65215
  }
64924
65216
  }
@@ -76000,6 +76292,26 @@ class VirtualPosition extends position_1.Position {
76000
76292
  const casted = p;
76001
76293
  return super.equals(this) && this.vrow === casted.vrow && this.vcol === casted.vcol;
76002
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
+ }
76003
76315
  }
76004
76316
  exports.VirtualPosition = VirtualPosition;
76005
76317
  //# sourceMappingURL=virtual_position.js.map
@@ -82139,7 +82451,7 @@ class DeleteInternalTranspiler {
82139
82451
  if (node.findDirectTokenByText("ADJACENT")) {
82140
82452
  extra.push("adjacent: true");
82141
82453
  if (node.findDirectTokenByText("COMPARING") && !concat.includes("COMPARING ALL FIELDS")) {
82142
- const comparing = node.findAllExpressions(abaplint.Expressions.FieldSub);
82454
+ const comparing = node.findAllExpressions(abaplint.Expressions.SimpleFieldChain2);
82143
82455
  if (comparing) {
82144
82456
  const compareFields = comparing.map(i => "'" + i.getFirstToken().getStr() + "'").join(",");
82145
82457
  extra.push("comparing: [" + compareFields + "]");
@@ -93406,10 +93718,10 @@ if (typeof Object.create === 'function') {
93406
93718
  module.exports = minimatch
93407
93719
  minimatch.Minimatch = Minimatch
93408
93720
 
93409
- var path = { sep: '/' }
93410
- try {
93411
- path = __webpack_require__(/*! path */ "path")
93412
- } catch (er) {}
93721
+ var path = (function () { try { return __webpack_require__(/*! path */ "path") } catch (e) {}}()) || {
93722
+ sep: '/'
93723
+ }
93724
+ minimatch.sep = path.sep
93413
93725
 
93414
93726
  var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
93415
93727
  var expand = __webpack_require__(/*! brace-expansion */ "./node_modules/brace-expansion/index.js")
@@ -93461,43 +93773,64 @@ function filter (pattern, options) {
93461
93773
  }
93462
93774
 
93463
93775
  function ext (a, b) {
93464
- a = a || {}
93465
93776
  b = b || {}
93466
93777
  var t = {}
93467
- Object.keys(b).forEach(function (k) {
93468
- t[k] = b[k]
93469
- })
93470
93778
  Object.keys(a).forEach(function (k) {
93471
93779
  t[k] = a[k]
93472
93780
  })
93781
+ Object.keys(b).forEach(function (k) {
93782
+ t[k] = b[k]
93783
+ })
93473
93784
  return t
93474
93785
  }
93475
93786
 
93476
93787
  minimatch.defaults = function (def) {
93477
- if (!def || !Object.keys(def).length) return minimatch
93788
+ if (!def || typeof def !== 'object' || !Object.keys(def).length) {
93789
+ return minimatch
93790
+ }
93478
93791
 
93479
93792
  var orig = minimatch
93480
93793
 
93481
93794
  var m = function minimatch (p, pattern, options) {
93482
- return orig.minimatch(p, pattern, ext(def, options))
93795
+ return orig(p, pattern, ext(def, options))
93483
93796
  }
93484
93797
 
93485
93798
  m.Minimatch = function Minimatch (pattern, options) {
93486
93799
  return new orig.Minimatch(pattern, ext(def, options))
93487
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
+ }
93488
93824
 
93489
93825
  return m
93490
93826
  }
93491
93827
 
93492
93828
  Minimatch.defaults = function (def) {
93493
- if (!def || !Object.keys(def).length) return Minimatch
93494
93829
  return minimatch.defaults(def).Minimatch
93495
93830
  }
93496
93831
 
93497
93832
  function minimatch (p, pattern, options) {
93498
- if (typeof pattern !== 'string') {
93499
- throw new TypeError('glob pattern string required')
93500
- }
93833
+ assertValidPattern(pattern)
93501
93834
 
93502
93835
  if (!options) options = {}
93503
93836
 
@@ -93506,9 +93839,6 @@ function minimatch (p, pattern, options) {
93506
93839
  return false
93507
93840
  }
93508
93841
 
93509
- // "" only matches ""
93510
- if (pattern.trim() === '') return p === ''
93511
-
93512
93842
  return new Minimatch(pattern, options).match(p)
93513
93843
  }
93514
93844
 
@@ -93517,15 +93847,14 @@ function Minimatch (pattern, options) {
93517
93847
  return new Minimatch(pattern, options)
93518
93848
  }
93519
93849
 
93520
- if (typeof pattern !== 'string') {
93521
- throw new TypeError('glob pattern string required')
93522
- }
93850
+ assertValidPattern(pattern)
93523
93851
 
93524
93852
  if (!options) options = {}
93853
+
93525
93854
  pattern = pattern.trim()
93526
93855
 
93527
93856
  // windows support: need to use /, not \
93528
- if (path.sep !== '/') {
93857
+ if (!options.allowWindowsEscape && path.sep !== '/') {
93529
93858
  pattern = pattern.split(path.sep).join('/')
93530
93859
  }
93531
93860
 
@@ -93536,6 +93865,7 @@ function Minimatch (pattern, options) {
93536
93865
  this.negate = false
93537
93866
  this.comment = false
93538
93867
  this.empty = false
93868
+ this.partial = !!options.partial
93539
93869
 
93540
93870
  // make the set of regexps etc.
93541
93871
  this.make()
@@ -93545,9 +93875,6 @@ Minimatch.prototype.debug = function () {}
93545
93875
 
93546
93876
  Minimatch.prototype.make = make
93547
93877
  function make () {
93548
- // don't do it more than once.
93549
- if (this._made) return
93550
-
93551
93878
  var pattern = this.pattern
93552
93879
  var options = this.options
93553
93880
 
@@ -93567,7 +93894,7 @@ function make () {
93567
93894
  // step 2: expand braces
93568
93895
  var set = this.globSet = this.braceExpand()
93569
93896
 
93570
- if (options.debug) this.debug = console.error
93897
+ if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
93571
93898
 
93572
93899
  this.debug(this.pattern, set)
93573
93900
 
@@ -93647,12 +93974,11 @@ function braceExpand (pattern, options) {
93647
93974
  pattern = typeof pattern === 'undefined'
93648
93975
  ? this.pattern : pattern
93649
93976
 
93650
- if (typeof pattern === 'undefined') {
93651
- throw new TypeError('undefined pattern')
93652
- }
93977
+ assertValidPattern(pattern)
93653
93978
 
93654
- if (options.nobrace ||
93655
- !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)) {
93656
93982
  // shortcut. no need to expand.
93657
93983
  return [pattern]
93658
93984
  }
@@ -93660,6 +93986,17 @@ function braceExpand (pattern, options) {
93660
93986
  return expand(pattern)
93661
93987
  }
93662
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
+
93663
94000
  // parse a component of the expanded set.
93664
94001
  // At this point, no pattern may contain "/" in it
93665
94002
  // so we're going to return a 2d array, where each entry is the full
@@ -93674,14 +94011,17 @@ function braceExpand (pattern, options) {
93674
94011
  Minimatch.prototype.parse = parse
93675
94012
  var SUBPARSE = {}
93676
94013
  function parse (pattern, isSub) {
93677
- if (pattern.length > 1024 * 64) {
93678
- throw new TypeError('pattern is too long')
93679
- }
94014
+ assertValidPattern(pattern)
93680
94015
 
93681
94016
  var options = this.options
93682
94017
 
93683
94018
  // shortcuts
93684
- if (!options.noglobstar && pattern === '**') return GLOBSTAR
94019
+ if (pattern === '**') {
94020
+ if (!options.noglobstar)
94021
+ return GLOBSTAR
94022
+ else
94023
+ pattern = '*'
94024
+ }
93685
94025
  if (pattern === '') return ''
93686
94026
 
93687
94027
  var re = ''
@@ -93737,10 +94077,12 @@ function parse (pattern, isSub) {
93737
94077
  }
93738
94078
 
93739
94079
  switch (c) {
93740
- case '/':
94080
+ /* istanbul ignore next */
94081
+ case '/': {
93741
94082
  // completely not allowed, even escaped.
93742
94083
  // Should already be path-split by now.
93743
94084
  return false
94085
+ }
93744
94086
 
93745
94087
  case '\\':
93746
94088
  clearStateChar()
@@ -93859,25 +94201,23 @@ function parse (pattern, isSub) {
93859
94201
 
93860
94202
  // handle the case where we left a class open.
93861
94203
  // "[z-a]" is valid, equivalent to "\[z-a\]"
93862
- if (inClass) {
93863
- // split where the last [ was, make sure we don't have
93864
- // an invalid re. if so, re-walk the contents of the
93865
- // would-be class to re-translate any characters that
93866
- // were passed through as-is
93867
- // TODO: It would probably be faster to determine this
93868
- // without a try/catch and a new RegExp, but it's tricky
93869
- // to do safely. For now, this is safe and works.
93870
- var cs = pattern.substring(classStart + 1, i)
93871
- try {
93872
- RegExp('[' + cs + ']')
93873
- } catch (er) {
93874
- // not a valid class!
93875
- var sp = this.parse(cs, SUBPARSE)
93876
- re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
93877
- hasMagic = hasMagic || sp[1]
93878
- inClass = false
93879
- continue
93880
- }
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
93881
94221
  }
93882
94222
 
93883
94223
  // finish up the class.
@@ -93961,9 +94301,7 @@ function parse (pattern, isSub) {
93961
94301
  // something that could conceivably capture a dot
93962
94302
  var addPatternStart = false
93963
94303
  switch (re.charAt(0)) {
93964
- case '.':
93965
- case '[':
93966
- case '(': addPatternStart = true
94304
+ case '[': case '.': case '(': addPatternStart = true
93967
94305
  }
93968
94306
 
93969
94307
  // Hack to work around lack of negative lookbehind in JS
@@ -94025,7 +94363,7 @@ function parse (pattern, isSub) {
94025
94363
  var flags = options.nocase ? 'i' : ''
94026
94364
  try {
94027
94365
  var regExp = new RegExp('^' + re + '$', flags)
94028
- } catch (er) {
94366
+ } catch (er) /* istanbul ignore next - should be impossible */ {
94029
94367
  // If it was an invalid regular expression, then it can't match
94030
94368
  // anything. This trick looks for a character after the end of
94031
94369
  // the string, which is of course impossible, except in multi-line
@@ -94083,7 +94421,7 @@ function makeRe () {
94083
94421
 
94084
94422
  try {
94085
94423
  this.regexp = new RegExp(re, flags)
94086
- } catch (ex) {
94424
+ } catch (ex) /* istanbul ignore next - should be impossible */ {
94087
94425
  this.regexp = false
94088
94426
  }
94089
94427
  return this.regexp
@@ -94101,8 +94439,8 @@ minimatch.match = function (list, pattern, options) {
94101
94439
  return list
94102
94440
  }
94103
94441
 
94104
- Minimatch.prototype.match = match
94105
- function match (f, partial) {
94442
+ Minimatch.prototype.match = function match (f, partial) {
94443
+ if (typeof partial === 'undefined') partial = this.partial
94106
94444
  this.debug('match', f, this.pattern)
94107
94445
  // short-circuit in the case of busted things.
94108
94446
  // comments, etc.
@@ -94184,6 +94522,7 @@ Minimatch.prototype.matchOne = function (file, pattern, partial) {
94184
94522
 
94185
94523
  // should be impossible.
94186
94524
  // some invalid regexp stuff in the set.
94525
+ /* istanbul ignore if */
94187
94526
  if (p === false) return false
94188
94527
 
94189
94528
  if (p === GLOBSTAR) {
@@ -94257,6 +94596,7 @@ Minimatch.prototype.matchOne = function (file, pattern, partial) {
94257
94596
  // no match was found.
94258
94597
  // However, in partial mode, we can't say this is necessarily over.
94259
94598
  // If there's more *pattern* left, then
94599
+ /* istanbul ignore if */
94260
94600
  if (partial) {
94261
94601
  // ran out of file
94262
94602
  this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
@@ -94270,11 +94610,7 @@ Minimatch.prototype.matchOne = function (file, pattern, partial) {
94270
94610
  // patterns with magic have been turned into regexps.
94271
94611
  var hit
94272
94612
  if (typeof p === 'string') {
94273
- if (options.nocase) {
94274
- hit = f.toLowerCase() === p.toLowerCase()
94275
- } else {
94276
- hit = f === p
94277
- }
94613
+ hit = f === p
94278
94614
  this.debug('string match', p, f, hit)
94279
94615
  } else {
94280
94616
  hit = f.match(p)
@@ -94305,16 +94641,16 @@ Minimatch.prototype.matchOne = function (file, pattern, partial) {
94305
94641
  // this is ok if we're doing the match as part of
94306
94642
  // a glob fs traversal.
94307
94643
  return partial
94308
- } else if (pi === pl) {
94644
+ } else /* istanbul ignore else */ if (pi === pl) {
94309
94645
  // ran out of pattern, still have file left.
94310
94646
  // this is only acceptable if we're on the very last
94311
94647
  // empty segment of a file with a trailing slash.
94312
94648
  // a/* should match a/b/
94313
- var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')
94314
- return emptyFileEnd
94649
+ return (fi === fl - 1) && (file[fi] === '')
94315
94650
  }
94316
94651
 
94317
94652
  // should be unreachable.
94653
+ /* istanbul ignore next */
94318
94654
  throw new Error('wtf?')
94319
94655
  }
94320
94656