@abaplint/transpiler-cli 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/build/bundle.js +5 -5
  2. package/package.json +3 -3
package/build/bundle.js CHANGED
@@ -11214,7 +11214,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
11214
11214
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
11215
11215
 
11216
11216
  "use strict";
11217
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.View = void 0;\r\nconst Types = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ \"./node_modules/@abaplint/core/build/src/objects/_abstract_object.js\");\r\nconst xml_utils_1 = __webpack_require__(/*! ../xml_utils */ \"./node_modules/@abaplint/core/build/src/xml_utils.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nclass View extends _abstract_object_1.AbstractObject {\r\n getType() {\r\n return \"VIEW\";\r\n }\r\n getAllowedNaming() {\r\n return {\r\n maxLength: 30,\r\n allowNamespace: true,\r\n };\r\n }\r\n getJoin() {\r\n var _a;\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.join;\r\n }\r\n setDirty() {\r\n this.parsedData = undefined;\r\n super.setDirty();\r\n }\r\n parseType(reg) {\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n if (this.parsedData === undefined) {\r\n return new Types.UnknownType(\"View, parser error\", this.getName());\r\n }\r\n const components = [];\r\n const references = [];\r\n const ddic = new ddic_1.DDIC(reg);\r\n for (const field of this.parsedData.fields) {\r\n if (field.VIEWFIELD === \"*\" || field.VIEWFIELD === \"-\") {\r\n // ignore, this is a special case of old style .INCLUDE\r\n continue;\r\n }\r\n const lookup = ddic.lookupTableOrView(field.TABNAME);\r\n let found = lookup.type;\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n if (field.VIEWFIELD === \".APPEND\") {\r\n // it is already expanded in the abapGit xml\r\n continue;\r\n }\r\n if (found instanceof Types.StructureType) {\r\n const s = found.getComponentByName(field.FIELDNAME);\r\n if (s === undefined) {\r\n found = new Types.UnknownType(field.FIELDNAME + \" not found in \" + field.TABNAME + \", VIEW parse type\");\r\n }\r\n else {\r\n found = s;\r\n }\r\n }\r\n components.push({\r\n name: field.VIEWFIELD,\r\n type: found\r\n });\r\n }\r\n reg.getDDICReferences().setUsing(this, references);\r\n if (components.length === 0) {\r\n return new Types.UnknownType(\"View \" + this.getName() + \" does not contain any components\");\r\n }\r\n return new Types.StructureType(components, this.getName());\r\n }\r\n getDescription() {\r\n // todo\r\n return undefined;\r\n }\r\n ///////////////\r\n parseXML() {\r\n var _a, _b;\r\n this.parsedData = { fields: [], join: [] };\r\n const parsed = super.parseRaw2();\r\n if (parsed === undefined || parsed.abapGit === undefined) {\r\n return;\r\n }\r\n const fields = (_a = parsed.abapGit[\"asx:abap\"][\"asx:values\"]) === null || _a === void 0 ? void 0 : _a.DD27P_TABLE;\r\n for (const field of (0, xml_utils_1.xmlToArray)(fields === null || fields === void 0 ? void 0 : fields.DD27P)) {\r\n this.parsedData.fields.push({\r\n VIEWFIELD: field.VIEWFIELD,\r\n TABNAME: field.TABNAME,\r\n FIELDNAME: field.FIELDNAME,\r\n });\r\n }\r\n const join = (_b = parsed.abapGit[\"asx:abap\"][\"asx:values\"]) === null || _b === void 0 ? void 0 : _b.DD28J_TABLE;\r\n for (const j of (0, xml_utils_1.xmlToArray)(join === null || join === void 0 ? void 0 : join.DD28J)) {\r\n this.parsedData.join.push({\r\n LTAB: j.LTAB,\r\n LFIELD: j.LFIELD,\r\n OPERATOR: j.OPERATOR,\r\n RTAB: j.RTAB,\r\n RFIELD: j.RFIELD,\r\n });\r\n }\r\n }\r\n}\r\nexports.View = View;\r\n//# sourceMappingURL=view.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/view.js?");
11217
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.View = void 0;\r\nconst Types = __webpack_require__(/*! ../abap/types/basic */ \"./node_modules/@abaplint/core/build/src/abap/types/basic/index.js\");\r\nconst _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ \"./node_modules/@abaplint/core/build/src/objects/_abstract_object.js\");\r\nconst xml_utils_1 = __webpack_require__(/*! ../xml_utils */ \"./node_modules/@abaplint/core/build/src/xml_utils.js\");\r\nconst ddic_1 = __webpack_require__(/*! ../ddic */ \"./node_modules/@abaplint/core/build/src/ddic.js\");\r\nclass View extends _abstract_object_1.AbstractObject {\r\n getType() {\r\n return \"VIEW\";\r\n }\r\n getAllowedNaming() {\r\n return {\r\n maxLength: 30,\r\n allowNamespace: true,\r\n };\r\n }\r\n getFields() {\r\n var _a;\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.fields;\r\n }\r\n getJoin() {\r\n var _a;\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.join;\r\n }\r\n setDirty() {\r\n this.parsedData = undefined;\r\n super.setDirty();\r\n }\r\n parseType(reg) {\r\n if (this.parsedData === undefined) {\r\n this.parseXML();\r\n }\r\n if (this.parsedData === undefined) {\r\n return new Types.UnknownType(\"View, parser error\", this.getName());\r\n }\r\n const components = [];\r\n const references = [];\r\n const ddic = new ddic_1.DDIC(reg);\r\n for (const field of this.parsedData.fields) {\r\n if (field.VIEWFIELD === \"*\" || field.VIEWFIELD === \"-\") {\r\n // ignore, this is a special case of old style .INCLUDE\r\n continue;\r\n }\r\n const lookup = ddic.lookupTableOrView(field.TABNAME);\r\n let found = lookup.type;\r\n if (lookup.object) {\r\n references.push({ object: lookup.object });\r\n }\r\n if (field.VIEWFIELD === \".APPEND\") {\r\n // it is already expanded in the abapGit xml\r\n continue;\r\n }\r\n if (found instanceof Types.StructureType) {\r\n const s = found.getComponentByName(field.FIELDNAME);\r\n if (s === undefined) {\r\n found = new Types.UnknownType(field.FIELDNAME + \" not found in \" + field.TABNAME + \", VIEW parse type\");\r\n }\r\n else {\r\n found = s;\r\n }\r\n }\r\n components.push({\r\n name: field.VIEWFIELD,\r\n type: found\r\n });\r\n }\r\n reg.getDDICReferences().setUsing(this, references);\r\n if (components.length === 0) {\r\n return new Types.UnknownType(\"View \" + this.getName() + \" does not contain any components\");\r\n }\r\n return new Types.StructureType(components, this.getName());\r\n }\r\n getDescription() {\r\n // todo\r\n return undefined;\r\n }\r\n ///////////////\r\n parseXML() {\r\n var _a, _b;\r\n this.parsedData = { fields: [], join: [] };\r\n const parsed = super.parseRaw2();\r\n if (parsed === undefined || parsed.abapGit === undefined) {\r\n return;\r\n }\r\n const fields = (_a = parsed.abapGit[\"asx:abap\"][\"asx:values\"]) === null || _a === void 0 ? void 0 : _a.DD27P_TABLE;\r\n for (const field of (0, xml_utils_1.xmlToArray)(fields === null || fields === void 0 ? void 0 : fields.DD27P)) {\r\n this.parsedData.fields.push({\r\n VIEWFIELD: field.VIEWFIELD,\r\n TABNAME: field.TABNAME,\r\n FIELDNAME: field.FIELDNAME,\r\n });\r\n }\r\n const join = (_b = parsed.abapGit[\"asx:abap\"][\"asx:values\"]) === null || _b === void 0 ? void 0 : _b.DD28J_TABLE;\r\n for (const j of (0, xml_utils_1.xmlToArray)(join === null || join === void 0 ? void 0 : join.DD28J)) {\r\n this.parsedData.join.push({\r\n LTAB: j.LTAB,\r\n LFIELD: j.LFIELD,\r\n OPERATOR: j.OPERATOR,\r\n RTAB: j.RTAB,\r\n RFIELD: j.RFIELD,\r\n });\r\n }\r\n }\r\n}\r\nexports.View = View;\r\n//# sourceMappingURL=view.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/objects/view.js?");
11218
11218
 
