@abaplint/core 2.120.18 → 2.120.20

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 (38) hide show
  1. package/build/abaplint.d.ts +3 -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/_current_scope.js +14 -0
  5. package/build/src/abap/5_syntax/_type_utils.js +2 -1
  6. package/build/src/abap/5_syntax/expressions/attribute_chain.js +105 -4
  7. package/build/src/abap/5_syntax/expressions/message_source.js +3 -0
  8. package/build/src/abap/5_syntax/expressions/method_call_chain.js +5 -0
  9. package/build/src/abap/5_syntax/expressions/method_source.js +7 -0
  10. package/build/src/abap/5_syntax/expressions/target.js +1 -1
  11. package/build/src/abap/types/class_definition.js +9 -0
  12. package/build/src/objects/_abap_object.js +10 -8
  13. package/build/src/objects/_dynpros.js +8 -5
  14. package/build/src/objects/authorization_check_field.js +3 -3
  15. package/build/src/objects/class.js +3 -4
  16. package/build/src/objects/data_element.js +6 -0
  17. package/build/src/objects/enhancement_implementation.js +4 -3
  18. package/build/src/objects/enhancement_spot.js +2 -2
  19. package/build/src/objects/function_group.js +20 -8
  20. package/build/src/objects/icf_service.js +4 -3
  21. package/build/src/objects/interface.js +3 -2
  22. package/build/src/objects/lock_object.js +4 -4
  23. package/build/src/objects/maintenance_and_transport_object.js +5 -5
  24. package/build/src/objects/message_class.js +5 -5
  25. package/build/src/objects/mime_object.js +5 -4
  26. package/build/src/objects/oauth2_profile.js +2 -2
  27. package/build/src/objects/program.js +3 -3
  28. package/build/src/objects/proxy_object.js +11 -12
  29. package/build/src/objects/table.js +12 -9
  30. package/build/src/objects/table_type.js +7 -4
  31. package/build/src/objects/view.js +9 -4
  32. package/build/src/objects/web_mime.js +7 -4
  33. package/build/src/registry.js +1 -1
  34. package/build/src/rules/clear_exporting_parameters.js +54 -0
  35. package/build/src/rules/remove_descriptions.js +10 -3
  36. package/build/src/rules/xml_consistency.js +40 -0
  37. package/build/src/xml_utils.js +7 -7
  38. package/package.json +4 -3
@@ -1263,6 +1263,7 @@ declare class ClassDefinition_3 extends Identifier implements IClassDefinition {
1263
1263
  private checkClassConstructorStatic;
1264
1264
  private checkInterfaceVisibility;
1265
1265
  private checkMethodsFromSuperClasses;
1266
+ private checkMethodNameConflicts;
1266
1267
  private findFriends;
1267
1268
  private addReference;
1268
1269
  private parse;
@@ -1645,6 +1646,7 @@ export declare class CurrentScope {
1645
1646
  push(stype: ScopeType, sname: string, start: Position, filename: string): void;
1646
1647
  isOO(): boolean;
1647
1648
  isAnyOO(): boolean;
1649
+ isInStaticMethod(): boolean;
1648
1650
  addLocalFriend(className: string, friendName: string): void;
1649
1651
  isLocalFriend(className: string, friendName: string): boolean;
1650
1652
  getEnclosingClassName(): string | undefined;
@@ -1807,6 +1809,7 @@ declare class DataElement extends AbstractObject {
1807
1809
  long?: string;
1808
1810
  heading?: string;
1809
1811
  }[] | undefined;
1812
+ getDtelMaster(): string | undefined;
1810
1813
  parseType(reg: IRegistry): AbstractType;
1811
1814
  parse(): {
1812
1815
  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));
@@ -462,6 +462,20 @@ class CurrentScope {
462
462
  }
463
463
  return false;
464
464
  }
465
+ isInStaticMethod() {
466
+ let curr = this.current;
467
+ while (curr !== undefined) {
468
+ const stype = curr.getIdentifier().stype;
469
+ if (stype === _scope_type_1.ScopeType.MethodInstance) {
470
+ return false;
471
+ }
472
+ else if (stype === _scope_type_1.ScopeType.ClassImplementation) {
473
+ return true;
474
+ }
475
+ curr = curr.getParent();
476
+ }
477
+ return false;
478
+ }
465
479
  addLocalFriend(className, friendName) {
466
480
  var _a;
467
481
  const key = className.toUpperCase();
@@ -510,7 +510,8 @@ class TypeUtils {
510
510
  }
511
511
  }
