@abaplint/cli 2.97.3 → 2.97.5

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/cli.js +8 -19
  2. package/package.json +2 -2
package/build/cli.js CHANGED
@@ -2975,7 +2975,7 @@ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexpo
2975
2975
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2976
2976
 
2977
2977
  "use strict";
2978
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.CallFunction = void 0;\nconst combi_1 = __webpack_require__(/*! ../combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\nconst expressions_1 = __webpack_require__(/*! ../expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\nconst version_1 = __webpack_require__(/*! ../../../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\nclass CallFunction {\n getMatcher() {\n const starting = (0, combi_1.seq)(\"STARTING NEW TASK\", expressions_1.SimpleSource2);\n const update = (0, combi_1.str)(\"IN UPDATE TASK\");\n const unit = (0, combi_1.seq)(\"UNIT\", expressions_1.Source);\n const background = (0, combi_1.verNot)(version_1.Version.Cloud, (0, combi_1.seq)(\"IN BACKGROUND\", (0, combi_1.altPrio)(\"TASK\", unit)));\n const calling = (0, combi_1.seq)(\"CALLING\", expressions_1.MethodName, \"ON END OF TASK\");\n const performing = (0, combi_1.seq)(\"PERFORMING\", expressions_1.FormName, \"ON END OF TASK\");\n const separate = (0, combi_1.str)(\"AS SEPARATE UNIT\");\n const keeping = (0, combi_1.str)(\"KEEPING LOGICAL UNIT OF WORK\");\n const options = (0, combi_1.per)(starting, update, background, expressions_1.Destination, calling, performing, separate, keeping);\n const dynamic = (0, combi_1.seq)(\"PARAMETER-TABLE\", expressions_1.Source, (0, combi_1.opt)((0, combi_1.seq)(\"EXCEPTION-TABLE\", expressions_1.Source)));\n const call = (0, combi_1.seq)(\"CALL\", (0, combi_1.altPrio)(\"FUNCTION\", (0, combi_1.verNot)(version_1.Version.Cloud, \"CUSTOMER-FUNCTION\")), expressions_1.FunctionName, (0, combi_1.opt)(options), (0, combi_1.alt)(expressions_1.FunctionParameters, dynamic));\n return call;\n }\n}\nexports.CallFunction = CallFunction;\n//# sourceMappingURL=call_function.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/2_statements/statements/call_function.js?");
2978
+ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.CallFunction = void 0;\nconst combi_1 = __webpack_require__(/*! ../combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\nconst expressions_1 = __webpack_require__(/*! ../expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\nconst version_1 = __webpack_require__(/*! ../../../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\nclass CallFunction {\n getMatcher() {\n const starting = (0, combi_1.verNot)(version_1.Version.Cloud, (0, combi_1.seq)(\"STARTING NEW TASK\", expressions_1.SimpleSource2));\n const update = (0, combi_1.verNot)(version_1.Version.Cloud, (0, combi_1.str)(\"IN UPDATE TASK\"));\n const unit = (0, combi_1.seq)(\"UNIT\", expressions_1.Source);\n const background = (0, combi_1.verNot)(version_1.Version.Cloud, (0, combi_1.seq)(\"IN BACKGROUND\", (0, combi_1.altPrio)(\"TASK\", unit)));\n const calling = (0, combi_1.seq)(\"CALLING\", expressions_1.MethodName, \"ON END OF TASK\");\n const performing = (0, combi_1.seq)(\"PERFORMING\", expressions_1.FormName, \"ON END OF TASK\");\n const separate = (0, combi_1.str)(\"AS SEPARATE UNIT\");\n const keeping = (0, combi_1.str)(\"KEEPING LOGICAL UNIT OF WORK\");\n const options = (0, combi_1.per)(starting, update, background, expressions_1.Destination, calling, performing, separate, keeping);\n const dynamic = (0, combi_1.seq)(\"PARAMETER-TABLE\", expressions_1.Source, (0, combi_1.opt)((0, combi_1.seq)(\"EXCEPTION-TABLE\", expressions_1.Source)));\n const call = (0, combi_1.seq)(\"CALL\", (0, combi_1.altPrio)(\"FUNCTION\", (0, combi_1.verNot)(version_1.Version.Cloud, \"CUSTOMER-FUNCTION\")), expressions_1.FunctionName, (0, combi_1.opt)(options), (0, combi_1.alt)(expressions_1.FunctionParameters, dynamic));\n return call;\n }\n}\nexports.CallFunction = CallFunction;\n//# sourceMappingURL=call_function.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/2_statements/statements/call_function.js?");
2979
2979
 
2980
2980
  /***/ }),
2981
2981
 
@@ -6726,7 +6726,7 @@ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexpo
6726
6726
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6727
6727
 
6728
6728
  "use strict";
