@abaplint/cli 2.85.29 → 2.85.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/build/cli.js +2 -2
  2. package/package.json +2 -2
package/build/cli.js CHANGED
@@ -2491,7 +2491,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
2491
2491
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2492
2492
 
2493
2493
  "use strict";
2494
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.StatementParser = exports.STATEMENT_MAX_TOKENS = void 0;\r\nconst Statements = __webpack_require__(/*! ./statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst Expressions = __webpack_require__(/*! ./expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst Tokens = __webpack_require__(/*! ../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nconst nodes_1 = __webpack_require__(/*! ../nodes */ \"./node_modules/@abaplint/core/build/src/abap/nodes/index.js\");\r\nconst artifacts_1 = __webpack_require__(/*! ../artifacts */ \"./node_modules/@abaplint/core/build/src/abap/artifacts.js\");\r\nconst combi_1 = __webpack_require__(/*! ./combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\r\nconst _statement_1 = __webpack_require__(/*! ./statements/_statement */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js\");\r\nconst expand_macros_1 = __webpack_require__(/*! ./expand_macros */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expand_macros.js\");\r\nconst tokens_1 = __webpack_require__(/*! ../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nexports.STATEMENT_MAX_TOKENS = 1000;\r\nclass StatementMap {\r\n constructor() {\r\n this.map = {};\r\n for (const stat of artifacts_1.ArtifactsABAP.getStatements()) {\r\n const f = stat.getMatcher().first();\r\n if (f.length === 0) {\r\n throw new Error(\"StatementMap, first must have contents\");\r\n }\r\n for (const first of f) {\r\n if (this.map[first]) {\r\n this.map[first].push(stat);\r\n }\r\n else {\r\n this.map[first] = [stat];\r\n }\r\n }\r\n }\r\n }\r\n lookup(str) {\r\n const res = this.map[str.toUpperCase()];\r\n if (res === undefined) {\r\n return [];\r\n }\r\n return res;\r\n }\r\n}\r\nclass WorkArea {\r\n constructor(file, tokens) {\r\n this.file = file;\r\n this.tokens = tokens;\r\n this.statements = [];\r\n }\r\n addUnknown(pre, post, colon) {\r\n const st = new nodes_1.StatementNode(new _statement_1.Unknown(), colon);\r\n st.setChildren(this.tokensToNodes(pre, post));\r\n this.statements.push(st);\r\n }\r\n toResult() {\r\n return { file: this.file, tokens: this.tokens, statements: this.statements };\r\n }\r\n tokensToNodes(tokens1, tokens2) {\r\n const ret = [];\r\n for (const t of tokens1) {\r\n ret.push(new nodes_1.TokenNode(t));\r\n }\r\n for (const t of tokens2) {\r\n ret.push(new nodes_1.TokenNode(t));\r\n }\r\n return ret;\r\n }\r\n}\r\nclass StatementParser {\r\n constructor(version, reg) {\r\n if (!StatementParser.map) {\r\n StatementParser.map = new StatementMap();\r\n }\r\n this.version = version;\r\n this.reg = reg;\r\n }\r\n /** input is one full object */\r\n run(input, globalMacros) {\r\n const macros = new expand_macros_1.ExpandMacros(globalMacros, this.version, this.reg);\r\n const wa = input.map(i => new WorkArea(i.file, i.tokens));\r\n for (const w of wa) {\r\n this.process(w);\r\n this.categorize(w);\r\n macros.find(w.statements);\r\n }\r\n for (const w of wa) {\r\n const res = macros.handleMacros(w.statements);\r\n w.statements = res.statements;\r\n if (res.containsUnknown === true) {\r\n this.lazyUnknown(w);\r\n }\r\n this.nativeSQL(w);\r\n }\r\n return wa.map(w => w.toResult());\r\n }\r\n // todo, refactor, remove method here and only have in WorkArea class\r\n tokensToNodes(tokens) {\r\n const ret = [];\r\n for (const t of tokens) {\r\n ret.push(new nodes_1.TokenNode(t));\r\n }\r\n return ret;\r\n }\r\n // tries to split Unknown statements by newlines, when adding/writing a new statement\r\n // in an editor, adding the statement terminator is typically the last thing to do\r\n // note: this will not work if the second statement is a macro call, guess this is okay\r\n lazyUnknown(wa) {\r\n const result = [];\r\n for (let statement of wa.statements) {\r\n if (statement.get() instanceof _statement_1.Unknown) {\r\n for (const { first, second } of this.buildSplits(statement.getTokens())) {\r\n const s = this.categorizeStatement(new nodes_1.StatementNode(new _statement_1.Unknown()).setChildren(this.tokensToNodes(second)));\r\n if (!(s.get() instanceof _statement_1.Unknown)) {\r\n result.push(new nodes_1.StatementNode(new _statement_1.Unknown()).setChildren(this.tokensToNodes(first)));\r\n statement = s;\r\n break;\r\n }\r\n }\r\n }\r\n result.push(statement);\r\n }\r\n wa.statements = result;\r\n }\r\n buildSplits(tokens) {\r\n const res = [];\r\n const before = [];\r\n let prevRow = tokens[0].getRow();\r\n for (let i = 0; i < tokens.length; i++) {\r\n if (tokens[i].getRow() !== prevRow) {\r\n res.push({ first: [...before], second: [...tokens].splice(i) });\r\n }\r\n prevRow = tokens[i].getRow();\r\n before.push(tokens[i]);\r\n }\r\n return res;\r\n }\r\n nativeSQL(wa) {\r\n let sql = false;\r\n for (let i = 0; i < wa.statements.length; i++) {\r\n const statement = wa.statements[i];\r\n const type = statement.get();\r\n if (type instanceof Statements.ExecSQL\r\n || (type instanceof Statements.MethodImplementation && statement.findDirectExpression(Expressions.Language))) {\r\n sql = true;\r\n }\r\n else if (sql === true) {\r\n if (type instanceof Statements.EndExec\r\n || type instanceof Statements.EndMethod) {\r\n sql = false;\r\n }\r\n else if (!(type instanceof _statement_1.Comment)) {\r\n wa.statements[i] = new nodes_1.StatementNode(new _statement_1.NativeSQL()).setChildren(this.tokensToNodes(statement.getTokens()));\r\n }\r\n }\r\n }\r\n }\r\n // for each statement, run statement matchers to figure out which kind of statement it is\r\n categorize(wa) {\r\n const result = [];\r\n for (const statement of wa.statements) {\r\n result.push(this.categorizeStatement(statement));\r\n }\r\n wa.statements = result;\r\n }\r\n categorizeStatement(input) {\r\n let statement = input;\r\n const length = input.getChildren().length;\r\n const lastToken = input.getLastToken();\r\n const isPunctuation = lastToken instanceof Tokens.Punctuation;\r\n if (length === 1 && isPunctuation) {\r\n const tokens = statement.getTokens();\r\n statement = new nodes_1.StatementNode(new _statement_1.Empty()).setChildren(this.tokensToNodes(tokens));\r\n }\r\n else if (statement.get() instanceof _statement_1.Unknown) {\r\n if (isPunctuation) {\r\n statement = this.match(statement);\r\n }\r\n else if (length > exports.STATEMENT_MAX_TOKENS) {\r\n // if the statement contains more than STATEMENT_MAX_TOKENS tokens, just give up\r\n statement = input;\r\n }\r\n else if (length === 1 && lastToken instanceof tokens_1.Pragma) {\r\n statement = new nodes_1.StatementNode(new _statement_1.Empty(), undefined, [lastToken]);\r\n }\r\n }\r\n return statement;\r\n }\r\n removePragma(tokens) {\r\n const result = [];\r\n const pragmas = [];\r\n // skip the last token as it is the punctuation\r\n for (let i = 0; i < tokens.length - 1; i++) {\r\n const t = tokens[i];\r\n if (t instanceof Tokens.Pragma) {\r\n pragmas.push(t);\r\n }\r\n else {\r\n result.push(t);\r\n }\r\n }\r\n return { tokens: result, pragmas: pragmas };\r\n }\r\n match(statement) {\r\n const tokens = statement.getTokens();\r\n const { tokens: filtered, pragmas } = this.removePragma(tokens);\r\n if (filtered.length === 0) {\r\n return new nodes_1.StatementNode(new _statement_1.Empty()).setChildren(this.tokensToNodes(tokens));\r\n }\r\n for (const st of StatementParser.map.lookup(filtered[0].getStr())) {\r\n const match = combi_1.Combi.run(st.getMatcher(), filtered, this.version);\r\n if (match) {\r\n const last = tokens[tokens.length - 1];\r\n match.push(new nodes_1.TokenNode(last));\r\n return new nodes_1.StatementNode(st, statement.getColon(), pragmas).setChildren(match);\r\n }\r\n }\r\n // next try the statements without specific keywords\r\n for (const st of StatementParser.map.lookup(\"\")) {\r\n const match = combi_1.Combi.run(st.getMatcher(), filtered, this.version);\r\n if (match) {\r\n const last = tokens[tokens.length - 1];\r\n match.push(new nodes_1.TokenNode(last));\r\n return new nodes_1.StatementNode(st, statement.getColon(), pragmas).setChildren(match);\r\n }\r\n }\r\n return statement;\r\n }\r\n // takes care of splitting tokens into statements, also handles chained statements\r\n // statements are split by \",\" or \".\"\r\n // additional colons/chaining after the first colon are ignored\r\n process(wa) {\r\n let add = [];\r\n let pre = [];\r\n let colon = undefined;\r\n for (const token of wa.tokens) {\r\n if (token instanceof Tokens.Comment) {\r\n wa.statements.push(new nodes_1.StatementNode(new _statement_1.Comment()).setChildren(this.tokensToNodes([token])));\r\n continue;\r\n }\r\n add.push(token);\r\n const str = token.getStr();\r\n if (str === \".\") {\r\n wa.addUnknown(pre, add, colon);\r\n add = [];\r\n pre = [];\r\n colon = undefined;\r\n }\r\n else if (str === \",\" && pre.length > 0) {\r\n wa.addUnknown(pre, add, colon);\r\n add = [];\r\n }\r\n else if (str === \":\" && colon === undefined) {\r\n colon = token;\r\n add.pop(); // do not add colon token to statement\r\n pre.push(...add);\r\n add = [];\r\n }\r\n else if (str === \":\") {\r\n add.pop(); // do not add colon token to statement\r\n }\r\n }\r\n if (add.length > 0) {\r\n wa.addUnknown(pre, add, colon);\r\n }\r\n }\r\n}\r\nexports.StatementParser = StatementParser;\r\n//# sourceMappingURL=statement_parser.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/2_statements/statement_parser.js?");
2494
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.StatementParser = exports.STATEMENT_MAX_TOKENS = void 0;\r\nconst Statements = __webpack_require__(/*! ./statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst Expressions = __webpack_require__(/*! ./expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst Tokens = __webpack_require__(/*! ../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nconst nodes_1 = __webpack_require__(/*! ../nodes */ \"./node_modules/@abaplint/core/build/src/abap/nodes/index.js\");\r\nconst artifacts_1 = __webpack_require__(/*! ../artifacts */ \"./node_modules/@abaplint/core/build/src/abap/artifacts.js\");\r\nconst combi_1 = __webpack_require__(/*! ./combi */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js\");\r\nconst _statement_1 = __webpack_require__(/*! ./statements/_statement */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js\");\r\nconst expand_macros_1 = __webpack_require__(/*! ./expand_macros */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expand_macros.js\");\r\nconst tokens_1 = __webpack_require__(/*! ../1_lexer/tokens */ \"./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js\");\r\nexports.STATEMENT_MAX_TOKENS = 1000;\r\nclass StatementMap {\r\n constructor() {\r\n this.map = {};\r\n for (const stat of artifacts_1.ArtifactsABAP.getStatements()) {\r\n const f = stat.getMatcher().first();\r\n if (f.length === 0) {\r\n throw new Error(\"StatementMap, first must have contents\");\r\n }\r\n for (const first of f) {\r\n if (this.map[first]) {\r\n this.map[first].push(stat);\r\n }\r\n else {\r\n this.map[first] = [stat];\r\n }\r\n }\r\n }\r\n }\r\n lookup(str) {\r\n const res = this.map[str.toUpperCase()];\r\n if (res === undefined) {\r\n return [];\r\n }\r\n return res;\r\n }\r\n}\r\nclass WorkArea {\r\n constructor(file, tokens) {\r\n this.file = file;\r\n this.tokens = tokens;\r\n this.statements = [];\r\n }\r\n addUnknown(pre, post, colon) {\r\n const st = new nodes_1.StatementNode(new _statement_1.Unknown(), colon);\r\n st.setChildren(this.tokensToNodes(pre, post));\r\n this.statements.push(st);\r\n }\r\n toResult() {\r\n return { file: this.file, tokens: this.tokens, statements: this.statements };\r\n }\r\n tokensToNodes(tokens1, tokens2) {\r\n const ret = [];\r\n for (const t of tokens1) {\r\n ret.push(new nodes_1.TokenNode(t));\r\n }\r\n for (const t of tokens2) {\r\n ret.push(new nodes_1.TokenNode(t));\r\n }\r\n return ret;\r\n }\r\n}\r\nclass StatementParser {\r\n constructor(version, reg) {\r\n if (!StatementParser.map) {\r\n StatementParser.map = new StatementMap();\r\n }\r\n this.version = version;\r\n this.reg = reg;\r\n }\r\n /** input is one full object */\r\n run(input, globalMacros) {\r\n const macros = new expand_macros_1.ExpandMacros(globalMacros, this.version, this.reg);\r\n const wa = input.map(i => new WorkArea(i.file, i.tokens));\r\n for (const w of wa) {\r\n this.process(w);\r\n this.categorize(w);\r\n macros.find(w.statements);\r\n }\r\n for (const w of wa) {\r\n const res = macros.handleMacros(w.statements);\r\n w.statements = res.statements;\r\n if (res.containsUnknown === true) {\r\n this.lazyUnknown(w);\r\n }\r\n this.nativeSQL(w);\r\n }\r\n return wa.map(w => w.toResult());\r\n }\r\n // todo, refactor, remove method here and only have in WorkArea class\r\n tokensToNodes(tokens) {\r\n const ret = [];\r\n for (const t of tokens) {\r\n ret.push(new nodes_1.TokenNode(t));\r\n }\r\n return ret;\r\n }\r\n // tries to split Unknown statements by newlines, when adding/writing a new statement\r\n // in an editor, adding the statement terminator is typically the last thing to do\r\n // note: this will not work if the second statement is a macro call, guess this is okay\r\n lazyUnknown(wa) {\r\n const result = [];\r\n for (let statement of wa.statements) {\r\n // dont use CALL METHOD, when executing lazy, it easily gives a Move for the last statment if lazy logic is evaluated\r\n if (statement.get() instanceof _statement_1.Unknown\r\n && statement.concatTokens().toUpperCase().startsWith(\"CALL METHOD \") === false) {\r\n for (const { first, second } of this.buildSplits(statement.getTokens())) {\r\n const s = this.categorizeStatement(new nodes_1.StatementNode(new _statement_1.Unknown()).setChildren(this.tokensToNodes(second)));\r\n if (!(s.get() instanceof _statement_1.Unknown)) {\r\n result.push(new nodes_1.StatementNode(new _statement_1.Unknown()).setChildren(this.tokensToNodes(first)));\r\n statement = s;\r\n break;\r\n }\r\n }\r\n }\r\n result.push(statement);\r\n }\r\n wa.statements = result;\r\n }\r\n buildSplits(tokens) {\r\n const res = [];\r\n const before = [];\r\n let prevRow = tokens[0].getRow();\r\n for (let i = 0; i < tokens.length; i++) {\r\n if (tokens[i].getRow() !== prevRow) {\r\n res.push({ first: [...before], second: [...tokens].splice(i) });\r\n }\r\n prevRow = tokens[i].getRow();\r\n before.push(tokens[i]);\r\n }\r\n return res;\r\n }\r\n nativeSQL(wa) {\r\n let sql = false;\r\n for (let i = 0; i < wa.statements.length; i++) {\r\n const statement = wa.statements[i];\r\n const type = statement.get();\r\n if (type instanceof Statements.ExecSQL\r\n || (type instanceof Statements.MethodImplementation && statement.findDirectExpression(Expressions.Language))) {\r\n sql = true;\r\n }\r\n else if (sql === true) {\r\n if (type instanceof Statements.EndExec\r\n || type instanceof Statements.EndMethod) {\r\n sql = false;\r\n }\r\n else if (!(type instanceof _statement_1.Comment)) {\r\n wa.statements[i] = new nodes_1.StatementNode(new _statement_1.NativeSQL()).setChildren(this.tokensToNodes(statement.getTokens()));\r\n }\r\n }\r\n }\r\n }\r\n // for each statement, run statement matchers to figure out which kind of statement it is\r\n categorize(wa) {\r\n const result = [];\r\n for (const statement of wa.statements) {\r\n result.push(this.categorizeStatement(statement));\r\n }\r\n wa.statements = result;\r\n }\r\n categorizeStatement(input) {\r\n let statement = input;\r\n const length = input.getChildren().length;\r\n const lastToken = input.getLastToken();\r\n const isPunctuation = lastToken instanceof Tokens.Punctuation;\r\n if (length === 1 && isPunctuation) {\r\n const tokens = statement.getTokens();\r\n statement = new nodes_1.StatementNode(new _statement_1.Empty()).setChildren(this.tokensToNodes(tokens));\r\n }\r\n else if (statement.get() instanceof _statement_1.Unknown) {\r\n if (isPunctuation) {\r\n statement = this.match(statement);\r\n }\r\n else if (length > exports.STATEMENT_MAX_TOKENS) {\r\n // if the statement contains more than STATEMENT_MAX_TOKENS tokens, just give up\r\n statement = input;\r\n }\r\n else if (length === 1 && lastToken instanceof tokens_1.Pragma) {\r\n statement = new nodes_1.StatementNode(new _statement_1.Empty(), undefined, [lastToken]);\r\n }\r\n }\r\n return statement;\r\n }\r\n removePragma(tokens) {\r\n const result = [];\r\n const pragmas = [];\r\n // skip the last token as it is the punctuation\r\n for (let i = 0; i < tokens.length - 1; i++) {\r\n const t = tokens[i];\r\n if (t instanceof Tokens.Pragma) {\r\n pragmas.push(t);\r\n }\r\n else {\r\n result.push(t);\r\n }\r\n }\r\n return { tokens: result, pragmas: pragmas };\r\n }\r\n match(statement) {\r\n const tokens = statement.getTokens();\r\n const { tokens: filtered, pragmas } = this.removePragma(tokens);\r\n if (filtered.length === 0) {\r\n return new nodes_1.StatementNode(new _statement_1.Empty()).setChildren(this.tokensToNodes(tokens));\r\n }\r\n for (const st of StatementParser.map.lookup(filtered[0].getStr())) {\r\n const match = combi_1.Combi.run(st.getMatcher(), filtered, this.version);\r\n if (match) {\r\n const last = tokens[tokens.length - 1];\r\n match.push(new nodes_1.TokenNode(last));\r\n return new nodes_1.StatementNode(st, statement.getColon(), pragmas).setChildren(match);\r\n }\r\n }\r\n // next try the statements without specific keywords\r\n for (const st of StatementParser.map.lookup(\"\")) {\r\n const match = combi_1.Combi.run(st.getMatcher(), filtered, this.version);\r\n if (match) {\r\n const last = tokens[tokens.length - 1];\r\n match.push(new nodes_1.TokenNode(last));\r\n return new nodes_1.StatementNode(st, statement.getColon(), pragmas).setChildren(match);\r\n }\r\n }\r\n return statement;\r\n }\r\n // takes care of splitting tokens into statements, also handles chained statements\r\n // statements are split by \",\" or \".\"\r\n // additional colons/chaining after the first colon are ignored\r\n process(wa) {\r\n let add = [];\r\n let pre = [];\r\n let colon = undefined;\r\n for (const token of wa.tokens) {\r\n if (token instanceof Tokens.Comment) {\r\n wa.statements.push(new nodes_1.StatementNode(new _statement_1.Comment()).setChildren(this.tokensToNodes([token])));\r\n continue;\r\n }\r\n add.push(token);\r\n const str = token.getStr();\r\n if (str === \".\") {\r\n wa.addUnknown(pre, add, colon);\r\n add = [];\r\n pre = [];\r\n colon = undefined;\r\n }\r\n else if (str === \",\" && pre.length > 0) {\r\n wa.addUnknown(pre, add, colon);\r\n add = [];\r\n }\r\n else if (str === \":\" && colon === undefined) {\r\n colon = token;\r\n add.pop(); // do not add colon token to statement\r\n pre.push(...add);\r\n add = [];\r\n }\r\n else if (str === \":\") {\r\n add.pop(); // do not add colon token to statement\r\n }\r\n }\r\n if (add.length > 0) {\r\n wa.addUnknown(pre, add, colon);\r\n }\r\n }\r\n}\r\nexports.StatementParser = StatementParser;\r\n//# sourceMappingURL=statement_parser.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/abap/2_statements/statement_parser.js?");
2495
2495
 
