Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 11245x 11245x 11245x 11245x 11245x 33576x 33576x 33576x 33576x 33576x 33576x 33576x 33576x 33576x 33576x 33576x 11245x 11245x 10759x 10759x 11245x 11245x 228x 228x 11245x 11245x 243x 243x 243x 1373x 1360x 1360x 13x 1373x 2x 2x 2x 2x 2x 1373x 243x 243x 243x 11245x 11245x 2x 2x 2x 2x 2x 4x 4x 4x 2x 2x 11245x 11245x | import * as Expressions from "../abap/2_statements/expressions"; import * as Statements from "../abap/2_statements/statements"; import {Issue} from "../issue"; import {ABAPRule} from "./_abap_rule"; import {BasicRuleConfig} from "./_basic_rule_config"; import {IRuleMetadata, RuleTag} from "./_irule"; import {ABAPFile} from "../abap/abap_file"; import {StatementNode} from "../abap/nodes"; import {EditHelper, IEdit} from "../edit_helper"; export class NoChainedAssignmentConf extends BasicRuleConfig { } export class NoChainedAssignment extends ABAPRule { private conf = new NoChainedAssignmentConf(); public getMetadata(): IRuleMetadata { return { key: "no_chained_assignment", title: "No chained assignment", shortDescription: `Find chained assingments and reports issues`, extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-chain-assignments`, tags: [RuleTag.SingleFile, RuleTag.Styleguide, RuleTag.Quickfix], badExample: `var1 = var2 = var3.`, goodExample: `var2 = var3. var1 = var2.`, }; } public getConfig() { return this.conf; } public setConfig(conf: NoChainedAssignmentConf) { this.conf = conf; } public runParsed(file: ABAPFile) { const issues: Issue[] = []; for (const s of file.getStatements()) { if (!(s.get() instanceof Statements.Move)) { continue; } if (s.findDirectExpressions(Expressions.Target).length >= 2) { const message = "No chained assignment"; const fix = this.buildFix(file, s); const issue = Issue.atStatement(file, s, message, this.getMetadata().key, this.getConfig().severity, fix); issues.push(issue); } } return issues; } private buildFix(file: ABAPFile, node: StatementNode): IEdit | undefined{ // window of 3 expressions const children = node.getChildren(); let res = ""; for (let i = children.length - 4; i >= 0 ; i = i - 2) { const concat = children[i].concatTokens() + " " + children[i + 1].concatTokens() + " " + children[i + 2].concatTokens(); res += concat + ".\n"; } return EditHelper.replaceRange(file, node.getStart(), node.getEnd(), res.trimEnd()); } } |