@abaplint/transpiler-cli 1.6.33 → 1.6.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/build/bundle.js +45 -23
  2. package/package.json +4 -4
package/build/bundle.js CHANGED
@@ -1853,7 +1853,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
1853
1853
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1854
1854
 
1855
1855
  "use strict";
1856
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.SQLCase = void 0;\r\nconst version_1 = __webpack_require__(/*! ../../../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\r\nconst combi_1 = __webpack_require__(/*! ../combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\r\nconst constant_1 = __webpack_require__(/*! ./constant */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/constant.js\");\r\nconst sql_cond_1 = __webpack_require__(/*! ./sql_cond */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_cond.js\");\r\nconst sql_field_name_1 = __webpack_require__(/*! ./sql_field_name */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_field_name.js\");\r\nconst sql_source_1 = __webpack_require__(/*! ./sql_source */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_source.js\");\r\nclass SQLCase extends combi_1.Expression {\r\n getRunnable() {\r\n const when = (0, combi_1.seq)(\"WHEN\", (0, combi_1.alt)(constant_1.Constant, sql_cond_1.SQLCond), \"THEN\", sql_source_1.SQLSource);\r\n const els = (0, combi_1.seq)(\"ELSE\", sql_source_1.SQLSource);\r\n return (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)(\"CASE\", (0, combi_1.opt)(sql_field_name_1.SQLFieldName), (0, combi_1.plus)(when), (0, combi_1.optPrio)(els), \"END\"));\r\n }\r\n}\r\nexports.SQLCase = SQLCase;\r\n//# sourceMappingURL=sql_case.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_case.js?");
1856
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.SQLCase = void 0;\r\nconst _1 = __webpack_require__(/*! . */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst version_1 = __webpack_require__(/*! ../../../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\r\nconst tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nconst combi_1 = __webpack_require__(/*! ../combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\r\nconst constant_1 = __webpack_require__(/*! ./constant */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/constant.js\");\r\nconst sql_cond_1 = __webpack_require__(/*! ./sql_cond */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_cond.js\");\r\nconst sql_field_name_1 = __webpack_require__(/*! ./sql_field_name */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_field_name.js\");\r\nconst sql_source_1 = __webpack_require__(/*! ./sql_source */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_source.js\");\r\nclass SQLCase extends combi_1.Expression {\r\n getRunnable() {\r\n const field = (0, combi_1.altPrio)(_1.SQLAggregation, SQLCase, _1.SQLFunction, _1.SQLPath, sql_field_name_1.SQLFieldName, constant_1.Constant);\r\n const sub = (0, combi_1.plusPrio)((0, combi_1.seq)((0, combi_1.altPrio)(\"+\", \"-\", \"*\", \"/\", \"&&\"), (0, combi_1.optPrio)((0, combi_1.tok)(tokens_1.WParenLeftW)), field, (0, combi_1.optPrio)((0, combi_1.tok)(tokens_1.WParenRightW))));\r\n const when = (0, combi_1.seq)(\"WHEN\", (0, combi_1.alt)(constant_1.Constant, sql_cond_1.SQLCond), \"THEN\", (0, combi_1.altPrio)(_1.SQLAggregation, sql_source_1.SQLSource), (0, combi_1.starPrio)(sub));\r\n const els = (0, combi_1.seq)(\"ELSE\", sql_source_1.SQLSource);\r\n return (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)(\"CASE\", (0, combi_1.opt)(sql_field_name_1.SQLFieldName), (0, combi_1.plus)(when), (0, combi_1.optPrio)(els), \"END\"));\r\n }\r\n}\r\nexports.SQLCase = SQLCase;\r\n//# sourceMappingURL=sql_case.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_case.js?");
1857
1857
 
1858
1858
  /***/ }),
1859
1859
 
@@ -1919,7 +1919,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
1919
1919
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1920
1920
 
1921
1921
  "use strict";
1922
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.SQLFieldList = void 0;\r\nconst combi_1 = __webpack_require__(/*! ../combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\r\nconst _1 = __webpack_require__(/*! . */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst version_1 = __webpack_require__(/*! ../../../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\r\nconst tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nconst sql_function_1 = __webpack_require__(/*! ./sql_function */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_function.js\");\r\nconst simple_field_chain_1 = __webpack_require__(/*! ./simple_field_chain */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/simple_field_chain.js\");\r\nconst sql_path_1 = __webpack_require__(/*! ./sql_path */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_path.js\");\r\nclass SQLFieldList extends combi_1.Expression {\r\n getRunnable() {\r\n const comma = (0, combi_1.optPrio)((0, combi_1.ver)(version_1.Version.v740sp05, \",\"));\r\n const abap = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)((0, combi_1.tok)(tokens_1.WAt), simple_field_chain_1.SimpleFieldChain));\r\n const as = (0, combi_1.seq)(\"AS\", _1.Field);\r\n const field = (0, combi_1.altPrio)(_1.SQLAggregation, _1.SQLCase, sql_function_1.SQLFunction, sql_path_1.SQLPath, _1.SQLFieldName, abap, _1.Constant);\r\n const arith = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.plusPrio)((0, combi_1.seq)((0, combi_1.altPrio)(\"+\", \"-\", \"*\", \"/\"), field)));\r\n const concat = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.plusPrio)((0, combi_1.seq)(\"&&\", field)));\r\n return (0, combi_1.altPrio)(\"*\", _1.Dynamic, (0, combi_1.plusPrio)((0, combi_1.seq)(field, (0, combi_1.optPrio)(concat), (0, combi_1.optPrio)(arith), (0, combi_1.optPrio)(as), comma)));\r\n }\r\n}\r\nexports.SQLFieldList = SQLFieldList;\r\n//# sourceMappingURL=sql_field_list.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_field_list.js?");
1922
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.SQLFieldList = void 0;\r\nconst combi_1 = __webpack_require__(/*! ../combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\r\nconst _1 = __webpack_require__(/*! . */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst version_1 = __webpack_require__(/*! ../../../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\r\nconst tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nconst sql_function_1 = __webpack_require__(/*! ./sql_function */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_function.js\");\r\nconst simple_field_chain_1 = __webpack_require__(/*! ./simple_field_chain */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/simple_field_chain.js\");\r\nconst sql_path_1 = __webpack_require__(/*! ./sql_path */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_path.js\");\r\nclass SQLFieldList extends combi_1.Expression {\r\n getRunnable() {\r\n const comma = (0, combi_1.optPrio)((0, combi_1.ver)(version_1.Version.v740sp05, \",\"));\r\n const abap = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)((0, combi_1.tok)(tokens_1.WAt), simple_field_chain_1.SimpleFieldChain));\r\n const as = (0, combi_1.seq)(\"AS\", _1.Field);\r\n const field = (0, combi_1.altPrio)(_1.SQLAggregation, _1.SQLCase, sql_function_1.SQLFunction, sql_path_1.SQLPath, _1.SQLFieldName, abap, _1.Constant);\r\n const sub = (0, combi_1.plusPrio)((0, combi_1.seq)((0, combi_1.altPrio)(\"+\", \"-\", \"*\", \"/\", \"&&\"), (0, combi_1.optPrio)((0, combi_1.tok)(tokens_1.WParenLeftW)), field, (0, combi_1.optPrio)((0, combi_1.tok)(tokens_1.WParenRightW))));\r\n const arith = (0, combi_1.ver)(version_1.Version.v740sp05, sub);\r\n return (0, combi_1.altPrio)(\"*\", _1.Dynamic, (0, combi_1.plusPrio)((0, combi_1.seq)(field, (0, combi_1.optPrio)(arith), (0, combi_1.optPrio)(as), comma)));\r\n }\r\n}\r\nexports.SQLFieldList = SQLFieldList;\r\n//# sourceMappingURL=sql_field_list.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_field_list.js?");
1923
1923
 
1924
1924
  /***/ }),
1925
1925
 
@@ -6220,7 +6220,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
6220
6220
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6221
6221
 
6222
6222
  "use strict";
6223
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.BuiltIn = void 0;\r\n/* eslint-disable max-len */\r\nconst _typed_identifier_1 = __webpack_require__(/*! ../types/_typed_identifier */ \"./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js\");\r\nconst basic_1 = __webpack_require__(/*! ../types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst tokens_1 = __webpack_require__(/*! ../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nconst position_1 = __webpack_require__(/*! ../../position */ \"./node_modules/@abaplint/core/build/src/position.js\");\r\nconst visibility_1 = __webpack_require__(/*! ../4_file_information/visibility */ \"./node_modules/@abaplint/core/build/src/abap/4_file_information/visibility.js\");\r\nconst _identifier_1 = __webpack_require__(/*! ../4_file_information/_identifier */ \"./node_modules/@abaplint/core/build/src/abap/4_file_information/_identifier.js\");\r\nconst version_1 = __webpack_require__(/*! ../../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\r\nclass BuiltInMethod extends _identifier_1.Identifier {\r\n constructor(token, filename, method, row) {\r\n super(token, filename);\r\n this.method = method;\r\n this.row = row;\r\n }\r\n getRequiredParameters() {\r\n return [];\r\n }\r\n getOptional() {\r\n throw new Error(\"BuiltInMethod->Method not implemented.\");\r\n }\r\n getAll() {\r\n throw new Error(\"BuiltInMethod->getAll, Method not implemented.\");\r\n }\r\n getImporting() {\r\n const ret = [];\r\n for (const i in this.method.mandatory) {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row, 1), i);\r\n ret.push(new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, this.method.mandatory[i]));\r\n }\r\n for (const i in this.method.optional) {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row, 1), i);\r\n ret.push(new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, this.method.optional[i]));\r\n }\r\n return ret;\r\n }\r\n getDefaultImporting() {\r\n if (this.method.mandatory === undefined) {\r\n return undefined;\r\n }\r\n const keys = Object.keys(this.method.mandatory);\r\n if (keys.length === 1) {\r\n return keys[0];\r\n }\r\n return undefined;\r\n }\r\n getExporting() {\r\n return [];\r\n }\r\n getRaising() {\r\n return [];\r\n }\r\n getChanging() {\r\n return [];\r\n }\r\n getReturning() {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row, 1), \"ret\");\r\n return new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, this.method.return);\r\n }\r\n getExceptions() {\r\n return [];\r\n }\r\n getVisibility() {\r\n return visibility_1.Visibility.Public;\r\n }\r\n isRedefinition() {\r\n return false;\r\n }\r\n isAbstract() {\r\n return false;\r\n }\r\n isStatic() {\r\n return false;\r\n }\r\n isEventHandler() {\r\n return false;\r\n }\r\n getParameters() {\r\n return this;\r\n }\r\n getParameterDefault(_parameter) {\r\n return undefined;\r\n }\r\n}\r\nclass BuiltIn {\r\n constructor() {\r\n this.row = 1;\r\n }\r\n buildDefinition(method, row) {\r\n const token = new tokens_1.Identifier(new position_1.Position(row, 1), method.name);\r\n return new BuiltInMethod(token, BuiltIn.filename, method, row);\r\n }\r\n searchBuiltin(name) {\r\n if (name === undefined) {\r\n return undefined;\r\n }\r\n const ret = [];\r\n // todo: \"pcre\" vs \"regex\", only one of these parameters are allowed\r\n // todo: \"pcre\", only possible from 755\r\n ret.push({ name: \"ABS\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"ACOS\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"ASIN\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"ATAN\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"BIT-SET\", mandatory: { \"val\": new basic_1.IntegerType() }, return: new basic_1.XStringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"BOOLC\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"BOOLX\", mandatory: { \"bool\": new basic_1.StringType() }, optional: { \"bit\": new basic_1.IntegerType() }, return: new basic_1.XStringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CEIL\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"CHAR_OFF\", mandatory: { \"val\": new basic_1.StringType(), \"add\": new basic_1.IntegerType() }, optional: { \"off\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CHARLEN\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"CMAX\", mandatory: { \"val1\": new basic_1.StringType(), \"val2\": new basic_1.StringType() }, optional: { \"val3\": new basic_1.StringType(), \"val4\": new basic_1.StringType(), \"val5\": new basic_1.StringType(), \"val6\": new basic_1.StringType(), \"val7\": new basic_1.StringType(), \"val9\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CMIN\", mandatory: { \"val1\": new basic_1.StringType(), \"val2\": new basic_1.StringType() }, optional: { \"val3\": new basic_1.StringType(), \"val4\": new basic_1.StringType(), \"val5\": new basic_1.StringType(), \"val6\": new basic_1.StringType(), \"val7\": new basic_1.StringType(), \"val9\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CONCAT_LINES_OF\", mandatory: { \"table\": new basic_1.TableType(new basic_1.AnyType(), { withHeader: false }) }, optional: { \"sep\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CONDENSE\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"del\": new basic_1.StringType(), \"from\": new basic_1.StringType(), \"to\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CONTAINS\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"start\": new basic_1.StringType(), \"end\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.CharacterType(1), version: version_1.Version.v702 });\r\n ret.push({ name: \"CONTAINS_ANY_NOT_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"start\": new basic_1.StringType(), \"end\": new basic_1.StringType(), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.CharacterType(1), version: version_1.Version.v702 });\r\n ret.push({ name: \"CONTAINS_ANY_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"start\": new basic_1.StringType(), \"end\": new basic_1.StringType(), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.CharacterType(1), version: version_1.Version.v702 });\r\n ret.push({ name: \"COS\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"COSH\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"COUNT\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"COUNT_ANY_NOT_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"COUNT_ANY_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"DBMAXLEN\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"DISTANCE\", mandatory: { \"val1\": new basic_1.StringType(), \"val2\": new basic_1.StringType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"ESCAPE\", mandatory: { \"val\": new basic_1.StringType(), \"format\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"EXP\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"FIND\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"FIND_ANY_NOT_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"FIND_ANY_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"FIND_END\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"FLOOR\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"FRAC\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"FROM_MIXED\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"case\": new basic_1.CharacterType(1), \"sep\": new basic_1.IntegerType(), \"min\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"INSERT\", mandatory: { \"val\": new basic_1.StringType(), \"sub\": new basic_1.StringType() }, optional: { \"off\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"IPOW\", mandatory: { \"base\": new basic_1.FloatType(), \"exp\": new basic_1.FloatType() }, return: new basic_1.IntegerType(), version: version_1.Version.v740sp02 });\r\n ret.push({ name: \"LINE_EXISTS\", mandatory: { \"val\": new basic_1.TableType(new basic_1.AnyType(), { withHeader: false }) }, return: new basic_1.CharacterType(1), version: version_1.Version.v740sp02 });\r\n ret.push({ name: \"LINE_INDEX\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.IntegerType(), version: version_1.Version.v740sp02 });\r\n ret.push({ name: \"LINES\", mandatory: { \"val\": new basic_1.TableType(new basic_1.AnyType(), { withHeader: false }) }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"LOG\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"LOG10\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"MATCH\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"case\": new basic_1.CharacterType(1), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"MATCHES\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"case\": new basic_1.CharacterType(1), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType() }, return: new basic_1.CharacterType(1), version: version_1.Version.v702 });\r\n ret.push({ name: \"NMAX\", mandatory: { \"val1\": new basic_1.StringType(), \"val2\": new basic_1.StringType() }, optional: { \"val3\": new basic_1.StringType(), \"val4\": new basic_1.StringType(), \"val5\": new basic_1.StringType(), \"val6\": new basic_1.StringType(), \"val7\": new basic_1.StringType(), \"val8\": new basic_1.StringType(), \"val9\": new basic_1.StringType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"NMIN\", mandatory: { \"val1\": new basic_1.StringType(), \"val2\": new basic_1.StringType() }, optional: { \"val3\": new basic_1.StringType(), \"val4\": new basic_1.StringType(), \"val5\": new basic_1.StringType(), \"val6\": new basic_1.StringType(), \"val7\": new basic_1.StringType(), \"val8\": new basic_1.StringType(), \"val9\": new basic_1.StringType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"NUMOFCHAR\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"REPEAT\", mandatory: { \"val\": new basic_1.StringType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"REPLACE\", mandatory: { \"val\": new basic_1.StringType(), \"with\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"RESCALE\", mandatory: { \"val\": new basic_1.FloatType() }, optional: { \"dec\": new basic_1.IntegerType(), \"prec\": new basic_1.IntegerType(), \"mode\": new basic_1.IntegerType() }, return: new basic_1.FloatType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"REVERSE\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"ROUND\", mandatory: { \"val\": new basic_1.FloatType() }, optional: { \"dec\": new basic_1.IntegerType(), \"prec\": new basic_1.IntegerType(), \"mode\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SEGMENT\", mandatory: { \"val\": new basic_1.StringType(), \"index\": new basic_1.IntegerType() }, optional: { \"sep\": new basic_1.StringType(), \"space\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SHIFT_LEFT\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"places\": new basic_1.IntegerType(), \"circular\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SHIFT_RIGHT\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"places\": new basic_1.IntegerType(), \"circular\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SIGN\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"SIN\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"SINH\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"SQRT\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"STRLEN\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"SUBSTRING\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SUBSTRING_AFTER\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SUBSTRING_BEFORE\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SUBSTRING_FROM\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SUBSTRING_TO\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"TAN\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"TANH\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"TO_LOWER\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"TO_MIXED\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"case\": new basic_1.CharacterType(1), \"sep\": new basic_1.IntegerType(), \"min\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"TO_UPPER\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"TRANSLATE\", mandatory: { \"val\": new basic_1.StringType(), \"from\": new basic_1.StringType(), \"to\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"TRUNC\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"UTCLONG_ADD\", mandatory: { \"val\": new basic_1.UTCLongType() }, optional: { \"days\": new basic_1.IntegerType(), \"hour\": new basic_1.IntegerType(), \"minutes\": new basic_1.IntegerType(), \"seconds\": new basic_1.FloatType() }, return: new basic_1.UTCLongType(), version: version_1.Version.v754 });\r\n ret.push({ name: \"UTCLONG_CURRENT\", return: new basic_1.UTCLongType(), version: version_1.Version.v754 });\r\n ret.push({ name: \"UTCLONG_DIFF\", mandatory: { \"high\": new basic_1.UTCLongType(), \"low\": new basic_1.UTCLongType() }, return: new basic_1.FloatType(), version: version_1.Version.v754 });\r\n ret.push({ name: \"XSDBOOL\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.CharacterType(1), version: version_1.Version.v740sp08 });\r\n ret.push({ name: \"XSTRLEN\", mandatory: { \"val\": new basic_1.XStringType() }, return: new basic_1.IntegerType() });\r\n // todo, optimize, use hash map\r\n const index = ret.findIndex(a => a.name === name.toUpperCase());\r\n if (index < 0) {\r\n return undefined;\r\n }\r\n return this.buildDefinition(ret[index], index);\r\n }\r\n getTypes() {\r\n const ret = this.buildSY();\r\n const id = new tokens_1.Identifier(new position_1.Position(1, 1), \"abap_bool\");\r\n ret.push(new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, new basic_1.CharacterType(1, \"ABAP_BOOL\")));\r\n return ret;\r\n }\r\n get(extras) {\r\n const ret = this.buildSY();\r\n ret.push(this.buildVariable(\"screen\")); // todo, add structure, or alternatively make native Statements\r\n ret.push(this.buildConstant(\"%_BACKSPACE\"));\r\n ret.push(this.buildConstant(\"%_CHARSIZE\"));\r\n ret.push(this.buildConstant(\"%_CR_LF\"));\r\n ret.push(this.buildConstant(\"%_ENDIAN\"));\r\n ret.push(this.buildConstant(\"%_FORMFEED\"));\r\n ret.push(this.buildConstant(\"%_HORIZONTAL_TAB\"));\r\n ret.push(this.buildConstant(\"%_MAXCHAR\"));\r\n ret.push(this.buildConstant(\"%_MINCHAR\"));\r\n ret.push(this.buildConstant(\"%_NEWLINE\"));\r\n ret.push(this.buildConstant(\"%_VERTICAL_TAB\"));\r\n ret.push(this.buildConstant(\"abap_false\", new basic_1.CharacterType(1, \"ABAP_BOOL\"), \"' '\"));\r\n ret.push(this.buildConstant(\"abap_true\", new basic_1.CharacterType(1, \"ABAP_BOOL\"), \"'X'\"));\r\n ret.push(this.buildConstant(\"abap_undefined\", new basic_1.CharacterType(1, \"ABAP_BOOL\"), \"'-'\"));\r\n ret.push(this.buildConstant(\"abap_off\", new basic_1.CharacterType(1, \"ABAP_BOOL\"), \"' '\"));\r\n ret.push(this.buildConstant(\"abap_on\", new basic_1.CharacterType(1, \"ABAP_BOOL\"), \"'X'\"));\r\n ret.push(this.buildConstant(\"col_background\", new basic_1.IntegerType(), \"0\"));\r\n ret.push(this.buildConstant(\"col_heading\", new basic_1.IntegerType(), \"1\"));\r\n ret.push(this.buildConstant(\"col_key\", new basic_1.IntegerType(), \"4\"));\r\n ret.push(this.buildConstant(\"col_negative\", new basic_1.IntegerType(), \"6\"));\r\n ret.push(this.buildConstant(\"col_normal\", new basic_1.IntegerType(), \"2\"));\r\n ret.push(this.buildConstant(\"col_positive\", new basic_1.IntegerType(), \"5\"));\r\n ret.push(this.buildConstant(\"col_total\", new basic_1.IntegerType(), \"3\"));\r\n ret.push(this.buildConstant(\"space\", new basic_1.CharacterType(1), \"' '\"));\r\n for (const e of extras) {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row++, 1), e);\r\n ret.push(new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, new basic_1.VoidType(e), [\"read_only\" /* ReadOnly */, \"built-in\" /* BuiltIn */], \"'?'\"));\r\n }\r\n return ret;\r\n }\r\n /////////////////////////////\r\n buildSY() {\r\n const components = [];\r\n components.push({ name: \"abcde\", type: new basic_1.CharacterType(26) });\r\n components.push({ name: \"batch\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"binpt\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"calld\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"callr\", type: new basic_1.CharacterType(8) });\r\n components.push({ name: \"colno\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"cpage\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"cprog\", type: new basic_1.CharacterType(40) });\r\n components.push({ name: \"cucol\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"curow\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"datar\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"datlo\", type: new basic_1.DateType() });\r\n components.push({ name: \"datum\", type: new basic_1.DateType() });\r\n components.push({ name: \"dayst\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"dbcnt\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"dbnam\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"dbsys\", type: new basic_1.CharacterType(10) });\r\n components.push({ name: \"dyngr\", type: new basic_1.CharacterType(4) });\r\n components.push({ name: \"dynnr\", type: new basic_1.CharacterType(4) });\r\n components.push({ name: \"fdayw\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"fdpos\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"fleng\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"folen\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"host\", type: new basic_1.CharacterType(32) });\r\n components.push({ name: \"index\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"langu\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"ldbpg\", type: new basic_1.CharacterType(40) });\r\n components.push({ name: \"lilli\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"linct\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"linno\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"linsz\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"lisel\", type: new basic_1.CharacterType(255) });\r\n components.push({ name: \"listi\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"loopc\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"lsind\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"macol\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"mandt\", type: new basic_1.CharacterType(3) });\r\n components.push({ name: \"marow\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"modno\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"msgid\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"msgli\", type: new basic_1.CharacterType(60) });\r\n components.push({ name: \"msgno\", type: new basic_1.NumericType(3) });\r\n components.push({ name: \"msgty\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"msgv1\", type: new basic_1.CharacterType(50) });\r\n components.push({ name: \"msgv2\", type: new basic_1.CharacterType(50) });\r\n components.push({ name: \"msgv3\", type: new basic_1.CharacterType(50) });\r\n components.push({ name: \"msgv4\", type: new basic_1.CharacterType(50) });\r\n components.push({ name: \"opsys\", type: new basic_1.CharacterType(10) });\r\n components.push({ name: \"pagno\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"pfkey\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"repid\", type: new basic_1.CharacterType(40) });\r\n components.push({ name: \"saprl\", type: new basic_1.CharacterType(4) });\r\n components.push({ name: \"scols\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"slset\", type: new basic_1.CharacterType(14) });\r\n components.push({ name: \"spono\", type: new basic_1.CharacterType(10) });\r\n components.push({ name: \"srows\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"staco\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"staro\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"stepl\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"subrc\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"sysid\", type: new basic_1.CharacterType(3) });\r\n components.push({ name: \"tabix\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"tcode\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tfill\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"timlo\", type: new basic_1.TimeType() });\r\n components.push({ name: \"title\", type: new basic_1.CharacterType(70) });\r\n components.push({ name: \"tleng\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"tvar0\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar1\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar2\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar3\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar4\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar5\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar6\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar7\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar8\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar9\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tzone\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"ucomm\", type: new basic_1.CharacterType(70) });\r\n components.push({ name: \"uline\", type: new basic_1.CharacterType(255) });\r\n components.push({ name: \"uname\", type: new basic_1.CharacterType(12) });\r\n components.push({ name: \"uzeit\", type: new basic_1.TimeType() });\r\n components.push({ name: \"vline\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"wtitl\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"zonlo\", type: new basic_1.CharacterType(6) });\r\n const type = new basic_1.StructureType(components);\r\n const id1 = new tokens_1.Identifier(new position_1.Position(this.row++, 1), \"sy\");\r\n const sy = new _typed_identifier_1.TypedIdentifier(id1, BuiltIn.filename, type, [\"read_only\" /* ReadOnly */, \"built-in\" /* BuiltIn */]);\r\n const id2 = new tokens_1.Identifier(new position_1.Position(this.row++, 1), \"syst\");\r\n const syst = new _typed_identifier_1.TypedIdentifier(id2, BuiltIn.filename, type, [\"read_only\" /* ReadOnly */, \"built-in\" /* BuiltIn */]);\r\n return [sy, syst];\r\n }\r\n buildConstant(name, type, value) {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row++, 1), name);\r\n if (type === undefined) {\r\n type = new basic_1.VoidType(name);\r\n }\r\n if (value === undefined) {\r\n value = \"'?'\";\r\n }\r\n return new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, type, [\"read_only\" /* ReadOnly */, \"built-in\" /* BuiltIn */], value);\r\n }\r\n buildVariable(name) {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row++, 1), name);\r\n return new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, new basic_1.VoidType(name), [\"built-in\" /* BuiltIn */]);\r\n }\r\n}\r\nexports.BuiltIn = BuiltIn;\r\nBuiltIn.filename = \"_builtin.prog.abap\";\r\n//# sourceMappingURL=_builtin.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/_builtin.js?");
6223
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.BuiltIn = void 0;\r\n/* eslint-disable max-len */\r\nconst _typed_identifier_1 = __webpack_require__(/*! ../types/_typed_identifier */ \"./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js\");\r\nconst basic_1 = __webpack_require__(/*! ../types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst tokens_1 = __webpack_require__(/*! ../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nconst position_1 = __webpack_require__(/*! ../../position */ \"./node_modules/@abaplint/core/build/src/position.js\");\r\nconst visibility_1 = __webpack_require__(/*! ../4_file_information/visibility */ \"./node_modules/@abaplint/core/build/src/abap/4_file_information/visibility.js\");\r\nconst _identifier_1 = __webpack_require__(/*! ../4_file_information/_identifier */ \"./node_modules/@abaplint/core/build/src/abap/4_file_information/_identifier.js\");\r\nconst version_1 = __webpack_require__(/*! ../../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\r\nclass BuiltInMethod extends _identifier_1.Identifier {\r\n constructor(token, filename, method, row) {\r\n super(token, filename);\r\n this.method = method;\r\n this.row = row;\r\n }\r\n getRequiredParameters() {\r\n return [];\r\n }\r\n getOptional() {\r\n throw new Error(\"BuiltInMethod->Method not implemented.\");\r\n }\r\n getAll() {\r\n throw new Error(\"BuiltInMethod->getAll, Method not implemented.\");\r\n }\r\n getImporting() {\r\n const ret = [];\r\n for (const i in this.method.mandatory) {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row, 1), i);\r\n ret.push(new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, this.method.mandatory[i]));\r\n }\r\n for (const i in this.method.optional) {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row, 1), i);\r\n ret.push(new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, this.method.optional[i]));\r\n }\r\n return ret;\r\n }\r\n getDefaultImporting() {\r\n if (this.method.mandatory === undefined) {\r\n return undefined;\r\n }\r\n const keys = Object.keys(this.method.mandatory);\r\n if (keys.length === 1) {\r\n return keys[0];\r\n }\r\n return undefined;\r\n }\r\n getExporting() {\r\n return [];\r\n }\r\n getRaising() {\r\n return [];\r\n }\r\n getChanging() {\r\n return [];\r\n }\r\n getReturning() {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row, 1), \"ret\");\r\n return new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, this.method.return);\r\n }\r\n getExceptions() {\r\n return [];\r\n }\r\n getVisibility() {\r\n return visibility_1.Visibility.Public;\r\n }\r\n isRedefinition() {\r\n return false;\r\n }\r\n isAbstract() {\r\n return false;\r\n }\r\n isStatic() {\r\n return false;\r\n }\r\n isEventHandler() {\r\n return false;\r\n }\r\n getParameters() {\r\n return this;\r\n }\r\n getParameterDefault(_parameter) {\r\n return undefined;\r\n }\r\n}\r\nclass BuiltIn {\r\n constructor() {\r\n this.row = 1;\r\n }\r\n buildDefinition(method, row) {\r\n const token = new tokens_1.Identifier(new position_1.Position(row, 1), method.name);\r\n return new BuiltInMethod(token, BuiltIn.filename, method, row);\r\n }\r\n searchBuiltin(name) {\r\n if (name === undefined) {\r\n return undefined;\r\n }\r\n const ret = [];\r\n // todo: \"pcre\" vs \"regex\", only one of these parameters are allowed\r\n // todo: \"pcre\", only possible from 755\r\n ret.push({ name: \"ABS\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"ACOS\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"ASIN\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"ATAN\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"BIT-SET\", mandatory: { \"val\": new basic_1.IntegerType() }, return: new basic_1.XStringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"BOOLC\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"BOOLX\", mandatory: { \"bool\": new basic_1.StringType() }, optional: { \"bit\": new basic_1.IntegerType() }, return: new basic_1.XStringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CEIL\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"CHAR_OFF\", mandatory: { \"val\": new basic_1.StringType(), \"add\": new basic_1.IntegerType() }, optional: { \"off\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CHARLEN\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"CMAX\", mandatory: { \"val1\": new basic_1.StringType(), \"val2\": new basic_1.StringType() }, optional: { \"val3\": new basic_1.StringType(), \"val4\": new basic_1.StringType(), \"val5\": new basic_1.StringType(), \"val6\": new basic_1.StringType(), \"val7\": new basic_1.StringType(), \"val9\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CMIN\", mandatory: { \"val1\": new basic_1.StringType(), \"val2\": new basic_1.StringType() }, optional: { \"val3\": new basic_1.StringType(), \"val4\": new basic_1.StringType(), \"val5\": new basic_1.StringType(), \"val6\": new basic_1.StringType(), \"val7\": new basic_1.StringType(), \"val9\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CONCAT_LINES_OF\", mandatory: { \"table\": new basic_1.TableType(new basic_1.AnyType(), { withHeader: false }) }, optional: { \"sep\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CONDENSE\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"del\": new basic_1.StringType(), \"from\": new basic_1.StringType(), \"to\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"CONTAINS\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"start\": new basic_1.StringType(), \"end\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.CharacterType(1), version: version_1.Version.v702 });\r\n ret.push({ name: \"CONTAINS_ANY_NOT_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"start\": new basic_1.StringType(), \"end\": new basic_1.StringType(), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.CharacterType(1), version: version_1.Version.v702 });\r\n ret.push({ name: \"CONTAINS_ANY_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"start\": new basic_1.StringType(), \"end\": new basic_1.StringType(), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.CharacterType(1), version: version_1.Version.v702 });\r\n ret.push({ name: \"COS\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"COSH\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"COUNT\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"COUNT_ANY_NOT_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"COUNT_ANY_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"DBMAXLEN\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"DISTANCE\", mandatory: { \"val1\": new basic_1.StringType(), \"val2\": new basic_1.StringType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"ESCAPE\", mandatory: { \"val\": new basic_1.StringType(), \"format\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"EXP\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"FIND\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"FIND_ANY_NOT_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"FIND_ANY_OF\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"FIND_END\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"FLOOR\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"FRAC\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"FROM_MIXED\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"case\": new basic_1.CharacterType(1), \"sep\": new basic_1.IntegerType(), \"min\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"INSERT\", mandatory: { \"val\": new basic_1.StringType(), \"sub\": new basic_1.StringType() }, optional: { \"off\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"IPOW\", mandatory: { \"base\": new basic_1.FloatType(), \"exp\": new basic_1.FloatType() }, return: new basic_1.IntegerType(), version: version_1.Version.v740sp02 });\r\n ret.push({ name: \"LINE_EXISTS\", mandatory: { \"val\": new basic_1.TableType(new basic_1.AnyType(), { withHeader: false }) }, return: new basic_1.CharacterType(1), version: version_1.Version.v740sp02 });\r\n ret.push({ name: \"LINE_INDEX\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.IntegerType(), version: version_1.Version.v740sp02 });\r\n ret.push({ name: \"LINES\", mandatory: { \"val\": new basic_1.TableType(new basic_1.AnyType(), { withHeader: false }) }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"LOG\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"LOG10\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"MATCH\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"case\": new basic_1.CharacterType(1), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"MATCHES\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"case\": new basic_1.CharacterType(1), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType() }, return: new basic_1.CharacterType(1), version: version_1.Version.v702 });\r\n ret.push({ name: \"NMAX\", mandatory: { \"val1\": new basic_1.StringType(), \"val2\": new basic_1.StringType() }, optional: { \"val3\": new basic_1.StringType(), \"val4\": new basic_1.StringType(), \"val5\": new basic_1.StringType(), \"val6\": new basic_1.StringType(), \"val7\": new basic_1.StringType(), \"val8\": new basic_1.StringType(), \"val9\": new basic_1.StringType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"NMIN\", mandatory: { \"val1\": new basic_1.StringType(), \"val2\": new basic_1.StringType() }, optional: { \"val3\": new basic_1.StringType(), \"val4\": new basic_1.StringType(), \"val5\": new basic_1.StringType(), \"val6\": new basic_1.StringType(), \"val7\": new basic_1.StringType(), \"val8\": new basic_1.StringType(), \"val9\": new basic_1.StringType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"NUMOFCHAR\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"REPEAT\", mandatory: { \"val\": new basic_1.StringType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"REPLACE\", mandatory: { \"val\": new basic_1.StringType(), \"with\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"RESCALE\", mandatory: { \"val\": new basic_1.FloatType() }, optional: { \"dec\": new basic_1.IntegerType(), \"prec\": new basic_1.IntegerType(), \"mode\": new basic_1.IntegerType() }, return: new basic_1.FloatType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"REVERSE\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"ROUND\", mandatory: { \"val\": new basic_1.FloatType() }, optional: { \"dec\": new basic_1.IntegerType(), \"prec\": new basic_1.IntegerType(), \"mode\": new basic_1.IntegerType() }, return: new basic_1.IntegerType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SEGMENT\", mandatory: { \"val\": new basic_1.StringType(), \"index\": new basic_1.IntegerType() }, optional: { \"sep\": new basic_1.StringType(), \"space\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SHIFT_LEFT\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"places\": new basic_1.IntegerType(), \"circular\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SHIFT_RIGHT\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"places\": new basic_1.IntegerType(), \"circular\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SIGN\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"SIN\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"SINH\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"SQRT\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"STRLEN\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"SUBSTRING\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"off\": new basic_1.IntegerType(), \"len\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SUBSTRING_AFTER\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SUBSTRING_BEFORE\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SUBSTRING_FROM\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"SUBSTRING_TO\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"sub\": new basic_1.StringType(), \"regex\": new basic_1.StringType(), \"pcre\": new basic_1.StringType(), \"case\": new basic_1.CharacterType(1), \"len\": new basic_1.IntegerType(), \"occ\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"TAN\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"TANH\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.FloatType() });\r\n ret.push({ name: \"TO_LOWER\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"TO_MIXED\", mandatory: { \"val\": new basic_1.StringType() }, optional: { \"case\": new basic_1.CharacterType(1), \"sep\": new basic_1.IntegerType(), \"min\": new basic_1.IntegerType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"TO_UPPER\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"TRANSLATE\", mandatory: { \"val\": new basic_1.StringType(), \"from\": new basic_1.StringType(), \"to\": new basic_1.StringType() }, return: new basic_1.StringType(), version: version_1.Version.v702 });\r\n ret.push({ name: \"TRUNC\", mandatory: { \"val\": new basic_1.FloatType() }, return: new basic_1.IntegerType() });\r\n ret.push({ name: \"UTCLONG_ADD\", mandatory: { \"val\": new basic_1.UTCLongType() }, optional: { \"days\": new basic_1.IntegerType(), \"hour\": new basic_1.IntegerType(), \"minutes\": new basic_1.IntegerType(), \"seconds\": new basic_1.FloatType() }, return: new basic_1.UTCLongType(), version: version_1.Version.v754 });\r\n ret.push({ name: \"UTCLONG_CURRENT\", return: new basic_1.UTCLongType(), version: version_1.Version.v754 });\r\n ret.push({ name: \"UTCLONG_DIFF\", mandatory: { \"high\": new basic_1.UTCLongType(), \"low\": new basic_1.UTCLongType() }, return: new basic_1.FloatType(), version: version_1.Version.v754 });\r\n ret.push({ name: \"XSDBOOL\", mandatory: { \"val\": new basic_1.StringType() }, return: new basic_1.CharacterType(1), version: version_1.Version.v740sp08 });\r\n ret.push({ name: \"XSTRLEN\", mandatory: { \"val\": new basic_1.XStringType() }, return: new basic_1.IntegerType() });\r\n // todo, optimize, use hash map\r\n const index = ret.findIndex(a => a.name === name.toUpperCase());\r\n if (index < 0) {\r\n return undefined;\r\n }\r\n return this.buildDefinition(ret[index], index);\r\n }\r\n getTypes() {\r\n const ret = this.buildSY();\r\n const id = new tokens_1.Identifier(new position_1.Position(1, 1), \"abap_bool\");\r\n ret.push(new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, new basic_1.CharacterType(1, \"ABAP_BOOL\")));\r\n return ret;\r\n }\r\n get(extras) {\r\n const ret = this.buildSY();\r\n ret.push(this.buildVariable(\"screen\")); // todo, add structure, or alternatively make native Statements\r\n ret.push(this.buildConstant(\"%_BACKSPACE\"));\r\n ret.push(this.buildConstant(\"%_CHARSIZE\"));\r\n ret.push(this.buildConstant(\"%_CR_LF\"));\r\n ret.push(this.buildConstant(\"%_ENDIAN\"));\r\n ret.push(this.buildConstant(\"%_FORMFEED\"));\r\n ret.push(this.buildConstant(\"%_HORIZONTAL_TAB\"));\r\n ret.push(this.buildConstant(\"%_MAXCHAR\"));\r\n ret.push(this.buildConstant(\"%_MINCHAR\"));\r\n ret.push(this.buildConstant(\"%_NEWLINE\"));\r\n ret.push(this.buildConstant(\"%_VERTICAL_TAB\"));\r\n ret.push(this.buildConstant(\"abap_false\", new basic_1.CharacterType(1, \"ABAP_BOOL\"), \"' '\"));\r\n ret.push(this.buildConstant(\"abap_true\", new basic_1.CharacterType(1, \"ABAP_BOOL\"), \"'X'\"));\r\n ret.push(this.buildConstant(\"abap_undefined\", new basic_1.CharacterType(1, \"ABAP_BOOL\"), \"'-'\"));\r\n ret.push(this.buildConstant(\"abap_off\", new basic_1.CharacterType(1, \"ABAP_BOOL\"), \"' '\"));\r\n ret.push(this.buildConstant(\"abap_on\", new basic_1.CharacterType(1, \"ABAP_BOOL\"), \"'X'\"));\r\n ret.push(this.buildConstant(\"col_background\", new basic_1.IntegerType(), \"0\"));\r\n ret.push(this.buildConstant(\"col_heading\", new basic_1.IntegerType(), \"1\"));\r\n ret.push(this.buildConstant(\"col_key\", new basic_1.IntegerType(), \"4\"));\r\n ret.push(this.buildConstant(\"col_negative\", new basic_1.IntegerType(), \"6\"));\r\n ret.push(this.buildConstant(\"col_normal\", new basic_1.IntegerType(), \"2\"));\r\n ret.push(this.buildConstant(\"col_positive\", new basic_1.IntegerType(), \"5\"));\r\n ret.push(this.buildConstant(\"col_total\", new basic_1.IntegerType(), \"3\"));\r\n ret.push(this.buildConstant(\"space\", new basic_1.CharacterType(1), \"' '\"));\r\n for (const e of extras) {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row++, 1), e);\r\n ret.push(new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, new basic_1.VoidType(e), [\"read_only\" /* ReadOnly */, \"built-in\" /* BuiltIn */], \"'?'\"));\r\n }\r\n return ret;\r\n }\r\n /////////////////////////////\r\n buildSY() {\r\n const components = [];\r\n components.push({ name: \"abcde\", type: new basic_1.CharacterType(26) });\r\n components.push({ name: \"batch\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"binpt\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"calld\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"callr\", type: new basic_1.CharacterType(8) });\r\n components.push({ name: \"colno\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"cpage\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"cprog\", type: new basic_1.CharacterType(40) });\r\n components.push({ name: \"cucol\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"curow\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"datar\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"datlo\", type: new basic_1.DateType() });\r\n components.push({ name: \"datum\", type: new basic_1.DateType() });\r\n components.push({ name: \"dayst\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"dbcnt\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"dbnam\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"dbsys\", type: new basic_1.CharacterType(10) });\r\n components.push({ name: \"dyngr\", type: new basic_1.CharacterType(4) });\r\n components.push({ name: \"dynnr\", type: new basic_1.CharacterType(4) });\r\n components.push({ name: \"fdayw\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"fdpos\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"fleng\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"folen\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"host\", type: new basic_1.CharacterType(32) });\r\n components.push({ name: \"index\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"langu\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"ldbpg\", type: new basic_1.CharacterType(40) });\r\n components.push({ name: \"pdest\", type: new basic_1.CharacterType(4) });\r\n components.push({ name: \"lilli\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"linct\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"linno\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"linsz\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"lisel\", type: new basic_1.CharacterType(255) });\r\n components.push({ name: \"listi\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"loopc\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"lsind\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"macol\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"mandt\", type: new basic_1.CharacterType(3) });\r\n components.push({ name: \"marow\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"modno\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"msgid\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"msgli\", type: new basic_1.CharacterType(60) });\r\n components.push({ name: \"msgno\", type: new basic_1.NumericType(3) });\r\n components.push({ name: \"msgty\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"msgv1\", type: new basic_1.CharacterType(50) });\r\n components.push({ name: \"msgv2\", type: new basic_1.CharacterType(50) });\r\n components.push({ name: \"msgv3\", type: new basic_1.CharacterType(50) });\r\n components.push({ name: \"msgv4\", type: new basic_1.CharacterType(50) });\r\n components.push({ name: \"opsys\", type: new basic_1.CharacterType(10) });\r\n components.push({ name: \"pagno\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"pfkey\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"repid\", type: new basic_1.CharacterType(40) });\r\n components.push({ name: \"saprl\", type: new basic_1.CharacterType(4) });\r\n components.push({ name: \"scols\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"slset\", type: new basic_1.CharacterType(14) });\r\n components.push({ name: \"spono\", type: new basic_1.CharacterType(10) });\r\n components.push({ name: \"srows\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"staco\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"staro\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"stepl\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"subrc\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"sysid\", type: new basic_1.CharacterType(3) });\r\n components.push({ name: \"tabix\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"tcode\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tfill\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"timlo\", type: new basic_1.TimeType() });\r\n components.push({ name: \"title\", type: new basic_1.CharacterType(70) });\r\n components.push({ name: \"tleng\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"tvar0\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar1\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar2\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar3\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar4\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar5\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar6\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar7\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar8\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tvar9\", type: new basic_1.CharacterType(20) });\r\n components.push({ name: \"tzone\", type: new basic_1.IntegerType() });\r\n components.push({ name: \"ucomm\", type: new basic_1.CharacterType(70) });\r\n components.push({ name: \"uline\", type: new basic_1.CharacterType(255) });\r\n components.push({ name: \"uname\", type: new basic_1.CharacterType(12) });\r\n components.push({ name: \"uzeit\", type: new basic_1.TimeType() });\r\n components.push({ name: \"vline\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"wtitl\", type: new basic_1.CharacterType(1) });\r\n components.push({ name: \"zonlo\", type: new basic_1.CharacterType(6) });\r\n const type = new basic_1.StructureType(components);\r\n const id1 = new tokens_1.Identifier(new position_1.Position(this.row++, 1), \"sy\");\r\n const sy = new _typed_identifier_1.TypedIdentifier(id1, BuiltIn.filename, type, [\"read_only\" /* ReadOnly */, \"built-in\" /* BuiltIn */]);\r\n const id2 = new tokens_1.Identifier(new position_1.Position(this.row++, 1), \"syst\");\r\n const syst = new _typed_identifier_1.TypedIdentifier(id2, BuiltIn.filename, type, [\"read_only\" /* ReadOnly */, \"built-in\" /* BuiltIn */]);\r\n return [sy, syst];\r\n }\r\n buildConstant(name, type, value) {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row++, 1), name);\r\n if (type === undefined) {\r\n type = new basic_1.VoidType(name);\r\n }\r\n if (value === undefined) {\r\n value = \"'?'\";\r\n }\r\n return new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, type, [\"read_only\" /* ReadOnly */, \"built-in\" /* BuiltIn */], value);\r\n }\r\n buildVariable(name) {\r\n const id = new tokens_1.Identifier(new position_1.Position(this.row++, 1), name);\r\n return new _typed_identifier_1.TypedIdentifier(id, BuiltIn.filename, new basic_1.VoidType(name), [\"built-in\" /* BuiltIn */]);\r\n }\r\n}\r\nexports.BuiltIn = BuiltIn;\r\nBuiltIn.filename = \"_builtin.prog.abap\";\r\n//# sourceMappingURL=_builtin.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/_builtin.js?");
6224
6224
 