6729
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.CurrentScope = void 0;\nconst _builtin_1 = __webpack_require__(/*! ./_builtin */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_builtin.js\");\nconst ddic_1 = __webpack_require__(/*! ../../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\nconst position_1 = __webpack_require__(/*! ../../position */ \"./node_modules/@abaplint/core/build/src/position.js\");\nconst spaghetti_scope_1 = __webpack_require__(/*! ./spaghetti_scope */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/spaghetti_scope.js\");\nconst _identifier_1 = __webpack_require__(/*! ../4_file_information/_identifier */ \"./node_modules/@abaplint/core/build/src/abap/4_file_information/_identifier.js\");\nconst _scope_type_1 = __webpack_require__(/*! ./_scope_type */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js\");\nconst _reference_1 = __webpack_require__(/*! ./_reference */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js\");\nconst syntax_1 = __webpack_require__(/*! ./syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\nclass CurrentScope {\n static buildDefault(reg, obj) {\n const s = new CurrentScope(reg, obj);\n s.push(_scope_type_1.ScopeType.BuiltIn, _scope_type_1.ScopeType.BuiltIn, new position_1.Position(1, 1), _builtin_1.BuiltIn.filename);\n this.addBuiltIn(s, reg.getConfig().getSyntaxSetttings().globalConstants);\n let name = _scope_type_1.ScopeType.Global;\n if (obj) {\n name = name + \"_\" + obj.getName();\n }\n s.push(_scope_type_1.ScopeType.Global, name, new position_1.Position(1, 1), name);\n return s;\n }\n static addBuiltIn(s, extras) {\n const b = new _builtin_1.BuiltIn();\n const builtin = b.get(extras);\n s.addList(builtin);\n for (const t of b.getTypes()) {\n s.addType(t);\n }\n }\n constructor(reg, obj) {\n this.current = undefined;\n this.parentObj = obj;\n this.reg = reg;\n }\n ///////////////////////////\n getVersion() {\n return this.reg.getConfig().getVersion();\n }\n addType(type) {\n if (type === undefined) {\n return;\n }\n this.addTypeNamed(type.getName(), type);\n }\n addTypeNamed(name, type) {\n if (type === undefined) {\n return;\n }\n if (this.current === undefined) {\n return;\n }\n const upper = name.toUpperCase();\n if (this.current.getData().types[upper] !== undefined) {\n throw new Error(`Type name \"${name}\" already defined`);\n }\n this.current.getData().types[upper] = type;\n }\n addExtraLikeType(type) {\n if (type === undefined) {\n return;\n }\n this.addExtraLikeTypeNamed(type.getName(), type);\n }\n addExtraLikeTypeNamed(name, type) {\n if (type === undefined) {\n return;\n }\n if (this.current === undefined) {\n return;\n }\n const upper = name.toUpperCase();\n if (this.current.getData().extraLikeTypes[upper] !== undefined) {\n throw new Error(`Type name \"${name}\" already defined`);\n }\n this.current.getData().extraLikeTypes[upper] = type;\n }\n addClassDefinition(c) {\n if (this.current === undefined) {\n return;\n }\n const name = c.getName().toUpperCase();\n if (this.current.getData().cdefs[name] !== undefined) {\n throw new Error(`Class \"${name}\" already defined`);\n }\n this.current.getData().cdefs[name] = c;\n }\n addFormDefinitions(f) {\n if (this.current === undefined) {\n return;\n }\n this.current.getData().forms.push(...f);\n }\n addInterfaceDefinition(i) {\n var _a;\n (_a = this.current) === null || _a === void 0 ? void 0 : _a.getData().idefs.push(i);\n }\n addNamedIdentifier(name, identifier) {\n if (this.current === undefined) {\n return;\n }\n const upper = name.toUpperCase();\n if (this.current.getData().vars[upper] !== undefined) {\n throw new Error(`Variable name \"${name}\" already defined`);\n }\n this.current.getData().vars[upper] = identifier;\n }\n addIdentifier(identifier) {\n if (identifier === undefined) {\n return;\n }\n this.addNamedIdentifier(identifier.getName(), identifier);\n }\n addDeferred(token) {\n var _a;\n if (token === undefined) {\n return;\n }\n (_a = this.current) === null || _a === void 0 ? void 0 : _a.getData().deferred.push(token);\n }\n addListPrefix(identifiers, prefix) {\n for (const id of identifiers) {\n this.addNamedIdentifier(prefix + id.getName(), id);\n }\n }\n addList(identifiers) {\n for (const id of identifiers) {\n this.addIdentifier(id);\n }\n }\n addReference(usage, referencing, type, filename, extra) {\n var _a;\n if (usage === undefined || type === undefined) {\n return;\n }\n const position = new _identifier_1.Identifier(usage, filename);\n (_a = this.current) === null || _a === void 0 ? void 0 : _a.getData().references.push({ position, resolved: referencing, referenceType: type, extra });\n }\n ///////////////////////////\n findObjectDefinition(name) {\n if (name === undefined) {\n return undefined;\n }\n const clas = this.findClassDefinition(name);\n if (clas) {\n return clas;\n }\n const intf = this.findInterfaceDefinition(name);\n if (intf) {\n return intf;\n }\n return undefined;\n }\n isBadiDef(name) {\n const upper = name.toUpperCase();\n for (const enhs of this.reg.getObjectsByType(\"ENHS\")) {\n for (const def of enhs.listBadiDefinitions()) {\n if (def.name.toUpperCase() === upper) {\n return true;\n }\n }\n }\n return false;\n }\n // todo, found + type can be removed from method output?\n existsObject(name) {\n var _a, _b, _c;\n if (name === undefined) {\n return { found: false };\n }\n const findLocalClass = (_a = this.current) === null || _a === void 0 ? void 0 : _a.findClassDefinition(name);\n if (findLocalClass) {\n return { found: true, id: findLocalClass, type: _reference_1.ReferenceType.ObjectOrientedReference, ooType: \"CLAS\" };\n }\n const globalClas = this.reg.getObject(\"CLAS\", name);\n if (globalClas) {\n return { found: true, id: globalClas.getIdentifier(), type: _reference_1.ReferenceType.ObjectOrientedReference, ooType: \"CLAS\" };\n }\n const findLocalInterface = (_b = this.current) === null || _b === void 0 ? void 0 : _b.findInterfaceDefinition(name);\n if (findLocalInterface) {\n return { found: true, id: findLocalInterface, type: _reference_1.ReferenceType.ObjectOrientedReference, ooType: \"INTF\" };\n }\n const globalIntf = this.reg.getObject(\"INTF\", name);\n if (globalIntf) {\n return { found: true, id: globalIntf.getIdentifier(), type: _reference_1.ReferenceType.ObjectOrientedReference, ooType: \"INTF\" };\n }\n const def = (_c = this.current) === null || _c === void 0 ? void 0 : _c.findDeferred(name);\n if (def !== undefined) {\n return { found: true, id: def };\n }\n return { found: false };\n }\n ///////////////////////////\n /** Lookup class in local and global scope */\n findClassDefinition(name) {\n var _a;\n if (name === undefined) {\n return undefined;\n }\n const clocal = (_a = this.current) === null || _a === void 0 ? void 0 : _a.findClassDefinition(name);\n if (clocal) {\n return clocal;\n }\n const cglobal = this.reg.getObject(\"CLAS\", name);\n if (cglobal) {\n return cglobal.getDefinition();\n }\n return undefined;\n }\n findTypePoolConstant(name) {\n var _a;\n if (name === undefined || name.includes(\"_\") === undefined) {\n return undefined;\n }\n const typePoolName = name.split(\"_\")[0];\n const typePool = this.reg.getObject(\"TYPE\", typePoolName);\n if (typePool === undefined) {\n return undefined;\n }\n const spag = (_a = new syntax_1.SyntaxLogic(this.reg, typePool).run().spaghetti.getFirstChild()) === null || _a === void 0 ? void 0 : _a.getFirstChild();\n const found = spag === null || spag === void 0 ? void 0 : spag.findVariable(name);\n return found;\n }\n findTypePoolType(name) {\n var _a;\n if (name.includes(\"_\") === undefined) {\n return undefined;\n }\n const typePoolName = name.split(\"_\")[0];\n const typePool = this.reg.getObject(\"TYPE\", typePoolName);\n if (typePool === undefined) {\n return undefined;\n }\n const spag = (_a = new syntax_1.SyntaxLogic(this.reg, typePool).run().spaghetti.getFirstChild()) === null || _a === void 0 ? void 0 : _a.getFirstChild();\n const found = spag === null || spag === void 0 ? void 0 : spag.findType(name);\n return found;\n }\n /** Lookup interface in local and global scope */\n findInterfaceDefinition(name) {\n var _a;\n const ilocal = (_a = this.current) === null || _a === void 0 ? void 0 : _a.findInterfaceDefinition(name);\n if (ilocal) {\n return ilocal;\n }\n const iglobal = this.reg.getObject(\"INTF\", name);\n if (iglobal) {\n return iglobal.getDefinition();\n }\n return undefined;\n }\n findFormDefinition(name) {\n var _a;\n return (_a = this.current) === null || _a === void 0 ? void 0 : _a.findFormDefinition(name);\n }\n findType(name) {\n var _a;\n if (name === undefined) {\n return undefined;\n }\n return (_a = this.current) === null || _a === void 0 ? void 0 : _a.findType(name);\n }\n findExtraLikeType(name) {\n var _a;\n if (name === undefined) {\n return undefined;\n }\n return (_a = this.current) === null || _a === void 0 ? void 0 : _a.findExtraLikeType(name);\n }\n findVariable(name) {\n var _a;\n if (name === undefined) {\n return undefined;\n }\n const found = (_a = this.current) === null || _a === void 0 ? void 0 : _a.findVariable(name);\n if (found) {\n return found;\n }\n return this.findTypePoolConstant(name);\n }\n ///////////////////////////\n getDDIC() {\n return new ddic_1.DDIC(this.reg);\n }\n getDDICReferences() {\n return this.reg.getDDICReferences();\n }\n getParentObj() {\n return this.parentObj;\n }\n getName() {\n if (this.current === undefined) {\n throw new Error(\"error, getName\");\n }\n return this.current.getIdentifier().sname;\n }\n getType() {\n if (this.current === undefined) {\n throw new Error(\"error, getType\");\n }\n return this.current.getIdentifier().stype;\n }\n push(stype, sname, start, filename) {\n const identifier = { stype, sname, start, filename, end: undefined };\n if (this.current === undefined) {\n // the top node\n this.current = new spaghetti_scope_1.SpaghettiScopeNode(identifier, undefined);\n }\n else {\n const parent = this.current;\n this.current = new spaghetti_scope_1.SpaghettiScopeNode(identifier, parent);\n parent.addChild(this.current);\n }\n }\n isOO() {\n let curr = this.current;\n while (curr !== undefined) {\n const stype = curr.getIdentifier().stype;\n if (stype === _scope_type_1.ScopeType.ClassDefinition\n || stype === _scope_type_1.ScopeType.ClassImplementation\n || stype === _scope_type_1.ScopeType.Interface) {\n return true;\n }\n curr = curr.getParent();\n }\n return false;\n }\n isTypePool() {\n var _a;\n return ((_a = this.current) === null || _a === void 0 ? void 0 : _a.getIdentifier().filename.endsWith(\".type.abap\")) === true || false;\n }\n setAllowHeaderUse(name) {\n // workaround for SELECT FOR ALL ENTRIES\n this.allowHeaderUse = name;\n }\n isAllowHeaderUse(name) {\n var _a;\n return name.toUpperCase() === ((_a = this.allowHeaderUse) === null || _a === void 0 ? void 0 : _a.toUpperCase());\n }\n pop(end) {\n this.allowHeaderUse = undefined;\n if (this.current === undefined) {\n throw new Error(\"something wrong, top scope popped\");\n }\n this.current.setEnd(end);\n const current = this.current;\n this.current = this.current.getParent();\n return new spaghetti_scope_1.SpaghettiScope(current);\n }\n}\nexports.CurrentScope = CurrentScope;\n//# sourceMappingURL=_current_scope.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/_current_scope.js?");
6729
+ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.CurrentScope = void 0;\nconst _builtin_1 = __webpack_require__(/*! ./_builtin */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_builtin.js\");\nconst ddic_1 = __webpack_require__(/*! ../../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\nconst position_1 = __webpack_require__(/*! ../../position */ \"./node_modules/@abaplint/core/build/src/position.js\");\nconst spaghetti_scope_1 = __webpack_require__(/*! ./spaghetti_scope */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/spaghetti_scope.js\");\nconst _identifier_1 = __webpack_require__(/*! ../4_file_information/_identifier */ \"./node_modules/@abaplint/core/build/src/abap/4_file_information/_identifier.js\");\nconst _scope_type_1 = __webpack_require__(/*! ./_scope_type */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js\");\nconst _reference_1 = __webpack_require__(/*! ./_reference */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js\");\nconst syntax_1 = __webpack_require__(/*! ./syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\nclass CurrentScope {\n static buildDefault(reg, obj) {\n const s = new CurrentScope(reg, obj);\n s.push(_scope_type_1.ScopeType.BuiltIn, _scope_type_1.ScopeType.BuiltIn, new position_1.Position(1, 1), _builtin_1.BuiltIn.filename);\n this.addBuiltIn(s, reg.getConfig().getSyntaxSetttings().globalConstants);\n let name = _scope_type_1.ScopeType.Global;\n if (obj) {\n name = name + \"_\" + obj.getName();\n }\n s.push(_scope_type_1.ScopeType.Global, name, new position_1.Position(1, 1), name);\n return s;\n }\n static addBuiltIn(s, extras) {\n const b = new _builtin_1.BuiltIn();\n const builtin = b.get(extras);\n s.addList(builtin);\n for (const t of b.getTypes()) {\n s.addType(t);\n }\n }\n constructor(reg, obj) {\n this.current = undefined;\n this.parentObj = obj;\n this.reg = reg;\n }\n ///////////////////////////\n getVersion() {\n return this.reg.getConfig().getVersion();\n }\n addType(type) {\n if (type === undefined) {\n return;\n }\n this.addTypeNamed(type.getName(), type);\n }\n addTypeNamed(name, type) {\n if (type === undefined) {\n return;\n }\n if (this.current === undefined) {\n return;\n }\n const upper = name.toUpperCase();\n if (this.current.getData().types[upper] !== undefined) {\n throw new Error(`Type name \"${name}\" already defined`);\n }\n this.current.getData().types[upper] = type;\n }\n addExtraLikeType(type) {\n if (type === undefined) {\n return;\n }\n this.addExtraLikeTypeNamed(type.getName(), type);\n }\n addExtraLikeTypeNamed(name, type) {\n if (type === undefined) {\n return;\n }\n if (this.current === undefined) {\n return;\n }\n const upper = name.toUpperCase();\n if (this.current.getData().extraLikeTypes[upper] !== undefined) {\n throw new Error(`Type name \"${name}\" already defined`);\n }\n this.current.getData().extraLikeTypes[upper] = type;\n }\n addClassDefinition(c) {\n if (this.current === undefined) {\n return;\n }\n const name = c.getName().toUpperCase();\n if (this.current.getData().cdefs[name] !== undefined) {\n throw new Error(`Class \"${name}\" already defined`);\n }\n this.current.getData().cdefs[name] = c;\n }\n addFormDefinitions(f) {\n if (this.current === undefined) {\n return;\n }\n this.current.getData().forms.push(...f);\n }\n addInterfaceDefinition(i) {\n var _a;\n (_a = this.current) === null || _a === void 0 ? void 0 : _a.getData().idefs.push(i);\n }\n addNamedIdentifier(name, identifier) {\n if (this.current === undefined) {\n return;\n }\n const upper = name.toUpperCase();\n if (this.current.getData().vars[upper] !== undefined) {\n throw new Error(`Variable name \"${name}\" already defined`);\n }\n this.current.getData().vars[upper] = identifier;\n }\n addIdentifier(identifier) {\n if (identifier === undefined) {\n return;\n }\n this.addNamedIdentifier(identifier.getName(), identifier);\n }\n addDeferred(token) {\n var _a;\n if (token === undefined) {\n return;\n }\n (_a = this.current) === null || _a === void 0 ? void 0 : _a.getData().deferred.push(token);\n }\n addListPrefix(identifiers, prefix) {\n for (const id of identifiers) {\n this.addNamedIdentifier(prefix + id.getName(), id);\n }\n }\n addList(identifiers) {\n for (const id of identifiers) {\n this.addIdentifier(id);\n }\n }\n addReference(usage, referencing, type, filename, extra) {\n var _a;\n if (usage === undefined || type === undefined) {\n return;\n }\n const position = new _identifier_1.Identifier(usage, filename);\n (_a = this.current) === null || _a === void 0 ? void 0 : _a.getData().references.push({ position, resolved: referencing, referenceType: type, extra });\n }\n ///////////////////////////\n findFunctionModule(name) {\n if (name === undefined) {\n return undefined;\n }\n for (const fugr of this.reg.getObjectsByType(\"FUGR\")) {\n const func = fugr.getModule(name);\n if (func !== undefined) {\n return func;\n }\n }\n return undefined;\n }\n findObjectDefinition(name) {\n if (name === undefined) {\n return undefined;\n }\n const clas = this.findClassDefinition(name);\n if (clas) {\n return clas;\n }\n const intf = this.findInterfaceDefinition(name);\n if (intf) {\n return intf;\n }\n return undefined;\n }\n isBadiDef(name) {\n const upper = name.toUpperCase();\n for (const enhs of this.reg.getObjectsByType(\"ENHS\")) {\n for (const def of enhs.listBadiDefinitions()) {\n if (def.name.toUpperCase() === upper) {\n return true;\n }\n }\n }\n return false;\n }\n // todo, found + type can be removed from method output?\n existsObject(name) {\n var _a, _b, _c;\n if (name === undefined) {\n return { found: false };\n }\n const findLocalClass = (_a = this.current) === null || _a === void 0 ? void 0 : _a.findClassDefinition(name);\n if (findLocalClass) {\n return { found: true, id: findLocalClass, type: _reference_1.ReferenceType.ObjectOrientedReference, ooType: \"CLAS\" };\n }\n const globalClas = this.reg.getObject(\"CLAS\", name);\n if (globalClas) {\n return { found: true, id: globalClas.getIdentifier(), type: _reference_1.ReferenceType.ObjectOrientedReference, ooType: \"CLAS\" };\n }\n const findLocalInterface = (_b = this.current) === null || _b === void 0 ? void 0 : _b.findInterfaceDefinition(name);\n if (findLocalInterface) {\n return { found: true, id: findLocalInterface, type: _reference_1.ReferenceType.ObjectOrientedReference, ooType: \"INTF\" };\n }\n const globalIntf = this.reg.getObject(\"INTF\", name);\n if (globalIntf) {\n return { found: true, id: globalIntf.getIdentifier(), type: _reference_1.ReferenceType.ObjectOrientedReference, ooType: \"INTF\" };\n }\n const def = (_c = this.current) === null || _c === void 0 ? void 0 : _c.findDeferred(name);\n if (def !== undefined) {\n return { found: true, id: def };\n }\n return { found: false };\n }\n ///////////////////////////\n /** Lookup class in local and global scope */\n findClassDefinition(name) {\n var _a;\n if (name === undefined) {\n return undefined;\n }\n const clocal = (_a = this.current) === null || _a === void 0 ? void 0 : _a.findClassDefinition(name);\n if (clocal) {\n return clocal;\n }\n const cglobal = this.reg.getObject(\"CLAS\", name);\n if (cglobal) {\n return cglobal.getDefinition();\n }\n return undefined;\n }\n findTypePoolConstant(name) {\n var _a;\n if (name === undefined || name.includes(\"_\") === undefined) {\n return undefined;\n }\n const typePoolName = name.split(\"_\")[0];\n const typePool = this.reg.getObject(\"TYPE\", typePoolName);\n if (typePool === undefined) {\n return undefined;\n }\n const spag = (_a = new syntax_1.SyntaxLogic(this.reg, typePool).run().spaghetti.getFirstChild()) === null || _a === void 0 ? void 0 : _a.getFirstChild();\n const found = spag === null || spag === void 0 ? void 0 : spag.findVariable(name);\n return found;\n }\n findTypePoolType(name) {\n var _a;\n if (name.includes(\"_\") === undefined) {\n return undefined;\n }\n const typePoolName = name.split(\"_\")[0];\n const typePool = this.reg.getObject(\"TYPE\", typePoolName);\n if (typePool === undefined) {\n return undefined;\n }\n const spag = (_a = new syntax_1.SyntaxLogic(this.reg, typePool).run().spaghetti.getFirstChild()) === null || _a === void 0 ? void 0 : _a.getFirstChild();\n const found = spag === null || spag === void 0 ? void 0 : spag.findType(name);\n return found;\n }\n /** Lookup interface in local and global scope */\n findInterfaceDefinition(name) {\n var _a;\n const ilocal = (_a = this.current) === null || _a === void 0 ? void 0 : _a.findInterfaceDefinition(name);\n if (ilocal) {\n return ilocal;\n }\n const iglobal = this.reg.getObject(\"INTF\", name);\n if (iglobal) {\n return iglobal.getDefinition();\n }\n return undefined;\n }\n findFormDefinition(name) {\n var _a;\n return (_a = this.current) === null || _a === void 0 ? void 0 : _a.findFormDefinition(name);\n }\n findType(name) {\n var _a;\n if (name === undefined) {\n return undefined;\n }\n return (_a = this.current) === null || _a === void 0 ? void 0 : _a.findType(name);\n }\n findExtraLikeType(name) {\n var _a;\n if (name === undefined) {\n return undefined;\n }\n return (_a = this.current) === null || _a === void 0 ? void 0 : _a.findExtraLikeType(name);\n }\n findVariable(name) {\n var _a;\n if (name === undefined) {\n return undefined;\n }\n const found = (_a = this.current) === null || _a === void 0 ? void 0 : _a.findVariable(name);\n if (found) {\n return found;\n }\n return this.findTypePoolConstant(name);\n }\n ///////////////////////////\n getDDIC() {\n return new ddic_1.DDIC(this.reg);\n }\n getDDICReferences() {\n return this.reg.getDDICReferences();\n }\n getParentObj() {\n return this.parentObj;\n }\n getName() {\n if (this.current === undefined) {\n throw new Error(\"error, getName\");\n }\n return this.current.getIdentifier().sname;\n }\n getType() {\n if (this.current === undefined) {\n throw new Error(\"error, getType\");\n }\n return this.current.getIdentifier().stype;\n }\n push(stype, sname, start, filename) {\n const identifier = { stype, sname, start, filename, end: undefined };\n if (this.current === undefined) {\n // the top node\n this.current = new spaghetti_scope_1.SpaghettiScopeNode(identifier, undefined);\n }\n else {\n const parent = this.current;\n this.current = new spaghetti_scope_1.SpaghettiScopeNode(identifier, parent);\n parent.addChild(this.current);\n }\n }\n isOO() {\n let curr = this.current;\n while (curr !== undefined) {\n const stype = curr.getIdentifier().stype;\n if (stype === _scope_type_1.ScopeType.ClassDefinition\n || stype === _scope_type_1.ScopeType.ClassImplementation\n || stype === _scope_type_1.ScopeType.Interface) {\n return true;\n }\n curr = curr.getParent();\n }\n return false;\n }\n isTypePool() {\n var _a;\n return ((_a = this.current) === null || _a === void 0 ? void 0 : _a.getIdentifier().filename.endsWith(\".type.abap\")) === true || false;\n }\n setAllowHeaderUse(name) {\n // workaround for SELECT FOR ALL ENTRIES\n this.allowHeaderUse = name;\n }\n isAllowHeaderUse(name) {\n var _a;\n return name.toUpperCase() === ((_a = this.allowHeaderUse) === null || _a === void 0 ? void 0 : _a.toUpperCase());\n }\n pop(end) {\n this.allowHeaderUse = undefined;\n if (this.current === undefined) {\n throw new Error(\"something wrong, top scope popped\");\n }\n this.current.setEnd(end);\n const current = this.current;\n this.current = this.current.getParent();\n return new spaghetti_scope_1.SpaghettiScope(current);\n }\n}\nexports.CurrentScope = CurrentScope;\n//# sourceMappingURL=_current_scope.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/_current_scope.js?");
6730
6730
 