11219
11219
  /***/ }),
11220
11220
 
@@ -11324,7 +11324,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
11324
11324
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
11325
11325
 
11326
11326
  "use strict";
11327
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Indent = void 0;\r\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst _statement_1 = __webpack_require__(/*! ../abap/2_statements/statements/_statement */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js\");\r\nconst position_1 = __webpack_require__(/*! ../position */ \"./node_modules/@abaplint/core/build/src/position.js\");\r\n// todo, will break if there is multiple statements per line?\r\nclass Indent {\r\n constructor(options) {\r\n this.globalClasses = new Set();\r\n this.options = options || {};\r\n }\r\n execute(original, modified) {\r\n const statements = original.getStatements();\r\n const expected = this.getExpectedIndents(original);\r\n const lines = modified.split(\"\\n\");\r\n for (const statement of statements) {\r\n if (statement.getFirstToken().getStart() instanceof position_1.VirtualPosition) {\r\n continue; // macro contents\r\n }\r\n const exp = expected.shift();\r\n if (exp === undefined || exp < 0) {\r\n continue;\r\n }\r\n const row = statement.getFirstToken().getStart().getRow() - 1;\r\n lines[row] = lines[row].trim();\r\n for (let i = 1; i < exp; i++) {\r\n lines[row] = \" \" + lines[row];\r\n }\r\n }\r\n return lines.join(\"\\n\");\r\n }\r\n // returns list of expected indentation for each line/statement?\r\n getExpectedIndents(file) {\r\n const ret = [];\r\n const init = 1;\r\n const stack = new Stack();\r\n let indent = init;\r\n let parentIsEvent = false;\r\n let previousStatement = undefined;\r\n for (const statement of file.getStatements()) {\r\n if (statement.getFirstToken().getStart() instanceof position_1.VirtualPosition) {\r\n continue; // skip macro contents\r\n }\r\n const type = statement.get();\r\n if (type instanceof Statements.EndIf\r\n || type instanceof Statements.EndWhile\r\n || type instanceof Statements.EndModule\r\n || type instanceof Statements.EndSelect\r\n || type instanceof Statements.EndMethod\r\n || type instanceof Statements.EndAt\r\n || type instanceof Statements.Else\r\n || type instanceof Statements.EndExec\r\n || type instanceof Statements.EndOfDefinition\r\n || type instanceof Statements.EndLoop\r\n || type instanceof Statements.EndTestInjection\r\n || type instanceof Statements.EndTestSeam\r\n || type instanceof Statements.EndForm\r\n || type instanceof Statements.EndCatch\r\n || (this.options.selectionScreenBlockIndentation === true\r\n && type instanceof Statements.SelectionScreen\r\n && (statement.concatTokens().toUpperCase().includes(\"END OF SCREEN\") ||\r\n statement.concatTokens().toUpperCase().includes(\"END OF BLOCK\") ||\r\n statement.concatTokens().toUpperCase().includes(\"END OF LINE\")))\r\n || type instanceof Statements.ElseIf\r\n || type instanceof Statements.EndFunction\r\n || type instanceof Statements.EndInterface\r\n || type instanceof Statements.EndDo) {\r\n indent = indent - 2;\r\n }\r\n else if (type instanceof Statements.StartOfSelection\r\n || type instanceof Statements.AtSelectionScreen\r\n || type instanceof Statements.AtLineSelection\r\n || type instanceof Statements.Initialization\r\n || type instanceof Statements.AtUserCommand\r\n || type instanceof Statements.TopOfPage\r\n || type instanceof Statements.EndOfSelection\r\n || type instanceof Statements.LoadOfProgram) {\r\n indent = init;\r\n parentIsEvent = true;\r\n }\r\n else if (type instanceof Statements.Form\r\n || (type instanceof Statements.Include && parentIsEvent)\r\n || type instanceof Statements.Module\r\n || type instanceof Statements.ClassImplementation\r\n || type instanceof Statements.ClassDefinition) {\r\n indent = init;\r\n parentIsEvent = false;\r\n }\r\n else if (type instanceof Statements.Cleanup\r\n || type instanceof Statements.Catch) {\r\n indent = stack.peek() - 2;\r\n }\r\n else if (type instanceof Statements.Public\r\n || type instanceof Statements.Protected\r\n || type instanceof Statements.Private\r\n || type instanceof Statements.WhenType\r\n || type instanceof Statements.WhenOthers\r\n || type instanceof Statements.When) {\r\n indent = stack.peek();\r\n }\r\n else if (type instanceof Statements.EndTry) {\r\n indent = stack.pop() - (this.options.alignTryCatch ? 2 : 4);\r\n }\r\n else if (type instanceof Statements.EndClass\r\n || type instanceof Statements.EndCase) {\r\n indent = stack.pop() - 2;\r\n indent = Math.max(indent, init); // maybe move this out of switch before ret.push(indent)\r\n }\r\n else if (type instanceof _statement_1.Comment\r\n || type instanceof Statements.IncludeType\r\n || type instanceof _statement_1.Empty\r\n || type instanceof _statement_1.MacroContent) {\r\n ret.push(-1);\r\n previousStatement = statement;\r\n continue;\r\n }\r\n if (previousStatement\r\n && !(previousStatement.get() instanceof _statement_1.Comment)\r\n && previousStatement.getLastToken().getEnd().getRow() === statement.getFirstToken().getStart().getRow()) {\r\n // any indentation allowed if there are multiple statements on the same line\r\n ret.push(-1);\r\n previousStatement = statement;\r\n continue;\r\n }\r\n ret.push(indent);\r\n if (type instanceof Statements.If\r\n || type instanceof Statements.While\r\n || type instanceof Statements.Module\r\n || type instanceof Statements.SelectLoop\r\n || type instanceof Statements.FunctionModule\r\n || type instanceof Statements.Interface\r\n || type instanceof Statements.Do\r\n || type instanceof Statements.At\r\n || type instanceof Statements.ExecSQL\r\n || type instanceof Statements.Catch\r\n || type instanceof Statements.Define\r\n || type instanceof Statements.When\r\n || type instanceof Statements.WhenType\r\n || type instanceof Statements.WhenOthers\r\n || type instanceof Statements.Cleanup\r\n || type instanceof Statements.Loop\r\n || type instanceof Statements.LoopAtScreen\r\n || type instanceof Statements.CatchSystemExceptions\r\n || type instanceof Statements.Form\r\n || type instanceof Statements.Else\r\n || type instanceof Statements.ElseIf\r\n || type instanceof Statements.MethodImplementation\r\n || type instanceof Statements.TestInjection\r\n || type instanceof Statements.TestSeam\r\n || (this.options.selectionScreenBlockIndentation === true\r\n && type instanceof Statements.SelectionScreen\r\n && (statement.concatTokens().toUpperCase().includes(\"BEGIN OF SCREEN\") ||\r\n statement.concatTokens().toUpperCase().includes(\"BEGIN OF BLOCK\") ||\r\n statement.concatTokens().toUpperCase().includes(\"BEGIN OF LINE\")))\r\n || type instanceof Statements.StartOfSelection\r\n || type instanceof Statements.AtSelectionScreen\r\n || type instanceof Statements.AtLineSelection\r\n || type instanceof Statements.LoadOfProgram\r\n || type instanceof Statements.Initialization\r\n || type instanceof Statements.AtUserCommand\r\n || type instanceof Statements.TopOfPage\r\n || type instanceof Statements.EndOfSelection\r\n || type instanceof Statements.Public\r\n || type instanceof Statements.Protected\r\n || type instanceof Statements.Private) {\r\n indent = indent + 2;\r\n }\r\n else if (type instanceof Statements.Try) {\r\n indent = indent + (this.options.alignTryCatch ? 2 : 4);\r\n stack.push(indent);\r\n }\r\n else if (type instanceof Statements.ClassDefinition\r\n || type instanceof Statements.Case\r\n || type instanceof Statements.CaseType\r\n || type instanceof Statements.ClassImplementation) {\r\n indent = indent + (this.skipIndentForGlobalClass(statement) ? 0 : 2);\r\n stack.push(indent);\r\n }\r\n previousStatement = statement;\r\n }\r\n return ret;\r\n }\r\n skipIndentForGlobalClass(statement) {\r\n if (!this.options.globalClassSkipFirst) {\r\n return false;\r\n }\r\n const type = statement.get();\r\n if (type instanceof Statements.ClassDefinition && statement.findFirstExpression(Expressions.ClassGlobal)) {\r\n const className = statement.findFirstExpression(Expressions.ClassName);\r\n if (className) {\r\n this.globalClasses.add(className.getFirstToken().getStr().toUpperCase());\r\n }\r\n return true;\r\n }\r\n else if (type instanceof Statements.ClassImplementation) {\r\n const className = statement.findFirstExpression(Expressions.ClassName);\r\n if (className && this.globalClasses.has(className.getFirstToken().getStr().toUpperCase())) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\nexports.Indent = Indent;\r\nclass Stack {\r\n constructor() {\r\n this.items = [];\r\n }\r\n push(item) {\r\n this.items.push(item);\r\n }\r\n peek() {\r\n return this.items[this.items.length - 1];\r\n }\r\n pop() {\r\n const peek = this.peek();\r\n this.items = this.items.slice(0, this.items.length - 1);\r\n return peek;\r\n }\r\n}\r\n//# sourceMappingURL=indent.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/pretty_printer/indent.js?");
11327
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Indent = void 0;\r\nconst Statements = __webpack_require__(/*! ../abap/2_statements/statements */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js\");\r\nconst Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js\");\r\nconst _statement_1 = __webpack_require__(/*! ../abap/2_statements/statements/_statement */ \"./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js\");\r\nconst position_1 = __webpack_require__(/*! ../position */ \"./node_modules/@abaplint/core/build/src/position.js\");\r\n// todo, will break if there is multiple statements per line?\r\nclass Indent {\r\n constructor(options) {\r\n this.globalClasses = new Set();\r\n this.options = options || {};\r\n }\r\n execute(original, modified) {\r\n const statements = original.getStatements();\r\n const expected = this.getExpectedIndents(original);\r\n const lines = modified.split(\"\\n\");\r\n for (const statement of statements) {\r\n if (statement.getFirstToken().getStart() instanceof position_1.VirtualPosition) {\r\n continue; // macro contents\r\n }\r\n const exp = expected.shift();\r\n if (exp === undefined || exp < 0) {\r\n continue;\r\n }\r\n const row = statement.getFirstToken().getStart().getRow() - 1;\r\n lines[row] = lines[row].trim();\r\n for (let i = 1; i < exp; i++) {\r\n lines[row] = \" \" + lines[row];\r\n }\r\n }\r\n return lines.join(\"\\n\");\r\n }\r\n // returns list of expected indentation for each line/statement?\r\n getExpectedIndents(file) {\r\n const ret = [];\r\n const init = 1;\r\n const stack = new Stack();\r\n let indent = init;\r\n let parentIsEvent = false;\r\n let previousStatement = undefined;\r\n for (const statement of file.getStatements()) {\r\n if (statement.getFirstToken().getStart() instanceof position_1.VirtualPosition) {\r\n continue; // skip macro contents\r\n }\r\n const type = statement.get();\r\n if (type instanceof Statements.EndIf\r\n || type instanceof Statements.EndWhile\r\n || type instanceof Statements.EndModule\r\n || type instanceof Statements.EndSelect\r\n || type instanceof Statements.EndMethod\r\n || type instanceof Statements.EndAt\r\n || type instanceof Statements.Else\r\n || type instanceof Statements.EndExec\r\n || type instanceof Statements.EndOfDefinition\r\n || type instanceof Statements.EndLoop\r\n || type instanceof Statements.EndTestInjection\r\n || type instanceof Statements.EndTestSeam\r\n || type instanceof Statements.EndForm\r\n || type instanceof Statements.EndCatch\r\n || (this.options.selectionScreenBlockIndentation === true\r\n && type instanceof Statements.SelectionScreen\r\n && (statement.concatTokens().toUpperCase().includes(\"END OF SCREEN\") ||\r\n statement.concatTokens().toUpperCase().includes(\"END OF BLOCK\") ||\r\n statement.concatTokens().toUpperCase().includes(\"END OF LINE\")))\r\n || type instanceof Statements.ElseIf\r\n || type instanceof Statements.EndFunction\r\n || type instanceof Statements.EndInterface\r\n || type instanceof Statements.EndDo) {\r\n indent = indent - 2;\r\n }\r\n else if (type instanceof Statements.StartOfSelection\r\n || type instanceof Statements.AtSelectionScreen\r\n || type instanceof Statements.AtLineSelection\r\n || type instanceof Statements.Initialization\r\n || type instanceof Statements.AtUserCommand\r\n || type instanceof Statements.TopOfPage\r\n || type instanceof Statements.EndOfSelection\r\n || type instanceof Statements.LoadOfProgram) {\r\n indent = init;\r\n parentIsEvent = true;\r\n }\r\n else if (type instanceof Statements.Form\r\n || (type instanceof Statements.Include && parentIsEvent)\r\n || type instanceof Statements.Module\r\n || type instanceof Statements.ClassImplementation\r\n || type instanceof Statements.ClassDefinition) {\r\n indent = init;\r\n parentIsEvent = false;\r\n }\r\n else if (type instanceof Statements.Cleanup\r\n || type instanceof Statements.Catch) {\r\n indent = stack.peek() - 2;\r\n }\r\n else if (type instanceof Statements.Public\r\n || type instanceof Statements.Protected\r\n || type instanceof Statements.Private\r\n || type instanceof Statements.WhenType\r\n || type instanceof Statements.WhenOthers\r\n || type instanceof Statements.When) {\r\n indent = stack.peek();\r\n }\r\n else if (type instanceof Statements.EndTry) {\r\n indent = stack.pop() - (this.options.alignTryCatch ? 2 : 4);\r\n }\r\n else if (type instanceof Statements.EndClass\r\n || type instanceof Statements.EndCase) {\r\n indent = stack.pop() - 2;\r\n indent = Math.max(indent, init); // maybe move this out of switch before ret.push(indent)\r\n }\r\n else if (type instanceof _statement_1.Comment\r\n || type instanceof Statements.IncludeType\r\n || type instanceof _statement_1.Empty\r\n || type instanceof _statement_1.MacroContent) {\r\n ret.push(-1);\r\n previousStatement = statement;\r\n continue;\r\n }\r\n if (previousStatement\r\n && !(previousStatement.get() instanceof _statement_1.Comment)\r\n && previousStatement.getLastToken().getEnd().getRow() === statement.getFirstToken().getStart().getRow()) {\r\n // any indentation allowed if there are multiple statements on the same line\r\n ret.push(-1);\r\n previousStatement = statement;\r\n continue;\r\n }\r\n ret.push(indent);\r\n if (type instanceof Statements.If\r\n || type instanceof Statements.While\r\n || type instanceof Statements.Module\r\n || type instanceof Statements.SelectLoop\r\n || type instanceof Statements.FunctionModule\r\n || type instanceof Statements.Interface\r\n || type instanceof Statements.Do\r\n || type instanceof Statements.At\r\n || type instanceof Statements.ExecSQL\r\n || type instanceof Statements.Catch\r\n || type instanceof Statements.Define\r\n || type instanceof Statements.When\r\n || type instanceof Statements.WhenType\r\n || type instanceof Statements.WhenOthers\r\n || type instanceof Statements.Cleanup\r\n || type instanceof Statements.Loop\r\n || type instanceof Statements.LoopAtScreen\r\n || type instanceof Statements.CatchSystemExceptions\r\n || type instanceof Statements.Form\r\n || type instanceof Statements.Else\r\n || type instanceof Statements.ElseIf\r\n || type instanceof Statements.MethodImplementation\r\n || type instanceof Statements.TestInjection\r\n || type instanceof Statements.TestSeam\r\n || (this.options.selectionScreenBlockIndentation === true\r\n && type instanceof Statements.SelectionScreen\r\n && (statement.concatTokens().toUpperCase().includes(\"BEGIN OF SCREEN\") ||\r\n statement.concatTokens().toUpperCase().includes(\"BEGIN OF TABBED BLOCK\") ||\r\n statement.concatTokens().toUpperCase().includes(\"BEGIN OF BLOCK\") ||\r\n statement.concatTokens().toUpperCase().includes(\"BEGIN OF LINE\")))\r\n || type instanceof Statements.StartOfSelection\r\n || type instanceof Statements.AtSelectionScreen\r\n || type instanceof Statements.AtLineSelection\r\n || type instanceof Statements.LoadOfProgram\r\n || type instanceof Statements.Initialization\r\n || type instanceof Statements.AtUserCommand\r\n || type instanceof Statements.TopOfPage\r\n || type instanceof Statements.EndOfSelection\r\n || type instanceof Statements.Public\r\n || type instanceof Statements.Protected\r\n || type instanceof Statements.Private) {\r\n indent = indent + 2;\r\n }\r\n else if (type instanceof Statements.Try) {\r\n indent = indent + (this.options.alignTryCatch ? 2 : 4);\r\n stack.push(indent);\r\n }\r\n else if (type instanceof Statements.ClassDefinition\r\n || type instanceof Statements.Case\r\n || type instanceof Statements.CaseType\r\n || type instanceof Statements.ClassImplementation) {\r\n indent = indent + (this.skipIndentForGlobalClass(statement) ? 0 : 2);\r\n stack.push(indent);\r\n }\r\n previousStatement = statement;\r\n }\r\n return ret;\r\n }\r\n skipIndentForGlobalClass(statement) {\r\n if (!this.options.globalClassSkipFirst) {\r\n return false;\r\n }\r\n const type = statement.get();\r\n if (type instanceof Statements.ClassDefinition && statement.findFirstExpression(Expressions.ClassGlobal)) {\r\n const className = statement.findFirstExpression(Expressions.ClassName);\r\n if (className) {\r\n this.globalClasses.add(className.getFirstToken().getStr().toUpperCase());\r\n }\r\n return true;\r\n }\r\n else if (type instanceof Statements.ClassImplementation) {\r\n const className = statement.findFirstExpression(Expressions.ClassName);\r\n if (className && this.globalClasses.has(className.getFirstToken().getStr().toUpperCase())) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\nexports.Indent = Indent;\r\nclass Stack {\r\n constructor() {\r\n this.items = [];\r\n }\r\n push(item) {\r\n this.items.push(item);\r\n }\r\n peek() {\r\n return this.items[this.items.length - 1];\r\n }\r\n pop() {\r\n const peek = this.peek();\r\n this.items = this.items.slice(0, this.items.length - 1);\r\n return peek;\r\n }\r\n}\r\n//# sourceMappingURL=indent.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/core/build/src/pretty_printer/indent.js?");
11328
11328
 