6225
6225
  /***/ }),
6226
6226
 
@@ -6297,7 +6297,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
6297
6297
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6298
6298
 
6299
6299
  "use strict";
6300
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.BasicTypes = void 0;\r\n/* eslint-disable default-case */\r\nconst _typed_identifier_1 = __webpack_require__(/*! ../types/_typed_identifier */ \"./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js\");\r\nconst Expressions = __webpack_require__(/*! ../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst Types = __webpack_require__(/*! ../types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst _scope_type_1 = __webpack_require__(/*! ./_scope_type */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js\");\r\nconst _object_oriented_1 = __webpack_require__(/*! ./_object_oriented */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_object_oriented.js\");\r\nconst class_constant_1 = __webpack_require__(/*! ../types/class_constant */ \"./node_modules/@abaplint/core/build/src/abap/types/class_constant.js\");\r\nconst identifier_1 = __webpack_require__(/*! ../1_lexer/tokens/identifier */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/identifier.js\");\r\nconst _reference_1 = __webpack_require__(/*! ./_reference */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js\");\r\nconst basic_1 = __webpack_require__(/*! ../types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst field_chain_1 = __webpack_require__(/*! ./expressions/field_chain */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/field_chain.js\");\r\nconst types_1 = __webpack_require__(/*! ../types */ \"./node_modules/@abaplint/core/build/src/abap/types/index.js\");\r\nconst expressions_1 = __webpack_require__(/*! ../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nclass BasicTypes {\r\n constructor(filename, scope) {\r\n this.filename = filename;\r\n this.scope = scope;\r\n }\r\n lookupQualifiedName(name) {\r\n var _a;\r\n if (name === undefined) {\r\n return undefined;\r\n }\r\n const found = this.scope.findType(name);\r\n if (found) {\r\n return found;\r\n }\r\n if (name.includes(\"=>\")) {\r\n const split = name.split(\"=>\");\r\n const ooName = split[0];\r\n const typeName = split[1];\r\n const oo = this.scope.findObjectDefinition(ooName);\r\n if (oo) {\r\n const f = oo.getTypeDefinitions().getByName(typeName);\r\n if (f) {\r\n return f;\r\n }\r\n }\r\n }\r\n const lookup = this.scope.getDDIC().lookupNoVoid(name);\r\n const id = (_a = lookup === null || lookup === void 0 ? void 0 : lookup.object) === null || _a === void 0 ? void 0 : _a.getIdentifier();\r\n if (id && (lookup === null || lookup === void 0 ? void 0 : lookup.type)) {\r\n return new _typed_identifier_1.TypedIdentifier(id.getToken(), id.getFilename(), lookup.type);\r\n }\r\n return undefined;\r\n }\r\n resolveLikeName(node, headerLogic = true) {\r\n var _a;\r\n if (node === undefined) {\r\n return undefined;\r\n }\r\n let chain = node.findFirstExpression(Expressions.FieldChain);\r\n if (chain === undefined) {\r\n chain = node.findFirstExpression(Expressions.TypeName);\r\n }\r\n if (chain === undefined) {\r\n chain = node.findFirstExpression(Expressions.FieldSub);\r\n }\r\n if (chain === undefined) {\r\n throw new Error(\"resolveLikeName, chain undefined\");\r\n }\r\n const fullName = chain.concatTokens();\r\n const children = [...chain.getChildren()];\r\n if (children.length === 0) {\r\n return new Types.UnknownType(\"Type error, could not resolve \\\"\" + fullName + \"\\\", resolveLikeName1\");\r\n }\r\n let type = undefined;\r\n if (children[1] && (children[1].getFirstToken().getStr() === \"=>\" || children[1].getFirstToken().getStr() === \"->\")) {\r\n type = new field_chain_1.FieldChain().runSyntax(chain, this.scope, this.filename, _reference_1.ReferenceType.TypeReference);\r\n }\r\n else {\r\n const name = children.shift().getFirstToken().getStr();\r\n const found = this.scope.findVariable(name);\r\n type = found === null || found === void 0 ? void 0 : found.getType();\r\n if (found) {\r\n this.scope.addReference(chain === null || chain === void 0 ? void 0 : chain.getFirstToken(), found, _reference_1.ReferenceType.TypeReference, this.filename);\r\n }\r\n if (type === undefined) {\r\n type = (_a = this.scope.getDDIC().lookupNoVoid(name)) === null || _a === void 0 ? void 0 : _a.type;\r\n }\r\n if (type === undefined && this.scope.isOO() === false && this.scope.getDDIC().inErrorNamespace(name) === false) {\r\n this.scope.addReference(chain.getChildren()[0].getFirstToken(), undefined, _reference_1.ReferenceType.VoidType, this.filename);\r\n return new Types.VoidType(name);\r\n }\r\n while (children.length > 0) {\r\n const child = children.shift();\r\n if (child.getFirstToken().getStr() === \"-\") {\r\n if (type instanceof Types.VoidType) {\r\n return type;\r\n }\r\n }\r\n else if (child.concatTokens() === \"[]\") {\r\n if (type instanceof Types.TableType) {\r\n type = new basic_1.TableType(type.getRowType(), { withHeader: false });\r\n }\r\n }\r\n else { // field name\r\n let sub = undefined;\r\n if (type instanceof Types.TableType) {\r\n type = type.getRowType();\r\n }\r\n if (type instanceof Types.StructureType) {\r\n sub = type.getComponentByName(child.getFirstToken().getStr());\r\n }\r\n if (sub === undefined) {\r\n return new Types.UnknownType(\"Type error, field not part of structure \" + fullName);\r\n }\r\n type = sub;\r\n }\r\n }\r\n if (type instanceof Types.VoidType) {\r\n return type;\r\n }\r\n else if (type instanceof basic_1.TableType\r\n && type.isWithHeader()\r\n && headerLogic === true) {\r\n type = type.getRowType();\r\n }\r\n else if (type instanceof Types.TableType\r\n && type.isWithHeader() === true\r\n && type.getRowType() instanceof Types.VoidType) {\r\n return type.getRowType();\r\n }\r\n }\r\n if (!type) {\r\n return new Types.UnknownType(\"Type error, could not resolve \\\"\" + fullName + \"\\\", resolveLikeName2\");\r\n }\r\n return type;\r\n }\r\n resolveTypeName(typeName, length, decimals) {\r\n if (typeName === undefined) {\r\n return undefined;\r\n }\r\n const chain = this.resolveTypeChain(typeName);\r\n if (chain) {\r\n return chain;\r\n }\r\n const chainText = typeName.concatTokens().toUpperCase();\r\n const f = this.scope.getDDIC().lookupBuiltinType(chainText, length, decimals);\r\n if (f !== undefined) {\r\n return f;\r\n }\r\n const typ = this.scope.findType(chainText);\r\n if (typ) {\r\n const token = typeName.getFirstToken();\r\n if (chainText.includes(\"~\")) {\r\n const name = chainText.split(\"~\")[0];\r\n const idef = this.scope.findInterfaceDefinition(name);\r\n if (idef) {\r\n this.scope.addReference(token, idef, _reference_1.ReferenceType.ObjectOrientedReference, this.filename, { ooType: \"INTF\", ooName: name });\r\n }\r\n }\r\n this.scope.addReference(token, typ, _reference_1.ReferenceType.TypeReference, this.filename);\r\n return typ.getType();\r\n }\r\n const type = this.scope.findTypePoolType(chainText);\r\n if (type) {\r\n this.scope.addReference(typeName.getFirstToken(), typ, _reference_1.ReferenceType.TypeReference, this.filename);\r\n return type;\r\n }\r\n const ddic = this.scope.getDDIC().lookup(chainText);\r\n if (ddic) {\r\n this.scope.getDDICReferences().addUsing(this.scope.getParentObj(), ddic.object);\r\n if (ddic.type instanceof _typed_identifier_1.TypedIdentifier) {\r\n this.scope.addReference(typeName.getFirstToken(), ddic.type, _reference_1.ReferenceType.TypeReference, this.filename);\r\n }\r\n else if (ddic.type instanceof basic_1.VoidType) {\r\n this.scope.addReference(typeName.getFirstToken(), undefined, _reference_1.ReferenceType.VoidType, this.filename);\r\n }\r\n return ddic.type;\r\n }\r\n return undefined;\r\n }\r\n simpleType(node) {\r\n let nameExpr = node.findFirstExpression(Expressions.NamespaceSimpleName);\r\n if (nameExpr === undefined) {\r\n nameExpr = node.findFirstExpression(Expressions.DefinitionName);\r\n }\r\n if (nameExpr === undefined) {\r\n return undefined;\r\n }\r\n let name = nameExpr.getFirstToken();\r\n if (nameExpr.countTokens() > 1) { // workaround for names with dashes\r\n name = new identifier_1.Identifier(name.getStart(), nameExpr.concatTokens());\r\n }\r\n const found = this.parseType(node);\r\n if (found) {\r\n return new _typed_identifier_1.TypedIdentifier(name, this.filename, found);\r\n }\r\n return undefined;\r\n }\r\n parseTable(node, name) {\r\n var _a;\r\n const typename = node.findFirstExpression(Expressions.TypeName);\r\n const text = (_a = node.findFirstExpression(Expressions.TypeTable)) === null || _a === void 0 ? void 0 : _a.concatTokens().toUpperCase();\r\n if (text === undefined) {\r\n return undefined;\r\n }\r\n let type = undefined;\r\n if (text.includes(\" STANDARD TABLE \")) {\r\n type = basic_1.TableAccessType.standard;\r\n }\r\n else if (text.includes(\" SORTED TABLE \")) {\r\n type = basic_1.TableAccessType.sorted;\r\n }\r\n else if (text.includes(\" HASHED TABLE \")) {\r\n type = basic_1.TableAccessType.hashed;\r\n }\r\n const keyFields = [];\r\n if (type) {\r\n const keys = node.findFirstExpression(expressions_1.TypeTableKey);\r\n for (const k of (keys === null || keys === void 0 ? void 0 : keys.findDirectExpressions(expressions_1.FieldSub)) || []) {\r\n keyFields.push(k.concatTokens().toUpperCase());\r\n }\r\n }\r\n const options = {\r\n withHeader: text.includes(\"WITH HEADER LINE\"),\r\n type: type,\r\n isUnique: text.includes(\"WITH UNIQUE\"),\r\n keyFields: keyFields,\r\n };\r\n let found = undefined;\r\n if (text.startsWith(\"TYPE TABLE OF REF TO \")\r\n || text.startsWith(\"TYPE STANDARD TABLE OF REF TO \")\r\n || text.startsWith(\"TYPE SORTED TABLE OF REF TO \")\r\n || text.startsWith(\"TYPE HASHED TABLE OF REF TO \")) {\r\n found = this.resolveTypeRef(typename);\r\n if (found) {\r\n return new Types.TableType(found, options, name);\r\n }\r\n }\r\n else if (text.startsWith(\"TYPE TABLE OF \")\r\n || text.startsWith(\"TYPE STANDARD TABLE OF \")\r\n || text.startsWith(\"TYPE SORTED TABLE OF \")\r\n || text.startsWith(\"TYPE HASHED TABLE OF \")) {\r\n found = this.resolveTypeName(typename);\r\n if (found) {\r\n return new Types.TableType(found, options, name);\r\n }\r\n }\r\n else if (text.startsWith(\"LIKE TABLE OF \")\r\n || text.startsWith(\"LIKE STANDARD TABLE OF \")\r\n || text.startsWith(\"LIKE SORTED TABLE OF \")\r\n || text.startsWith(\"LIKE HASHED TABLE OF \")) {\r\n found = this.resolveLikeName(node);\r\n if (found) {\r\n return new Types.TableType(found, options, name);\r\n }\r\n }\r\n else if (text === \"TYPE STANDARD TABLE\"\r\n || text === \"TYPE SORTED TABLE\"\r\n || text === \"TYPE HASHED TABLE\"\r\n || text === \"TYPE INDEX TABLE\"\r\n || text === \"TYPE ANY TABLE\") {\r\n return new Types.TableType(new Types.AnyType(), options);\r\n }\r\n else if (text.startsWith(\"TYPE RANGE OF \")) {\r\n const sub = node.findFirstExpression(Expressions.TypeName);\r\n found = this.resolveTypeName(sub);\r\n if (found === undefined) {\r\n return new Types.UnknownType(\"TYPE RANGE OF, could not resolve type\");\r\n }\r\n const structure = new Types.StructureType([\r\n { name: \"sign\", type: new Types.CharacterType(1) },\r\n { name: \"option\", type: new Types.CharacterType(2) },\r\n { name: \"low\", type: found },\r\n { name: \"high\", type: found },\r\n ], name);\r\n return new Types.TableType(structure, options);\r\n }\r\n else if (text.startsWith(\"LIKE RANGE OF \")) {\r\n const sub = node.findFirstExpression(Expressions.FieldSub);\r\n found = this.resolveLikeName(sub);\r\n if (found === undefined) {\r\n return new Types.UnknownType(\"LIKE RANGE OF, could not resolve type\");\r\n }\r\n const structure = new Types.StructureType([\r\n { name: \"sign\", type: new Types.CharacterType(1) },\r\n { name: \"option\", type: new Types.CharacterType(2) },\r\n { name: \"low\", type: found },\r\n { name: \"high\", type: found },\r\n ], name);\r\n return new Types.TableType(structure, options);\r\n }\r\n // fallback to old style syntax, OCCURS etc\r\n return this.parseType(node, name);\r\n }\r\n parseType(node, name) {\r\n var _a, _b, _c, _d, _e, _f;\r\n const typename = node.findFirstExpression(Expressions.TypeName);\r\n let text = (_a = node.findFirstExpression(Expressions.Type)) === null || _a === void 0 ? void 0 : _a.concatTokens().toUpperCase();\r\n if (text === undefined) {\r\n text = (_b = node.findFirstExpression(Expressions.TypeParam)) === null || _b === void 0 ? void 0 : _b.concatTokens().toUpperCase();\r\n }\r\n if (text === undefined) {\r\n text = (_c = node.findFirstExpression(Expressions.TypeTable)) === null || _c === void 0 ? void 0 : _c.concatTokens().toUpperCase();\r\n if ((text === null || text === void 0 ? void 0 : text.startsWith(\"TYPE\")) === false && (text === null || text === void 0 ? void 0 : text.startsWith(\"LIKE\")) === false) {\r\n text = \"TYPE\";\r\n }\r\n }\r\n if (text === undefined) {\r\n text = (_d = node.findFirstExpression(Expressions.FormParamType)) === null || _d === void 0 ? void 0 : _d.concatTokens().toUpperCase();\r\n }\r\n if (text === undefined) {\r\n text = \"TYPE\";\r\n }\r\n let found = undefined;\r\n if (text.startsWith(\"LIKE LINE OF \")) {\r\n const name = (_e = node.findFirstExpression(Expressions.FieldChain)) === null || _e === void 0 ? void 0 : _e.concatTokens();\r\n let e = node.findFirstExpression(Expressions.Type);\r\n if (e === undefined) {\r\n e = node.findFirstExpression(Expressions.FormParamType);\r\n }\r\n const type = this.resolveLikeName(e, false);\r\n if (type === undefined) {\r\n return new Types.UnknownType(\"Type error, could not resolve \\\"\" + name + \"\\\", parseType\");\r\n }\r\n else if (type instanceof Types.TableType) {\r\n return type.getRowType();\r\n }\r\n else if (type instanceof Types.VoidType) {\r\n return type;\r\n }\r\n else {\r\n return new Types.UnknownType(\"Type error, not a table type \" + name);\r\n }\r\n }\r\n else if (text.startsWith(\"LIKE REF TO \")) {\r\n const name = (_f = node.findFirstExpression(Expressions.FieldChain)) === null || _f === void 0 ? void 0 : _f.concatTokens();\r\n const type = this.resolveLikeName(node.findFirstExpression(Expressions.Type), false);\r\n if (type === undefined) {\r\n return new Types.UnknownType(\"Type error, could not resolve \\\"\" + name + \"\\\", parseType\");\r\n }\r\n return new Types.DataReference(type);\r\n }\r\n else if (text === \"TYPE STANDARD TABLE\"\r\n || text === \"TYPE SORTED TABLE\"\r\n || text === \"TYPE HASHED TABLE\"\r\n || text === \"TYPE INDEX TABLE\"\r\n || text === \"TYPE ANY TABLE\") {\r\n return new Types.TableType(new Types.AnyType(), { withHeader: node.concatTokens().toUpperCase().includes(\"WITH HEADER LINE\") });\r\n }\r\n else if (text.startsWith(\"LIKE \")) {\r\n let sub = node.findFirstExpression(Expressions.Type);\r\n if (sub === undefined) {\r\n sub = node.findFirstExpression(Expressions.FormParamType);\r\n }\r\n if (sub === undefined) {\r\n sub = node.findFirstExpression(Expressions.TypeParam);\r\n }\r\n if (sub === undefined) {\r\n sub = node.findFirstExpression(Expressions.FieldChain);\r\n }\r\n found = this.resolveLikeName(sub);\r\n if (found && text.includes(\" OCCURS \")) {\r\n found = new Types.TableType(found, { withHeader: text.includes(\"WITH HEADER LINE\") }, name);\r\n }\r\n }\r\n else if (text.startsWith(\"TYPE LINE OF \")) {\r\n const sub = node.findFirstExpression(Expressions.TypeName);\r\n found = this.resolveTypeName(sub);\r\n if (found instanceof _typed_identifier_1.TypedIdentifier) {\r\n found = found.getType();\r\n }\r\n if (found instanceof Types.TableType) {\r\n return found.getRowType();\r\n }\r\n else if (found instanceof Types.VoidType) {\r\n return found;\r\n }\r\n else if (found instanceof Types.UnknownType) {\r\n return new Types.UnknownType(\"TYPE LINE OF, unknown type, \" + found.getError());\r\n }\r\n else {\r\n return new Types.UnknownType(\"TYPE LINE OF, unexpected type, \" + (found === null || found === void 0 ? void 0 : found.constructor.name));\r\n }\r\n }\r\n else if (text.startsWith(\"TYPE REF TO \")) {\r\n found = this.resolveTypeRef(typename);\r\n }\r\n else if (text.startsWith(\"TYPE\")) {\r\n found = this.resolveTypeName(typename, this.findLength(node), this.findDecimals(node));\r\n const concat = node.concatTokens().toUpperCase();\r\n if (found && concat.includes(\" OCCURS \")) {\r\n found = new Types.TableType(found, { withHeader: concat.includes(\"WITH HEADER LINE\") }, name);\r\n }\r\n else if (found && concat.includes(\"WITH HEADER LINE\")) {\r\n if (found instanceof Types.VoidType) {\r\n found = new Types.TableType(found, { withHeader: true });\r\n }\r\n else if (!(found instanceof Types.TableType)) {\r\n throw new Error(\"WITH HEADER LINE can only be used with internal table\");\r\n }\r\n else {\r\n found = new Types.TableType(found.getRowType(), { withHeader: true });\r\n }\r\n }\r\n if (found === undefined && typename === undefined) {\r\n let length = 1;\r\n const len = node.findDirectExpression(Expressions.ConstantFieldLength);\r\n if (len) {\r\n const int = len.findDirectExpression(Expressions.Integer);\r\n if (int) {\r\n length = parseInt(int.concatTokens(), 10);\r\n }\r\n }\r\n found = new Types.CharacterType(length, name); // fallback\r\n if (concat.includes(\" OCCURS \")) {\r\n found = new Types.TableType(found, { withHeader: concat.includes(\"WITH HEADER LINE\") }, name);\r\n }\r\n }\r\n }\r\n return found;\r\n }\r\n /////////////////////\r\n // todo, rewrite this method\r\n resolveTypeChain(expr) {\r\n const chainText = expr.concatTokens().toUpperCase();\r\n if (chainText.includes(\"=>\") === false && chainText.includes(\"-\") === false) {\r\n return undefined;\r\n }\r\n let className;\r\n let rest = chainText;\r\n if (chainText.includes(\"=>\")) {\r\n const split = chainText.split(\"=>\");\r\n className = split[0];\r\n rest = split[1];\r\n }\r\n const subs = rest.split(\"-\");\r\n let foundType = undefined;\r\n if (className) {\r\n const split = chainText.split(\"=>\");\r\n const className = split[0];\r\n // the prefix might be itself\r\n if ((this.scope.getType() === _scope_type_1.ScopeType.Interface\r\n || this.scope.getType() === _scope_type_1.ScopeType.ClassDefinition)\r\n && this.scope.getName().toUpperCase() === className.toUpperCase()) {\r\n const foundId = this.scope.findType(subs[0]);\r\n foundType = foundId === null || foundId === void 0 ? void 0 : foundId.getType();\r\n if (foundType === undefined) {\r\n return new Types.UnknownType(\"Could not resolve type \" + chainText);\r\n }\r\n this.scope.addReference(expr.getTokens()[2], foundId, _reference_1.ReferenceType.TypeReference, this.filename);\r\n }\r\n else {\r\n // lookup in local and global scope\r\n const obj = this.scope.findObjectDefinition(className);\r\n if (obj === undefined && this.scope.getDDIC().inErrorNamespace(className) === false) {\r\n return new Types.VoidType(className);\r\n }\r\n else if (obj === undefined) {\r\n return new Types.UnknownType(\"Could not resolve top \" + className + \", resolveTypeChain\");\r\n }\r\n const type = obj instanceof types_1.ClassDefinition ? \"CLAS\" : \"INTF\";\r\n this.scope.addReference(expr.getFirstToken(), obj, _reference_1.ReferenceType.ObjectOrientedReference, this.filename, { ooType: type, ooName: className });\r\n const byName = new _object_oriented_1.ObjectOriented(this.scope).searchTypeName(obj, subs[0]);\r\n foundType = byName === null || byName === void 0 ? void 0 : byName.getType();\r\n if (byName === undefined || foundType === undefined) {\r\n return new Types.UnknownType(subs[0] + \" not found in class or interface\");\r\n }\r\n this.scope.addReference(expr.getTokens()[2], byName, _reference_1.ReferenceType.TypeReference, this.filename);\r\n }\r\n }\r\n else {\r\n const found = this.scope.findType(subs[0]);\r\n foundType = found === null || found === void 0 ? void 0 : found.getType();\r\n if (foundType === undefined) {\r\n const f = this.scope.getDDIC().lookupTableOrView(subs[0]);\r\n this.scope.getDDICReferences().addUsing(this.scope.getParentObj(), f.object);\r\n if (f.type instanceof _typed_identifier_1.TypedIdentifier) {\r\n foundType = f.type.getType();\r\n }\r\n else {\r\n foundType = f.type;\r\n }\r\n }\r\n else {\r\n this.scope.addReference(expr.getFirstToken(), found, _reference_1.ReferenceType.TypeReference, this.filename);\r\n }\r\n if (foundType === undefined && this.scope.getDDIC().inErrorNamespace(subs[0]) === false) {\r\n this.scope.addReference(expr.getFirstToken(), undefined, _reference_1.ReferenceType.VoidType, this.filename);\r\n return new Types.VoidType(subs[0]);\r\n }\r\n else if (foundType instanceof Types.VoidType) {\r\n this.scope.addReference(expr.getFirstToken(), undefined, _reference_1.ReferenceType.VoidType, this.filename);\r\n return foundType;\r\n }\r\n else if (foundType === undefined) {\r\n return new Types.UnknownType(\"Unknown type \" + subs[0]);\r\n }\r\n }\r\n subs.shift();\r\n while (subs.length > 0) {\r\n if (foundType instanceof Types.UnknownType) {\r\n return foundType;\r\n }\r\n else if (!(foundType instanceof Types.StructureType)) {\r\n return new Types.UnknownType(\"Not a structured type\");\r\n }\r\n foundType = foundType.getComponentByName(subs[0]);\r\n subs.shift();\r\n }\r\n return foundType;\r\n }\r\n resolveConstantValue(expr) {\r\n var _a;\r\n if (!(expr.get() instanceof Expressions.SimpleFieldChain)) {\r\n throw new Error(\"resolveConstantValue\");\r\n }\r\n const first = expr.getFirstChild();\r\n if (first.get() instanceof Expressions.Field) {\r\n const token = first.getFirstToken();\r\n const name = token.getStr();\r\n const found = this.scope.findVariable(name);\r\n const val = found === null || found === void 0 ? void 0 : found.getValue();\r\n if (typeof val === \"string\") {\r\n this.scope.addReference(token, found, _reference_1.ReferenceType.DataReadReference, this.filename);\r\n return val;\r\n }\r\n return undefined;\r\n }\r\n else if (first.get() instanceof Expressions.ClassName) {\r\n const name = first.getFirstToken().getStr();\r\n const obj = this.scope.findObjectDefinition(name);\r\n if (obj === undefined) {\r\n if (this.scope.existsObject(name).found === true) {\r\n return undefined;\r\n }\r\n if (this.scope.getDDIC().inErrorNamespace(name) === true) {\r\n throw new Error(\"resolveConstantValue, not found: \" + name);\r\n }\r\n else {\r\n return undefined;\r\n }\r\n }\r\n const children = expr.getChildren();\r\n const token = (_a = children[2]) === null || _a === void 0 ? void 0 : _a.getFirstToken();\r\n const attr = token.getStr();\r\n const c = new _object_oriented_1.ObjectOriented(this.scope).searchConstantName(obj, attr);\r\n if (c instanceof class_constant_1.ClassConstant) {\r\n this.scope.addReference(token, c, _reference_1.ReferenceType.DataReadReference, this.filename);\r\n const val = c.getValue();\r\n if (typeof val === \"string\") {\r\n return val;\r\n }\r\n else if (typeof val === \"object\" && children[4]) {\r\n const name = children[4].getFirstToken().getStr();\r\n if (val[name] !== undefined) {\r\n return val[name];\r\n }\r\n }\r\n return undefined;\r\n }\r\n throw new Error(\"resolveConstantValue, constant not found \" + attr);\r\n }\r\n else {\r\n throw new Error(\"resolveConstantValue, unexpected structure\");\r\n }\r\n }\r\n resolveTypeRef(chain) {\r\n var _a;\r\n if (chain === undefined) {\r\n return undefined;\r\n }\r\n const name = chain.getFirstToken().getStr();\r\n if (chain.getAllTokens().length === 1) {\r\n if (name.toUpperCase() === \"OBJECT\") {\r\n return new Types.GenericObjectReferenceType();\r\n }\r\n const search = this.scope.existsObject(name);\r\n if (search.found === true && search.id) {\r\n this.scope.addReference(chain.getFirstToken(), search.id, _reference_1.ReferenceType.ObjectOrientedReference, this.filename, { ooType: search.ooType, ooName: name });\r\n return new Types.ObjectReferenceType(search.id);\r\n }\r\n }\r\n const found = this.resolveTypeName(chain);\r\n if (found && !(found instanceof Types.UnknownType) && !(found instanceof Types.VoidType)) {\r\n return new Types.DataReference(found);\r\n }\r\n else if (chain.concatTokens().toUpperCase() === \"DATA\") {\r\n return new Types.DataReference(new Types.AnyType());\r\n }\r\n if (this.scope.isBadiDef(name) === true) {\r\n return new Types.VoidType(name);\r\n }\r\n if (((_a = this.scope.getDDIC()) === null || _a === void 0 ? void 0 : _a.inErrorNamespace(name)) === false) {\r\n // this.scope.addReference(chain.getFirstToken(), undefined, ReferenceType.VoidType, this.filename);\r\n return new Types.VoidType(name);\r\n }\r\n return new Types.UnknownType(\"REF, unable to resolve \" + name);\r\n }\r\n findValue(node) {\r\n const val = node.findFirstExpression(Expressions.Value);\r\n if (val === undefined) {\r\n throw new Error(\"VALUE missing in expression\");\r\n }\r\n if (val.concatTokens().toUpperCase() === \"VALUE IS INITIAL\") {\r\n return \"\";\r\n }\r\n const constant = val.findFirstExpression(Expressions.Constant);\r\n if (constant) {\r\n return constant.concatTokens();\r\n }\r\n const chain = val.findFirstExpression(Expressions.SimpleFieldChain);\r\n if (chain) {\r\n return this.resolveConstantValue(chain);\r\n }\r\n throw new Error(\"findValue, unexpected\");\r\n }\r\n findDecimals(node) {\r\n var _a, _b;\r\n const dec = (_b = (_a = node.findDirectExpression(Expressions.Decimals)) === null || _a === void 0 ? void 0 : _a.findDirectExpression(Expressions.Integer)) === null || _b === void 0 ? void 0 : _b.concatTokens();\r\n if (dec) {\r\n return parseInt(dec, 10);\r\n }\r\n return undefined;\r\n }\r\n findLength(node) {\r\n const val = node.findFirstExpression(Expressions.Length);\r\n const flen = node.findFirstExpression(Expressions.ConstantFieldLength);\r\n if (val && flen) {\r\n throw new Error(\"Only specify length once\");\r\n }\r\n if (flen) {\r\n const cintExpr = flen.findFirstExpression(Expressions.Integer);\r\n if (cintExpr) {\r\n return this.parseInt(cintExpr.concatTokens());\r\n }\r\n const cchain = flen.findFirstExpression(Expressions.SimpleFieldChain);\r\n if (cchain) {\r\n const val = this.resolveConstantValue(cchain);\r\n return this.parseInt(val);\r\n }\r\n }\r\n if (val === undefined) {\r\n return 1;\r\n }\r\n const intExpr = val.findFirstExpression(Expressions.Integer);\r\n if (intExpr) {\r\n return this.parseInt(intExpr.concatTokens());\r\n }\r\n const strExpr = val.findFirstExpression(Expressions.ConstantString);\r\n if (strExpr) {\r\n return this.parseInt(strExpr.concatTokens());\r\n }\r\n const chain = val.findFirstExpression(Expressions.SimpleFieldChain);\r\n if (chain) {\r\n const val = this.resolveConstantValue(chain);\r\n return this.parseInt(val);\r\n }\r\n throw new Error(\"Unexpected, findLength\");\r\n }\r\n parseInt(text) {\r\n if (text === undefined) {\r\n return undefined;\r\n }\r\n if (text.startsWith(\"'\")) {\r\n text = text.split(\"'\")[1];\r\n }\r\n else if (text.startsWith(\"`\")) {\r\n text = text.split(\"`\")[1];\r\n }\r\n return parseInt(text, 10);\r\n }\r\n}\r\nexports.BasicTypes = BasicTypes;\r\n//# sourceMappingURL=basic_types.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/basic_types.js?");
6300
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.BasicTypes = void 0;\r\n/* eslint-disable default-case */\r\nconst _typed_identifier_1 = __webpack_require__(/*! ../types/_typed_identifier */ \"./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js\");\r\nconst Expressions = __webpack_require__(/*! ../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst Types = __webpack_require__(/*! ../types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst _scope_type_1 = __webpack_require__(/*! ./_scope_type */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js\");\r\nconst _object_oriented_1 = __webpack_require__(/*! ./_object_oriented */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_object_oriented.js\");\r\nconst class_constant_1 = __webpack_require__(/*! ../types/class_constant */ \"./node_modules/@abaplint/core/build/src/abap/types/class_constant.js\");\r\nconst identifier_1 = __webpack_require__(/*! ../1_lexer/tokens/identifier */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/identifier.js\");\r\nconst _reference_1 = __webpack_require__(/*! ./_reference */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js\");\r\nconst basic_1 = __webpack_require__(/*! ../types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst field_chain_1 = __webpack_require__(/*! ./expressions/field_chain */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/field_chain.js\");\r\nconst types_1 = __webpack_require__(/*! ../types */ \"./node_modules/@abaplint/core/build/src/abap/types/index.js\");\r\nconst expressions_1 = __webpack_require__(/*! ../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nclass BasicTypes {\r\n constructor(filename, scope) {\r\n this.filename = filename;\r\n this.scope = scope;\r\n }\r\n lookupQualifiedName(name) {\r\n var _a;\r\n if (name === undefined) {\r\n return undefined;\r\n }\r\n const found = this.scope.findType(name);\r\n if (found) {\r\n return found;\r\n }\r\n if (name.includes(\"=>\")) {\r\n const split = name.split(\"=>\");\r\n const ooName = split[0];\r\n const typeName = split[1];\r\n const oo = this.scope.findObjectDefinition(ooName);\r\n if (oo) {\r\n const f = oo.getTypeDefinitions().getByName(typeName);\r\n if (f) {\r\n return f;\r\n }\r\n }\r\n }\r\n const lookup = this.scope.getDDIC().lookupNoVoid(name);\r\n const id = (_a = lookup === null || lookup === void 0 ? void 0 : lookup.object) === null || _a === void 0 ? void 0 : _a.getIdentifier();\r\n if (id && (lookup === null || lookup === void 0 ? void 0 : lookup.type)) {\r\n return new _typed_identifier_1.TypedIdentifier(id.getToken(), id.getFilename(), lookup.type);\r\n }\r\n return undefined;\r\n }\r\n resolveLikeName(node, headerLogic = true) {\r\n var _a;\r\n if (node === undefined) {\r\n return undefined;\r\n }\r\n let chain = node.findFirstExpression(Expressions.FieldChain);\r\n if (chain === undefined) {\r\n chain = node.findFirstExpression(Expressions.TypeName);\r\n }\r\n if (chain === undefined) {\r\n chain = node.findFirstExpression(Expressions.FieldSub);\r\n }\r\n if (chain === undefined) {\r\n throw new Error(\"resolveLikeName, chain undefined\");\r\n }\r\n const fullName = chain.concatTokens();\r\n const children = [...chain.getChildren()];\r\n if (children.length === 0) {\r\n return new Types.UnknownType(\"Type error, could not resolve \\\"\" + fullName + \"\\\", resolveLikeName1\");\r\n }\r\n let type = undefined;\r\n if (children[1] && (children[1].getFirstToken().getStr() === \"=>\" || children[1].getFirstToken().getStr() === \"->\")) {\r\n type = new field_chain_1.FieldChain().runSyntax(chain, this.scope, this.filename, _reference_1.ReferenceType.TypeReference);\r\n }\r\n else {\r\n const name = children.shift().getFirstToken().getStr();\r\n const found = this.scope.findVariable(name);\r\n type = found === null || found === void 0 ? void 0 : found.getType();\r\n if (found) {\r\n this.scope.addReference(chain === null || chain === void 0 ? void 0 : chain.getFirstToken(), found, _reference_1.ReferenceType.TypeReference, this.filename);\r\n }\r\n if (type === undefined) {\r\n type = (_a = this.scope.getDDIC().lookupNoVoid(name)) === null || _a === void 0 ? void 0 : _a.type;\r\n }\r\n if (type === undefined && this.scope.isOO() === false && this.scope.getDDIC().inErrorNamespace(name) === false) {\r\n this.scope.addReference(chain.getChildren()[0].getFirstToken(), undefined, _reference_1.ReferenceType.VoidType, this.filename);\r\n return new Types.VoidType(name);\r\n }\r\n while (children.length > 0) {\r\n const child = children.shift();\r\n if (child.getFirstToken().getStr() === \"-\") {\r\n if (type instanceof Types.VoidType) {\r\n return type;\r\n }\r\n }\r\n else if (child.concatTokens() === \"[]\") {\r\n if (type instanceof Types.TableType) {\r\n type = new basic_1.TableType(type.getRowType(), { withHeader: false });\r\n }\r\n }\r\n else { // field name\r\n let sub = undefined;\r\n if (type instanceof Types.TableType) {\r\n type = type.getRowType();\r\n }\r\n if (type instanceof Types.StructureType) {\r\n sub = type.getComponentByName(child.getFirstToken().getStr());\r\n }\r\n if (sub === undefined) {\r\n return new Types.UnknownType(\"Type error, field not part of structure \" + fullName);\r\n }\r\n type = sub;\r\n }\r\n }\r\n if (type instanceof Types.VoidType) {\r\n return type;\r\n }\r\n else if (type instanceof basic_1.TableType\r\n && type.isWithHeader()\r\n && headerLogic === true) {\r\n type = type.getRowType();\r\n }\r\n else if (type instanceof Types.TableType\r\n && type.isWithHeader() === true\r\n && type.getRowType() instanceof Types.VoidType) {\r\n return type.getRowType();\r\n }\r\n }\r\n if (!type) {\r\n return new Types.UnknownType(\"Type error, could not resolve \\\"\" + fullName + \"\\\", resolveLikeName2\");\r\n }\r\n return type;\r\n }\r\n resolveTypeName(typeName, length, decimals) {\r\n if (typeName === undefined) {\r\n return undefined;\r\n }\r\n const chain = this.resolveTypeChain(typeName);\r\n if (chain) {\r\n return chain;\r\n }\r\n const chainText = typeName.concatTokens().toUpperCase();\r\n const f = this.scope.getDDIC().lookupBuiltinType(chainText, length, decimals);\r\n if (f !== undefined) {\r\n return f;\r\n }\r\n const typ = this.scope.findType(chainText);\r\n if (typ) {\r\n const token = typeName.getFirstToken();\r\n if (chainText.includes(\"~\")) {\r\n const name = chainText.split(\"~\")[0];\r\n const idef = this.scope.findInterfaceDefinition(name);\r\n if (idef) {\r\n this.scope.addReference(token, idef, _reference_1.ReferenceType.ObjectOrientedReference, this.filename, { ooType: \"INTF\", ooName: name });\r\n }\r\n }\r\n this.scope.addReference(token, typ, _reference_1.ReferenceType.TypeReference, this.filename);\r\n return typ.getType();\r\n }\r\n const type = this.scope.findTypePoolType(chainText);\r\n if (type) {\r\n this.scope.addReference(typeName.getFirstToken(), typ, _reference_1.ReferenceType.TypeReference, this.filename);\r\n return type;\r\n }\r\n const ddic = this.scope.getDDIC().lookup(chainText);\r\n if (ddic) {\r\n this.scope.getDDICReferences().addUsing(this.scope.getParentObj(), { object: ddic.object, token: typeName.getFirstToken(), filename: this.filename });\r\n if (ddic.type instanceof _typed_identifier_1.TypedIdentifier) {\r\n this.scope.addReference(typeName.getFirstToken(), ddic.type, _reference_1.ReferenceType.TypeReference, this.filename);\r\n }\r\n else if (ddic.type instanceof basic_1.VoidType) {\r\n this.scope.addReference(typeName.getFirstToken(), undefined, _reference_1.ReferenceType.VoidType, this.filename);\r\n }\r\n return ddic.type;\r\n }\r\n return undefined;\r\n }\r\n simpleType(node) {\r\n let nameExpr = node.findFirstExpression(Expressions.NamespaceSimpleName);\r\n if (nameExpr === undefined) {\r\n nameExpr = node.findFirstExpression(Expressions.DefinitionName);\r\n }\r\n if (nameExpr === undefined) {\r\n return undefined;\r\n }\r\n let name = nameExpr.getFirstToken();\r\n if (nameExpr.countTokens() > 1) { // workaround for names with dashes\r\n name = new identifier_1.Identifier(name.getStart(), nameExpr.concatTokens());\r\n }\r\n const found = this.parseType(node);\r\n if (found) {\r\n return new _typed_identifier_1.TypedIdentifier(name, this.filename, found);\r\n }\r\n return undefined;\r\n }\r\n parseTable(node, name) {\r\n var _a;\r\n const typename = node.findFirstExpression(Expressions.TypeName);\r\n const text = (_a = node.findFirstExpression(Expressions.TypeTable)) === null || _a === void 0 ? void 0 : _a.concatTokens().toUpperCase();\r\n if (text === undefined) {\r\n return undefined;\r\n }\r\n let type = undefined;\r\n if (text.includes(\" STANDARD TABLE \")) {\r\n type = basic_1.TableAccessType.standard;\r\n }\r\n else if (text.includes(\" SORTED TABLE \")) {\r\n type = basic_1.TableAccessType.sorted;\r\n }\r\n else if (text.includes(\" HASHED TABLE \")) {\r\n type = basic_1.TableAccessType.hashed;\r\n }\r\n const keyFields = [];\r\n if (type) {\r\n const keys = node.findFirstExpression(expressions_1.TypeTableKey);\r\n for (const k of (keys === null || keys === void 0 ? void 0 : keys.findDirectExpressions(expressions_1.FieldSub)) || []) {\r\n keyFields.push(k.concatTokens().toUpperCase());\r\n }\r\n }\r\n const options = {\r\n withHeader: text.includes(\"WITH HEADER LINE\"),\r\n type: type,\r\n isUnique: text.includes(\"WITH UNIQUE\"),\r\n keyFields: keyFields,\r\n };\r\n let found = undefined;\r\n if (text.startsWith(\"TYPE TABLE OF REF TO \")\r\n || text.startsWith(\"TYPE STANDARD TABLE OF REF TO \")\r\n || text.startsWith(\"TYPE SORTED TABLE OF REF TO \")\r\n || text.startsWith(\"TYPE HASHED TABLE OF REF TO \")) {\r\n found = this.resolveTypeRef(typename);\r\n if (found) {\r\n return new Types.TableType(found, options, name);\r\n }\r\n }\r\n else if (text.startsWith(\"TYPE TABLE OF \")\r\n || text.startsWith(\"TYPE STANDARD TABLE OF \")\r\n || text.startsWith(\"TYPE SORTED TABLE OF \")\r\n || text.startsWith(\"TYPE HASHED TABLE OF \")) {\r\n found = this.resolveTypeName(typename);\r\n if (found) {\r\n return new Types.TableType(found, options, name);\r\n }\r\n }\r\n else if (text.startsWith(\"LIKE TABLE OF \")\r\n || text.startsWith(\"LIKE STANDARD TABLE OF \")\r\n || text.startsWith(\"LIKE SORTED TABLE OF \")\r\n || text.startsWith(\"LIKE HASHED TABLE OF \")) {\r\n found = this.resolveLikeName(node);\r\n if (found) {\r\n return new Types.TableType(found, options, name);\r\n }\r\n }\r\n else if (text === \"TYPE STANDARD TABLE\"\r\n || text === \"TYPE SORTED TABLE\"\r\n || text === \"TYPE HASHED TABLE\"\r\n || text === \"TYPE INDEX TABLE\"\r\n || text === \"TYPE ANY TABLE\") {\r\n return new Types.TableType(new Types.AnyType(), options);\r\n }\r\n else if (text.startsWith(\"TYPE RANGE OF \")) {\r\n const sub = node.findFirstExpression(Expressions.TypeName);\r\n found = this.resolveTypeName(sub);\r\n if (found === undefined) {\r\n return new Types.UnknownType(\"TYPE RANGE OF, could not resolve type\");\r\n }\r\n const structure = new Types.StructureType([\r\n { name: \"sign\", type: new Types.CharacterType(1) },\r\n { name: \"option\", type: new Types.CharacterType(2) },\r\n { name: \"low\", type: found },\r\n { name: \"high\", type: found },\r\n ], name);\r\n return new Types.TableType(structure, options);\r\n }\r\n else if (text.startsWith(\"LIKE RANGE OF \")) {\r\n const sub = node.findFirstExpression(Expressions.FieldSub);\r\n found = this.resolveLikeName(sub);\r\n if (found === undefined) {\r\n return new Types.UnknownType(\"LIKE RANGE OF, could not resolve type\");\r\n }\r\n const structure = new Types.StructureType([\r\n { name: \"sign\", type: new Types.CharacterType(1) },\r\n { name: \"option\", type: new Types.CharacterType(2) },\r\n { name: \"low\", type: found },\r\n { name: \"high\", type: found },\r\n ], name);\r\n return new Types.TableType(structure, options);\r\n }\r\n // fallback to old style syntax, OCCURS etc\r\n return this.parseType(node, name);\r\n }\r\n parseType(node, name) {\r\n var _a, _b, _c, _d, _e, _f;\r\n const typename = node.findFirstExpression(Expressions.TypeName);\r\n let text = (_a = node.findFirstExpression(Expressions.Type)) === null || _a === void 0 ? void 0 : _a.concatTokens().toUpperCase();\r\n if (text === undefined) {\r\n text = (_b = node.findFirstExpression(Expressions.TypeParam)) === null || _b === void 0 ? void 0 : _b.concatTokens().toUpperCase();\r\n }\r\n if (text === undefined) {\r\n text = (_c = node.findFirstExpression(Expressions.TypeTable)) === null || _c === void 0 ? void 0 : _c.concatTokens().toUpperCase();\r\n if ((text === null || text === void 0 ? void 0 : text.startsWith(\"TYPE\")) === false && (text === null || text === void 0 ? void 0 : text.startsWith(\"LIKE\")) === false) {\r\n text = \"TYPE\";\r\n }\r\n }\r\n if (text === undefined) {\r\n text = (_d = node.findFirstExpression(Expressions.FormParamType)) === null || _d === void 0 ? void 0 : _d.concatTokens().toUpperCase();\r\n }\r\n if (text === undefined) {\r\n text = \"TYPE\";\r\n }\r\n let found = undefined;\r\n if (text.startsWith(\"LIKE LINE OF \")) {\r\n const name = (_e = node.findFirstExpression(Expressions.FieldChain)) === null || _e === void 0 ? void 0 : _e.concatTokens();\r\n let e = node.findFirstExpression(Expressions.Type);\r\n if (e === undefined) {\r\n e = node.findFirstExpression(Expressions.FormParamType);\r\n }\r\n const type = this.resolveLikeName(e, false);\r\n if (type === undefined) {\r\n return new Types.UnknownType(\"Type error, could not resolve \\\"\" + name + \"\\\", parseType\");\r\n }\r\n else if (type instanceof Types.TableType) {\r\n return type.getRowType();\r\n }\r\n else if (type instanceof Types.VoidType) {\r\n return type;\r\n }\r\n else {\r\n return new Types.UnknownType(\"Type error, not a table type \" + name);\r\n }\r\n }\r\n else if (text.startsWith(\"LIKE REF TO \")) {\r\n const name = (_f = node.findFirstExpression(Expressions.FieldChain)) === null || _f === void 0 ? void 0 : _f.concatTokens();\r\n const type = this.resolveLikeName(node.findFirstExpression(Expressions.Type), false);\r\n if (type === undefined) {\r\n return new Types.UnknownType(\"Type error, could not resolve \\\"\" + name + \"\\\", parseType\");\r\n }\r\n return new Types.DataReference(type);\r\n }\r\n else if (text === \"TYPE STANDARD TABLE\"\r\n || text === \"TYPE SORTED TABLE\"\r\n || text === \"TYPE HASHED TABLE\"\r\n || text === \"TYPE INDEX TABLE\"\r\n || text === \"TYPE ANY TABLE\") {\r\n return new Types.TableType(new Types.AnyType(), { withHeader: node.concatTokens().toUpperCase().includes(\"WITH HEADER LINE\") });\r\n }\r\n else if (text.startsWith(\"LIKE \")) {\r\n let sub = node.findFirstExpression(Expressions.Type);\r\n if (sub === undefined) {\r\n sub = node.findFirstExpression(Expressions.FormParamType);\r\n }\r\n if (sub === undefined) {\r\n sub = node.findFirstExpression(Expressions.TypeParam);\r\n }\r\n if (sub === undefined) {\r\n sub = node.findFirstExpression(Expressions.FieldChain);\r\n }\r\n found = this.resolveLikeName(sub);\r\n if (found && text.includes(\" OCCURS \")) {\r\n found = new Types.TableType(found, { withHeader: text.includes(\"WITH HEADER LINE\") }, name);\r\n }\r\n }\r\n else if (text.startsWith(\"TYPE LINE OF \")) {\r\n const sub = node.findFirstExpression(Expressions.TypeName);\r\n found = this.resolveTypeName(sub);\r\n if (found instanceof _typed_identifier_1.TypedIdentifier) {\r\n found = found.getType();\r\n }\r\n if (found instanceof Types.TableType) {\r\n return found.getRowType();\r\n }\r\n else if (found instanceof Types.VoidType) {\r\n return found;\r\n }\r\n else if (found instanceof Types.UnknownType) {\r\n return new Types.UnknownType(\"TYPE LINE OF, unknown type, \" + found.getError());\r\n }\r\n else {\r\n return new Types.UnknownType(\"TYPE LINE OF, unexpected type, \" + (found === null || found === void 0 ? void 0 : found.constructor.name));\r\n }\r\n }\r\n else if (text.startsWith(\"TYPE REF TO \")) {\r\n found = this.resolveTypeRef(typename);\r\n }\r\n else if (text.startsWith(\"TYPE\")) {\r\n found = this.resolveTypeName(typename, this.findLength(node), this.findDecimals(node));\r\n const concat = node.concatTokens().toUpperCase();\r\n if (found && concat.includes(\" OCCURS \")) {\r\n found = new Types.TableType(found, { withHeader: concat.includes(\"WITH HEADER LINE\") }, name);\r\n }\r\n else if (found && concat.includes(\"WITH HEADER LINE\")) {\r\n if (found instanceof Types.VoidType) {\r\n found = new Types.TableType(found, { withHeader: true });\r\n }\r\n else if (!(found instanceof Types.TableType)) {\r\n throw new Error(\"WITH HEADER LINE can only be used with internal table\");\r\n }\r\n else {\r\n found = new Types.TableType(found.getRowType(), { withHeader: true });\r\n }\r\n }\r\n if (found === undefined && typename === undefined) {\r\n let length = 1;\r\n const len = node.findDirectExpression(Expressions.ConstantFieldLength);\r\n if (len) {\r\n const int = len.findDirectExpression(Expressions.Integer);\r\n if (int) {\r\n length = parseInt(int.concatTokens(), 10);\r\n }\r\n }\r\n found = new Types.CharacterType(length, name); // fallback\r\n if (concat.includes(\" OCCURS \")) {\r\n found = new Types.TableType(found, { withHeader: concat.includes(\"WITH HEADER LINE\") }, name);\r\n }\r\n }\r\n }\r\n return found;\r\n }\r\n /////////////////////\r\n // todo, rewrite this method\r\n resolveTypeChain(expr) {\r\n const chainText = expr.concatTokens().toUpperCase();\r\n if (chainText.includes(\"=>\") === false && chainText.includes(\"-\") === false) {\r\n return undefined;\r\n }\r\n let className;\r\n let rest = chainText;\r\n if (chainText.includes(\"=>\")) {\r\n const split = chainText.split(\"=>\");\r\n className = split[0];\r\n rest = split[1];\r\n }\r\n const subs = rest.split(\"-\");\r\n let foundType = undefined;\r\n if (className) {\r\n const split = chainText.split(\"=>\");\r\n const className = split[0];\r\n // the prefix might be itself\r\n if ((this.scope.getType() === _scope_type_1.ScopeType.Interface\r\n || this.scope.getType() === _scope_type_1.ScopeType.ClassDefinition)\r\n && this.scope.getName().toUpperCase() === className.toUpperCase()) {\r\n const foundId = this.scope.findType(subs[0]);\r\n foundType = foundId === null || foundId === void 0 ? void 0 : foundId.getType();\r\n if (foundType === undefined) {\r\n return new Types.UnknownType(\"Could not resolve type \" + chainText);\r\n }\r\n this.scope.addReference(expr.getTokens()[2], foundId, _reference_1.ReferenceType.TypeReference, this.filename);\r\n }\r\n else {\r\n // lookup in local and global scope\r\n const obj = this.scope.findObjectDefinition(className);\r\n if (obj === undefined && this.scope.getDDIC().inErrorNamespace(className) === false) {\r\n return new Types.VoidType(className);\r\n }\r\n else if (obj === undefined) {\r\n return new Types.UnknownType(\"Could not resolve top \" + className + \", resolveTypeChain\");\r\n }\r\n const type = obj instanceof types_1.ClassDefinition ? \"CLAS\" : \"INTF\";\r\n this.scope.addReference(expr.getFirstToken(), obj, _reference_1.ReferenceType.ObjectOrientedReference, this.filename, { ooType: type, ooName: className });\r\n const byName = new _object_oriented_1.ObjectOriented(this.scope).searchTypeName(obj, subs[0]);\r\n foundType = byName === null || byName === void 0 ? void 0 : byName.getType();\r\n if (byName === undefined || foundType === undefined) {\r\n return new Types.UnknownType(subs[0] + \" not found in class or interface\");\r\n }\r\n this.scope.addReference(expr.getTokens()[2], byName, _reference_1.ReferenceType.TypeReference, this.filename);\r\n }\r\n }\r\n else {\r\n const found = this.scope.findType(subs[0]);\r\n foundType = found === null || found === void 0 ? void 0 : found.getType();\r\n if (foundType === undefined) {\r\n const f = this.scope.getDDIC().lookupTableOrView(subs[0]);\r\n this.scope.getDDICReferences().addUsing(this.scope.getParentObj(), { object: f.object });\r\n if (f.type instanceof _typed_identifier_1.TypedIdentifier) {\r\n foundType = f.type.getType();\r\n }\r\n else {\r\n foundType = f.type;\r\n }\r\n }\r\n else {\r\n this.scope.addReference(expr.getFirstToken(), found, _reference_1.ReferenceType.TypeReference, this.filename);\r\n }\r\n if (foundType === undefined && this.scope.getDDIC().inErrorNamespace(subs[0]) === false) {\r\n this.scope.addReference(expr.getFirstToken(), undefined, _reference_1.ReferenceType.VoidType, this.filename);\r\n return new Types.VoidType(subs[0]);\r\n }\r\n else if (foundType instanceof Types.VoidType) {\r\n this.scope.addReference(expr.getFirstToken(), undefined, _reference_1.ReferenceType.VoidType, this.filename);\r\n return foundType;\r\n }\r\n else if (foundType === undefined) {\r\n return new Types.UnknownType(\"Unknown type \" + subs[0]);\r\n }\r\n }\r\n subs.shift();\r\n while (subs.length > 0) {\r\n if (foundType instanceof Types.UnknownType) {\r\n return foundType;\r\n }\r\n else if (!(foundType instanceof Types.StructureType)) {\r\n return new Types.UnknownType(\"Not a structured type\");\r\n }\r\n foundType = foundType.getComponentByName(subs[0]);\r\n subs.shift();\r\n }\r\n return foundType;\r\n }\r\n resolveConstantValue(expr) {\r\n var _a;\r\n if (!(expr.get() instanceof Expressions.SimpleFieldChain)) {\r\n throw new Error(\"resolveConstantValue\");\r\n }\r\n const first = expr.getFirstChild();\r\n if (first.get() instanceof Expressions.Field) {\r\n const token = first.getFirstToken();\r\n const name = token.getStr();\r\n const found = this.scope.findVariable(name);\r\n const val = found === null || found === void 0 ? void 0 : found.getValue();\r\n if (typeof val === \"string\") {\r\n this.scope.addReference(token, found, _reference_1.ReferenceType.DataReadReference, this.filename);\r\n return val;\r\n }\r\n return undefined;\r\n }\r\n else if (first.get() instanceof Expressions.ClassName) {\r\n const name = first.getFirstToken().getStr();\r\n const obj = this.scope.findObjectDefinition(name);\r\n if (obj === undefined) {\r\n if (this.scope.existsObject(name).found === true) {\r\n return undefined;\r\n }\r\n if (this.scope.getDDIC().inErrorNamespace(name) === true) {\r\n throw new Error(\"resolveConstantValue, not found: \" + name);\r\n }\r\n else {\r\n return undefined;\r\n }\r\n }\r\n const children = expr.getChildren();\r\n const token = (_a = children[2]) === null || _a === void 0 ? void 0 : _a.getFirstToken();\r\n const attr = token.getStr();\r\n const c = new _object_oriented_1.ObjectOriented(this.scope).searchConstantName(obj, attr);\r\n if (c instanceof class_constant_1.ClassConstant) {\r\n this.scope.addReference(token, c, _reference_1.ReferenceType.DataReadReference, this.filename);\r\n const val = c.getValue();\r\n if (typeof val === \"string\") {\r\n return val;\r\n }\r\n else if (typeof val === \"object\" && children[4]) {\r\n const name = children[4].getFirstToken().getStr();\r\n if (val[name] !== undefined) {\r\n return val[name];\r\n }\r\n }\r\n return undefined;\r\n }\r\n throw new Error(\"resolveConstantValue, constant not found \" + attr);\r\n }\r\n else {\r\n throw new Error(\"resolveConstantValue, unexpected structure\");\r\n }\r\n }\r\n resolveTypeRef(chain) {\r\n var _a;\r\n if (chain === undefined) {\r\n return undefined;\r\n }\r\n const name = chain.getFirstToken().getStr();\r\n if (chain.getAllTokens().length === 1) {\r\n if (name.toUpperCase() === \"OBJECT\") {\r\n return new Types.GenericObjectReferenceType();\r\n }\r\n const search = this.scope.existsObject(name);\r\n if (search.found === true && search.id) {\r\n this.scope.addReference(chain.getFirstToken(), search.id, _reference_1.ReferenceType.ObjectOrientedReference, this.filename, { ooType: search.ooType, ooName: name });\r\n return new Types.ObjectReferenceType(search.id);\r\n }\r\n }\r\n const found = this.resolveTypeName(chain);\r\n if (found && !(found instanceof Types.UnknownType) && !(found instanceof Types.VoidType)) {\r\n return new Types.DataReference(found);\r\n }\r\n else if (chain.concatTokens().toUpperCase() === \"DATA\") {\r\n return new Types.DataReference(new Types.AnyType());\r\n }\r\n if (this.scope.isBadiDef(name) === true) {\r\n return new Types.VoidType(name);\r\n }\r\n if (((_a = this.scope.getDDIC()) === null || _a === void 0 ? void 0 : _a.inErrorNamespace(name)) === false) {\r\n // this.scope.addReference(chain.getFirstToken(), undefined, ReferenceType.VoidType, this.filename);\r\n return new Types.VoidType(name);\r\n }\r\n return new Types.UnknownType(\"REF, unable to resolve \" + name);\r\n }\r\n findValue(node) {\r\n const val = node.findFirstExpression(Expressions.Value);\r\n if (val === undefined) {\r\n throw new Error(\"VALUE missing in expression\");\r\n }\r\n if (val.concatTokens().toUpperCase() === \"VALUE IS INITIAL\") {\r\n return \"\";\r\n }\r\n const constant = val.findFirstExpression(Expressions.Constant);\r\n if (constant) {\r\n return constant.concatTokens();\r\n }\r\n const chain = val.findFirstExpression(Expressions.SimpleFieldChain);\r\n if (chain) {\r\n return this.resolveConstantValue(chain);\r\n }\r\n throw new Error(\"findValue, unexpected\");\r\n }\r\n findDecimals(node) {\r\n var _a, _b;\r\n const dec = (_b = (_a = node.findDirectExpression(Expressions.Decimals)) === null || _a === void 0 ? void 0 : _a.findDirectExpression(Expressions.Integer)) === null || _b === void 0 ? void 0 : _b.concatTokens();\r\n if (dec) {\r\n return parseInt(dec, 10);\r\n }\r\n return undefined;\r\n }\r\n findLength(node) {\r\n const val = node.findFirstExpression(Expressions.Length);\r\n const flen = node.findFirstExpression(Expressions.ConstantFieldLength);\r\n if (val && flen) {\r\n throw new Error(\"Only specify length once\");\r\n }\r\n if (flen) {\r\n const cintExpr = flen.findFirstExpression(Expressions.Integer);\r\n if (cintExpr) {\r\n return this.parseInt(cintExpr.concatTokens());\r\n }\r\n const cchain = flen.findFirstExpression(Expressions.SimpleFieldChain);\r\n if (cchain) {\r\n const val = this.resolveConstantValue(cchain);\r\n return this.parseInt(val);\r\n }\r\n }\r\n if (val === undefined) {\r\n return 1;\r\n }\r\n const intExpr = val.findFirstExpression(Expressions.Integer);\r\n if (intExpr) {\r\n return this.parseInt(intExpr.concatTokens());\r\n }\r\n const strExpr = val.findFirstExpression(Expressions.ConstantString);\r\n if (strExpr) {\r\n return this.parseInt(strExpr.concatTokens());\r\n }\r\n const chain = val.findFirstExpression(Expressions.SimpleFieldChain);\r\n if (chain) {\r\n const val = this.resolveConstantValue(chain);\r\n return this.parseInt(val);\r\n }\r\n throw new Error(\"Unexpected, findLength\");\r\n }\r\n parseInt(text) {\r\n if (text === undefined) {\r\n return undefined;\r\n }\r\n if (text.startsWith(\"'\")) {\r\n text = text.split(\"'\")[1];\r\n }\r\n else if (text.startsWith(\"`\")) {\r\n text = text.split(\"`\")[1];\r\n }\r\n return parseInt(text, 10);\r\n }\r\n}\r\nexports.BasicTypes = BasicTypes;\r\n//# sourceMappingURL=basic_types.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/basic_types.js?");
6301
6301
 