512
512
  else if (source instanceof basic_1.XStringType) {
513
- if (target instanceof basic_1.CLikeType
513
+ if (target instanceof basic_1.CharacterType
514
+ || target instanceof basic_1.CLikeType
514
515
  || target instanceof basic_1.IntegerType
515
516
  || target instanceof basic_1.StringType
516
517
  || target instanceof basic_1.ObjectReferenceType
@@ -1,17 +1,57 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.AttributeChain = void 0;
37
+ const nodes_1 = require("../../nodes");
38
+ const Expressions = __importStar(require("../../2_statements/expressions"));
4
39
  const void_type_1 = require("../../types/basic/void_type");
5
- const object_reference_type_1 = require("../../types/basic/object_reference_type");
40
+ const basic_1 = require("../../types/basic");
6
41
  const _object_oriented_1 = require("../_object_oriented");
7
42
  const expressions_1 = require("../../2_statements/expressions");
8
43
  const _syntax_input_1 = require("../_syntax_input");
44
+ const component_name_1 = require("./component_name");
45
+ const attribute_name_1 = require("./attribute_name");
46
+ const table_expression_1 = require("./table_expression");
47
+ const field_offset_1 = require("./field_offset");
48
+ const field_length_1 = require("./field_length");
9
49
  class AttributeChain {
10
50
  static runSyntax(inputContext, node, input, type) {
11
51
  if (inputContext instanceof void_type_1.VoidType) {
12
52
  return inputContext;
13
53
  }
14
- else if (!(inputContext instanceof object_reference_type_1.ObjectReferenceType)) {
54
+ else if (!(inputContext instanceof basic_1.ObjectReferenceType)) {
15
55
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), "Not an object reference(AttributeChain)"));
16
56
  return void_type_1.VoidType.get(_syntax_input_1.CheckSyntaxKey);
17
57
  }
@@ -41,8 +81,69 @@ class AttributeChain {
41
81
  for (const t of type) {
42
82
  input.scope.addReference(nameToken, context, t, input.filename);
43
83
  }
44
- // todo, loop, handle ArrowOrDash, ComponentName, TableExpression
45
- return context.getType();
84
+ let contextType = context.getType();
85
+ const children = node.getChildren();
86
+ for (let i = 1; i < children.length; i++) {
87
+ const child = children[i];
88
+ if (contextType instanceof void_type_1.VoidType || contextType instanceof basic_1.UnknownType) {
89
+ return contextType;
90
+ }
91
+ else if (child.get() instanceof Expressions.ArrowOrDash) {
92
+ const operator = child.getFirstToken().getStr();
93
+ if (operator === "-" && !(contextType instanceof basic_1.StructureType)) {
94
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, child.getFirstToken(), "AttributeChain, not a structure"));
95
+ return void_type_1.VoidType.get(_syntax_input_1.CheckSyntaxKey);
96
+ }
97
+ else if ((operator === "->" || operator === "=>")
98
+ && !(contextType instanceof basic_1.ObjectReferenceType)
99
+ && !(contextType instanceof basic_1.DataReference)) {
100
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, child.getFirstToken(), "AttributeChain, not a reference"));
101
+ return void_type_1.VoidType.get(_syntax_input_1.CheckSyntaxKey);
102
+ }
103
+ }
104
+ else if (child.get() instanceof Expressions.ComponentName) {
105
+ if (contextType instanceof basic_1.ObjectReferenceType || contextType instanceof basic_1.DataReference) {
106
+ contextType = attribute_name_1.AttributeName.runSyntax(contextType, child, input, type);
107
+ }
108
+ else {
109
+ contextType = component_name_1.ComponentName.runSyntax(contextType, child, input);
110
+ }
111
+ }
112
+ else if (child.getFirstToken().getStr() === "*" && contextType instanceof basic_1.DataReference) {
113
+ contextType = contextType.getType();
114
+ }
115
+ else if (child instanceof nodes_1.ExpressionNode && child.get() instanceof Expressions.TableExpression) {
116
+ if (!(contextType instanceof basic_1.TableType)) {
117
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, child.getFirstToken(), "Table expression, expected table"));
118
+ return void_type_1.VoidType.get(_syntax_input_1.CheckSyntaxKey);
119
+ }
120
+ table_expression_1.TableExpression.runSyntax(child, input, contextType);
121
+ contextType = contextType.getRowType();
122
+ }
123
+ else if (child instanceof nodes_1.ExpressionNode && child.get() instanceof Expressions.FieldOffset) {
124
+ const offset = field_offset_1.FieldOffset.runSyntax(child, input);
125
+ if (offset !== undefined) {
126
+ if (contextType instanceof basic_1.CharacterType) {
127
+ contextType = new basic_1.CharacterType(contextType.getLength() - offset);
128
+ }
129
+ else if (contextType instanceof basic_1.HexType) {
130
+ contextType = new basic_1.HexType(contextType.getLength() - offset);
131
+ }
132
+ }
133
+ }
134
+ else if (child instanceof nodes_1.ExpressionNode && child.get() instanceof Expressions.FieldLength) {
135
+ const length = field_length_1.FieldLength.runSyntax(child, input);
136
+ if (length !== undefined) {
137
+ if (contextType instanceof basic_1.CharacterType) {
138
+ contextType = new basic_1.CharacterType(length);
139
+ }
140
+ else if (contextType instanceof basic_1.HexType) {
141
+ contextType = new basic_1.HexType(length);
142
+ }
143
+ }
144
+ }
145
+ }
146
+ return contextType;
46
147
  }