6731
6731
  /***/ }),
6732
6732
 
@@ -7562,7 +7562,7 @@ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexpo
7562
7562
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7563
7563
 
7564
7564
  "use strict";
7565
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.CallFunction = void 0;\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\nconst source_1 = __webpack_require__(/*! ../expressions/source */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source.js\");\nconst target_1 = __webpack_require__(/*! ../expressions/target */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/target.js\");\nconst field_chain_1 = __webpack_require__(/*! ../expressions/field_chain */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/field_chain.js\");\nconst _reference_1 = __webpack_require__(/*! ../_reference */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js\");\nclass CallFunction {\n runSyntax(node, scope, filename) {\n // todo, lots of work here, similar to receive.ts\n const name = node.findFirstExpression(Expressions.FunctionName);\n const chain = name === null || name === void 0 ? void 0 : name.findFirstExpression(Expressions.FieldChain);\n if (chain) {\n new field_chain_1.FieldChain().runSyntax(chain, scope, filename, _reference_1.ReferenceType.DataReadReference);\n }\n // just recurse\n for (const s of node.findAllExpressions(Expressions.Source)) {\n new source_1.Source().runSyntax(s, scope, filename);\n }\n for (const s of node.findAllExpressions(Expressions.SimpleSource3)) {\n new source_1.Source().runSyntax(s, scope, filename);\n }\n for (const t of node.findAllExpressions(Expressions.Target)) {\n new target_1.Target().runSyntax(t, scope, filename);\n }\n for (const s of node.findDirectExpressions(Expressions.SimpleSource2)) {\n new source_1.Source().runSyntax(s, scope, filename);\n }\n }\n}\nexports.CallFunction = CallFunction;\n//# sourceMappingURL=call_function.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/call_function.js?");
7565
+ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.CallFunction = void 0;\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\nconst source_1 = __webpack_require__(/*! ../expressions/source */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source.js\");\nconst target_1 = __webpack_require__(/*! ../expressions/target */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/target.js\");\nconst field_chain_1 = __webpack_require__(/*! ../expressions/field_chain */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/field_chain.js\");\nconst _reference_1 = __webpack_require__(/*! ../_reference */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js\");\nconst version_1 = __webpack_require__(/*! ../../../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\nclass CallFunction {\n runSyntax(node, scope, filename) {\n // todo, lots of work here, similar to receive.ts\n const name = node.findFirstExpression(Expressions.FunctionName);\n const chain = name === null || name === void 0 ? void 0 : name.findFirstExpression(Expressions.FieldChain);\n if (chain) {\n new field_chain_1.FieldChain().runSyntax(chain, scope, filename, _reference_1.ReferenceType.DataReadReference);\n }\n else if (scope.getVersion() === version_1.Version.Cloud\n && node.findDirectExpression(Expressions.Destination) === undefined) {\n const functionName = name === null || name === void 0 ? void 0 : name.concatTokens().replace(/'/, \"\");\n if (scope.findFunctionModule(functionName) === undefined) {\n throw new Error(`Function module \"${functionName}\" not found/released`);\n }\n }\n // just recurse\n for (const s of node.findAllExpressions(Expressions.Source)) {\n new source_1.Source().runSyntax(s, scope, filename);\n }\n for (const s of node.findAllExpressions(Expressions.SimpleSource3)) {\n new source_1.Source().runSyntax(s, scope, filename);\n }\n for (const t of node.findAllExpressions(Expressions.Target)) {\n new target_1.Target().runSyntax(t, scope, filename);\n }\n for (const s of node.findDirectExpressions(Expressions.SimpleSource2)) {\n new source_1.Source().runSyntax(s, scope, filename);\n }\n }\n}\nexports.CallFunction = CallFunction;\n//# sourceMappingURL=call_function.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/call_function.js?");
7566
7566
 
