@abaplint/core 2.120.18 → 2.120.19

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 (32) hide show
  1. package/build/abaplint.d.ts +1 -0
  2. package/build/src/abap/2_statements/expressions/message_source.js +1 -1
  3. package/build/src/abap/2_statements/expressions/source.js +1 -1
  4. package/build/src/abap/5_syntax/expressions/message_source.js +3 -0
  5. package/build/src/abap/5_syntax/expressions/target.js +1 -1
  6. package/build/src/objects/_abap_object.js +10 -8
  7. package/build/src/objects/_dynpros.js +8 -5
  8. package/build/src/objects/authorization_check_field.js +3 -3
  9. package/build/src/objects/class.js +3 -4
  10. package/build/src/objects/data_element.js +6 -0
  11. package/build/src/objects/enhancement_implementation.js +4 -3
  12. package/build/src/objects/enhancement_spot.js +2 -2
  13. package/build/src/objects/function_group.js +20 -8
  14. package/build/src/objects/icf_service.js +4 -3
  15. package/build/src/objects/interface.js +3 -2
  16. package/build/src/objects/lock_object.js +4 -4
  17. package/build/src/objects/maintenance_and_transport_object.js +5 -5
  18. package/build/src/objects/message_class.js +5 -5
  19. package/build/src/objects/mime_object.js +5 -4
  20. package/build/src/objects/oauth2_profile.js +2 -2
  21. package/build/src/objects/program.js +3 -3
  22. package/build/src/objects/proxy_object.js +11 -12
  23. package/build/src/objects/table.js +12 -9
  24. package/build/src/objects/table_type.js +7 -4
  25. package/build/src/objects/view.js +9 -4
  26. package/build/src/objects/web_mime.js +7 -4
  27. package/build/src/registry.js +1 -1
  28. package/build/src/rules/clear_exporting_parameters.js +54 -0
  29. package/build/src/rules/remove_descriptions.js +10 -3
  30. package/build/src/rules/xml_consistency.js +40 -0
  31. package/build/src/xml_utils.js +7 -7
  32. package/package.json +1 -1
@@ -1807,6 +1807,7 @@ declare class DataElement extends AbstractObject {
1807
1807
  long?: string;
1808
1808
  heading?: string;
1809
1809
  }[] | undefined;
1810
+ getDtelMaster(): string | undefined;
1810
1811
  parseType(reg: IRegistry): AbstractType;
