@abaplint/transpiler-cli 2.10.9 → 2.10.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/build/bundle.js +809 -160
  2. package/package.json +5 -5
package/build/bundle.js CHANGED
@@ -4781,6 +4781,7 @@ __exportStar(__webpack_require__(/*! ./kernel_id */ "./node_modules/@abaplint/co
4781
4781
  __exportStar(__webpack_require__(/*! ./language */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/language.js"), exports);
4782
4782
  __exportStar(__webpack_require__(/*! ./length */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/length.js"), exports);
4783
4783
  __exportStar(__webpack_require__(/*! ./let */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/let.js"), exports);
4784
+ __exportStar(__webpack_require__(/*! ./lob_handle */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/lob_handle.js"), exports);
4784
4785
  __exportStar(__webpack_require__(/*! ./loop_group_by_component */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/loop_group_by_component.js"), exports);
4785
4786
  __exportStar(__webpack_require__(/*! ./loop_group_by_target */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/loop_group_by_target.js"), exports);
4786
4787
  __exportStar(__webpack_require__(/*! ./loop_group_by */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/loop_group_by.js"), exports);
@@ -4874,16 +4875,15 @@ __exportStar(__webpack_require__(/*! ./sql_into_table */ "./node_modules/@abapli
4874
4875
  __exportStar(__webpack_require__(/*! ./sql_join */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_join.js"), exports);
4875
4876
  __exportStar(__webpack_require__(/*! ./sql_order_by */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_order_by.js"), exports);
4876
4877
  __exportStar(__webpack_require__(/*! ./sql_path */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_path.js"), exports);
4878
+ __exportStar(__webpack_require__(/*! ./sql_source_no_space */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_source_no_space.js"), exports);
4877
4879
  __exportStar(__webpack_require__(/*! ./sql_source_simple */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_source_simple.js"), exports);
4878
4880
  __exportStar(__webpack_require__(/*! ./sql_source */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_source.js"), exports);
4879
- __exportStar(__webpack_require__(/*! ./sql_source_no_space */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_source_no_space.js"), exports);
4880
4881
  __exportStar(__webpack_require__(/*! ./sql_target */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_target.js"), exports);
4881
4882
  __exportStar(__webpack_require__(/*! ./sql_up_to */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_up_to.js"), exports);
4882
4883
  __exportStar(__webpack_require__(/*! ./string_template_formatting */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/string_template_formatting.js"), exports);
4883
4884
  __exportStar(__webpack_require__(/*! ./string_template_source */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/string_template_source.js"), exports);
4884
4885
  __exportStar(__webpack_require__(/*! ./string_template */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/string_template.js"), exports);
4885
4886
  __exportStar(__webpack_require__(/*! ./super_class_name */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/super_class_name.js"), exports);
4886
- __exportStar(__webpack_require__(/*! ./type_structure */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/type_structure.js"), exports);
4887
4887
  __exportStar(__webpack_require__(/*! ./switch_body */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/switch_body.js"), exports);
4888
4888
  __exportStar(__webpack_require__(/*! ./table_body */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/table_body.js"), exports);
4889
4889
  __exportStar(__webpack_require__(/*! ./table_expression */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/table_expression.js"), exports);
@@ -4899,6 +4899,7 @@ __exportStar(__webpack_require__(/*! ./transporting_fields */ "./node_modules/@a
4899
4899
  __exportStar(__webpack_require__(/*! ./type_name_or_infer */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/type_name_or_infer.js"), exports);
4900
4900
  __exportStar(__webpack_require__(/*! ./type_name */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/type_name.js"), exports);
4901
4901
  __exportStar(__webpack_require__(/*! ./type_param */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/type_param.js"), exports);
4902
+ __exportStar(__webpack_require__(/*! ./type_structure */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/type_structure.js"), exports);
4902
4903
  __exportStar(__webpack_require__(/*! ./type_table_key */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/type_table_key.js"), exports);
4903
4904
  __exportStar(__webpack_require__(/*! ./type_table */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/type_table.js"), exports);
4904
4905
  __exportStar(__webpack_require__(/*! ./type */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/type.js"), exports);
@@ -5167,6 +5168,28 @@ exports.Let = Let;
5167
5168
 
5168
5169
  /***/ }),
5169
5170
 
5171
+ /***/ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/lob_handle.js":
5172
+ /*!*******************************************************************************************!*\
5173
+ !*** ./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/lob_handle.js ***!
5174
+ \*******************************************************************************************/
5175
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5176
+
5177
+ "use strict";
5178
+
5179
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
5180
+ exports.LOBHandle = void 0;
5181
+ const combi_1 = __webpack_require__(/*! ../combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
5182
+ const Expressions = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
5183
+ class LOBHandle extends combi_1.Expression {
5184
+ getRunnable() {
5185
+ return (0, combi_1.seq)("WRITER FOR COLUMNS", Expressions.Field);
5186
+ }
5187
+ }
5188
+ exports.LOBHandle = LOBHandle;
5189
+ //# sourceMappingURL=lob_handle.js.map
5190
+
5191
+ /***/ }),
5192
+
5170
5193
  /***/ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/loop_group_by.js":
5171
5194
  /*!**********************************************************************************************!*\
5172
5195
  !*** ./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/loop_group_by.js ***!
@@ -5307,7 +5330,7 @@ const combi_1 = __webpack_require__(/*! ../combi */ "./node_modules/@abaplint/co
5307
5330
  class MessageClass extends combi_1.Expression {
5308
5331
  getRunnable() {
5309
5332
  // "&1" can be used for almost anything(field names, method names etc.) in macros
5310
- return (0, combi_1.regex)(/^>?(\/\w+\/)?\w+#?@?\/?!?&?>?\$?$/);
5333
+ return (0, combi_1.regex)(/^>?[\w\/]+#?@?\/?!?&?>?\$?$/);
5311
5334
  }
5312
5335
  }
5313
5336
  exports.MessageClass = MessageClass;
@@ -6405,7 +6428,7 @@ class SelectLoop extends combi_1.Expression {
6405
6428
  const packTab = (0, combi_1.seq)(pack, _1.SQLIntoTable);
6406
6429
  const into = (0, combi_1.altPrio)(sql_into_structure_1.SQLIntoStructure, _1.SQLIntoList);
6407
6430
  const perm = (0, combi_1.per)(_1.SQLFrom, where, sql_up_to_1.SQLUpTo, sql_order_by_1.SQLOrderBy, sql_having_1.SQLHaving, _1.SQLClient, bypass, _1.SQLGroupBy, _1.SQLForAllEntries, (0, combi_1.alt)(tab, into, packTab));
6408
- const strict = (0, combi_1.seq)(_1.SQLFrom, (0, combi_1.ver)(version_1.Version.v750, _1.SQLFields), where, into, sql_up_to_1.SQLUpTo);
6431
+ const strict = (0, combi_1.seq)(_1.SQLFrom, (0, combi_1.ver)(version_1.Version.v750, _1.SQLFields), (0, combi_1.optPrio)((0, combi_1.seq)(where, into, sql_up_to_1.SQLUpTo)));
6409
6432
  const ret = (0, combi_1.seq)("SELECT", (0, combi_1.altPrio)((0, combi_1.seq)((0, combi_1.optPrio)("DISTINCT"), sql_field_list_loop_1.SQLFieldListLoop, perm), strict), (0, combi_1.optPrio)(sql_hints_1.SQLHints));
6410
6433
  return ret;
6411
6434
  }
@@ -8089,7 +8112,7 @@ class Type extends combi_1.Expression {
8089
8112
  getRunnable() {
8090
8113
  const typeType = (0, combi_1.seq)(_1.TypeName, (0, combi_1.optPrio)(_1.Default));
8091
8114
  const like = (0, combi_1.altPrio)((0, combi_1.seq)("LINE OF", _1.FieldChain), (0, combi_1.seq)("REF TO", _1.FieldChain), _1.FieldChain);
8092
- const type = (0, combi_1.altPrio)((0, combi_1.seq)("LINE OF", typeType), (0, combi_1.seq)("REF TO", typeType), typeType);
8115
+ const type = (0, combi_1.altPrio)((0, combi_1.seq)("LINE OF", typeType), (0, combi_1.seq)("REF TO", typeType), (0, combi_1.seq)(typeType, (0, combi_1.optPrio)(_1.LOBHandle)));
8093
8116
  const ret = (0, combi_1.altPrio)((0, combi_1.seq)("LIKE", like), (0, combi_1.seq)("TYPE", type));
8094
8117
  return ret;
8095
8118
  }
@@ -14358,7 +14381,7 @@ const version_1 = __webpack_require__(/*! ../../../version */ "./node_modules/@a
14358
14381
  class Ranges {
14359
14382
  getMatcher() {
14360
14383
  const occurs = (0, combi_1.seq)("OCCURS", expressions_1.Source);
14361
- const ret = (0, combi_1.seq)("RANGES", expressions_1.SimpleName, "FOR", expressions_1.FieldSub, (0, combi_1.opt)(occurs));
14384
+ const ret = (0, combi_1.seq)("RANGES", expressions_1.SimpleName, "FOR", expressions_1.SimpleFieldChain2, (0, combi_1.opt)(occurs));
14362
14385
  return (0, combi_1.verNot)(version_1.Version.Cloud, ret);
14363
14386
  }
14364
14387
  }
@@ -17511,7 +17534,7 @@ const protected_section_1 = __webpack_require__(/*! ./protected_section */ "./no
17511
17534
  const public_section_1 = __webpack_require__(/*! ./public_section */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/public_section.js");
17512
17535
  class ClassDefinition {
17513
17536
  getMatcher() {
17514
- const body = (0, _combi_1.seq)((0, _combi_1.opt)((0, _combi_1.sta)(Statements.SetExtendedCheck)), (0, _combi_1.star)((0, _combi_1.sta)(Statements.TypePools)), (0, _combi_1.opt)((0, _combi_1.sub)(public_section_1.PublicSection)), (0, _combi_1.star)((0, _combi_1.sta)(Statements.Include)), (0, _combi_1.opt)((0, _combi_1.sub)(protected_section_1.ProtectedSection)), (0, _combi_1.opt)((0, _combi_1.sub)(private_section_1.PrivateSection)), (0, _combi_1.opt)((0, _combi_1.sta)(Statements.SetExtendedCheck)));
17537
+ const body = (0, _combi_1.seq)((0, _combi_1.opt)((0, _combi_1.sta)(Statements.SetExtendedCheck)), (0, _combi_1.star)((0, _combi_1.sta)(Statements.TypePools)), (0, _combi_1.opt)((0, _combi_1.sub)(public_section_1.PublicSection)), (0, _combi_1.opt)((0, _combi_1.sub)(protected_section_1.ProtectedSection)), (0, _combi_1.opt)((0, _combi_1.sub)(private_section_1.PrivateSection)), (0, _combi_1.opt)((0, _combi_1.sta)(Statements.SetExtendedCheck)));
17515
17538
  return (0, _combi_1.beginEnd)((0, _combi_1.sta)(Statements.ClassDefinition), body, (0, _combi_1.sta)(Statements.EndClass));
17516
17539
  }
17517
17540
  }
@@ -17939,7 +17962,7 @@ __exportStar(__webpack_require__(/*! ./private_section */ "./node_modules/@abapl
17939
17962
  __exportStar(__webpack_require__(/*! ./protected_section */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/protected_section.js"), exports);
17940
17963
  __exportStar(__webpack_require__(/*! ./provide */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/provide.js"), exports);
17941
17964
  __exportStar(__webpack_require__(/*! ./public_section */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/public_section.js"), exports);
17942
- __exportStar(__webpack_require__(/*! ./section_section */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_section.js"), exports);
17965
+ __exportStar(__webpack_require__(/*! ./section_contents */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_contents.js"), exports);
17943
17966
  __exportStar(__webpack_require__(/*! ./select */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/select.js"), exports);
17944
17967
  __exportStar(__webpack_require__(/*! ./statics */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/statics.js"), exports);
17945
17968
  __exportStar(__webpack_require__(/*! ./test_injection */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/test_injection.js"), exports);
@@ -17967,10 +17990,10 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
17967
17990
  exports.Interface = void 0;
17968
17991
  const Statements = __webpack_require__(/*! ../../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
17969
17992
  const _combi_1 = __webpack_require__(/*! ./_combi */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/_combi.js");
17970
- const section_section_1 = __webpack_require__(/*! ./section_section */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_section.js");
17993
+ const section_contents_1 = __webpack_require__(/*! ./section_contents */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_contents.js");
17971
17994
  class Interface {
17972
17995
  getMatcher() {
17973
- const intf = (0, _combi_1.beginEnd)((0, _combi_1.sta)(Statements.Interface), (0, _combi_1.star)((0, _combi_1.sub)(section_section_1.SectionContents)), (0, _combi_1.sta)(Statements.EndInterface));
17996
+ const intf = (0, _combi_1.beginEnd)((0, _combi_1.sta)(Statements.Interface), (0, _combi_1.star)((0, _combi_1.sub)(section_contents_1.SectionContents)), (0, _combi_1.sta)(Statements.EndInterface));
17974
17997
  return intf;
17975
17998
  }
17976
17999
  }
@@ -18017,8 +18040,7 @@ const _combi_1 = __webpack_require__(/*! ./_combi */ "./node_modules/@abaplint/c
18017
18040
  const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
18018
18041
  class Loop {
18019
18042
  getMatcher() {
18020
- const body = (0, _combi_1.alt)((0, _combi_1.sub)(_1.Body), (0, _combi_1.sub)(_1.OnChange));
18021
- return (0, _combi_1.beginEnd)((0, _combi_1.sta)(Statements.Loop), (0, _combi_1.star)(body), (0, _combi_1.sta)(Statements.EndLoop));
18043
+ return (0, _combi_1.beginEnd)((0, _combi_1.sta)(Statements.Loop), (0, _combi_1.star)((0, _combi_1.sub)(_1.Body)), (0, _combi_1.sta)(Statements.EndLoop));
18022
18044
  }
18023
18045
  }
18024
18046
  exports.Loop = Loop;
@@ -18113,7 +18135,7 @@ const _statement_1 = __webpack_require__(/*! ../../2_statements/statements/_stat
18113
18135
  class Normal {
18114
18136
  getMatcher() {
18115
18137
  // note that the sequence of alternatives here influences performance
18116
- return (0, _combi_1.alt)((0, _combi_1.sta)(Statements.Move), (0, _combi_1.sta)(Statements.Call), (0, _combi_1.sta)(Statements.Data), (0, _combi_1.sub)(Structures.If), (0, _combi_1.sta)(Statements.Clear), (0, _combi_1.sta)(Statements.FieldSymbol), (0, _combi_1.sta)(Statements.CreateObject), (0, _combi_1.sta)(Statements.CallFunction), (0, _combi_1.sta)(_statement_1.MacroCall), (0, _combi_1.sub)(Structures.LoopAtScreen), (0, _combi_1.sub)(Structures.Loop), (0, _combi_1.sta)(Statements.Append), (0, _combi_1.sub)(Structures.Try), (0, _combi_1.sta)(Statements.ReadTable), (0, _combi_1.sta)(Statements.Assert), (0, _combi_1.sta)(Statements.Return), (0, _combi_1.sta)(Statements.Select), (0, _combi_1.sta)(Statements.Assign), (0, _combi_1.sta)(Statements.InsertInternal), (0, _combi_1.sta)(Statements.DeleteInternal), (0, _combi_1.sta)(Statements.Concatenate), (0, _combi_1.sub)(Structures.Case), (0, _combi_1.sub)(Structures.CaseType), (0, _combi_1.sub)(Structures.Enhancement), (0, _combi_1.sub)(Structures.EnhancementSection), (0, _combi_1.sta)(Statements.AddCorresponding), (0, _combi_1.sta)(Statements.Add), (0, _combi_1.sta)(Statements.AssignLocalCopy), (0, _combi_1.sta)(Statements.AuthorityCheck), (0, _combi_1.sta)(Statements.Back), (0, _combi_1.sta)(Statements.Break), (0, _combi_1.sta)(Statements.BreakId), (0, _combi_1.sta)(Statements.CallDatabase), (0, _combi_1.sta)(Statements.CallDialog), (0, _combi_1.sta)(Statements.CallKernel), (0, _combi_1.sta)(Statements.CallOLE), (0, _combi_1.sta)(Statements.CallScreen), (0, _combi_1.sta)(Statements.ModifyScreen), (0, _combi_1.sta)(Statements.CallSelectionScreen), (0, _combi_1.sta)(Statements.CallTransaction), (0, _combi_1.sta)(Statements.CallTransformation), (0, _combi_1.sta)(Statements.Check), (0, _combi_1.sta)(Statements.ClassDefinitionLoad), (0, _combi_1.sta)(Statements.CloseCursor), (0, _combi_1.sta)(Statements.CloseDataset), (0, _combi_1.sta)(Statements.Collect), (0, _combi_1.sta)(Statements.Commit), (0, _combi_1.sta)(Statements.Communication), (0, _combi_1.sta)(Statements.Compute), (0, _combi_1.sta)(Statements.CallBadi), (0, _combi_1.sta)(Statements.Condense), (0, _combi_1.sta)(Statements.Constant), (0, _combi_1.sta)(Statements.Contexts), (0, _combi_1.sta)(Statements.Continue), (0, _combi_1.sta)(Statements.ConvertText), (0, _combi_1.sta)(Statements.Convert), (0, _combi_1.sta)(Statements.CreateData), (0, _combi_1.sta)(Statements.CreateOLE), (0, _combi_1.sta)(Statements.DeleteCluster), (0, _combi_1.sta)(Statements.DeleteDatabase), (0, _combi_1.sta)(Statements.DeleteDataset), (0, _combi_1.sta)(Statements.DeleteDynpro), (0, _combi_1.sta)(Statements.DeleteMemory), (0, _combi_1.sta)(Statements.DeleteReport), (0, _combi_1.sta)(Statements.DeleteTextpool), (0, _combi_1.sta)(Statements.Demand), (0, _combi_1.sta)(Statements.Describe), (0, _combi_1.sta)(Statements.Detail), (0, _combi_1.sta)(Statements.Divide), (0, _combi_1.sta)(Statements.EditorCall), (0, _combi_1.sta)(Statements.EnhancementPoint), (0, _combi_1.sta)(Statements.Exit), (0, _combi_1.sta)(Statements.ExportDynpro), (0, _combi_1.sta)(Statements.Export), (0, _combi_1.sta)(Statements.Extract), (0, _combi_1.sta)(Statements.FetchNextCursor), (0, _combi_1.sta)(Statements.FieldGroup), (0, _combi_1.sta)(Statements.Fields), (0, _combi_1.sta)(Statements.Find), (0, _combi_1.sta)(Statements.Format), (0, _combi_1.sta)(Statements.FreeMemory), (0, _combi_1.sta)(Statements.FreeObject), (0, _combi_1.sta)(Statements.Free), (0, _combi_1.sta)(Statements.GenerateDynpro), (0, _combi_1.sta)(Statements.GenerateReport), (0, _combi_1.sta)(Statements.GenerateSubroutine), (0, _combi_1.sta)(Statements.GetBadi), (0, _combi_1.sta)(Statements.GetBit), (0, _combi_1.sta)(Statements.GetCursor), (0, _combi_1.sta)(Statements.GetDataset), (0, _combi_1.sta)(Statements.GetLocale), (0, _combi_1.sta)(Statements.GetParameter), (0, _combi_1.sta)(Statements.GetPFStatus), (0, _combi_1.sta)(Statements.GetProperty), (0, _combi_1.sta)(Statements.GetReference), (0, _combi_1.sta)(Statements.GetRunTime), (0, _combi_1.sta)(Statements.GetTime), (0, _combi_1.sta)(Statements.Hide), (0, _combi_1.sta)(Statements.Nodes), (0, _combi_1.sta)(Statements.ImportDynpro), (0, _combi_1.sta)(Statements.ImportNametab), (0, _combi_1.sta)(Statements.MoveCorresponding), (0, _combi_1.sta)(Statements.Import), (0, _combi_1.sta)(Statements.Infotypes), (0, _combi_1.sta)(Statements.Include), // include does not have to be at top level
18138
+ return (0, _combi_1.alt)((0, _combi_1.sta)(Statements.Move), (0, _combi_1.sta)(Statements.Call), (0, _combi_1.sta)(Statements.Data), (0, _combi_1.sub)(Structures.If), (0, _combi_1.sta)(Statements.Clear), (0, _combi_1.sta)(Statements.FieldSymbol), (0, _combi_1.sta)(Statements.CreateObject), (0, _combi_1.sta)(Statements.CallFunction), (0, _combi_1.sta)(_statement_1.MacroCall), (0, _combi_1.sub)(Structures.LoopAtScreen), (0, _combi_1.sub)(Structures.Loop), (0, _combi_1.sta)(Statements.Append), (0, _combi_1.sub)(Structures.Try), (0, _combi_1.sub)(Structures.OnChange), (0, _combi_1.sta)(Statements.ReadTable), (0, _combi_1.sta)(Statements.Assert), (0, _combi_1.sta)(Statements.Return), (0, _combi_1.sta)(Statements.Select), (0, _combi_1.sta)(Statements.Assign), (0, _combi_1.sta)(Statements.InsertInternal), (0, _combi_1.sta)(Statements.DeleteInternal), (0, _combi_1.sta)(Statements.Concatenate), (0, _combi_1.sub)(Structures.Case), (0, _combi_1.sub)(Structures.CaseType), (0, _combi_1.sub)(Structures.Enhancement), (0, _combi_1.sub)(Structures.EnhancementSection), (0, _combi_1.sta)(Statements.AddCorresponding), (0, _combi_1.sta)(Statements.Add), (0, _combi_1.sta)(Statements.AssignLocalCopy), (0, _combi_1.sta)(Statements.AuthorityCheck), (0, _combi_1.sta)(Statements.Back), (0, _combi_1.sta)(Statements.Break), (0, _combi_1.sta)(Statements.BreakId), (0, _combi_1.sta)(Statements.CallDatabase), (0, _combi_1.sta)(Statements.CallDialog), (0, _combi_1.sta)(Statements.CallKernel), (0, _combi_1.sta)(Statements.CallOLE), (0, _combi_1.sta)(Statements.CallScreen), (0, _combi_1.sta)(Statements.ModifyScreen), (0, _combi_1.sta)(Statements.CallSelectionScreen), (0, _combi_1.sta)(Statements.CallTransaction), (0, _combi_1.sta)(Statements.CallTransformation), (0, _combi_1.sta)(Statements.Check), (0, _combi_1.sta)(Statements.ClassDefinitionLoad), (0, _combi_1.sta)(Statements.CloseCursor), (0, _combi_1.sta)(Statements.CloseDataset), (0, _combi_1.sta)(Statements.Collect), (0, _combi_1.sta)(Statements.Commit), (0, _combi_1.sta)(Statements.Communication), (0, _combi_1.sta)(Statements.Compute), (0, _combi_1.sta)(Statements.CallBadi), (0, _combi_1.sta)(Statements.Condense), (0, _combi_1.sta)(Statements.Constant), (0, _combi_1.sta)(Statements.Contexts), (0, _combi_1.sta)(Statements.Continue), (0, _combi_1.sta)(Statements.ConvertText), (0, _combi_1.sta)(Statements.Convert), (0, _combi_1.sta)(Statements.CreateData), (0, _combi_1.sta)(Statements.CreateOLE), (0, _combi_1.sta)(Statements.DeleteCluster), (0, _combi_1.sta)(Statements.DeleteDatabase), (0, _combi_1.sta)(Statements.DeleteDataset), (0, _combi_1.sta)(Statements.DeleteDynpro), (0, _combi_1.sta)(Statements.DeleteMemory), (0, _combi_1.sta)(Statements.DeleteReport), (0, _combi_1.sta)(Statements.DeleteTextpool), (0, _combi_1.sta)(Statements.Demand), (0, _combi_1.sta)(Statements.Describe), (0, _combi_1.sta)(Statements.Detail), (0, _combi_1.sta)(Statements.Divide), (0, _combi_1.sta)(Statements.EditorCall), (0, _combi_1.sta)(Statements.EnhancementPoint), (0, _combi_1.sta)(Statements.Exit), (0, _combi_1.sta)(Statements.ExportDynpro), (0, _combi_1.sta)(Statements.Export), (0, _combi_1.sta)(Statements.Extract), (0, _combi_1.sta)(Statements.FetchNextCursor), (0, _combi_1.sta)(Statements.FieldGroup), (0, _combi_1.sta)(Statements.Fields), (0, _combi_1.sta)(Statements.Find), (0, _combi_1.sta)(Statements.Format), (0, _combi_1.sta)(Statements.FreeMemory), (0, _combi_1.sta)(Statements.FreeObject), (0, _combi_1.sta)(Statements.Free), (0, _combi_1.sta)(Statements.GenerateDynpro), (0, _combi_1.sta)(Statements.GenerateReport), (0, _combi_1.sta)(Statements.GenerateSubroutine), (0, _combi_1.sta)(Statements.GetBadi), (0, _combi_1.sta)(Statements.GetBit), (0, _combi_1.sta)(Statements.GetCursor), (0, _combi_1.sta)(Statements.GetDataset), (0, _combi_1.sta)(Statements.GetLocale), (0, _combi_1.sta)(Statements.GetParameter), (0, _combi_1.sta)(Statements.GetPFStatus), (0, _combi_1.sta)(Statements.GetProperty), (0, _combi_1.sta)(Statements.GetReference), (0, _combi_1.sta)(Statements.GetRunTime), (0, _combi_1.sta)(Statements.GetTime), (0, _combi_1.sta)(Statements.Hide), (0, _combi_1.sta)(Statements.Nodes), (0, _combi_1.sta)(Statements.ImportDynpro), (0, _combi_1.sta)(Statements.ImportNametab), (0, _combi_1.sta)(Statements.MoveCorresponding), (0, _combi_1.sta)(Statements.Import), (0, _combi_1.sta)(Statements.Infotypes), (0, _combi_1.sta)(Statements.Include), // include does not have to be at top level
18117
18139
  (0, _combi_1.sta)(Statements.InsertDatabase), (0, _combi_1.sta)(Statements.InsertReport), (0, _combi_1.sta)(Statements.InsertTextpool), (0, _combi_1.sta)(Statements.InsertFieldGroup), (0, _combi_1.sta)(Statements.InterfaceLoad), (0, _combi_1.sta)(Statements.Leave), (0, _combi_1.sta)(Statements.LoadReport), (0, _combi_1.sta)(Statements.Local), (0, _combi_1.sta)(Statements.With), (0, _combi_1.sta)(Statements.LogPoint), (0, _combi_1.sta)(Statements.Message), (0, _combi_1.sta)(Statements.ModifyLine), (0, _combi_1.sta)(Statements.ModifyDatabase), (0, _combi_1.sta)(Statements.ModifyInternal), (0, _combi_1.sta)(Statements.Multiply), (0, _combi_1.sta)(Statements.NewLine), (0, _combi_1.sta)(Statements.NewPage), (0, _combi_1.sta)(Statements.OpenCursor), (0, _combi_1.sta)(Statements.OpenDataset), (0, _combi_1.sta)(Statements.Overlay), (0, _combi_1.sta)(Statements.Pack), (0, _combi_1.sta)(Statements.Perform), (0, _combi_1.sta)(Statements.FormDefinition), (0, _combi_1.sta)(Statements.Position), (0, _combi_1.sta)(Statements.Put), (0, _combi_1.sta)(Statements.PrintControl), (0, _combi_1.sta)(Statements.RaiseEvent), (0, _combi_1.sta)(Statements.RaiseEntityEvent), (0, _combi_1.sta)(Statements.Raise), (0, _combi_1.sta)(Statements.Ranges), (0, _combi_1.sta)(Statements.ReadDataset), (0, _combi_1.sta)(Statements.ReadLine), (0, _combi_1.sta)(Statements.ReadReport), (0, _combi_1.sta)(Statements.ReadTextpool), (0, _combi_1.sta)(Statements.Receive), (0, _combi_1.sta)(Statements.RefreshControl), (0, _combi_1.sta)(Statements.Refresh), (0, _combi_1.sta)(Statements.Reject), (0, _combi_1.sta)(Statements.Replace), (0, _combi_1.sta)(Statements.Reserve), (0, _combi_1.sta)(Statements.Resume), (0, _combi_1.sta)(Statements.Retry), (0, _combi_1.sta)(Statements.Rollback), (0, _combi_1.sta)(Statements.Scan), (0, _combi_1.sta)(Statements.ScrollList), (0, _combi_1.sta)(Statements.Search), (0, _combi_1.sta)(Statements.SetBit), (0, _combi_1.sta)(Statements.SetBlank), (0, _combi_1.sta)(Statements.SetCountry), (0, _combi_1.sta)(Statements.SetCursor), (0, _combi_1.sta)(Statements.SetDataset), (0, _combi_1.sta)(Statements.SetExtendedCheck), (0, _combi_1.sta)(Statements.SetHandler), (0, _combi_1.sta)(Statements.SetLanguage), (0, _combi_1.sta)(Statements.SetLeft), (0, _combi_1.sta)(Statements.SetLocale), (0, _combi_1.sta)(Statements.SetMargin), (0, _combi_1.sta)(Statements.SetParameter), (0, _combi_1.sta)(Statements.SetPFStatus), (0, _combi_1.sta)(Statements.SetProperty), (0, _combi_1.sta)(Statements.SetRunTime), (0, _combi_1.sta)(Statements.SetScreen), (0, _combi_1.sta)(Statements.SetTitlebar), (0, _combi_1.sta)(Statements.SetUserCommand), (0, _combi_1.sta)(Statements.SetUpdateTask), (0, _combi_1.sta)(Statements.Shift), (0, _combi_1.sta)(Statements.Skip), (0, _combi_1.sta)(Statements.SortDataset), (0, _combi_1.sta)(Statements.Sort), (0, _combi_1.sta)(Statements.Static), (0, _combi_1.sta)(Statements.Split), (0, _combi_1.sta)(Statements.Stop), (0, _combi_1.sta)(Statements.Submit), (0, _combi_1.sta)(Statements.Summary), (0, _combi_1.sta)(Statements.SubtractCorresponding), (0, _combi_1.sta)(Statements.Subtract), (0, _combi_1.sta)(Statements.SuppressDialog), (0, _combi_1.sta)(Statements.Supply), (0, _combi_1.sta)(Statements.Sum), (0, _combi_1.sta)(Statements.SyntaxCheck), (0, _combi_1.sta)(Statements.SystemCall), (0, _combi_1.sta)(Statements.Tables), (0, _combi_1.sta)(Statements.Transfer), (0, _combi_1.sta)(Statements.Translate), (0, _combi_1.sta)(Statements.Type), (0, _combi_1.sta)(Statements.TypePools), (0, _combi_1.sta)(Statements.Uline), (0, _combi_1.sta)(Statements.Unassign), (0, _combi_1.sta)(Statements.Unpack), (0, _combi_1.sta)(Statements.UpdateDatabase), (0, _combi_1.sta)(Statements.Wait), (0, _combi_1.sta)(Statements.Window), (0, _combi_1.sta)(Statements.Write), (0, _combi_1.sta)(Statements.CommitEntities), (0, _combi_1.sta)(Statements.GetPermissions), (0, _combi_1.sta)(Statements.SetLocks), (0, _combi_1.sta)(Statements.ModifyEntities), (0, _combi_1.sta)(Statements.ReadEntities), (0, _combi_1.sta)(Statements.RollbackEntities), (0, _combi_1.sub)(Structures.Define), (0, _combi_1.sub)(Structures.TestInjection), (0, _combi_1.sub)(Structures.TestSeam), (0, _combi_1.sub)(Structures.TypeMesh), (0, _combi_1.sub)(Structures.Provide), (0, _combi_1.sub)(Structures.CatchSystemExceptions), (0, _combi_1.sub)(Structures.At), (0, _combi_1.sub)(Structures.AtFirst), (0, _combi_1.sub)(Structures.AtLast), (0, _combi_1.sub)(Structures.Constants), (0, _combi_1.sub)(Structures.Types), (0, _combi_1.sub)(Structures.Statics), (0, _combi_1.sub)(Structures.Select), (0, _combi_1.sub)(Structures.Data), (0, _combi_1.sub)(Structures.TypeEnum), (0, _combi_1.sub)(Structures.While), (0, _combi_1.sub)(Structures.With), (0, _combi_1.sub)(Structures.Do), (0, _combi_1.sub)(Structures.ExecSQL));
18118
18140
  }
18119
18141
  }
@@ -18157,10 +18179,10 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
18157
18179
  exports.PrivateSection = void 0;
18158
18180
  const Statements = __webpack_require__(/*! ../../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
18159
18181
  const _combi_1 = __webpack_require__(/*! ./_combi */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/_combi.js");
18160
- const section_section_1 = __webpack_require__(/*! ./section_section */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_section.js");
18182
+ const section_contents_1 = __webpack_require__(/*! ./section_contents */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_contents.js");
18161
18183
  class PrivateSection {
18162
18184
  getMatcher() {
18163
- return (0, _combi_1.seq)((0, _combi_1.sta)(Statements.Private), (0, _combi_1.opt)((0, _combi_1.sub)(section_section_1.SectionContents)));
18185
+ return (0, _combi_1.seq)((0, _combi_1.sta)(Statements.Private), (0, _combi_1.opt)((0, _combi_1.sub)(section_contents_1.SectionContents)));
18164
18186
  }
18165
18187
  }
18166
18188
  exports.PrivateSection = PrivateSection;
@@ -18180,10 +18202,10 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
18180
18202
  exports.ProtectedSection = void 0;
18181
18203
  const Statements = __webpack_require__(/*! ../../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
18182
18204
  const _combi_1 = __webpack_require__(/*! ./_combi */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/_combi.js");
18183
- const section_section_1 = __webpack_require__(/*! ./section_section */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_section.js");
18205
+ const section_contents_1 = __webpack_require__(/*! ./section_contents */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_contents.js");
18184
18206
  class ProtectedSection {
18185
18207
  getMatcher() {
18186
- return (0, _combi_1.seq)((0, _combi_1.sta)(Statements.Protected), (0, _combi_1.opt)((0, _combi_1.sub)(section_section_1.SectionContents)));
18208
+ return (0, _combi_1.seq)((0, _combi_1.sta)(Statements.Protected), (0, _combi_1.opt)((0, _combi_1.sub)(section_contents_1.SectionContents)));
18187
18209
  }
18188
18210
  }
18189
18211
  exports.ProtectedSection = ProtectedSection;
@@ -18226,10 +18248,10 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
18226
18248
  exports.PublicSection = void 0;
18227
18249
  const Statements = __webpack_require__(/*! ../../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
18228
18250
  const _combi_1 = __webpack_require__(/*! ./_combi */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/_combi.js");
18229
- const section_section_1 = __webpack_require__(/*! ./section_section */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_section.js");
18251
+ const section_contents_1 = __webpack_require__(/*! ./section_contents */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_contents.js");
18230
18252
  class PublicSection {
18231
18253
  getMatcher() {
18232
- return (0, _combi_1.seq)((0, _combi_1.sta)(Statements.Public), (0, _combi_1.opt)((0, _combi_1.sub)(section_section_1.SectionContents)));
18254
+ return (0, _combi_1.seq)((0, _combi_1.sta)(Statements.Public), (0, _combi_1.opt)((0, _combi_1.sub)(section_contents_1.SectionContents)));
18233
18255
  }
18234
18256
  }
18235
18257
  exports.PublicSection = PublicSection;
@@ -18237,10 +18259,10 @@ exports.PublicSection = PublicSection;
18237
18259
 
18238
18260
  /***/ }),
18239
18261
 
18240
- /***/ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_section.js":
18241
- /*!***********************************************************************************************!*\
18242
- !*** ./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_section.js ***!
18243
- \***********************************************************************************************/
18262
+ /***/ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_contents.js":
18263
+ /*!************************************************************************************************!*\
18264
+ !*** ./node_modules/@abaplint/core/build/src/abap/3_structures/structures/section_contents.js ***!
18265
+ \************************************************************************************************/
18244
18266
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
18245
18267
 
18246
18268
  "use strict";
@@ -18257,11 +18279,11 @@ const data_1 = __webpack_require__(/*! ./data */ "./node_modules/@abaplint/core/
18257
18279
  const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
18258
18280
  class SectionContents {
18259
18281
  getMatcher() {
18260
- return (0, _combi_1.star)((0, _combi_1.alt)((0, _combi_1.sta)(Statements.MethodDef), (0, _combi_1.sta)(Statements.InterfaceDef), (0, _combi_1.sta)(Statements.Data), (0, _combi_1.sta)(Statements.ClassData), (0, _combi_1.sta)(Statements.Events), (0, _combi_1.sta)(Statements.Constant), (0, _combi_1.sta)(Statements.Aliases), (0, _combi_1.sta)(Statements.TypePools), (0, _combi_1.sta)(Statements.InterfaceLoad), (0, _combi_1.sta)(Statements.ClassDefinitionLoad), (0, _combi_1.sub)(types_1.Types), (0, _combi_1.sub)(constants_1.Constants), (0, _combi_1.sub)(type_enum_1.TypeEnum), (0, _combi_1.sub)(_1.TypeMesh), (0, _combi_1.sub)(data_1.Data), (0, _combi_1.sub)(class_data_1.ClassData), (0, _combi_1.sta)(Statements.Type)));
18282
+ return (0, _combi_1.star)((0, _combi_1.alt)((0, _combi_1.sta)(Statements.MethodDef), (0, _combi_1.sta)(Statements.InterfaceDef), (0, _combi_1.sta)(Statements.Data), (0, _combi_1.sta)(Statements.ClassData), (0, _combi_1.sta)(Statements.Events), (0, _combi_1.sta)(Statements.Constant), (0, _combi_1.sta)(Statements.Aliases), (0, _combi_1.sta)(Statements.TypePools), (0, _combi_1.sta)(Statements.InterfaceLoad), (0, _combi_1.sta)(Statements.ClassDefinitionLoad), (0, _combi_1.sta)(Statements.Include), (0, _combi_1.sub)(types_1.Types), (0, _combi_1.sub)(constants_1.Constants), (0, _combi_1.sub)(type_enum_1.TypeEnum), (0, _combi_1.sub)(_1.TypeMesh), (0, _combi_1.sub)(data_1.Data), (0, _combi_1.sub)(class_data_1.ClassData), (0, _combi_1.sta)(Statements.Type)));
18261
18283
  }
18262
18284
  }
18263
18285
  exports.SectionContents = SectionContents;
18264
- //# sourceMappingURL=section_section.js.map
18286
+ //# sourceMappingURL=section_contents.js.map
18265
18287
 
18266
18288
  /***/ }),
18267
18289
 
@@ -19044,7 +19066,6 @@ var Visibility;
19044
19066
 
19045
19067
  Object.defineProperty(exports, "__esModule", ({ value: true }));
19046
19068
  exports.BuiltIn = exports.BuiltInMethod = void 0;
19047
- /* eslint-disable max-len */
19048
19069
  const _typed_identifier_1 = __webpack_require__(/*! ../types/_typed_identifier */ "./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js");
19049
19070
  const basic_1 = __webpack_require__(/*! ../types/basic */ "./node_modules/@abaplint/core/build/src/abap/types/basic/index.js");
19050
19071
  const tokens_1 = __webpack_require__(/*! ../1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
@@ -20367,7 +20388,7 @@ class CurrentScope {
20367
20388
  }
20368
20389
  const upper = name.toUpperCase();
20369
20390
  if (this.current.getData().vars[upper] !== undefined) {
20370
- // console.dir(new Error().stack);
20391
+ // console.dir(new Error().stack);
20371
20392
  throw new Error(`Variable name "${name}" already defined`);
20372
20393
  }
20373
20394
  else if (this.isOO() && this.current.getData().types[upper] !== undefined) {
@@ -20385,6 +20406,7 @@ class CurrentScope {
20385
20406
  }
20386
20407
  const upper = name.toUpperCase();
20387
20408
  if (parent.getData().vars[upper] !== undefined) {
20409
+ // console.dir(new Error().stack);
20388
20410
  throw new Error(`Variable name "${name}" already defined`);
20389
20411
  }
20390
20412
  else if (this.isOO() && parent.getData().types[upper] !== undefined) {
@@ -20876,7 +20898,7 @@ class ObjectOriented {
20876
20898
  }
20877
20899
  if (name.includes("~")) {
20878
20900
  const interfaceName = upper.split("~")[0];
20879
- if (def.getImplementing().some((a) => a.name.toUpperCase() === interfaceName)) {
20901
+ if (this.listInterfacesRecursive(def).includes(interfaceName)) {
20880
20902
  return this.searchAttributeName(this.scope.findInterfaceDefinition(interfaceName), name.split("~")[1]);
20881
20903
  }
20882
20904
  }
@@ -21038,7 +21060,19 @@ class ObjectOriented {
21038
21060
  }
21039
21061
  return ignore;
21040
21062
  }
21041
- // returns list of interfaces implemented
21063
+ /** returns list of interfaces implemented, recursive */
21064
+ listInterfacesRecursive(definition) {
21065
+ const list = [];
21066
+ for (const i of definition.getImplementing()) {
21067
+ const upper = i.name.toUpperCase();
21068
+ list.push(upper);
21069
+ const def = this.scope.findInterfaceDefinition(upper);
21070
+ if (def) {
21071
+ list.push(...this.listInterfacesRecursive(def));
21072
+ }
21073
+ }
21074
+ return [...new Set(list)];
21075
+ }
21042
21076
  fromInterfaces(definition, skip) {
21043
21077
  const ignore = [];
21044
21078
  for (const i of definition.getImplementing()) {
@@ -21880,7 +21914,6 @@ exports.AssertError = AssertError;
21880
21914
 
21881
21915
  Object.defineProperty(exports, "__esModule", ({ value: true }));
21882
21916
  exports.BasicTypes = void 0;
21883
- /* eslint-disable default-case */
21884
21917
  const _typed_identifier_1 = __webpack_require__(/*! ../types/_typed_identifier */ "./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js");
21885
21918
  const Expressions = __webpack_require__(/*! ../2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
21886
21919
  const Statements = __webpack_require__(/*! ../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
@@ -26682,7 +26715,7 @@ class StringTemplate {
26682
26715
  && !(type instanceof basic_1.NumericGenericType)
26683
26716
  && !(type instanceof basic_1.NumericType)
26684
26717
  && !(type instanceof basic_1.AnyType)) {
26685
- const message = "Cannot apply ALPHA to this type";
26718
+ const message = `Cannot apply ALPHA to this type (${type.constructor.name})`;
26686
26719
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, format.getFirstToken(), message));
26687
26720
  return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
26688
26721
  }
@@ -30343,8 +30376,11 @@ class Loop {
30343
30376
  let rowType = undefined;
30344
30377
  const concat = node.concatTokens().toUpperCase();
30345
30378
  if (sourceType === undefined) {
30346
- const message = "No source type determined";
30347
- input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30379
+ // if its a dynpro table control loop, then dont issue error
30380
+ if (concat !== "LOOP.") {
30381
+ const message = "No source type determined";
30382
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
30383
+ }
30348
30384
  return;
30349
30385
  }
30350
30386
  else if (sourceType instanceof basic_1.UnknownType) {
@@ -31197,7 +31233,7 @@ class Ranges {
31197
31233
  runSyntax(node, input) {
31198
31234
  var _a;
31199
31235
  const nameToken = (_a = node.findFirstExpression(Expressions.SimpleName)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
31200
- const typeExpression = node.findFirstExpression(Expressions.FieldSub);
31236
+ const typeExpression = node.findFirstExpression(Expressions.SimpleFieldChain2);
31201
31237
  if (typeExpression === undefined) {
31202
31238
  throw new assert_error_1.AssertError("Ranges, unexpected node");
31203
31239
  }
@@ -33937,7 +33973,13 @@ exports.ArtifactsABAP = ArtifactsABAP;
33937
33973
  "use strict";
33938
33974
 
33939
33975
  Object.defineProperty(exports, "__esModule", ({ value: true }));
33940
- exports.FlowGraph = void 0;
33976
+ exports.FlowGraph = exports.FLOW_EDGE_TYPE = void 0;
33977
+ var FLOW_EDGE_TYPE;
33978
+ (function (FLOW_EDGE_TYPE) {
33979
+ FLOW_EDGE_TYPE["true"] = "true";
33980
+ FLOW_EDGE_TYPE["false"] = "false";
33981
+ FLOW_EDGE_TYPE["undefined"] = "undefined";
33982
+ })(FLOW_EDGE_TYPE || (exports.FLOW_EDGE_TYPE = FLOW_EDGE_TYPE = {}));
33941
33983
  class FlowGraph {
33942
33984
  constructor(counter) {
33943
33985
  this.edges = {};
@@ -33948,14 +33990,17 @@ class FlowGraph {
33948
33990
  getStart() {
33949
33991
  return this.startNode;
33950
33992
  }
33993
+ getLabel() {
33994
+ return this.label;
33995
+ }
33951
33996
  getEnd() {
33952
33997
  return this.endNode;
33953
33998
  }
33954
- addEdge(from, to) {
33999
+ addEdge(from, to, type) {
33955
34000
  if (this.edges[from] === undefined) {
33956
34001
  this.edges[from] = {};
33957
34002
  }
33958
- this.edges[from][to] = true;
34003
+ this.edges[from][to] = type;
33959
34004
  }
33960
34005
  removeEdge(from, to) {
33961
34006
  if (this.edges[from] === undefined) {
@@ -33970,7 +34015,7 @@ class FlowGraph {
33970
34015
  const list = [];
33971
34016
  for (const from of Object.keys(this.edges)) {
33972
34017
  for (const to of Object.keys(this.edges[from])) {
33973
- list.push({ from, to });
34018
+ list.push({ from, to, type: this.edges[from][to] });
33974
34019
  }
33975
34020
  }
33976
34021
  return list;
@@ -33999,12 +34044,12 @@ class FlowGraph {
33999
34044
  return Object.keys(this.edges).length > 0;
34000
34045
  }
34001
34046
  /** return value: end node of to graph */
34002
- addGraph(from, to) {
34047
+ addGraph(from, to, type) {
34003
34048
  if (to.hasEdges() === false) {
34004
34049
  return from;
34005
34050
  }
34006
- this.addEdge(from, to.getStart());
34007
- to.listEdges().forEach(e => this.addEdge(e.from, e.to));
34051
+ this.addEdge(from, to.getStart(), type);
34052
+ to.listEdges().forEach(e => this.addEdge(e.from, e.to, e.type));
34008
34053
  return to.getEnd();
34009
34054
  }
34010
34055
  toJSON() {
@@ -34013,7 +34058,8 @@ class FlowGraph {
34013
34058
  toTextEdges() {
34014
34059
  let graph = "";
34015
34060
  for (const l of this.listEdges()) {
34016
- graph += `"${l.from}" -> "${l.to}";\n`;
34061
+ const label = l.type === FLOW_EDGE_TYPE.undefined ? "" : ` [label="${l.type}"]`;
34062
+ graph += `"${l.from}" -> "${l.to}"${label};\n`;
34017
34063
  }
34018
34064
  return graph.trim();
34019
34065
  }
@@ -34031,22 +34077,22 @@ ${this.toTextEdges()}
34031
34077
  }`;
34032
34078
  }
34033
34079
  listSources(node) {
34034
- const set = new Set();
34080
+ const set = [];
34035
34081
  for (const l of this.listEdges()) {
34036
34082
  if (node === l.to) {
34037
- set.add(l.from);
34083
+ set.push({ name: l.from, type: l.type });
34038
34084
  }
34039
34085
  }
34040
- return Array.from(set.values());
34086
+ return set;
34041
34087
  }
34042
34088
  listTargets(node) {
34043
- const set = new Set();
34089
+ const set = [];
34044
34090
  for (const l of this.listEdges()) {
34045
34091
  if (node === l.from) {
34046
- set.add(l.to);
34092
+ set.push({ name: l.to, type: l.type });
34047
34093
  }
34048
34094
  }
34049
- return Array.from(set.values());
34095
+ return set;
34050
34096
  }
34051
34097
  /** removes all nodes containing "#" that have one in-going and one out-going edge */
34052
34098
  reduce() {
@@ -34059,20 +34105,30 @@ ${this.toTextEdges()}
34059
34105
  if (sources.length > 0 && targets.length > 0) {
34060
34106
  // hash node in the middle of the graph
34061
34107
  for (const s of sources) {
34062
- this.removeEdge(s, node);
34108
+ this.removeEdge(s.name, node);
34063
34109
  }
34064
34110
  for (const t of targets) {
34065
- this.removeEdge(node, t);
34111
+ this.removeEdge(node, t.name);
34066
34112
  }
34067
34113
  for (const s of sources) {
34068
34114
  for (const t of targets) {
34069
- this.addEdge(s, t);
34115
+ let type = FLOW_EDGE_TYPE.undefined;
34116
+ if (s.type !== FLOW_EDGE_TYPE.undefined) {
34117
+ type = s.type;
34118
+ }
34119
+ if (t.type !== FLOW_EDGE_TYPE.undefined) {
34120
+ if (type !== FLOW_EDGE_TYPE.undefined) {
34121
+ throw new Error("reduce: cannot merge, different edge types");
34122
+ }
34123
+ type = t.type;
34124
+ }
34125
+ this.addEdge(s.name, t.name, type);
34070
34126
  }
34071
34127
  }
34072
34128
  }
34073
34129
  if (node.startsWith("end#") && sources.length === 0) {
34074
34130
  for (const t of targets) {
34075
- this.removeEdge(node, t);
34131
+ this.removeEdge(node, t.name);
34076
34132
  }
34077
34133
  }
34078
34134
  }
@@ -34084,6 +34140,42 @@ exports.FlowGraph = FlowGraph;
34084
34140
 
34085
34141
  /***/ }),
34086
34142
 
34143
+ /***/ "./node_modules/@abaplint/core/build/src/abap/flow/selection_events.js":
34144
+ /*!*****************************************************************************!*\
34145
+ !*** ./node_modules/@abaplint/core/build/src/abap/flow/selection_events.js ***!
34146
+ \*****************************************************************************/
34147
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
34148
+
34149
+ "use strict";
34150
+
34151
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
34152
+ exports.DECLARATION_STUFF = exports.SELECTION_EVENTS = void 0;
34153
+ const Statements = __webpack_require__(/*! ../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
34154
+ exports.SELECTION_EVENTS = [
34155
+ Statements.StartOfSelection,
34156
+ Statements.AtSelectionScreen,
34157
+ Statements.AtLineSelection,
34158
+ Statements.AtUserCommand,
34159
+ Statements.EndOfSelection,
34160
+ Statements.Initialization,
34161
+ Statements.TopOfPage,
34162
+ Statements.LoadOfProgram,
34163
+ Statements.EndOfPage,
34164
+ ];
34165
+ exports.DECLARATION_STUFF = [
34166
+ Statements.Data,
34167
+ Statements.DataBegin,
34168
+ Statements.Constant,
34169
+ Statements.Tables,
34170
+ Statements.Include, // this is not super correct, but anyhow
34171
+ Statements.Parameter,
34172
+ Statements.SelectionScreen,
34173
+ Statements.ConstantBegin,
34174
+ ];
34175
+ //# sourceMappingURL=selection_events.js.map
34176
+
34177
+ /***/ }),
34178
+
34087
34179
  /***/ "./node_modules/@abaplint/core/build/src/abap/flow/statement_flow.js":
34088
34180
  /*!***************************************************************************!*\
34089
34181
  !*** ./node_modules/@abaplint/core/build/src/abap/flow/statement_flow.js ***!
@@ -34099,32 +34191,91 @@ const Structures = __webpack_require__(/*! ../3_structures/structures */ "./node
34099
34191
  const Statements = __webpack_require__(/*! ../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
34100
34192
  const Expressions = __webpack_require__(/*! ../2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
34101
34193
  const flow_graph_1 = __webpack_require__(/*! ./flow_graph */ "./node_modules/@abaplint/core/build/src/abap/flow/flow_graph.js");
34194
+ const objects_1 = __webpack_require__(/*! ../../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
34195
+ const selection_events_1 = __webpack_require__(/*! ./selection_events */ "./node_modules/@abaplint/core/build/src/abap/flow/selection_events.js");
34102
34196
  class StatementFlow {
34103
34197
  constructor() {
34104
34198
  this.counter = 0;
34105
34199
  }
34106
- build(stru) {
34107
- var _a, _b;
34200
+ build(stru, obj) {
34201
+ var _a, _b, _c, _d;
34108
34202
  const ret = [];
34109
- const forms = stru.findAllStructures(Structures.Form);
34110
- for (const f of forms) {
34111
- const formName = "FORM " + ((_a = f.findFirstExpression(Expressions.FormName)) === null || _a === void 0 ? void 0 : _a.concatTokens());
34112
- this.counter = 1;
34113
- const graph = this.traverseBody(this.findBody(f), { procedureEnd: "end#1" });
34114
- graph.setLabel(formName);
34115
- ret.push(graph);
34116
- }
34117
- const methods = stru.findAllStructures(Structures.Method);
34118
- for (const f of methods) {
34119
- const methodName = "METHOD " + ((_b = f.findFirstExpression(Expressions.MethodName)) === null || _b === void 0 ? void 0 : _b.concatTokens());
34120
- this.counter = 1;
34121
- const graph = this.traverseBody(this.findBody(f), { procedureEnd: "end#1" });
34122
- graph.setLabel(methodName);
34123
- ret.push(graph);
34203
+ let name = "";
34204
+ const structures = stru.findAllStructuresMulti([
34205
+ Structures.Form, Structures.ClassImplementation, Structures.FunctionModule, Structures.Module
34206
+ ]);
34207
+ for (const s of structures) {
34208
+ if (s.get() instanceof Structures.Form) {
34209
+ name = "FORM " + ((_a = s.findFirstExpression(Expressions.FormName)) === null || _a === void 0 ? void 0 : _a.concatTokens());
34210
+ ret.push(this.run(s, name));
34211
+ }
34212
+ else if (s.get() instanceof Structures.ClassImplementation) {
34213
+ const className = (_b = s.findFirstExpression(Expressions.ClassName)) === null || _b === void 0 ? void 0 : _b.concatTokens();
34214
+ for (const method of s.findDirectStructures(Structures.Method)) {
34215
+ const methodName = (_c = method.findFirstExpression(Expressions.MethodName)) === null || _c === void 0 ? void 0 : _c.concatTokens();
34216
+ name = "METHOD " + methodName + ", CLASS " + className;
34217
+ ret.push(this.run(method, name));
34218
+ }
34219
+ }
34220
+ else if (s.get() instanceof Structures.FunctionModule) {
34221
+ name = "FUNCTION " + ((_d = s.findFirstExpression(Expressions.Field)) === null || _d === void 0 ? void 0 : _d.concatTokens());
34222
+ ret.push(this.run(s, name));
34223
+ }
34224
+ else if (s.get() instanceof Structures.Module) {
34225
+ name = s.getFirstStatement().concatTokens().toUpperCase();
34226
+ ret.push(this.run(s, name));
34227
+ }
34228
+ else {
34229
+ throw new Error("StatementFlow, unknown structure");
34230
+ }
34231
+ }
34232
+ if (obj instanceof objects_1.Program) {
34233
+ // find the top level events
34234
+ let inEvent = false;
34235
+ let collected = [];
34236
+ for (const s of stru.getChildren() || []) {
34237
+ if (selection_events_1.SELECTION_EVENTS.some(f => s.get() instanceof f)) {
34238
+ if (inEvent === true) {
34239
+ ret.push(this.runEvent(collected, name));
34240
+ }
34241
+ collected = [];
34242
+ inEvent = true;
34243
+ name = s.concatTokens();
34244
+ }
34245
+ else if (s.get() instanceof Structures.Normal) {
34246
+ collected.push(s);
34247
+ }
34248
+ else {
34249
+ if (inEvent === true) {
34250
+ ret.push(this.runEvent(collected, name));
34251
+ inEvent = false;
34252
+ }
34253
+ collected = [];
34254
+ }
34255
+ }
34256
+ if (inEvent === true) {
34257
+ ret.push(this.runEvent(collected, name));
34258
+ }
34259
+ else if (collected.length > 0) {
34260
+ // implicit START-OF-SELECTION
34261
+ ret.push(this.runEvent(collected, "START-OF-SELECTION."));
34262
+ }
34124
34263
  }
34125
34264
  return ret.map(f => f.reduce());
34126
34265
  }
34127
34266
  ////////////////////
34267
+ runEvent(s, name) {
34268
+ this.counter = 1;
34269
+ const graph = this.traverseBody(s, { procedureEnd: "end#1" });
34270
+ graph.setLabel(name);
34271
+ return graph;
34272
+ }
34273
+ run(s, name) {
34274
+ this.counter = 1;
34275
+ const graph = this.traverseBody(this.findBody(s), { procedureEnd: "end#1" });
34276
+ graph.setLabel(name);
34277
+ return graph;
34278
+ }
34128
34279
  findBody(f) {
34129
34280
  var _a;
34130
34281
  return ((_a = f.findDirectStructure(Structures.Body)) === null || _a === void 0 ? void 0 : _a.getChildren()) || [];
@@ -34153,7 +34304,7 @@ class StatementFlow {
34153
34304
  traverseBody(children, context) {
34154
34305
  const graph = new flow_graph_1.FlowGraph(this.counter++);
34155
34306
  if (children.length === 0) {
34156
- graph.addEdge(graph.getStart(), graph.getEnd());
34307
+ graph.addEdge(graph.getStart(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34157
34308
  return graph;
34158
34309
  }
34159
34310
  let current = graph.getStart();
@@ -34162,44 +34313,44 @@ class StatementFlow {
34162
34313
  const firstChild = c.getFirstChild(); // "Normal" only has one child
34163
34314
  if (firstChild instanceof nodes_1.StatementNode) {
34164
34315
  const name = this.buildName(firstChild);
34165
- graph.addEdge(current, name);
34316
+ graph.addEdge(current, name, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34166
34317
  current = name;
34167
34318
  if (firstChild.get() instanceof Statements.Check) {
34168
34319
  if (context.loopStart) {
34169
- graph.addEdge(name, context.loopStart);
34320
+ graph.addEdge(name, context.loopStart, flow_graph_1.FLOW_EDGE_TYPE.false);
34170
34321
  }
34171
34322
  else {
34172
- graph.addEdge(name, context.procedureEnd);
34323
+ graph.addEdge(name, context.procedureEnd, flow_graph_1.FLOW_EDGE_TYPE.false);
34173
34324
  }
34174
34325
  }
34175
34326
  else if (firstChild.get() instanceof Statements.Assert) {
34176
- graph.addEdge(name, context.procedureEnd);
34327
+ graph.addEdge(name, context.procedureEnd, flow_graph_1.FLOW_EDGE_TYPE.false);
34177
34328
  }
34178
34329
  else if (firstChild.get() instanceof Statements.Continue && context.loopStart) {
34179
- graph.addEdge(name, context.loopStart);
34330
+ graph.addEdge(name, context.loopStart, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34180
34331
  return graph;
34181
34332
  }
34182
34333
  else if (firstChild.get() instanceof Statements.Exit) {
34183
34334
  if (context.loopEnd) {
34184
- graph.addEdge(name, context.loopEnd);
34335
+ graph.addEdge(name, context.loopEnd, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34185
34336
  }
34186
34337
  else {
34187
- graph.addEdge(name, context.procedureEnd);
34338
+ graph.addEdge(name, context.procedureEnd, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34188
34339
  }
34189
34340
  return graph;
34190
34341
  }
34191
34342
  else if (firstChild.get() instanceof Statements.Return) {
34192
- graph.addEdge(name, context.procedureEnd);
34343
+ graph.addEdge(name, context.procedureEnd, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34193
34344
  return graph;
34194
34345
  }
34195
34346
  }
34196
34347
  else if (firstChild instanceof nodes_1.StructureNode) {
34197
34348
  const sub = this.traverseStructure(firstChild, context);
34198
- current = graph.addGraph(current, sub);
34349
+ current = graph.addGraph(current, sub, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34199
34350
  }
34200
34351
  }
34201
34352
  }
34202
- graph.addEdge(current, graph.getEnd());
34353
+ graph.addEdge(current, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34203
34354
  return graph;
34204
34355
  }
34205
34356
  traverseStructure(n, context) {
@@ -34212,9 +34363,9 @@ class StatementFlow {
34212
34363
  if (type instanceof Structures.If) {
34213
34364
  const ifName = this.buildName(n.findDirectStatement(Statements.If));
34214
34365
  const sub = this.traverseBody(this.findBody(n), context);
34215
- graph.addEdge(current, ifName);
34216
- graph.addGraph(ifName, sub);
34217
- graph.addEdge(sub.getEnd(), graph.getEnd());
34366
+ graph.addEdge(current, ifName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34367
+ graph.addGraph(ifName, sub, flow_graph_1.FLOW_EDGE_TYPE.true);
34368
+ graph.addEdge(sub.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34218
34369
  current = ifName;
34219
34370
  for (const e of n.findDirectStructures(Structures.ElseIf)) {
34220
34371
  const elseifst = e.findDirectStatement(Statements.ElseIf);
@@ -34223,9 +34374,9 @@ class StatementFlow {
34223
34374
  }
34224
34375
  const elseIfName = this.buildName(elseifst);
34225
34376
  const sub = this.traverseBody(this.findBody(e), context);
34226
- graph.addEdge(current, elseIfName);
34227
- graph.addGraph(elseIfName, sub);
34228
- graph.addEdge(sub.getEnd(), graph.getEnd());
34377
+ graph.addEdge(current, elseIfName, flow_graph_1.FLOW_EDGE_TYPE.false);
34378
+ graph.addGraph(elseIfName, sub, flow_graph_1.FLOW_EDGE_TYPE.true);
34379
+ graph.addEdge(sub.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34229
34380
  current = elseIfName;
34230
34381
  }
34231
34382
  const els = n.findDirectStructure(Structures.Else);
@@ -34233,12 +34384,12 @@ class StatementFlow {
34233
34384
  if (els && elsest) {
34234
34385
  const elseName = this.buildName(elsest);
34235
34386
  const sub = this.traverseBody(this.findBody(els), context);
34236
- graph.addEdge(current, elseName);
34237
- graph.addGraph(elseName, sub);
34238
- graph.addEdge(sub.getEnd(), graph.getEnd());
34387
+ graph.addEdge(current, elseName, flow_graph_1.FLOW_EDGE_TYPE.false);
34388
+ graph.addGraph(elseName, sub, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34389
+ graph.addEdge(sub.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34239
34390
  }
34240
34391
  else {
34241
- graph.addEdge(ifName, graph.getEnd());
34392
+ graph.addEdge(ifName, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.false);
34242
34393
  }
34243
34394
  }
34244
34395
  else if (type instanceof Structures.Loop
@@ -34246,33 +34397,54 @@ class StatementFlow {
34246
34397
  || type instanceof Structures.With
34247
34398
  || type instanceof Structures.Provide
34248
34399
  || type instanceof Structures.Select
34400
+ || type instanceof Structures.LoopAtScreen
34249
34401
  || type instanceof Structures.Do) {
34250
34402
  const loopName = this.buildName(n.getFirstStatement());
34251
34403
  const sub = this.traverseBody(this.findBody(n), Object.assign(Object.assign({}, context), { loopStart: loopName, loopEnd: graph.getEnd() }));
34252
- graph.addEdge(current, loopName);
34253
- graph.addGraph(loopName, sub);
34254
- graph.addEdge(sub.getEnd(), loopName);
34255
- graph.addEdge(loopName, graph.getEnd());
34404
+ graph.addEdge(current, loopName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34405
+ graph.addGraph(loopName, sub, flow_graph_1.FLOW_EDGE_TYPE.true);
34406
+ graph.addEdge(sub.getEnd(), loopName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34407
+ graph.addEdge(loopName, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.false);
34408
+ }
34409
+ else if (type instanceof Structures.Data
34410
+ || type instanceof Structures.Constants
34411
+ || type instanceof Structures.Types) {
34412
+ // these doesnt affect control flow, so just take the first statement
34413
+ const statement = n.getFirstStatement();
34414
+ const name = this.buildName(statement);
34415
+ graph.addEdge(current, name, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34416
+ graph.addEdge(name, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34417
+ }
34418
+ else if (type instanceof Structures.AtFirst
34419
+ || type instanceof Structures.AtLast
34420
+ || type instanceof Structures.At
34421
+ || type instanceof Structures.OnChange) {
34422
+ const name = this.buildName(n.getFirstStatement());
34423
+ const body = this.traverseBody(this.findBody(n), context);
34424
+ graph.addEdge(current, name, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34425
+ graph.addGraph(name, body, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34426
+ graph.addEdge(body.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34427
+ graph.addEdge(current, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34256
34428
  }
34257
34429
  else if (type instanceof Structures.Try) {
34258
34430
  const tryName = this.buildName(n.getFirstStatement());
34259
34431
  const body = this.traverseBody(this.findBody(n), context);
34260
- graph.addEdge(current, tryName);
34261
- graph.addGraph(tryName, body);
34262
- graph.addEdge(body.getEnd(), graph.getEnd());
34432
+ graph.addEdge(current, tryName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34433
+ graph.addGraph(tryName, body, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34434
+ graph.addEdge(body.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34263
34435
  for (const c of n.findDirectStructures(Structures.Catch)) {
34264
34436
  const catchName = this.buildName(c.getFirstStatement());
34265
34437
  const catchBody = this.traverseBody(this.findBody(c), context);
34266
34438
  // TODO: this does not take exceptions into account
34267
- graph.addEdge(body.getEnd(), catchName);
34268
- graph.addGraph(catchName, catchBody);
34269
- graph.addEdge(catchBody.getEnd(), graph.getEnd());
34439
+ graph.addEdge(body.getEnd(), catchName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34440
+ graph.addGraph(catchName, catchBody, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34441
+ graph.addEdge(catchBody.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34270
34442
  }
34271
34443
  // TODO, handle CLEANUP
34272
34444
  }
34273
34445
  else if (type instanceof Structures.Case) {
34274
34446
  const caseName = this.buildName(n.getFirstStatement());
34275
- graph.addEdge(current, caseName);
34447
+ graph.addEdge(current, caseName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34276
34448
  let othersFound = false;
34277
34449
  for (const w of n.findDirectStructures(Structures.When)) {
34278
34450
  const first = w.getFirstStatement();
@@ -34284,17 +34456,17 @@ class StatementFlow {
34284
34456
  }
34285
34457
  const firstName = this.buildName(first);
34286
34458
  const sub = this.traverseBody(this.findBody(w), context);
34287
- graph.addEdge(caseName, firstName);
34288
- graph.addGraph(firstName, sub);
34289
- graph.addEdge(sub.getEnd(), graph.getEnd());
34459
+ graph.addEdge(caseName, firstName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34460
+ graph.addGraph(firstName, sub, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34461
+ graph.addEdge(sub.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34290
34462
  }
34291
34463
  if (othersFound === false) {
34292
- graph.addEdge(caseName, graph.getEnd());
34464
+ graph.addEdge(caseName, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34293
34465
  }
34294
34466
  }
34295
34467
  else if (type instanceof Structures.CaseType) {
34296
34468
  const caseName = this.buildName(n.getFirstStatement());
34297
- graph.addEdge(current, caseName);
34469
+ graph.addEdge(current, caseName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34298
34470
  let othersFound = false;
34299
34471
  for (const w of n.findDirectStructures(Structures.WhenType)) {
34300
34472
  const first = w.getFirstStatement();
@@ -34306,12 +34478,12 @@ class StatementFlow {
34306
34478
  }
34307
34479
  const firstName = this.buildName(first);
34308
34480
  const sub = this.traverseBody(this.findBody(w), context);
34309
- graph.addEdge(caseName, firstName);
34310
- graph.addGraph(firstName, sub);
34311
- graph.addEdge(sub.getEnd(), graph.getEnd());
34481
+ graph.addEdge(caseName, firstName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34482
+ graph.addGraph(firstName, sub, flow_graph_1.FLOW_EDGE_TYPE.undefined);
34483
+ graph.addEdge(sub.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34312
34484
  }
34313
34485
  if (othersFound === false) {
34314
- graph.addEdge(caseName, graph.getEnd());
34486
+ graph.addEdge(caseName, graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
34315
34487
  }
34316
34488
  }
34317
34489
  else {
@@ -35550,7 +35722,7 @@ class CharacterType extends _abstract_type_1.AbstractType {
35550
35722
  this.length = length;
35551
35723
  }
35552
35724
  cloneType(input) {
35553
- const clone = Object.assign({}, this.getAbstractTypeData()) || {};
35725
+ const clone = Object.assign({}, this.getAbstractTypeData());
35554
35726
  if (input.qualifiedName) {
35555
35727
  clone.qualifiedName = input.qualifiedName;
35556
35728
  }
@@ -40045,6 +40217,7 @@ class DDIC {
40045
40217
  switch (text) {
40046
40218
  case "DEC": // 1 <= len <= 31
40047
40219
  case "D16F": // 1 <= len <= 31
40220
+ case "D16D":
40048
40221
  case "D34F": // 1 <= len <= 31
40049
40222
  case "DF16_DEC": // 1 <= len <= 31
40050
40223
  case "DF34_DEC": // 1 <= len <= 31
@@ -40897,8 +41070,8 @@ exports.MemoryFile = MemoryFile;
40897
41070
  "use strict";
40898
41071
 
40899
41072
  Object.defineProperty(exports, "__esModule", ({ value: true }));
40900
- exports.PrettyPrinter = exports.Position = exports.CurrentScope = exports.ABAPFile = exports.RulesRunner = exports.SpaghettiScope = exports.SyntaxLogic = exports.ABAPObject = exports.Tokens = exports.ExpressionsCDS = exports.CDSParser = exports.LanguageServerTypes = exports.DDLParser = exports.NativeSQL = exports.MacroContent = exports.MacroCall = exports.applyEditList = exports.applyEditSingle = exports.SpaghettiScopeNode = exports.AbstractFile = exports.Token = exports.ScopeType = exports.BasicTypes = exports.TypedIdentifier = exports.AbstractType = exports.VirtualPosition = exports.Comment = exports.Unknown = exports.Empty = exports.Identifier = exports.Nodes = exports.Types = exports.Expressions = exports.Statements = exports.Structures = exports.SkipLogic = exports.Objects = exports.ArtifactsRules = exports.ArtifactsObjects = exports.ArtifactsABAP = exports.BuiltIn = exports.MethodLengthStats = exports.LanguageServer = exports.Registry = exports.CyclomaticComplexityStats = exports.ReferenceType = exports.Version = exports.Config = exports.Issue = exports.MemoryFile = void 0;
40901
- exports.LSPEdit = exports.RuleTag = exports.Severity = exports.Visibility = exports.Info = exports.Diagnostics = exports.Rename = void 0;
41073
+ exports.ABAPFile = exports.RulesRunner = exports.SpaghettiScope = exports.SyntaxLogic = exports.ABAPObject = exports.Tokens = exports.ExpressionsCDS = exports.CDSParser = exports.LanguageServerTypes = exports.DDLParser = exports.FLOW_EDGE_TYPE = exports.FlowGraph = exports.StatementFlow = exports.NativeSQL = exports.MacroContent = exports.MacroCall = exports.applyEditList = exports.applyEditSingle = exports.SpaghettiScopeNode = exports.AbstractFile = exports.Token = exports.ScopeType = exports.BasicTypes = exports.TypedIdentifier = exports.AbstractType = exports.VirtualPosition = exports.Comment = exports.Unknown = exports.Empty = exports.Identifier = exports.Nodes = exports.Types = exports.Expressions = exports.Statements = exports.Structures = exports.SkipLogic = exports.Objects = exports.ArtifactsRules = exports.ArtifactsObjects = exports.ArtifactsABAP = exports.BuiltIn = exports.MethodLengthStats = exports.LanguageServer = exports.Registry = exports.CyclomaticComplexityStats = exports.ReferenceType = exports.Version = exports.Config = exports.Issue = exports.MemoryFile = void 0;
41074
+ exports.LSPEdit = exports.RuleTag = exports.Severity = exports.Visibility = exports.Info = exports.Diagnostics = exports.Rename = exports.PrettyPrinter = exports.Position = exports.CurrentScope = void 0;
40902
41075
  const issue_1 = __webpack_require__(/*! ./issue */ "./node_modules/@abaplint/core/build/src/issue.js");
40903
41076
  Object.defineProperty(exports, "Issue", ({ enumerable: true, get: function () { return issue_1.Issue; } }));
40904
41077
  const config_1 = __webpack_require__(/*! ./config */ "./node_modules/@abaplint/core/build/src/config.js");
@@ -41006,6 +41179,11 @@ const diagnostics_1 = __webpack_require__(/*! ./lsp/diagnostics */ "./node_modul
41006
41179
  Object.defineProperty(exports, "Diagnostics", ({ enumerable: true, get: function () { return diagnostics_1.Diagnostics; } }));
41007
41180
  const _edit_1 = __webpack_require__(/*! ./lsp/_edit */ "./node_modules/@abaplint/core/build/src/lsp/_edit.js");
41008
41181
  Object.defineProperty(exports, "LSPEdit", ({ enumerable: true, get: function () { return _edit_1.LSPEdit; } }));
41182
+ const statement_flow_1 = __webpack_require__(/*! ./abap/flow/statement_flow */ "./node_modules/@abaplint/core/build/src/abap/flow/statement_flow.js");
41183
+ Object.defineProperty(exports, "StatementFlow", ({ enumerable: true, get: function () { return statement_flow_1.StatementFlow; } }));
41184
+ const flow_graph_1 = __webpack_require__(/*! ./abap/flow/flow_graph */ "./node_modules/@abaplint/core/build/src/abap/flow/flow_graph.js");
41185
+ Object.defineProperty(exports, "FlowGraph", ({ enumerable: true, get: function () { return flow_graph_1.FlowGraph; } }));
41186
+ Object.defineProperty(exports, "FLOW_EDGE_TYPE", ({ enumerable: true, get: function () { return flow_graph_1.FLOW_EDGE_TYPE; } }));
41009
41187
  //# sourceMappingURL=index.js.map
41010
41188
 
41011
41189
  /***/ }),
@@ -41242,8 +41420,10 @@ const _typed_identifier_1 = __webpack_require__(/*! ../abap/types/_typed_identif
41242
41420
  const _reference_1 = __webpack_require__(/*! ../abap/5_syntax/_reference */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js");
41243
41421
  const _builtin_1 = __webpack_require__(/*! ../abap/5_syntax/_builtin */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_builtin.js");
41244
41422
  const _scope_type_1 = __webpack_require__(/*! ../abap/5_syntax/_scope_type */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js");
41423
+ const objects_1 = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
41245
41424
  const types_1 = __webpack_require__(/*! ../abap/types */ "./node_modules/@abaplint/core/build/src/abap/types/index.js");
41246
41425
  const _statement_1 = __webpack_require__(/*! ../abap/2_statements/statements/_statement */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js");
41426
+ const include_graph_1 = __webpack_require__(/*! ../utils/include_graph */ "./node_modules/@abaplint/core/build/src/utils/include_graph.js");
41247
41427
  class LSPLookup {
41248
41428
  static lookup(cursor, reg, obj) {
41249
41429
  var _a, _b;
@@ -41256,7 +41436,17 @@ class LSPLookup {
41256
41436
  if (fm) {
41257
41437
  return { hover: "Function Module " + fm };
41258
41438
  }
41259
- const bottomScope = new syntax_1.SyntaxLogic(reg, obj).run().spaghetti.lookupPosition(cursor.identifier.getStart(), cursor.identifier.getFilename());
41439
+ let main = obj;
41440
+ if (obj instanceof objects_1.Program && obj.isInclude()) {
41441
+ // todo: this is slow
41442
+ const ig = new include_graph_1.IncludeGraph(reg);
41443
+ const mains = ig.listMainForInclude(cursor.identifier.getFilename());
41444
+ if (mains.length === 1) {
41445
+ // yea, well, or it has to be a popup
41446
+ main = reg.findObjectForFile(reg.getFileByName(mains[0])) || obj;
41447
+ }
41448
+ }
41449
+ const bottomScope = new syntax_1.SyntaxLogic(reg, main).run().spaghetti.lookupPosition(cursor.identifier.getStart(), cursor.identifier.getFilename());
41260
41450
  if (bottomScope === undefined) {
41261
41451
  return undefined;
41262
41452
  }
@@ -42790,11 +42980,15 @@ class LanguageServer {
42790
42980
  if (file === undefined) {
42791
42981
  return "file not found";
42792
42982
  }
42983
+ const obj = this.reg.findObjectForFile(file);
42984
+ if (obj === undefined) {
42985
+ return "obj not found";
42986
+ }
42793
42987
  const stru = file.getStructure();
42794
42988
  if (stru === undefined) {
42795
42989
  return "empty structure";
42796
42990
  }
42797
- const graphs = new statement_flow_1.StatementFlow().build(stru);
42991
+ const graphs = new statement_flow_1.StatementFlow().build(stru, obj);
42798
42992
  const wiz = graphs.map(g => g.toDigraph());
42799
42993
  return JSON.stringify(wiz);
42800
42994
  }
@@ -43659,6 +43853,45 @@ exports.AbstractObject = AbstractObject;
43659
43853
 
43660
43854
  /***/ }),
43661
43855
 
43856
+ /***/ "./node_modules/@abaplint/core/build/src/objects/_dynpros.js":
43857
+ /*!*******************************************************************!*\
43858
+ !*** ./node_modules/@abaplint/core/build/src/objects/_dynpros.js ***!
43859
+ \*******************************************************************/
43860
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
43861
+
43862
+ "use strict";
43863
+
43864
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
43865
+ exports.parseDynpros = parseDynpros;
43866
+ const xml_utils_1 = __webpack_require__(/*! ../xml_utils */ "./node_modules/@abaplint/core/build/src/xml_utils.js");
43867
+ function parseDynpros(parsed) {
43868
+ var _a, _b, _c, _d;
43869
+ const dynpros = [];
43870
+ const xmlDynpros = (_c = (_b = (_a = parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === null || _c === void 0 ? void 0 : _c.DYNPROS;
43871
+ if (xmlDynpros !== undefined) {
43872
+ for (const d of (0, xml_utils_1.xmlToArray)(xmlDynpros.item)) {
43873
+ const fields = [];
43874
+ for (const f of (0, xml_utils_1.xmlToArray)((_d = d.FIELDS) === null || _d === void 0 ? void 0 : _d.RPY_DYFATC)) {
43875
+ fields.push({
43876
+ name: f.NAME,
43877
+ type: f.TYPE,
43878
+ length: f.LENGTH,
43879
+ });
43880
+ }
43881
+ dynpros.push({
43882
+ number: d.HEADER.SCREEN,
43883
+ description: d.HEADER.DESCRIPT,
43884
+ nextScreen: d.HEADER.NEXTSCREEN,
43885
+ fields: fields,
43886
+ });
43887
+ }
43888
+ }
43889
+ return dynpros;
43890
+ }
43891
+ //# sourceMappingURL=_dynpros.js.map
43892
+
43893
+ /***/ }),
43894
+
43662
43895
  /***/ "./node_modules/@abaplint/core/build/src/objects/_unknown_object.js":
43663
43896
  /*!**************************************************************************!*\
43664
43897
  !*** ./node_modules/@abaplint/core/build/src/objects/_unknown_object.js ***!
@@ -43703,6 +43936,68 @@ exports.UnknownObject = UnknownObject;
43703
43936
 
43704
43937
  /***/ }),
43705
43938
 
43939
+ /***/ "./node_modules/@abaplint/core/build/src/objects/abap_query_functional_area.js":
43940
+ /*!*************************************************************************************!*\
43941
+ !*** ./node_modules/@abaplint/core/build/src/objects/abap_query_functional_area.js ***!
43942
+ \*************************************************************************************/
43943
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
43944
+
43945
+ "use strict";
43946
+
43947
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
43948
+ exports.ABAPQueryFunctionalArea = void 0;
43949
+ const _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ "./node_modules/@abaplint/core/build/src/objects/_abstract_object.js");
43950
+ class ABAPQueryFunctionalArea extends _abstract_object_1.AbstractObject {
43951
+ getType() {
43952
+ return "AQSG";
43953
+ }
43954
+ getAllowedNaming() {
43955
+ return {
43956
+ maxLength: 60, // todo
43957
+ allowNamespace: true,
43958
+ };
43959
+ }
43960
+ getDescription() {
43961
+ // todo
43962
+ return undefined;
43963
+ }
43964
+ }
43965
+ exports.ABAPQueryFunctionalArea = ABAPQueryFunctionalArea;
43966
+ //# sourceMappingURL=abap_query_functional_area.js.map
43967
+
43968
+ /***/ }),
43969
+
43970
+ /***/ "./node_modules/@abaplint/core/build/src/objects/abap_query_query.js":
43971
+ /*!***************************************************************************!*\
43972
+ !*** ./node_modules/@abaplint/core/build/src/objects/abap_query_query.js ***!
43973
+ \***************************************************************************/
43974
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
43975
+
43976
+ "use strict";
43977
+
43978
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
43979
+ exports.ABAPQueryQuery = void 0;
43980
+ const _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ "./node_modules/@abaplint/core/build/src/objects/_abstract_object.js");
43981
+ class ABAPQueryQuery extends _abstract_object_1.AbstractObject {
43982
+ getType() {
43983
+ return "AQQU";
43984
+ }
43985
+ getAllowedNaming() {
43986
+ return {
43987
+ maxLength: 60, // todo
43988
+ allowNamespace: true,
43989
+ };
43990
+ }
43991
+ getDescription() {
43992
+ // todo
43993
+ return undefined;
43994
+ }
43995
+ }
43996
+ exports.ABAPQueryQuery = ABAPQueryQuery;
43997
+ //# sourceMappingURL=abap_query_query.js.map
43998
+
43999
+ /***/ }),
44000
+
43706
44001
  /***/ "./node_modules/@abaplint/core/build/src/objects/activation_variant.js":
43707
44002
  /*!*****************************************************************************!*\
43708
44003
  !*** ./node_modules/@abaplint/core/build/src/objects/activation_variant.js ***!
@@ -45288,6 +45583,7 @@ class DataElement extends _abstract_object_1.AbstractObject {
45288
45583
  }
45289
45584
  getDescription() {
45290
45585
  var _a;
45586
+ this.parse();
45291
45587
  return (_a = this.parsedXML) === null || _a === void 0 ? void 0 : _a.description;
45292
45588
  }
45293
45589
  getAllowedNaming() {
@@ -45305,6 +45601,11 @@ class DataElement extends _abstract_object_1.AbstractObject {
45305
45601
  this.parse();
45306
45602
  return (_a = this.parsedXML) === null || _a === void 0 ? void 0 : _a.domname;
45307
45603
  }
45604
+ getTexts() {
45605
+ var _a;
45606
+ this.parse();
45607
+ return (_a = this.parsedXML) === null || _a === void 0 ? void 0 : _a.texts;
45608
+ }
45308
45609
  parseType(reg) {
45309
45610
  const references = [];
45310
45611
  let lookup = undefined;
@@ -45363,6 +45664,12 @@ class DataElement extends _abstract_object_1.AbstractObject {
45363
45664
  datatype: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DATATYPE,
45364
45665
  leng: dd04v === null || dd04v === void 0 ? void 0 : dd04v.LENG,
45365
45666
  decimals: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DECIMALS,
45667
+ texts: {
45668
+ short: dd04v === null || dd04v === void 0 ? void 0 : dd04v.SCRTEXT_S,
45669
+ medium: dd04v === null || dd04v === void 0 ? void 0 : dd04v.SCRTEXT_M,
45670
+ long: dd04v === null || dd04v === void 0 ? void 0 : dd04v.SCRTEXT_L,
45671
+ heading: dd04v === null || dd04v === void 0 ? void 0 : dd04v.REPTEXT,
45672
+ },
45366
45673
  };
45367
45674
  const end = Date.now();
45368
45675
  return { updated: true, runtime: end - start };
@@ -46000,18 +46307,23 @@ const _abap_object_1 = __webpack_require__(/*! ./_abap_object */ "./node_modules
46000
46307
  const types_1 = __webpack_require__(/*! ../abap/types */ "./node_modules/@abaplint/core/build/src/abap/types/index.js");
46001
46308
  const xml_utils_1 = __webpack_require__(/*! ../xml_utils */ "./node_modules/@abaplint/core/build/src/xml_utils.js");
46002
46309
  const fast_xml_parser_1 = __webpack_require__(/*! fast-xml-parser */ "./node_modules/fast-xml-parser/src/fxp.js");
46310
+ const _dynpros_1 = __webpack_require__(/*! ./_dynpros */ "./node_modules/@abaplint/core/build/src/objects/_dynpros.js");
46003
46311
  class FunctionGroup extends _abap_object_1.ABAPObject {
46004
46312
  constructor() {
46005
46313
  super(...arguments);
46006
46314
  this.includes = undefined;
46007
46315
  this.modules = undefined;
46316
+ this.description = undefined;
46317
+ this.dynpros = undefined;
46008
46318
  }
46009
46319
  getType() {
46010
46320
  return "FUGR";
46011
46321
  }
46012
46322
  getDescription() {
46013
- // todo
46014
- return undefined;
46323
+ if (this.description === undefined) {
46324
+ this.parseXML();
46325
+ }
46326
+ return this.description;
46015
46327
  }
46016
46328
  setDirty() {
46017
46329
  super.setDirty();
@@ -46024,6 +46336,12 @@ class FunctionGroup extends _abap_object_1.ABAPObject {
46024
46336
  allowNamespace: true,
46025
46337
  };
46026
46338
  }
46339
+ getDynpros() {
46340
+ if (this.dynpros === undefined) {
46341
+ this.parseXML();
46342
+ }
46343
+ return this.dynpros || [];
46344
+ }
46027
46345
  getSequencedFiles() {
46028
46346
  const main = this.getMainABAPFile();
46029
46347
  if (main === undefined) {
@@ -46125,22 +46443,24 @@ class FunctionGroup extends _abap_object_1.ABAPObject {
46125
46443
  }
46126
46444
  /////////////////////////////////
46127
46445
  parseXML() {
46128
- var _a, _b;
46446
+ var _a, _b, _c;
46129
46447
  this.includes = [];
46130
46448
  this.modules = [];
46131
46449
  const parsed = this.parseRaw2();
46132
46450
  if (parsed === undefined) {
46133
46451
  return;
46134
46452
  }
46453
+ this.description = (_a = parsed.abapGit["asx:abap"]["asx:values"]) === null || _a === void 0 ? void 0 : _a.AREAT;
46454
+ this.dynpros = (0, _dynpros_1.parseDynpros)(parsed);
46135
46455
  // INCLUDES
46136
- const includes = (_a = parsed.abapGit["asx:abap"]["asx:values"]) === null || _a === void 0 ? void 0 : _a.INCLUDES;
46456
+ const includes = (_b = parsed.abapGit["asx:abap"]["asx:values"]) === null || _b === void 0 ? void 0 : _b.INCLUDES;
46137
46457
  if (includes !== undefined) {
46138
46458
  for (const i of (0, xml_utils_1.xmlToArray)(includes.SOBJ_NAME)) {
46139
46459
  this.includes.push(i);
46140
46460
  }
46141
46461
  }
46142
46462
  // FUNCTION MODULES
46143
- const functions = (_b = parsed.abapGit["asx:abap"]["asx:values"]) === null || _b === void 0 ? void 0 : _b.FUNCTIONS;
46463
+ const functions = (_c = parsed.abapGit["asx:abap"]["asx:values"]) === null || _c === void 0 ? void 0 : _c.FUNCTIONS;
46144
46464
  for (const module of (0, xml_utils_1.xmlToArray)(functions === null || functions === void 0 ? void 0 : functions.item)) {
46145
46465
  this.modules.push(new types_1.FunctionModuleDefinition(module));
46146
46466
  }
@@ -46810,6 +47130,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
46810
47130
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
46811
47131
  };
46812
47132
  Object.defineProperty(exports, "__esModule", ({ value: true }));
47133
+ __exportStar(__webpack_require__(/*! ./abap_query_functional_area */ "./node_modules/@abaplint/core/build/src/objects/abap_query_functional_area.js"), exports);
47134
+ __exportStar(__webpack_require__(/*! ./abap_query_query */ "./node_modules/@abaplint/core/build/src/objects/abap_query_query.js"), exports);
46813
47135
  __exportStar(__webpack_require__(/*! ./activation_variant */ "./node_modules/@abaplint/core/build/src/objects/activation_variant.js"), exports);
46814
47136
  __exportStar(__webpack_require__(/*! ./api_release_state */ "./node_modules/@abaplint/core/build/src/objects/api_release_state.js"), exports);
46815
47137
  __exportStar(__webpack_require__(/*! ./application_job_catalog_entry */ "./node_modules/@abaplint/core/build/src/objects/application_job_catalog_entry.js"), exports);
@@ -48497,7 +48819,7 @@ exports.PersonalizationObject = PersonalizationObject;
48497
48819
  Object.defineProperty(exports, "__esModule", ({ value: true }));
48498
48820
  exports.Program = void 0;
48499
48821
  const _abap_object_1 = __webpack_require__(/*! ./_abap_object */ "./node_modules/@abaplint/core/build/src/objects/_abap_object.js");
48500
- const xml_utils_1 = __webpack_require__(/*! ../xml_utils */ "./node_modules/@abaplint/core/build/src/xml_utils.js");
48822
+ const _dynpros_1 = __webpack_require__(/*! ./_dynpros */ "./node_modules/@abaplint/core/build/src/objects/_dynpros.js");
48501
48823
  class Program extends _abap_object_1.ABAPObject {
48502
48824
  getType() {
48503
48825
  return "PROG";
@@ -48533,11 +48855,10 @@ class Program extends _abap_object_1.ABAPObject {
48533
48855
  }
48534
48856
  getDynpros() {
48535
48857
  this.parseXML();
48536
- return this.parsedXML.dynpros;
48858
+ return this.parsedXML.dynpros || [];
48537
48859
  }
48538
48860
  ////////////////////////////
48539
48861
  parseXML() {
48540
- var _a, _b, _c, _d;
48541
48862
  if (this.parsedXML !== undefined) {
48542
48863
  return;
48543
48864
  }
@@ -48551,24 +48872,7 @@ class Program extends _abap_object_1.ABAPObject {
48551
48872
  };
48552
48873
  return;
48553
48874
  }
48554
- const dynpros = [];
48555
- const xmlDynpros = (_c = (_b = (_a = parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === null || _c === void 0 ? void 0 : _c.DYNPROS;
48556
- if (xmlDynpros !== undefined) {
48557
- for (const d of (0, xml_utils_1.xmlToArray)(xmlDynpros.item)) {
48558
- const fields = [];
48559
- for (const f of (0, xml_utils_1.xmlToArray)((_d = d.FIELDS) === null || _d === void 0 ? void 0 : _d.RPY_DYFATC)) {
48560
- fields.push({
48561
- name: f.NAME,
48562
- type: f.TYPE,
48563
- length: f.LENGTH,
48564
- });
48565
- }
48566
- dynpros.push({
48567
- number: d.HEADER.SCREEN,
48568
- fields: fields,
48569
- });
48570
- }
48571
- }
48875
+ const dynpros = (0, _dynpros_1.parseDynpros)(parsed);
48572
48876
  this.parsedXML = {
48573
48877
  isInclude: file ? file.getRaw().includes("<SUBC>I</SUBC>") : false,
48574
48878
  isModulePool: file ? file.getRaw().includes("<SUBC>M</SUBC>") : false,
@@ -49807,8 +50111,11 @@ class Table extends _abstract_object_1.AbstractObject {
49807
50111
  return "TABL";
49808
50112
  }
49809
50113
  getDescription() {
49810
- // todo
49811
- return undefined;
50114
+ var _a;
50115
+ if (this.parsedData === undefined) {
50116
+ this.parseXML();
50117
+ }
50118
+ return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.description;
49812
50119
  }
49813
50120
  getAllowedNaming() {
49814
50121
  let length = 30;
@@ -50036,7 +50343,7 @@ class Table extends _abstract_object_1.AbstractObject {
50036
50343
  }
50037
50344
  ///////////////
50038
50345
  parseXML() {
50039
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
50346
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
50040
50347
  const parsed = super.parseRaw2();
50041
50348
  if (parsed === undefined) {
50042
50349
  return;
@@ -50054,9 +50361,10 @@ class Table extends _abstract_object_1.AbstractObject {
50054
50361
  }
50055
50362
  // table category
50056
50363
  this.parsedData.tableCategory = (_f = (_e = parsed.abapGit["asx:abap"]["asx:values"]) === null || _e === void 0 ? void 0 : _e.DD02V) === null || _f === void 0 ? void 0 : _f.TABCLASS;
50057
- this.parsedData.dataClass = (_h = (_g = parsed.abapGit["asx:abap"]["asx:values"]) === null || _g === void 0 ? void 0 : _g.DD09L) === null || _h === void 0 ? void 0 : _h.TABART;
50364
+ this.parsedData.description = (_h = (_g = parsed.abapGit["asx:abap"]["asx:values"]) === null || _g === void 0 ? void 0 : _g.DD02V) === null || _h === void 0 ? void 0 : _h.DDTEXT;
50365
+ this.parsedData.dataClass = (_k = (_j = parsed.abapGit["asx:abap"]["asx:values"]) === null || _j === void 0 ? void 0 : _j.DD09L) === null || _k === void 0 ? void 0 : _k.TABART;
50058
50366
  // fields
50059
- const fields = (_j = parsed.abapGit["asx:abap"]["asx:values"]) === null || _j === void 0 ? void 0 : _j.DD03P_TABLE;
50367
+ const fields = (_l = parsed.abapGit["asx:abap"]["asx:values"]) === null || _l === void 0 ? void 0 : _l.DD03P_TABLE;
50060
50368
  for (const field of (0, xml_utils_1.xmlToArray)(fields === null || fields === void 0 ? void 0 : fields.DD03P)) {
50061
50369
  this.parsedData.fields.push({
50062
50370
  FIELDNAME: field.FIELDNAME,
@@ -51341,7 +51649,7 @@ class Registry {
51341
51649
  }
51342
51650
  static abaplintVersion() {
51343
51651
  // magic, see build script "version.sh"
51344
- return "2.112.10";
51652
+ return "2.113.6";
51345
51653
  }
51346
51654
  getDDICReferences() {
51347
51655
  return this.ddicReferences;
@@ -51979,6 +52287,111 @@ exports.Abapdoc = Abapdoc;
51979
52287
 
51980
52288
  /***/ }),
51981
52289
 
52290
+ /***/ "./node_modules/@abaplint/core/build/src/rules/add_test_attributes.js":
52291
+ /*!****************************************************************************!*\
52292
+ !*** ./node_modules/@abaplint/core/build/src/rules/add_test_attributes.js ***!
52293
+ \****************************************************************************/
52294
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
52295
+
52296
+ "use strict";
52297
+
52298
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
52299
+ exports.AddTestAttributes = exports.AddTestAttributesConf = void 0;
52300
+ const issue_1 = __webpack_require__(/*! ../issue */ "./node_modules/@abaplint/core/build/src/issue.js");
52301
+ const _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ "./node_modules/@abaplint/core/build/src/rules/_abap_rule.js");
52302
+ const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js");
52303
+ const Statements = __webpack_require__(/*! ../abap/2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
52304
+ const Structures = __webpack_require__(/*! ../abap/3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
52305
+ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/core/build/src/rules/_irule.js");
52306
+ class AddTestAttributesConf extends _basic_rule_config_1.BasicRuleConfig {
52307
+ }
52308
+ exports.AddTestAttributesConf = AddTestAttributesConf;
52309
+ class AddTestAttributes extends _abap_rule_1.ABAPRule {
52310
+ constructor() {
52311
+ super(...arguments);
52312
+ this.conf = new AddTestAttributesConf();
52313
+ }
52314
+ getMetadata() {
52315
+ return {
52316
+ key: "add_test_attributes",
52317
+ title: "Add test attributes for tests classes with test methods",
52318
+ shortDescription: `Add test attributes DURATION and RISK LEVEL for tests classes with test methods`,
52319
+ tags: [_irule_1.RuleTag.SingleFile],
52320
+ badExample: `CLASS ltcl_test1 DEFINITION FINAL FOR TESTING.
52321
+ PUBLIC SECTION.
52322
+ PROTECTED SECTION.
52323
+ PRIVATE SECTION.
52324
+ METHODS test FOR TESTING RAISING cx_static_check.
52325
+ ENDCLASS.
52326
+
52327
+ CLASS ltcl_test1 IMPLEMENTATION.
52328
+ METHOD test.
52329
+ ENDMETHOD.
52330
+ ENDCLASS.`,
52331
+ goodExample: `CLASS ltcl_test2 DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
52332
+ PUBLIC SECTION.
52333
+ PROTECTED SECTION.
52334
+ PRIVATE SECTION.
52335
+ METHODS test FOR TESTING RAISING cx_static_check.
52336
+ ENDCLASS.
52337
+
52338
+ CLASS ltcl_test2 IMPLEMENTATION.
52339
+ METHOD test.
52340
+ ENDMETHOD.
52341
+ ENDCLASS.`,
52342
+ };
52343
+ }
52344
+ getConfig() {
52345
+ return this.conf;
52346
+ }
52347
+ setConfig(conf) {
52348
+ this.conf = conf;
52349
+ }
52350
+ runParsed(file) {
52351
+ const issues = [];
52352
+ const stru = file.getStructure();
52353
+ if (stru === undefined) {
52354
+ return [];
52355
+ }
52356
+ for (const classStructure of stru.findAllStructures(Structures.ClassDefinition)) {
52357
+ const cdef = classStructure.findFirstStatement(Statements.ClassDefinition);
52358
+ if (cdef === undefined) {
52359
+ continue;
52360
+ }
52361
+ const cdefConcat = cdef === null || cdef === void 0 ? void 0 : cdef.concatTokens().toUpperCase();
52362
+ if ((cdefConcat === null || cdefConcat === void 0 ? void 0 : cdefConcat.includes(" FOR TESTING")) === false) {
52363
+ continue;
52364
+ }
52365
+ const hasDuration = cdefConcat === null || cdefConcat === void 0 ? void 0 : cdefConcat.includes(" DURATION ");
52366
+ const hasRiskLevel = cdefConcat === null || cdefConcat === void 0 ? void 0 : cdefConcat.includes(" RISK LEVEL ");
52367
+ if (hasDuration === true && hasRiskLevel === true) {
52368
+ continue;
52369
+ }
52370
+ let hasTestMethod = false;
52371
+ for (const mdef of classStructure.findAllStatements(Statements.MethodDef)) {
52372
+ const concat = mdef.concatTokens().toUpperCase();
52373
+ if (concat.includes(" FOR TESTING")) {
52374
+ hasTestMethod = true;
52375
+ }
52376
+ }
52377
+ if (hasTestMethod === false) {
52378
+ continue;
52379
+ }
52380
+ if (hasDuration === false) {
52381
+ issues.push(issue_1.Issue.atStatement(file, cdef, "Add DURATION", this.getMetadata().key, this.getConfig().severity));
52382
+ }
52383
+ if (hasRiskLevel === false) {
52384
+ issues.push(issue_1.Issue.atStatement(file, cdef, "Add RISK LEVEL", this.getMetadata().key, this.getConfig().severity));
52385
+ }
52386
+ }
52387
+ return issues;
52388
+ }
52389
+ }
52390
+ exports.AddTestAttributes = AddTestAttributes;
52391
+ //# sourceMappingURL=add_test_attributes.js.map
52392
+
52393
+ /***/ }),
52394
+
51982
52395
  /***/ "./node_modules/@abaplint/core/build/src/rules/align_parameters.js":
51983
52396
  /*!*************************************************************************!*\
51984
52397
  !*** ./node_modules/@abaplint/core/build/src/rules/align_parameters.js ***!
@@ -53389,7 +53802,6 @@ class CDSLegacyView {
53389
53802
  key: "cds_legacy_view",
53390
53803
  title: "CDS Legacy View",
53391
53804
  shortDescription: `Identify CDS Legacy Views`,
53392
- // eslint-disable-next-line max-len
53393
53805
  extendedInformation: `Use DEFINE VIEW ENTITY instead of DEFINE VIEW
53394
53806
 
53395
53807
  https://blogs.sap.com/2021/10/16/a-new-generation-of-cds-views-how-to-migrate-your-cds-views-to-cds-view-entities/
@@ -59403,6 +59815,100 @@ exports.EasyToFindMessages = EasyToFindMessages;
59403
59815
 
59404
59816
  /***/ }),
59405
59817
 
59818
+ /***/ "./node_modules/@abaplint/core/build/src/rules/empty_event.js":
59819
+ /*!********************************************************************!*\
59820
+ !*** ./node_modules/@abaplint/core/build/src/rules/empty_event.js ***!
59821
+ \********************************************************************/
59822
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
59823
+
59824
+ "use strict";
59825
+
59826
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
59827
+ exports.EmptyEvent = exports.EmptyEventConf = void 0;
59828
+ const issue_1 = __webpack_require__(/*! ../issue */ "./node_modules/@abaplint/core/build/src/issue.js");
59829
+ const _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ "./node_modules/@abaplint/core/build/src/rules/_abap_rule.js");
59830
+ const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js");
59831
+ const Structures = __webpack_require__(/*! ../abap/3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
59832
+ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/core/build/src/rules/_irule.js");
59833
+ const objects_1 = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
59834
+ const selection_events_1 = __webpack_require__(/*! ../abap/flow/selection_events */ "./node_modules/@abaplint/core/build/src/abap/flow/selection_events.js");
59835
+ class EmptyEventConf extends _basic_rule_config_1.BasicRuleConfig {
59836
+ }
59837
+ exports.EmptyEventConf = EmptyEventConf;
59838
+ class EmptyEvent extends _abap_rule_1.ABAPRule {
59839
+ constructor() {
59840
+ super(...arguments);
59841
+ this.conf = new EmptyEventConf();
59842
+ }
59843
+ getMetadata() {
59844
+ return {
59845
+ key: "empty_event",
59846
+ title: "Empty selection screen or list processing event block",
59847
+ shortDescription: `Empty selection screen or list processing event block`,
59848
+ extendedInformation: ``,
59849
+ tags: [_irule_1.RuleTag.SingleFile],
59850
+ badExample: `
59851
+ INITIALIZATION.
59852
+ WRITE 'hello'.
59853
+ END-OF-SELECTION.`,
59854
+ goodExample: `
59855
+ START-OF-SELECTION.
59856
+ PERFORM sdf.
59857
+ COMMIT WORK.`,
59858
+ };
59859
+ }
59860
+ getConfig() {
59861
+ return this.conf;
59862
+ }
59863
+ setConfig(conf) {
59864
+ this.conf = conf;
59865
+ }
59866
+ runParsed(file, obj) {
59867
+ const issues = [];
59868
+ if (!(obj instanceof objects_1.Program) || obj.isInclude()) {
59869
+ return issues;
59870
+ }
59871
+ const stru = file.getStructure();
59872
+ if (stru === undefined) {
59873
+ return [];
59874
+ }
59875
+ let currentEvent = undefined;
59876
+ let children = [];
59877
+ for (const s of stru.getChildren() || []) {
59878
+ if (selection_events_1.SELECTION_EVENTS.some(f => s.get() instanceof f)) {
59879
+ if (currentEvent !== undefined && children.length === 0) {
59880
+ issues.push(issue_1.Issue.atStatement(file, currentEvent, "Empty event", this.getMetadata().key, this.getConfig().severity));
59881
+ }
59882
+ children = [];
59883
+ currentEvent = s;
59884
+ }
59885
+ else if (s.get() instanceof Structures.Normal) {
59886
+ const stru = s;
59887
+ // ignore declaration stuff
59888
+ if (selection_events_1.DECLARATION_STUFF.some(d => { var _a; return ((_a = stru.getFirstStatement()) === null || _a === void 0 ? void 0 : _a.get()) instanceof d; })) {
59889
+ continue;
59890
+ }
59891
+ children.push(s);
59892
+ }
59893
+ else {
59894
+ if (currentEvent !== undefined && children.length === 0) {
59895
+ issues.push(issue_1.Issue.atStatement(file, currentEvent, "Empty event", this.getMetadata().key, this.getConfig().severity));
59896
+ }
59897
+ children = [];
59898
+ currentEvent = undefined;
59899
+ }
59900
+ }
59901
+ if (currentEvent !== undefined && children.length === 0) {
59902
+ issues.push(issue_1.Issue.atStatement(file, currentEvent, "Empty event", this.getMetadata().key, this.getConfig().severity));
59903
+ }
59904
+ return issues;
59905
+ }
59906
+ }
59907
+ exports.EmptyEvent = EmptyEvent;
59908
+ //# sourceMappingURL=empty_event.js.map
59909
+
59910
+ /***/ }),
59911
+
59406
59912
  /***/ "./node_modules/@abaplint/core/build/src/rules/empty_line_in_statement.js":
59407
59913
  /*!********************************************************************************!*\
59408
59914
  !*** ./node_modules/@abaplint/core/build/src/rules/empty_line_in_statement.js ***!
@@ -61769,6 +62275,109 @@ exports.ImplementMethods = ImplementMethods;
61769
62275
 
61770
62276
  /***/ }),
61771
62277
 
62278
+ /***/ "./node_modules/@abaplint/core/build/src/rules/implicit_start_of_selection.js":
62279
+ /*!************************************************************************************!*\
62280
+ !*** ./node_modules/@abaplint/core/build/src/rules/implicit_start_of_selection.js ***!
62281
+ \************************************************************************************/
62282
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
62283
+
62284
+ "use strict";
62285
+
62286
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
62287
+ exports.ImplicitStartOfSelection = exports.ImplicitStartOfSelectionConf = void 0;
62288
+ const issue_1 = __webpack_require__(/*! ../issue */ "./node_modules/@abaplint/core/build/src/issue.js");
62289
+ const _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ "./node_modules/@abaplint/core/build/src/rules/_abap_rule.js");
62290
+ const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js");
62291
+ const Structures = __webpack_require__(/*! ../abap/3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
62292
+ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/core/build/src/rules/_irule.js");
62293
+ const objects_1 = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
62294
+ const nodes_1 = __webpack_require__(/*! ../abap/nodes */ "./node_modules/@abaplint/core/build/src/abap/nodes/index.js");
62295
+ const selection_events_1 = __webpack_require__(/*! ../abap/flow/selection_events */ "./node_modules/@abaplint/core/build/src/abap/flow/selection_events.js");
62296
+ class ImplicitStartOfSelectionConf extends _basic_rule_config_1.BasicRuleConfig {
62297
+ }
62298
+ exports.ImplicitStartOfSelectionConf = ImplicitStartOfSelectionConf;
62299
+ class ImplicitStartOfSelection extends _abap_rule_1.ABAPRule {
62300
+ constructor() {
62301
+ super(...arguments);
62302
+ this.conf = new ImplicitStartOfSelectionConf();
62303
+ }
62304
+ getMetadata() {
62305
+ return {
62306
+ key: "implicit_start_of_selection",
62307
+ title: "Implicit START-OF-SELECTION",
62308
+ shortDescription: `Add explicit selection screen event handling`,
62309
+ extendedInformation: `Only runs for executable programs
62310
+
62311
+ https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapstart-of-selection.htm`,
62312
+ tags: [_irule_1.RuleTag.SingleFile],
62313
+ badExample: `REPORT zfoo.
62314
+ WRITE 'hello'.`,
62315
+ goodExample: `
62316
+ START-OF-SELECTION.
62317
+ WRITE 'hello'.`,
62318
+ };
62319
+ }
62320
+ getConfig() {
62321
+ return this.conf;
62322
+ }
62323
+ setConfig(conf) {
62324
+ this.conf = conf;
62325
+ }
62326
+ runParsed(file, obj) {
62327
+ const issues = [];
62328
+ if (!(obj instanceof objects_1.Program) || obj.isInclude()) {
62329
+ return issues;
62330
+ }
62331
+ const stru = file.getStructure();
62332
+ if (stru === undefined) {
62333
+ return [];
62334
+ }
62335
+ let inEvent = false;
62336
+ let collected = [];
62337
+ for (const s of stru.getChildren() || []) {
62338
+ if (selection_events_1.SELECTION_EVENTS.some(f => s.get() instanceof f)) {
62339
+ if (inEvent === false && collected.length > 0) {
62340
+ // implicit START-OF-SELECTION
62341
+ let first = collected[0];
62342
+ if (first instanceof nodes_1.StructureNode) {
62343
+ first = first.getFirstStatement();
62344
+ }
62345
+ issues.push(issue_1.Issue.atStatement(file, first, "Implicit START-OF-SELECTION", this.getMetadata().key, this.getConfig().severity));
62346
+ }
62347
+ collected = [];
62348
+ inEvent = true;
62349
+ }
62350
+ else if (s.get() instanceof Structures.Normal) {
62351
+ const stru = s;
62352
+ // ignore declaration stuff
62353
+ if (selection_events_1.DECLARATION_STUFF.some(d => { var _a; return ((_a = stru.getFirstStatement()) === null || _a === void 0 ? void 0 : _a.get()) instanceof d; })) {
62354
+ continue;
62355
+ }
62356
+ collected.push(s);
62357
+ }
62358
+ else {
62359
+ if (inEvent === true) {
62360
+ inEvent = false;
62361
+ }
62362
+ collected = [];
62363
+ }
62364
+ }
62365
+ if (inEvent === false && collected.length > 0) {
62366
+ // implicit START-OF-SELECTION
62367
+ let first = collected[0];
62368
+ if (first instanceof nodes_1.StructureNode) {
62369
+ first = first.getFirstStatement();
62370
+ }
62371
+ issues.push(issue_1.Issue.atStatement(file, first, "Implicit START-OF-SELECTION", this.getMetadata().key, this.getConfig().severity));
62372
+ }
62373
+ return issues;
62374
+ }
62375
+ }
62376
+ exports.ImplicitStartOfSelection = ImplicitStartOfSelection;
62377
+ //# sourceMappingURL=implicit_start_of_selection.js.map
62378
+
62379
+ /***/ }),
62380
+
61772
62381
  /***/ "./node_modules/@abaplint/core/build/src/rules/in_statement_indentation.js":
61773
62382
  /*!*********************************************************************************!*\
61774
62383
  !*** ./node_modules/@abaplint/core/build/src/rules/in_statement_indentation.js ***!
@@ -62072,6 +62681,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
62072
62681
  Object.defineProperty(exports, "__esModule", ({ value: true }));
62073
62682
  __exportStar(__webpack_require__(/*! ./7bit_ascii */ "./node_modules/@abaplint/core/build/src/rules/7bit_ascii.js"), exports);
62074
62683
  __exportStar(__webpack_require__(/*! ./abapdoc */ "./node_modules/@abaplint/core/build/src/rules/abapdoc.js"), exports);
62684
+ __exportStar(__webpack_require__(/*! ./add_test_attributes */ "./node_modules/@abaplint/core/build/src/rules/add_test_attributes.js"), exports);
62075
62685
  __exportStar(__webpack_require__(/*! ./align_parameters */ "./node_modules/@abaplint/core/build/src/rules/align_parameters.js"), exports);
62076
62686
  __exportStar(__webpack_require__(/*! ./align_pseudo_comments */ "./node_modules/@abaplint/core/build/src/rules/align_pseudo_comments.js"), exports);
62077
62687
  __exportStar(__webpack_require__(/*! ./align_type_expressions */ "./node_modules/@abaplint/core/build/src/rules/align_type_expressions.js"), exports);
@@ -62113,6 +62723,7 @@ __exportStar(__webpack_require__(/*! ./double_space */ "./node_modules/@abaplint
62113
62723
  __exportStar(__webpack_require__(/*! ./downport */ "./node_modules/@abaplint/core/build/src/rules/downport.js"), exports);
62114
62724
  __exportStar(__webpack_require__(/*! ./dynpro_checks */ "./node_modules/@abaplint/core/build/src/rules/dynpro_checks.js"), exports);
62115
62725
  __exportStar(__webpack_require__(/*! ./easy_to_find_messages */ "./node_modules/@abaplint/core/build/src/rules/easy_to_find_messages.js"), exports);
62726
+ __exportStar(__webpack_require__(/*! ./empty_event */ "./node_modules/@abaplint/core/build/src/rules/empty_event.js"), exports);
62116
62727
  __exportStar(__webpack_require__(/*! ./empty_line_in_statement */ "./node_modules/@abaplint/core/build/src/rules/empty_line_in_statement.js"), exports);
62117
62728
  __exportStar(__webpack_require__(/*! ./empty_statement */ "./node_modules/@abaplint/core/build/src/rules/empty_statement.js"), exports);
62118
62729
  __exportStar(__webpack_require__(/*! ./empty_structure */ "./node_modules/@abaplint/core/build/src/rules/empty_structure.js"), exports);
@@ -62134,6 +62745,7 @@ __exportStar(__webpack_require__(/*! ./identical_descriptions */ "./node_modules
62134
62745
  __exportStar(__webpack_require__(/*! ./identical_form_names */ "./node_modules/@abaplint/core/build/src/rules/identical_form_names.js"), exports);
62135
62746
  __exportStar(__webpack_require__(/*! ./if_in_if */ "./node_modules/@abaplint/core/build/src/rules/if_in_if.js"), exports);
62136
62747
  __exportStar(__webpack_require__(/*! ./implement_methods */ "./node_modules/@abaplint/core/build/src/rules/implement_methods.js"), exports);
62748
+ __exportStar(__webpack_require__(/*! ./implicit_start_of_selection */ "./node_modules/@abaplint/core/build/src/rules/implicit_start_of_selection.js"), exports);
62137
62749
  __exportStar(__webpack_require__(/*! ./in_statement_indentation */ "./node_modules/@abaplint/core/build/src/rules/in_statement_indentation.js"), exports);
62138
62750
  __exportStar(__webpack_require__(/*! ./indentation */ "./node_modules/@abaplint/core/build/src/rules/indentation.js"), exports);
62139
62751
  __exportStar(__webpack_require__(/*! ./inline_data_old_versions */ "./node_modules/@abaplint/core/build/src/rules/inline_data_old_versions.js"), exports);
@@ -74420,7 +75032,7 @@ function xmlToArray(data) {
74420
75032
  if (data === undefined) {
74421
75033
  return [];
74422
75034
  }
74423
- else if (data.length) { // input data is an Array
75035
+ else if (Array.isArray(data)) {
74424
75036
  return data;
74425
75037
  }
74426
75038
  else {
@@ -87710,6 +88322,35 @@ module.exports = {
87710
88322
 
87711
88323
  /***/ }),
87712
88324
 
88325
+ /***/ "./node_modules/fast-xml-parser/src/ignoreAttributes.js":
88326
+ /*!**************************************************************!*\
88327
+ !*** ./node_modules/fast-xml-parser/src/ignoreAttributes.js ***!
88328
+ \**************************************************************/
88329
+ /***/ ((module) => {
88330
+
88331
+ function getIgnoreAttributesFn(ignoreAttributes) {
88332
+ if (typeof ignoreAttributes === 'function') {
88333
+ return ignoreAttributes
88334
+ }
88335
+ if (Array.isArray(ignoreAttributes)) {
88336
+ return (attrName) => {
88337
+ for (const pattern of ignoreAttributes) {
88338
+ if (typeof pattern === 'string' && attrName === pattern) {
88339
+ return true
88340
+ }
88341
+ if (pattern instanceof RegExp && pattern.test(attrName)) {
88342
+ return true
88343
+ }
88344
+ }
88345
+ }
88346
+ }
88347
+ return () => false
88348
+ }
88349
+
88350
+ module.exports = getIgnoreAttributesFn
88351
+
88352
+ /***/ }),
88353
+
87713
88354
  /***/ "./node_modules/fast-xml-parser/src/util.js":
87714
88355
  /*!**************************************************!*\
87715
88356
  !*** ./node_modules/fast-xml-parser/src/util.js ***!
@@ -88239,6 +88880,7 @@ function getPositionFromMatch(match) {
88239
88880
 
88240
88881
  //parse Empty Node as self closing node
88241
88882
  const buildFromOrderedJs = __webpack_require__(/*! ./orderedJs2Xml */ "./node_modules/fast-xml-parser/src/xmlbuilder/orderedJs2Xml.js");
88883
+ const getIgnoreAttributesFn = __webpack_require__(/*! ../ignoreAttributes */ "./node_modules/fast-xml-parser/src/ignoreAttributes.js")
88242
88884
 
88243
88885
  const defaultOptions = {
88244
88886
  attributeNamePrefix: '@_',
@@ -88276,11 +88918,12 @@ const defaultOptions = {
88276
88918
 
88277
88919
  function Builder(options) {
88278
88920
  this.options = Object.assign({}, defaultOptions, options);
88279
- if (this.options.ignoreAttributes || this.options.attributesGroupName) {
88921
+ if (this.options.ignoreAttributes === true || this.options.attributesGroupName) {
88280
88922
  this.isAttribute = function(/*a*/) {
88281
88923
  return false;
88282
88924
  };
88283
88925
  } else {
88926
+ this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)
88284
88927
  this.attrPrefixLen = this.options.attributeNamePrefix.length;
88285
88928
  this.isAttribute = isAttribute;
88286
88929
  }
@@ -88309,13 +88952,14 @@ Builder.prototype.build = function(jObj) {
88309
88952
  [this.options.arrayNodeName] : jObj
88310
88953
  }
88311
88954
  }
88312
- return this.j2x(jObj, 0).val;
88955
+ return this.j2x(jObj, 0, []).val;
88313
88956
  }
88314
88957
  };
88315
88958
 
88316
- Builder.prototype.j2x = function(jObj, level) {
88959
+ Builder.prototype.j2x = function(jObj, level, ajPath) {
88317
88960
  let attrStr = '';
88318
88961
  let val = '';
88962
+ const jPath = ajPath.join('.')
88319
88963
  for (let key in jObj) {
88320
88964
  if(!Object.prototype.hasOwnProperty.call(jObj, key)) continue;
88321
88965
  if (typeof jObj[key] === 'undefined') {
@@ -88338,9 +88982,9 @@ Builder.prototype.j2x = function(jObj, level) {
88338
88982
  } else if (typeof jObj[key] !== 'object') {
88339
88983
  //premitive type
88340
88984
  const attr = this.isAttribute(key);
88341
- if (attr) {
88985
+ if (attr && !this.ignoreAttributesFn(attr, jPath)) {
88342
88986
  attrStr += this.buildAttrPairStr(attr, '' + jObj[key]);
88343
- }else {
88987
+ } else if (!attr) {
88344
88988
  //tag value
88345
88989
  if (key === this.options.textNodeName) {
88346
88990
  let newval = this.options.tagValueProcessor(key, '' + jObj[key]);
@@ -88364,13 +89008,13 @@ Builder.prototype.j2x = function(jObj, level) {
88364
89008
  // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;
88365
89009
  } else if (typeof item === 'object') {
88366
89010
  if(this.options.oneListGroup){
88367
- const result = this.j2x(item, level + 1);
89011
+ const result = this.j2x(item, level + 1, ajPath.concat(key));
88368
89012
  listTagVal += result.val;
88369
89013
  if (this.options.attributesGroupName && item.hasOwnProperty(this.options.attributesGroupName)) {
88370
89014
  listTagAttr += result.attrStr
88371
89015
  }
88372
89016
  }else{
88373
- listTagVal += this.processTextOrObjNode(item, key, level)
89017
+ listTagVal += this.processTextOrObjNode(item, key, level, ajPath)
88374
89018
  }
88375
89019
  } else {
88376
89020
  if (this.options.oneListGroup) {
@@ -88395,7 +89039,7 @@ Builder.prototype.j2x = function(jObj, level) {
88395
89039
  attrStr += this.buildAttrPairStr(Ks[j], '' + jObj[key][Ks[j]]);
88396
89040
  }
88397
89041
  } else {
88398
- val += this.processTextOrObjNode(jObj[key], key, level)
89042
+ val += this.processTextOrObjNode(jObj[key], key, level, ajPath)
88399
89043
  }
88400
89044
  }
88401
89045
  }
@@ -88410,8 +89054,8 @@ Builder.prototype.buildAttrPairStr = function(attrName, val){
88410
89054
  } else return ' ' + attrName + '="' + val + '"';
88411
89055
  }
88412
89056
 
88413
- function processTextOrObjNode (object, key, level) {
88414
- const result = this.j2x(object, level + 1);
89057
+ function processTextOrObjNode (object, key, level, ajPath) {
89058
+ const result = this.j2x(object, level + 1, ajPath.concat(key));
88415
89059
  if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) {
88416
89060
  return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level);
88417
89061
  } else {
@@ -88899,6 +89543,7 @@ const util = __webpack_require__(/*! ../util */ "./node_modules/fast-xml-parser/
88899
89543
  const xmlNode = __webpack_require__(/*! ./xmlNode */ "./node_modules/fast-xml-parser/src/xmlparser/xmlNode.js");
88900
89544
  const readDocType = __webpack_require__(/*! ./DocTypeReader */ "./node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js");
88901
89545
  const toNumber = __webpack_require__(/*! strnum */ "./node_modules/strnum/strnum.js");
89546
+ const getIgnoreAttributesFn = __webpack_require__(/*! ../ignoreAttributes */ "./node_modules/fast-xml-parser/src/ignoreAttributes.js")
88902
89547
 
88903
89548
  // const regx =
88904
89549
  // '<((!\\[CDATA\\[([\\s\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\/)(NAME)\\s*>))([^<]*)'
@@ -88947,6 +89592,7 @@ class OrderedObjParser{
88947
89592
  this.readStopNodeData = readStopNodeData;
88948
89593
  this.saveTextToParentTag = saveTextToParentTag;
88949
89594
  this.addChild = addChild;
89595
+ this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)
88950
89596
  }
88951
89597
 
88952
89598
  }
@@ -89019,7 +89665,7 @@ function resolveNameSpace(tagname) {
89019
89665
  const attrsRegx = new RegExp('([^\\s=]+)\\s*(=\\s*([\'"])([\\s\\S]*?)\\3)?', 'gm');
89020
89666
 
89021
89667
  function buildAttributesMap(attrStr, jPath, tagName) {
89022
- if (!this.options.ignoreAttributes && typeof attrStr === 'string') {
89668
+ if (this.options.ignoreAttributes !== true && typeof attrStr === 'string') {
89023
89669
  // attrStr = attrStr.replace(/\r?\n/g, ' ');
89024
89670
  //attrStr = attrStr || attrStr.trim();
89025
89671
 
@@ -89028,6 +89674,9 @@ function buildAttributesMap(attrStr, jPath, tagName) {
89028
89674
  const attrs = {};
89029
89675
  for (let i = 0; i < len; i++) {
89030
89676
  const attrName = this.resolveNameSpace(matches[i][1]);
89677
+ if (this.ignoreAttributesFn(attrName, jPath)) {
89678
+ continue
89679
+ }
89031
89680
  let oldVal = matches[i][4];
89032
89681
  let aName = this.options.attributeNamePrefix + attrName;
89033
89682
  if (attrName.length) {