From a0b0526011cf7744bb1cc1a0ab6db880c6a03b5d Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 24 Oct 2020 12:21:45 +0200 Subject: [PATCH] 2.58.11, downport, outline READ TABLE INTO (#1485) * downport, outline READ TABLE INTO * downport EMPTY KEY, #1479 * 2.58.11 --- packages/cli/package-lock.json | 8 +++---- packages/cli/package.json | 4 ++-- packages/core/package-lock.json | 2 +- packages/core/package.json | 2 +- packages/core/src/rules/downport.ts | 35 ++++++++++++++++++++++++---- packages/core/test/rules/downport.ts | 23 ++++++++++++++++++ packages/monaco/package-lock.json | 8 +++---- packages/monaco/package.json | 4 ++-- web/playground/package-lock.json | 14 +++++------ web/playground/package.json | 2 +- 10 files changed, 76 insertions(+), 26 deletions(-) diff --git a/packages/cli/package-lock.json b/packages/cli/package-lock.json index 7d4879fa2c..fe7f39f89a 100644 --- a/packages/cli/package-lock.json +++ b/packages/cli/package-lock.json @@ -1,13 +1,13 @@ { "name": "@abaplint/cli", - "version": "2.58.10", + "version": "2.58.11", "lockfileVersion": 1, "requires": true, "dependencies": { "@abaplint/core": { - "version": "2.58.10", - "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.58.10.tgz", - "integrity": "sha512-UqSrQHrh97VlrTUK0gjJi3bvJgDhERfv2yb44dJgN6cOyru9dPIikhQ9qDYwKLb0JhkqlqRCDnRpFmZUq4MH5Q==", + "version": "2.58.11", + "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.58.11.tgz", + "integrity": "sha512-+ykt8pIJyO2GFRFGBPNbY6z3baf8KPvgJMKUS4ItLTc4zzVwavwnwKdk4maY5m7f2J3xfCmYndpcmd9s1q+dyQ==", "dev": true, "requires": { "json5": "^2.1.3", diff --git a/packages/cli/package.json b/packages/cli/package.json index 9318cd4f00..9bede715ec 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@abaplint/cli", - "version": "2.58.10", + "version": "2.58.11", "description": "abaplint - Command Line Interface", "bin": { "abaplint": "./abaplint" @@ -38,7 +38,7 @@ }, "homepage": "https://abaplint.org", "devDependencies": { - "@abaplint/core": "^2.58.10", + "@abaplint/core": "^2.58.11", "@types/chai": "^4.2.14", "@types/glob": "^7.1.3", "@types/minimist": "^1.2.0", diff --git a/packages/core/package-lock.json b/packages/core/package-lock.json index 176d9f73bc..37ded4e2f6 100644 --- a/packages/core/package-lock.json +++ b/packages/core/package-lock.json @@ -1,6 +1,6 @@ { "name": "@abaplint/core", - "version": "2.58.10", + "version": "2.58.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/core/package.json b/packages/core/package.json index 99ec9510b6..5feaccadbf 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@abaplint/core", - "version": "2.58.10", + "version": "2.58.11", "description": "abaplint - Core API", "main": "build/src/index.js", "typings": "build/abaplint.d.ts", diff --git a/packages/core/src/rules/downport.ts b/packages/core/src/rules/downport.ts index 2805ef2d83..2befc43d72 100644 --- a/packages/core/src/rules/downport.ts +++ b/packages/core/src/rules/downport.ts @@ -39,6 +39,7 @@ Target downport version is always v702, thus rule is only enabled if target vers Current rules: * NEW transformed to CREATE OBJECT, opposite of https://rules.abaplint.org/use_new/ * outline, opposite of https://rules.abaplint.org/prefer_inline/ +* EMPTY KEY is changed to DEFAULT KEY Future rules, todo: * boolc, opposite of https://rules.abaplint.org/prefer_xsdbool/ @@ -144,7 +145,12 @@ Only one transformation is applied to a statement at a time, so multiple steps m return undefined; } - let found = this.outlineData(high, lowFile, highSyntax); + let found = this.emptyKey(high, lowFile); + if (found) { + return found; + } + + found = this.outlineData(high, lowFile, highSyntax); if (found) { return found; } @@ -161,6 +167,25 @@ Only one transformation is applied to a statement at a time, so multiple steps m ////////////////////////////////////////// + private emptyKey(node: StatementNode, lowFile: ABAPFile): Issue | undefined { + + for (const i of node.findAllExpressions(Expressions.TypeTable)) { + const concat = i.concatTokens(); + if (concat.includes("WITH EMPTY KEY") === false) { + continue; + } + const token = i.findDirectTokenByText("EMPTY"); + if (token === undefined) { + continue; + } + + const fix = EditHelper.replaceToken(lowFile, token, "DEFAULT"); + return Issue.atToken(lowFile, i.getFirstToken(), "Downport EMPTY KEY", this.getMetadata().key, this.conf.severity, fix); + } + + return; + } + private outlineData(node: StatementNode, lowFile: ABAPFile, highSyntax: ISyntaxResult): Issue | undefined { for (const i of node.findAllExpressions(Expressions.InlineData)) { @@ -179,9 +204,11 @@ Only one transformation is applied to a statement at a time, so multiple steps m } const type = found.getType().getQualifiedName() ? found.getType().getQualifiedName() : found.getType().toABAP(); - // todo, this assumes that the statement starts with "DATA(" - const code = `DATA ${name} TYPE ${type}.\n${name}`; - const fix = EditHelper.replaceRange(lowFile, i.getFirstToken().getStart(), i.getLastToken().getEnd(), code); + const code = `DATA ${name} TYPE ${type}.\n`; + const fix1 = EditHelper.insertAt(lowFile, node.getFirstToken().getStart(), code); + const fix2 = EditHelper.replaceRange(lowFile, i.getFirstToken().getStart(), i.getLastToken().getEnd(), name); + const fix = EditHelper.merge(fix2, fix1); + return Issue.atToken(lowFile, i.getFirstToken(), "Outline DATA", this.getMetadata().key, this.conf.severity, fix); } diff --git a/packages/core/test/rules/downport.ts b/packages/core/test/rules/downport.ts index 633b7250ab..3ee490a2f8 100644 --- a/packages/core/test/rules/downport.ts +++ b/packages/core/test/rules/downport.ts @@ -304,4 +304,27 @@ foobar = lcl_class=>m( ). testFix(abap, expected); }); + it("outline, READ TABLE INTO", async () => { + const abap = ` + DATA tab TYPE STANDARD TABLE OF i WITH DEFAULT KEY. + APPEND 2 TO tab. + READ TABLE tab INDEX 1 INTO DATA(row).`; + + const expected = ` + DATA tab TYPE STANDARD TABLE OF i WITH DEFAULT KEY. + APPEND 2 TO tab. + DATA row TYPE i. +READ TABLE tab INDEX 1 INTO row.`; + + testFix(abap, expected); + }); + + it("EMPTY KEY", async () => { + const abap = `DATA tab TYPE STANDARD TABLE OF i WITH EMPTY KEY.`; + + const expected = `DATA tab TYPE STANDARD TABLE OF i WITH DEFAULT KEY.`; + + testFix(abap, expected); + }); + }); diff --git a/packages/monaco/package-lock.json b/packages/monaco/package-lock.json index db1a123c47..73a9a11ca5 100644 --- a/packages/monaco/package-lock.json +++ b/packages/monaco/package-lock.json @@ -1,13 +1,13 @@ { "name": "@abaplint/monaco", - "version": "2.58.10", + "version": "2.58.11", "lockfileVersion": 1, "requires": true, "dependencies": { "@abaplint/core": { - "version": "2.58.10", - "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.58.10.tgz", - "integrity": "sha512-UqSrQHrh97VlrTUK0gjJi3bvJgDhERfv2yb44dJgN6cOyru9dPIikhQ9qDYwKLb0JhkqlqRCDnRpFmZUq4MH5Q==", + "version": "2.58.11", + "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.58.11.tgz", + "integrity": "sha512-+ykt8pIJyO2GFRFGBPNbY6z3baf8KPvgJMKUS4ItLTc4zzVwavwnwKdk4maY5m7f2J3xfCmYndpcmd9s1q+dyQ==", "requires": { "json5": "^2.1.3", "vscode-languageserver-types": "^3.15.1", diff --git a/packages/monaco/package.json b/packages/monaco/package.json index 17cb513656..18504cc0d8 100644 --- a/packages/monaco/package.json +++ b/packages/monaco/package.json @@ -1,6 +1,6 @@ { "name": "@abaplint/monaco", - "version": "2.58.10", + "version": "2.58.11", "description": "ABAP language support for Monaco Editor", "main": "build/index.js", "typings": "build/index.d.ts", @@ -24,6 +24,6 @@ "vscode-languageserver-types": "^3.15.1" }, "dependencies": { - "@abaplint/core": "^2.58.10" + "@abaplint/core": "^2.58.11" } } diff --git a/web/playground/package-lock.json b/web/playground/package-lock.json index ed42728c5b..dfc5fb8118 100644 --- a/web/playground/package-lock.json +++ b/web/playground/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@abaplint/core": { - "version": "2.58.10", - "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.58.10.tgz", - "integrity": "sha512-UqSrQHrh97VlrTUK0gjJi3bvJgDhERfv2yb44dJgN6cOyru9dPIikhQ9qDYwKLb0JhkqlqRCDnRpFmZUq4MH5Q==", + "version": "2.58.11", + "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.58.11.tgz", + "integrity": "sha512-+ykt8pIJyO2GFRFGBPNbY6z3baf8KPvgJMKUS4ItLTc4zzVwavwnwKdk4maY5m7f2J3xfCmYndpcmd9s1q+dyQ==", "dev": true, "requires": { "json5": "^2.1.3", @@ -27,12 +27,12 @@ } }, "@abaplint/monaco": { - "version": "2.58.10", - "resolved": "https://registry.npmjs.org/@abaplint/monaco/-/monaco-2.58.10.tgz", - "integrity": "sha512-NouhpWo/fuFzw86p+EB7Or0/eue7qKH/d8eHHcTUurNIQ+D3/+0ePp5d4H16C7ivQ/Kz/WOTYHhiyjdtCo0/gA==", + "version": "2.58.11", + "resolved": "https://registry.npmjs.org/@abaplint/monaco/-/monaco-2.58.11.tgz", + "integrity": "sha512-7fnvAkEMaGlLQCHUt5YyiJV3L4GpGk6VVwJL2L1w7nCGJqeotvgpCVnlM2iWjVaXcA/m4kiHW3eFy0GqXDJYkw==", "dev": true, "requires": { - "@abaplint/core": "^2.58.10" + "@abaplint/core": "^2.58.11" } }, "@hapi/address": { diff --git a/web/playground/package.json b/web/playground/package.json index d705769f0d..9b4ce875dd 100644 --- a/web/playground/package.json +++ b/web/playground/package.json @@ -21,7 +21,7 @@ "vscode-languageserver-types": "^3.15.1" }, "devDependencies": { - "@abaplint/monaco": "^2.58.10", + "@abaplint/monaco": "^2.58.11", "css-loader": "^5.0.0", "file-loader": "^6.1.1", "html-webpack-plugin": "^4.5.0",