7567
7567
  /***/ }),
7568
7568
 
@@ -10345,7 +10345,7 @@ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexpo
10345
10345
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10346
10346
 
10347
10347
  "use strict";
10348
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.LanguageServer = void 0;\nconst LServer = __webpack_require__(/*! vscode-languageserver-types */ \"./node_modules/vscode-languageserver-types/lib/esm/main.js\");\nconst symbols_1 = __webpack_require__(/*! ./symbols */ \"./node_modules/@abaplint/core/build/src/lsp/symbols.js\");\nconst hover_1 = __webpack_require__(/*! ./hover */ \"./node_modules/@abaplint/core/build/src/lsp/hover.js\");\nconst diagnostics_1 = __webpack_require__(/*! ./diagnostics */ \"./node_modules/@abaplint/core/build/src/lsp/diagnostics.js\");\nconst help_1 = __webpack_require__(/*! ./help */ \"./node_modules/@abaplint/core/build/src/lsp/help.js\");\nconst pretty_printer_1 = __webpack_require__(/*! ../pretty_printer/pretty_printer */ \"./node_modules/@abaplint/core/build/src/pretty_printer/pretty_printer.js\");\nconst definition_1 = __webpack_require__(/*! ./definition */ \"./node_modules/@abaplint/core/build/src/lsp/definition.js\");\nconst rename_1 = __webpack_require__(/*! ./rename */ \"./node_modules/@abaplint/core/build/src/lsp/rename.js\");\nconst highlight_1 = __webpack_require__(/*! ./highlight */ \"./node_modules/@abaplint/core/build/src/lsp/highlight.js\");\nconst _lsp_utils_1 = __webpack_require__(/*! ./_lsp_utils */ \"./node_modules/@abaplint/core/build/src/lsp/_lsp_utils.js\");\nconst code_actions_1 = __webpack_require__(/*! ./code_actions */ \"./node_modules/@abaplint/core/build/src/lsp/code_actions.js\");\nconst references_1 = __webpack_require__(/*! ./references */ \"./node_modules/@abaplint/core/build/src/lsp/references.js\");\nconst implementation_1 = __webpack_require__(/*! ./implementation */ \"./node_modules/@abaplint/core/build/src/lsp/implementation.js\");\nconst semantic_1 = __webpack_require__(/*! ./semantic */ \"./node_modules/@abaplint/core/build/src/lsp/semantic.js\");\nconst statement_flow_1 = __webpack_require__(/*! ../abap/flow/statement_flow */ \"./node_modules/@abaplint/core/build/src/abap/flow/statement_flow.js\");\n// note Ranges are zero based in LSP,\n// https://github.com/microsoft/language-server-protocol/blob/main/versions/protocol-2-x.md#range\n// but 1 based in abaplint\n// the types in this file are not completely correct\n// see https://github.com/microsoft/vscode-languageserver-node/issues/354\nclass LanguageServer {\n constructor(reg) {\n this.reg = reg;\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_documentSymbol\n documentSymbol(params) {\n return new symbols_1.Symbols(this.reg).find(params.textDocument.uri);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_hover\n hover(params) {\n const hover = new hover_1.Hover(this.reg).find(params);\n if (hover) {\n return { contents: hover };\n }\n return undefined;\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_definition\n gotoDefinition(params) {\n return new definition_1.Definition(this.reg).find(params.textDocument, params.position);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_formatting\n documentFormatting(params) {\n const file = _lsp_utils_1.LSPUtils.getABAPFile(this.reg, params.textDocument.uri);\n if (file === undefined) {\n return [];\n }\n const text = new pretty_printer_1.PrettyPrinter(file, this.reg.getConfig()).run();\n const rows = file.getRawRows();\n return [{\n range: LServer.Range.create(0, 0, rows.length, rows[rows.length - 1].length + 1),\n newText: text,\n }];\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_publishDiagnostics\n diagnostics(textDocument) {\n return new diagnostics_1.Diagnostics(this.reg).find(textDocument);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_prepareRename\n prepareRename(params) {\n return new rename_1.Rename(this.reg).prepareRename(params);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_rename\n rename(params) {\n return new rename_1.Rename(this.reg).rename(params);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_codeAction\n codeActions(params) {\n return new code_actions_1.CodeActions(this.reg).find(params);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_documentHighlight\n documentHighlight(_params) {\n // todo, implement\n return [];\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_implementation\n implementation(params) {\n return new implementation_1.Implementation(this.reg).find(params.textDocument, params.position);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_references\n references(params) {\n return new references_1.References(this.reg).references(params);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#semanticTokensLegend\n static semanticTokensLegend() {\n return semantic_1.SemanticHighlighting.semanticTokensLegend();\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#semanticTokensRangeParams\n semanticTokensRange(range) {\n return new semantic_1.SemanticHighlighting(this.reg).semanticTokensRange(range);\n }\n ////////////////////////////////////////\n // ______ _\n // | ____| | |\n // | |__ __ _| |_ _ __ __ ___\n // | __| \\ \\/ / __| '__/ _` / __|\n // | |____ > <| |_| | | (_| \\__ \\\n // |______/_/\\_\\\\__|_| \\__,_|___/\n // extras, abaplint specific\n ////////////////////////////////////////\n help(textDocument, position) {\n return help_1.Help.find(this.reg, textDocument, position);\n }\n listDefinitionPositions(textDocument) {\n return new highlight_1.Highlight(this.reg).listDefinitionPositions(textDocument);\n }\n listReadPositions(textDocument) {\n return new highlight_1.Highlight(this.reg).listReadPositions(textDocument);\n }\n listWritePositions(textDocument) {\n return new highlight_1.Highlight(this.reg).listWritePositions(textDocument);\n }\n dumpStatementFlows(textDocument) {\n const file = _lsp_utils_1.LSPUtils.getABAPFile(this.reg, textDocument.uri);\n if (file === undefined) {\n return \"file not found\";\n }\n const stru = file.getStructure();\n if (stru === undefined) {\n return \"empty structure\";\n }\n const graphs = new statement_flow_1.StatementFlow().build(stru);\n const wiz = graphs.map(g => g.toDigraph());\n return JSON.stringify(wiz);\n }\n}\nexports.LanguageServer = LanguageServer;\n//# sourceMappingURL=language_server.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/lsp/language_server.js?");
10348
+ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.LanguageServer = void 0;\nconst LServer = __webpack_require__(/*! vscode-languageserver-types */ \"./node_modules/vscode-languageserver-types/lib/esm/main.js\");\nconst symbols_1 = __webpack_require__(/*! ./symbols */ \"./node_modules/@abaplint/core/build/src/lsp/symbols.js\");\nconst hover_1 = __webpack_require__(/*! ./hover */ \"./node_modules/@abaplint/core/build/src/lsp/hover.js\");\nconst diagnostics_1 = __webpack_require__(/*! ./diagnostics */ \"./node_modules/@abaplint/core/build/src/lsp/diagnostics.js\");\nconst help_1 = __webpack_require__(/*! ./help */ \"./node_modules/@abaplint/core/build/src/lsp/help.js\");\nconst pretty_printer_1 = __webpack_require__(/*! ../pretty_printer/pretty_printer */ \"./node_modules/@abaplint/core/build/src/pretty_printer/pretty_printer.js\");\nconst definition_1 = __webpack_require__(/*! ./definition */ \"./node_modules/@abaplint/core/build/src/lsp/definition.js\");\nconst rename_1 = __webpack_require__(/*! ./rename */ \"./node_modules/@abaplint/core/build/src/lsp/rename.js\");\nconst highlight_1 = __webpack_require__(/*! ./highlight */ \"./node_modules/@abaplint/core/build/src/lsp/highlight.js\");\nconst _lsp_utils_1 = __webpack_require__(/*! ./_lsp_utils */ \"./node_modules/@abaplint/core/build/src/lsp/_lsp_utils.js\");\nconst code_actions_1 = __webpack_require__(/*! ./code_actions */ \"./node_modules/@abaplint/core/build/src/lsp/code_actions.js\");\nconst references_1 = __webpack_require__(/*! ./references */ \"./node_modules/@abaplint/core/build/src/lsp/references.js\");\nconst implementation_1 = __webpack_require__(/*! ./implementation */ \"./node_modules/@abaplint/core/build/src/lsp/implementation.js\");\nconst semantic_1 = __webpack_require__(/*! ./semantic */ \"./node_modules/@abaplint/core/build/src/lsp/semantic.js\");\nconst statement_flow_1 = __webpack_require__(/*! ../abap/flow/statement_flow */ \"./node_modules/@abaplint/core/build/src/abap/flow/statement_flow.js\");\n// note Ranges are zero based in LSP,\n// https://github.com/microsoft/language-server-protocol/blob/main/versions/protocol-2-x.md#range\n// but 1 based in abaplint\n// the types in this file are not completely correct\n// see https://github.com/microsoft/vscode-languageserver-node/issues/354\nclass LanguageServer {\n constructor(reg) {\n this.reg = reg;\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_documentSymbol\n documentSymbol(params) {\n return new symbols_1.Symbols(this.reg).find(params.textDocument.uri);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_hover\n hover(params) {\n const hover = new hover_1.Hover(this.reg).find(params);\n if (hover) {\n return { contents: hover };\n }\n return undefined;\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_definition\n gotoDefinition(params) {\n return new definition_1.Definition(this.reg).find(params.textDocument, params.position);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_formatting\n documentFormatting(params) {\n const file = _lsp_utils_1.LSPUtils.getABAPFile(this.reg, params.textDocument.uri);\n if (file === undefined) {\n return [];\n }\n const text = new pretty_printer_1.PrettyPrinter(file, this.reg.getConfig()).run();\n const rows = file.getRawRows();\n if (text === file.getRaw()) {\n return [];\n }\n else {\n return [{\n range: LServer.Range.create(0, 0, rows.length, rows[rows.length - 1].length + 1),\n newText: text,\n }];\n }\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_publishDiagnostics\n diagnostics(textDocument) {\n return new diagnostics_1.Diagnostics(this.reg).find(textDocument);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_prepareRename\n prepareRename(params) {\n return new rename_1.Rename(this.reg).prepareRename(params);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_rename\n rename(params) {\n return new rename_1.Rename(this.reg).rename(params);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_codeAction\n codeActions(params) {\n return new code_actions_1.CodeActions(this.reg).find(params);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_documentHighlight\n documentHighlight(_params) {\n // todo, implement\n return [];\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_implementation\n implementation(params) {\n return new implementation_1.Implementation(this.reg).find(params.textDocument, params.position);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#textDocument_references\n references(params) {\n return new references_1.References(this.reg).references(params);\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#semanticTokensLegend\n static semanticTokensLegend() {\n return semantic_1.SemanticHighlighting.semanticTokensLegend();\n }\n // https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#semanticTokensRangeParams\n semanticTokensRange(range) {\n return new semantic_1.SemanticHighlighting(this.reg).semanticTokensRange(range);\n }\n ////////////////////////////////////////\n // ______ _\n // | ____| | |\n // | |__ __ _| |_ _ __ __ ___\n // | __| \\ \\/ / __| '__/ _` / __|\n // | |____ > <| |_| | | (_| \\__ \\\n // |______/_/\\_\\\\__|_| \\__,_|___/\n // extras, abaplint specific\n ////////////////////////////////////////\n help(textDocument, position) {\n return help_1.Help.find(this.reg, textDocument, position);\n }\n listDefinitionPositions(textDocument) {\n return new highlight_1.Highlight(this.reg).listDefinitionPositions(textDocument);\n }\n listReadPositions(textDocument) {\n return new highlight_1.Highlight(this.reg).listReadPositions(textDocument);\n }\n listWritePositions(textDocument) {\n return new highlight_1.Highlight(this.reg).listWritePositions(textDocument);\n }\n dumpStatementFlows(textDocument) {\n const file = _lsp_utils_1.LSPUtils.getABAPFile(this.reg, textDocument.uri);\n if (file === undefined) {\n return \"file not found\";\n }\n const stru = file.getStructure();\n if (stru === undefined) {\n return \"empty structure\";\n }\n const graphs = new statement_flow_1.StatementFlow().build(stru);\n const wiz = graphs.map(g => g.toDigraph());\n return JSON.stringify(wiz);\n }\n}\nexports.LanguageServer = LanguageServer;\n//# sourceMappingURL=language_server.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/lsp/language_server.js?");
10349
10349
 