6302
6302
  /***/ }),
6303
6303
 
@@ -7111,7 +7111,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
7111
7111
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7112
7112
 
7113
7113
  "use strict";
7114
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.ClassLocalFriends = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst _reference_1 = __webpack_require__(/*! ../_reference */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js\");\r\nclass ClassLocalFriends {\r\n runSyntax(node, scope, filename) {\r\n const found = node.findDirectExpression(Expressions.ClassName);\r\n if (found) {\r\n const token = found.getFirstToken();\r\n const name = token.getStr();\r\n const def = scope.findClassDefinition(name);\r\n if (def) {\r\n scope.addReference(token, def, _reference_1.ReferenceType.ObjectOrientedReference, filename);\r\n }\r\n }\r\n }\r\n}\r\nexports.ClassLocalFriends = ClassLocalFriends;\r\n//# sourceMappingURL=class_local_friends.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/class_local_friends.js?");
7114
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.ClassLocalFriends = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst _reference_1 = __webpack_require__(/*! ../_reference */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js\");\r\nclass ClassLocalFriends {\r\n runSyntax(node, scope, filename) {\r\n const found = node.findDirectExpression(Expressions.ClassName);\r\n if (found) {\r\n const token = found.getFirstToken();\r\n const name = token.getStr();\r\n const def = scope.findClassDefinition(name);\r\n if (def) {\r\n scope.addReference(token, def, _reference_1.ReferenceType.ObjectOrientedReference, filename);\r\n }\r\n else {\r\n throw new Error(`Class ${name.toUpperCase()} not found`);\r\n }\r\n }\r\n }\r\n}\r\nexports.ClassLocalFriends = ClassLocalFriends;\r\n//# sourceMappingURL=class_local_friends.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/class_local_friends.js?");
7115
7115
 
