@abaplint/cli 2.95.24 → 2.95.25
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.
- package/build/cli.js +5 -5
- package/package.json +2 -2
package/build/cli.js
CHANGED
|
@@ -1292,7 +1292,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
|
|
|
1292
1292
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
1293
1293
|
|
|
1294
1294
|
"use strict";
|
|
1295
|
-
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.InlineData = void 0;\r\nconst combi_1 = __webpack_require__(/*! ../combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\r\nconst tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nconst _1 = __webpack_require__(/*! . */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst version_1 = __webpack_require__(/*! ../../../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\r\nclass InlineData extends combi_1.Expression {\r\n getRunnable() {\r\n const right = (0, combi_1.altPrio)((0, combi_1.tok)(tokens_1.ParenRightW), (0, combi_1.tok)(tokens_1.ParenRight));\r\n const left = (0, combi_1.tok)(tokens_1.ParenLeft);\r\n const data = (0, combi_1.seq)(\"DATA\", left, _1.TargetField, right);\r\n return (0, combi_1.ver)(version_1.Version.v740sp02, data);\r\n }\r\n}\r\nexports.InlineData = InlineData;\r\n//# sourceMappingURL=inlinedata.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/inlinedata.js?");
|
|
1295
|
+
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.InlineData = void 0;\r\nconst combi_1 = __webpack_require__(/*! ../combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\r\nconst tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nconst _1 = __webpack_require__(/*! . */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst version_1 = __webpack_require__(/*! ../../../version */ \"./node_modules/@abaplint/core/build/src/version.js\");\r\nclass InlineData extends combi_1.Expression {\r\n getRunnable() {\r\n const right = (0, combi_1.altPrio)((0, combi_1.tok)(tokens_1.ParenRightW), (0, combi_1.tok)(tokens_1.ParenRight));\r\n const left = (0, combi_1.tok)(tokens_1.ParenLeft);\r\n const data = (0, combi_1.seq)(\"DATA\", left, _1.TargetField, right);\r\n const final = (0, combi_1.seq)(\"FINAL\", left, _1.TargetField, right);\r\n return (0, combi_1.altPrio)((0, combi_1.ver)(version_1.Version.v740sp02, data), (0, combi_1.ver)(version_1.Version.v757, final));\r\n }\r\n}\r\nexports.InlineData = InlineData;\r\n//# sourceMappingURL=inlinedata.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/inlinedata.js?");
|
|
1296
1296
|
|
|
1297
1297
|
/***/ }),
|
|
1298
1298
|
|
|
@@ -4372,7 +4372,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
|
|
|
4372
4372
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
4373
4373
|
|
|
4374
4374
|
"use strict";
|
|
4375
|
-
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Import = void 0;\r\nconst combi_1 = __webpack_require__(/*! ../combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\r\nconst tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nconst expressions_1 = __webpack_require__(/*! ../expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\
|
|
4375
|
+
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Import = void 0;\r\nconst combi_1 = __webpack_require__(/*! ../combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\r\nconst tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nconst expressions_1 = __webpack_require__(/*! ../expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nclass Import {\r\n getMatcher() {\r\n const dto = (0, combi_1.seq)(\"TO\", expressions_1.Target);\r\n const client = (0, combi_1.seq)(\"CLIENT\", expressions_1.Source);\r\n const id = (0, combi_1.seq)(\"ID\", expressions_1.Source);\r\n const using = (0, combi_1.seq)(\"USING\", expressions_1.Source);\r\n const cluster = (0, combi_1.seq)(expressions_1.NamespaceSimpleName, (0, combi_1.tok)(tokens_1.ParenLeft), (0, combi_1.regex)(/^[\\w$%\\^]{2}$/), (0, combi_1.tok)(tokens_1.ParenRightW));\r\n const buffer = (0, combi_1.seq)(\"DATA BUFFER\", expressions_1.Source);\r\n const memory = (0, combi_1.seq)(\"MEMORY ID\", expressions_1.Source);\r\n const table = (0, combi_1.seq)(\"INTERNAL TABLE\", expressions_1.Source);\r\n const shared = (0, combi_1.seq)((0, combi_1.alt)(\"SHARED MEMORY\", \"SHARED BUFFER\"), cluster, (0, combi_1.per)(dto, client, id));\r\n const database = (0, combi_1.seq)(\"DATABASE\", cluster, (0, combi_1.per)(dto, client, id, using));\r\n const source = (0, combi_1.alt)(buffer, memory, database, table, shared);\r\n const to = (0, combi_1.plus)((0, combi_1.seq)(expressions_1.ComponentChainSimple, (0, combi_1.alt)(\"TO\", \"INTO\"), expressions_1.Target));\r\n const toeq = (0, combi_1.plus)((0, combi_1.seq)((0, combi_1.alt)(expressions_1.ComponentChainSimple, expressions_1.FieldSymbol), \"=\", expressions_1.Target));\r\n const target = (0, combi_1.alt)(toeq, to, expressions_1.Dynamic, (0, combi_1.plus)(expressions_1.Target));\r\n const options = (0, combi_1.per)(\"ACCEPTING PADDING\", \"IGNORING CONVERSION ERRORS\", \"IN CHAR-TO-HEX MODE\", \"IGNORING STRUCTURE BOUNDARIES\", \"ACCEPTING TRUNCATION\", (0, combi_1.seq)(\"REPLACEMENT CHARACTER\", expressions_1.Source), (0, combi_1.seq)(\"CODE PAGE INTO\", expressions_1.Source), (0, combi_1.seq)(\"ENDIAN INTO\", expressions_1.Source));\r\n const ret = (0, combi_1.seq)(\"IMPORT\", target, \"FROM\", source, (0, combi_1.opt)(options));\r\n return ret;\r\n }\r\n}\r\nexports.Import = Import;\r\n//# sourceMappingURL=import.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/2_statements/statements/import.js?");
|
|
4376
4376
|
|
|
4377
4377
|
/***/ }),
|
|
4378
4378
|
|
|
@@ -6814,7 +6814,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
|
|
|
6814
6814
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
6815
6815
|
|
|
6816
6816
|
"use strict";
|
|
6817
|
-
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.ComponentCompare = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst basic_1 = __webpack_require__(/*! ../../types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst source_1 = __webpack_require__(/*! ./source */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source.js\");\r\nclass ComponentCompare {\r\n runSyntax(node, scope, filename, type) {\r\n const chain = node.findDirectExpression(Expressions.ComponentChainSimple);\r\n if (chain === undefined) {\r\n throw new Error(\"ComponentCompare, chain not found\");\r\n }\r\n // todo, handle deep chain\r\n if (chain.getChildren().length === 1\r\n && type !== undefined\r\n && !(type instanceof basic_1.VoidType)\r\n && !(type instanceof basic_1.UnknownType)\r\n && !(type instanceof basic_1.AnyType)) {\r\n const fieldName = chain.concatTokens();\r\n if (fieldName.toLowerCase() !== \"table_line\") {\r\n if (!(type instanceof basic_1.StructureType)) {\r\n throw new Error(\"ComponentCompare, source not structured\");\r\n }\r\n if (type.getComponentByName(fieldName) === undefined) {\r\n throw new Error(\"Component \" + fieldName + \" not part of structure\");\r\n }\r\n // todo, check type compatibility\r\n }\r\n }\r\n for (const s of node.findDirectExpressions(Expressions.Source)) {\r\n new source_1.Source().runSyntax(s, scope, filename);\r\n }\r\n }\r\n}\r\nexports.ComponentCompare = ComponentCompare;\r\n//# sourceMappingURL=component_compare.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/component_compare.js?");
|
|
6817
|
+
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.ComponentCompare = void 0;\r\nconst Expressions = __webpack_require__(/*! ../../2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst basic_1 = __webpack_require__(/*! ../../types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst source_1 = __webpack_require__(/*! ./source */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source.js\");\r\nclass ComponentCompare {\r\n runSyntax(node, scope, filename, type) {\r\n const chain = node.findDirectExpression(Expressions.ComponentChainSimple);\r\n if (chain === undefined) {\r\n throw new Error(\"ComponentCompare, chain not found\");\r\n }\r\n // todo, handle deep chain\r\n if (chain.getChildren().length === 1\r\n && type !== undefined\r\n && !(type instanceof basic_1.VoidType)\r\n && !(type instanceof basic_1.UnknownType)\r\n && !(type instanceof basic_1.AnyType)) {\r\n const fieldName = chain.concatTokens();\r\n if (fieldName.toLowerCase() !== \"table_line\") {\r\n if (!(type instanceof basic_1.StructureType)) {\r\n throw new Error(\"ComponentCompare, source not structured\");\r\n }\r\n if (type.getComponentByName(fieldName) === undefined) {\r\n throw new Error(\"Component \\\"\" + fieldName + \"\\\" not part of structure\");\r\n }\r\n // todo, check type compatibility\r\n }\r\n }\r\n for (const s of node.findDirectExpressions(Expressions.Source)) {\r\n new source_1.Source().runSyntax(s, scope, filename);\r\n }\r\n }\r\n}\r\nexports.ComponentCompare = ComponentCompare;\r\n//# sourceMappingURL=component_compare.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/component_compare.js?");
|
|
6818
6818
|
|
|
6819
6819
|
/***/ }),
|
|
6820
6820
|
|
|
@@ -11797,7 +11797,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
|
|
|
11797
11797
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
11798
11798
|
|
|
11799
11799
|
"use strict";
|
|
11800
|
-
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.95.24\";\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?");
|
|
11800
|
+
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.95.25\";\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?");
|
|
11801
11801
|
|
|
11802
11802
|
/***/ }),
|
|
11803
11803
|
|
|
@@ -13337,7 +13337,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
|
|
|
13337
13337
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
13338
13338
|
|
|
13339
13339
|
"use strict";
|
|
13340
|
-
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.UncaughtException = exports.UncaughtExceptionConf = void 0;\r\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\r\nconst _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ \"./node_modules/@abaplint/core/build/src/rules/_abap_rule.js\");\r\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\r\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst Structures = __webpack_require__(/*! ../abap/3_structures/structures */ \"./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js\");\r\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\r\nconst nodes_1 = __webpack_require__(/*! ../abap/nodes */ \"./node_modules/@abaplint/core/build/src/abap/nodes/index.js\");\r\nconst objects_1 = __webpack_require__(/*! ../objects */ \"./node_modules/@abaplint/core/build/src/objects/index.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nconst syntax_1 = __webpack_require__(/*! ../abap/5_syntax/syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\r\nconst _reference_1 = __webpack_require__(/*! ../abap/5_syntax/_reference */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js\");\r\nconst types_1 = __webpack_require__(/*! ../abap/types */ \"./node_modules/@abaplint/core/build/src/abap/types/index.js\");\r\nclass UncaughtExceptionConf extends _basic_rule_config_1.BasicRuleConfig {\r\n}\r\nexports.UncaughtExceptionConf = UncaughtExceptionConf;\r\nclass UncaughtException extends _abap_rule_1.ABAPRule {\r\n constructor() {\r\n super(...arguments);\r\n this.conf = new UncaughtExceptionConf();\r\n this.issues = [];\r\n }\r\n getMetadata() {\r\n return {\r\n key: \"uncaught_exception\",\r\n title: \"Uncaught Exception\",\r\n shortDescription: `Checks for uncaught static exception`,\r\n extendedInformation: `Does not report any issues if the code contains syntax errors`,\r\n tags: [_irule_1.RuleTag.Syntax],\r\n };\r\n }\r\n getConfig() {\r\n return this.conf;\r\n }\r\n initialize(reg) {\r\n super.initialize(reg);\r\n this.findGlobalExceptions();\r\n return this;\r\n }\r\n setConfig(conf) {\r\n this.conf = conf;\r\n }\r\n runParsed(file, obj) {\r\n if (obj.getType() === \"INTF\") { // nothing can be raised in interfaces\r\n return [];\r\n }\r\n if (obj instanceof objects_1.Program && obj.isInclude() === true) {\r\n return [];\r\n }\r\n const stru = file.getStructure();\r\n if (stru === undefined) {\r\n return [];\r\n }\r\n this.syntax = new syntax_1.SyntaxLogic(this.reg, obj).run();\r\n if (this.syntax.issues.length > 0) {\r\n return [];\r\n }\r\n this.issues = [];\r\n this.sinked = undefined;\r\n for (const c of stru.getChildren()) {\r\n this.traverse(c, file);\r\n }\r\n return this.issues;\r\n }\r\n traverse(n, file) {\r\n var _a;\r\n const get = n.get();\r\n if (get instanceof Structures.ClassDefinition\r\n || get instanceof Structures.Interface) {\r\n return; // to optimize performance\r\n }\r\n if (n instanceof nodes_1.StructureNode) {\r\n if (get instanceof Structures.Try) {\r\n // note that TRY-CATCH might be arbitrarily nested\r\n const previous = this.sinked ? this.sinked.slice() : undefined;\r\n this.addFromTryStructure(n);\r\n for (const c of n.getChildren()) {\r\n this.traverse(c, file);\r\n }\r\n this.sinked = previous;\r\n return;\r\n }\r\n else {\r\n for (const c of n.getChildren()) {\r\n this.traverse(c, file);\r\n }\r\n }\r\n }\r\n else if (n instanceof nodes_1.StatementNode) {\r\n if (get instanceof Statements.MethodImplementation) {\r\n this.setSinkedFromMethod(n, file);\r\n }\r\n else if (get instanceof Statements.EndMethod) {\r\n this.sinked = undefined; // back to top level\r\n }\r\n else if (get instanceof Statements.Form) {\r\n this.sinked = [];\r\n const raising = n.findDirectExpression(Expressions.FormRaising);\r\n for (const c of (raising === null || raising === void 0 ? void 0 : raising.findAllExpressions(Expressions.ClassName)) || []) {\r\n this.sinked.push(c.concatTokens().toUpperCase());\r\n }\r\n }\r\n else if (get instanceof Statements.EndForm) {\r\n this.sinked = undefined; // back to top level\r\n }\r\n else if (get instanceof Statements.Raise) {\r\n let name = undefined;\r\n const concat = n.concatTokens().toUpperCase();\r\n if (concat.startsWith(\"RAISE EXCEPTION TYPE \")) {\r\n name = (_a = n.findFirstExpression(Expressions.ClassName)) === null || _a === void 0 ? void 0 : _a.getFirstToken().getStr().toUpperCase();\r\n }\r\n this.check(name, n, file);\r\n }\r\n else if (get instanceof Statements.Perform) {\r\n // todo, PERFORM, or is this not statically checked?\r\n }\r\n else {\r\n this.checkForMethodCalls(n, file);\r\n }\r\n }\r\n }\r\n ////////////////////////////////\r\n check(name, n, file) {\r\n if (this.isSinked(name) === false) {\r\n const issue = issue_1.Issue.atStatement(file, n, \"Uncaught exception \" + name, this.getMetadata().key, this.getConfig().severity);\r\n this.issues.push(issue);\r\n }\r\n }\r\n checkForMethodCalls(n, file) {\r\n const start = n.getFirstToken().getStart();\r\n const end = n.getLastToken().getEnd();\r\n const scope = this.syntax.spaghetti.lookupPosition(start, file.getFilename());\r\n for (const r of (scope === null || scope === void 0 ? void 0 : scope.getData().references) || []) {\r\n if (r.referenceType === _reference_1.ReferenceType.MethodReference\r\n && r.position.getStart().isAfter(start)\r\n && r.position.getEnd().isBefore(end)\r\n && r.resolved instanceof types_1.MethodDefinition) {\r\n for (const name of r.resolved.getRaising()) {\r\n this.check(name, n, file);\r\n }\r\n }\r\n }\r\n }\r\n addFromTryStructure(s) {\r\n if (this.sinked === undefined) {\r\n return;\r\n }\r\n for (const structure of s.findDirectStructures(Structures.Catch)) {\r\n const c = structure.findDirectStatement(Statements.Catch);\r\n if (c === undefined) {\r\n continue;\r\n }\r\n for (const cn of c.findDirectExpressions(Expressions.ClassName)) {\r\n this.sinked.push(cn.concatTokens());\r\n }\r\n }\r\n }\r\n setSinkedFromMethod(s, file) {\r\n this.sinked = [];\r\n const scope = this.syntax.spaghetti.lookupPosition(s.getLastToken().getEnd(), file.getFilename());\r\n let def = undefined;\r\n for (const r of (scope === null || scope === void 0 ? void 0 : scope.getData().references) || []) {\r\n // there should be only one, so the first is okay\r\n if (r.referenceType === _reference_1.ReferenceType.MethodImplementationReference\r\n && r.resolved instanceof types_1.MethodDefinition) {\r\n def = r.resolved;\r\n break;\r\n }\r\n }\r\n if (def === undefined) {\r\n return; // this should not occur, so just report everything as errors\r\n }\r\n def.getRaising().forEach(r => { var _a; return (_a = this.sinked) === null || _a === void 0 ? void 0 : _a.push(r); });\r\n }\r\n isSinked(name) {\r\n // todo: ignore dynamic and no_check exceptions\r\n if (this.sinked === undefined || name === undefined) {\r\n return true;\r\n }\r\n const sup = this.globalExceptions[name.toUpperCase()];\r\n if (sup === \"CX_DYNAMIC_CHECK\" || sup === \"CX_NO_CHECK\") {\r\n return true;\r\n }\r\n // todo, check local class hierarchy\r\n return this.sinked.some(a => a.toUpperCase() === name.toUpperCase())\r\n || (sup !== undefined && this.isSinked(sup) === true);\r\n }\r\n findGlobalExceptions() {\r\n var _a, _b;\r\n this.globalExceptions = {};\r\n const ddic = new ddic_1.DDIC(this.reg);\r\n for (const o of this.reg.getObjects()) {\r\n if (!(o instanceof objects_1.Class)) {\r\n continue;\r\n }\r\n const def = (_a = o.getMainABAPFile()) === null || _a === void 0 ? void 0 : _a.getInfo().getClassDefinitionByName(o.getName());\r\n if (def === undefined || ddic.isException(def, o) === false) {\r\n continue;\r\n }\r\n this.globalExceptions[o.getName().toUpperCase()] = (_b = def.superClassName) === null || _b === void 0 ? void 0 : _b.toUpperCase();\r\n }\r\n }\r\n}\r\nexports.UncaughtException = UncaughtException;\r\n//# sourceMappingURL=uncaught_exception.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/rules/uncaught_exception.js?");
|
|
13340
|
+
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.UncaughtException = exports.UncaughtExceptionConf = void 0;\r\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\r\nconst _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ \"./node_modules/@abaplint/core/build/src/rules/_abap_rule.js\");\r\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\r\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst Structures = __webpack_require__(/*! ../abap/3_structures/structures */ \"./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js\");\r\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\r\nconst nodes_1 = __webpack_require__(/*! ../abap/nodes */ \"./node_modules/@abaplint/core/build/src/abap/nodes/index.js\");\r\nconst objects_1 = __webpack_require__(/*! ../objects */ \"./node_modules/@abaplint/core/build/src/objects/index.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nconst syntax_1 = __webpack_require__(/*! ../abap/5_syntax/syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\r\nconst _reference_1 = __webpack_require__(/*! ../abap/5_syntax/_reference */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js\");\r\nconst types_1 = __webpack_require__(/*! ../abap/types */ \"./node_modules/@abaplint/core/build/src/abap/types/index.js\");\r\nclass UncaughtExceptionConf extends _basic_rule_config_1.BasicRuleConfig {\r\n}\r\nexports.UncaughtExceptionConf = UncaughtExceptionConf;\r\nclass UncaughtException extends _abap_rule_1.ABAPRule {\r\n constructor() {\r\n super(...arguments);\r\n this.conf = new UncaughtExceptionConf();\r\n this.issues = [];\r\n }\r\n getMetadata() {\r\n return {\r\n key: \"uncaught_exception\",\r\n title: \"Uncaught Exception\",\r\n shortDescription: `Checks for uncaught static exception`,\r\n extendedInformation: `Does not report any issues if the code contains syntax errors`,\r\n tags: [_irule_1.RuleTag.Syntax],\r\n };\r\n }\r\n getConfig() {\r\n return this.conf;\r\n }\r\n initialize(reg) {\r\n super.initialize(reg);\r\n this.findGlobalExceptions();\r\n return this;\r\n }\r\n setConfig(conf) {\r\n this.conf = conf;\r\n }\r\n runParsed(file, obj) {\r\n if (obj.getType() === \"INTF\") { // nothing can be raised in interfaces\r\n return [];\r\n }\r\n if (obj instanceof objects_1.Program && obj.isInclude() === true) {\r\n return [];\r\n }\r\n const stru = file.getStructure();\r\n if (stru === undefined) {\r\n return [];\r\n }\r\n this.findLocalExceptions(obj);\r\n this.syntax = new syntax_1.SyntaxLogic(this.reg, obj).run();\r\n if (this.syntax.issues.length > 0) {\r\n return [];\r\n }\r\n this.issues = [];\r\n this.sinked = undefined;\r\n for (const c of stru.getChildren()) {\r\n this.traverse(c, file);\r\n }\r\n return this.issues;\r\n }\r\n traverse(n, file) {\r\n var _a;\r\n const get = n.get();\r\n if (get instanceof Structures.ClassDefinition\r\n || get instanceof Structures.Interface) {\r\n return; // to optimize performance\r\n }\r\n if (n instanceof nodes_1.StructureNode) {\r\n if (get instanceof Structures.Try) {\r\n // note that TRY-CATCH might be arbitrarily nested\r\n const previous = this.sinked ? this.sinked.slice() : undefined;\r\n this.addFromTryStructure(n);\r\n for (const c of n.getChildren()) {\r\n this.traverse(c, file);\r\n }\r\n this.sinked = previous;\r\n return;\r\n }\r\n else {\r\n for (const c of n.getChildren()) {\r\n this.traverse(c, file);\r\n }\r\n }\r\n }\r\n else if (n instanceof nodes_1.StatementNode) {\r\n if (get instanceof Statements.MethodImplementation) {\r\n this.setSinkedFromMethod(n, file);\r\n }\r\n else if (get instanceof Statements.EndMethod) {\r\n this.sinked = undefined; // back to top level\r\n }\r\n else if (get instanceof Statements.Form) {\r\n this.sinked = [];\r\n const raising = n.findDirectExpression(Expressions.FormRaising);\r\n for (const c of (raising === null || raising === void 0 ? void 0 : raising.findAllExpressions(Expressions.ClassName)) || []) {\r\n this.sinked.push(c.concatTokens().toUpperCase());\r\n }\r\n }\r\n else if (get instanceof Statements.EndForm) {\r\n this.sinked = undefined; // back to top level\r\n }\r\n else if (get instanceof Statements.Raise) {\r\n let name = undefined;\r\n const concat = n.concatTokens().toUpperCase();\r\n if (concat.startsWith(\"RAISE EXCEPTION TYPE \")) {\r\n name = (_a = n.findFirstExpression(Expressions.ClassName)) === null || _a === void 0 ? void 0 : _a.getFirstToken().getStr().toUpperCase();\r\n }\r\n this.check(name, n, file);\r\n }\r\n else if (get instanceof Statements.Perform) {\r\n // todo, PERFORM, or is this not statically checked?\r\n }\r\n else {\r\n this.checkForMethodCalls(n, file);\r\n }\r\n }\r\n }\r\n ////////////////////////////////\r\n check(name, n, file) {\r\n if (this.isSinked(name) === false) {\r\n const issue = issue_1.Issue.atStatement(file, n, \"Uncaught exception \" + name, this.getMetadata().key, this.getConfig().severity);\r\n this.issues.push(issue);\r\n }\r\n }\r\n checkForMethodCalls(n, file) {\r\n const start = n.getFirstToken().getStart();\r\n const end = n.getLastToken().getEnd();\r\n const scope = this.syntax.spaghetti.lookupPosition(start, file.getFilename());\r\n for (const r of (scope === null || scope === void 0 ? void 0 : scope.getData().references) || []) {\r\n if (r.referenceType === _reference_1.ReferenceType.MethodReference\r\n && r.position.getStart().isAfter(start)\r\n && r.position.getEnd().isBefore(end)\r\n && r.resolved instanceof types_1.MethodDefinition) {\r\n for (const name of r.resolved.getRaising()) {\r\n this.check(name, n, file);\r\n }\r\n }\r\n }\r\n }\r\n addFromTryStructure(s) {\r\n if (this.sinked === undefined) {\r\n return;\r\n }\r\n for (const structure of s.findDirectStructures(Structures.Catch)) {\r\n const c = structure.findDirectStatement(Statements.Catch);\r\n if (c === undefined) {\r\n continue;\r\n }\r\n for (const cn of c.findDirectExpressions(Expressions.ClassName)) {\r\n this.sinked.push(cn.concatTokens());\r\n }\r\n }\r\n }\r\n setSinkedFromMethod(s, file) {\r\n this.sinked = [];\r\n const scope = this.syntax.spaghetti.lookupPosition(s.getLastToken().getEnd(), file.getFilename());\r\n let def = undefined;\r\n for (const r of (scope === null || scope === void 0 ? void 0 : scope.getData().references) || []) {\r\n // there should be only one, so the first is okay\r\n if (r.referenceType === _reference_1.ReferenceType.MethodImplementationReference\r\n && r.resolved instanceof types_1.MethodDefinition) {\r\n def = r.resolved;\r\n break;\r\n }\r\n }\r\n if (def === undefined) {\r\n return; // this should not occur, so just report everything as errors\r\n }\r\n def.getRaising().forEach(r => { var _a; return (_a = this.sinked) === null || _a === void 0 ? void 0 : _a.push(r); });\r\n }\r\n isSinked(name) {\r\n if (this.sinked === undefined || name === undefined) {\r\n return true;\r\n }\r\n const sup = this.globalExceptions[name.toUpperCase()];\r\n if (sup === \"CX_DYNAMIC_CHECK\" || sup === \"CX_NO_CHECK\") {\r\n return true;\r\n }\r\n const lsup = this.localExceptions[name.toUpperCase()];\r\n if (lsup === \"CX_DYNAMIC_CHECK\" || lsup === \"CX_NO_CHECK\") {\r\n return true;\r\n }\r\n return this.sinked.some(a => a.toUpperCase() === name.toUpperCase())\r\n || (sup !== undefined && this.isSinked(sup) === true)\r\n || (lsup !== undefined && this.isSinked(lsup) === true);\r\n }\r\n findGlobalExceptions() {\r\n var _a, _b;\r\n this.globalExceptions = {};\r\n const ddic = new ddic_1.DDIC(this.reg);\r\n for (const o of this.reg.getObjects()) {\r\n if (!(o instanceof objects_1.Class)) {\r\n continue;\r\n }\r\n const def = (_a = o.getMainABAPFile()) === null || _a === void 0 ? void 0 : _a.getInfo().getClassDefinitionByName(o.getName());\r\n if (def === undefined || ddic.isException(def, o) === false) {\r\n continue;\r\n }\r\n this.globalExceptions[o.getName().toUpperCase()] = (_b = def.superClassName) === null || _b === void 0 ? void 0 : _b.toUpperCase();\r\n }\r\n }\r\n findLocalExceptions(obj) {\r\n var _a;\r\n this.localExceptions = {};\r\n for (const file of obj.getABAPFiles()) {\r\n for (const def of file.getInfo().listClassDefinitions()) {\r\n if (def.isLocal === true && def.superClassName !== undefined) {\r\n this.localExceptions[def.name.toUpperCase()] = (_a = def.superClassName) === null || _a === void 0 ? void 0 : _a.toUpperCase();\r\n }\r\n }\r\n }\r\n }\r\n}\r\nexports.UncaughtException = UncaughtException;\r\n//# sourceMappingURL=uncaught_exception.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/rules/uncaught_exception.js?");
|
|
13341
13341
|
|
|
13342
13342
|
/***/ }),
|
|
13343
13343
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abaplint/cli",
|
|
3
|
-
"version": "2.95.
|
|
3
|
+
"version": "2.95.25",
|
|
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.95.
|
|
40
|
+
"@abaplint/core": "^2.95.25",
|
|
41
41
|
"@types/chai": "^4.3.4",
|
|
42
42
|
"@types/glob": "^7.2.0",
|
|
43
43
|
"@types/minimist": "^1.2.2",
|