2496
2496
  /***/ }),
2497
2497
 
@@ -11181,7 +11181,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
11181
11181
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
11182
11182
 
11183
11183
  "use strict";
11184
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Registry = void 0;\nconst config_1 = __webpack_require__(/*! ./config */ \"./node_modules/@abaplint/core/build/src/config.js\");\nconst artifacts_objects_1 = __webpack_require__(/*! ./artifacts_objects */ \"./node_modules/@abaplint/core/build/src/artifacts_objects.js\");\nconst artifacts_rules_1 = __webpack_require__(/*! ./artifacts_rules */ \"./node_modules/@abaplint/core/build/src/artifacts_rules.js\");\nconst skip_logic_1 = __webpack_require__(/*! ./skip_logic */ \"./node_modules/@abaplint/core/build/src/skip_logic.js\");\nconst _abap_object_1 = __webpack_require__(/*! ./objects/_abap_object */ \"./node_modules/@abaplint/core/build/src/objects/_abap_object.js\");\nconst find_global_definitions_1 = __webpack_require__(/*! ./abap/5_syntax/global_definitions/find_global_definitions */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/global_definitions/find_global_definitions.js\");\nconst syntax_1 = __webpack_require__(/*! ./abap/5_syntax/syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\nconst excludeHelper_1 = __webpack_require__(/*! ./utils/excludeHelper */ \"./node_modules/@abaplint/core/build/src/utils/excludeHelper.js\");\nconst ddic_references_1 = __webpack_require__(/*! ./ddic_references */ \"./node_modules/@abaplint/core/build/src/ddic_references.js\");\n// todo, this should really be an instance in case there are multiple Registry'ies\nclass ParsingPerformance {\n static clear() {\n this.results = [];\n this.lexing = 0;\n this.statements = 0;\n this.structure = 0;\n }\n static push(obj, result) {\n if (result.runtimeExtra) {\n this.lexing += result.runtimeExtra.lexing;\n this.statements += result.runtimeExtra.statements;\n this.structure += result.runtimeExtra.structure;\n }\n if (result.runtime < 100) {\n return;\n }\n if (this.results === undefined) {\n this.results = [];\n }\n let extra = \"\";\n if (result.runtimeExtra) {\n extra = `\\t(lexing: ${result.runtimeExtra.lexing}ms, statements: ${result.runtimeExtra.statements}ms, structure: ${result.runtimeExtra.structure}ms)`;\n }\n this.results.push({\n runtime: result.runtime,\n extra,\n name: obj.getType() + \" \" + obj.getName(),\n });\n }\n static output() {\n const MAX = 10;\n this.results.sort((a, b) => { return b.runtime - a.runtime; });\n for (let i = 0; i < MAX; i++) {\n const row = this.results[i];\n if (row === undefined) {\n break;\n }\n process.stderr.write(`\\t${row.runtime}ms\\t${row.name} ${row.extra}\\n`);\n }\n process.stderr.write(`\\tTotal lexing: ${this.lexing}ms\\n`);\n process.stderr.write(`\\tTotal statements: ${this.statements}ms\\n`);\n process.stderr.write(`\\tTotal structure: ${this.structure}ms\\n`);\n }\n}\n///////////////////////////////////////////////////////////////////////////////////////////////\nclass Registry {\n constructor(conf) {\n this.objects = {};\n this.objectsByType = {};\n /** object containing filenames of dependencies */\n this.dependencies = {};\n this.issues = [];\n this.conf = conf ? conf : config_1.Config.getDefault();\n this.references = new ddic_references_1.DDICReferences();\n }\n static abaplintVersion() {\n // magic, see build script \"version.sh\"\n return \"2.85.29\";\n }\n getDDICReferences() {\n return this.references;\n }\n *getObjects() {\n for (const name in this.objects) {\n for (const type in this.objects[name]) {\n yield this.objects[name][type];\n }\n }\n }\n *getObjectsByType(type) {\n for (const name in this.objectsByType[type] || []) {\n yield this.objectsByType[type][name];\n }\n }\n *getFiles() {\n for (const obj of this.getObjects()) {\n for (const file of obj.getFiles()) {\n yield file;\n }\n }\n }\n getFirstObject() {\n for (const name in this.objects) {\n for (const type in this.objects[name]) {\n return this.objects[name][type];\n }\n }\n return undefined;\n }\n getObjectCount(skipDependencies = true) {\n let res = 0;\n for (const o of this.getObjects()) {\n if (skipDependencies === true && this.isDependency(o)) {\n continue;\n }\n res = res + 1;\n }\n return res;\n }\n getFileByName(filename) {\n const upper = filename.toUpperCase();\n for (const o of this.getObjects()) {\n for (const f of o.getFiles()) {\n if (f.getFilename().toUpperCase() === upper) {\n return f;\n }\n }\n }\n return undefined;\n }\n getObject(type, name) {\n if (type === undefined || name === undefined) {\n return undefined;\n }\n const searchName = name.toUpperCase();\n if (this.objects[searchName]) {\n return this.objects[searchName][type];\n }\n return undefined;\n }\n getConfig() {\n return this.conf;\n }\n // assumption: Config is immutable, and can only be changed via this method\n setConfig(conf) {\n for (const obj of this.getObjects()) {\n obj.setDirty();\n }\n this.conf = conf;\n return this;\n }\n inErrorNamespace(name) {\n const reg = new RegExp(this.getConfig().getSyntaxSetttings().errorNamespace, \"i\");\n return reg.test(name);\n }\n addFile(file) {\n return this.addFiles([file]);\n }\n updateFile(file) {\n const obj = this.find(file.getObjectName(), file.getObjectType());\n obj.updateFile(file);\n return this;\n }\n removeFile(file) {\n const obj = this.find(file.getObjectName(), file.getObjectType());\n obj.removeFile(file);\n if (obj.getFiles().length === 0) {\n this.references.clear(obj);\n this.removeObject(obj);\n }\n return this;\n }\n addFiles(files) {\n var _a;\n const globalExclude = ((_a = this.conf.getGlobal().exclude) !== null && _a !== void 0 ? _a : [])\n .map(pattern => new RegExp(pattern, \"i\"));\n for (const f of files) {\n const filename = f.getFilename();\n const isNotAbapgitFile = filename.split(\".\").length <= 2;\n if (isNotAbapgitFile || excludeHelper_1.ExcludeHelper.isExcluded(filename, globalExclude)) {\n continue;\n }\n const found = this.findOrCreate(f.getObjectName(), f.getObjectType());\n found.addFile(f);\n }\n return this;\n }\n addDependencies(files) {\n for (const f of files) {\n this.dependencies[f.getFilename().toUpperCase()] = true;\n }\n return this.addFiles(files);\n }\n addDependency(file) {\n this.dependencies[file.getFilename().toUpperCase()] = true;\n this.addFile(file);\n return this;\n }\n isDependency(obj) {\n const filename = obj.getFiles()[0].getFilename().toUpperCase();\n return this.dependencies[filename] === true;\n }\n isFileDependency(filename) {\n return this.dependencies[filename.toUpperCase()] === true;\n }\n // assumption: the file is already in the registry\n findObjectForFile(file) {\n const filename = file.getFilename();\n for (const obj of this.getObjects()) {\n for (const ofile of obj.getFiles()) {\n if (ofile.getFilename() === filename) {\n return obj;\n }\n }\n }\n return undefined;\n }\n // todo, this will be changed to async sometime\n findIssues(input) {\n if (this.isDirty() === true) {\n this.parse();\n }\n return this.runRules(input);\n }\n // todo, this will be changed to async sometime\n findIssuesObject(iobj) {\n if (this.isDirty() === true) {\n this.parse();\n }\n return this.runRules(undefined, iobj);\n }\n // todo, this will be changed to async sometime\n parse() {\n if (this.isDirty() === false) {\n return this;\n }\n ParsingPerformance.clear();\n this.issues = [];\n for (const o of this.getObjects()) {\n this.parsePrivate(o);\n this.issues.push(...o.getParsingIssues());\n }\n new find_global_definitions_1.FindGlobalDefinitions(this).run();\n return this;\n }\n async parseAsync(input) {\n var _a, _b;\n if (this.isDirty() === false) {\n return this;\n }\n ParsingPerformance.clear();\n (_a = input === null || input === void 0 ? void 0 : input.progress) === null || _a === void 0 ? void 0 : _a.set(this.getObjectCount(false), \"Lexing and parsing\");\n this.issues = [];\n for (const o of this.getObjects()) {\n await ((_b = input === null || input === void 0 ? void 0 : input.progress) === null || _b === void 0 ? void 0 : _b.tick(\"Lexing and parsing(\" + this.conf.getVersion() + \") - \" + o.getType() + \" \" + o.getName()));\n this.parsePrivate(o);\n this.issues.push(...o.getParsingIssues());\n }\n if ((input === null || input === void 0 ? void 0 : input.outputPerformance) === true) {\n ParsingPerformance.output();\n }\n new find_global_definitions_1.FindGlobalDefinitions(this).run(input === null || input === void 0 ? void 0 : input.progress);\n return this;\n }\n //////////////////////////////////////////\n // todo, refactor, this is a mess, see where-used, a lot of the code should be in this method instead\n parsePrivate(input) {\n const config = this.getConfig();\n const result = input.parse(config.getVersion(), config.getSyntaxSetttings().globalMacros, 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 runRules(input, iobj) {\n var _a, _b, _c, _d, _e, _f;\n const rulePerformance = {};\n const issues = this.issues.slice(0);\n const objects = iobj ? [iobj] : this.getObjects();\n const rules = this.conf.getEnabledRules();\n const skipLogic = new skip_logic_1.SkipLogic(this);\n (_a = input === null || input === void 0 ? void 0 : input.progress) === null || _a === void 0 ? void 0 : _a.set(iobj ? 1 : this.getObjectCount(false), \"Run Syntax\");\n const check = [];\n for (const obj of objects) {\n (_b = input === null || input === void 0 ? void 0 : input.progress) === null || _b === void 0 ? void 0 : _b.tick(\"Run Syntax - \" + obj.getName());\n if (skipLogic.skip(obj) || this.isDependency(obj)) {\n continue;\n }\n if (obj instanceof _abap_object_1.ABAPObject) {\n new syntax_1.SyntaxLogic(this, obj).run();\n }\n check.push(obj);\n }\n (_c = input === null || input === void 0 ? void 0 : input.progress) === null || _c === void 0 ? void 0 : _c.set(rules.length, \"Initialize Rules\");\n for (const rule of rules) {\n (_d = input === null || input === void 0 ? void 0 : input.progress) === null || _d === void 0 ? void 0 : _d.tick(\"Initialize Rules - \" + rule.getMetadata().key);\n if (rule.initialize === undefined) {\n throw new Error(rule.getMetadata().key + \" missing initialize method\");\n }\n rule.initialize(this);\n rulePerformance[rule.getMetadata().key] = 0;\n }\n (_e = input === null || input === void 0 ? void 0 : input.progress) === null || _e === void 0 ? void 0 : _e.set(check.length, \"Finding Issues\");\n for (const obj of check) {\n (_f = input === null || input === void 0 ? void 0 : input.progress) === null || _f === void 0 ? void 0 : _f.tick(\"Finding Issues - \" + obj.getType() + \" \" + obj.getName());\n for (const rule of rules) {\n const before = Date.now();\n issues.push(...rule.run(obj));\n const runtime = Date.now() - before;\n rulePerformance[rule.getMetadata().key] = rulePerformance[rule.getMetadata().key] + runtime;\n }\n }\n if ((input === null || input === void 0 ? void 0 : input.outputPerformance) === true) {\n const perf = [];\n for (const p in rulePerformance) {\n if (rulePerformance[p] > 100) { // ignore rules if it takes less than 100ms\n perf.push({ name: p, time: rulePerformance[p] });\n }\n }\n perf.sort((a, b) => { return b.time - a.time; });\n for (const p of perf) {\n process.stderr.write(\"\\t\" + p.time + \"ms\\t\" + p.name + \"\\n\");\n }\n }\n return this.excludeIssues(issues);\n }\n excludeIssues(issues) {\n var _a;\n const ret = issues;\n const globalNoIssues = this.conf.getGlobal().noIssues || [];\n const globalNoIssuesPatterns = globalNoIssues.map(x => new RegExp(x, \"i\"));\n if (globalNoIssuesPatterns.length > 0) {\n for (let i = ret.length - 1; i >= 0; i--) {\n const filename = ret[i].getFilename();\n if (excludeHelper_1.ExcludeHelper.isExcluded(filename, globalNoIssuesPatterns)) {\n ret.splice(i, 1);\n }\n }\n }\n // exclude issues, as now we know both the filename and issue key\n for (const rule of artifacts_rules_1.ArtifactsRules.getRules()) {\n const key = rule.getMetadata().key;\n const ruleExclude = (_a = this.conf.readByKey(key, \"exclude\")) !== null && _a !== void 0 ? _a : [];\n if (ruleExclude.length === 0) {\n continue;\n }\n const ruleExcludePatterns = ruleExclude.map(x => new RegExp(x, \"i\"));\n for (let i = ret.length - 1; i >= 0; i--) {\n if (ret[i].getKey() !== key) {\n continue;\n }\n const filename = ret[i].getFilename();\n if (excludeHelper_1.ExcludeHelper.isExcluded(filename, ruleExcludePatterns)) {\n ret.splice(i, 1);\n }\n }\n }\n return ret;\n }\n findOrCreate(name, type) {\n try {\n return this.find(name, type);\n }\n catch (_a) {\n const newName = name.toUpperCase();\n const newType = type ? type : \"UNKNOWN\";\n const add = artifacts_objects_1.ArtifactsObjects.newObject(newName, newType);\n if (this.objects[newName] === undefined) {\n this.objects[newName] = {};\n }\n this.objects[newName][newType] = add;\n if (this.objectsByType[newType] === undefined) {\n this.objectsByType[newType] = {};\n }\n this.objectsByType[newType][newName] = add;\n return add;\n }\n }\n removeObject(remove) {\n if (remove === undefined) {\n return;\n }\n if (this.objects[remove.getName()][remove.getType()] === undefined) {\n throw new Error(\"removeObject: object not found\");\n }\n if (Object.keys(this.objects[remove.getName()]).length === 1) {\n delete this.objects[remove.getName()];\n }\n else {\n delete this.objects[remove.getName()][remove.getType()];\n }\n if (Object.keys(this.objectsByType[remove.getType()]).length === 1) {\n delete this.objectsByType[remove.getType()];\n }\n else {\n delete this.objectsByType[remove.getType()][remove.getName()];\n }\n }\n find(name, type) {\n const searchType = type ? type : \"UNKNOWN\";\n const searchName = name.toUpperCase();\n if (this.objects[searchName] !== undefined\n && this.objects[searchName][searchType]) {\n return this.objects[searchName][searchType];\n }\n throw new Error(\"find: object not found, \" + type + \" \" + name);\n }\n}\nexports.Registry = Registry;\n//# sourceMappingURL=registry.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/registry.js?");
11184
+ eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Registry = void 0;\nconst config_1 = __webpack_require__(/*! ./config */ \"./node_modules/@abaplint/core/build/src/config.js\");\nconst artifacts_objects_1 = __webpack_require__(/*! ./artifacts_objects */ \"./node_modules/@abaplint/core/build/src/artifacts_objects.js\");\nconst artifacts_rules_1 = __webpack_require__(/*! ./artifacts_rules */ \"./node_modules/@abaplint/core/build/src/artifacts_rules.js\");\nconst skip_logic_1 = __webpack_require__(/*! ./skip_logic */ \"./node_modules/@abaplint/core/build/src/skip_logic.js\");\nconst _abap_object_1 = __webpack_require__(/*! ./objects/_abap_object */ \"./node_modules/@abaplint/core/build/src/objects/_abap_object.js\");\nconst find_global_definitions_1 = __webpack_require__(/*! ./abap/5_syntax/global_definitions/find_global_definitions */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/global_definitions/find_global_definitions.js\");\nconst syntax_1 = __webpack_require__(/*! ./abap/5_syntax/syntax */ \"./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js\");\nconst excludeHelper_1 = __webpack_require__(/*! ./utils/excludeHelper */ \"./node_modules/@abaplint/core/build/src/utils/excludeHelper.js\");\nconst ddic_references_1 = __webpack_require__(/*! ./ddic_references */ \"./node_modules/@abaplint/core/build/src/ddic_references.js\");\n// todo, this should really be an instance in case there are multiple Registry'ies\nclass ParsingPerformance {\n static clear() {\n this.results = [];\n this.lexing = 0;\n this.statements = 0;\n this.structure = 0;\n }\n static push(obj, result) {\n if (result.runtimeExtra) {\n this.lexing += result.runtimeExtra.lexing;\n this.statements += result.runtimeExtra.statements;\n this.structure += result.runtimeExtra.structure;\n }\n if (result.runtime < 100) {\n return;\n }\n if (this.results === undefined) {\n this.results = [];\n }\n let extra = \"\";\n if (result.runtimeExtra) {\n extra = `\\t(lexing: ${result.runtimeExtra.lexing}ms, statements: ${result.runtimeExtra.statements}ms, structure: ${result.runtimeExtra.structure}ms)`;\n }\n this.results.push({\n runtime: result.runtime,\n extra,\n name: obj.getType() + \" \" + obj.getName(),\n });\n }\n static output() {\n const MAX = 10;\n this.results.sort((a, b) => { return b.runtime - a.runtime; });\n for (let i = 0; i < MAX; i++) {\n const row = this.results[i];\n if (row === undefined) {\n break;\n }\n process.stderr.write(`\\t${row.runtime}ms\\t${row.name} ${row.extra}\\n`);\n }\n process.stderr.write(`\\tTotal lexing: ${this.lexing}ms\\n`);\n process.stderr.write(`\\tTotal statements: ${this.statements}ms\\n`);\n process.stderr.write(`\\tTotal structure: ${this.structure}ms\\n`);\n }\n}\n///////////////////////////////////////////////////////////////////////////////////////////////\nclass Registry {\n constructor(conf) {\n this.objects = {};\n this.objectsByType = {};\n /** object containing filenames of dependencies */\n this.dependencies = {};\n this.issues = [];\n this.conf = conf ? conf : config_1.Config.getDefault();\n this.references = new ddic_references_1.DDICReferences();\n }\n static abaplintVersion() {\n // magic, see build script \"version.sh\"\n return \"2.85.30\";\n }\n getDDICReferences() {\n return this.references;\n }\n *getObjects() {\n for (const name in this.objects) {\n for (const type in this.objects[name]) {\n yield this.objects[name][type];\n }\n }\n }\n *getObjectsByType(type) {\n for (const name in this.objectsByType[type] || []) {\n yield this.objectsByType[type][name];\n }\n }\n *getFiles() {\n for (const obj of this.getObjects()) {\n for (const file of obj.getFiles()) {\n yield file;\n }\n }\n }\n getFirstObject() {\n for (const name in this.objects) {\n for (const type in this.objects[name]) {\n return this.objects[name][type];\n }\n }\n return undefined;\n }\n getObjectCount(skipDependencies = true) {\n let res = 0;\n for (const o of this.getObjects()) {\n if (skipDependencies === true && this.isDependency(o)) {\n continue;\n }\n res = res + 1;\n }\n return res;\n }\n getFileByName(filename) {\n const upper = filename.toUpperCase();\n for (const o of this.getObjects()) {\n for (const f of o.getFiles()) {\n if (f.getFilename().toUpperCase() === upper) {\n return f;\n }\n }\n }\n return undefined;\n }\n getObject(type, name) {\n if (type === undefined || name === undefined) {\n return undefined;\n }\n const searchName = name.toUpperCase();\n if (this.objects[searchName]) {\n return this.objects[searchName][type];\n }\n return undefined;\n }\n getConfig() {\n return this.conf;\n }\n // assumption: Config is immutable, and can only be changed via this method\n setConfig(conf) {\n for (const obj of this.getObjects()) {\n obj.setDirty();\n }\n this.conf = conf;\n return this;\n }\n inErrorNamespace(name) {\n const reg = new RegExp(this.getConfig().getSyntaxSetttings().errorNamespace, \"i\");\n return reg.test(name);\n }\n addFile(file) {\n return this.addFiles([file]);\n }\n updateFile(file) {\n const obj = this.find(file.getObjectName(), file.getObjectType());\n obj.updateFile(file);\n return this;\n }\n removeFile(file) {\n const obj = this.find(file.getObjectName(), file.getObjectType());\n obj.removeFile(file);\n if (obj.getFiles().length === 0) {\n this.references.clear(obj);\n this.removeObject(obj);\n }\n return this;\n }\n addFiles(files) {\n var _a;\n const globalExclude = ((_a = this.conf.getGlobal().exclude) !== null && _a !== void 0 ? _a : [])\n .map(pattern => new RegExp(pattern, \"i\"));\n for (const f of files) {\n const filename = f.getFilename();\n const isNotAbapgitFile = filename.split(\".\").length <= 2;\n if (isNotAbapgitFile || excludeHelper_1.ExcludeHelper.isExcluded(filename, globalExclude)) {\n continue;\n }\n const found = this.findOrCreate(f.getObjectName(), f.getObjectType());\n found.addFile(f);\n }\n return this;\n }\n addDependencies(files) {\n for (const f of files) {\n this.dependencies[f.getFilename().toUpperCase()] = true;\n }\n return this.addFiles(files);\n }\n addDependency(file) {\n this.dependencies[file.getFilename().toUpperCase()] = true;\n this.addFile(file);\n return this;\n }\n isDependency(obj) {\n const filename = obj.getFiles()[0].getFilename().toUpperCase();\n return this.dependencies[filename] === true;\n }\n isFileDependency(filename) {\n return this.dependencies[filename.toUpperCase()] === true;\n }\n // assumption: the file is already in the registry\n findObjectForFile(file) {\n const filename = file.getFilename();\n for (const obj of this.getObjects()) {\n for (const ofile of obj.getFiles()) {\n if (ofile.getFilename() === filename) {\n return obj;\n }\n }\n }\n return undefined;\n }\n // todo, this will be changed to async sometime\n findIssues(input) {\n if (this.isDirty() === true) {\n this.parse();\n }\n return this.runRules(input);\n }\n // todo, this will be changed to async sometime\n findIssuesObject(iobj) {\n if (this.isDirty() === true) {\n this.parse();\n }\n return this.runRules(undefined, iobj);\n }\n // todo, this will be changed to async sometime\n parse() {\n if (this.isDirty() === false) {\n return this;\n }\n ParsingPerformance.clear();\n this.issues = [];\n for (const o of this.getObjects()) {\n this.parsePrivate(o);\n this.issues.push(...o.getParsingIssues());\n }\n new find_global_definitions_1.FindGlobalDefinitions(this).run();\n return this;\n }\n async parseAsync(input) {\n var _a, _b;\n if (this.isDirty() === false) {\n return this;\n }\n ParsingPerformance.clear();\n (_a = input === null || input === void 0 ? void 0 : input.progress) === null || _a === void 0 ? void 0 : _a.set(this.getObjectCount(false), \"Lexing and parsing\");\n this.issues = [];\n for (const o of this.getObjects()) {\n await ((_b = input === null || input === void 0 ? void 0 : input.progress) === null || _b === void 0 ? void 0 : _b.tick(\"Lexing and parsing(\" + this.conf.getVersion() + \") - \" + o.getType() + \" \" + o.getName()));\n this.parsePrivate(o);\n this.issues.push(...o.getParsingIssues());\n }\n if ((input === null || input === void 0 ? void 0 : input.outputPerformance) === true) {\n ParsingPerformance.output();\n }\n new find_global_definitions_1.FindGlobalDefinitions(this).run(input === null || input === void 0 ? void 0 : input.progress);\n return this;\n }\n //////////////////////////////////////////\n // todo, refactor, this is a mess, see where-used, a lot of the code should be in this method instead\n parsePrivate(input) {\n const config = this.getConfig();\n const result = input.parse(config.getVersion(), config.getSyntaxSetttings().globalMacros, 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 runRules(input, iobj) {\n var _a, _b, _c, _d, _e, _f;\n const rulePerformance = {};\n const issues = this.issues.slice(0);\n const objects = iobj ? [iobj] : this.getObjects();\n const rules = this.conf.getEnabledRules();\n const skipLogic = new skip_logic_1.SkipLogic(this);\n (_a = input === null || input === void 0 ? void 0 : input.progress) === null || _a === void 0 ? void 0 : _a.set(iobj ? 1 : this.getObjectCount(false), \"Run Syntax\");\n const check = [];\n for (const obj of objects) {\n (_b = input === null || input === void 0 ? void 0 : input.progress) === null || _b === void 0 ? void 0 : _b.tick(\"Run Syntax - \" + obj.getName());\n if (skipLogic.skip(obj) || this.isDependency(obj)) {\n continue;\n }\n if (obj instanceof _abap_object_1.ABAPObject) {\n new syntax_1.SyntaxLogic(this, obj).run();\n }\n check.push(obj);\n }\n (_c = input === null || input === void 0 ? void 0 : input.progress) === null || _c === void 0 ? void 0 : _c.set(rules.length, \"Initialize Rules\");\n for (const rule of rules) {\n (_d = input === null || input === void 0 ? void 0 : input.progress) === null || _d === void 0 ? void 0 : _d.tick(\"Initialize Rules - \" + rule.getMetadata().key);\n if (rule.initialize === undefined) {\n throw new Error(rule.getMetadata().key + \" missing initialize method\");\n }\n rule.initialize(this);\n rulePerformance[rule.getMetadata().key] = 0;\n }\n (_e = input === null || input === void 0 ? void 0 : input.progress) === null || _e === void 0 ? void 0 : _e.set(check.length, \"Finding Issues\");\n for (const obj of check) {\n (_f = input === null || input === void 0 ? void 0 : input.progress) === null || _f === void 0 ? void 0 : _f.tick(\"Finding Issues - \" + obj.getType() + \" \" + obj.getName());\n for (const rule of rules) {\n const before = Date.now();\n issues.push(...rule.run(obj));\n const runtime = Date.now() - before;\n rulePerformance[rule.getMetadata().key] = rulePerformance[rule.getMetadata().key] + runtime;\n }\n }\n if ((input === null || input === void 0 ? void 0 : input.outputPerformance) === true) {\n const perf = [];\n for (const p in rulePerformance) {\n if (rulePerformance[p] > 100) { // ignore rules if it takes less than 100ms\n perf.push({ name: p, time: rulePerformance[p] });\n }\n }\n perf.sort((a, b) => { return b.time - a.time; });\n for (const p of perf) {\n process.stderr.write(\"\\t\" + p.time + \"ms\\t\" + p.name + \"\\n\");\n }\n }\n return this.excludeIssues(issues);\n }\n excludeIssues(issues) {\n var _a;\n const ret = issues;\n const globalNoIssues = this.conf.getGlobal().noIssues || [];\n const globalNoIssuesPatterns = globalNoIssues.map(x => new RegExp(x, \"i\"));\n if (globalNoIssuesPatterns.length > 0) {\n for (let i = ret.length - 1; i >= 0; i--) {\n const filename = ret[i].getFilename();\n if (excludeHelper_1.ExcludeHelper.isExcluded(filename, globalNoIssuesPatterns)) {\n ret.splice(i, 1);\n }\n }\n }\n // exclude issues, as now we know both the filename and issue key\n for (const rule of artifacts_rules_1.ArtifactsRules.getRules()) {\n const key = rule.getMetadata().key;\n const ruleExclude = (_a = this.conf.readByKey(key, \"exclude\")) !== null && _a !== void 0 ? _a : [];\n if (ruleExclude.length === 0) {\n continue;\n }\n const ruleExcludePatterns = ruleExclude.map(x => new RegExp(x, \"i\"));\n for (let i = ret.length - 1; i >= 0; i--) {\n if (ret[i].getKey() !== key) {\n continue;\n }\n const filename = ret[i].getFilename();\n if (excludeHelper_1.ExcludeHelper.isExcluded(filename, ruleExcludePatterns)) {\n ret.splice(i, 1);\n }\n }\n }\n return ret;\n }\n findOrCreate(name, type) {\n try {\n return this.find(name, type);\n }\n catch (_a) {\n const newName = name.toUpperCase();\n const newType = type ? type : \"UNKNOWN\";\n const add = artifacts_objects_1.ArtifactsObjects.newObject(newName, newType);\n if (this.objects[newName] === undefined) {\n this.objects[newName] = {};\n }\n this.objects[newName][newType] = add;\n if (this.objectsByType[newType] === undefined) {\n this.objectsByType[newType] = {};\n }\n this.objectsByType[newType][newName] = add;\n return add;\n }\n }\n removeObject(remove) {\n if (remove === undefined) {\n return;\n }\n if (this.objects[remove.getName()][remove.getType()] === undefined) {\n throw new Error(\"removeObject: object not found\");\n }\n if (Object.keys(this.objects[remove.getName()]).length === 1) {\n delete this.objects[remove.getName()];\n }\n else {\n delete this.objects[remove.getName()][remove.getType()];\n }\n if (Object.keys(this.objectsByType[remove.getType()]).length === 1) {\n delete this.objectsByType[remove.getType()];\n }\n else {\n delete this.objectsByType[remove.getType()][remove.getName()];\n }\n }\n find(name, type) {\n const searchType = type ? type : \"UNKNOWN\";\n const searchName = name.toUpperCase();\n if (this.objects[searchName] !== undefined\n && this.objects[searchName][searchType]) {\n return this.objects[searchName][searchType];\n }\n throw new Error(\"find: object not found, \" + type + \" \" + name);\n }\n}\nexports.Registry = Registry;\n//# sourceMappingURL=registry.js.map\n\n//# sourceURL=webpack://@abaplint/cli/./node_modules/@abaplint/core/build/src/registry.js?");
11185
11185
 
11186
11186
  /***/ }),
11187
11187
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/cli",
3
- "version": "2.85.29",
3
+ "version": "2.85.30",
4
4
  "description": "abaplint - Command Line Interface",
5
5
  "bin": {
6
6
  "abaplint": "./abaplint"
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "homepage": "https://abaplint.org",
41
41
  "devDependencies": {
42
- "@abaplint/core": "^2.85.29",
42
+ "@abaplint/core": "^2.85.30",
43
43
  "@types/chai": "^4.3.0",
44
44
  "@types/glob": "^7.2.0",
45
45
  "@types/minimist": "^1.2.2",