7116
7116
  /***/ }),
7117
7117
 
@@ -7243,7 +7243,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
7243
7243
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7244
7244
 
7245
7245
  "use strict";
7246
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DeleteCluster = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst source_1 = __webpack_require__(/*! ../expressions/source */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source.js\");\r\nclass DeleteCluster {\r\n runSyntax(node, scope, filename) {\r\n var _a;\r\n for (const s of node.findDirectExpressions(Expressions.Source)) {\r\n new source_1.Source().runSyntax(s, scope, filename);\r\n }\r\n const databaseName = node.findExpressionAfterToken(\"DATABASE\");\r\n if (databaseName) {\r\n const found = (_a = scope.getDDIC()) === null || _a === void 0 ? void 0 : _a.lookupTableOrView(databaseName.concatTokens());\r\n if (found) {\r\n scope.getDDICReferences().addUsing(scope.getParentObj(), found.object);\r\n }\r\n }\r\n }\r\n}\r\nexports.DeleteCluster = DeleteCluster;\r\n//# sourceMappingURL=delete_cluster.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/delete_cluster.js?");
7246
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DeleteCluster = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst source_1 = __webpack_require__(/*! ../expressions/source */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source.js\");\r\nclass DeleteCluster {\r\n runSyntax(node, scope, filename) {\r\n var _a;\r\n for (const s of node.findDirectExpressions(Expressions.Source)) {\r\n new source_1.Source().runSyntax(s, scope, filename);\r\n }\r\n const databaseName = node.findExpressionAfterToken(\"DATABASE\");\r\n if (databaseName) {\r\n const found = (_a = scope.getDDIC()) === null || _a === void 0 ? void 0 : _a.lookupTableOrView(databaseName.concatTokens());\r\n if (found) {\r\n scope.getDDICReferences().addUsing(scope.getParentObj(), { object: found.object });\r\n }\r\n }\r\n }\r\n}\r\nexports.DeleteCluster = DeleteCluster;\r\n//# sourceMappingURL=delete_cluster.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/delete_cluster.js?");
7247
7247
 
7248
7248
  /***/ }),
7249
7249
 
@@ -7320,7 +7320,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
7320
7320
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7321
7321
 
7322
7322
  "use strict";
7323
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Export = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst source_1 = __webpack_require__(/*! ../expressions/source */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source.js\");\r\nconst target_1 = __webpack_require__(/*! ../expressions/target */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/target.js\");\r\nclass Export {\r\n runSyntax(node, scope, filename) {\r\n var _a;\r\n for (const s of node.findAllExpressions(Expressions.Source)) {\r\n new source_1.Source().runSyntax(s, scope, filename);\r\n }\r\n for (const t of node.findDirectExpressions(Expressions.Target)) {\r\n new target_1.Target().runSyntax(t, scope, filename);\r\n }\r\n const databaseName = node.findExpressionAfterToken(\"DATABASE\");\r\n if (databaseName) {\r\n const found = (_a = scope.getDDIC()) === null || _a === void 0 ? void 0 : _a.lookupTableOrView(databaseName.concatTokens());\r\n if (found) {\r\n scope.getDDICReferences().addUsing(scope.getParentObj(), found.object);\r\n }\r\n }\r\n }\r\n}\r\nexports.Export = Export;\r\n//# sourceMappingURL=export.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/export.js?");
7323
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Export = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst source_1 = __webpack_require__(/*! ../expressions/source */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source.js\");\r\nconst target_1 = __webpack_require__(/*! ../expressions/target */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/target.js\");\r\nclass Export {\r\n runSyntax(node, scope, filename) {\r\n var _a;\r\n for (const s of node.findAllExpressions(Expressions.Source)) {\r\n new source_1.Source().runSyntax(s, scope, filename);\r\n }\r\n for (const t of node.findDirectExpressions(Expressions.Target)) {\r\n new target_1.Target().runSyntax(t, scope, filename);\r\n }\r\n const databaseName = node.findExpressionAfterToken(\"DATABASE\");\r\n if (databaseName) {\r\n const found = (_a = scope.getDDIC()) === null || _a === void 0 ? void 0 : _a.lookupTableOrView(databaseName.concatTokens());\r\n if (found) {\r\n scope.getDDICReferences().addUsing(scope.getParentObj(), { object: found.object });\r\n }\r\n }\r\n }\r\n}\r\nexports.Export = Export;\r\n//# sourceMappingURL=export.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/export.js?");
7324
7324
 
7325
7325
  /***/ }),
7326
7326
 
@@ -7463,7 +7463,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
7463
7463
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7464
7464
 
7465
7465
  "use strict";
7466
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Import = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst source_1 = __webpack_require__(/*! ../expressions/source */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source.js\");\r\nconst target_1 = __webpack_require__(/*! ../expressions/target */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/target.js\");\r\nclass Import {\r\n runSyntax(node, scope, filename) {\r\n var _a;\r\n for (const s of node.findDirectExpressions(Expressions.Source)) {\r\n new source_1.Source().runSyntax(s, scope, filename);\r\n }\r\n for (const t of node.findDirectExpressions(Expressions.Target)) {\r\n new target_1.Target().runSyntax(t, scope, filename);\r\n }\r\n const databaseName = node.findExpressionAfterToken(\"DATABASE\");\r\n if (databaseName) {\r\n const found = (_a = scope.getDDIC()) === null || _a === void 0 ? void 0 : _a.lookupTableOrView(databaseName.concatTokens());\r\n if (found) {\r\n scope.getDDICReferences().addUsing(scope.getParentObj(), found.object);\r\n }\r\n }\r\n }\r\n}\r\nexports.Import = Import;\r\n//# sourceMappingURL=import.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/import.js?");
7466
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Import = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst source_1 = __webpack_require__(/*! ../expressions/source */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source.js\");\r\nconst target_1 = __webpack_require__(/*! ../expressions/target */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/target.js\");\r\nclass Import {\r\n runSyntax(node, scope, filename) {\r\n var _a;\r\n for (const s of node.findDirectExpressions(Expressions.Source)) {\r\n new source_1.Source().runSyntax(s, scope, filename);\r\n }\r\n for (const t of node.findDirectExpressions(Expressions.Target)) {\r\n new target_1.Target().runSyntax(t, scope, filename);\r\n }\r\n const databaseName = node.findExpressionAfterToken(\"DATABASE\");\r\n if (databaseName) {\r\n const found = (_a = scope.getDDIC()) === null || _a === void 0 ? void 0 : _a.lookupTableOrView(databaseName.concatTokens());\r\n if (found) {\r\n scope.getDDICReferences().addUsing(scope.getParentObj(), { object: found.object });\r\n }\r\n }\r\n }\r\n}\r\nexports.Import = Import;\r\n//# sourceMappingURL=import.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/import.js?");
7467
7467
 
7468
7468
  /***/ }),
7469
7469
 
@@ -7980,7 +7980,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
7980
7980
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7981
7981
 
7982
7982
  "use strict";
7983
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Tables = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst _typed_identifier_1 = __webpack_require__(/*! ../../types/_typed_identifier */ \"./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js\");\r\nconst basic_1 = __webpack_require__(/*! ../../types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nclass Tables {\r\n runSyntax(node, scope, filename) {\r\n var _a, _b;\r\n const nameToken = (_a = node.findFirstExpression(Expressions.Field)) === null || _a === void 0 ? void 0 : _a.getFirstToken();\r\n if (nameToken === undefined) {\r\n return undefined;\r\n }\r\n let name = nameToken.getStr();\r\n if (name.startsWith(\"*\")) {\r\n name = name.substr(1);\r\n }\r\n const found = (_b = scope.getDDIC()) === null || _b === void 0 ? void 0 : _b.lookupTableOrView(name);\r\n if (found) {\r\n scope.getDDICReferences().addUsing(scope.getParentObj(), found.object);\r\n scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(nameToken, filename, found.type));\r\n return;\r\n }\r\n scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(nameToken, filename, new basic_1.UnknownType(\"Tables, fallback\")));\r\n }\r\n}\r\nexports.Tables = Tables;\r\n//# sourceMappingURL=tables.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/tables.js?");
7983
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Tables = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst _typed_identifier_1 = __webpack_require__(/*! ../../types/_typed_identifier */ \"./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js\");\r\nconst basic_1 = __webpack_require__(/*! ../../types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nclass Tables {\r\n runSyntax(node, scope, filename) {\r\n var _a, _b;\r\n const nameToken = (_a = node.findFirstExpression(Expressions.Field)) === null || _a === void 0 ? void 0 : _a.getFirstToken();\r\n if (nameToken === undefined) {\r\n return undefined;\r\n }\r\n let name = nameToken.getStr();\r\n if (name.startsWith(\"*\")) {\r\n name = name.substr(1);\r\n }\r\n const found = (_b = scope.getDDIC()) === null || _b === void 0 ? void 0 : _b.lookupTableOrView(name);\r\n if (found) {\r\n scope.getDDICReferences().addUsing(scope.getParentObj(), { object: found.object });\r\n scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(nameToken, filename, found.type));\r\n return;\r\n }\r\n scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(nameToken, filename, new basic_1.UnknownType(\"Tables, fallback\")));\r\n }\r\n}\r\nexports.Tables = Tables;\r\n//# sourceMappingURL=tables.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/tables.js?");
7984
7984
 
7985
7985
  /***/ }),
7986
7986
 
@@ -8882,7 +8882,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
8882
8882
  /***/ ((__unused_webpack_module, exports) => {
8883
8883
 
8884
8884
  "use strict";
8885
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DDICReferences = void 0;\r\nclass DDICReferences {\r\n constructor() {\r\n this.index = {};\r\n }\r\n setUsing(obj, using) {\r\n const newName = obj.getName().toUpperCase();\r\n const newType = obj.getType();\r\n if (this.index[newName] === undefined) {\r\n this.index[newName] = {};\r\n }\r\n this.index[newName][newType] = using;\r\n }\r\n addUsing(obj, using) {\r\n if (using === undefined) {\r\n return;\r\n }\r\n const newName = obj.getName().toUpperCase();\r\n const newType = obj.getType();\r\n if (this.index[newName] === undefined) {\r\n this.index[newName] = {};\r\n }\r\n if (this.index[newName][newType] === undefined) {\r\n this.index[newName][newType] = [];\r\n }\r\n this.index[newName][newType].push(using);\r\n }\r\n clear(obj) {\r\n this.setUsing(obj, []);\r\n }\r\n listUsing(obj) {\r\n var _a;\r\n const newName = obj.getName().toUpperCase();\r\n const newType = obj.getType();\r\n const found = (_a = this.index[newName]) === null || _a === void 0 ? void 0 : _a[newType];\r\n if (found !== undefined) {\r\n return found;\r\n }\r\n else {\r\n return [];\r\n }\r\n }\r\n listWhereUsed(obj) {\r\n // todo, add reverse index, this is slow\r\n const ret = [];\r\n const searchName = obj.getName().toUpperCase();\r\n const searchType = obj.getType();\r\n for (const name in this.index) {\r\n for (const type in this.index[name]) {\r\n for (const f of this.index[name][type]) {\r\n if (f.getType() === searchType && f.getName() === searchName) {\r\n ret.push({ type, name });\r\n break; // current outermost loop\r\n }\r\n }\r\n }\r\n }\r\n return ret;\r\n }\r\n}\r\nexports.DDICReferences = DDICReferences;\r\n//# sourceMappingURL=ddic_references.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/ddic_references.js?");
8885
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DDICReferences = void 0;\r\nclass DDICReferences {\r\n constructor() {\r\n this.index = {};\r\n }\r\n setUsing(obj, using) {\r\n const newName = obj.getName().toUpperCase();\r\n const newType = obj.getType();\r\n if (this.index[newName] === undefined) {\r\n this.index[newName] = {};\r\n }\r\n this.index[newName][newType] = using;\r\n }\r\n addUsing(obj, using) {\r\n if (using === undefined) {\r\n return;\r\n }\r\n const newName = obj.getName().toUpperCase();\r\n const newType = obj.getType();\r\n if (this.index[newName] === undefined) {\r\n this.index[newName] = {};\r\n }\r\n if (this.index[newName][newType] === undefined) {\r\n this.index[newName][newType] = [];\r\n }\r\n this.index[newName][newType].push(using);\r\n }\r\n clear(obj) {\r\n this.setUsing(obj, []);\r\n }\r\n listUsing(obj) {\r\n var _a;\r\n const newName = obj.getName().toUpperCase();\r\n const newType = obj.getType();\r\n const found = (_a = this.index[newName]) === null || _a === void 0 ? void 0 : _a[newType];\r\n if (found !== undefined) {\r\n return found;\r\n }\r\n else {\r\n return [];\r\n }\r\n }\r\n listWhereUsed(obj) {\r\n // todo, add reverse index, this is slow\r\n const ret = [];\r\n const searchName = obj.getName().toUpperCase();\r\n const searchType = obj.getType();\r\n for (const name in this.index) {\r\n for (const type in this.index[name]) {\r\n for (const f of this.index[name][type]) {\r\n if (f.object && f.object.getType() === searchType && f.object.getName() === searchName) {\r\n ret.push({ type, name, token: f.token, filename: f.filename });\r\n }\r\n }\r\n }\r\n }\r\n return ret;\r\n }\r\n}\r\nexports.DDICReferences = DDICReferences;\r\n//# sourceMappingURL=ddic_references.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/ddic_references.js?");
8886
8886
 
8887
8887
  /***/ }),
8888
8888
 
@@ -9498,7 +9498,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
9498
9498
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
9499
9499
 
9500
9500
  "use strict";
9501
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DataElement = void 0;\r\nconst _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ \"./node_modules/@abaplint/core/build/src/objects/_abstract_object.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nconst Types = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nclass DataElement extends _abstract_object_1.AbstractObject {\r\n constructor() {\r\n super(...arguments);\r\n this.parsedXML = undefined;\r\n }\r\n getType() {\r\n return \"DTEL\";\r\n }\r\n getDescription() {\r\n var _a;\r\n return (_a = this.parsedXML) === null || _a === void 0 ? void 0 : _a.description;\r\n }\r\n getAllowedNaming() {\r\n return {\r\n maxLength: 30,\r\n allowNamespace: true,\r\n };\r\n }\r\n setDirty() {\r\n this.parsedXML = undefined;\r\n super.setDirty();\r\n }\r\n parseType(reg) {\r\n const references = [];\r\n let lookup = undefined;\r\n if (this.parsedXML === undefined || this.parsedXML === {}) {\r\n lookup = { type: new Types.UnknownType(\"Data Element \" + this.getName() + \", parser error\") };\r\n }\r\n else {\r\n const ddic = new ddic_1.DDIC(reg);\r\n if (this.parsedXML.refkind === \"D\") {\r\n if (this.parsedXML.domname === undefined || this.parsedXML.domname === \"\") {\r\n lookup = { type: new Types.UnknownType(\"DOMNAME unexpectely empty in \" + this.getName()) };\r\n }\r\n else {\r\n lookup = ddic.lookupDomain(this.parsedXML.domname);\r\n }\r\n }\r\n else if (this.parsedXML.refkind === \"R\") {\r\n if (this.parsedXML.domname === undefined || this.parsedXML.domname === \"\") {\r\n lookup = { type: new Types.UnknownType(\"DOMNAME unexpectely empty in \" + this.getName()) };\r\n }\r\n else {\r\n lookup = ddic.lookupObject(this.parsedXML.domname);\r\n }\r\n }\r\n else {\r\n if (this.parsedXML.datatype === undefined || this.parsedXML.datatype === \"\") {\r\n lookup = { type: new Types.UnknownType(\"DATATYPE unexpectely empty in \" + this.getName()) };\r\n }\r\n else {\r\n lookup = { type: ddic.textToType(this.parsedXML.datatype, this.parsedXML.leng, this.parsedXML.decimals, this.getName()) };\r\n }\r\n }\r\n }\r\n if (lookup.object) {\r\n references.push(lookup.object);\r\n }\r\n reg.getDDICReferences().setUsing(this, references);\r\n return lookup.type;\r\n }\r\n parse() {\r\n var _a, _b, _c;\r\n if (this.parsedXML !== undefined) {\r\n return { updated: false, runtime: 0 };\r\n }\r\n const start = Date.now();\r\n this.parsedXML = {};\r\n const parsed = super.parseRaw2();\r\n if (parsed === undefined) {\r\n return { updated: false, runtime: 0 };\r\n }\r\n const dd04v = (_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.DD04V;\r\n this.parsedXML = {\r\n description: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DDTEXT,\r\n refkind: dd04v === null || dd04v === void 0 ? void 0 : dd04v.REFKIND,\r\n domname: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DOMNAME,\r\n datatype: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DATATYPE,\r\n leng: dd04v === null || dd04v === void 0 ? void 0 : dd04v.LENG,\r\n decimals: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DECIMALS,\r\n };\r\n const end = Date.now();\r\n return { updated: true, runtime: end - start };\r\n }\r\n}\r\nexports.DataElement = DataElement;\r\n//# sourceMappingURL=data_element.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/data_element.js?");
9501
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DataElement = void 0;\r\nconst _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ \"./node_modules/@abaplint/core/build/src/objects/_abstract_object.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nconst Types = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nclass DataElement extends _abstract_object_1.AbstractObject {\r\n constructor() {\r\n super(...arguments);\r\n this.parsedXML = undefined;\r\n }\r\n getType() {\r\n return \"DTEL\";\r\n }\r\n getDescription() {\r\n var _a;\r\n return (_a = this.parsedXML) === null || _a === void 0 ? void 0 : _a.description;\r\n }\r\n getAllowedNaming() {\r\n return {\r\n maxLength: 30,\r\n allowNamespace: true,\r\n };\r\n }\r\n setDirty() {\r\n this.parsedXML = undefined;\r\n super.setDirty();\r\n }\r\n parseType(reg) {\r\n const references = [];\r\n let lookup = undefined;\r\n if (this.parsedXML === undefined || this.parsedXML === {}) {\r\n lookup = { type: new Types.UnknownType(\"Data Element \" + this.getName() + \", parser error\") };\r\n }\r\n else {\r\n const ddic = new ddic_1.DDIC(reg);\r\n if (this.parsedXML.refkind === \"D\") {\r\n if (this.parsedXML.domname === undefined || this.parsedXML.domname === \"\") {\r\n lookup = { type: new Types.UnknownType(\"DOMNAME unexpectely empty in \" + this.getName()) };\r\n }\r\n else {\r\n lookup = ddic.lookupDomain(this.parsedXML.domname);\r\n }\r\n }\r\n else if (this.parsedXML.refkind === \"R\") {\r\n if (this.parsedXML.domname === undefined || this.parsedXML.domname === \"\") {\r\n lookup = { type: new Types.UnknownType(\"DOMNAME unexpectely empty in \" + this.getName()) };\r\n }\r\n else {\r\n lookup = ddic.lookupObject(this.parsedXML.domname);\r\n }\r\n }\r\n else {\r\n if (this.parsedXML.datatype === undefined || this.parsedXML.datatype === \"\") {\r\n lookup = { type: new Types.UnknownType(\"DATATYPE unexpectely empty in \" + this.getName()) };\r\n }\r\n else {\r\n lookup = { type: ddic.textToType(this.parsedXML.datatype, this.parsedXML.leng, this.parsedXML.decimals, this.getName()) };\r\n }\r\n }\r\n }\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n reg.getDDICReferences().setUsing(this, references);\r\n return lookup.type;\r\n }\r\n parse() {\r\n var _a, _b, _c;\r\n if (this.parsedXML !== undefined) {\r\n return { updated: false, runtime: 0 };\r\n }\r\n const start = Date.now();\r\n this.parsedXML = {};\r\n const parsed = super.parseRaw2();\r\n if (parsed === undefined) {\r\n return { updated: false, runtime: 0 };\r\n }\r\n const dd04v = (_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.DD04V;\r\n this.parsedXML = {\r\n description: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DDTEXT,\r\n refkind: dd04v === null || dd04v === void 0 ? void 0 : dd04v.REFKIND,\r\n domname: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DOMNAME,\r\n datatype: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DATATYPE,\r\n leng: dd04v === null || dd04v === void 0 ? void 0 : dd04v.LENG,\r\n decimals: dd04v === null || dd04v === void 0 ? void 0 : dd04v.DECIMALS,\r\n };\r\n const end = Date.now();\r\n return { updated: true, runtime: end - start };\r\n }\r\n}\r\nexports.DataElement = DataElement;\r\n//# sourceMappingURL=data_element.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/data_element.js?");
9502
9502
 
9503
9503
  /***/ }),
9504
9504
 
@@ -10030,6 +10030,28 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
10030
10030
 
10031
10031
  /***/ }),
10032
10032
 