47
148
  }
48
149
  exports.AttributeChain = AttributeChain;
@@ -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();
@@ -90,6 +90,11 @@ class MethodCallChain {
90
90
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, methodToken, message));
91
91
  return basic_1.VoidType.get(_syntax_input_1.CheckSyntaxKey);
92
92
  }
93
+ if (current === first && (method === null || method === void 0 ? void 0 : method.isStatic()) === false && input.scope.isInStaticMethod() === true) {
94
+ const message = "Method \"" + methodName + "\" not static";
95
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, methodToken, message));
96
+ return basic_1.VoidType.get(_syntax_input_1.CheckSyntaxKey);
97
+ }
93
98
  const voidedName = context instanceof basic_1.VoidType ? context.getVoided() : undefined;
94
99
  const extra = helper.methodReferenceExtras(foundDef, className || voidedName);
95
100
  input.scope.addReference(methodToken, method, _reference_1.ReferenceType.MethodReference, input.filename, extra);
@@ -59,9 +59,11 @@ class MethodSource {
59
59
  throw new assert_error_1.AssertError("MethodSource, first child expected");
60
60
  }
61
61
  let context = this.findTop(first, input, children);
62
+ let implicitMe = false;
62
63
  if (context === undefined) {
63
64
  context = (_a = input.scope.findVariable("me")) === null || _a === void 0 ? void 0 : _a.getType();
64
65
  children.unshift(first);
66
+ implicitMe = true;
65
67
  }
66
68
  if (input.scope.getLanguageVersion() === version_1.LanguageVersion.Cloud
67
69
  && first.get() instanceof Expressions.Dynamic
@@ -121,6 +123,11 @@ class MethodSource {
121
123
  const def = input.scope.findObjectDefinition(className);
122
124
  // eslint-disable-next-line prefer-const
123
125
  let { method, def: foundDef } = helper.searchMethodName(def, methodName);
126
+ if (implicitMe && current === first && (method === null || method === void 0 ? void 0 : method.isStatic()) === false && input.scope.isInStaticMethod() === true) {
127
+ const message = "Method \"" + methodName + "\" not static";
128
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, methodToken, message));
129
+ return basic_1.VoidType.get(_syntax_input_1.CheckSyntaxKey);
130
+ }
124
131
  if (method === undefined && (methodName === null || methodName === void 0 ? void 0 : methodName.toUpperCase()) === "CONSTRUCTOR") {
125
132
  context = basic_1.VoidType.get("CONSTRUCTOR"); // todo, this is a workaround, constructors always exists
126
133
  }
@@ -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
  }
@@ -97,6 +97,7 @@ class ClassDefinition extends _identifier_1.Identifier {
97
97
  // perform checks after everything has been initialized
98
98
  this.checkInterfaceVisibility(input, node);
99
99
  this.checkMethodsFromSuperClasses(input);
100
+ this.checkMethodNameConflicts(input);
100
101
  this.checkClassNameLength(input);
101
102
  this.checkMethodNameLength(input);
102
103
  this.checkClassConstructorStatic(input);
@@ -228,6 +229,14 @@ class ClassDefinition extends _identifier_1.Identifier {
228
229
  }
229
230
  }
230
231
  }
232
+ checkMethodNameConflicts(input) {
233
+ for (const m of this.methodDefs.getAll()) {
234
+ if (this.attributes.findByName(m.getName()) !== undefined
235
+ || this.types.getByName(m.getName()) !== undefined) {
236
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, m.getToken(), `"${m.getName()}" already defined`));
237
+ }
238
+ }
239
+ }
231
240
  findFriends(def, input) {
232
241
  var _a;
233
242
  const result = [];
@@ -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
  }