@abaplint/transpiler-cli 2.3.0 → 2.3.2
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/bundle.js +4 -4
- package/package.json +3 -3
package/build/bundle.js
CHANGED
|
@@ -9905,7 +9905,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
|
|
|
9905
9905
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
9906
9906
|
|
|
9907
9907
|
"use strict";
|
|
9908
|
-
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DumpScope = void 0;\r\nconst _scope_type_1 = __webpack_require__(/*! ../abap/5_syntax/_scope_type */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js\");\r\nclass DumpScope {\r\n static dump(spaghetti) {\r\n let ret = \"<hr>Spaghetti Scope:<br><br>\\n\";\r\n ret = ret + this.traverseSpaghetti(spaghetti.getTop(), 0);\r\n return ret;\r\n }\r\n static traverseSpaghetti(node, indent) {\r\n const identifier = node.getIdentifier();\r\n const coverage = node.calcCoverage();\r\n const sident = \" \".repeat(indent * 2);\r\n let ret = sident + \"<u>\" + identifier.stype + \", <tt>\" + identifier.sname + \"</tt>\";\r\n ret += \", (\" + coverage.start.getRow() + \", \" + coverage.start.getCol() + \")\";\r\n if (coverage.end.getRow() === Number.MAX_SAFE_INTEGER\r\n && coverage.end.getCol() === Number.MAX_SAFE_INTEGER) {\r\n ret += \", (max, max)\";\r\n }\r\n else {\r\n ret += \", (\" + coverage.end.getRow() + \", \" + coverage.end.getCol() + \")\";\r\n }\r\n ret += \"</u><br>\";\r\n if (node.getIdentifier().stype === _scope_type_1.ScopeType.BuiltIn) {\r\n ret += sident + node.getData().types.length + \" type definitions<br>\";\r\n ret += sident + node.getData().vars.length + \" data definitions<br>\";\r\n }\r\n else {\r\n ret = ret + this.dumpNode(node, indent);\r\n }\r\n ret = ret + \"<br>\";\r\n for (const c of node.getChildren()) {\r\n ret = ret + this.traverseSpaghetti(c, indent + 1);\r\n }\r\n return ret;\r\n }\r\n static dumpNode(node, indent) {\r\n let ret = \"\";\r\n const sident = \" \".repeat(indent * 2);\r\n const types = node.getData().types;\r\n if (Object.keys(types).length === 0) {\r\n ret = ret + sident + \"0 type definitions<br>\";\r\n }\r\n else {\r\n ret = ret + sident + \"Types:<br>\";\r\n }\r\n for (const name in types) {\r\n const identifier = types[name];\r\n ret = ret + sident + \"<tt>\" + this.escape(name) + \"</tt>\";\r\n const pos = identifier.getStart();\r\n ret = ret + \"(\" + pos.getRow().toString() + \", \" + pos.getCol().toString() + \") \";\r\n ret = ret + identifier.getType().toText(0);\r\n ret = ret + \"<br>\";\r\n }\r\n const vars = node.getData().vars;\r\n if (Object.keys(vars).length === 0) {\r\n ret = ret + sident + \"0 data definitions<br>\";\r\n }\r\n else {\r\n ret = ret + sident + \"Data:<br>\";\r\n }\r\n for (const name in vars) {\r\n const identifier = vars[name];\r\n ret = ret + sident + \"<tt>\" + this.escape(name.toLowerCase()) + \"</tt>\";\r\n const pos = identifier.getStart();\r\n ret = ret + \"(\" + pos.getRow().toString() + \", \" + pos.getCol().toString() + \") \";\r\n ret = ret + identifier.getType().toText(0);\r\n const meta = identifier.getMeta();\r\n if (meta) {\r\n ret = ret + \", \" + meta;\r\n }\r\n ret = ret + \"<br>\";\r\n }\r\n ret += sident + node.getData().cdefs.length + \" class definitions<br>\";\r\n ret += sident + node.getData().idefs.length + \" interface definitions<br>\";\r\n ret += sident + node.getData().forms.length + \" form definitions<br>\";\r\n ret += sident + node.getData().references.length + \" references<br>\";\r\n for (const r of node.getData().references) {\r\n ret += sident + \" \" + r.referenceType + \", line \" + r.position.getStart().getRow() + \" \" + this.escape(r.position.getFilename()) + \" \" + this.escape(r.position.getName()) + \"<br>\";\r\n }\r\n return ret;\r\n }\r\n // todo, refactor, this method exists in multiple classes\r\n static escape(str) {\r\n str = str.replace(/&/g, \"&\");\r\n str = str.replace(/>/g, \">\");\r\n str = str.replace(/</g, \"<\");\r\n str = str.replace(/\"/g, \""\");\r\n str = str.replace(/'/g, \"'\");\r\n return str;\r\n }\r\n}\r\nexports.DumpScope = DumpScope;\r\n//# sourceMappingURL=dump_scope.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/lsp/dump_scope.js?");
|
|
9908
|
+
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DumpScope = void 0;\r\nconst _scope_type_1 = __webpack_require__(/*! ../abap/5_syntax/_scope_type */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js\");\r\nclass DumpScope {\r\n static dump(spaghetti) {\r\n let ret = \"<hr>Spaghetti Scope:<br><br>\\n\";\r\n ret = ret + this.traverseSpaghetti(spaghetti.getTop(), 0);\r\n return ret;\r\n }\r\n static traverseSpaghetti(node, indent) {\r\n const identifier = node.getIdentifier();\r\n const coverage = node.calcCoverage();\r\n const sident = \" \".repeat(indent * 2);\r\n let ret = sident + \"<u>\" + identifier.stype + \", <tt>\" + identifier.sname + \"</tt>\";\r\n ret += \", (\" + coverage.start.getRow() + \", \" + coverage.start.getCol() + \")\";\r\n if (coverage.end.getRow() === Number.MAX_SAFE_INTEGER\r\n && coverage.end.getCol() === Number.MAX_SAFE_INTEGER) {\r\n ret += \", (max, max)\";\r\n }\r\n else {\r\n ret += \", (\" + coverage.end.getRow() + \", \" + coverage.end.getCol() + \")\";\r\n }\r\n ret += \"</u><br>\";\r\n if (node.getIdentifier().stype === _scope_type_1.ScopeType.BuiltIn) {\r\n ret += sident + node.getData().types.length + \" type definitions<br>\";\r\n ret += sident + node.getData().vars.length + \" data definitions<br>\";\r\n }\r\n else {\r\n ret = ret + this.dumpNode(node, indent);\r\n }\r\n ret = ret + \"<br>\";\r\n for (const c of node.getChildren()) {\r\n ret = ret + this.traverseSpaghetti(c, indent + 1);\r\n }\r\n return ret;\r\n }\r\n static dumpNode(node, indent) {\r\n let ret = \"\";\r\n const sident = \" \".repeat(indent * 2);\r\n const types = node.getData().types;\r\n if (Object.keys(types).length === 0) {\r\n ret = ret + sident + \"0 type definitions<br>\";\r\n }\r\n else {\r\n ret = ret + sident + \"Types:<br>\";\r\n }\r\n for (const name in types) {\r\n const identifier = types[name];\r\n ret = ret + sident + \"<tt>\" + this.escape(name) + \"</tt>\";\r\n const pos = identifier.getStart();\r\n ret = ret + \"(\" + pos.getRow().toString() + \", \" + pos.getCol().toString() + \") \";\r\n ret = ret + identifier.getType().toText(0);\r\n ret = ret + \"<br>\";\r\n }\r\n const vars = node.getData().vars;\r\n if (Object.keys(vars).length === 0) {\r\n ret = ret + sident + \"0 data definitions<br>\";\r\n }\r\n else {\r\n ret = ret + sident + \"Data:<br>\";\r\n }\r\n for (const name in vars) {\r\n const identifier = vars[name];\r\n ret = ret + sident + \"<tt>\" + this.escape(name.toLowerCase()) + \"</tt>\";\r\n const pos = identifier.getStart();\r\n ret = ret + \"(\" + pos.getRow().toString() + \", \" + pos.getCol().toString() + \") \";\r\n ret = ret + identifier.getType().toText(0);\r\n const meta = identifier.getMeta();\r\n if (meta) {\r\n ret = ret + \", \" + meta;\r\n }\r\n ret = ret + \"<br>\";\r\n }\r\n ret += sident + Object.keys(node.getData().cdefs).length + \" class definitions<br>\";\r\n ret += sident + node.getData().idefs.length + \" interface definitions<br>\";\r\n ret += sident + node.getData().forms.length + \" form definitions<br>\";\r\n ret += sident + node.getData().references.length + \" references<br>\";\r\n for (const r of node.getData().references) {\r\n ret += sident + \" \" + r.referenceType + \", line \" + r.position.getStart().getRow() + \" \" + this.escape(r.position.getFilename()) + \" \" + this.escape(r.position.getName()) + \"<br>\";\r\n }\r\n return ret;\r\n }\r\n // todo, refactor, this method exists in multiple classes\r\n static escape(str) {\r\n str = str.replace(/&/g, \"&\");\r\n str = str.replace(/>/g, \">\");\r\n str = str.replace(/</g, \"<\");\r\n str = str.replace(/\"/g, \""\");\r\n str = str.replace(/'/g, \"'\");\r\n return str;\r\n }\r\n}\r\nexports.DumpScope = DumpScope;\r\n//# sourceMappingURL=dump_scope.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/lsp/dump_scope.js?");
|
|
9909
9909
|
|
|
9910
9910
|
/***/ }),
|
|
9911
9911
|
|
|
@@ -11357,7 +11357,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
|
|
|
11357
11357
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
11358
11358
|
|
|
11359
11359
|
"use strict";
|
|
11360
|
-
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.93.40\";\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/transpiler-cli/./node_modules/@abaplint/core/build/src/registry.js?");
|
|
11360
|
+
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.93.41\";\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/transpiler-cli/./node_modules/@abaplint/core/build/src/registry.js?");
|
|
11361
11361
|
|
|
11362
11362
|
/***/ }),
|
|
11363
11363
|
|
|
@@ -12105,7 +12105,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
|
|
|
12105
12105
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
12106
12106
|
|
|
12107
12107
|
"use strict";
|
|
12108
|
-
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.KeepSingleParameterCallsOnOneLine = exports.KeepSingleParameterCallsOnOneLineConf = void 0;\r\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\r\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\r\nconst _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ \"./node_modules/@abaplint/core/build/src/rules/_abap_rule.js\");\r\nconst Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\r\nclass KeepSingleParameterCallsOnOneLineConf extends _basic_rule_config_1.BasicRuleConfig {\r\n constructor() {\r\n super(...arguments);\r\n /** Max line length, in characters */\r\n this.length = 120;\r\n }\r\n}\r\nexports.KeepSingleParameterCallsOnOneLineConf = KeepSingleParameterCallsOnOneLineConf;\r\nclass KeepSingleParameterCallsOnOneLine extends _abap_rule_1.ABAPRule {\r\n constructor() {\r\n super(...arguments);\r\n this.conf = new KeepSingleParameterCallsOnOneLineConf();\r\n }\r\n getMetadata() {\r\n return {\r\n key: \"keep_single_parameter_on_one_line\",\r\n title: \"Keep single parameters on one line\",\r\n shortDescription: `Keep single parameter calls on one line`,\r\n extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-single-parameter-calls-on-one-line`,\r\n tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],\r\n badExample: `call_method(\\n 2 ).`,\r\n goodExample: `call_method( 2 ).`,\r\n };\r\n }\r\n getConfig() {\r\n return this.conf;\r\n }\r\n setConfig(conf) {\r\n this.conf = conf;\r\n }\r\n runParsed(file, obj) {\r\n let issues = [];\r\n if (obj.getType() === \"INTF\") {\r\n return [];\r\n }\r\n const stru = file.getStructure();\r\n if (stru === undefined) {\r\n return [];\r\n }\r\n for (const s of file.getStatements()) {\r\n
|
|
12108
|
+
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.KeepSingleParameterCallsOnOneLine = exports.KeepSingleParameterCallsOnOneLineConf = void 0;\r\nconst issue_1 = __webpack_require__(/*! ../issue */ \"./node_modules/@abaplint/core/build/src/issue.js\");\r\nconst _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ \"./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js\");\r\nconst _abap_rule_1 = __webpack_require__(/*! ./_abap_rule */ \"./node_modules/@abaplint/core/build/src/rules/_abap_rule.js\");\r\nconst Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst _irule_1 = __webpack_require__(/*! ./_irule */ \"./node_modules/@abaplint/core/build/src/rules/_irule.js\");\r\nclass KeepSingleParameterCallsOnOneLineConf extends _basic_rule_config_1.BasicRuleConfig {\r\n constructor() {\r\n super(...arguments);\r\n /** Max line length, in characters */\r\n this.length = 120;\r\n }\r\n}\r\nexports.KeepSingleParameterCallsOnOneLineConf = KeepSingleParameterCallsOnOneLineConf;\r\nclass KeepSingleParameterCallsOnOneLine extends _abap_rule_1.ABAPRule {\r\n constructor() {\r\n super(...arguments);\r\n this.conf = new KeepSingleParameterCallsOnOneLineConf();\r\n }\r\n getMetadata() {\r\n return {\r\n key: \"keep_single_parameter_on_one_line\",\r\n title: \"Keep single parameters on one line\",\r\n shortDescription: `Keep single parameter calls on one line`,\r\n extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-single-parameter-calls-on-one-line`,\r\n tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],\r\n badExample: `call_method(\\n 2 ).`,\r\n goodExample: `call_method( 2 ).`,\r\n };\r\n }\r\n getConfig() {\r\n return this.conf;\r\n }\r\n setConfig(conf) {\r\n this.conf = conf;\r\n }\r\n runParsed(file, obj) {\r\n let issues = [];\r\n if (obj.getType() === \"INTF\") {\r\n return [];\r\n }\r\n const stru = file.getStructure();\r\n if (stru === undefined) {\r\n return [];\r\n }\r\n for (const s of file.getStatements()) {\r\n if (this.isMultiLine(s) === false\r\n || this.calcStatementLength(s) > this.getConfig().length\r\n || this.containsNewLineValue(s)\r\n || this.containsNewLineTableExpression(s)\r\n || this.containsFieldAssigments(s)\r\n || this.containsNewLineTemplate(s)) {\r\n continue;\r\n }\r\n for (const c of s.findAllExpressions(Expressions.MethodCallParam)) {\r\n issues = issues.concat(this.check(c, file));\r\n }\r\n }\r\n return issues;\r\n }\r\n ///////////////////////////////////////\r\n containsFieldAssigments(s) {\r\n const fs = s.findAllExpressions(Expressions.FieldAssignment);\r\n return fs.length > 1;\r\n }\r\n containsNewLineTableExpression(s) {\r\n for (const st of s.findAllExpressions(Expressions.TableExpression)) {\r\n if (st.getFirstToken().getRow() !== st.getLastToken().getRow()) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n containsNewLineValue(s) {\r\n for (const st of s.findAllExpressions(Expressions.Source)) {\r\n const first = st.getFirstToken().getStr().toUpperCase();\r\n if (first === \"VALUE\" && st.getFirstToken().getRow() !== st.getLastToken().getRow()) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n containsNewLineTemplate(s) {\r\n for (const st of s.findAllExpressions(Expressions.StringTemplate)) {\r\n for (const t of st.getAllTokens()) {\r\n if (t.getStr().includes(\"\\\\n\")) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n check(c, file) {\r\n if (this.isSingleParameter(c) === true && this.isMultiLine(c) === true) {\r\n for (const sub of c.findAllExpressions(Expressions.MethodCallParam)) {\r\n if (this.isSingleParameter(sub) === false\r\n && this.isWithoutParameters(sub) === false) {\r\n return [];\r\n }\r\n }\r\n const message = \"Keep single parameter on one line\";\r\n return [issue_1.Issue.atToken(file, c.getFirstToken(), message, this.getMetadata().key, this.conf.severity)];\r\n }\r\n return [];\r\n }\r\n // including first indentation, worst case calculation add space after each token\r\n calcStatementLength(c) {\r\n let length = 0;\r\n for (const t of c.getTokens()) {\r\n if (length === 0) {\r\n length = length + t.getStart().getCol();\r\n }\r\n length = length + t.getStr().length + 1;\r\n }\r\n return length;\r\n }\r\n isMultiLine(c) {\r\n const first = c.getFirstToken();\r\n const last = c.getLastToken();\r\n return first.getStart().getRow() < last.getStart().getRow();\r\n }\r\n isWithoutParameters(c) {\r\n return c.getChildren().length === 2;\r\n }\r\n isSingleParameter(c) {\r\n if (c.findDirectExpression(Expressions.Source)) {\r\n return true;\r\n }\r\n const list = c.findDirectExpression(Expressions.ParameterListS);\r\n if (list) {\r\n return list.getChildren().length === 1;\r\n }\r\n const param = c.findDirectExpression(Expressions.MethodParameters);\r\n if (param) {\r\n if (param.getChildren().length > 2) {\r\n return false;\r\n }\r\n const paramsource = param.findDirectExpression(Expressions.ParameterListS);\r\n if (paramsource && paramsource.getChildren().length === 1) {\r\n return true;\r\n }\r\n const paramtarget = param.findDirectExpression(Expressions.ParameterListT);\r\n if (paramtarget && paramtarget.getChildren().length === 1) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\nexports.KeepSingleParameterCallsOnOneLine = KeepSingleParameterCallsOnOneLine;\r\n//# sourceMappingURL=keep_single_parameter_on_one_line.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/rules/keep_single_parameter_on_one_line.js?");
|
|
12109
12109
|
|
|
12110
12110
|
/***/ }),
|
|
12111
12111
|
|
|
@@ -13766,7 +13766,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
|
|
|
13766
13766
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
13767
13767
|
|
|
13768
13768
|
"use strict";
|
|
13769
|
-
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.HandleEnqu = void 0;\r\nconst chunk_1 = __webpack_require__(/*! ../chunk */ \"./node_modules/@abaplint/transpiler/build/src/chunk.js\");\r\n// view, much like the tables\r\nclass HandleEnqu {\r\n runObject(obj, _reg) {\r\n var _a;\r\n const filename = (_a = obj.getXMLFile()) === null || _a === void 0 ? void 0 : _a.getFilename().replace(\".xml\", \".mjs\").toLowerCase();\r\n if (filename === undefined) {\r\n return [];\r\n }\r\n const chunk = new chunk_1.Chunk().appendString(`// enqueue object\r\nabap.FunctionModules[\"ENQUEUE_${obj.getName().toUpperCase()}
|
|
13769
|
+
eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.HandleEnqu = void 0;\r\nconst chunk_1 = __webpack_require__(/*! ../chunk */ \"./node_modules/@abaplint/transpiler/build/src/chunk.js\");\r\n// view, much like the tables\r\nclass HandleEnqu {\r\n runObject(obj, _reg) {\r\n var _a;\r\n const filename = (_a = obj.getXMLFile()) === null || _a === void 0 ? void 0 : _a.getFilename().replace(\".xml\", \".mjs\").toLowerCase();\r\n if (filename === undefined) {\r\n return [];\r\n }\r\n const chunk = new chunk_1.Chunk().appendString(`// enqueue object\r\nabap.FunctionModules[\"ENQUEUE_${obj.getName().toUpperCase()}\"] = async (INPUT) => {\r\n const lookup = abap.Classes[\"KERNEL_LOCK\"];\r\n if (lookup === undefined) {\r\n throw new Error(\"Lock, kernel class missing\");\r\n }\r\n await lookup.enqueue(INPUT);\r\n};\r\nabap.FunctionModules[\"DEQUEUE_${obj.getName().toUpperCase()}\"] = async (INPUT) => {\r\n const lookup = abap.Classes[\"KERNEL_LOCK\"];\r\n if (lookup === undefined) {\r\n throw new Error(\"Lock, kernel class missing\");\r\n }\r\n await lookup.dequeue(INPUT);\r\n};`);\r\n const output = {\r\n object: {\r\n name: obj.getName(),\r\n type: obj.getType(),\r\n },\r\n filename: filename,\r\n chunk: chunk,\r\n requires: [],\r\n exports: [],\r\n };\r\n return [output];\r\n }\r\n}\r\nexports.HandleEnqu = HandleEnqu;\r\n//# sourceMappingURL=handle_enqu.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/transpiler/build/src/handlers/handle_enqu.js?");
|
|
13770
13770
|
|
|
13771
13771
|
/***/ }),
|
|
13772
13772
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abaplint/transpiler-cli",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.2",
|
|
4
4
|
"description": "Transpiler - Command Line Interface",
|
|
5
5
|
"bin": {
|
|
6
6
|
"abap_transpile": "./abap_transpile"
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
"author": "abaplint",
|
|
26
26
|
"license": "MIT",
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@abaplint/transpiler": "^2.3.
|
|
28
|
+
"@abaplint/transpiler": "^2.3.2",
|
|
29
29
|
"@types/glob": "^7.2.0",
|
|
30
30
|
"glob": "=7.2.0",
|
|
31
31
|
"@types/progress": "^2.0.5",
|
|
32
|
-
"@abaplint/core": "^2.93.
|
|
32
|
+
"@abaplint/core": "^2.93.41",
|
|
33
33
|
"progress": "^2.0.3",
|
|
34
34
|
"webpack": "^5.74.0",
|
|
35
35
|
"webpack-cli": "^4.10.0",
|