10033
+ /***/ "./node_modules/@abaplint/core/build/src/objects/rename/rename_data_element.js":
10034
+ /*!*************************************************************************************!*\
10035
+ !*** ./node_modules/@abaplint/core/build/src/objects/rename/rename_data_element.js ***!
10036
+ \*************************************************************************************/
10037
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10038
+
10039
+ "use strict";
10040
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.RenameDataElement = void 0;\r\nconst __1 = __webpack_require__(/*! .. */ \"./node_modules/@abaplint/core/build/src/objects/index.js\");\r\nconst renamer_helper_1 = __webpack_require__(/*! ./renamer_helper */ \"./node_modules/@abaplint/core/build/src/objects/rename/renamer_helper.js\");\r\nclass RenameDataElement {\r\n constructor(reg) {\r\n this.reg = reg;\r\n }\r\n buildEdits(obj, oldName, newName) {\r\n if (!(obj instanceof __1.DataElement)) {\r\n throw new Error(\"RenameDataElement, not a data element\");\r\n }\r\n let changes = [];\r\n const helper = new renamer_helper_1.RenamerHelper(this.reg);\r\n changes = changes.concat(helper.buildXMLFileEdits(obj, \"ROLLNAME\", oldName, newName));\r\n changes = changes.concat(helper.renameFiles(obj, oldName, newName));\r\n changes = changes.concat(helper.renameDDICCodeReferences(obj, oldName, newName));\r\n changes = changes.concat(helper.renameDDICTABLReferences(obj, oldName, newName));\r\n changes = changes.concat(helper.renameDDICTTYPReferences(obj, oldName, newName));\r\n return {\r\n documentChanges: changes,\r\n };\r\n }\r\n}\r\nexports.RenameDataElement = RenameDataElement;\r\n//# sourceMappingURL=rename_data_element.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/rename/rename_data_element.js?");
10041
+
10042
+ /***/ }),
10043
+
10044
+ /***/ "./node_modules/@abaplint/core/build/src/objects/rename/rename_domain.js":
10045
+ /*!*******************************************************************************!*\
10046
+ !*** ./node_modules/@abaplint/core/build/src/objects/rename/rename_domain.js ***!
10047
+ \*******************************************************************************/
10048
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10049
+
10050
+ "use strict";
10051
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.RenameDomain = void 0;\r\nconst __1 = __webpack_require__(/*! .. */ \"./node_modules/@abaplint/core/build/src/objects/index.js\");\r\nconst renamer_helper_1 = __webpack_require__(/*! ./renamer_helper */ \"./node_modules/@abaplint/core/build/src/objects/rename/renamer_helper.js\");\r\nclass RenameDomain {\r\n constructor(reg) {\r\n this.reg = reg;\r\n }\r\n buildEdits(obj, oldName, newName) {\r\n if (!(obj instanceof __1.Domain)) {\r\n throw new Error(\"RenameDomain, not a domain\");\r\n }\r\n let changes = [];\r\n const helper = new renamer_helper_1.RenamerHelper(this.reg);\r\n changes = changes.concat(helper.buildXMLFileEdits(obj, \"DOMNAME\", oldName, newName));\r\n changes = changes.concat(helper.renameFiles(obj, oldName, newName));\r\n changes = changes.concat(helper.renameDDICDTELReferences(obj, oldName, newName));\r\n return {\r\n documentChanges: changes,\r\n };\r\n }\r\n}\r\nexports.RenameDomain = RenameDomain;\r\n//# sourceMappingURL=rename_domain.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/rename/rename_domain.js?");
10052
+
10053
+ /***/ }),
10054
+
10033
10055
  /***/ "./node_modules/@abaplint/core/build/src/objects/rename/rename_global_class.js":
10034
10056
  /*!*************************************************************************************!*\
10035
10057
  !*** ./node_modules/@abaplint/core/build/src/objects/rename/rename_global_class.js ***!
@@ -10037,7 +10059,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
10037
10059
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10038
10060
 
10039
10061
  "use strict";
10040
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.RenameGlobalClass = void 0;\r\nconst Statements = __webpack_require__(/*! ../../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst Expressions = __webpack_require__(/*! ../../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst vscode_languageserver_types_1 = __webpack_require__(/*! vscode-languageserver-types */ \"./node_modules/vscode-languageserver-types/lib/esm/main.js\");\r\nconst __1 = __webpack_require__(/*! .. */ \"./node_modules/@abaplint/core/build/src/objects/index.js\");\r\nconst _lsp_utils_1 = __webpack_require__(/*! ../../lsp/_lsp_utils */ \"./node_modules/@abaplint/core/build/src/lsp/_lsp_utils.js\");\r\nconst renamer_helper_1 = __webpack_require__(/*! ./renamer_helper */ \"./node_modules/@abaplint/core/build/src/objects/rename/renamer_helper.js\");\r\nclass RenameGlobalClass {\r\n constructor(reg) {\r\n this.reg = reg;\r\n }\r\n buildEdits(obj, oldName, newName) {\r\n if (!(obj instanceof __1.Class)) {\r\n throw new Error(\"not a class\");\r\n }\r\n const main = obj.getMainABAPFile();\r\n if (main === undefined) {\r\n throw new Error(\"Main file not found\");\r\n }\r\n let changes = [];\r\n // todo, this is actually the same as \"id\" ?\r\n {\r\n const edits = [];\r\n for (const s of main.getStatements()) {\r\n if (s.get() instanceof Statements.ClassDefinition) {\r\n const exp = s.findFirstExpression(Expressions.ClassName);\r\n if (exp === undefined) {\r\n continue;\r\n }\r\n edits.push(vscode_languageserver_types_1.TextEdit.replace(_lsp_utils_1.LSPUtils.tokenToRange(exp.getFirstToken()), newName.toLowerCase()));\r\n }\r\n else if (s.get() instanceof Statements.ClassImplementation) {\r\n const exp = s.findFirstExpression(Expressions.ClassName);\r\n if (exp === undefined) {\r\n continue;\r\n }\r\n edits.push(vscode_languageserver_types_1.TextEdit.replace(_lsp_utils_1.LSPUtils.tokenToRange(exp.getFirstToken()), newName.toLowerCase()));\r\n }\r\n }\r\n changes.push(vscode_languageserver_types_1.TextDocumentEdit.create({ uri: main.getFilename(), version: 1 }, edits));\r\n }\r\n const helper = new renamer_helper_1.RenamerHelper(this.reg);\r\n changes = changes.concat(helper.buildXMLFileEdits(obj, \"CLSNAME\", oldName, newName));\r\n changes = changes.concat(helper.renameFiles(obj, oldName, newName));\r\n changes = changes.concat(helper.renameReferences(obj.getIdentifier(), oldName, newName));\r\n return {\r\n documentChanges: changes,\r\n };\r\n }\r\n}\r\nexports.RenameGlobalClass = RenameGlobalClass;\r\n//# sourceMappingURL=rename_global_class.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/rename/rename_global_class.js?");
10062
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.RenameGlobalClass = void 0;\r\nconst Statements = __webpack_require__(/*! ../../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst Expressions = __webpack_require__(/*! ../../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst vscode_languageserver_types_1 = __webpack_require__(/*! vscode-languageserver-types */ \"./node_modules/vscode-languageserver-types/lib/esm/main.js\");\r\nconst __1 = __webpack_require__(/*! .. */ \"./node_modules/@abaplint/core/build/src/objects/index.js\");\r\nconst _lsp_utils_1 = __webpack_require__(/*! ../../lsp/_lsp_utils */ \"./node_modules/@abaplint/core/build/src/lsp/_lsp_utils.js\");\r\nconst renamer_helper_1 = __webpack_require__(/*! ./renamer_helper */ \"./node_modules/@abaplint/core/build/src/objects/rename/renamer_helper.js\");\r\nclass RenameGlobalClass {\r\n constructor(reg) {\r\n this.reg = reg;\r\n }\r\n buildEdits(obj, oldName, newName) {\r\n if (!(obj instanceof __1.Class)) {\r\n throw new Error(\"not a class\");\r\n }\r\n const main = obj.getMainABAPFile();\r\n if (main === undefined) {\r\n throw new Error(\"Main file not found\");\r\n }\r\n let changes = [];\r\n // todo, this is actually the same as \"id\" ?\r\n {\r\n const edits = [];\r\n for (const s of main.getStatements()) {\r\n if (s.get() instanceof Statements.ClassDefinition) {\r\n const exp = s.findFirstExpression(Expressions.ClassName);\r\n if (exp === undefined) {\r\n continue;\r\n }\r\n edits.push(vscode_languageserver_types_1.TextEdit.replace(_lsp_utils_1.LSPUtils.tokenToRange(exp.getFirstToken()), newName.toLowerCase()));\r\n }\r\n else if (s.get() instanceof Statements.ClassImplementation) {\r\n const exp = s.findFirstExpression(Expressions.ClassName);\r\n if (exp === undefined) {\r\n continue;\r\n }\r\n edits.push(vscode_languageserver_types_1.TextEdit.replace(_lsp_utils_1.LSPUtils.tokenToRange(exp.getFirstToken()), newName.toLowerCase()));\r\n }\r\n }\r\n changes.push(vscode_languageserver_types_1.TextDocumentEdit.create({ uri: main.getFilename(), version: 1 }, edits));\r\n }\r\n const helper = new renamer_helper_1.RenamerHelper(this.reg);\r\n changes = changes.concat(helper.buildXMLFileEdits(obj, \"CLSNAME\", oldName, newName));\r\n changes = changes.concat(helper.renameFiles(obj, oldName, newName));\r\n changes = changes.concat(helper.renameReferences(obj.getIdentifier(), oldName, newName));\r\n changes = changes.concat(helper.renameDDICTABLReferences(obj, oldName, newName));\r\n return {\r\n documentChanges: changes,\r\n };\r\n }\r\n}\r\nexports.RenameGlobalClass = RenameGlobalClass;\r\n//# sourceMappingURL=rename_global_class.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/rename/rename_global_class.js?");
10041
10063
 
10042
10064
  /***/ }),
10043
10065
 
@@ -10059,7 +10081,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
10059
10081
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10060
10082
 
10061
10083
  "use strict";
10062
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Renamer = void 0;\r\nconst vscode_languageserver_types_1 = __webpack_require__(/*! vscode-languageserver-types */ \"./node_modules/vscode-languageserver-types/lib/esm/main.js\");\r\nconst memory_file_1 = __webpack_require__(/*! ../../files/memory_file */ \"./node_modules/@abaplint/core/build/src/files/memory_file.js\");\r\nconst rename_global_class_1 = __webpack_require__(/*! ./rename_global_class */ \"./node_modules/@abaplint/core/build/src/objects/rename/rename_global_class.js\");\r\nconst rename_global_interface_1 = __webpack_require__(/*! ./rename_global_interface */ \"./node_modules/@abaplint/core/build/src/objects/rename/rename_global_interface.js\");\r\nclass Renamer {\r\n constructor(reg) {\r\n this.reg = reg;\r\n }\r\n /** Applies the renaming to the objects and files in the registry,\r\n * after renaming the registry is not parsed */\r\n rename(type, oldName, newName) {\r\n const edits = this.buildEdits(type, oldName, newName);\r\n if (edits === undefined) {\r\n throw new Error(\"no changes could be determined\");\r\n }\r\n else if (edits.changes) {\r\n throw new Error(\"only documentChanges expected\");\r\n }\r\n this.apply(edits);\r\n }\r\n /** Builds edits, but does not apply to registry, used by LSP */\r\n buildEdits(type, oldName, newName) {\r\n this.reg.parse(); // the registry must be parsed to dermine references\r\n const obj = this.reg.getObject(type, oldName);\r\n if (obj === undefined) {\r\n throw new Error(\"rename, object not found\");\r\n }\r\n else if (newName.length > obj.getAllowedNaming().maxLength) {\r\n // todo, also do not allow strange characters and spaces\r\n throw new Error(\"Name not allowed\");\r\n }\r\n const r = this.factory(type);\r\n return r.buildEdits(obj, oldName.toUpperCase(), newName);\r\n }\r\n //////////////////\r\n factory(type) {\r\n switch (type) {\r\n case \"CLAS\":\r\n return new rename_global_class_1.RenameGlobalClass(this.reg);\r\n case \"INTF\":\r\n return new rename_global_interface_1.RenameGlobalInterface(this.reg);\r\n default:\r\n throw new Error(\"Renaming of \" + type + \" not yet supported\");\r\n }\r\n }\r\n apply(edits) {\r\n const renames = [];\r\n // assumption: only renames or text changes, no deletes or creates\r\n for (const dc of edits.documentChanges || []) {\r\n if (vscode_languageserver_types_1.TextDocumentEdit.is(dc)) {\r\n this.applyEdit(dc);\r\n }\r\n else if (vscode_languageserver_types_1.RenameFile.is(dc)) {\r\n renames.push(dc);\r\n }\r\n else {\r\n throw new Error(\"unexpected documentChange type\");\r\n }\r\n }\r\n this.applyRenames(renames);\r\n }\r\n applyEdit(dc) {\r\n const file = this.reg.getFileByName(dc.textDocument.uri);\r\n if (file === undefined) {\r\n throw new Error(\"file \" + dc.textDocument.uri + \" not found\");\r\n }\r\n const rows = file.getRawRows();\r\n for (const e of dc.edits) {\r\n if (e.range.start.line !== e.range.end.line) {\r\n throw new Error(\"applyEdit, start and end line differ\");\r\n }\r\n const before = rows[e.range.start.line];\r\n rows[e.range.start.line] = before.substring(0, e.range.start.character) +\r\n e.newText +\r\n before.substring(e.range.end.character);\r\n }\r\n const newFile = new memory_file_1.MemoryFile(dc.textDocument.uri, rows.join(\"\\n\"));\r\n this.reg.updateFile(newFile);\r\n }\r\n applyRenames(renames) {\r\n for (const r of renames) {\r\n const old = this.reg.getFileByName(r.oldUri);\r\n if (old === undefined) {\r\n throw new Error(\"applyRenames, old not found\");\r\n }\r\n const newFile = new memory_file_1.MemoryFile(r.newUri, old.getRaw());\r\n this.reg.removeFile(old);\r\n this.reg.addFile(newFile);\r\n }\r\n }\r\n}\r\nexports.Renamer = Renamer;\r\n//# sourceMappingURL=renamer.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/rename/renamer.js?");
10084
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Renamer = void 0;\r\nconst vscode_languageserver_types_1 = __webpack_require__(/*! vscode-languageserver-types */ \"./node_modules/vscode-languageserver-types/lib/esm/main.js\");\r\nconst memory_file_1 = __webpack_require__(/*! ../../files/memory_file */ \"./node_modules/@abaplint/core/build/src/files/memory_file.js\");\r\nconst rename_data_element_1 = __webpack_require__(/*! ./rename_data_element */ \"./node_modules/@abaplint/core/build/src/objects/rename/rename_data_element.js\");\r\nconst rename_domain_1 = __webpack_require__(/*! ./rename_domain */ \"./node_modules/@abaplint/core/build/src/objects/rename/rename_domain.js\");\r\nconst rename_global_class_1 = __webpack_require__(/*! ./rename_global_class */ \"./node_modules/@abaplint/core/build/src/objects/rename/rename_global_class.js\");\r\nconst rename_global_interface_1 = __webpack_require__(/*! ./rename_global_interface */ \"./node_modules/@abaplint/core/build/src/objects/rename/rename_global_interface.js\");\r\nclass Renamer {\r\n constructor(reg) {\r\n this.reg = reg;\r\n }\r\n /** Applies the renaming to the objects and files in the registry,\r\n * after renaming the registry is not parsed */\r\n rename(type, oldName, newName) {\r\n const edits = this.buildEdits(type, oldName, newName);\r\n if (edits === undefined) {\r\n throw new Error(\"no changes could be determined\");\r\n }\r\n else if (edits.changes) {\r\n throw new Error(\"only documentChanges expected\");\r\n }\r\n this.apply(edits);\r\n }\r\n /** Builds edits, but does not apply to registry, used by LSP */\r\n buildEdits(type, oldName, newName) {\r\n this.reg.parse(); // the registry must be parsed to dermine references\r\n const obj = this.reg.getObject(type, oldName);\r\n if (obj === undefined) {\r\n throw new Error(\"rename, object not found\");\r\n }\r\n else if (newName.length > obj.getAllowedNaming().maxLength) {\r\n // todo, also do not allow strange characters and spaces\r\n throw new Error(\"Name not allowed\");\r\n }\r\n const r = this.factory(type);\r\n return r.buildEdits(obj, oldName.toUpperCase(), newName);\r\n }\r\n //////////////////\r\n factory(type) {\r\n switch (type) {\r\n case \"CLAS\":\r\n return new rename_global_class_1.RenameGlobalClass(this.reg);\r\n case \"DTEL\":\r\n return new rename_data_element_1.RenameDataElement(this.reg);\r\n case \"DOMA\":\r\n return new rename_domain_1.RenameDomain(this.reg);\r\n case \"INTF\":\r\n return new rename_global_interface_1.RenameGlobalInterface(this.reg);\r\n default:\r\n throw new Error(\"Renaming of \" + type + \" not yet supported\");\r\n }\r\n }\r\n apply(edits) {\r\n const renames = [];\r\n // assumption: only renames or text changes, no deletes or creates\r\n for (const dc of edits.documentChanges || []) {\r\n if (vscode_languageserver_types_1.TextDocumentEdit.is(dc)) {\r\n this.applyEdit(dc);\r\n }\r\n else if (vscode_languageserver_types_1.RenameFile.is(dc)) {\r\n renames.push(dc);\r\n }\r\n else {\r\n throw new Error(\"unexpected documentChange type\");\r\n }\r\n }\r\n this.applyRenames(renames);\r\n }\r\n applyEdit(dc) {\r\n const file = this.reg.getFileByName(dc.textDocument.uri);\r\n if (file === undefined) {\r\n throw new Error(\"file \" + dc.textDocument.uri + \" not found\");\r\n }\r\n const rows = file.getRawRows();\r\n for (const e of dc.edits) {\r\n if (e.range.start.line !== e.range.end.line) {\r\n throw new Error(\"applyEdit, start and end line differ\");\r\n }\r\n const before = rows[e.range.start.line];\r\n rows[e.range.start.line] = before.substring(0, e.range.start.character) +\r\n e.newText +\r\n before.substring(e.range.end.character);\r\n }\r\n const newFile = new memory_file_1.MemoryFile(dc.textDocument.uri, rows.join(\"\\n\"));\r\n this.reg.updateFile(newFile);\r\n }\r\n applyRenames(renames) {\r\n for (const r of renames) {\r\n const old = this.reg.getFileByName(r.oldUri);\r\n if (old === undefined) {\r\n throw new Error(\"applyRenames, old not found\");\r\n }\r\n const newFile = new memory_file_1.MemoryFile(r.newUri, old.getRaw());\r\n this.reg.removeFile(old);\r\n this.reg.addFile(newFile);\r\n }\r\n }\r\n}\r\nexports.Renamer = Renamer;\r\n//# sourceMappingURL=renamer.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/rename/renamer.js?");
10063
10085
 
10064
10086
  /***/ }),
10065
10087
 
@@ -10070,7 +10092,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
10070
10092
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10071
10093
 
10072
10094
  "use strict";
10073
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.RenamerHelper = void 0;\r\nconst vscode_languageserver_types_1 = __webpack_require__(/*! vscode-languageserver-types */ \"./node_modules/vscode-languageserver-types/lib/esm/main.js\");\r\nconst __1 = __webpack_require__(/*! ../.. */ \"./node_modules/@abaplint/core/build/src/index.js\");\r\nconst syntax_1 = __webpack_require__(/*! ../../abap/5_syntax/syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\r\nconst _scope_type_1 = __webpack_require__(/*! ../../abap/5_syntax/_scope_type */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js\");\r\nconst position_1 = __webpack_require__(/*! ../../position */ \"./node_modules/@abaplint/core/build/src/position.js\");\r\nconst _abap_object_1 = __webpack_require__(/*! ../_abap_object */ \"./node_modules/@abaplint/core/build/src/objects/_abap_object.js\");\r\nclass RenamerHelper {\r\n constructor(reg) {\r\n this.reg = reg;\r\n }\r\n renameReferences(id, oldName, newName) {\r\n if (id === undefined) {\r\n throw new Error(\"renameReferences, no main identifier found\");\r\n }\r\n let refs = [];\r\n for (const o of this.reg.getObjects()) {\r\n if (o instanceof _abap_object_1.ABAPObject) {\r\n if (this.reg.isDependency(o)) {\r\n continue; // do not search in dependencies\r\n }\r\n refs = refs.concat(this.findReferences(new syntax_1.SyntaxLogic(this.reg, o).run().spaghetti.getTop(), id));\r\n }\r\n }\r\n // start with the last reference in the file first, if there are multiple refs per line\r\n return this.replaceRefs(refs, oldName, newName).reverse();\r\n }\r\n buildXMLFileEdits(clas, xmlTag, oldName, newName) {\r\n const changes = [];\r\n const xml = clas.getXMLFile();\r\n if (xml === undefined) {\r\n return [];\r\n }\r\n const tag = xmlTag.toUpperCase();\r\n const search = \"<\" + tag + \">\" + oldName.toUpperCase() + \"</\" + tag + \">\";\r\n const rows = xml.getRawRows();\r\n for (let i = 0; i < rows.length; i++) {\r\n const index = rows[i].indexOf(search);\r\n if (index >= 0) {\r\n const range = vscode_languageserver_types_1.Range.create(i, index + 9, i, index + oldName.length + 9);\r\n changes.push(vscode_languageserver_types_1.TextDocumentEdit.create({ uri: xml.getFilename(), version: 1 }, [vscode_languageserver_types_1.TextEdit.replace(range, newName.toUpperCase())]));\r\n }\r\n }\r\n return changes;\r\n }\r\n renameFiles(obj, oldName, name) {\r\n const list = [];\r\n const newName = name.toLowerCase().replace(/\\//g, \"#\");\r\n for (const f of obj.getFiles()) {\r\n // todo, this is not completely correct, ie. if the URI contains the same directory name as the object name\r\n const newFilename = f.getFilename().replace(oldName.toLowerCase(), newName.toLowerCase());\r\n list.push(vscode_languageserver_types_1.RenameFile.create(f.getFilename(), newFilename));\r\n }\r\n return list;\r\n }\r\n ////////////////////////\r\n replaceRefs(refs, oldName, newName) {\r\n const changes = [];\r\n // \"zif_abapgit_auth~is_allowed\" is a single token so only replace the first part of a token\r\n for (const r of refs) {\r\n const range = vscode_languageserver_types_1.Range.create(r.getStart().getRow() - 1, r.getStart().getCol() - 1, r.getStart().getRow() - 1, r.getStart().getCol() - 1 + oldName.length);\r\n changes.push(vscode_languageserver_types_1.TextDocumentEdit.create({ uri: r.getFilename(), version: 1 }, [vscode_languageserver_types_1.TextEdit.replace(range, newName.toLowerCase())]));\r\n }\r\n return changes;\r\n }\r\n findReferences(node, identifier) {\r\n var _a;\r\n let ret = [];\r\n if (node.getIdentifier().stype !== _scope_type_1.ScopeType.BuiltIn) {\r\n for (const r of node.getData().references) {\r\n if (((_a = r.resolved) === null || _a === void 0 ? void 0 : _a.equals(identifier))\r\n && r.referenceType !== __1.ReferenceType.InferredType\r\n && !(r.position.getStart() instanceof position_1.VirtualPosition)) {\r\n ret.push(r.position);\r\n }\r\n }\r\n }\r\n for (const c of node.getChildren()) {\r\n ret = ret.concat(this.findReferences(c, identifier));\r\n }\r\n return ret;\r\n }\r\n}\r\nexports.RenamerHelper = RenamerHelper;\r\n//# sourceMappingURL=renamer_helper.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/rename/renamer_helper.js?");
10095
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.RenamerHelper = void 0;\r\nconst vscode_languageserver_types_1 = __webpack_require__(/*! vscode-languageserver-types */ \"./node_modules/vscode-languageserver-types/lib/esm/main.js\");\r\nconst __1 = __webpack_require__(/*! ../.. */ \"./node_modules/@abaplint/core/build/src/index.js\");\r\nconst syntax_1 = __webpack_require__(/*! ../../abap/5_syntax/syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\r\nconst _scope_type_1 = __webpack_require__(/*! ../../abap/5_syntax/_scope_type */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js\");\r\nconst position_1 = __webpack_require__(/*! ../../position */ \"./node_modules/@abaplint/core/build/src/position.js\");\r\nconst _abap_object_1 = __webpack_require__(/*! ../_abap_object */ \"./node_modules/@abaplint/core/build/src/objects/_abap_object.js\");\r\nclass RenamerHelper {\r\n constructor(reg) {\r\n this.reg = reg;\r\n }\r\n renameReferences(id, oldName, newName) {\r\n if (id === undefined) {\r\n throw new Error(\"renameReferences, no main identifier found\");\r\n }\r\n let refs = [];\r\n for (const o of this.reg.getObjects()) {\r\n if (o instanceof _abap_object_1.ABAPObject) {\r\n if (this.reg.isDependency(o)) {\r\n continue; // do not search in dependencies\r\n }\r\n refs = refs.concat(this.findReferences(new syntax_1.SyntaxLogic(this.reg, o).run().spaghetti.getTop(), id));\r\n }\r\n }\r\n // start with the last reference in the file first, if there are multiple refs per line\r\n return this.replaceRefs(refs, oldName, newName).reverse();\r\n }\r\n renameDDICCodeReferences(obj, oldName, newName) {\r\n const changes = [];\r\n const used = this.reg.getDDICReferences().listWhereUsed(obj);\r\n for (const u of used) {\r\n if (u.token === undefined || u.filename === undefined) {\r\n continue;\r\n }\r\n const range = vscode_languageserver_types_1.Range.create(u.token.getStart().getRow() - 1, u.token.getStart().getCol() - 1, u.token.getStart().getRow() - 1, u.token.getStart().getCol() - 1 + oldName.length);\r\n changes.push(vscode_languageserver_types_1.TextDocumentEdit.create({ uri: u.filename, version: 1 }, [vscode_languageserver_types_1.TextEdit.replace(range, newName.toLowerCase())]));\r\n }\r\n return changes;\r\n }\r\n renameDDICTABLReferences(obj, oldName, newName) {\r\n const changes = [];\r\n const used = this.reg.getDDICReferences().listWhereUsed(obj);\r\n const handled = {};\r\n for (const u of used) {\r\n if (u.type !== \"TABL\" || handled[u.name.toUpperCase()] === true) {\r\n // a TABL might reference the object multiple times, but they are all fixes in one call to buildXMLFileEdits\r\n continue;\r\n }\r\n const tabl = this.reg.getObject(u.type, u.name);\r\n if (tabl === undefined) {\r\n continue;\r\n }\r\n changes.push(...this.buildXMLFileEdits(tabl, \"ROLLNAME\", oldName, newName));\r\n handled[u.name.toUpperCase()] = true;\r\n }\r\n return changes;\r\n }\r\n renameDDICDTELReferences(obj, oldName, newName) {\r\n const changes = [];\r\n const used = this.reg.getDDICReferences().listWhereUsed(obj);\r\n for (const u of used) {\r\n if (u.type !== \"DTEL\") {\r\n continue;\r\n }\r\n const tabl = this.reg.getObject(u.type, u.name);\r\n if (tabl === undefined) {\r\n continue;\r\n }\r\n changes.push(...this.buildXMLFileEdits(tabl, \"DOMNAME\", oldName, newName));\r\n }\r\n return changes;\r\n }\r\n renameDDICTTYPReferences(obj, oldName, newName) {\r\n const changes = [];\r\n const used = this.reg.getDDICReferences().listWhereUsed(obj);\r\n for (const u of used) {\r\n if (u.type !== \"TTYP\") {\r\n continue;\r\n }\r\n const tabl = this.reg.getObject(u.type, u.name);\r\n if (tabl === undefined) {\r\n continue;\r\n }\r\n changes.push(...this.buildXMLFileEdits(tabl, \"ROWTYPE\", oldName, newName));\r\n }\r\n return changes;\r\n }\r\n buildXMLFileEdits(object, xmlTag, oldName, newName) {\r\n const changes = [];\r\n const xml = object.getXMLFile();\r\n if (xml === undefined) {\r\n return [];\r\n }\r\n const tag = xmlTag.toUpperCase();\r\n const search = \"<\" + tag + \">\" + oldName.toUpperCase() + \"</\" + tag + \">\";\r\n const length = tag.length + 2;\r\n const rows = xml.getRawRows();\r\n for (let i = 0; i < rows.length; i++) {\r\n const index = rows[i].indexOf(search);\r\n if (index >= 0) {\r\n const range = vscode_languageserver_types_1.Range.create(i, index + length, i, index + oldName.length + length);\r\n changes.push(vscode_languageserver_types_1.TextDocumentEdit.create({ uri: xml.getFilename(), version: 1 }, [vscode_languageserver_types_1.TextEdit.replace(range, newName.toUpperCase())]));\r\n }\r\n }\r\n return changes;\r\n }\r\n renameFiles(obj, oldName, name) {\r\n const list = [];\r\n const newName = name.toLowerCase().replace(/\\//g, \"#\");\r\n for (const f of obj.getFiles()) {\r\n // todo, this is not completely correct, ie. if the URI contains the same directory name as the object name\r\n const newFilename = f.getFilename().replace(oldName.toLowerCase(), newName.toLowerCase());\r\n list.push(vscode_languageserver_types_1.RenameFile.create(f.getFilename(), newFilename));\r\n }\r\n return list;\r\n }\r\n ////////////////////////\r\n replaceRefs(refs, oldName, newName) {\r\n const changes = [];\r\n // \"zif_abapgit_auth~is_allowed\" is a single token so only replace the first part of a token\r\n for (const r of refs) {\r\n const range = vscode_languageserver_types_1.Range.create(r.getStart().getRow() - 1, r.getStart().getCol() - 1, r.getStart().getRow() - 1, r.getStart().getCol() - 1 + oldName.length);\r\n changes.push(vscode_languageserver_types_1.TextDocumentEdit.create({ uri: r.getFilename(), version: 1 }, [vscode_languageserver_types_1.TextEdit.replace(range, newName.toLowerCase())]));\r\n }\r\n return changes;\r\n }\r\n findReferences(node, identifier) {\r\n var _a;\r\n let ret = [];\r\n if (node.getIdentifier().stype !== _scope_type_1.ScopeType.BuiltIn) {\r\n for (const r of node.getData().references) {\r\n if (((_a = r.resolved) === null || _a === void 0 ? void 0 : _a.equals(identifier))\r\n && r.referenceType !== __1.ReferenceType.InferredType\r\n && !(r.position.getStart() instanceof position_1.VirtualPosition)) {\r\n ret.push(r.position);\r\n }\r\n }\r\n }\r\n for (const c of node.getChildren()) {\r\n ret = ret.concat(this.findReferences(c, identifier));\r\n }\r\n return ret;\r\n }\r\n}\r\nexports.RenamerHelper = RenamerHelper;\r\n//# sourceMappingURL=renamer_helper.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/rename/renamer_helper.js?");
10074
10096
 
10075
10097
  /***/ }),
10076
10098
 
@@ -10213,7 +10235,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
10213
10235
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10214
10236
 
10215
10237
  "use strict";