10350
10350
  /***/ }),
10351
10351
 
@@ -11819,18 +11819,7 @@ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexpo
11819
11819
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
11820
11820
 
11821
11821
  "use strict";
11822
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.PrettyPrinter = void 0;\nconst _statement_1 = __webpack_require__(/*! ../abap/2_statements/statements/_statement */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js\");\nconst fix_keyword_case_1 = __webpack_require__(/*! ./fix_keyword_case */ \"./node_modules/@abaplint/core/build/src/pretty_printer/fix_keyword_case.js\");\nconst indent_1 = __webpack_require__(/*! ./indent */ \"./node_modules/@abaplint/core/build/src/pretty_printer/indent.js\");\nconst remove_sequential_blanks_1 = __webpack_require__(/*! ./remove_sequential_blanks */ \"./node_modules/@abaplint/core/build/src/pretty_printer/remove_sequential_blanks.js\");\nconst position_1 = __webpack_require__(/*! ../position */ \"./node_modules/@abaplint/core/build/src/position.js\");\nconst indentation_1 = __webpack_require__(/*! ../rules/indentation */ \"./node_modules/@abaplint/core/build/src/rules/indentation.js\");\nclass PrettyPrinter {\n constructor(file, config) {\n this.result = file.getRaw();\n this.file = file;\n this.config = config;\n const indentationConf = config.readByRule(new indentation_1.Indentation().getMetadata().key);\n this.options = {\n alignTryCatch: indentationConf === null || indentationConf === void 0 ? void 0 : indentationConf.alignTryCatch,\n globalClassSkipFirst: indentationConf === null || indentationConf === void 0 ? void 0 : indentationConf.globalClassSkipFirst,\n };\n }\n run() {\n const statements = this.file.getStatements();\n for (const statement of statements) {\n if (statement.get() instanceof _statement_1.Unknown\n || statement.get() instanceof _statement_1.MacroContent\n || statement.get() instanceof _statement_1.MacroCall\n || statement.getFirstToken().getStart() instanceof position_1.VirtualPosition\n || statement.get() instanceof _statement_1.Comment) {\n continue;\n }\n // note that no positions are changed when case is changed\n const fixCase = new fix_keyword_case_1.FixCase(this.result, this.config);\n this.result = fixCase.execute(statement);\n }\n const indentation = new indent_1.Indent(this.options);\n this.result = indentation.execute(this.file, this.result);\n const removeBlanks = new remove_sequential_blanks_1.RemoveSequentialBlanks(this.config);\n this.result = removeBlanks.execute(this.file, this.result);\n return this.result;\n }\n}\nexports.PrettyPrinter = PrettyPrinter;\n//# sourceMappingURL=pretty_printer.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/pretty_printer/pretty_printer.js?");
11823
-
11824
- /***/ }),
11825
-
11826
- /***/ "./node_modules/@abaplint/core/build/src/pretty_printer/remove_sequential_blanks.js":
11827
- /*!******************************************************************************************!*\
11828
- !*** ./node_modules/@abaplint/core/build/src/pretty_printer/remove_sequential_blanks.js ***!
11829
- \******************************************************************************************/
11830
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
11831
-
11832
- "use strict";
11833
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.RemoveSequentialBlanks = void 0;\nconst rules_1 = __webpack_require__(/*! ../rules */ \"./node_modules/@abaplint/core/build/src/rules/index.js\");\nclass RemoveSequentialBlanks {\n constructor(config) {\n this.config = config;\n }\n execute(file, modified) {\n const sequentialBlankConfig = this.getSequentialBlankConfig();\n if (sequentialBlankConfig) {\n return this.withoutSequentialBlanks(file, modified, sequentialBlankConfig.lines);\n }\n return modified;\n }\n withoutSequentialBlanks(file, modified, threshold) {\n const rows = file.getRawRows();\n let blanks = 0;\n const rowsToRemove = [];\n const newBlankCount = (current, row) => {\n return rules_1.SequentialBlank.isBlankOrWhitespace(row) ? current + 1 : 0;\n };\n for (let i = 0; i < rows.length; i++) {\n blanks = newBlankCount(blanks, rows[i]);\n if (blanks === threshold) {\n // count additional blanks\n for (let j = i; j < rows.length; j++) {\n if (rules_1.SequentialBlank.isBlankOrWhitespace(rows[j])) {\n rowsToRemove.push(j);\n }\n else {\n break;\n }\n }\n }\n }\n return this.removeRows(modified.split(\"\\n\"), rowsToRemove);\n }\n removeRows(lines, rowsToRemove) {\n const withoutRemoved = lines.filter((_, idx) => {\n return rowsToRemove.indexOf(idx) === -1;\n });\n return withoutRemoved.join(\"\\n\").trim();\n }\n getSequentialBlankConfig() {\n return this.config.readByRule(new rules_1.SequentialBlank().getMetadata().key);\n }\n}\nexports.RemoveSequentialBlanks = RemoveSequentialBlanks;\n//# sourceMappingURL=remove_sequential_blanks.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/pretty_printer/remove_sequential_blanks.js?");
11822
+ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.PrettyPrinter = void 0;\nconst _statement_1 = __webpack_require__(/*! ../abap/2_statements/statements/_statement */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js\");\nconst fix_keyword_case_1 = __webpack_require__(/*! ./fix_keyword_case */ \"./node_modules/@abaplint/core/build/src/pretty_printer/fix_keyword_case.js\");\nconst indent_1 = __webpack_require__(/*! ./indent */ \"./node_modules/@abaplint/core/build/src/pretty_printer/indent.js\");\nconst position_1 = __webpack_require__(/*! ../position */ \"./node_modules/@abaplint/core/build/src/position.js\");\nconst indentation_1 = __webpack_require__(/*! ../rules/indentation */ \"./node_modules/@abaplint/core/build/src/rules/indentation.js\");\nclass PrettyPrinter {\n constructor(file, config) {\n this.result = file.getRaw();\n this.file = file;\n this.config = config;\n const indentationConf = config.readByRule(new indentation_1.Indentation().getMetadata().key);\n this.options = {\n alignTryCatch: indentationConf === null || indentationConf === void 0 ? void 0 : indentationConf.alignTryCatch,\n globalClassSkipFirst: indentationConf === null || indentationConf === void 0 ? void 0 : indentationConf.globalClassSkipFirst,\n };\n }\n run() {\n const statements = this.file.getStatements();\n for (const statement of statements) {\n if (statement.get() instanceof _statement_1.Unknown\n || statement.get() instanceof _statement_1.MacroContent\n || statement.get() instanceof _statement_1.MacroCall\n || statement.getFirstToken().getStart() instanceof position_1.VirtualPosition\n || statement.get() instanceof _statement_1.Comment) {\n continue;\n }\n // note that no positions are changed when case is changed\n const fixCase = new fix_keyword_case_1.FixCase(this.result, this.config);\n this.result = fixCase.execute(statement);\n }\n const indentation = new indent_1.Indent(this.options);\n this.result = indentation.execute(this.file, this.result);\n return this.result;\n }\n}\nexports.PrettyPrinter = PrettyPrinter;\n//# sourceMappingURL=pretty_printer.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/pretty_printer/pretty_printer.js?");
11834
11823
 