11329
11329
  /***/ }),
11330
11330
 
@@ -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.34\";\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.35\";\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
 
@@ -13216,7 +13216,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
13216
13216
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
13217
13217
 
13218
13218
  "use strict";
13219
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.SQLiteDatabaseSchema = void 0;\r\nconst abaplint = __webpack_require__(/*! @abaplint/core */ \"./node_modules/@abaplint/core/build/src/index.js\");\r\nclass SQLiteDatabaseSchema {\r\n constructor(reg) {\r\n this.reg = reg;\r\n }\r\n run() {\r\n const statements = [];\r\n // CREATE TABLEs\r\n for (const obj of this.reg.getObjects()) {\r\n if (obj instanceof abaplint.Objects.Table\r\n && obj.getTableCategory() === abaplint.Objects.TableCategory.Transparent) {\r\n statements.push(this.buildTABL(obj).trim());\r\n }\r\n else if (obj instanceof abaplint.Objects.View) {\r\n statements.push(this.buildVIEW(obj).trim());\r\n }\r\n }\r\n return statements;\r\n }\r\n //////////////////\r\n // https://www.sqlite.org/lang_createview.html\r\n buildVIEW(view) {\r\n // @ts-ignore\r\n const fields = view.parsedData.fields; // todo, call method introduced in https://github.com/abaplint/abaplint/pull/2714\r\n const columns = fields.map((f) => f.TABNAME.toLowerCase() + \".\" + f.FIELDNAME.toLowerCase() + \" AS \" + f.VIEWFIELD.toLowerCase()).join(\", \");\r\n let from = \"\";\r\n let previous = \"\";\r\n for (const j of view.getJoin() || []) {\r\n if (previous === \"\") {\r\n from += j.LTAB.toLowerCase() + \" INNER JOIN \" + j.RTAB.toLowerCase() + \" ON \" + j.LTAB.toLowerCase() + \".\" + j.LFIELD.toLowerCase() + \" = \" + j.RTAB.toLowerCase() + \".\" + j.RFIELD.toLowerCase();\r\n }\r\n else if (previous === j.LTAB + \",\" + j.RTAB) {\r\n from += \" AND \" + j.LTAB.toLowerCase() + \".\" + j.LFIELD.toLowerCase() + \" = \" + j.RTAB.toLowerCase() + \".\" + j.RFIELD.toLowerCase();\r\n }\r\n else {\r\n from += \" INNER JOIN \" + j.RTAB.toLowerCase() + \" ON \" + j.LTAB.toLowerCase() + \".\" + j.LFIELD.toLowerCase() + \" = \" + j.RTAB.toLowerCase() + \".\" + j.RFIELD.toLowerCase();\r\n }\r\n previous = j.LTAB + \",\" + j.RTAB;\r\n }\r\n from = from.trim();\r\n return `CREATE VIEW ${view.getName().toLowerCase()} AS SELECT ${columns} FROM ${from};\\n`;\r\n }\r\n buildTABL(tabl) {\r\n const type = tabl.parseType(this.reg);\r\n if (!(type instanceof abaplint.BasicTypes.StructureType)) {\r\n return \"\";\r\n }\r\n const fields = [];\r\n for (const field of type.getComponents()) {\r\n fields.push(\"'\" + field.name.toLowerCase() + \"' \" + this.toType(field.type, field.name, tabl.getName()));\r\n }\r\n // assumption: all transparent tables have primary keys\r\n // add single quotes to field names to allow for keywords as field names\r\n const key = \", PRIMARY KEY(\" + tabl.listKeys().map(e => \"'\" + e.toLowerCase() + \"'\").join(\",\") + \")\";\r\n return `CREATE TABLE ${tabl.getName().toLowerCase()} (${fields.join(\", \")}${key});\\n`;\r\n }\r\n toType(type, fieldname, errorInfo) {\r\n if (type instanceof abaplint.BasicTypes.CharacterType) {\r\n return `NCHAR(${type.getLength()})`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.TimeType) {\r\n return `NCHAR(6)`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.DateType) {\r\n return `NCHAR(8)`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.NumericType) {\r\n // it will be fine, the runtime representation of numc is also text\r\n return `NCHAR(${type.getLength()})`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.StringType) {\r\n return `TEXT`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.XStringType) {\r\n // it will be fine, the runtime representation of xstring is also text\r\n return `TEXT`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.HexType) {\r\n return `NCHAR(${type.getLength() * 2})`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.IntegerType) {\r\n return `INT`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.FloatType\r\n || type instanceof abaplint.BasicTypes.FloatingPointType) {\r\n return `REAL`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.PackedType) {\r\n return `DECIMAL(${type.getLength()},${type.getDecimals()})`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.VoidType) {\r\n throw `Type of ${errorInfo}-${fieldname} is VoidType(${type.getVoided()}), make sure the type is known, enable strict syntax checking`;\r\n }\r\n else {\r\n throw \"database_setup: \" + errorInfo + \"-\" + fieldname + \", todo toType handle: \" + type.constructor.name;\r\n }\r\n }\r\n}\r\nexports.SQLiteDatabaseSchema = SQLiteDatabaseSchema;\r\n//# sourceMappingURL=sqlite_database_schema.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/transpiler/build/src/db/sqlite_database_schema.js?");
13219
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.SQLiteDatabaseSchema = void 0;\r\nconst abaplint = __webpack_require__(/*! @abaplint/core */ \"./node_modules/@abaplint/core/build/src/index.js\");\r\nclass SQLiteDatabaseSchema {\r\n constructor(reg) {\r\n this.reg = reg;\r\n }\r\n run() {\r\n const statements = [];\r\n // CREATE TABLEs\r\n for (const obj of this.reg.getObjects()) {\r\n if (obj instanceof abaplint.Objects.Table\r\n && obj.getTableCategory() === abaplint.Objects.TableCategory.Transparent) {\r\n statements.push(this.buildTABL(obj).trim());\r\n }\r\n }\r\n // CREATE VIEWs after TABLEs\r\n // todo: what if the view is based on another view?\r\n for (const obj of this.reg.getObjects()) {\r\n if (obj instanceof abaplint.Objects.View) {\r\n statements.push(this.buildVIEW(obj).trim());\r\n }\r\n }\r\n return statements;\r\n }\r\n //////////////////\r\n // https://www.sqlite.org/lang_createview.html\r\n buildVIEW(view) {\r\n const fields = view.getFields();\r\n const columns = fields === null || fields === void 0 ? void 0 : fields.map((f) => f.TABNAME.toLowerCase() + \".\" + f.FIELDNAME.toLowerCase() + \" AS \" + f.VIEWFIELD.toLowerCase()).join(\", \");\r\n let from = \"\";\r\n let previous = \"\";\r\n for (const j of view.getJoin() || []) {\r\n if (previous === \"\") {\r\n from += j.LTAB.toLowerCase() + \" INNER JOIN \" + j.RTAB.toLowerCase() + \" ON \" + j.LTAB.toLowerCase() + \".\" + j.LFIELD.toLowerCase() + \" = \" + j.RTAB.toLowerCase() + \".\" + j.RFIELD.toLowerCase();\r\n }\r\n else if (previous === j.LTAB + \",\" + j.RTAB) {\r\n from += \" AND \" + j.LTAB.toLowerCase() + \".\" + j.LFIELD.toLowerCase() + \" = \" + j.RTAB.toLowerCase() + \".\" + j.RFIELD.toLowerCase();\r\n }\r\n else {\r\n from += \" INNER JOIN \" + j.RTAB.toLowerCase() + \" ON \" + j.LTAB.toLowerCase() + \".\" + j.LFIELD.toLowerCase() + \" = \" + j.RTAB.toLowerCase() + \".\" + j.RFIELD.toLowerCase();\r\n }\r\n previous = j.LTAB + \",\" + j.RTAB;\r\n }\r\n from = from.trim();\r\n return `CREATE VIEW ${view.getName().toLowerCase()} AS SELECT ${columns} FROM ${from};\\n`;\r\n }\r\n buildTABL(tabl) {\r\n const type = tabl.parseType(this.reg);\r\n if (!(type instanceof abaplint.BasicTypes.StructureType)) {\r\n return \"\";\r\n }\r\n const fields = [];\r\n for (const field of type.getComponents()) {\r\n fields.push(\"'\" + field.name.toLowerCase() + \"' \" + this.toType(field.type, field.name, tabl.getName()));\r\n }\r\n // assumption: all transparent tables have primary keys\r\n // add single quotes to field names to allow for keywords as field names\r\n const key = \", PRIMARY KEY(\" + tabl.listKeys().map(e => \"'\" + e.toLowerCase() + \"'\").join(\",\") + \")\";\r\n return `CREATE TABLE ${tabl.getName().toLowerCase()} (${fields.join(\", \")}${key});\\n`;\r\n }\r\n toType(type, fieldname, errorInfo) {\r\n if (type instanceof abaplint.BasicTypes.CharacterType) {\r\n return `NCHAR(${type.getLength()})`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.TimeType) {\r\n return `NCHAR(6)`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.DateType) {\r\n return `NCHAR(8)`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.NumericType) {\r\n // it will be fine, the runtime representation of numc is also text\r\n return `NCHAR(${type.getLength()})`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.StringType) {\r\n return `TEXT`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.XStringType) {\r\n // it will be fine, the runtime representation of xstring is also text\r\n return `TEXT`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.HexType) {\r\n return `NCHAR(${type.getLength() * 2})`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.IntegerType) {\r\n return `INT`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.FloatType\r\n || type instanceof abaplint.BasicTypes.FloatingPointType) {\r\n return `REAL`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.PackedType) {\r\n return `DECIMAL(${type.getLength()},${type.getDecimals()})`;\r\n }\r\n else if (type instanceof abaplint.BasicTypes.VoidType) {\r\n throw `Type of ${errorInfo}-${fieldname} is VoidType(${type.getVoided()}), make sure the type is known, enable strict syntax checking`;\r\n }\r\n else {\r\n throw \"database_setup: \" + errorInfo + \"-\" + fieldname + \", todo toType handle: \" + type.constructor.name;\r\n }\r\n }\r\n}\r\nexports.SQLiteDatabaseSchema = SQLiteDatabaseSchema;\r\n//# sourceMappingURL=sqlite_database_schema.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/transpiler/build/src/db/sqlite_database_schema.js?");
13220
13220
 