10216
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Table = exports.TableCategory = exports.EnhancementCategory = void 0;\r\nconst Types = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ \"./node_modules/@abaplint/core/build/src/objects/_abstract_object.js\");\r\nconst xml_utils_1 = __webpack_require__(/*! ../xml_utils */ \"./node_modules/@abaplint/core/build/src/xml_utils.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nconst _typed_identifier_1 = __webpack_require__(/*! ../abap/types/_typed_identifier */ \"./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js\");\r\nconst basic_1 = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nvar EnhancementCategory;\r\n(function (EnhancementCategory) {\r\n EnhancementCategory[\"NotClassified\"] = \"0\";\r\n EnhancementCategory[\"CannotBeEhanced\"] = \"1\";\r\n EnhancementCategory[\"Character\"] = \"2\";\r\n EnhancementCategory[\"CharacterOrNumeric\"] = \"3\";\r\n EnhancementCategory[\"Deep\"] = \"4\";\r\n})(EnhancementCategory = exports.EnhancementCategory || (exports.EnhancementCategory = {}));\r\nvar TableCategory;\r\n(function (TableCategory) {\r\n TableCategory[\"Transparent\"] = \"TRANSP\";\r\n TableCategory[\"Structure\"] = \"INTTAB\";\r\n TableCategory[\"Cluster\"] = \"CLUSTER\";\r\n TableCategory[\"Pooled\"] = \"POOL\";\r\n TableCategory[\"View\"] = \"VIEW\";\r\n TableCategory[\"Append\"] = \"APPEND\";\r\n})(TableCategory = exports.TableCategory || (exports.TableCategory = {}));\r\nclass Table extends _abstract_object_1.AbstractObject {\r\n getType() {\r\n return \"TABL\";\r\n }\r\n getDescription() {\r\n // todo\r\n return undefined;\r\n }\r\n getAllowedNaming() {\r\n return {\r\n maxLength: 30,\r\n allowNamespace: true,\r\n };\r\n }\r\n setDirty() {\r\n this.parsedData = undefined;\r\n super.setDirty();\r\n }\r\n listKeys() {\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n if (this.parsedData === undefined) {\r\n return [];\r\n }\r\n const ret = [];\r\n for (const p of this.parsedData.fields) {\r\n if (p.KEYFLAG === \"X\") {\r\n ret.push(p.FIELDNAME);\r\n }\r\n }\r\n return ret;\r\n }\r\n parseType(reg) {\r\n var _a, _b;\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n if (this.parsedData === undefined) {\r\n return new Types.UnknownType(\"Table, parser error\");\r\n }\r\n }\r\n const references = [];\r\n const components = [];\r\n const ddic = new ddic_1.DDIC(reg);\r\n for (const field of this.parsedData.fields) {\r\n const comptype = field.COMPTYPE ? field.COMPTYPE : \"\";\r\n if (comptype === \"E\") { // data element\r\n const lookup = ddic.lookupDataElement(field.ROLLNAME);\r\n components.push({ name: field.FIELDNAME, type: lookup.type });\r\n if (lookup.object) {\r\n references.push(lookup.object);\r\n }\r\n }\r\n else if (field.FIELDNAME === \".INCLUDE\" || field.FIELDNAME === \".INCLU--AP\") { // incude or append structure\r\n if (field.PRECFIELD === undefined) {\r\n return new Types.UnknownType(\"Table, parser error, PRECFIELD undefined\");\r\n }\r\n const lookup = ddic.lookupTableOrView(field.PRECFIELD);\r\n let found = lookup.type;\r\n if (lookup.object) {\r\n references.push(lookup.object);\r\n }\r\n if (found instanceof _typed_identifier_1.TypedIdentifier) {\r\n found = found.getType();\r\n }\r\n if (found instanceof Types.StructureType) {\r\n for (const c of found.getComponents()) {\r\n components.push({ name: c.name, type: c.type });\r\n }\r\n }\r\n else if ((((_a = field.PRECFIELD) === null || _a === void 0 ? void 0 : _a.startsWith(\"CI_\")) || ((_b = field.PRECFIELD) === null || _b === void 0 ? void 0 : _b.startsWith(\"SI_\")))\r\n && found instanceof Types.UnknownType) {\r\n continue;\r\n }\r\n else if (found instanceof Types.UnknownType) {\r\n return found;\r\n }\r\n else if (found instanceof Types.VoidType) {\r\n // set the full structure to void\r\n return found;\r\n }\r\n else {\r\n components.push({ name: field.FIELDNAME, type: found });\r\n }\r\n }\r\n else if (comptype === \"S\" && field.FIELDNAME.startsWith(\".INCLU-\")) {\r\n components.push({\r\n name: field.FIELDNAME,\r\n type: new Types.UnknownType(\"Table \" + this.getName() + \", todo, group named INCLUDE\")\r\n });\r\n }\r\n else if (comptype === \"S\") {\r\n const lookup = ddic.lookupTableOrView(field.ROLLNAME);\r\n components.push({ name: field.FIELDNAME, type: lookup.type });\r\n if (lookup.object) {\r\n references.push(lookup.object);\r\n }\r\n }\r\n else if (comptype === \"R\") {\r\n if (field.ROLLNAME === undefined) {\r\n throw new Error(\"Expected ROLLNAME\");\r\n }\r\n if (field.ROLLNAME === \"DATA\") {\r\n components.push({\r\n name: field.FIELDNAME,\r\n type: new basic_1.DataReference(new basic_1.AnyType())\r\n });\r\n }\r\n else {\r\n const lookup = ddic.lookupObject(field.ROLLNAME);\r\n components.push({ name: field.FIELDNAME, type: lookup.type });\r\n if (lookup.object) {\r\n references.push(lookup.object);\r\n }\r\n }\r\n }\r\n else if (comptype === \"L\") {\r\n const lookup = ddic.lookupTableType(field.ROLLNAME);\r\n components.push({ name: field.FIELDNAME, type: lookup.type });\r\n if (lookup.object) {\r\n references.push(lookup.object);\r\n }\r\n }\r\n else if (comptype === \"\") { // built in\r\n const datatype = field.DATATYPE;\r\n if (datatype === undefined) {\r\n throw new Error(\"Expected DATATYPE\");\r\n }\r\n const length = field.LENG ? field.LENG : field.INTLEN;\r\n components.push({\r\n name: field.FIELDNAME,\r\n type: ddic.textToType(datatype, length, field.DECIMALS, this.getName())\r\n });\r\n }\r\n else {\r\n components.push({\r\n name: field.FIELDNAME,\r\n type: new Types.UnknownType(\"Table \" + this.getName() + \", unknown component type \\\"\" + comptype + \"\\\"\")\r\n });\r\n }\r\n }\r\n if (components.length === 0) {\r\n return new Types.UnknownType(\"Table/Structure \" + this.getName() + \" does not contain any components\");\r\n }\r\n reg.getDDICReferences().setUsing(this, references);\r\n return new Types.StructureType(components, this.getName());\r\n }\r\n getTableCategory() {\r\n var _a;\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.tableCategory;\r\n }\r\n getEnhancementCategory() {\r\n var _a;\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n if (((_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.enhancementCategory) === undefined) {\r\n return EnhancementCategory.NotClassified;\r\n }\r\n return this.parsedData.enhancementCategory;\r\n }\r\n ///////////////\r\n parseXML() {\r\n var _a, _b, _c, _d, _e, _f, _g;\r\n const parsed = super.parseRaw2();\r\n if (parsed === undefined) {\r\n return;\r\n }\r\n this.parsedData = { fields: [] };\r\n if (parsed.abapGit === undefined) {\r\n return;\r\n }\r\n // enhancement category\r\n 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) {\r\n this.parsedData.enhancementCategory = EnhancementCategory.NotClassified;\r\n }\r\n else {\r\n 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;\r\n }\r\n // table category\r\n 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;\r\n // fields\r\n const fields = (_g = parsed.abapGit[\"asx:abap\"][\"asx:values\"]) === null || _g === void 0 ? void 0 : _g.DD03P_TABLE;\r\n for (const field of (0, xml_utils_1.xmlToArray)(fields === null || fields === void 0 ? void 0 : fields.DD03P)) {\r\n this.parsedData.fields.push({\r\n FIELDNAME: field.FIELDNAME,\r\n ROLLNAME: field.ROLLNAME,\r\n COMPTYPE: field.COMPTYPE,\r\n PRECFIELD: field.PRECFIELD,\r\n LENG: field.LENG,\r\n INTLEN: field.INTLEN,\r\n DATATYPE: field.DATATYPE,\r\n DECIMALS: field.DECIMALS,\r\n KEYFLAG: field.KEYFLAG,\r\n });\r\n }\r\n }\r\n}\r\nexports.Table = Table;\r\n//# sourceMappingURL=table.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/table.js?");
10238
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Table = exports.TableCategory = exports.EnhancementCategory = void 0;\r\nconst Types = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ \"./node_modules/@abaplint/core/build/src/objects/_abstract_object.js\");\r\nconst xml_utils_1 = __webpack_require__(/*! ../xml_utils */ \"./node_modules/@abaplint/core/build/src/xml_utils.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nconst _typed_identifier_1 = __webpack_require__(/*! ../abap/types/_typed_identifier */ \"./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js\");\r\nconst basic_1 = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nvar EnhancementCategory;\r\n(function (EnhancementCategory) {\r\n EnhancementCategory[\"NotClassified\"] = \"0\";\r\n EnhancementCategory[\"CannotBeEhanced\"] = \"1\";\r\n EnhancementCategory[\"Character\"] = \"2\";\r\n EnhancementCategory[\"CharacterOrNumeric\"] = \"3\";\r\n EnhancementCategory[\"Deep\"] = \"4\";\r\n})(EnhancementCategory = exports.EnhancementCategory || (exports.EnhancementCategory = {}));\r\nvar TableCategory;\r\n(function (TableCategory) {\r\n TableCategory[\"Transparent\"] = \"TRANSP\";\r\n TableCategory[\"Structure\"] = \"INTTAB\";\r\n TableCategory[\"Cluster\"] = \"CLUSTER\";\r\n TableCategory[\"Pooled\"] = \"POOL\";\r\n TableCategory[\"View\"] = \"VIEW\";\r\n TableCategory[\"Append\"] = \"APPEND\";\r\n})(TableCategory = exports.TableCategory || (exports.TableCategory = {}));\r\nclass Table extends _abstract_object_1.AbstractObject {\r\n getType() {\r\n return \"TABL\";\r\n }\r\n getDescription() {\r\n // todo\r\n return undefined;\r\n }\r\n getAllowedNaming() {\r\n return {\r\n maxLength: 30,\r\n allowNamespace: true,\r\n };\r\n }\r\n setDirty() {\r\n this.parsedData = undefined;\r\n super.setDirty();\r\n }\r\n listKeys() {\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n if (this.parsedData === undefined) {\r\n return [];\r\n }\r\n const ret = [];\r\n for (const p of this.parsedData.fields) {\r\n if (p.KEYFLAG === \"X\") {\r\n ret.push(p.FIELDNAME);\r\n }\r\n }\r\n return ret;\r\n }\r\n parseType(reg) {\r\n var _a, _b;\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n if (this.parsedData === undefined) {\r\n return new Types.UnknownType(\"Table, parser error\");\r\n }\r\n }\r\n const references = [];\r\n const components = [];\r\n const ddic = new ddic_1.DDIC(reg);\r\n for (const field of this.parsedData.fields) {\r\n const comptype = field.COMPTYPE ? field.COMPTYPE : \"\";\r\n if (comptype === \"E\") { // data element\r\n const lookup = ddic.lookupDataElement(field.ROLLNAME);\r\n components.push({ name: field.FIELDNAME, type: lookup.type });\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n }\r\n else if (field.FIELDNAME === \".INCLUDE\" || field.FIELDNAME === \".INCLU--AP\") { // incude or append structure\r\n if (field.PRECFIELD === undefined) {\r\n return new Types.UnknownType(\"Table, parser error, PRECFIELD undefined\");\r\n }\r\n const lookup = ddic.lookupTableOrView(field.PRECFIELD);\r\n let found = lookup.type;\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n if (found instanceof _typed_identifier_1.TypedIdentifier) {\r\n found = found.getType();\r\n }\r\n if (found instanceof Types.StructureType) {\r\n for (const c of found.getComponents()) {\r\n components.push({ name: c.name, type: c.type });\r\n }\r\n }\r\n else if ((((_a = field.PRECFIELD) === null || _a === void 0 ? void 0 : _a.startsWith(\"CI_\")) || ((_b = field.PRECFIELD) === null || _b === void 0 ? void 0 : _b.startsWith(\"SI_\")))\r\n && found instanceof Types.UnknownType) {\r\n continue;\r\n }\r\n else if (found instanceof Types.UnknownType) {\r\n return found;\r\n }\r\n else if (found instanceof Types.VoidType) {\r\n // set the full structure to void\r\n return found;\r\n }\r\n else {\r\n components.push({ name: field.FIELDNAME, type: found });\r\n }\r\n }\r\n else if (comptype === \"S\" && field.FIELDNAME.startsWith(\".INCLU-\")) {\r\n components.push({\r\n name: field.FIELDNAME,\r\n type: new Types.UnknownType(\"Table \" + this.getName() + \", todo, group named INCLUDE\")\r\n });\r\n }\r\n else if (comptype === \"S\") {\r\n const lookup = ddic.lookupTableOrView(field.ROLLNAME);\r\n components.push({ name: field.FIELDNAME, type: lookup.type });\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n }\r\n else if (comptype === \"R\") {\r\n if (field.ROLLNAME === undefined) {\r\n throw new Error(\"Expected ROLLNAME\");\r\n }\r\n if (field.ROLLNAME === \"DATA\") {\r\n components.push({\r\n name: field.FIELDNAME,\r\n type: new basic_1.DataReference(new basic_1.AnyType())\r\n });\r\n }\r\n else {\r\n const lookup = ddic.lookupObject(field.ROLLNAME);\r\n components.push({ name: field.FIELDNAME, type: lookup.type });\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n }\r\n }\r\n else if (comptype === \"L\") {\r\n const lookup = ddic.lookupTableType(field.ROLLNAME);\r\n components.push({ name: field.FIELDNAME, type: lookup.type });\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n }\r\n else if (comptype === \"\") { // built in\r\n const datatype = field.DATATYPE;\r\n if (datatype === undefined) {\r\n throw new Error(\"Expected DATATYPE, while parsing TABL \" + this.getName());\r\n }\r\n const length = field.LENG ? field.LENG : field.INTLEN;\r\n components.push({\r\n name: field.FIELDNAME,\r\n type: ddic.textToType(datatype, length, field.DECIMALS, this.getName())\r\n });\r\n }\r\n else {\r\n components.push({\r\n name: field.FIELDNAME,\r\n type: new Types.UnknownType(\"Table \" + this.getName() + \", unknown component type \\\"\" + comptype + \"\\\"\")\r\n });\r\n }\r\n }\r\n if (components.length === 0) {\r\n return new Types.UnknownType(\"Table/Structure \" + this.getName() + \" does not contain any components\");\r\n }\r\n reg.getDDICReferences().setUsing(this, references);\r\n return new Types.StructureType(components, this.getName());\r\n }\r\n getTableCategory() {\r\n var _a;\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.tableCategory;\r\n }\r\n getEnhancementCategory() {\r\n var _a;\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n if (((_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.enhancementCategory) === undefined) {\r\n return EnhancementCategory.NotClassified;\r\n }\r\n return this.parsedData.enhancementCategory;\r\n }\r\n ///////////////\r\n parseXML() {\r\n var _a, _b, _c, _d, _e, _f, _g;\r\n const parsed = super.parseRaw2();\r\n if (parsed === undefined) {\r\n return;\r\n }\r\n this.parsedData = { fields: [] };\r\n if (parsed.abapGit === undefined) {\r\n return;\r\n }\r\n // enhancement category\r\n 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) {\r\n this.parsedData.enhancementCategory = EnhancementCategory.NotClassified;\r\n }\r\n else {\r\n 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;\r\n }\r\n // table category\r\n 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;\r\n // fields\r\n const fields = (_g = parsed.abapGit[\"asx:abap\"][\"asx:values\"]) === null || _g === void 0 ? void 0 : _g.DD03P_TABLE;\r\n for (const field of (0, xml_utils_1.xmlToArray)(fields === null || fields === void 0 ? void 0 : fields.DD03P)) {\r\n this.parsedData.fields.push({\r\n FIELDNAME: field.FIELDNAME,\r\n ROLLNAME: field.ROLLNAME,\r\n COMPTYPE: field.COMPTYPE,\r\n PRECFIELD: field.PRECFIELD,\r\n LENG: field.LENG,\r\n INTLEN: field.INTLEN,\r\n DATATYPE: field.DATATYPE,\r\n DECIMALS: field.DECIMALS,\r\n KEYFLAG: field.KEYFLAG,\r\n });\r\n }\r\n }\r\n}\r\nexports.Table = Table;\r\n//# sourceMappingURL=table.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/table.js?");
10217
10239
 
10218
10240
  /***/ }),
10219
10241
 
@@ -10224,7 +10246,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
10224
10246
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10225
10247
 
10226
10248
  "use strict";
10227
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.TableType = void 0;\r\nconst _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ \"./node_modules/@abaplint/core/build/src/objects/_abstract_object.js\");\r\nconst Types = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nclass TableType extends _abstract_object_1.AbstractObject {\r\n constructor() {\r\n super(...arguments);\r\n this.parsedXML = undefined;\r\n }\r\n getType() {\r\n return \"TTYP\";\r\n }\r\n getAllowedNaming() {\r\n return {\r\n maxLength: 30,\r\n allowNamespace: true,\r\n };\r\n }\r\n getDescription() {\r\n // todo\r\n return undefined;\r\n }\r\n setDirty() {\r\n this.parsedXML = undefined;\r\n super.setDirty();\r\n }\r\n parseType(reg) {\r\n this.parseXML();\r\n const ddic = new ddic_1.DDIC(reg);\r\n const references = [];\r\n let type;\r\n if (this.parsedXML === undefined || this.parsedXML === {}) {\r\n type = new Types.UnknownType(\"Table Type, parser error\", this.getName());\r\n }\r\n else if (this.parsedXML.rowkind === \"S\") {\r\n const lookup = ddic.lookupTableOrView(this.parsedXML.rowtype);\r\n type = new Types.TableType(lookup.type, { withHeader: false }, this.getName());\r\n if (lookup.object) {\r\n references.push(lookup.object);\r\n }\r\n }\r\n else if (this.parsedXML.rowkind === \"E\") {\r\n const lookup = ddic.lookupDataElement(this.parsedXML.rowtype);\r\n type = new Types.TableType(lookup.type, { withHeader: false }, this.getName());\r\n if (lookup.object) {\r\n references.push(lookup.object);\r\n }\r\n }\r\n else if (this.parsedXML.rowkind === \"L\") {\r\n const lookup = ddic.lookupTableType(this.parsedXML.rowtype);\r\n type = new Types.TableType(lookup.type, { withHeader: false }, this.getName());\r\n if (lookup.object) {\r\n references.push(lookup.object);\r\n }\r\n }\r\n else if (this.parsedXML.rowkind === \"R\" && this.parsedXML.rowtype !== undefined) {\r\n const lookup = ddic.lookupObject(this.parsedXML.rowtype);\r\n type = new Types.TableType(lookup.type, { withHeader: false }, this.getName());\r\n if (lookup.object) {\r\n references.push(lookup.object);\r\n }\r\n }\r\n else if (this.parsedXML.rowkind === \"\") {\r\n if (this.parsedXML.datatype === undefined) {\r\n type = new Types.UnknownType(\"Table Type, empty DATATYPE\" + this.getName(), this.getName());\r\n }\r\n else {\r\n const row = ddic.textToType(this.parsedXML.datatype, this.parsedXML.leng, this.parsedXML.decimals, this.getName(), false);\r\n type = new Types.TableType(row, { withHeader: false }, this.getName());\r\n }\r\n }\r\n else {\r\n type = new Types.UnknownType(\"Table Type, unknown kind \\\"\" + this.parsedXML.rowkind + \"\\\"\" + this.getName(), this.getName());\r\n }\r\n reg.getDDICReferences().setUsing(this, references);\r\n return type;\r\n }\r\n ////////////////////\r\n parseXML() {\r\n if (this.parsedXML !== undefined) {\r\n return;\r\n }\r\n this.parsedXML = {};\r\n const parsed = super.parseRaw2();\r\n if (parsed === undefined || parsed.abapGit === undefined) {\r\n return;\r\n }\r\n const dd40v = parsed.abapGit[\"asx:abap\"][\"asx:values\"].DD40V;\r\n this.parsedXML.rowtype = dd40v.ROWTYPE ? dd40v.ROWTYPE : \"\";\r\n this.parsedXML.rowkind = dd40v.ROWKIND ? dd40v.ROWKIND : \"\";\r\n this.parsedXML.datatype = dd40v.DATATYPE;\r\n this.parsedXML.leng = dd40v.LENG;\r\n this.parsedXML.decimals = dd40v.DECIMALS;\r\n }\r\n}\r\nexports.TableType = TableType;\r\n//# sourceMappingURL=table_type.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/table_type.js?");
10249
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.TableType = void 0;\r\nconst _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ \"./node_modules/@abaplint/core/build/src/objects/_abstract_object.js\");\r\nconst Types = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nclass TableType extends _abstract_object_1.AbstractObject {\r\n constructor() {\r\n super(...arguments);\r\n this.parsedXML = undefined;\r\n }\r\n getType() {\r\n return \"TTYP\";\r\n }\r\n getAllowedNaming() {\r\n return {\r\n maxLength: 30,\r\n allowNamespace: true,\r\n };\r\n }\r\n getDescription() {\r\n // todo\r\n return undefined;\r\n }\r\n setDirty() {\r\n this.parsedXML = undefined;\r\n super.setDirty();\r\n }\r\n parseType(reg) {\r\n this.parseXML();\r\n const ddic = new ddic_1.DDIC(reg);\r\n const references = [];\r\n let type;\r\n if (this.parsedXML === undefined || this.parsedXML === {}) {\r\n type = new Types.UnknownType(\"Table Type, parser error\", this.getName());\r\n }\r\n else if (this.parsedXML.rowkind === \"S\") {\r\n const lookup = ddic.lookupTableOrView(this.parsedXML.rowtype);\r\n type = new Types.TableType(lookup.type, { withHeader: false }, this.getName());\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n }\r\n else if (this.parsedXML.rowkind === \"E\") {\r\n const lookup = ddic.lookupDataElement(this.parsedXML.rowtype);\r\n type = new Types.TableType(lookup.type, { withHeader: false }, this.getName());\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n }\r\n else if (this.parsedXML.rowkind === \"L\") {\r\n const lookup = ddic.lookupTableType(this.parsedXML.rowtype);\r\n type = new Types.TableType(lookup.type, { withHeader: false }, this.getName());\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n }\r\n else if (this.parsedXML.rowkind === \"R\" && this.parsedXML.rowtype !== undefined) {\r\n const lookup = ddic.lookupObject(this.parsedXML.rowtype);\r\n type = new Types.TableType(lookup.type, { withHeader: false }, this.getName());\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n }\r\n else if (this.parsedXML.rowkind === \"\") {\r\n if (this.parsedXML.datatype === undefined) {\r\n type = new Types.UnknownType(\"Table Type, empty DATATYPE\" + this.getName(), this.getName());\r\n }\r\n else {\r\n const row = ddic.textToType(this.parsedXML.datatype, this.parsedXML.leng, this.parsedXML.decimals, this.getName(), false);\r\n type = new Types.TableType(row, { withHeader: false }, this.getName());\r\n }\r\n }\r\n else {\r\n type = new Types.UnknownType(\"Table Type, unknown kind \\\"\" + this.parsedXML.rowkind + \"\\\"\" + this.getName(), this.getName());\r\n }\r\n reg.getDDICReferences().setUsing(this, references);\r\n return type;\r\n }\r\n ////////////////////\r\n parseXML() {\r\n if (this.parsedXML !== undefined) {\r\n return;\r\n }\r\n this.parsedXML = {};\r\n const parsed = super.parseRaw2();\r\n if (parsed === undefined || parsed.abapGit === undefined) {\r\n return;\r\n }\r\n const dd40v = parsed.abapGit[\"asx:abap\"][\"asx:values\"].DD40V;\r\n this.parsedXML.rowtype = dd40v.ROWTYPE ? dd40v.ROWTYPE : \"\";\r\n this.parsedXML.rowkind = dd40v.ROWKIND ? dd40v.ROWKIND : \"\";\r\n this.parsedXML.datatype = dd40v.DATATYPE;\r\n this.parsedXML.leng = dd40v.LENG;\r\n this.parsedXML.decimals = dd40v.DECIMALS;\r\n }\r\n}\r\nexports.TableType = TableType;\r\n//# sourceMappingURL=table_type.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/table_type.js?");
10228
10250
 
10229
10251
  /***/ }),
10230
10252
 
@@ -10290,7 +10312,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
10290
10312
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10291
10313
 
10292
10314
  "use strict";
10293
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.View = void 0;\r\nconst Types = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ \"./node_modules/@abaplint/core/build/src/objects/_abstract_object.js\");\r\nconst xml_utils_1 = __webpack_require__(/*! ../xml_utils */ \"./node_modules/@abaplint/core/build/src/xml_utils.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nclass View extends _abstract_object_1.AbstractObject {\r\n getType() {\r\n return \"VIEW\";\r\n }\r\n getAllowedNaming() {\r\n return {\r\n maxLength: 30,\r\n allowNamespace: true,\r\n };\r\n }\r\n setDirty() {\r\n this.parsedData = undefined;\r\n super.setDirty();\r\n }\r\n parseType(reg) {\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n if (this.parsedData === undefined) {\r\n return new Types.UnknownType(\"View, parser error\", this.getName());\r\n }\r\n const components = [];\r\n const references = [];\r\n const ddic = new ddic_1.DDIC(reg);\r\n for (const field of this.parsedData.fields) {\r\n if (field.VIEWFIELD === \"*\" || field.VIEWFIELD === \"-\") {\r\n // ignore, this is a special case of old style .INCLUDE\r\n continue;\r\n }\r\n const lookup = ddic.lookupTableOrView(field.TABNAME);\r\n let found = lookup.type;\r\n if (lookup.object) {\r\n references.push(lookup.object);\r\n }\r\n if (field.VIEWFIELD === \".APPEND\") {\r\n // it is already expanded in the abapGit xml\r\n continue;\r\n }\r\n if (found instanceof Types.StructureType) {\r\n const s = found.getComponentByName(field.FIELDNAME);\r\n if (s === undefined) {\r\n found = new Types.UnknownType(field.FIELDNAME + \" not found in \" + field.TABNAME + \", VIEW parse type\");\r\n }\r\n else {\r\n found = s;\r\n }\r\n }\r\n components.push({\r\n name: field.VIEWFIELD,\r\n type: found\r\n });\r\n }\r\n reg.getDDICReferences().setUsing(this, references);\r\n if (components.length === 0) {\r\n return new Types.UnknownType(\"View \" + this.getName() + \" does not contain any components\");\r\n }\r\n return new Types.StructureType(components, this.getName());\r\n }\r\n getDescription() {\r\n // todo\r\n return undefined;\r\n }\r\n ///////////////\r\n parseXML() {\r\n var _a;\r\n this.parsedData = { fields: [] };\r\n const parsed = super.parseRaw2();\r\n if (parsed === undefined || parsed.abapGit === undefined) {\r\n return;\r\n }\r\n const fields = (_a = parsed.abapGit[\"asx:abap\"][\"asx:values\"]) === null || _a === void 0 ? void 0 : _a.DD27P_TABLE;\r\n for (const field of (0, xml_utils_1.xmlToArray)(fields === null || fields === void 0 ? void 0 : fields.DD27P)) {\r\n this.parsedData.fields.push({\r\n VIEWFIELD: field.VIEWFIELD,\r\n TABNAME: field.TABNAME,\r\n FIELDNAME: field.FIELDNAME,\r\n });\r\n }\r\n }\r\n}\r\nexports.View = View;\r\n//# sourceMappingURL=view.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/view.js?");
10315
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.View = void 0;\r\nconst Types = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ \"./node_modules/@abaplint/core/build/src/objects/_abstract_object.js\");\r\nconst xml_utils_1 = __webpack_require__(/*! ../xml_utils */ \"./node_modules/@abaplint/core/build/src/xml_utils.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nclass View extends _abstract_object_1.AbstractObject {\r\n getType() {\r\n return \"VIEW\";\r\n }\r\n getAllowedNaming() {\r\n return {\r\n maxLength: 30,\r\n allowNamespace: true,\r\n };\r\n }\r\n setDirty() {\r\n this.parsedData = undefined;\r\n super.setDirty();\r\n }\r\n parseType(reg) {\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n if (this.parsedData === undefined) {\r\n return new Types.UnknownType(\"View, parser error\", this.getName());\r\n }\r\n const components = [];\r\n const references = [];\r\n const ddic = new ddic_1.DDIC(reg);\r\n for (const field of this.parsedData.fields) {\r\n if (field.VIEWFIELD === \"*\" || field.VIEWFIELD === \"-\") {\r\n // ignore, this is a special case of old style .INCLUDE\r\n continue;\r\n }\r\n const lookup = ddic.lookupTableOrView(field.TABNAME);\r\n let found = lookup.type;\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n if (field.VIEWFIELD === \".APPEND\") {\r\n // it is already expanded in the abapGit xml\r\n continue;\r\n }\r\n if (found instanceof Types.StructureType) {\r\n const s = found.getComponentByName(field.FIELDNAME);\r\n if (s === undefined) {\r\n found = new Types.UnknownType(field.FIELDNAME + \" not found in \" + field.TABNAME + \", VIEW parse type\");\r\n }\r\n else {\r\n found = s;\r\n }\r\n }\r\n components.push({\r\n name: field.VIEWFIELD,\r\n type: found\r\n });\r\n }\r\n reg.getDDICReferences().setUsing(this, references);\r\n if (components.length === 0) {\r\n return new Types.UnknownType(\"View \" + this.getName() + \" does not contain any components\");\r\n }\r\n return new Types.StructureType(components, this.getName());\r\n }\r\n getDescription() {\r\n // todo\r\n return undefined;\r\n }\r\n ///////////////\r\n parseXML() {\r\n var _a;\r\n this.parsedData = { fields: [] };\r\n const parsed = super.parseRaw2();\r\n if (parsed === undefined || parsed.abapGit === undefined) {\r\n return;\r\n }\r\n const fields = (_a = parsed.abapGit[\"asx:abap\"][\"asx:values\"]) === null || _a === void 0 ? void 0 : _a.DD27P_TABLE;\r\n for (const field of (0, xml_utils_1.xmlToArray)(fields === null || fields === void 0 ? void 0 : fields.DD27P)) {\r\n this.parsedData.fields.push({\r\n VIEWFIELD: field.VIEWFIELD,\r\n TABNAME: field.TABNAME,\r\n FIELDNAME: field.FIELDNAME,\r\n });\r\n }\r\n }\r\n}\r\nexports.View = View;\r\n//# sourceMappingURL=view.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/view.js?");
10294
10316
 
10295
10317
  /***/ }),
10296
10318
 
@@ -10433,7 +10455,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
10433
10455
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10434
10456
 
10435
10457
  "use strict";