11835
11824
  /***/ }),
11836
11825
 
@@ -11841,7 +11830,7 @@ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexpo
11841
11830
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
11842
11831
 
11843
11832
  "use strict";
11844
- 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 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 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\");\nconst rules_runner_1 = __webpack_require__(/*! ./rules_runner */ \"./node_modules/@abaplint/core/build/src/rules_runner.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 this.dependencies = {};\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.97.3\";\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 // todo: performance? cache regexp?\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, dependency) {\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 let found = this.findOrCreate(f.getObjectName(), f.getObjectType());\n if (dependency === false && found && this.isDependency(found)) {\n this.removeDependency(found);\n found = this.findOrCreate(f.getObjectName(), f.getObjectType());\n }\n found.addFile(f);\n }\n return this;\n }\n addFiles(files) {\n this._addFiles(files, false);\n return this;\n }\n addDependencies(files) {\n for (const f of files) {\n this.addDependency(f);\n }\n return this;\n }\n addDependency(file) {\n var _a;\n const type = (_a = file.getObjectType()) === null || _a === void 0 ? void 0 : _a.toUpperCase();\n if (type === undefined) {\n return this;\n }\n const name = file.getObjectName().toUpperCase();\n if (this.dependencies[type] === undefined) {\n this.dependencies[type] = {};\n }\n this.dependencies[type][name] = true;\n this._addFiles([file], true);\n return this;\n }\n removeDependency(obj) {\n var _a;\n (_a = this.dependencies[obj.getType()]) === null || _a === void 0 ? true : delete _a[obj.getName()];\n this.removeObject(obj);\n }\n isDependency(obj) {\n var _a;\n return ((_a = this.dependencies[obj.getType()]) === null || _a === void 0 ? void 0 : _a[obj.getName()]) === true;\n }\n isFileDependency(filename) {\n var _a, _b;\n const f = this.getFileByName(filename);\n if (f === undefined) {\n return false;\n }\n const type = (_a = f.getObjectType()) === null || _a === void 0 ? void 0 : _a.toUpperCase();\n if (type === undefined) {\n return false;\n }\n const name = f.getObjectName().toUpperCase();\n return ((_b = this.dependencies[type]) === null || _b === void 0 ? void 0 : _b[name]) === 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 new rules_runner_1.RulesRunner(this).runRules(this.getObjects(), 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 new rules_runner_1.RulesRunner(this).runRules([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 for (const o of this.getObjects()) {\n this.parsePrivate(o);\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 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 }\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, this);\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 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/cli/./node_modules/@abaplint/core/build/src/registry.js?");
11833
+ 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 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 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\");\nconst rules_runner_1 = __webpack_require__(/*! ./rules_runner */ \"./node_modules/@abaplint/core/build/src/rules_runner.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 this.dependencies = {};\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.97.5\";\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 // todo: performance? cache regexp?\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, dependency) {\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 let found = this.findOrCreate(f.getObjectName(), f.getObjectType());\n if (dependency === false && found && this.isDependency(found)) {\n this.removeDependency(found);\n found = this.findOrCreate(f.getObjectName(), f.getObjectType());\n }\n found.addFile(f);\n }\n return this;\n }\n addFiles(files) {\n this._addFiles(files, false);\n return this;\n }\n addDependencies(files) {\n for (const f of files) {\n this.addDependency(f);\n }\n return this;\n }\n addDependency(file) {\n var _a;\n const type = (_a = file.getObjectType()) === null || _a === void 0 ? void 0 : _a.toUpperCase();\n if (type === undefined) {\n return this;\n }\n const name = file.getObjectName().toUpperCase();\n if (this.dependencies[type] === undefined) {\n this.dependencies[type] = {};\n }\n this.dependencies[type][name] = true;\n this._addFiles([file], true);\n return this;\n }\n removeDependency(obj) {\n var _a;\n (_a = this.dependencies[obj.getType()]) === null || _a === void 0 ? true : delete _a[obj.getName()];\n this.removeObject(obj);\n }\n isDependency(obj) {\n var _a;\n return ((_a = this.dependencies[obj.getType()]) === null || _a === void 0 ? void 0 : _a[obj.getName()]) === true;\n }\n isFileDependency(filename) {\n var _a, _b;\n const f = this.getFileByName(filename);\n if (f === undefined) {\n return false;\n }\n const type = (_a = f.getObjectType()) === null || _a === void 0 ? void 0 : _a.toUpperCase();\n if (type === undefined) {\n return false;\n }\n const name = f.getObjectName().toUpperCase();\n return ((_b = this.dependencies[type]) === null || _b === void 0 ? void 0 : _b[name]) === 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 new rules_runner_1.RulesRunner(this).runRules(this.getObjects(), 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 new rules_runner_1.RulesRunner(this).runRules([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 for (const o of this.getObjects()) {\n this.parsePrivate(o);\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 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 }\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, this);\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 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/cli/./node_modules/@abaplint/core/build/src/registry.js?");
11845
11834
 
