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 11147x 11147x 11147x 11147x 11147x 33244x 33244x 33244x 33244x 33244x 33244x 33244x 33244x 33244x 33244x 33244x 11147x 11147x 10585x 10585x 11147x 11147x 266x 266x 11147x 11147x 281x 281x 281x 1588x 1569x 1569x 19x 1588x 2x 2x 2x 2x 2x 1588x 281x 281x 281x 11147x 11147x 2x 2x 2x 2x 2x 4x 4x 4x 2x 2x 11147x 11147x | 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()); } } |