10436
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Registry = void 0;\nconst config_1 = __webpack_require__(/*! ./config */ \"./node_modules/@abaplint/core/build/src/config.js\");\nconst artifacts_objects_1 = __webpack_require__(/*! ./artifacts_objects */ \"./node_modules/@abaplint/core/build/src/artifacts_objects.js\");\nconst artifacts_rules_1 = __webpack_require__(/*! ./artifacts_rules */ \"./node_modules/@abaplint/core/build/src/artifacts_rules.js\");\nconst skip_logic_1 = __webpack_require__(/*! ./skip_logic */ \"./node_modules/@abaplint/core/build/src/skip_logic.js\");\nconst _abap_object_1 = __webpack_require__(/*! ./objects/_abap_object */ \"./node_modules/@abaplint/core/build/src/objects/_abap_object.js\");\nconst find_global_definitions_1 = __webpack_require__(/*! ./abap/5_syntax/global_definitions/find_global_definitions */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/global_definitions/find_global_definitions.js\");\nconst syntax_1 = __webpack_require__(/*! ./abap/5_syntax/syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\nconst excludeHelper_1 = __webpack_require__(/*! ./utils/excludeHelper */ \"./node_modules/@abaplint/core/build/src/utils/excludeHelper.js\");\nconst ddic_references_1 = __webpack_require__(/*! ./ddic_references */ \"./node_modules/@abaplint/core/build/src/ddic_references.js\");\n// todo, this should really be an instance in case there are multiple Registry'ies\nclass ParsingPerformance {\n static clear() {\n this.results = [];\n this.lexing = 0;\n this.statements = 0;\n this.structure = 0;\n }\n static push(obj, result) {\n if (result.runtimeExtra) {\n this.lexing += result.runtimeExtra.lexing;\n this.statements += result.runtimeExtra.statements;\n this.structure += result.runtimeExtra.structure;\n }\n if (result.runtime < 100) {\n return;\n }\n if (this.results === undefined) {\n this.results = [];\n }\n let extra = \"\";\n if (result.runtimeExtra) {\n extra = `\\t(lexing: ${result.runtimeExtra.lexing}ms, statements: ${result.runtimeExtra.statements}ms, structure: ${result.runtimeExtra.structure}ms)`;\n }\n this.results.push({\n runtime: result.runtime,\n extra,\n name: obj.getType() + \" \" + obj.getName(),\n });\n }\n static output() {\n const MAX = 10;\n this.results.sort((a, b) => { return b.runtime - a.runtime; });\n for (let i = 0; i < MAX; i++) {\n const row = this.results[i];\n if (row === undefined) {\n break;\n }\n process.stderr.write(`\\t${row.runtime}ms\\t${row.name} ${row.extra}\\n`);\n }\n process.stderr.write(`\\tTotal lexing: ${this.lexing}ms\\n`);\n process.stderr.write(`\\tTotal statements: ${this.statements}ms\\n`);\n process.stderr.write(`\\tTotal structure: ${this.structure}ms\\n`);\n }\n}\n///////////////////////////////////////////////////////////////////////////////////////////////\nclass Registry {\n constructor(conf) {\n this.objects = {};\n this.objectsByType = {};\n /** object containing filenames of dependencies */\n this.dependencies = {};\n this.issues = [];\n this.conf = conf ? conf : config_1.Config.getDefault();\n this.references = new ddic_references_1.DDICReferences();\n }\n static abaplintVersion() {\n // magic, see build script \"version.sh\"\n return \"2.79.8\";\n }\n getDDICReferences() {\n return this.references;\n }\n *getObjects() {\n for (const name in this.objects) {\n for (const type in this.objects[name]) {\n yield this.objects[name][type];\n }\n }\n }\n *getObjectsByType(type) {\n for (const name in this.objectsByType[type] || []) {\n yield this.objectsByType[type][name];\n }\n }\n *getFiles() {\n for (const obj of this.getObjects()) {\n for (const file of obj.getFiles()) {\n yield file;\n }\n }\n }\n getFirstObject() {\n for (const name in this.objects) {\n for (const type in this.objects[name]) {\n return this.objects[name][type];\n }\n }\n return undefined;\n }\n getObjectCount(skipDependencies = true) {\n let res = 0;\n for (const o of this.getObjects()) {\n if (skipDependencies === true && this.isDependency(o)) {\n continue;\n }\n res = res + 1;\n }\n return res;\n }\n getFileByName(filename) {\n const upper = filename.toUpperCase();\n for (const o of this.getObjects()) {\n for (const f of o.getFiles()) {\n if (f.getFilename().toUpperCase() === upper) {\n return f;\n }\n }\n }\n return undefined;\n }\n getObject(type, name) {\n if (type === undefined || name === undefined) {\n return undefined;\n }\n const searchName = name.toUpperCase();\n if (this.objects[searchName]) {\n return this.objects[searchName][type];\n }\n return undefined;\n }\n getConfig() {\n return this.conf;\n }\n // assumption: Config is immutable, and can only be changed via this method\n setConfig(conf) {\n for (const obj of this.getObjects()) {\n obj.setDirty();\n }\n this.conf = conf;\n return this;\n }\n inErrorNamespace(name) {\n const reg = new RegExp(this.getConfig().getSyntaxSetttings().errorNamespace, \"i\");\n return reg.test(name);\n }\n addFile(file) {\n return this.addFiles([file]);\n }\n updateFile(file) {\n const obj = this.find(file.getObjectName(), file.getObjectType());\n obj.updateFile(file);\n return this;\n }\n removeFile(file) {\n const obj = this.find(file.getObjectName(), file.getObjectType());\n obj.removeFile(file);\n if (obj.getFiles().length === 0) {\n this.references.clear(obj);\n this.removeObject(obj);\n }\n return this;\n }\n addFiles(files) {\n var _a;\n const globalExclude = ((_a = this.conf.getGlobal().exclude) !== null && _a !== void 0 ? _a : [])\n .map(pattern => new RegExp(pattern, \"i\"));\n for (const f of files) {\n const filename = f.getFilename();\n const isNotAbapgitFile = filename.split(\".\").length <= 2;\n if (isNotAbapgitFile || excludeHelper_1.ExcludeHelper.isExcluded(filename, globalExclude)) {\n continue;\n }\n const found = this.findOrCreate(f.getObjectName(), f.getObjectType());\n found.addFile(f);\n }\n return this;\n }\n addDependencies(files) {\n for (const f of files) {\n this.dependencies[f.getFilename().toUpperCase()] = true;\n }\n return this.addFiles(files);\n }\n addDependency(file) {\n this.dependencies[file.getFilename().toUpperCase()] = true;\n this.addFile(file);\n return this;\n }\n isDependency(obj) {\n const filename = obj.getFiles()[0].getFilename().toUpperCase();\n return this.dependencies[filename] === true;\n }\n isFileDependency(filename) {\n return this.dependencies[filename.toUpperCase()] === true;\n }\n // assumption: the file is already in the registry\n findObjectForFile(file) {\n const filename = file.getFilename();\n for (const obj of this.getObjects()) {\n for (const ofile of obj.getFiles()) {\n if (ofile.getFilename() === filename) {\n return obj;\n }\n }\n }\n return undefined;\n }\n // todo, this will be changed to async sometime\n findIssues(input) {\n if (this.isDirty() === true) {\n this.parse();\n }\n return this.runRules(input);\n }\n // todo, this will be changed to async sometime\n findIssuesObject(iobj) {\n if (this.isDirty() === true) {\n this.parse();\n }\n return this.runRules(undefined, iobj);\n }\n // todo, this will be changed to async sometime\n parse() {\n if (this.isDirty() === false) {\n return this;\n }\n ParsingPerformance.clear();\n this.issues = [];\n for (const o of this.getObjects()) {\n this.parsePrivate(o);\n this.issues.push(...o.getParsingIssues());\n }\n new find_global_definitions_1.FindGlobalDefinitions(this).run();\n return this;\n }\n async parseAsync(input) {\n var _a, _b;\n if (this.isDirty() === false) {\n return this;\n }\n ParsingPerformance.clear();\n (_a = input === null || input === void 0 ? void 0 : input.progress) === null || _a === void 0 ? void 0 : _a.set(this.getObjectCount(false), \"Lexing and parsing\");\n this.issues = [];\n for (const o of this.getObjects()) {\n await ((_b = input === null || input === void 0 ? void 0 : input.progress) === null || _b === void 0 ? void 0 : _b.tick(\"Lexing and parsing(\" + this.conf.getVersion() + \") - \" + o.getType() + \" \" + o.getName()));\n this.parsePrivate(o);\n this.issues.push(...o.getParsingIssues());\n }\n if ((input === null || input === void 0 ? void 0 : input.outputPerformance) === true) {\n ParsingPerformance.output();\n }\n new find_global_definitions_1.FindGlobalDefinitions(this).run(input === null || input === void 0 ? void 0 : input.progress);\n return this;\n }\n //////////////////////////////////////////\n // todo, refactor, this is a mess, see where-used, a lot of the code should be in this method instead\n parsePrivate(input) {\n const config = this.getConfig();\n const result = input.parse(config.getVersion(), config.getSyntaxSetttings().globalMacros);\n ParsingPerformance.push(input, result);\n }\n isDirty() {\n for (const o of this.getObjects()) {\n const dirty = o.isDirty();\n if (dirty === true) {\n return true;\n }\n }\n return false;\n }\n runRules(input, iobj) {\n var _a, _b, _c, _d, _e, _f;\n const rulePerformance = {};\n const issues = this.issues.slice(0);\n const objects = iobj ? [iobj] : this.getObjects();\n const rules = this.conf.getEnabledRules();\n const skipLogic = new skip_logic_1.SkipLogic(this);\n (_a = input === null || input === void 0 ? void 0 : input.progress) === null || _a === void 0 ? void 0 : _a.set(iobj ? 1 : this.getObjectCount(false), \"Run Syntax\");\n const check = [];\n for (const obj of objects) {\n (_b = input === null || input === void 0 ? void 0 : input.progress) === null || _b === void 0 ? void 0 : _b.tick(\"Run Syntax - \" + obj.getName());\n if (skipLogic.skip(obj) || this.isDependency(obj)) {\n continue;\n }\n if (obj instanceof _abap_object_1.ABAPObject) {\n new syntax_1.SyntaxLogic(this, obj).run();\n }\n check.push(obj);\n }\n (_c = input === null || input === void 0 ? void 0 : input.progress) === null || _c === void 0 ? void 0 : _c.set(rules.length, \"Initialize Rules\");\n for (const rule of rules) {\n (_d = input === null || input === void 0 ? void 0 : input.progress) === null || _d === void 0 ? void 0 : _d.tick(\"Initialize Rules - \" + rule.getMetadata().key);\n if (rule.initialize === undefined) {\n throw new Error(rule.getMetadata().key + \" missing initialize method\");\n }\n rule.initialize(this);\n rulePerformance[rule.getMetadata().key] = 0;\n }\n (_e = input === null || input === void 0 ? void 0 : input.progress) === null || _e === void 0 ? void 0 : _e.set(check.length, \"Finding Issues\");\n for (const obj of check) {\n (_f = input === null || input === void 0 ? void 0 : input.progress) === null || _f === void 0 ? void 0 : _f.tick(\"Finding Issues - \" + obj.getType() + \" \" + obj.getName());\n for (const rule of rules) {\n const before = Date.now();\n issues.push(...rule.run(obj));\n const runtime = Date.now() - before;\n rulePerformance[rule.getMetadata().key] = rulePerformance[rule.getMetadata().key] + runtime;\n }\n }\n if ((input === null || input === void 0 ? void 0 : input.outputPerformance) === true) {\n const perf = [];\n for (const p in rulePerformance) {\n if (rulePerformance[p] > 100) { // ignore rules if it takes less than 100ms\n perf.push({ name: p, time: rulePerformance[p] });\n }\n }\n perf.sort((a, b) => { return b.time - a.time; });\n for (const p of perf) {\n process.stderr.write(\"\\t\" + p.time + \"ms\\t\" + p.name + \"\\n\");\n }\n }\n return this.excludeIssues(issues);\n }\n excludeIssues(issues) {\n var _a;\n const ret = issues;\n // exclude issues, as now we know both the filename and issue key\n for (const rule of artifacts_rules_1.ArtifactsRules.getRules()) {\n const key = rule.getMetadata().key;\n const ruleExclude = ((_a = this.conf.readByKey(key, \"exclude\")) !== null && _a !== void 0 ? _a : []);\n const ruleExcludePatterns = ruleExclude.map(x => new RegExp(x, \"i\"));\n for (let i = ret.length - 1; i >= 0; i--) {\n if (ret[i].getKey() !== key) {\n continue;\n }\n const filename = ret[i].getFilename();\n if (excludeHelper_1.ExcludeHelper.isExcluded(filename, ruleExcludePatterns)) {\n ret.splice(i, 1);\n }\n }\n }\n return ret;\n }\n findOrCreate(name, type) {\n try {\n return this.find(name, type);\n }\n catch (_a) {\n const newName = name.toUpperCase();\n const newType = type ? type : \"UNKNOWN\";\n const add = artifacts_objects_1.ArtifactsObjects.newObject(newName, newType);\n if (this.objects[newName] === undefined) {\n this.objects[newName] = {};\n }\n this.objects[newName][newType] = add;\n if (this.objectsByType[newType] === undefined) {\n this.objectsByType[newType] = {};\n }\n this.objectsByType[newType][newName] = add;\n return add;\n }\n }\n removeObject(remove) {\n if (remove === undefined) {\n return;\n }\n if (this.objects[remove.getName()][remove.getType()] === undefined) {\n throw new Error(\"removeObject: object not found\");\n }\n if (Object.keys(this.objects[remove.getName()]).length === 1) {\n delete this.objects[remove.getName()];\n }\n else {\n delete this.objects[remove.getName()][remove.getType()];\n }\n if (Object.keys(this.objectsByType[remove.getType()]).length === 1) {\n delete this.objectsByType[remove.getType()];\n }\n else {\n delete this.objectsByType[remove.getType()][remove.getName()];\n }\n }\n find(name, type) {\n const searchType = type ? type : \"UNKNOWN\";\n const searchName = name.toUpperCase();\n if (this.objects[searchName] !== undefined\n && this.objects[searchName][searchType]) {\n return this.objects[searchName][searchType];\n }\n throw new Error(\"find: object not found, \" + type + \" \" + name);\n }\n}\nexports.Registry = Registry;\n//# sourceMappingURL=registry.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/registry.js?");
10458
+ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Registry = void 0;\nconst config_1 = __webpack_require__(/*! ./config */ \"./node_modules/@abaplint/core/build/src/config.js\");\nconst artifacts_objects_1 = __webpack_require__(/*! ./artifacts_objects */ \"./node_modules/@abaplint/core/build/src/artifacts_objects.js\");\nconst artifacts_rules_1 = __webpack_require__(/*! ./artifacts_rules */ \"./node_modules/@abaplint/core/build/src/artifacts_rules.js\");\nconst skip_logic_1 = __webpack_require__(/*! ./skip_logic */ \"./node_modules/@abaplint/core/build/src/skip_logic.js\");\nconst _abap_object_1 = __webpack_require__(/*! ./objects/_abap_object */ \"./node_modules/@abaplint/core/build/src/objects/_abap_object.js\");\nconst find_global_definitions_1 = __webpack_require__(/*! ./abap/5_syntax/global_definitions/find_global_definitions */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/global_definitions/find_global_definitions.js\");\nconst syntax_1 = __webpack_require__(/*! ./abap/5_syntax/syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\nconst excludeHelper_1 = __webpack_require__(/*! ./utils/excludeHelper */ \"./node_modules/@abaplint/core/build/src/utils/excludeHelper.js\");\nconst ddic_references_1 = __webpack_require__(/*! ./ddic_references */ \"./node_modules/@abaplint/core/build/src/ddic_references.js\");\n// todo, this should really be an instance in case there are multiple Registry'ies\nclass ParsingPerformance {\n static clear() {\n this.results = [];\n this.lexing = 0;\n this.statements = 0;\n this.structure = 0;\n }\n static push(obj, result) {\n if (result.runtimeExtra) {\n this.lexing += result.runtimeExtra.lexing;\n this.statements += result.runtimeExtra.statements;\n this.structure += result.runtimeExtra.structure;\n }\n if (result.runtime < 100) {\n return;\n }\n if (this.results === undefined) {\n this.results = [];\n }\n let extra = \"\";\n if (result.runtimeExtra) {\n extra = `\\t(lexing: ${result.runtimeExtra.lexing}ms, statements: ${result.runtimeExtra.statements}ms, structure: ${result.runtimeExtra.structure}ms)`;\n }\n this.results.push({\n runtime: result.runtime,\n extra,\n name: obj.getType() + \" \" + obj.getName(),\n });\n }\n static output() {\n const MAX = 10;\n this.results.sort((a, b) => { return b.runtime - a.runtime; });\n for (let i = 0; i < MAX; i++) {\n const row = this.results[i];\n if (row === undefined) {\n break;\n }\n process.stderr.write(`\\t${row.runtime}ms\\t${row.name} ${row.extra}\\n`);\n }\n process.stderr.write(`\\tTotal lexing: ${this.lexing}ms\\n`);\n process.stderr.write(`\\tTotal statements: ${this.statements}ms\\n`);\n process.stderr.write(`\\tTotal structure: ${this.structure}ms\\n`);\n }\n}\n///////////////////////////////////////////////////////////////////////////////////////////////\nclass Registry {\n constructor(conf) {\n this.objects = {};\n this.objectsByType = {};\n /** object containing filenames of dependencies */\n this.dependencies = {};\n this.issues = [];\n this.conf = conf ? conf : config_1.Config.getDefault();\n this.references = new ddic_references_1.DDICReferences();\n }\n static abaplintVersion() {\n // magic, see build script \"version.sh\"\n return \"2.79.15\";\n }\n getDDICReferences() {\n return this.references;\n }\n *getObjects() {\n for (const name in this.objects) {\n for (const type in this.objects[name]) {\n yield this.objects[name][type];\n }\n }\n }\n *getObjectsByType(type) {\n for (const name in this.objectsByType[type] || []) {\n yield this.objectsByType[type][name];\n }\n }\n *getFiles() {\n for (const obj of this.getObjects()) {\n for (const file of obj.getFiles()) {\n yield file;\n }\n }\n }\n getFirstObject() {\n for (const name in this.objects) {\n for (const type in this.objects[name]) {\n return this.objects[name][type];\n }\n }\n return undefined;\n }\n getObjectCount(skipDependencies = true) {\n let res = 0;\n for (const o of this.getObjects()) {\n if (skipDependencies === true && this.isDependency(o)) {\n continue;\n }\n res = res + 1;\n }\n return res;\n }\n getFileByName(filename) {\n const upper = filename.toUpperCase();\n for (const o of this.getObjects()) {\n for (const f of o.getFiles()) {\n if (f.getFilename().toUpperCase() === upper) {\n return f;\n }\n }\n }\n return undefined;\n }\n getObject(type, name) {\n if (type === undefined || name === undefined) {\n return undefined;\n }\n const searchName = name.toUpperCase();\n if (this.objects[searchName]) {\n return this.objects[searchName][type];\n }\n return undefined;\n }\n getConfig() {\n return this.conf;\n }\n // assumption: Config is immutable, and can only be changed via this method\n setConfig(conf) {\n for (const obj of this.getObjects()) {\n obj.setDirty();\n }\n this.conf = conf;\n return this;\n }\n inErrorNamespace(name) {\n const reg = new RegExp(this.getConfig().getSyntaxSetttings().errorNamespace, \"i\");\n return reg.test(name);\n }\n addFile(file) {\n return this.addFiles([file]);\n }\n updateFile(file) {\n const obj = this.find(file.getObjectName(), file.getObjectType());\n obj.updateFile(file);\n return this;\n }\n removeFile(file) {\n const obj = this.find(file.getObjectName(), file.getObjectType());\n obj.removeFile(file);\n if (obj.getFiles().length === 0) {\n this.references.clear(obj);\n this.removeObject(obj);\n }\n return this;\n }\n addFiles(files) {\n var _a;\n const globalExclude = ((_a = this.conf.getGlobal().exclude) !== null && _a !== void 0 ? _a : [])\n .map(pattern => new RegExp(pattern, \"i\"));\n for (const f of files) {\n const filename = f.getFilename();\n const isNotAbapgitFile = filename.split(\".\").length <= 2;\n if (isNotAbapgitFile || excludeHelper_1.ExcludeHelper.isExcluded(filename, globalExclude)) {\n continue;\n }\n const found = this.findOrCreate(f.getObjectName(), f.getObjectType());\n found.addFile(f);\n }\n return this;\n }\n addDependencies(files) {\n for (const f of files) {\n this.dependencies[f.getFilename().toUpperCase()] = true;\n }\n return this.addFiles(files);\n }\n addDependency(file) {\n this.dependencies[file.getFilename().toUpperCase()] = true;\n this.addFile(file);\n return this;\n }\n isDependency(obj) {\n const filename = obj.getFiles()[0].getFilename().toUpperCase();\n return this.dependencies[filename] === true;\n }\n isFileDependency(filename) {\n return this.dependencies[filename.toUpperCase()] === true;\n }\n // assumption: the file is already in the registry\n findObjectForFile(file) {\n const filename = file.getFilename();\n for (const obj of this.getObjects()) {\n for (const ofile of obj.getFiles()) {\n if (ofile.getFilename() === filename) {\n return obj;\n }\n }\n }\n return undefined;\n }\n // todo, this will be changed to async sometime\n findIssues(input) {\n if (this.isDirty() === true) {\n this.parse();\n }\n return this.runRules(input);\n }\n // todo, this will be changed to async sometime\n findIssuesObject(iobj) {\n if (this.isDirty() === true) {\n this.parse();\n }\n return this.runRules(undefined, iobj);\n }\n // todo, this will be changed to async sometime\n parse() {\n if (this.isDirty() === false) {\n return this;\n }\n ParsingPerformance.clear();\n this.issues = [];\n for (const o of this.getObjects()) {\n this.parsePrivate(o);\n this.issues.push(...o.getParsingIssues());\n }\n new find_global_definitions_1.FindGlobalDefinitions(this).run();\n return this;\n }\n async parseAsync(input) {\n var _a, _b;\n if (this.isDirty() === false) {\n return this;\n }\n ParsingPerformance.clear();\n (_a = input === null || input === void 0 ? void 0 : input.progress) === null || _a === void 0 ? void 0 : _a.set(this.getObjectCount(false), \"Lexing and parsing\");\n this.issues = [];\n for (const o of this.getObjects()) {\n await ((_b = input === null || input === void 0 ? void 0 : input.progress) === null || _b === void 0 ? void 0 : _b.tick(\"Lexing and parsing(\" + this.conf.getVersion() + \") - \" + o.getType() + \" \" + o.getName()));\n this.parsePrivate(o);\n this.issues.push(...o.getParsingIssues());\n }\n if ((input === null || input === void 0 ? void 0 : input.outputPerformance) === true) {\n ParsingPerformance.output();\n }\n new find_global_definitions_1.FindGlobalDefinitions(this).run(input === null || input === void 0 ? void 0 : input.progress);\n return this;\n }\n //////////////////////////////////////////\n // todo, refactor, this is a mess, see where-used, a lot of the code should be in this method instead\n parsePrivate(input) {\n const config = this.getConfig();\n const result = input.parse(config.getVersion(), config.getSyntaxSetttings().globalMacros);\n ParsingPerformance.push(input, result);\n }\n isDirty() {\n for (const o of this.getObjects()) {\n const dirty = o.isDirty();\n if (dirty === true) {\n return true;\n }\n }\n return false;\n }\n runRules(input, iobj) {\n var _a, _b, _c, _d, _e, _f;\n const rulePerformance = {};\n const issues = this.issues.slice(0);\n const objects = iobj ? [iobj] : this.getObjects();\n const rules = this.conf.getEnabledRules();\n const skipLogic = new skip_logic_1.SkipLogic(this);\n (_a = input === null || input === void 0 ? void 0 : input.progress) === null || _a === void 0 ? void 0 : _a.set(iobj ? 1 : this.getObjectCount(false), \"Run Syntax\");\n const check = [];\n for (const obj of objects) {\n (_b = input === null || input === void 0 ? void 0 : input.progress) === null || _b === void 0 ? void 0 : _b.tick(\"Run Syntax - \" + obj.getName());\n if (skipLogic.skip(obj) || this.isDependency(obj)) {\n continue;\n }\n if (obj instanceof _abap_object_1.ABAPObject) {\n new syntax_1.SyntaxLogic(this, obj).run();\n }\n check.push(obj);\n }\n (_c = input === null || input === void 0 ? void 0 : input.progress) === null || _c === void 0 ? void 0 : _c.set(rules.length, \"Initialize Rules\");\n for (const rule of rules) {\n (_d = input === null || input === void 0 ? void 0 : input.progress) === null || _d === void 0 ? void 0 : _d.tick(\"Initialize Rules - \" + rule.getMetadata().key);\n if (rule.initialize === undefined) {\n throw new Error(rule.getMetadata().key + \" missing initialize method\");\n }\n rule.initialize(this);\n rulePerformance[rule.getMetadata().key] = 0;\n }\n (_e = input === null || input === void 0 ? void 0 : input.progress) === null || _e === void 0 ? void 0 : _e.set(check.length, \"Finding Issues\");\n for (const obj of check) {\n (_f = input === null || input === void 0 ? void 0 : input.progress) === null || _f === void 0 ? void 0 : _f.tick(\"Finding Issues - \" + obj.getType() + \" \" + obj.getName());\n for (const rule of rules) {\n const before = Date.now();\n issues.push(...rule.run(obj));\n const runtime = Date.now() - before;\n rulePerformance[rule.getMetadata().key] = rulePerformance[rule.getMetadata().key] + runtime;\n }\n }\n if ((input === null || input === void 0 ? void 0 : input.outputPerformance) === true) {\n const perf = [];\n for (const p in rulePerformance) {\n if (rulePerformance[p] > 100) { // ignore rules if it takes less than 100ms\n perf.push({ name: p, time: rulePerformance[p] });\n }\n }\n perf.sort((a, b) => { return b.time - a.time; });\n for (const p of perf) {\n process.stderr.write(\"\\t\" + p.time + \"ms\\t\" + p.name + \"\\n\");\n }\n }\n return this.excludeIssues(issues);\n }\n excludeIssues(issues) {\n var _a;\n const ret = issues;\n // exclude issues, as now we know both the filename and issue key\n for (const rule of artifacts_rules_1.ArtifactsRules.getRules()) {\n const key = rule.getMetadata().key;\n const ruleExclude = ((_a = this.conf.readByKey(key, \"exclude\")) !== null && _a !== void 0 ? _a : []);\n const ruleExcludePatterns = ruleExclude.map(x => new RegExp(x, \"i\"));\n for (let i = ret.length - 1; i >= 0; i--) {\n if (ret[i].getKey() !== key) {\n continue;\n }\n const filename = ret[i].getFilename();\n if (excludeHelper_1.ExcludeHelper.isExcluded(filename, ruleExcludePatterns)) {\n ret.splice(i, 1);\n }\n }\n }\n return ret;\n }\n findOrCreate(name, type) {\n try {\n return this.find(name, type);\n }\n catch (_a) {\n const newName = name.toUpperCase();\n const newType = type ? type : \"UNKNOWN\";\n const add = artifacts_objects_1.ArtifactsObjects.newObject(newName, newType);\n if (this.objects[newName] === undefined) {\n this.objects[newName] = {};\n }\n this.objects[newName][newType] = add;\n if (this.objectsByType[newType] === undefined) {\n this.objectsByType[newType] = {};\n }\n this.objectsByType[newType][newName] = add;\n return add;\n }\n }\n removeObject(remove) {\n if (remove === undefined) {\n return;\n }\n if (this.objects[remove.getName()][remove.getType()] === undefined) {\n throw new Error(\"removeObject: object not found\");\n }\n if (Object.keys(this.objects[remove.getName()]).length === 1) {\n delete this.objects[remove.getName()];\n }\n else {\n delete this.objects[remove.getName()][remove.getType()];\n }\n if (Object.keys(this.objectsByType[remove.getType()]).length === 1) {\n delete this.objectsByType[remove.getType()];\n }\n else {\n delete this.objectsByType[remove.getType()][remove.getName()];\n }\n }\n find(name, type) {\n const searchType = type ? type : \"UNKNOWN\";\n const searchName = name.toUpperCase();\n if (this.objects[searchName] !== undefined\n && this.objects[searchName][searchType]) {\n return this.objects[searchName][searchType];\n }\n throw new Error(\"find: object not found, \" + type + \" \" + name);\n }\n}\nexports.Registry = Registry;\n//# sourceMappingURL=registry.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/registry.js?");
10437
10459
 
10438
10460
  /***/ }),
10439
10461
 
@@ -10741,7 +10763,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
10741
10763
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10742
10764
 
10743
10765
  "use strict";
10744
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.ConstantClasses = exports.ConstantClassesConf = void 0;\r\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\r\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\r\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\r\nconst __1 = __webpack_require__(/*! .. */ \"./node_modules/@abaplint/core/build/src/index.js\");\r\n/** Checks that constants classes are in sync with domain fixed values */\r\nclass ConstantClassesConf extends _basic_rule_config_1.BasicRuleConfig {\r\n}\r\nexports.ConstantClassesConf = ConstantClassesConf;\r\nclass ConstantClasses {\r\n constructor() {\r\n this.conf = new ConstantClassesConf();\r\n }\r\n getMetadata() {\r\n return {\r\n key: \"constant_classes\",\r\n title: \"Validate constant classes\",\r\n shortDescription: `Checks that a class contains exactly the constants corresponding to a domain's fixed values.`,\r\n extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-enumeration-classes-to-constants-interfaces`,\r\n tags: [_irule_1.RuleTag.Syntax, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Experimental],\r\n };\r\n }\r\n initialize(reg) {\r\n this.reg = reg;\r\n return this;\r\n }\r\n getConfig() {\r\n return this.conf;\r\n }\r\n setConfig(conf) {\r\n this.conf = conf;\r\n }\r\n run(obj) {\r\n if (this.conf\r\n && this.conf.mapping\r\n && obj instanceof __1.Objects.Domain) {\r\n const configEntry = this.conf.mapping.find(x => x.domain.toUpperCase() === obj.getName().toUpperCase());\r\n if (!configEntry) {\r\n return [];\r\n }\r\n const classWithConstants = this.reg.getObject(\"CLAS\", configEntry === null || configEntry === void 0 ? void 0 : configEntry.class.toUpperCase());\r\n if (!classWithConstants) {\r\n return [issue_1.Issue.atIdentifier(obj.getIdentifier(), `Constant class pattern implementation ${configEntry.class} missing for domain ${configEntry.domain}`, this.getMetadata().key, this.conf.severity)];\r\n // quickfix will implement the whole class\r\n }\r\n const classContents = classWithConstants.getMainABAPFile();\r\n if (classContents === undefined) {\r\n return [];\r\n }\r\n const def = classWithConstants.getClassDefinition();\r\n if (!def) {\r\n // this issue is checked by rule implement_methods.\r\n // we will not issue errors that all constants are missing until there is a class implementation\r\n return [];\r\n }\r\n const domainValueInfo = obj.getFixedValues();\r\n const domainValues = domainValueInfo.map(x => x.value);\r\n const issues = [];\r\n if (obj.getFixedValues().length === 0) {\r\n // possibly this is not even a domain with fixed values\r\n issues.push(issue_1.Issue.atStatement(classContents, classContents.getStatements()[0], `Domain ${configEntry.domain} does not contain any fixed values. Either add some values or disable this check`, this.getMetadata().key, this.conf.severity));\r\n }\r\n // later we will raise an issue if we did not find it\r\n let domainNameConstantFound = false;\r\n for (const constant of def.constants) {\r\n if (configEntry.constantForDomainName\r\n && constant.name === configEntry.constantForDomainName) {\r\n // we require the constant value to be uppercase just in case\r\n // in the config it does not matter\r\n if (constant.value !== configEntry.domain.toLocaleUpperCase()) {\r\n issues.push(this.issueAtConstant(constant, `Constant value ${constant.value} must match domain name ${configEntry.domain} `));\r\n }\r\n domainNameConstantFound = true;\r\n continue;\r\n }\r\n if (configEntry.useExactType && constant.typeName.toLowerCase() !== configEntry.domain.toLowerCase()) {\r\n issues.push(this.issueAtConstant(constant, `Use exact type ${configEntry.domain} instead of ${constant.typeName}`));\r\n // quickfix will change the type\r\n }\r\n if (constant.visibility !== __1.Visibility.Public) {\r\n issues.push(this.issueAtConstant(constant, `Constant ${constant.name} should be public`));\r\n // quickfix will move constant\r\n }\r\n if (!domainValues.includes(constant.value)) {\r\n issues.push(this.issueAtConstant(constant, `Extra constant ${constant.name} found which is not present in domain ${configEntry.domain}`));\r\n // quickfix will remove constant\r\n }\r\n }\r\n for (const d of domainValueInfo) {\r\n if (!def.constants.find(c => c.value === d.value)) {\r\n issues.push(issue_1.Issue.atStatement(classContents, classContents.getStatements()[0], `Missing constant for ${d.value} (domain ${configEntry.domain})`, this.getMetadata().key, this.conf.severity));\r\n // quickfix will add constant\r\n }\r\n }\r\n if (configEntry.constantForDomainName && !domainNameConstantFound) {\r\n issues.push(issue_1.Issue.atStatement(classContents, classContents.getStatements()[0], `Missing constant ${configEntry.constantForDomainName} for name of domain ${configEntry.domain}`, this.getMetadata().key, this.conf.severity));\r\n }\r\n return issues;\r\n }\r\n return [];\r\n }\r\n issueAtConstant(constant, message) {\r\n return issue_1.Issue.atIdentifier(constant.identifier, message, this.getMetadata().key, this.conf.severity);\r\n }\r\n}\r\nexports.ConstantClasses = ConstantClasses;\r\n//# sourceMappingURL=constant_classes.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/rules/constant_classes.js?");
10766
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.ConstantClasses = exports.ConstantClassesConf = void 0;\r\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\r\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\r\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\r\nconst __1 = __webpack_require__(/*! .. */ \"./node_modules/@abaplint/core/build/src/index.js\");\r\n/** Checks that constants classes are in sync with domain fixed values */\r\nclass ConstantClassesConf extends _basic_rule_config_1.BasicRuleConfig {\r\n constructor() {\r\n super(...arguments);\r\n /** Specify a list of domain-class pairs which will be validated */\r\n this.mapping = [];\r\n }\r\n}\r\nexports.ConstantClassesConf = ConstantClassesConf;\r\nclass ConstantClasses {\r\n constructor() {\r\n this.conf = new ConstantClassesConf();\r\n }\r\n getMetadata() {\r\n return {\r\n key: \"constant_classes\",\r\n title: \"Validate constant classes\",\r\n shortDescription: `Checks that a class contains exactly the constants corresponding to a domain's fixed values.`,\r\n extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-enumeration-classes-to-constants-interfaces`,\r\n tags: [_irule_1.RuleTag.Syntax, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Experimental],\r\n };\r\n }\r\n initialize(reg) {\r\n this.reg = reg;\r\n return this;\r\n }\r\n getConfig() {\r\n return this.conf;\r\n }\r\n setConfig(conf) {\r\n this.conf = conf;\r\n }\r\n run(obj) {\r\n if (this.conf\r\n && this.conf.mapping\r\n && obj instanceof __1.Objects.Domain) {\r\n const configEntry = this.conf.mapping.find(x => x.domain.toUpperCase() === obj.getName().toUpperCase());\r\n if (!configEntry) {\r\n return [];\r\n }\r\n const classWithConstants = this.reg.getObject(\"CLAS\", configEntry === null || configEntry === void 0 ? void 0 : configEntry.class.toUpperCase());\r\n if (!classWithConstants) {\r\n return [issue_1.Issue.atIdentifier(obj.getIdentifier(), `Constant class pattern implementation ${configEntry.class} missing for domain ${configEntry.domain}`, this.getMetadata().key, this.conf.severity)];\r\n // quickfix will implement the whole class\r\n }\r\n const classContents = classWithConstants.getMainABAPFile();\r\n if (classContents === undefined) {\r\n return [];\r\n }\r\n const def = classWithConstants.getClassDefinition();\r\n if (!def) {\r\n // this issue is checked by rule implement_methods.\r\n // we will not issue errors that all constants are missing until there is a class implementation\r\n return [];\r\n }\r\n const domainValueInfo = obj.getFixedValues();\r\n const domainValues = domainValueInfo.map(x => x.value);\r\n const issues = [];\r\n if (obj.getFixedValues().length === 0) {\r\n // possibly this is not even a domain with fixed values\r\n issues.push(issue_1.Issue.atStatement(classContents, classContents.getStatements()[0], `Domain ${configEntry.domain} does not contain any fixed values. Either add some values or disable this check`, this.getMetadata().key, this.conf.severity));\r\n }\r\n // later we will raise an issue if we did not find it\r\n let domainNameConstantFound = false;\r\n for (const constant of def.constants) {\r\n if (configEntry.constantForDomainName\r\n && constant.name === configEntry.constantForDomainName) {\r\n // we require the constant value to be uppercase just in case\r\n // in the config it does not matter\r\n if (constant.value !== configEntry.domain.toLocaleUpperCase()) {\r\n issues.push(this.issueAtConstant(constant, `Constant value ${constant.value} must match domain name ${configEntry.domain} `));\r\n }\r\n domainNameConstantFound = true;\r\n continue;\r\n }\r\n if (configEntry.useExactType && constant.typeName.toLowerCase() !== configEntry.domain.toLowerCase()) {\r\n issues.push(this.issueAtConstant(constant, `Use exact type ${configEntry.domain} instead of ${constant.typeName}`));\r\n // quickfix will change the type\r\n }\r\n if (constant.visibility !== __1.Visibility.Public) {\r\n issues.push(this.issueAtConstant(constant, `Constant ${constant.name} should be public`));\r\n // quickfix will move constant\r\n }\r\n if (!domainValues.includes(constant.value)) {\r\n issues.push(this.issueAtConstant(constant, `Extra constant ${constant.name} found which is not present in domain ${configEntry.domain}`));\r\n // quickfix will remove constant\r\n }\r\n }\r\n for (const d of domainValueInfo) {\r\n if (!def.constants.find(c => c.value === d.value)) {\r\n issues.push(issue_1.Issue.atStatement(classContents, classContents.getStatements()[0], `Missing constant for ${d.value} (domain ${configEntry.domain})`, this.getMetadata().key, this.conf.severity));\r\n // quickfix will add constant\r\n }\r\n }\r\n if (configEntry.constantForDomainName && !domainNameConstantFound) {\r\n issues.push(issue_1.Issue.atStatement(classContents, classContents.getStatements()[0], `Missing constant ${configEntry.constantForDomainName} for name of domain ${configEntry.domain}`, this.getMetadata().key, this.conf.severity));\r\n }\r\n return issues;\r\n }\r\n return [];\r\n }\r\n issueAtConstant(constant, message) {\r\n return issue_1.Issue.atIdentifier(constant.identifier, message, this.getMetadata().key, this.conf.severity);\r\n }\r\n}\r\nexports.ConstantClasses = ConstantClasses;\r\n//# sourceMappingURL=constant_classes.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/rules/constant_classes.js?");
10745
10767
 