11846
11835
  /***/ }),
11847
11836
 
@@ -13282,7 +13271,7 @@ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexpo
13282
13271
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
13283
13272
 
13284
13273
  "use strict";
13285
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.SQLEscapeHostVariables = exports.SQLEscapeHostVariablesConf = void 0;\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\nconst Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\nconst _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ \"./node_modules/@abaplint/core/build/src/rules/_abap_rule.js\");\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\nconst version_1 = __webpack_require__(/*! ../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\nconst edit_helper_1 = __webpack_require__(/*! ../edit_helper */ \"./node_modules/@abaplint/core/build/src/edit_helper.js\");\nclass SQLEscapeHostVariablesConf extends _basic_rule_config_1.BasicRuleConfig {\n}\nexports.SQLEscapeHostVariablesConf = SQLEscapeHostVariablesConf;\nclass SQLEscapeHostVariables extends _abap_rule_1.ABAPRule {\n constructor() {\n super(...arguments);\n this.conf = new SQLEscapeHostVariablesConf();\n }\n getMetadata() {\n return {\n key: \"sql_escape_host_variables\",\n title: \"Escape SQL host variables\",\n shortDescription: `Escape SQL host variables, from 740sp05`,\n extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obsolete-language-elements`,\n tags: [_irule_1.RuleTag.Upport, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Syntax],\n badExample: `SELECT * FROM tab INTO TABLE res WHERE field = val.`,\n goodExample: `SELECT * FROM tab INTO TABLE @res WHERE field = @val.`,\n };\n }\n getConfig() {\n return this.conf;\n }\n setConfig(conf) {\n this.conf = conf;\n }\n runParsed(file, obj) {\n const issues = [];\n const type = obj.getType();\n if (type === \"INTF\" || type === \"TYPE\") {\n return [];\n }\n if (this.reg.getConfig().getVersion() < version_1.Version.v740sp02\n && this.reg.getConfig().getVersion() !== version_1.Version.Cloud) {\n return [];\n }\n for (const s of file.getStatements()) {\n if (s.get() instanceof Statements.UpdateDatabase\n || s.get() instanceof Statements.ModifyDatabase\n || s.get() instanceof Statements.Select\n || s.get() instanceof Statements.SelectLoop\n || s.get() instanceof Statements.InsertDatabase\n || s.get() instanceof Statements.DeleteDatabase) {\n for (const o of s.findAllExpressions(Expressions.SQLSource)) {\n const first = o.getFirstChild();\n if (((first === null || first === void 0 ? void 0 : first.get()) instanceof Expressions.Source && first.getChildren()[0].get() instanceof Expressions.FieldChain)\n || ((first === null || first === void 0 ? void 0 : first.get()) instanceof Expressions.SimpleSource3 && first.getChildren()[0].get() instanceof Expressions.FieldChain)) {\n const message = \"Escape SQL host variables\";\n const firstToken = o.getFirstChild().getFirstToken();\n const fix = edit_helper_1.EditHelper.replaceToken(file, firstToken, \"@\" + (firstToken === null || firstToken === void 0 ? void 0 : firstToken.getStr()));\n const issue = issue_1.Issue.atToken(file, first.getFirstToken(), message, this.getMetadata().key, this.conf.severity, fix);\n issues.push(issue);\n break;\n }\n }\n for (const o of s.findAllExpressions(Expressions.SQLTarget)) {\n const escaped = o.findDirectTokenByText(\"@\");\n if (escaped !== undefined) {\n continue;\n }\n const message = \"Escape SQL host variables\";\n const firstToken = o.getFirstChild().getFirstToken();\n const fix = edit_helper_1.EditHelper.replaceToken(file, firstToken, \"@\" + (firstToken === null || firstToken === void 0 ? void 0 : firstToken.getStr()));\n const issue = issue_1.Issue.atToken(file, o.getFirstToken(), message, this.getMetadata().key, this.conf.severity, fix);\n issues.push(issue);\n break;\n }\n }\n }\n return issues;\n }\n}\nexports.SQLEscapeHostVariables = SQLEscapeHostVariables;\n//# sourceMappingURL=sql_escape_host_variables.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/rules/sql_escape_host_variables.js?");
13274
+ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.SQLEscapeHostVariables = exports.SQLEscapeHostVariablesConf = void 0;\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\nconst Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\nconst _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ \"./node_modules/@abaplint/core/build/src/rules/_abap_rule.js\");\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\nconst version_1 = __webpack_require__(/*! ../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\nconst edit_helper_1 = __webpack_require__(/*! ../edit_helper */ \"./node_modules/@abaplint/core/build/src/edit_helper.js\");\nclass SQLEscapeHostVariablesConf extends _basic_rule_config_1.BasicRuleConfig {\n}\nexports.SQLEscapeHostVariablesConf = SQLEscapeHostVariablesConf;\nclass SQLEscapeHostVariables extends _abap_rule_1.ABAPRule {\n constructor() {\n super(...arguments);\n this.conf = new SQLEscapeHostVariablesConf();\n }\n getMetadata() {\n return {\n key: \"sql_escape_host_variables\",\n title: \"Escape SQL host variables\",\n shortDescription: `Escape SQL host variables, from 740sp05`,\n extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obsolete-language-elements`,\n tags: [_irule_1.RuleTag.Upport, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Syntax],\n badExample: `SELECT * FROM tab INTO TABLE res WHERE field = val.`,\n goodExample: `SELECT * FROM tab INTO TABLE @res WHERE field = @val.`,\n };\n }\n getConfig() {\n return this.conf;\n }\n setConfig(conf) {\n this.conf = conf;\n }\n runParsed(file, obj) {\n const issues = [];\n const type = obj.getType();\n if (type === \"INTF\" || type === \"TYPE\") {\n return [];\n }\n if (this.reg.getConfig().getVersion() < version_1.Version.v740sp02\n && this.reg.getConfig().getVersion() !== version_1.Version.Cloud) {\n return [];\n }\n for (const s of file.getStatements()) {\n if (s.get() instanceof Statements.UpdateDatabase\n || s.get() instanceof Statements.ModifyDatabase\n || s.get() instanceof Statements.Select\n || s.get() instanceof Statements.SelectLoop\n || s.get() instanceof Statements.InsertDatabase\n || s.get() instanceof Statements.DeleteDatabase) {\n for (const o of s.findAllExpressionsMulti([Expressions.SQLSource, Expressions.SQLSourceSimple])) {\n const first = o.getFirstChild();\n if (((first === null || first === void 0 ? void 0 : first.get()) instanceof Expressions.Source && first.getChildren()[0].get() instanceof Expressions.FieldChain)\n || ((first === null || first === void 0 ? void 0 : first.get()) instanceof Expressions.SimpleSource3 && first.getChildren()[0].get() instanceof Expressions.FieldChain)) {\n const message = \"Escape SQL host variables\";\n const firstToken = o.getFirstChild().getFirstToken();\n const fix = edit_helper_1.EditHelper.replaceToken(file, firstToken, \"@\" + (firstToken === null || firstToken === void 0 ? void 0 : firstToken.getStr()));\n const issue = issue_1.Issue.atToken(file, first.getFirstToken(), message, this.getMetadata().key, this.conf.severity, fix);\n issues.push(issue);\n break;\n }\n }\n for (const o of s.findAllExpressions(Expressions.SQLTarget)) {\n const escaped = o.findDirectTokenByText(\"@\");\n if (escaped !== undefined) {\n continue;\n }\n const message = \"Escape SQL host variables\";\n const firstToken = o.getFirstChild().getFirstToken();\n const fix = edit_helper_1.EditHelper.replaceToken(file, firstToken, \"@\" + (firstToken === null || firstToken === void 0 ? void 0 : firstToken.getStr()));\n const issue = issue_1.Issue.atToken(file, o.getFirstToken(), message, this.getMetadata().key, this.conf.severity, fix);\n issues.push(issue);\n break;\n }\n }\n }\n return issues;\n }\n}\nexports.SQLEscapeHostVariables = SQLEscapeHostVariables;\n//# sourceMappingURL=sql_escape_host_variables.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/rules/sql_escape_host_variables.js?");
13286
13275
 