13221
13221
  /***/ }),
13222
13222
 
@@ -13799,7 +13799,7 @@ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\n
13799
13799
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
13800
13800
 
13801
13801
  "use strict";
13802
- eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Keywords = void 0;\r\nconst abaplint = __webpack_require__(/*! @abaplint/core */ \"./node_modules/@abaplint/core/build/src/index.js\");\r\n/** Replaces javascript keywords in ABAP source code, in-memory only */\r\nclass Keywords {\r\n handle(reg) {\r\n reg.parse();\r\n for (const o of reg.getObjects()) {\r\n if (!(o instanceof abaplint.ABAPObject)) {\r\n continue;\r\n }\r\n for (const f of o.getABAPFiles()) {\r\n let tokens = [];\r\n for (const s of f.getStatements()) {\r\n tokens = tokens.concat(this.traverse(s, f));\r\n }\r\n if (tokens.length === 0) {\r\n continue;\r\n }\r\n const rows = f.getRawRows();\r\n for (const t of tokens.reverse()) {\r\n const original = rows[t.getRow() - 1];\r\n const index = t.getEnd().getCol() - 1;\r\n rows[t.getRow() - 1] = original.substring(0, index) + \"_\" + original.substring(index);\r\n }\r\n reg.updateFile(new abaplint.MemoryFile(f.getFilename(), rows.join(\"\\n\")));\r\n }\r\n }\r\n reg.parse();\r\n }\r\n traverse(node, file) {\r\n // https://www.w3schools.com/js/js_reserved.asp\r\n const keywords = [\r\n \"abstract\", \"arguments\", \"await\",\r\n \"break\", \"byte\", \"catch\",\r\n \"char\", \"class\", \"const\", \"continue\",\r\n \"debugger\", \"default\", \"do\",\r\n \"double\", \"else\", \"enum\", \"eval\",\r\n \"export\", \"extends\", \"false\", \"final\",\r\n \"finally\", \"for\", \"function\",\r\n \"goto\", \"if\", \"implements\", \"import\",\r\n \"in\", \"instanceof\", \"interface\",\r\n \"let\", \"long\", \"native\", \"new\",\r\n \"null\", \"package\", \"private\",\r\n \"public\", \"return\", \"short\", \"static\",\r\n \"switch\", \"synchronized\", \"this\",\r\n \"throw\", \"throws\", \"transient\", \"true\",\r\n \"try\", \"typeof\", \"var\", \"void\",\r\n \"volatile\", \"while\", \"yield\"\r\n ];\r\n // \"with\"\r\n // \"delete\"\r\n let ret = [];\r\n for (const c of node.getChildren()) {\r\n if (c instanceof abaplint.Nodes.TokenNodeRegex) {\r\n if (keywords.some(k => k === c.getFirstToken().getStr().toLowerCase())) {\r\n ret.push(c.getFirstToken());\r\n }\r\n }\r\n else if (c instanceof abaplint.Nodes.TokenNode) {\r\n continue;\r\n }\r\n else {\r\n ret = ret.concat(this.traverse(c, file));\r\n }\r\n }\r\n return ret;\r\n }\r\n}\r\nexports.Keywords = Keywords;\r\n//# sourceMappingURL=keywords.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/transpiler/build/src/keywords.js?");
13802
+ eval("\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Keywords = void 0;\r\nconst abaplint = __webpack_require__(/*! @abaplint/core */ \"./node_modules/@abaplint/core/build/src/index.js\");\r\n/** Replaces javascript keywords in ABAP source code, in-memory only */\r\nclass Keywords {\r\n handle(reg) {\r\n reg.parse();\r\n for (const o of reg.getObjects()) {\r\n if (!(o instanceof abaplint.ABAPObject)) {\r\n continue;\r\n }\r\n for (const f of o.getABAPFiles()) {\r\n const tokens = [];\r\n for (const s of f.getStatements()) {\r\n tokens.push(...this.traverse(s, f));\r\n }\r\n if (tokens.length === 0) {\r\n continue;\r\n }\r\n const rows = f.getRawRows();\r\n for (const t of tokens.reverse()) {\r\n const original = rows[t.getRow() - 1];\r\n const index = t.getEnd().getCol() - 1;\r\n rows[t.getRow() - 1] = original.substring(0, index) + \"_\" + original.substring(index);\r\n }\r\n reg.updateFile(new abaplint.MemoryFile(f.getFilename(), rows.join(\"\\n\")));\r\n }\r\n }\r\n reg.parse();\r\n }\r\n traverse(node, file) {\r\n // https://www.w3schools.com/js/js_reserved.asp\r\n const keywords = [\r\n \"abstract\", \"arguments\", \"await\",\r\n \"break\", \"byte\", \"catch\",\r\n \"char\", \"class\", \"const\", \"continue\",\r\n \"debugger\", \"default\", \"do\",\r\n \"double\", \"else\", \"enum\", \"eval\",\r\n \"export\", \"extends\", \"false\", \"final\",\r\n \"finally\", \"for\", \"function\",\r\n \"goto\", \"if\", \"implements\", \"import\",\r\n \"in\", \"instanceof\", \"interface\",\r\n \"let\", \"long\", \"native\", \"new\",\r\n \"null\", \"package\", \"private\",\r\n \"public\", \"return\", \"short\", \"static\",\r\n \"switch\", \"synchronized\", \"this\",\r\n \"throw\", \"throws\", \"transient\", \"true\",\r\n \"try\", \"typeof\", \"var\", \"void\",\r\n \"volatile\", \"while\", \"yield\"\r\n ];\r\n // \"with\"\r\n // \"delete\"\r\n keywords.push(...keywords.map(k => \"!\" + k));\r\n let ret = [];\r\n for (const c of node.getChildren()) {\r\n if (c instanceof abaplint.Nodes.TokenNodeRegex) {\r\n if (keywords.some(k => k === c.getFirstToken().getStr().toLowerCase())) {\r\n ret.push(c.getFirstToken());\r\n }\r\n }\r\n else if (c instanceof abaplint.Nodes.TokenNode) {\r\n continue;\r\n }\r\n else {\r\n ret = ret.concat(this.traverse(c, file));\r\n }\r\n }\r\n return ret;\r\n }\r\n}\r\nexports.Keywords = Keywords;\r\n//# sourceMappingURL=keywords.js.map\n\n//# sourceURL=webpack://@abaplint/transpiler-cli/./node_modules/@abaplint/transpiler/build/src/keywords.js?");
13803
13803
 
13804
13804
  /***/ }),
13805
13805
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/transpiler-cli",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
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.2.0",
28
+ "@abaplint/transpiler": "^2.2.1",
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.34",
32
+ "@abaplint/core": "^2.93.35",
33
33
  "progress": "^2.0.3",
34
34
  "webpack": "^5.74.0",
35
35
  "webpack-cli": "^4.10.0",