10746
10768
  /***/ }),
10747
10769
 
@@ -10895,7 +10917,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
10895
10917
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10896
10918
 
10897
10919
  "use strict";
10898
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.ExitOrCheck = exports.ExitOrCheckConf = void 0;\r\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\r\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ \"./node_modules/@abaplint/core/build/src/rules/_abap_rule.js\");\r\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\r\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\r\nconst edit_helper_1 = __webpack_require__(/*! ../edit_helper */ \"./node_modules/@abaplint/core/build/src/edit_helper.js\");\r\nclass ExitOrCheckConf extends _basic_rule_config_1.BasicRuleConfig {\r\n constructor() {\r\n super(...arguments);\r\n this.allowExit = false;\r\n this.allowCheck = false;\r\n }\r\n}\r\nexports.ExitOrCheckConf = ExitOrCheckConf;\r\nclass ExitOrCheck extends _abap_rule_1.ABAPRule {\r\n constructor() {\r\n super(...arguments);\r\n this.conf = new ExitOrCheckConf();\r\n }\r\n getMetadata() {\r\n return {\r\n key: \"exit_or_check\",\r\n title: \"Find EXIT or CHECK outside loops\",\r\n shortDescription: `Detects usages of EXIT or CHECK statements outside of loops.\nUse RETURN to leave procesing blocks instead.`,\r\n extendedInformation: `\nhttps://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenleave_processing_blocks.htm\nhttps://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapcheck_processing_blocks.htm\nhttps://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#check-vs-return\n`,\r\n tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],\r\n };\r\n }\r\n getConfig() {\r\n return this.conf;\r\n }\r\n setConfig(conf) {\r\n this.conf = conf;\r\n }\r\n runParsed(file) {\r\n const issues = [];\r\n const stack = [];\r\n for (const statement of file.getStatements()) {\r\n if (statement.get() instanceof Statements.Loop\r\n || statement.get() instanceof Statements.While\r\n || statement.get() instanceof Statements.SelectLoop\r\n || statement.get() instanceof Statements.Do) {\r\n stack.push(statement);\r\n }\r\n else if (statement.get() instanceof Statements.EndLoop\r\n || statement.get() instanceof Statements.EndWhile\r\n || statement.get() instanceof Statements.EndSelect\r\n || statement.get() instanceof Statements.EndDo) {\r\n stack.pop();\r\n }\r\n else if (this.conf.allowCheck === false && statement.get() instanceof Statements.Check && stack.length === 0) {\r\n const message = \"CHECK is not allowed outside of loops\";\r\n let tokensString = statement.concatTokens();\r\n tokensString = tokensString.slice(statement.getFirstToken().getEnd().getCol());\r\n const replacement = \"IF NOT \" + tokensString + \"\\n RETURN.\\nENDIF.\";\r\n const fix = edit_helper_1.EditHelper.replaceRange(file, statement.getFirstToken().getStart(), statement.getLastToken().getEnd(), replacement);\r\n const issue = issue_1.Issue.atStatement(file, statement, message, this.getMetadata().key, this.conf.severity, fix);\r\n issues.push(issue);\r\n }\r\n else if (this.conf.allowExit === false && statement.get() instanceof Statements.Exit && stack.length === 0) {\r\n const message = \"EXIT is not allowed outside of loops\";\r\n const fix = edit_helper_1.EditHelper.replaceToken(file, statement.getFirstToken(), \"RETURN\");\r\n const issue = issue_1.Issue.atStatement(file, statement, message, this.getMetadata().key, this.conf.severity, fix);\r\n issues.push(issue);\r\n }\r\n }\r\n return issues;\r\n }\r\n}\r\nexports.ExitOrCheck = ExitOrCheck;\r\n//# sourceMappingURL=exit_or_check.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/rules/exit_or_check.js?");
10920
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.ExitOrCheck = exports.ExitOrCheckConf = void 0;\r\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\r\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ \"./node_modules/@abaplint/core/build/src/rules/_abap_rule.js\");\r\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\r\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\r\nconst edit_helper_1 = __webpack_require__(/*! ../edit_helper */ \"./node_modules/@abaplint/core/build/src/edit_helper.js\");\r\nclass ExitOrCheckConf extends _basic_rule_config_1.BasicRuleConfig {\r\n constructor() {\r\n super(...arguments);\r\n this.allowExit = false;\r\n this.allowCheck = false;\r\n }\r\n}\r\nexports.ExitOrCheckConf = ExitOrCheckConf;\r\nclass ExitOrCheck extends _abap_rule_1.ABAPRule {\r\n constructor() {\r\n super(...arguments);\r\n this.conf = new ExitOrCheckConf();\r\n }\r\n getMetadata() {\r\n return {\r\n key: \"exit_or_check\",\r\n title: \"Find EXIT or CHECK outside loops\",\r\n shortDescription: `Detects usages of EXIT or CHECK statements outside of loops.\nUse RETURN to leave procesing blocks instead.`,\r\n extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenleave_processing_blocks.htm\nhttps://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapcheck_processing_blocks.htm\nhttps://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#check-vs-return`,\r\n tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],\r\n };\r\n }\r\n getConfig() {\r\n return this.conf;\r\n }\r\n setConfig(conf) {\r\n this.conf = conf;\r\n }\r\n runParsed(file) {\r\n const issues = [];\r\n const stack = [];\r\n for (const statement of file.getStatements()) {\r\n const get = statement.get();\r\n if (get instanceof Statements.Loop\r\n || get instanceof Statements.While\r\n || get instanceof Statements.SelectLoop\r\n || get instanceof Statements.Do) {\r\n stack.push(statement);\r\n }\r\n else if (get instanceof Statements.EndLoop\r\n || get instanceof Statements.EndWhile\r\n || get instanceof Statements.EndSelect\r\n || get instanceof Statements.EndDo) {\r\n stack.pop();\r\n }\r\n else if (this.conf.allowCheck === false && get instanceof Statements.Check && stack.length === 0) {\r\n const message = \"CHECK is not allowed outside of loops\";\r\n let tokensString = statement.concatTokens();\r\n tokensString = tokensString.slice(statement.getFirstToken().getEnd().getCol());\r\n const replacement = \"IF NOT \" + tokensString + \"\\n RETURN.\\nENDIF.\";\r\n const fix = edit_helper_1.EditHelper.replaceRange(file, statement.getFirstToken().getStart(), statement.getLastToken().getEnd(), replacement);\r\n const issue = issue_1.Issue.atStatement(file, statement, message, this.getMetadata().key, this.conf.severity, fix);\r\n issues.push(issue);\r\n }\r\n else if (this.conf.allowExit === false && get instanceof Statements.Exit && stack.length === 0) {\r\n const message = \"EXIT is not allowed outside of loops\";\r\n const fix = edit_helper_1.EditHelper.replaceToken(file, statement.getFirstToken(), \"RETURN\");\r\n const issue = issue_1.Issue.atStatement(file, statement, message, this.getMetadata().key, this.conf.severity, fix);\r\n issues.push(issue);\r\n }\r\n }\r\n return issues;\r\n }\r\n}\r\nexports.ExitOrCheck = ExitOrCheck;\r\n//# sourceMappingURL=exit_or_check.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/rules/exit_or_check.js?");
10899
10921
 
10900
10922
  /***/ }),
10901
10923
 
@@ -11874,7 +11896,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
11874
11896
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
11875
11897
 
11876
11898
  "use strict";
11877
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.UnusedVariables = exports.UnusedVariablesConf = void 0;\r\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\r\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\r\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\r\nconst syntax_1 = __webpack_require__(/*! ../abap/5_syntax/syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\r\nconst _abap_object_1 = __webpack_require__(/*! ../objects/_abap_object */ \"./node_modules/@abaplint/core/build/src/objects/_abap_object.js\");\r\nconst _scope_type_1 = __webpack_require__(/*! ../abap/5_syntax/_scope_type */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js\");\r\nconst objects_1 = __webpack_require__(/*! ../objects */ \"./node_modules/@abaplint/core/build/src/objects/index.js\");\r\nconst references_1 = __webpack_require__(/*! ../lsp/references */ \"./node_modules/@abaplint/core/build/src/lsp/references.js\");\r\nconst edit_helper_1 = __webpack_require__(/*! ../edit_helper */ \"./node_modules/@abaplint/core/build/src/edit_helper.js\");\r\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst _statement_1 = __webpack_require__(/*! ../abap/2_statements/statements/_statement */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js\");\r\nclass UnusedVariablesConf extends _basic_rule_config_1.BasicRuleConfig {\r\n constructor() {\r\n super(...arguments);\r\n /** skip specific names, case insensitive\r\n * @uniqueItems true\r\n */\r\n this.skipNames = [];\r\n }\r\n}\r\nexports.UnusedVariablesConf = UnusedVariablesConf;\r\nclass UnusedVariables {\r\n constructor() {\r\n this.conf = new UnusedVariablesConf();\r\n }\r\n getMetadata() {\r\n return {\r\n key: \"unused_variables\",\r\n title: \"Unused variables\",\r\n shortDescription: `Checks for unused variables and constants`,\r\n extendedInformation: `WARNING: slow\n\n Experimental, might give false positives. Skips event parameters.\n\n Note that this currently does not work if the source code uses macros.\n\n Unused variables are not reported if the object contains syntax errors.`,\r\n tags: [_irule_1.RuleTag.Quickfix],\r\n pragma: \"##NEEDED\",\r\n pseudoComment: \"EC NEEDED\",\r\n };\r\n }\r\n getConfig() {\r\n return this.conf;\r\n }\r\n setConfig(conf) {\r\n this.conf = conf;\r\n if (this.conf.skipNames === undefined) {\r\n this.conf.skipNames = [];\r\n }\r\n }\r\n initialize(reg) {\r\n this.reg = reg;\r\n return this;\r\n }\r\n run(obj) {\r\n if (!(obj instanceof _abap_object_1.ABAPObject)) {\r\n return [];\r\n }\r\n else if (obj instanceof objects_1.Interface) { // todo, how to handle interfaces?\r\n return [];\r\n }\r\n // dont report unused variables when there are syntax errors\r\n const syntax = new syntax_1.SyntaxLogic(this.reg, obj).run();\r\n if (syntax.issues.length > 0) {\r\n return [];\r\n }\r\n const results = this.traverse(syntax.spaghetti.getTop(), obj);\r\n // remove duplicates, quick and dirty\r\n const deduplicated = [];\r\n for (const result of results) {\r\n let cont = false;\r\n for (const d of deduplicated) {\r\n if (result.getStart().equals(d.getStart())) {\r\n cont = true;\r\n break;\r\n }\r\n }\r\n if (cont === true) {\r\n continue;\r\n }\r\n deduplicated.push(result);\r\n }\r\n return deduplicated;\r\n }\r\n traverse(node, obj) {\r\n const ret = [];\r\n if (node.getIdentifier().stype === _scope_type_1.ScopeType.OpenSQL) {\r\n return [];\r\n }\r\n if (node.getIdentifier().stype !== _scope_type_1.ScopeType.BuiltIn) {\r\n ret.push(...this.checkNode(node, obj));\r\n }\r\n for (const c of node.getChildren()) {\r\n ret.push(...this.traverse(c, obj));\r\n }\r\n return ret;\r\n }\r\n checkNode(node, obj) {\r\n var _a;\r\n const ret = [];\r\n const vars = node.getData().vars;\r\n for (const name in vars) {\r\n if (((_a = this.conf.skipNames) === null || _a === void 0 ? void 0 : _a.length) > 0\r\n && this.conf.skipNames.some((a) => a.toUpperCase() === name)) {\r\n continue;\r\n }\r\n if (name === \"ME\"\r\n || name === \"SUPER\"\r\n || vars[name].getMeta().includes(\"event_parameter\" /* EventParameter */)) {\r\n // todo, workaround for \"me\" and \"super\", these should somehow be typed to built-in\r\n continue;\r\n }\r\n else if ((obj.containsFile(vars[name].getFilename())\r\n || node.getIdentifier().stype === _scope_type_1.ScopeType.Program\r\n || node.getIdentifier().stype === _scope_type_1.ScopeType.Form)\r\n && this.isUsed(vars[name], node) === false) {\r\n const message = \"Variable \\\"\" + name.toLowerCase() + \"\\\" not used\";\r\n const statement = this.findStatement(vars[name]);\r\n if (statement === null || statement === void 0 ? void 0 : statement.getPragmas().map(t => t.getStr()).includes(this.getMetadata().pragma + \"\")) {\r\n continue;\r\n }\r\n else if (this.suppressedbyPseudo(statement, vars[name], obj)) {\r\n continue;\r\n }\r\n const fix = this.buildFix(vars[name], obj);\r\n ret.push(issue_1.Issue.atIdentifier(vars[name], message, this.getMetadata().key, this.conf.severity, fix));\r\n }\r\n }\r\n return ret;\r\n }\r\n suppressedbyPseudo(statement, v, obj) {\r\n if (statement === undefined) {\r\n return false;\r\n }\r\n const file = obj.getABAPFileByName(v.getFilename());\r\n if (file === undefined) {\r\n return false;\r\n }\r\n let next = false;\r\n for (const s of file.getStatements()) {\r\n if (next === true && s.get() instanceof _statement_1.Comment) {\r\n return s.concatTokens().includes(this.getMetadata().pseudoComment + \"\");\r\n }\r\n if (s === statement) {\r\n next = true;\r\n }\r\n }\r\n return false;\r\n }\r\n isUsed(id, node) {\r\n const isInline = id.getMeta().includes(\"inline\" /* InlineDefinition */);\r\n const found = new references_1.References(this.reg).search(id, node, true, isInline === false);\r\n if (isInline === true) {\r\n return found.length > 2; // inline definitions are always written to\r\n }\r\n else {\r\n return found.length > 1;\r\n }\r\n }\r\n findStatement(v) {\r\n const file = this.reg.getFileByName(v.getFilename());\r\n if (file === undefined) {\r\n return undefined;\r\n }\r\n const object = this.reg.findObjectForFile(file);\r\n if (!(object instanceof _abap_object_1.ABAPObject)) {\r\n return undefined;\r\n }\r\n const abapfile = object.getABAPFileByName(v.getFilename());\r\n if (abapfile === undefined) {\r\n return undefined;\r\n }\r\n const statement = edit_helper_1.EditHelper.findStatement(v.getToken(), abapfile);\r\n return statement;\r\n }\r\n buildFix(v, obj) {\r\n const file = obj.getABAPFileByName(v.getFilename());\r\n if (file === undefined) {\r\n return undefined;\r\n }\r\n const statement = edit_helper_1.EditHelper.findStatement(v.getToken(), file);\r\n if (statement === undefined) {\r\n return undefined;\r\n }\r\n else if (statement.get() instanceof Statements.FunctionModule) {\r\n return undefined; // function module parameters are not part of the code\r\n }\r\n else {\r\n return edit_helper_1.EditHelper.deleteStatement(file, statement);\r\n }\r\n }\r\n}\r\nexports.UnusedVariables = UnusedVariables;\r\n//# sourceMappingURL=unused_variables.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/rules/unused_variables.js?");
11899
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.UnusedVariables = exports.UnusedVariablesConf = void 0;\r\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\r\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\r\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\r\nconst syntax_1 = __webpack_require__(/*! ../abap/5_syntax/syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\r\nconst _abap_object_1 = __webpack_require__(/*! ../objects/_abap_object */ \"./node_modules/@abaplint/core/build/src/objects/_abap_object.js\");\r\nconst _scope_type_1 = __webpack_require__(/*! ../abap/5_syntax/_scope_type */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js\");\r\nconst objects_1 = __webpack_require__(/*! ../objects */ \"./node_modules/@abaplint/core/build/src/objects/index.js\");\r\nconst references_1 = __webpack_require__(/*! ../lsp/references */ \"./node_modules/@abaplint/core/build/src/lsp/references.js\");\r\nconst edit_helper_1 = __webpack_require__(/*! ../edit_helper */ \"./node_modules/@abaplint/core/build/src/edit_helper.js\");\r\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst _statement_1 = __webpack_require__(/*! ../abap/2_statements/statements/_statement */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js\");\r\nclass UnusedVariablesConf extends _basic_rule_config_1.BasicRuleConfig {\r\n constructor() {\r\n super(...arguments);\r\n /** skip specific names, case insensitive\r\n * @uniqueItems true\r\n */\r\n this.skipNames = [];\r\n }\r\n}\r\nexports.UnusedVariablesConf = UnusedVariablesConf;\r\nclass UnusedVariables {\r\n constructor() {\r\n this.conf = new UnusedVariablesConf();\r\n }\r\n getMetadata() {\r\n return {\r\n key: \"unused_variables\",\r\n title: \"Unused variables\",\r\n shortDescription: `Checks for unused variables and constants`,\r\n extendedInformation: `WARNING: slow\n\n Experimental, might give false positives. Skips event parameters.\n\n Note that this currently does not work if the source code uses macros.\n\n Unused variables are not reported if the object contains syntax errors.`,\r\n tags: [_irule_1.RuleTag.Quickfix],\r\n pragma: \"##NEEDED\",\r\n pseudoComment: \"EC NEEDED\",\r\n };\r\n }\r\n getConfig() {\r\n return this.conf;\r\n }\r\n setConfig(conf) {\r\n this.conf = conf;\r\n if (this.conf.skipNames === undefined) {\r\n this.conf.skipNames = [];\r\n }\r\n }\r\n initialize(reg) {\r\n this.reg = reg;\r\n return this;\r\n }\r\n run(obj) {\r\n if (!(obj instanceof _abap_object_1.ABAPObject)) {\r\n return [];\r\n }\r\n else if (obj instanceof objects_1.Interface) { // todo, how to handle interfaces?\r\n return [];\r\n }\r\n // dont report unused variables when there are syntax errors\r\n const syntax = new syntax_1.SyntaxLogic(this.reg, obj).run();\r\n if (syntax.issues.length > 0) {\r\n return [];\r\n }\r\n const results = this.traverse(syntax.spaghetti.getTop(), obj);\r\n // remove duplicates, quick and dirty\r\n const deduplicated = [];\r\n for (const result of results) {\r\n let cont = false;\r\n for (const d of deduplicated) {\r\n if (result.getStart().equals(d.getStart())) {\r\n cont = true;\r\n break;\r\n }\r\n }\r\n if (cont === true) {\r\n continue;\r\n }\r\n deduplicated.push(result);\r\n }\r\n return deduplicated;\r\n }\r\n traverse(node, obj) {\r\n const ret = [];\r\n if (node.getIdentifier().stype === _scope_type_1.ScopeType.OpenSQL) {\r\n return [];\r\n }\r\n if (node.getIdentifier().stype !== _scope_type_1.ScopeType.BuiltIn) {\r\n ret.push(...this.checkNode(node, obj));\r\n }\r\n for (const c of node.getChildren()) {\r\n ret.push(...this.traverse(c, obj));\r\n }\r\n return ret;\r\n }\r\n checkNode(node, obj) {\r\n var _a;\r\n const ret = [];\r\n const vars = node.getData().vars;\r\n for (const name in vars) {\r\n if (((_a = this.conf.skipNames) === null || _a === void 0 ? void 0 : _a.length) > 0\r\n && this.conf.skipNames.some((a) => a.toUpperCase() === name)) {\r\n continue;\r\n }\r\n if (name === \"ME\"\r\n || name === \"SUPER\"\r\n || vars[name].getMeta().includes(\"event_parameter\" /* EventParameter */)) {\r\n // todo, workaround for \"me\" and \"super\", these should somehow be typed to built-in\r\n continue;\r\n }\r\n else if ((obj.containsFile(vars[name].getFilename())\r\n || node.getIdentifier().stype === _scope_type_1.ScopeType.Program\r\n || node.getIdentifier().stype === _scope_type_1.ScopeType.Form)\r\n && this.isUsed(vars[name], node) === false) {\r\n const message = \"Variable \\\"\" + name.toLowerCase() + \"\\\" not used\";\r\n const statement = this.findStatement(vars[name]);\r\n if (statement === null || statement === void 0 ? void 0 : statement.getPragmas().map(t => t.getStr()).includes(this.getMetadata().pragma + \"\")) {\r\n continue;\r\n }\r\n else if (this.suppressedbyPseudo(statement, vars[name], obj)) {\r\n continue;\r\n }\r\n const fix = this.buildFix(vars[name], obj);\r\n ret.push(issue_1.Issue.atIdentifier(vars[name], message, this.getMetadata().key, this.conf.severity, fix));\r\n }\r\n }\r\n return ret;\r\n }\r\n suppressedbyPseudo(statement, v, obj) {\r\n if (statement === undefined) {\r\n return false;\r\n }\r\n const file = obj.getABAPFileByName(v.getFilename());\r\n if (file === undefined) {\r\n return false;\r\n }\r\n let next = false;\r\n for (const s of file.getStatements()) {\r\n if (next === true && s.get() instanceof _statement_1.Comment) {\r\n return s.concatTokens().includes(this.getMetadata().pseudoComment + \"\");\r\n }\r\n if (s === statement) {\r\n next = true;\r\n }\r\n }\r\n return false;\r\n }\r\n isUsed(id, node) {\r\n const isInline = id.getMeta().includes(\"inline\" /* InlineDefinition */);\r\n const found = new references_1.References(this.reg).search(id, node, true, isInline === false);\r\n if (isInline === true) {\r\n return found.length > 2; // inline definitions are always written to\r\n }\r\n else {\r\n return found.length > 1;\r\n }\r\n }\r\n findStatement(v) {\r\n const file = this.reg.getFileByName(v.getFilename());\r\n if (file === undefined) {\r\n return undefined;\r\n }\r\n const object = this.reg.findObjectForFile(file);\r\n if (!(object instanceof _abap_object_1.ABAPObject)) {\r\n return undefined;\r\n }\r\n const abapfile = object.getABAPFileByName(v.getFilename());\r\n if (abapfile === undefined) {\r\n return undefined;\r\n }\r\n const statement = edit_helper_1.EditHelper.findStatement(v.getToken(), abapfile);\r\n return statement;\r\n }\r\n buildFix(v, obj) {\r\n const file = obj.getABAPFileByName(v.getFilename());\r\n if (file === undefined) {\r\n return undefined;\r\n }\r\n const statement = edit_helper_1.EditHelper.findStatement(v.getToken(), file);\r\n if (statement === undefined) {\r\n return undefined;\r\n }\r\n else if (statement.get() instanceof Statements.Data) {\r\n return edit_helper_1.EditHelper.deleteStatement(file, statement);\r\n }\r\n return undefined;\r\n }\r\n}\r\nexports.UnusedVariables = UnusedVariables;\r\n//# sourceMappingURL=unused_variables.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/rules/unused_variables.js?");
11878
11900
 
11879
11901
  /***/ }),
11880
11902
 
@@ -12237,7 +12259,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
12237
12259
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
12238
12260
 
12239
12261
  "use strict";
12240
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.ConstantTranspiler = void 0;\r\nconst core_1 = __webpack_require__(/*! @abaplint/core */ \"./node_modules/@abaplint/core/build/src/index.js\");\r\nconst chunk_1 = __webpack_require__(/*! ../chunk */ \"./node_modules/@abaplint/transpiler/build/src/chunk.js\");\r\nclass ConstantTranspiler {\r\n constructor(addGet = false) {\r\n this.addGet = addGet;\r\n }\r\n transpile(node, traversal) {\r\n const int = node.findFirstExpression(core_1.Expressions.Integer);\r\n if (int) {\r\n const val = parseInt(int.concatTokens(), 10);\r\n let ret = \"constant_\" + (val < 0 ? \"minus_\" : \"\") + Math.abs(val);\r\n if (this.addGet === true) {\r\n ret += \".get()\";\r\n }\r\n return new chunk_1.Chunk().append(ret, node, traversal);\r\n }\r\n const str = node.findFirstExpression(core_1.Expressions.ConstantString);\r\n if (str) {\r\n const res = str.getFirstToken().getStr();\r\n if (res.startsWith(\"'\") && this.addGet === false) {\r\n const code = \"new abap.types.Character({length: \" + (res.length - 2) + \"}).set(\" + this.escape(res) + \")\";\r\n return new chunk_1.Chunk().append(code, node, traversal);\r\n }\r\n else {\r\n const code = this.escape(res);\r\n return new chunk_1.Chunk().append(code, node, traversal);\r\n }\r\n }\r\n return new chunk_1.Chunk(\"todo, Constant\");\r\n }\r\n escape(str) {\r\n str = str.replace(/\\\\/g, \"\\\\\\\\\");\r\n const reg = new RegExp(/(.+)''(.+)/g);\r\n while (reg.test(str)) {\r\n str = str.replace(reg, \"$1\\\\'$2\");\r\n }\r\n return str;\r\n }\r\n}\r\nexports.ConstantTranspiler = ConstantTranspiler;\r\n//# sourceMappingURL=constant.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/transpiler/build/src/expressions/constant.js?");
12262
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.ConstantTranspiler = void 0;\r\nconst core_1 = __webpack_require__(/*! @abaplint/core */ \"./node_modules/@abaplint/core/build/src/index.js\");\r\nconst chunk_1 = __webpack_require__(/*! ../chunk */ \"./node_modules/@abaplint/transpiler/build/src/chunk.js\");\r\nclass ConstantTranspiler {\r\n constructor(addGet = false) {\r\n this.addGet = addGet;\r\n }\r\n transpile(node, traversal) {\r\n const int = node.findFirstExpression(core_1.Expressions.Integer);\r\n if (int) {\r\n const val = parseInt(int.concatTokens(), 10);\r\n let ret = \"constant_\" + (val < 0 ? \"minus_\" : \"\") + Math.abs(val);\r\n if (this.addGet === true) {\r\n ret += \".get()\";\r\n }\r\n return new chunk_1.Chunk().append(ret, node, traversal);\r\n }\r\n let str = node.findFirstExpression(core_1.Expressions.ConstantString);\r\n if (str === undefined) {\r\n str = node.findFirstExpression(core_1.Expressions.TextElementString);\r\n }\r\n if (str) {\r\n const res = str.getFirstToken().getStr();\r\n if (res.startsWith(\"'\") && this.addGet === false) {\r\n const code = \"new abap.types.Character({length: \" + (res.length - 2) + \"}).set(\" + this.escape(res) + \")\";\r\n return new chunk_1.Chunk().append(code, node, traversal);\r\n }\r\n else {\r\n const code = this.escape(res);\r\n return new chunk_1.Chunk().append(code, node, traversal);\r\n }\r\n }\r\n return new chunk_1.Chunk(`todo, Constant`);\r\n }\r\n escape(str) {\r\n str = str.replace(/\\\\/g, \"\\\\\\\\\");\r\n const reg = new RegExp(/(.+)''(.+)/g);\r\n while (reg.test(str)) {\r\n str = str.replace(reg, \"$1\\\\'$2\");\r\n }\r\n return str;\r\n }\r\n}\r\nexports.ConstantTranspiler = ConstantTranspiler;\r\n//# sourceMappingURL=constant.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/transpiler/build/src/expressions/constant.js?");
12241
12263
 
12242
12264
  /***/ }),
12243
12265
 
@@ -14047,7 +14069,7 @@ eval("/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * License
14047
14069
  \***************************************/
14048
14070
  /***/ ((module) => {
14049
14071
 
14050
- eval("const hexRegex = /0x[a-zA-Z0-9]+/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+(e\\-?[0-9]+)?|[0-9]+(\\.[0-9]+(e\\-?[0-9]+)?)?)$/;\n// const octRegex = /0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\nconst consider = {\n hex : true,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n //skipLike: /regex/\n};\n\nfunction toNumber(str, options = {}){\n // const options = Object.assign({}, consider);\n // if(opt.leadingZeros === false){\n // options.leadingZeros = false;\n // }else if(opt.hex === false){\n // options.hex = false;\n // }\n\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n \n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n // } else if (options.parseOct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n }else{\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n if(match){\n const negative = match[1];\n const leadingZeros = match[2];\n const num = match[3]; //complete num\n const eNotation = match[4] || match[6];\n if(leadingZeros.length === 1 && num[0] === \".\") return Number(str);\n else if(!options.leadingZeros && leadingZeros.length > 0) return str;\n else return Number(trimmedStr);\n }else{ //non-numeric string\n return str;\n }\n }\n}\n\nmodule.exports = toNumber\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/strnum/strnum.js?");
14072
+ eval("const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\n// const octRegex = /0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\nconst consider = {\n hex : true,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n //skipLike: /regex/\n};\n\nfunction toNumber(str, options = {}){\n // const options = Object.assign({}, consider);\n // if(opt.leadingZeros === false){\n // options.leadingZeros = false;\n // }else if(opt.hex === false){\n // options.hex = false;\n // }\n\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n \n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n // } else if (options.parseOct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n }else{\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n if(match){\n const negative = match[1];\n const leadingZeros = match[2];\n const num = match[3]; //complete num\n const eNotation = match[4] || match[6];\n if(leadingZeros.length === 1 && num[0] === \".\") return Number(str);\n else if(!options.leadingZeros && leadingZeros.length > 0) return str;\n else return Number(trimmedStr);\n }else{ //non-numeric string\n return str;\n }\n }\n}\n\nmodule.exports = toNumber\n\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/strnum/strnum.js?");
14051
14073
 
14052
14074
  /***/ }),
14053
14075
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/transpiler-cli",
3
- "version": "1.6.33",
3
+ "version": "1.6.34",
4
4
  "description": "Transpiler - Command Line Interface",
5
5
  "bin": {
6
6
  "abap_transpile": "./abap_transpile"
@@ -22,13 +22,13 @@
22
22
  "author": "abaplint",
23
23
  "license": "MIT",
24
24
  "devDependencies": {
25
- "@abaplint/transpiler": "^1.6.33",
25
+ "@abaplint/transpiler": "^1.6.34",
26
26
  "@types/glob": "^7.1.4",
27
27
  "glob": "^7.2.0",
28
28
  "@types/progress": "^2.0.5",
29
- "@abaplint/core": "^2.79.8",
29
+ "@abaplint/core": "^2.79.15",
30
30
  "progress": "^2.0.3",
31
- "webpack": "^5.55.0",
31
+ "webpack": "^5.57.1",
32
32
  "webpack-cli": "^4.8.0",
33
33
  "typescript": "^4.4.3"
34
34
  }