13287
13276
  /***/ }),
13288
13277
 
@@ -13315,7 +13304,7 @@ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexpo
13315
13304
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
13316
13305
 
13317
13306
  "use strict";
13318
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.StrictSQL = exports.StrictSQLConf = void 0;\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\nconst Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\nconst _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ \"./node_modules/@abaplint/core/build/src/rules/_abap_rule.js\");\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\nconst version_1 = __webpack_require__(/*! ../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\nconst edit_helper_1 = __webpack_require__(/*! ../edit_helper */ \"./node_modules/@abaplint/core/build/src/edit_helper.js\");\nclass StrictSQLConf extends _basic_rule_config_1.BasicRuleConfig {\n}\nexports.StrictSQLConf = StrictSQLConf;\nclass StrictSQL extends _abap_rule_1.ABAPRule {\n constructor() {\n super(...arguments);\n this.conf = new StrictSQLConf();\n }\n getMetadata() {\n return {\n key: \"strict_sql\",\n title: \"Strict SQL\",\n shortDescription: `Strict SQL`,\n extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapinto_clause.htm\r\n\r\nhttps://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abenopensql_strict_mode_750.htm\r\n\r\nAlso see separate rule sql_escape_host_variables\r\n\r\nActivates from v750 and up`,\n tags: [_irule_1.RuleTag.Upport, _irule_1.RuleTag.Syntax, _irule_1.RuleTag.Quickfix],\n };\n }\n getConfig() {\n return this.conf;\n }\n setConfig(conf) {\n this.conf = conf;\n }\n runParsed(file, obj) {\n const issues = [];\n const type = obj.getType();\n if (type === \"INTF\" || type === \"TYPE\") {\n return [];\n }\n if (this.reg.getConfig().getVersion() < version_1.Version.v750\n && this.reg.getConfig().getVersion() !== version_1.Version.Cloud) {\n return [];\n }\n for (const s of file.getStatements()) {\n if (s.get() instanceof Statements.Select\n || s.get() instanceof Statements.SelectLoop) {\n const expr = s.findDirectExpression(Expressions.Select);\n const where = expr === null || expr === void 0 ? void 0 : expr.findDirectExpression(Expressions.SQLCond);\n const into = (expr === null || expr === void 0 ? void 0 : expr.findDirectExpression(Expressions.SQLIntoStructure))\n || (expr === null || expr === void 0 ? void 0 : expr.findDirectExpression(Expressions.SQLIntoTable));\n if (into === undefined || where === undefined) {\n continue;\n }\n else if (where.getFirstToken().getStart().isBefore(into.getFirstToken().getStart())) {\n continue;\n }\n const fix1 = edit_helper_1.EditHelper.deleteRange(file, into.getFirstToken().getStart(), into.getLastToken().getEnd());\n const whereLast = where.getLastToken();\n const fix2 = edit_helper_1.EditHelper.insertAt(file, whereLast.getEnd(), \" \" + into.concatTokens());\n const fix = edit_helper_1.EditHelper.merge(fix2, fix1);\n const message = \"INTO/APPENDING must be last in strict SQL\";\n const issue = issue_1.Issue.atToken(file, s.getFirstToken(), message, this.getMetadata().key, this.conf.severity, fix);\n issues.push(issue);\n break;\n }\n }\n return issues;\n }\n}\nexports.StrictSQL = StrictSQL;\n//# sourceMappingURL=strict_sql.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/rules/strict_sql.js?");
13307
+ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.StrictSQL = exports.StrictSQLConf = void 0;\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\nconst Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\nconst _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ \"./node_modules/@abaplint/core/build/src/rules/_abap_rule.js\");\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\nconst version_1 = __webpack_require__(/*! ../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\nconst edit_helper_1 = __webpack_require__(/*! ../edit_helper */ \"./node_modules/@abaplint/core/build/src/edit_helper.js\");\nclass StrictSQLConf extends _basic_rule_config_1.BasicRuleConfig {\n}\nexports.StrictSQLConf = StrictSQLConf;\nclass StrictSQL extends _abap_rule_1.ABAPRule {\n constructor() {\n super(...arguments);\n this.conf = new StrictSQLConf();\n }\n getMetadata() {\n return {\n key: \"strict_sql\",\n title: \"Strict SQL\",\n shortDescription: `Strict SQL`,\n extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapinto_clause.htm\r\n\r\nhttps://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abenopensql_strict_mode_750.htm\r\n\r\nAlso see separate rule sql_escape_host_variables\r\n\r\nActivates from v750 and up`,\n tags: [_irule_1.RuleTag.Upport, _irule_1.RuleTag.Syntax, _irule_1.RuleTag.Quickfix],\n };\n }\n getConfig() {\n return this.conf;\n }\n setConfig(conf) {\n this.conf = conf;\n }\n runParsed(file, obj) {\n const issues = [];\n const type = obj.getType();\n if (type === \"INTF\" || type === \"TYPE\") {\n return [];\n }\n if (this.reg.getConfig().getVersion() < version_1.Version.v750\n && this.reg.getConfig().getVersion() !== version_1.Version.Cloud) {\n return [];\n }\n for (const s of file.getStatements()) {\n if (s.get() instanceof Statements.Select\n || s.get() instanceof Statements.SelectLoop) {\n const expr = s.findDirectExpression(Expressions.Select);\n const where = expr === null || expr === void 0 ? void 0 : expr.findDirectExpression(Expressions.SQLCond);\n const order = expr === null || expr === void 0 ? void 0 : expr.findDirectExpression(Expressions.SQLOrderBy);\n const into = (expr === null || expr === void 0 ? void 0 : expr.findDirectExpression(Expressions.SQLIntoStructure))\n || (expr === null || expr === void 0 ? void 0 : expr.findDirectExpression(Expressions.SQLIntoTable));\n if (into === undefined || where === undefined) {\n continue;\n }\n else if (where.getFirstToken().getStart().isBefore(into.getFirstToken().getStart())) {\n continue;\n }\n const fix1 = edit_helper_1.EditHelper.deleteRange(file, into.getFirstToken().getStart(), into.getLastToken().getEnd());\n let last = where.getLastToken();\n if (order && order.getLastToken().getEnd().isAfter(last.getEnd())) {\n last = order.getLastToken();\n }\n const fix2 = edit_helper_1.EditHelper.insertAt(file, last.getEnd(), \" \" + into.concatTokens());\n const fix = edit_helper_1.EditHelper.merge(fix2, fix1);\n const message = \"INTO/APPENDING must be last in strict SQL\";\n const issue = issue_1.Issue.atToken(file, s.getFirstToken(), message, this.getMetadata().key, this.conf.severity, fix);\n issues.push(issue);\n break;\n }\n }\n return issues;\n }\n}\nexports.StrictSQL = StrictSQL;\n//# sourceMappingURL=strict_sql.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/rules/strict_sql.js?");
13319
13308
 
13320
13309
  /***/ }),
13321
13310
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/cli",
3
- "version": "2.97.3",
3
+ "version": "2.97.5",
4
4
  "description": "abaplint - Command Line Interface",
5
5
  "bin": {
6
6
  "abaplint": "./abaplint"
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "homepage": "https://abaplint.org",
39
39
  "devDependencies": {
40
- "@abaplint/core": "^2.97.3",
40
+ "@abaplint/core": "^2.97.5",
41
41
  "@types/chai": "^4.3.4",
42
42
  "@types/glob": "^7.2.0",
43
43
  "@types/minimist": "^1.2.2",