1811
1812
  parse(): {
1812
1813
  updated: boolean;
@@ -8,7 +8,7 @@ class MessageSource extends combi_1.Expression {
8
8
  getRunnable() {
9
9
  const msgid = (0, combi_1.seq)((0, combi_1.tok)(tokens_1.ParenLeft), _1.MessageClass, (0, combi_1.tok)(tokens_1.ParenRightW));
10
10
  const simple = (0, combi_1.seq)(_1.MessageTypeAndNumber, (0, combi_1.opt)(msgid));
11
- const mess1 = (0, combi_1.seq)("ID", _1.Source, "TYPE", _1.Source, "NUMBER", (0, combi_1.altPrio)(_1.MessageNumber, _1.Source));
11
+ const mess1 = (0, combi_1.seq)("ID", _1.SimpleSource3, "TYPE", _1.SimpleSource3, "NUMBER", (0, combi_1.altPrio)(_1.MessageNumber, _1.SimpleSource3));
12
12
  return (0, combi_1.altPrio)(simple, mess1);
13
13
  }
14
14
  }
@@ -33,7 +33,7 @@ class Source extends combi_1.Expression {
33
33
  const value = (0, combi_1.ver)(version_1.Release.v740sp02, (0, combi_1.seq)("VALUE", _1.TypeNameOrInfer, (0, combi_1.tok)(tokens_1.ParenLeftW), _1.ValueBody, rparenNoSpace, (0, combi_1.optPrio)(after)), { also: combi_1.AlsoIn.OpenABAP });
34
34
  const cond = (0, combi_1.ver)(version_1.Release.v740sp02, (0, combi_1.seq)("COND", _1.TypeNameOrInfer, (0, combi_1.tok)(tokens_1.ParenLeftW), _1.CondBody, rparenNoSpace, (0, combi_1.optPrio)(after)), { also: combi_1.AlsoIn.OpenABAP });
35
35
  const reff = (0, combi_1.ver)(version_1.Release.v740sp02, (0, combi_1.seq)("REF", _1.TypeNameOrInfer, (0, combi_1.tok)(tokens_1.ParenLeftW), Source, (0, combi_1.optPrio)("OPTIONAL"), rparen), { also: combi_1.AlsoIn.OpenABAP });
36
- const exact = (0, combi_1.ver)(version_1.Release.v740sp02, (0, combi_1.seq)("EXACT", _1.TypeNameOrInfer, (0, combi_1.tok)(tokens_1.ParenLeftW), Source, rparen, (0, combi_1.optPrio)(after)));
36
+ const exact = (0, combi_1.ver)(version_1.Release.v740sp02, (0, combi_1.seq)("EXACT", _1.TypeNameOrInfer, (0, combi_1.tok)(tokens_1.ParenLeftW), Source, rparen, (0, combi_1.optPrio)(after)), { also: combi_1.AlsoIn.OpenABAP });
37
37
  const filter = (0, combi_1.ver)(version_1.Release.v740sp08, (0, combi_1.seq)("FILTER", _1.TypeNameOrInfer, (0, combi_1.tok)(tokens_1.ParenLeftW), _1.FilterBody, rparen), { also: combi_1.AlsoIn.OpenABAP });
38
38
  const reduce = (0, combi_1.ver)(version_1.Release.v740sp08, (0, combi_1.seq)("REDUCE", _1.TypeNameOrInfer, (0, combi_1.tok)(tokens_1.ParenLeftW), _1.ReduceBody, rparen, (0, combi_1.optPrio)(after)), { also: combi_1.AlsoIn.OpenABAP });
39
39
  const prefix1 = (0, combi_1.altPrio)((0, combi_1.tok)(tokens_1.WDashW), (0, combi_1.tok)(tokens_1.WPlusW));
@@ -42,6 +42,9 @@ class MessageSource {
42
42
  for (const f of node.findDirectExpressions(Expressions.Source)) {
43
43
  source_1.Source.runSyntax(f, input);
44
44
  }
45
+ for (const f of node.findDirectExpressions(Expressions.SimpleSource3)) {
46
+ source_1.Source.runSyntax(f, input);
47
+ }
45
48
  if (node.getFirstToken().getStr().toUpperCase() === "ID") {
46
49
  const id = (_a = node.findExpressionAfterToken("ID")) === null || _a === void 0 ? void 0 : _a.concatTokens();
47
50
  let number = (_b = node.findDirectExpression(Expressions.MessageNumber)) === null || _b === void 0 ? void 0 : _b.concatTokens();
@@ -122,7 +122,7 @@ class Target {
122
122
  && !(context instanceof basic_1.VoidType)
123
123
  && !(context instanceof unknown_type_1.UnknownType)
124
124
  && !(context instanceof unknown_type_1.UnknownType)) {
125
- const message = "Not a internal table, \"[]\"";
125
+ const message = `Not an internal table, "${node.concatTokens()}"`;
126
126
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
127
127
  return basic_1.VoidType.get(_syntax_input_1.CheckSyntaxKey);
128
128
  }
@@ -98,21 +98,22 @@ class ABAPObject extends _abstract_object_1.AbstractObject {
98
98
  return this.textsTranslations;
99
99
  }
100
100
  findTexts(parsed) {
101
- var _a, _b, _c, _d, _e, _f;
102
- var _g;
101
+ var _a, _b, _c, _d, _e, _f, _g, _h;
102
+ var _j;
103
103
  this.texts = {};
104
104
  if (((_d = (_c = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : 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.TPOOL) === null || _d === void 0 ? void 0 : _d.item) === undefined) {
105
105
  return;
106
106
  }
107
- for (const t of (0, xml_utils_1.xmlToArray)(parsed.abapGit["asx:abap"]["asx:values"].TPOOL.item)) {
108
- const id = (_e = t.ID) === null || _e === void 0 ? void 0 : _e.toUpperCase();
107
+ for (const t of (0, xml_utils_1.xmlToArray)((_h = (_g = (_f = (_e = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _e === void 0 ? void 0 : _e["asx:abap"]) === null || _f === void 0 ? void 0 : _f["asx:values"]) === null || _g === void 0 ? void 0 : _g.TPOOL) === null || _h === void 0 ? void 0 : _h.item)) {
108
+ const id = typeof (t === null || t === void 0 ? void 0 : t.ID) === "string" ? t.ID.toUpperCase() : undefined;
109
109
  if (id === undefined) {
110
110
  continue;
111
111
  }
112
112
  if (id !== "R" && t.KEY === undefined) {
113
113
  continue;
114
114
  }
115
- const key = (_f = ((_g = t.KEY) !== null && _g !== void 0 ? _g : t.ID)) === null || _f === void 0 ? void 0 : _f.toUpperCase();
115
+ const rawKey = (_j = t.KEY) !== null && _j !== void 0 ? _j : t.ID;
116
+ const key = typeof rawKey === "string" ? rawKey.toUpperCase() : undefined;
116
117
  if (key === undefined) {
117
118
  continue;
118
119
  }
@@ -123,8 +124,8 @@ class ABAPObject extends _abstract_object_1.AbstractObject {
123
124
  }
124
125
  }
125
126
  findTextsTranslations(parsed) {
126
- var _a, _b, _c, _d, _e, _f;
127
- var _g;
127
+ var _a, _b, _c, _d, _e;
128
+ var _f;
128
129
  this.textsTranslations = [];
129
130
  const values = (_d = (_c = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : 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.I18N_TPOOL) === null || _d === void 0 ? void 0 : _d.item;
130
131
  if (values === undefined) {
@@ -133,7 +134,8 @@ class ABAPObject extends _abstract_object_1.AbstractObject {
133
134
  for (const langItem of (0, xml_utils_1.xmlToArray)(values)) {
134
135
  const textElements = {};
135
136
  for (const item of (0, xml_utils_1.xmlToArray)((_e = langItem.TEXTPOOL) === null || _e === void 0 ? void 0 : _e.item)) {
136
- const key = (_f = ((_g = item.KEY) !== null && _g !== void 0 ? _g : item.ID)) === null || _f === void 0 ? void 0 : _f.toUpperCase();
137
+ const rawKey = (_f = item.KEY) !== null && _f !== void 0 ? _f : item.ID;
138
+ const key = typeof rawKey === "string" ? rawKey.toUpperCase() : undefined;
137
139
  if (key !== undefined) {
138
140
  textElements[key] = { entry: (0, xml_utils_1.unescape)(item.ENTRY), maxLength: parseInt(item.LENGTH, 10) };
139
141
  }
@@ -9,11 +9,14 @@ function parseNumber(value) {
9
9
  return parseInt(value, 10);
10
10
  }
11
11
  function parseDynpros(parsed) {
12
- var _a, _b, _c, _d;
12
+ var _a, _b, _c, _d, _e, _f, _g, _h;
13
13
  const dynpros = [];
14
14
  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;
15
15
  if (xmlDynpros !== undefined) {
16
16
  for (const d of (0, xml_utils_1.xmlToArray)(xmlDynpros.item)) {
17
+ if ((d === null || d === void 0 ? void 0 : d.HEADER) === undefined) {
18
+ continue;
19
+ }
17
20
  const fields = [];
18
21
  for (const f of (0, xml_utils_1.xmlToArray)((_d = d.FIELDS) === null || _d === void 0 ? void 0 : _d.RPY_DYFATC)) {
19
22
  fields.push({
@@ -28,10 +31,10 @@ function parseDynpros(parsed) {
28
31
  });
29
32
  }
30
33
  dynpros.push({
31
- number: d.HEADER.SCREEN,
32
- description: d.HEADER.DESCRIPT,
33
- nextScreen: d.HEADER.NEXTSCREEN,
34
- type: d.HEADER.TYPE,
34
+ number: (_e = d.HEADER) === null || _e === void 0 ? void 0 : _e.SCREEN,
35
+ description: (_f = d.HEADER) === null || _f === void 0 ? void 0 : _f.DESCRIPT,
36
+ nextScreen: (_g = d.HEADER) === null || _g === void 0 ? void 0 : _g.NEXTSCREEN,
37
+ type: (_h = d.HEADER) === null || _h === void 0 ? void 0 : _h.TYPE,
35
38
  fields: fields,
36
39
  });
37
40
  }
@@ -51,7 +51,7 @@ class AuthorizationCheckField extends _abstract_object_1.AbstractObject {
51
51
  }
52
52
  }
53
53
  parse() {
54
- var _a;
54
+ var _a, _b, _c, _d, _e, _f;
55
55
  if (this.parsedXML) {
56
56
  return { updated: false, runtime: 0 };
57
57
  }
@@ -60,10 +60,10 @@ class AuthorizationCheckField extends _abstract_object_1.AbstractObject {
60
60
  const parsed = super.parseRaw2();
61
61
  if (parsed === undefined
62
62
  || parsed.abapGit === undefined
63
- || parsed.abapGit["asx:abap"]["asx:values"] === undefined) {
63
+ || ((_b = (_a = parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === undefined) {
64
64
  return { updated: false, runtime: 0 };
65
65
  }
66
- this.parsedXML.rollname = (_a = parsed.abapGit["asx:abap"]["asx:values"].AUTHX) === null || _a === void 0 ? void 0 : _a.ROLLNAME;
66
+ this.parsedXML.rollname = (_f = (_e = (_d = (_c = parsed.abapGit) === null || _c === void 0 ? void 0 : _c["asx:abap"]) === null || _d === void 0 ? void 0 : _d["asx:values"]) === null || _e === void 0 ? void 0 : _e.AUTHX) === null || _f === void 0 ? void 0 : _f.ROLLNAME;
67
67
  const end = Date.now();
68
68
  return { updated: true, runtime: end - start };
69
69
  }
@@ -88,17 +88,16 @@ class Class extends _abap_object_1.ABAPObject {
88
88
  }
89
89
  /////////////////////////
90
90
  parseXML() {
91
+ var _a, _b, _c, _d, _e;
91
92
  if (this.parsedXML !== undefined) {
92
93
  return;
93
94
  }
94
95
  this.parsedXML = {};
95
96
  const parsed = super.parseRaw2();
96
- if (parsed === undefined
97
- || parsed.abapGit["asx:abap"] === undefined
98
- || parsed.abapGit["asx:abap"]["asx:values"] === undefined) {
97
+ if (((_b = (_a = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === undefined) {
99
98
  return;
100
99
  }
101
- const vseo = parsed.abapGit["asx:abap"]["asx:values"].VSEOCLASS;
100
+ const vseo = (_e = (_d = (_c = parsed.abapGit) === null || _c === void 0 ? void 0 : _c["asx:abap"]) === null || _d === void 0 ? void 0 : _d["asx:values"]) === null || _e === void 0 ? void 0 : _e.VSEOCLASS;
102
101
  if (vseo === undefined) {
103
102
  return;
104
103
  }
@@ -83,6 +83,11 @@ class DataElement extends _abstract_object_1.AbstractObject {
83
83
  this.parse();
84
84
  return (_a = this.parsedXML) === null || _a === void 0 ? void 0 : _a.textsTranslations;
85
85
  }
86
+ getDtelMaster() {
87
+ var _a;
88
+ this.parse();
89
+ return (_a = this.parsedXML) === null || _a === void 0 ? void 0 : _a.dtelmaster;
90
+ }
86
91
  parseType(reg) {
87
92
  var _a;
88
93
  const references = [];
@@ -160,6 +165,7 @@ class DataElement extends _abstract_object_1.AbstractObject {
160
165
  datatype: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DATATYPE,
161
166
  leng: dd04v === null || dd04v === void 0 ? void 0 : dd04v.LENG,
162
167
  decimals: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DECIMALS,
168
+ dtelmaster: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DTELMASTER,
163
169
  texts: {
164
170
  short: dd04v === null || dd04v === void 0 ? void 0 : dd04v.SCRTEXT_S,
165
171
  medium: dd04v === null || dd04v === void 0 ? void 0 : dd04v.SCRTEXT_M,
@@ -27,6 +27,7 @@ class EnhancementImplementation extends _abstract_object_1.AbstractObject {
27
27
  return (_a = this.parsedXML) === null || _a === void 0 ? void 0 : _a.description;
28
28
  }
29
29
  parse() {
30
+ var _a, _b, _c, _d, _e, _f, _g, _h;
30
31
  if (this.parsedXML) {
31
32
  return { updated: false, runtime: 0 };
32
33
  }
@@ -35,11 +36,11 @@ class EnhancementImplementation extends _abstract_object_1.AbstractObject {
35
36
  const parsed = super.parseRaw2();
36
37
  if (parsed === undefined
37
38
  || parsed.abapGit === undefined
38
- || parsed.abapGit["asx:abap"]["asx:values"] === undefined) {
39
+ || ((_b = (_a = parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === undefined) {
39
40
  return { updated: false, runtime: 0 };
40
41
  }
41
- this.parsedXML.className = parsed.abapGit["asx:abap"]["asx:values"].CLASS;
42
- this.parsedXML.description = parsed.abapGit["asx:abap"]["asx:values"].SHORTTEXT;
42
+ this.parsedXML.className = (_e = (_d = (_c = parsed.abapGit) === null || _c === void 0 ? void 0 : _c["asx:abap"]) === null || _d === void 0 ? void 0 : _d["asx:values"]) === null || _e === void 0 ? void 0 : _e.CLASS;
43
+ this.parsedXML.description = (_h = (_g = (_f = parsed.abapGit) === null || _f === void 0 ? void 0 : _f["asx:abap"]) === null || _g === void 0 ? void 0 : _g["asx:values"]) === null || _h === void 0 ? void 0 : _h.SHORTTEXT;
43
44
  const end = Date.now();
44
45
  return { updated: true, runtime: end - start };
45
46
  }
@@ -29,13 +29,13 @@ class EnhancementSpot extends _abstract_object_1.AbstractObject {
29
29
  }
30
30
  /////////////////
31
31
  parseXML() {
32
- var _a, _b;
32
+ var _a, _b, _c, _d;
33
33
  const parsed = super.parseRaw2();
34
34
  if (parsed === undefined) {
35
35
  return [];
36
36
  }
37
37
  const ret = [];
38
- for (const b of (0, xml_utils_1.xmlToArray)((_b = (_a = parsed.abapGit["asx:abap"]["asx:values"]) === null || _a === void 0 ? void 0 : _a.BADI_DATA) === null || _b === void 0 ? void 0 : _b.ENH_BADI_DATA)) {
38
+ for (const b of (0, xml_utils_1.xmlToArray)((_d = (_c = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : 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.BADI_DATA) === null || _d === void 0 ? void 0 : _d.ENH_BADI_DATA)) {
39
39
  ret.push({
40
40
  name: b.BADI_NAME,
41
41
  interface: b.INTERFACE_NAME,
@@ -139,33 +139,45 @@ class FunctionGroup extends _abap_object_1.ABAPObject {
139
139
  if (found === undefined) {
140
140
  return {};
141
141
  }
142
- const parsed = new fast_xml_parser_1.XMLParser({ parseTagValue: false, ignoreAttributes: true, trimValues: false }).parse(found.getRaw());
143
- this.findTexts(parsed);
142
+ try {
143
+ const parsed = new fast_xml_parser_1.XMLParser({ parseTagValue: false, ignoreAttributes: true, trimValues: false }).parse(found.getRaw());
144
+ this.findTexts(parsed);
145
+ }
146
+ catch (_b) {
147
+ this.texts = {};
148
+ }
144
149
  }
145
150
  return (_a = this.texts["I"]) !== null && _a !== void 0 ? _a : {};
146
151
  }
147
152
  /////////////////////////////////
148
153
  parseXML() {
149
- var _a, _b, _c;
154
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
150
155
  this.includes = [];
151
156
  this.modules = [];
152
157
  const parsed = this.parseRaw2();
153
158
  if (parsed === undefined) {
154
159
  return;
155
160
  }
156
- this.description = (_a = parsed.abapGit["asx:abap"]["asx:values"]) === null || _a === void 0 ? void 0 : _a.AREAT;
161
+ this.description = (_c = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : 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.AREAT;
157
162
  this.dynpros = (0, _dynpros_1.parseDynpros)(parsed);
158
163
  // INCLUDES
159
- const includes = (_b = parsed.abapGit["asx:abap"]["asx:values"]) === null || _b === void 0 ? void 0 : _b.INCLUDES;
164
+ const includes = (_f = (_e = (_d = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _d === void 0 ? void 0 : _d["asx:abap"]) === null || _e === void 0 ? void 0 : _e["asx:values"]) === null || _f === void 0 ? void 0 : _f.INCLUDES;
160
165
  if (includes !== undefined) {
161
166
  for (const i of (0, xml_utils_1.xmlToArray)(includes.SOBJ_NAME)) {
162
- this.includes.push(i);
167
+ if (typeof i === "string") {
168
+ this.includes.push(i);
169
+ }
163
170
  }
164
171
  }
165
172
  // FUNCTION MODULES
166
- const functions = (_c = parsed.abapGit["asx:abap"]["asx:values"]) === null || _c === void 0 ? void 0 : _c.FUNCTIONS;
173
+ const functions = (_j = (_h = (_g = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _g === void 0 ? void 0 : _g["asx:abap"]) === null || _h === void 0 ? void 0 : _h["asx:values"]) === null || _j === void 0 ? void 0 : _j.FUNCTIONS;
167
174
  for (const module of (0, xml_utils_1.xmlToArray)(functions === null || functions === void 0 ? void 0 : functions.item)) {
168
- this.modules.push(new types_1.FunctionModuleDefinition(module));
175
+ try {
176
+ this.modules.push(new types_1.FunctionModuleDefinition(module));
177
+ }
178
+ catch (_k) {
179
+ // Ignore malformed function module metadata.
180
+ }
169
181
  }
170
182
  }
171
183
  findTextFile() {
@@ -32,6 +32,7 @@ class ICFService extends _abstract_object_1.AbstractObject {
32
32
  return (_a = this.parsedXML) === null || _a === void 0 ? void 0 : _a.handlers;
33
33
  }
34
34
  parse() {
35
+ var _a, _b, _c, _d, _e, _f, _g, _h;
35
36
  if (this.parsedXML) {
36
37
  return { updated: false, runtime: 0 };
37
38
  }
@@ -40,17 +41,17 @@ class ICFService extends _abstract_object_1.AbstractObject {
40
41
  const parsed = super.parseRaw2();
41
42
  if (parsed === undefined
42
43
  || parsed.abapGit === undefined
43
- || parsed.abapGit["asx:abap"]["asx:values"] === undefined) {
44
+ || ((_b = (_a = parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === undefined) {
44
45
  return { updated: false, runtime: 0 };
45
46
  }
46
- const table = parsed.abapGit["asx:abap"]["asx:values"].ICFHANDLER_TABLE;
47
+ const table = (_e = (_d = (_c = parsed.abapGit) === null || _c === void 0 ? void 0 : _c["asx:abap"]) === null || _d === void 0 ? void 0 : _d["asx:values"]) === null || _e === void 0 ? void 0 : _e.ICFHANDLER_TABLE;
47
48
  this.parsedXML.handlers = [];
48
49
  for (const h of (0, xml_utils_1.xmlToArray)(table)) {
49
50
  if (h.ICFHANDLER !== undefined) {
50
51
  this.parsedXML.handlers.push(h.ICFHANDLER.ICFHANDLER);
51
52
  }
52
53
  }
53
- this.parsedXML.url = parsed.abapGit["asx:abap"]["asx:values"].URL;
54
+ this.parsedXML.url = (_h = (_g = (_f = parsed.abapGit) === null || _f === void 0 ? void 0 : _f["asx:abap"]) === null || _g === void 0 ? void 0 : _g["asx:values"]) === null || _h === void 0 ? void 0 : _h.URL;
54
55
  const end = Date.now();
55
56
  return { updated: true, runtime: end - start };
56
57
  }
@@ -55,16 +55,17 @@ class Interface extends _abap_object_1.ABAPObject {
55
55
  }
56
56
  /////////////////////////
57
57
  parseXML() {
58
+ var _a, _b, _c, _d, _e;
58
59
  if (this.parsedXML !== undefined) {
59
60
  return;
60
61
  }
61
62
  this.parsedXML = {};
62
63
  const parsed = super.parseRaw2();
63
64
  if (parsed === undefined
64
- || parsed.abapGit["asx:abap"]["asx:values"] === undefined) {
65
+ || ((_b = (_a = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === undefined) {
65
66
  return;
66
67
  }
67
- const vseo = parsed.abapGit["asx:abap"]["asx:values"].VSEOINTERF;
68
+ const vseo = (_e = (_d = (_c = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _c === void 0 ? void 0 : _c["asx:abap"]) === null || _d === void 0 ? void 0 : _d["asx:values"]) === null || _e === void 0 ? void 0 : _e.VSEOINTERF;
68
69
  if (vseo === undefined) {
69
70
  this.parsedXML.description = "";
70
71
  this.parsedXML.name = "";
@@ -48,7 +48,7 @@ class LockObject extends _abstract_object_1.AbstractObject {
48
48
  }
49
49
  }
50
50
  parse() {
51
- var _a, _b;
51
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
52
52
  if (this.parsedXML) {
53
53
  return { updated: false, runtime: 0 };
54
54
  }
@@ -57,11 +57,11 @@ class LockObject extends _abstract_object_1.AbstractObject {
57
57
  const parsed = super.parseRaw2();
58
58
  if (parsed === undefined
59
59
  || parsed.abapGit === undefined
60
- || parsed.abapGit["asx:abap"]["asx:values"] === undefined) {
60
+ || ((_b = (_a = parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === undefined) {
61
61
  return { updated: false, runtime: 0 };
62
62
  }
63
- this.parsedXML.primaryTable = (_a = parsed.abapGit["asx:abap"]["asx:values"].DD25V) === null || _a === void 0 ? void 0 : _a.ROOTTAB;
64
- this.parsedXML.description = (_b = parsed.abapGit["asx:abap"]["asx:values"].DD25V) === null || _b === void 0 ? void 0 : _b.DDTEXT;
63
+ this.parsedXML.primaryTable = (_f = (_e = (_d = (_c = parsed.abapGit) === null || _c === void 0 ? void 0 : _c["asx:abap"]) === null || _d === void 0 ? void 0 : _d["asx:values"]) === null || _e === void 0 ? void 0 : _e.DD25V) === null || _f === void 0 ? void 0 : _f.ROOTTAB;
64
+ this.parsedXML.description = (_k = (_j = (_h = (_g = parsed.abapGit) === null || _g === void 0 ? void 0 : _g["asx:abap"]) === null || _h === void 0 ? void 0 : _h["asx:values"]) === null || _j === void 0 ? void 0 : _j.DD25V) === null || _k === void 0 ? void 0 : _k.DDTEXT;
65
65
  const end = Date.now();
66
66
  return { updated: true, runtime: end - start };
67
67
  }
@@ -64,7 +64,7 @@ class MaintenanceAndTransportObject extends _abstract_object_1.AbstractObject {
64
64
  }
65
65
  }
66
66
  parse() {
67
- var _a, _b, _c, _d;
67
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
68
68
  if (this.parsedXML) {
69
69
  return { updated: false, runtime: 0 };
70
70
  }
@@ -73,12 +73,12 @@ class MaintenanceAndTransportObject extends _abstract_object_1.AbstractObject {
73
73
  const parsed = super.parseRaw2();
74
74
  if (parsed === undefined
75
75
  || parsed.abapGit === undefined
76
- || parsed.abapGit["asx:abap"]["asx:values"] === undefined) {
76
+ || ((_b = (_a = parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === undefined) {
77
77
  return { updated: false, runtime: 0 };
78
78
  }
79
- this.parsedXML.area = (_b = (_a = parsed.abapGit["asx:abap"]["asx:values"].TOBJ) === null || _a === void 0 ? void 0 : _a.TVDIR) === null || _b === void 0 ? void 0 : _b.AREA;
80
- this.parsedXML.objectName = (_c = parsed.abapGit["asx:abap"]["asx:values"].OBJH) === null || _c === void 0 ? void 0 : _c.OBJECTNAME;
81
- this.parsedXML.objectType = (_d = parsed.abapGit["asx:abap"]["asx:values"].OBJH) === null || _d === void 0 ? void 0 : _d.OBJECTTYPE;
79
+ this.parsedXML.area = (_g = (_f = (_e = (_d = (_c = parsed.abapGit) === null || _c === void 0 ? void 0 : _c["asx:abap"]) === null || _d === void 0 ? void 0 : _d["asx:values"]) === null || _e === void 0 ? void 0 : _e.TOBJ) === null || _f === void 0 ? void 0 : _f.TVDIR) === null || _g === void 0 ? void 0 : _g.AREA;
80
+ this.parsedXML.objectName = (_l = (_k = (_j = (_h = parsed.abapGit) === null || _h === void 0 ? void 0 : _h["asx:abap"]) === null || _j === void 0 ? void 0 : _j["asx:values"]) === null || _k === void 0 ? void 0 : _k.OBJH) === null || _l === void 0 ? void 0 : _l.OBJECTNAME;
81
+ this.parsedXML.objectType = (_q = (_p = (_o = (_m = parsed.abapGit) === null || _m === void 0 ? void 0 : _m["asx:abap"]) === null || _o === void 0 ? void 0 : _o["asx:values"]) === null || _p === void 0 ? void 0 : _p.OBJH) === null || _q === void 0 ? void 0 : _q.OBJECTTYPE;
82
82
  const end = Date.now();
83
83
  return { updated: true, runtime: end - start };
84
84
  }
@@ -54,7 +54,7 @@ class MessageClass extends _abstract_object_1.AbstractObject {
54
54
  }
55
55
  /////////////////////////////////
56
56
  parseXML() {
57
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
57
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
58
58
  if (this.xml !== undefined) {
59
59
  return;
60
60
  }
@@ -68,16 +68,16 @@ class MessageClass extends _abstract_object_1.AbstractObject {
68
68
  if (parsed === undefined) {
69
69
  return;
70
70
  }
71
- this.xml.topName = (_c = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]["asx:values"]) === null || _b === void 0 ? void 0 : _b.T100A) === null || _c === void 0 ? void 0 : _c.ARBGB;
72
- this.xml.description = (_f = (_e = (_d = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _d === void 0 ? void 0 : _d["asx:abap"]["asx:values"]) === null || _e === void 0 ? void 0 : _e.T100A) === null || _f === void 0 ? void 0 : _f.STEXT;
73
- const t100 = (_h = (_g = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _g === void 0 ? void 0 : _g["asx:abap"]["asx:values"]) === null || _h === void 0 ? void 0 : _h.T100;
71
+ this.xml.topName = (_d = (_c = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : 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.T100A) === null || _d === void 0 ? void 0 : _d.ARBGB;
72
+ this.xml.description = (_h = (_g = (_f = (_e = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _e === void 0 ? void 0 : _e["asx:abap"]) === null || _f === void 0 ? void 0 : _f["asx:values"]) === null || _g === void 0 ? void 0 : _g.T100A) === null || _h === void 0 ? void 0 : _h.STEXT;
73
+ const t100 = (_l = (_k = (_j = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _j === void 0 ? void 0 : _j["asx:abap"]) === null || _k === void 0 ? void 0 : _k["asx:values"]) === null || _l === void 0 ? void 0 : _l.T100;
74
74
  if (t100 === undefined) {
75
75
  return;
76
76
  }
77
77
  for (const msg of (0, xml_utils_1.xmlToArray)(t100.T100)) {
78
78
  this.xml.parsedMessages.push(new message_1.Message(msg.MSGNR, (0, xml_utils_1.unescape)(msg.TEXT), msg.ARBGB));
79
79
  }
80
- const t100_texts = (_k = (_j = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _j === void 0 ? void 0 : _j["asx:abap"]["asx:values"]) === null || _k === void 0 ? void 0 : _k.T100_TEXTS;
80
+ const t100_texts = (_p = (_o = (_m = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _m === void 0 ? void 0 : _m["asx:abap"]) === null || _o === void 0 ? void 0 : _o["asx:values"]) === null || _p === void 0 ? void 0 : _p.T100_TEXTS;
81
81
  if (t100_texts === undefined) {
82
82
  return;
83
83
  }
@@ -44,6 +44,7 @@ class MIMEObject extends _abstract_object_1.AbstractObject {
44
44
  return undefined;
45
45
  }
46
46
  parse() {
47
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
47
48
  if (this.parsedXML) {
48
49
  return { updated: false, runtime: 0 };
49
50
  }
@@ -52,12 +53,12 @@ class MIMEObject extends _abstract_object_1.AbstractObject {
52
53
  const parsed = super.parseRaw2();
53
54
  if (parsed === undefined
54
55
  || parsed.abapGit === undefined
55
- || parsed.abapGit["asx:abap"]["asx:values"] === undefined) {
56
+ || ((_b = (_a = parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === undefined) {
56
57
  return { updated: false, runtime: 0 };
57
58
  }
58
- this.parsedXML.URL = parsed.abapGit["asx:abap"]["asx:values"].URL;
59
- this.parsedXML.CLASS = parsed.abapGit["asx:abap"]["asx:values"].CLASS;
60
- this.parsedXML.FOLDER = parsed.abapGit["asx:abap"]["asx:values"].FOLDER;
59
+ this.parsedXML.URL = (_e = (_d = (_c = parsed.abapGit) === null || _c === void 0 ? void 0 : _c["asx:abap"]) === null || _d === void 0 ? void 0 : _d["asx:values"]) === null || _e === void 0 ? void 0 : _e.URL;
60
+ this.parsedXML.CLASS = (_h = (_g = (_f = parsed.abapGit) === null || _f === void 0 ? void 0 : _f["asx:abap"]) === null || _g === void 0 ? void 0 : _g["asx:values"]) === null || _h === void 0 ? void 0 : _h.CLASS;
61
+ this.parsedXML.FOLDER = (_l = (_k = (_j = parsed.abapGit) === null || _j === void 0 ? void 0 : _j["asx:abap"]) === null || _k === void 0 ? void 0 : _k["asx:values"]) === null || _l === void 0 ? void 0 : _l.FOLDER;
61
62
  const end = Date.now();
62
63
  return { updated: true, runtime: end - start };
63
64
  }
@@ -18,10 +18,10 @@ class Oauth2Profile extends _abstract_object_1.AbstractObject {
18
18
  return undefined;
19
19
  }
20
20
  listScopes() {
21
- var _a, _b, _c;
21
+ var _a, _b, _c, _d, _e;
22
22
  const ret = [];
23
23
  const parsed = super.parseRaw2();
24
- for (const t of (0, xml_utils_1.xmlToArray)((_c = (_b = (_a = parsed.abapGit["asx:abap"]["asx:values"]) === null || _a === void 0 ? void 0 : _a.PROFILE) === null || _b === void 0 ? void 0 : _b.T_SCOPES) === null || _c === void 0 ? void 0 : _c.OA2P_SCOPES)) {
24
+ for (const t of (0, xml_utils_1.xmlToArray)((_e = (_d = (_c = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : 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.PROFILE) === null || _d === void 0 ? void 0 : _d.T_SCOPES) === null || _e === void 0 ? void 0 : _e.OA2P_SCOPES)) {
25
25
  ret.push(t.SCOPE);
26
26
  }
27
27
  return ret;
@@ -48,7 +48,7 @@ class Program extends _abap_object_1.ABAPObject {
48
48
  }
49
49
  ////////////////////////////
50
50
  parseXML() {
51
- var _a, _b, _c;
51
+ var _a, _b, _c, _d;
52
52
  if (this.parsedXML !== undefined) {
53
53
  return;
54
54
  }
@@ -66,11 +66,11 @@ class Program extends _abap_object_1.ABAPObject {
66
66
  }
67
67
  let description = "";
68
68
  const selectionTexts = {};
69
- for (const t of (0, xml_utils_1.xmlToArray)((_c = (_b = (_a = parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]["asx:values"]) === null || _b === void 0 ? void 0 : _b.TPOOL) === null || _c === void 0 ? void 0 : _c.item)) {
69
+ for (const t of (0, xml_utils_1.xmlToArray)((_d = (_c = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : 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.TPOOL) === null || _d === void 0 ? void 0 : _d.item)) {
70
70
  if ((t === null || t === void 0 ? void 0 : t.ID) === "R") {
71
71
  description = t.ENTRY ? (0, xml_utils_1.unescape)(t.ENTRY) : "";
72
72
  }
73
- else if ((t === null || t === void 0 ? void 0 : t.ID) === "S" && t.KEY !== undefined) {
73
+ else if ((t === null || t === void 0 ? void 0 : t.ID) === "S" && typeof t.KEY === "string") {
74
74
  selectionTexts[t.KEY.toUpperCase()] = { entry: t.ENTRY ? (0, xml_utils_1.unescape)(t.ENTRY) : "", maxLength: parseInt(t.LENGTH, 10) };
75
75
  }
76
76
  }
@@ -39,20 +39,19 @@ class ProxyObject extends _abstract_object_1.AbstractObject {
39
39
  return { updated: true, runtime: end - start };
40
40
  }
41
41
  parseXML() {
42
- var _a, _b;
42
+ var _a, _b, _c, _d, _e;
43
43
  const result = { proxyData: [] };
44
44
  const parsed = super.parseRaw2();
45
45
  if (parsed === undefined
46
46
  || parsed.abapGit === undefined
47
- || ((_a = parsed.abapGit["asx:abap"]) === null || _a === void 0 ? void 0 : _a["asx:values"]) === undefined) {
47
+ || ((_b = (_a = parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === undefined) {
48
48
  return result;
49
49
  }
50
- const values = parsed.abapGit["asx:abap"]["asx:values"];
51
- result.proxyData = (0, xml_utils_1.xmlToArray)((_b = values.PROXY_DATA) === null || _b === void 0 ? void 0 : _b.item);
50
+ const values = (_d = (_c = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _c === void 0 ? void 0 : _c["asx:abap"]) === null || _d === void 0 ? void 0 : _d["asx:values"];
51
+ result.proxyData = (0, xml_utils_1.xmlToArray)((_e = values.PROXY_DATA) === null || _e === void 0 ? void 0 : _e.item);
52
52
  return result;
53
53
  }
54
54
  generateABAPObjects() {
55
- var _a, _b, _c, _d, _e;
56
55
  this.parse();
57
56
  const result = [];
58
57
  if (!this.parsedXML) {
@@ -60,7 +59,7 @@ class ProxyObject extends _abstract_object_1.AbstractObject {
60
59
  }
61
60
  // Find interface definition
62
61
  const intfItem = this.parsedXML.proxyData.find(i => i.R3_TYPE === "INTF");
63
- if (!intfItem || !intfItem.R3_NAME) {
62
+ if (!intfItem || typeof intfItem.R3_NAME !== "string") {
64
63
  return result;
65
64
  }
66
65
  const intfName = intfItem.R3_NAME.toLowerCase();
@@ -69,10 +68,10 @@ class ProxyObject extends _abstract_object_1.AbstractObject {
69
68
  // Build interface code
70
69
  let code = `INTERFACE ${intfName} PUBLIC.\n`;
71
70
  for (const method of methods) {
72
- const methodName = (_a = method.R3_NAME) === null || _a === void 0 ? void 0 : _a.toLowerCase();
73
- if (!methodName) {
71
+ if (typeof method.R3_NAME !== "string") {
74
72
  continue;
75
73
  }
74
+ const methodName = method.R3_NAME.toLowerCase();
76
75
  // Find parameters for this method
77
76
  const importingParameters = this.parsedXML.proxyData.filter(i => i.R3_TYPE === "PAIM" && i.OBJ_NAME1 === method.OBJ_NAME1);
78
77
  const exportingParameters = this.parsedXML.proxyData.filter(i => i.R3_TYPE === "PAEX" && i.OBJ_NAME1 === method.OBJ_NAME1);
@@ -81,8 +80,8 @@ class ProxyObject extends _abstract_object_1.AbstractObject {
81
80
  code += ` IMPORTING\n`;
82
81
  for (let i = 0; i < importingParameters.length; i++) {
83
82
  const param = importingParameters[i];
84
- const paramName = (_b = param.OBJ_NAME2) === null || _b === void 0 ? void 0 : _b.toLowerCase();
85
- const paramType = (_c = param.OBJ_NAME_R) === null || _c === void 0 ? void 0 : _c.toLowerCase();
83
+ const paramName = typeof param.OBJ_NAME2 === "string" ? param.OBJ_NAME2.toLowerCase() : undefined;
84
+ const paramType = typeof param.OBJ_NAME_R === "string" ? param.OBJ_NAME_R.toLowerCase() : undefined;
86
85
  const isLast = i === importingParameters.length - 1 && exportingParameters.length === 0;
87
86
  code += ` ${paramName} TYPE ${paramType}${isLast ? "." : ""}\n`;
88
87
  }
@@ -91,8 +90,8 @@ class ProxyObject extends _abstract_object_1.AbstractObject {
91
90
  code += ` EXPORTING\n`;
92
91
  for (let i = 0; i < exportingParameters.length; i++) {
93
92
  const param = exportingParameters[i];
94
- const paramName = (_d = param.OBJ_NAME2) === null || _d === void 0 ? void 0 : _d.toLowerCase();
95
- const paramType = (_e = param.OBJ_NAME_R) === null || _e === void 0 ? void 0 : _e.toLowerCase();
93
+ const paramName = typeof param.OBJ_NAME2 === "string" ? param.OBJ_NAME2.toLowerCase() : undefined;
94
+ const paramType = typeof param.OBJ_NAME_R === "string" ? param.OBJ_NAME_R.toLowerCase() : undefined;
96
95
  const isLast = i === exportingParameters.length - 1;
97
96
  code += ` ${paramName} TYPE ${paramType}${isLast ? "." : ""}\n`;
98
97
  }
@@ -337,7 +337,7 @@ class Table extends _abstract_object_1.AbstractObject {
337
337
  return false;
338
338
  }
339
339
  parseXML() {
340
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
340
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4;
341
341
  const parsed = super.parseRaw2();
342
342
  if (parsed === undefined) {
343
343
  return;
@@ -347,19 +347,22 @@ class Table extends _abstract_object_1.AbstractObject {
347
347
  return;
348
348
  }
349
349
  // enhancement category
350
- if (((_b = (_a = parsed.abapGit["asx:abap"]["asx:values"]) === null || _a === void 0 ? void 0 : _a.DD02V) === null || _b === void 0 ? void 0 : _b.EXCLASS) === undefined) {
350
+ if (((_d = (_c = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : 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.DD02V) === null || _d === void 0 ? void 0 : _d.EXCLASS) === undefined) {
351
351
  this.parsedData.enhancementCategory = EnhancementCategory.NotClassified;
352
352
  }
353
353
  else {
354
- this.parsedData.enhancementCategory = (_d = (_c = parsed.abapGit["asx:abap"]["asx:values"]) === null || _c === void 0 ? void 0 : _c.DD02V) === null || _d === void 0 ? void 0 : _d.EXCLASS;
354
+ this.parsedData.enhancementCategory = (_h = (_g = (_f = (_e = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _e === void 0 ? void 0 : _e["asx:abap"]) === null || _f === void 0 ? void 0 : _f["asx:values"]) === null || _g === void 0 ? void 0 : _g.DD02V) === null || _h === void 0 ? void 0 : _h.EXCLASS;
355
355
  }
356
356
  // table category
357
- 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;
358
- 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;
359
- 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;
357
+ this.parsedData.tableCategory = (_m = (_l = (_k = (_j = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _j === void 0 ? void 0 : _j["asx:abap"]) === null || _k === void 0 ? void 0 : _k["asx:values"]) === null || _l === void 0 ? void 0 : _l.DD02V) === null || _m === void 0 ? void 0 : _m.TABCLASS;
358
+ this.parsedData.description = (_r = (_q = (_p = (_o = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _o === void 0 ? void 0 : _o["asx:abap"]) === null || _p === void 0 ? void 0 : _p["asx:values"]) === null || _q === void 0 ? void 0 : _q.DD02V) === null || _r === void 0 ? void 0 : _r.DDTEXT;
359
+ this.parsedData.dataClass = (_v = (_u = (_t = (_s = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _s === void 0 ? void 0 : _s["asx:abap"]) === null || _t === void 0 ? void 0 : _t["asx:values"]) === null || _u === void 0 ? void 0 : _u.DD09L) === null || _v === void 0 ? void 0 : _v.TABART;
360
360
  // fields
361
- const fields = (_l = parsed.abapGit["asx:abap"]["asx:values"]) === null || _l === void 0 ? void 0 : _l.DD03P_TABLE;
361
+ const fields = (_y = (_x = (_w = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _w === void 0 ? void 0 : _w["asx:abap"]) === null || _x === void 0 ? void 0 : _x["asx:values"]) === null || _y === void 0 ? void 0 : _y.DD03P_TABLE;
362
362
  for (const field of (0, xml_utils_1.xmlToArray)(fields === null || fields === void 0 ? void 0 : fields.DD03P)) {
363
+ if (typeof (field === null || field === void 0 ? void 0 : field.FIELDNAME) !== "string") {
364
+ continue;
365
+ }
363
366
  this.parsedData.fields.push({
364
367
  FIELDNAME: field.FIELDNAME,
365
368
  ROLLNAME: field.ROLLNAME,
@@ -379,13 +382,13 @@ class Table extends _abstract_object_1.AbstractObject {
379
382
  });
380
383
  }
381
384
  // secondary indexes
382
- const indexes = (_m = parsed.abapGit["asx:abap"]["asx:values"]) === null || _m === void 0 ? void 0 : _m.DD12V;
385
+ const indexes = (_1 = (_0 = (_z = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _z === void 0 ? void 0 : _z["asx:abap"]) === null || _0 === void 0 ? void 0 : _0["asx:values"]) === null || _1 === void 0 ? void 0 : _1.DD12V;
383
386
  ;
384
387
  this.parsedData.secondaryIndexes = [];
385
388
  for (const index of (0, xml_utils_1.xmlToArray)(indexes === null || indexes === void 0 ? void 0 : indexes.DD12V)) {
386
389
  const indexName = index.INDEXNAME;
387
390
  const indexFields = [];
388
- const indexFieldsXml = (_o = parsed.abapGit["asx:abap"]["asx:values"]) === null || _o === void 0 ? void 0 : _o.DD17V;
391
+ const indexFieldsXml = (_4 = (_3 = (_2 = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _2 === void 0 ? void 0 : _2["asx:abap"]) === null || _3 === void 0 ? void 0 : _3["asx:values"]) === null || _4 === void 0 ? void 0 : _4.DD17V;
389
392
  for (const indexField of (0, xml_utils_1.xmlToArray)(indexFieldsXml === null || indexFieldsXml === void 0 ? void 0 : indexFieldsXml.DD17V)) {
390
393
  if (indexField.INDEXNAME === indexName) {
391
394
  // assumption: fields are listed by POSITION in the xml
@@ -195,7 +195,7 @@ class TableType extends _abstract_object_1.AbstractObject {
195
195
  }
196
196
  ////////////////////
197
197
  parseXML() {
198
- var _a, _b;
198
+ var _a, _b, _c, _d;
199
199
  if (this.parsedXML !== undefined) {
200
200
  return;
201
201
  }
@@ -207,11 +207,14 @@ class TableType extends _abstract_object_1.AbstractObject {
207
207
  if (parsed === undefined || parsed.abapGit === undefined) {
208
208
  return;
209
209
  }
210
- const values = parsed.abapGit["asx:abap"]["asx:values"];
210
+ const values = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"];
211
211
  if (values === undefined) {
212
212
  return;
213
213
  }
214
214
  const dd40v = values.DD40V;
215
+ if (dd40v === undefined) {
216
+ return;
217
+ }
215
218
  this.parsedXML.rowtype = dd40v.ROWTYPE ? dd40v.ROWTYPE : "";
216
219
  this.parsedXML.rowkind = dd40v.ROWKIND ? dd40v.ROWKIND : "";
217
220
  this.parsedXML.datatype = dd40v.DATATYPE;
@@ -221,13 +224,13 @@ class TableType extends _abstract_object_1.AbstractObject {
221
224
  this.parsedXML.keykind = dd40v.KEYKIND;
222
225
  this.parsedXML.ddtext = dd40v.DDTEXT;
223
226
  this.parsedXML.keydef = dd40v.KEYDEF;
224
- for (const x of (0, xml_utils_1.xmlToArray)((_a = values.DD42V) === null || _a === void 0 ? void 0 : _a.DD42V)) {
227
+ for (const x of (0, xml_utils_1.xmlToArray)((_c = values.DD42V) === null || _c === void 0 ? void 0 : _c.DD42V)) {
225
228
  this.parsedXML.dd42v.push({
226
229
  keyname: x.SECKEYNAME || "",
227
230
  keyfield: x.KEYFIELD || "",
228
231
  });
229
232
  }
230
- for (const x of (0, xml_utils_1.xmlToArray)((_b = values.DD43V) === null || _b === void 0 ? void 0 : _b.DD43V)) {
233
+ for (const x of (0, xml_utils_1.xmlToArray)((_d = values.DD43V) === null || _d === void 0 ? void 0 : _d.DD43V)) {
231
234
  this.parsedXML.dd43v.push({
232
235
  keyname: x.SECKEYNAME || "",
233
236
  accessmode: x.ACCESSMODE || "",
@@ -146,7 +146,7 @@ class View extends _abstract_object_1.AbstractObject {
146
146
  }
147
147
  ///////////////
148
148
  parseXML() {
149
- var _a, _b, _c;
149
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
150
150
  this.parsedData = {
151
151
  header: {
152
152
  VIEWCLASS: "",
@@ -159,13 +159,18 @@ class View extends _abstract_object_1.AbstractObject {
159
159
  if (parsed === undefined || parsed.abapGit === undefined) {
160
160
  return;
161
161
  }
162
- const header = (_a = parsed.abapGit["asx:abap"]["asx:values"]) === null || _a === void 0 ? void 0 : _a.DD25V;
162
+ const header = (_c = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : 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.DD25V;
163
163
  this.parsedData.header = {
164
164
  VIEWCLASS: (header === null || header === void 0 ? void 0 : header.VIEWCLASS) || "",
165
165
  DDTEXT: (header === null || header === void 0 ? void 0 : header.DDTEXT) || "",
166
166
  };
167
- const fields = (_b = parsed.abapGit["asx:abap"]["asx:values"]) === null || _b === void 0 ? void 0 : _b.DD27P_TABLE;
167
+ const fields = (_f = (_e = (_d = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _d === void 0 ? void 0 : _d["asx:abap"]) === null || _e === void 0 ? void 0 : _e["asx:values"]) === null || _f === void 0 ? void 0 : _f.DD27P_TABLE;
168
168
  for (const field of (0, xml_utils_1.xmlToArray)(fields === null || fields === void 0 ? void 0 : fields.DD27P)) {
169
+ if (typeof (field === null || field === void 0 ? void 0 : field.VIEWFIELD) !== "string"
170
+ || typeof (field === null || field === void 0 ? void 0 : field.TABNAME) !== "string"
171
+ || typeof (field === null || field === void 0 ? void 0 : field.FIELDNAME) !== "string") {
172
+ continue;
173
+ }
169
174
  this.parsedData.fields.push({
170
175
  VIEWFIELD: field.VIEWFIELD,
171
176
  TABNAME: field.TABNAME,
@@ -173,7 +178,7 @@ class View extends _abstract_object_1.AbstractObject {
173
178
  KEYFLAG: field.KEYFLAG,
174
179
  });
175
180
  }
176
- const join = (_c = parsed.abapGit["asx:abap"]["asx:values"]) === null || _c === void 0 ? void 0 : _c.DD28J_TABLE;
181
+ const join = (_j = (_h = (_g = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _g === void 0 ? void 0 : _g["asx:abap"]) === null || _h === void 0 ? void 0 : _h["asx:values"]) === null || _j === void 0 ? void 0 : _j.DD28J_TABLE;
177
182
  for (const j of (0, xml_utils_1.xmlToArray)(join === null || join === void 0 ? void 0 : join.DD28J)) {
178
183
  this.parsedData.join.push({
179
184
  LTAB: j.LTAB,
@@ -43,7 +43,7 @@ class WebMIME extends _abstract_object_1.AbstractObject {
43
43
  return undefined;
44
44
  }
45
45
  parse() {
46
- var _a;
46
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
47
47
  if (this.parsedXML) {
48
48
  return { updated: false, runtime: 0 };
49
49
  }
@@ -52,11 +52,14 @@ class WebMIME extends _abstract_object_1.AbstractObject {
52
52
  const parsed = super.parseRaw2();
53
53
  if (parsed === undefined
54
54
  || parsed.abapGit === undefined
55
- || parsed.abapGit["asx:abap"]["asx:values"] === undefined) {
55
+ || ((_b = (_a = parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === undefined) {
56
56
  return { updated: false, runtime: 0 };
57
57
  }
58
- this.parsedXML.description = parsed.abapGit["asx:abap"]["asx:values"].TEXT;
59
- for (const param of (0, xml_utils_1.xmlToArray)((_a = parsed.abapGit["asx:abap"]["asx:values"].PARAMS) === null || _a === void 0 ? void 0 : _a.WWWPARAMS)) {
58
+ this.parsedXML.description = (_e = (_d = (_c = parsed.abapGit) === null || _c === void 0 ? void 0 : _c["asx:abap"]) === null || _d === void 0 ? void 0 : _d["asx:values"]) === null || _e === void 0 ? void 0 : _e.TEXT;
59
+ for (const param of (0, xml_utils_1.xmlToArray)((_j = (_h = (_g = (_f = parsed.abapGit) === null || _f === void 0 ? void 0 : _f["asx:abap"]) === null || _g === void 0 ? void 0 : _g["asx:values"]) === null || _h === void 0 ? void 0 : _h.PARAMS) === null || _j === void 0 ? void 0 : _j.WWWPARAMS)) {
60
+ if (typeof (param === null || param === void 0 ? void 0 : param.NAME) !== "string") {
61
+ continue;
62
+ }
60
63
  this.parsedXML.params[param.NAME.toLowerCase()] = param.VALUE;
61
64
  }
62
65
  const end = Date.now();
@@ -75,7 +75,7 @@ class Registry {
75
75
  }
76
76
  static abaplintVersion() {
77
77
  // magic, see build script "version.js"
78
- return "2.120.18";
78
+ return "2.120.19";
79
79
  }
80
80
  getDDICReferences() {
81
81
  return this.ddicReferences;
@@ -12,6 +12,8 @@ const objects_1 = require("../objects");
12
12
  const _reference_1 = require("../abap/5_syntax/_reference");
13
13
  const basic_1 = require("../abap/types/basic");
14
14
  const _statement_1 = require("../abap/2_statements/statements/_statement");
15
+ const statements_1 = require("../abap/2_statements/statements");
16
+ const expressions_1 = require("../abap/2_statements/expressions");
15
17
  class ClearExportingParametersConf extends _basic_rule_config_1.BasicRuleConfig {
16
18
  constructor() {
17
19
  super(...arguments);
@@ -43,6 +45,8 @@ Note: EXPORTING parameters passed by VALUE are always initialized and are theref
43
45
  Reading and writing the parameter in the same statement (e.g. "ev_result = ev_result + 1") is reported,
44
46
  as the source is evaluated before the parameter is assigned.
45
47
  Objects containing parser or syntax errors are not reported.
48
+ "IS SUPPLIED"/"IS REQUESTED" checks are not considered reads, and "GET REFERENCE OF" plus
49
+ "ASSIGN ... TO <fs>" are considered writes, as the value can be written via the reference.
46
50
 
47
51
  Class and interface method implementations and function modules are checked.`,
48
52
  tags: [_irule_1.RuleTag.Styleguide],
@@ -168,6 +172,16 @@ ENDCLASS.`,
168
172
  }
169
173
  const pos = reference.position.getStart();
170
174
  if (reference.referenceType === _reference_1.ReferenceType.DataReadReference) {
175
+ if (this.isSuppliedOrRequested(reference, obj)) {
176
+ continue; // "IS SUPPLIED" / "IS REQUESTED" does not read the value
177
+ }
178
+ if (this.isReferenceOrAssign(reference, obj)) {
179
+ // "GET REFERENCE OF" and "ASSIGN ... TO <fs>" may be used for writing the value
180
+ if (earliestWrite === undefined || pos.isBefore(earliestWrite.position.getStart())) {
181
+ earliestWrite = reference;
182
+ }
183
+ continue;
184
+ }
171
185
  if (firstRead === undefined || pos.isBefore(firstRead.position.getStart())) {
172
186
  firstRead = reference;
173
187
  }
@@ -190,6 +204,46 @@ ENDCLASS.`,
190
204
  const message = `EXPORTING parameter "${parameter.getName().toLowerCase()}" read before it is cleared or assigned`;
191
205
  return issue_1.Issue.atIdentifier(firstRead.position, message, this.getMetadata().key, this.conf.severity);
192
206
  }
207
+ isReferenceOrAssign(reference, obj) {
208
+ const file = obj.getABAPFileByName(reference.position.getFilename());
209
+ const pos = reference.position.getStart();
210
+ for (const statement of (file === null || file === void 0 ? void 0 : file.getStatements()) || []) {
211
+ const start = statement.getStart();
212
+ const end = statement.getEnd();
213
+ if (pos.equals(start) === false && (pos.isAfter(start) === false || pos.isBefore(end) === false)) {
214
+ continue;
215
+ }
216
+ const type = statement.get();
217
+ return type instanceof statements_1.GetReference || type instanceof statements_1.Assign;
218
+ }
219
+ return false;
220
+ }
221
+ isSuppliedOrRequested(reference, obj) {
222
+ const file = obj.getABAPFileByName(reference.position.getFilename());
223
+ const pos = reference.position.getStart();
224
+ for (const statement of (file === null || file === void 0 ? void 0 : file.getStatements()) || []) {
225
+ const start = statement.getStart();
226
+ const end = statement.getEnd();
227
+ if (pos.equals(start) === false && (pos.isAfter(start) === false || pos.isBefore(end) === false)) {
228
+ continue;
229
+ }
230
+ for (const compare of statement.findAllExpressionsRecursive(expressions_1.Compare)) {
231
+ const upper = compare.concatTokens().toUpperCase();
232
+ if (upper.includes(" IS SUPPLIED") === false
233
+ && upper.includes(" IS REQUESTED") === false
234
+ && upper.includes(" IS NOT SUPPLIED") === false
235
+ && upper.includes(" IS NOT REQUESTED") === false) {
236
+ continue;
237
+ }
238
+ const cStart = compare.getFirstToken().getStart();
239
+ const cEnd = compare.getLastToken().getEnd();
240
+ if ((pos.equals(cStart) || pos.isAfter(cStart)) && pos.isBefore(cEnd)) {
241
+ return true;
242
+ }
243
+ }
244
+ }
245
+ return false;
246
+ }
193
247
  statementStart(reference, obj) {
194
248
  const file = obj.getABAPFileByName(reference.position.getFilename());
195
249
  for (const statement of (file === null || file === void 0 ? void 0 : file.getStatements()) || []) {
@@ -128,11 +128,18 @@ Consider using ABAP Doc for documentation.`,
128
128
  return this.checkXML(xml, file);
129
129
  }
130
130
  checkXML(xml, file) {
131
- const parsed = new fast_xml_parser_1.XMLParser({ parseTagValue: false, ignoreAttributes: true, trimValues: false }).parse(xml);
132
- if (parsed === undefined || parsed.abapGit["asx:abap"]["asx:values"] === undefined) {
131
+ var _a, _b, _c, _d, _e;
132
+ let parsed;
133
+ try {
134
+ parsed = new fast_xml_parser_1.XMLParser({ parseTagValue: false, ignoreAttributes: true, trimValues: false }).parse(xml);
135
+ }
136
+ catch (_f) {
137
+ return [];
138
+ }
139
+ if (((_b = (_a = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _a === void 0 ? void 0 : _a["asx:abap"]) === null || _b === void 0 ? void 0 : _b["asx:values"]) === undefined) {
133
140
  return [];
134
141
  }
135
- const desc = parsed.abapGit["asx:abap"]["asx:values"].DESCRIPTIONS;
142
+ const desc = (_e = (_d = (_c = parsed === null || parsed === void 0 ? void 0 : parsed.abapGit) === null || _c === void 0 ? void 0 : _c["asx:abap"]) === null || _d === void 0 ? void 0 : _d["asx:values"]) === null || _e === void 0 ? void 0 : _e.DESCRIPTIONS;
136
143
  if (desc === undefined) {
137
144
  return [];
138
145
  }
@@ -191,6 +191,40 @@ class XMLConsistency {
191
191
  const issues = [];
192
192
  const texts = obj.getTexts();
193
193
  const maxLengths = obj.getTextMaxLengths();
194
+ const hasLabelTexts = (texts === null || texts === void 0 ? void 0 : texts.short) !== undefined
195
+ || (texts === null || texts === void 0 ? void 0 : texts.medium) !== undefined
196
+ || (texts === null || texts === void 0 ? void 0 : texts.long) !== undefined
197
+ || (texts === null || texts === void 0 ? void 0 : texts.heading) !== undefined;
198
+ if ((texts === null || texts === void 0 ? void 0 : texts.short) !== undefined) {
199
+ const issue = this.checkRequiredField(file, "SCRLEN1", maxLengths === null || maxLengths === void 0 ? void 0 : maxLengths.short);
200
+ if (issue) {
201
+ issues.push(issue);
202
+ }
203
+ }
204
+ if ((texts === null || texts === void 0 ? void 0 : texts.medium) !== undefined) {
205
+ const issue = this.checkRequiredField(file, "SCRLEN2", maxLengths === null || maxLengths === void 0 ? void 0 : maxLengths.medium);
206
+ if (issue) {
207
+ issues.push(issue);
208
+ }
209
+ }
210
+ if ((texts === null || texts === void 0 ? void 0 : texts.long) !== undefined) {
211
+ const issue = this.checkRequiredField(file, "SCRLEN3", maxLengths === null || maxLengths === void 0 ? void 0 : maxLengths.long);
212
+ if (issue) {
213
+ issues.push(issue);
214
+ }
215
+ }
216
+ if ((texts === null || texts === void 0 ? void 0 : texts.heading) !== undefined) {
217
+ const issue = this.checkRequiredField(file, "HEADLEN", maxLengths === null || maxLengths === void 0 ? void 0 : maxLengths.heading);
218
+ if (issue) {
219
+ issues.push(issue);
220
+ }
221
+ }
222
+ if (hasLabelTexts) {
223
+ const issue = this.checkRequiredField(file, "DTELMASTER", obj.getDtelMaster());
224
+ if (issue) {
225
+ issues.push(issue);
226
+ }
227
+ }
194
228
  for (const issue of [
195
229
  this.checkTextLength(file, "DDTEXT", obj.getDescription(), 60),
196
230
  this.checkTextLength(file, "SCRTEXT_S", texts === null || texts === void 0 ? void 0 : texts.short, maxLengths === null || maxLengths === void 0 ? void 0 : maxLengths.short),
@@ -218,6 +252,12 @@ class XMLConsistency {
218
252
  }
219
253
  return issues;
220
254
  }
255
+ checkRequiredField(file, fieldName, value) {
256
+ if (value === undefined || value === "") {
257
+ return issue_1.Issue.atRow(file, 1, `Missing required field ${fieldName} in DD04V`, this.getMetadata().key, this.conf.severity);
258
+ }
259
+ return undefined;
260
+ }
221
261
  runDomain(obj, file) {
222
262
  var _a, _b;
223
263
  const maxTextLength = 60;
@@ -14,14 +14,14 @@ function xmlToArray(data) {
14
14
  }
15
15
  }
16
16
  function unescape(str) {
17
- if (str === undefined) {
17
+ if (typeof str !== "string") {
18
18
  return "";
19
19
  }
20
- str = str.replace(/&amp;/g, "&");
21
- str = str.replace(/&gt;/g, ">");
22
- str = str.replace(/&lt;/g, "<");
23
- str = str.replace(/&quot;/g, "\"");
24
- str = str.replace(/&apos;/g, "'");
25
- return str;
20
+ let result = str.replace(/&amp;/g, "&");
21
+ result = result.replace(/&gt;/g, ">");
22
+ result = result.replace(/&lt;/g, "<");
23
+ result = result.replace(/&quot;/g, "\"");
24
+ result = result.replace(/&apos;/g, "'");
25
+ return result;
26
26
  }
27
27
  //# sourceMappingURL=xml_utils.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/core",
3
- "version": "2.120.18",
3
+ "version": "2.120.19",
4
4
  "description": "abaplint - Core API",
5
5
  "main": "build/src/index.js",
6
6
  "typings": "build/abaplint.d.ts",