{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D11","name":"Test Reliability","shortDescription":{"text":"Test Reliability"},"helpUri":"https://codehealth.canine.dev/dimensions/D11"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D18","name":"Solution Shape","shortDescription":{"text":"Solution Shape"},"helpUri":"https://codehealth.canine.dev/dimensions/D18"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D23","name":"Boundary Type-Coupling","shortDescription":{"text":"Boundary Type-Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D23"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D27","name":"Navigability","shortDescription":{"text":"Navigability"},"helpUri":"https://codehealth.canine.dev/dimensions/D27"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"]}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D44","name":"Platform End-of-Life","shortDescription":{"text":"Platform End-of-Life"},"helpUri":"https://codehealth.canine.dev/dimensions/D44"},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX4","name":"Dependency direction","shortDescription":{"text":"Dependency direction"},"helpUri":"https://codehealth.canine.dev/dimensions/AX4"},{"id":"AX5","name":"Architecture \u0026 structure","shortDescription":{"text":"Architecture \u0026 structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AX5"},{"id":"AX6","name":"Interface segregation","shortDescription":{"text":"Interface segregation"},"helpUri":"https://codehealth.canine.dev/dimensions/AX6"},{"id":"AX8","name":"Test isolation","shortDescription":{"text":"Test isolation"},"helpUri":"https://codehealth.canine.dev/dimensions/AX8"},{"id":"AXB1","name":"Runtime evidence locked \u2014 no reproducible boot","shortDescription":{"text":"Runtime evidence locked \u2014 no reproducible boot"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB1"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"ED5","name":"Idempotency","shortDescription":{"text":"Idempotency"},"helpUri":"https://codehealth.canine.dev/dimensions/ED5"},{"id":"GD1","name":"Unfinished \u0026 placeholder code","shortDescription":{"text":"Unfinished \u0026 placeholder code"},"helpUri":"https://codehealth.canine.dev/dimensions/GD1"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"QBasic.OnUserUpdate (cyclomatic 379): QBasic.OnUserUpdate has cyclomatic complexity 379 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1176}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eeaa731103edfd62c7a920b12dfd5818db902ad35740d5b9a1382fa0a419f59"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.InteractiveProcessKey (cyclomatic 289): Interactive.InteractiveProcessKey has cyclomatic complexity 289 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1119}}}],"partialFingerprints":{"codehealthFindingId/v1":"758708a2526b963a30e4a186a2c795610742c73f39b1fd44d64da8e3409e137c"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateBinaryExpression (cyclomatic 276): Evaluator.EvaluateBinaryExpression has cyclomatic complexity 276 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3872}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb92b79a5d69f3059599bd1ec090da90678dd735d1f6470119e6b6dbc8f79ce5"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateStatement (cyclomatic 275): Evaluator.EvaluateStatement has cyclomatic complexity 275 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":510}}}],"partialFingerprints":{"codehealthFindingId/v1":"66b52a00fe7fe5abe24c089db43524bc1cffe1c06b1578733b2eaa75f15dad72"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecutePrimary (cyclomatic 259): Interactive.ExecutePrimary has cyclomatic complexity 259 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":3199}}}],"partialFingerprints":{"codehealthFindingId/v1":"aef4d0d2fa793d20157b05eb7957702cb7c3c4c802d67ab37d69a3220a20338f"}},{"ruleId":"D1","level":"warning","message":{"text":"ConstantFolding.Fold (cyclomatic 257): ConstantFolding.Fold has cyclomatic complexity 257 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ConstantFolding.vb"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"69c75daf245a10fa14a8a040216b68fbdbc443c590bf4a0ed49574641b66eeba"}},{"ruleId":"D1","level":"warning","message":{"text":"Decode.ProcessInternal (cyclomatic 247): Decode.ProcessInternal has cyclomatic complexity 247 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Tokenizer/Decode.vb"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"48aab6d35f11b91f2aba4c4d75e843b1ee4989f914cd2a5346168eb840463691"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ProcessKeyInternal (cyclomatic 221): Interactive.ProcessKeyInternal has cyclomatic complexity 221 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f807bad4d16db57fbbd853da93c370991f8d950bf776ebe099707e26857a29"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateCallExpression (cyclomatic 204): Evaluator.EvaluateCallExpression has cyclomatic complexity 204 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":4192}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8a5648cf4fe860b52812e4a1596a897415a8531c1e5515ae4e24daebdcd7eaf"}},{"ruleId":"D1","level":"warning","message":{"text":"InternalPage.SetPalette (cyclomatic 180): InternalPage.SetPalette has cyclomatic complexity 180 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"363b06e0170e371d0989f0f82a644c2360eedbf6c3e6a53f729a04d2434d9dc8"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteStringPrimary (cyclomatic 140): Interactive.ExecuteStringPrimary has cyclomatic complexity 140 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2308}}}],"partialFingerprints":{"codehealthFindingId/v1":"e03a19db3d825101ec6125f366e63b9d0265443f2f1a66f3eab0a7301e7e8c33"}},{"ruleId":"D1","level":"warning","message":{"text":"Parser.ParseStatement (cyclomatic 126): Parser.ParseStatement has cyclomatic complexity 126 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cb66eab98cb8236f4f0abe120062bfd3cd4e901f1073c88fc8f6966beb6c753"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecutePut (cyclomatic 117): Interactive.ExecutePut has cyclomatic complexity 117 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":13632}}}],"partialFingerprints":{"codehealthFindingId/v1":"768e297dddb6f4460878a304bd9a8ae7fbad38e13bd049111a5cba4dd8ab21cd"}},{"ruleId":"D1","level":"warning","message":{"text":"Parser.PeekToken (cyclomatic 117): Parser.PeekToken has cyclomatic complexity 117 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"7167da788655544a9b0f46bd3ff73f9829cb202dd9546cd7be5cf00af7c7f6cb"}},{"ruleId":"D1","level":"warning","message":{"text":"Conversion.Classify (cyclomatic 106): Conversion.Classify has cyclomatic complexity 106 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Conversion.vb"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"22484c0c68eb4f99c9b8b4270d3e68c0d537f59ac0b49152b8d298c5317ebc33"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteGet (cyclomatic 104): Interactive.ExecuteGet has cyclomatic complexity 104 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8515}}}],"partialFingerprints":{"codehealthFindingId/v1":"89b259ef2e041ae9a72ed7df2047d09a7963f2ddaa4a3610eb23a95271c563db"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteStatement (cyclomatic 103): Interactive.ExecuteStatement has cyclomatic complexity 103 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":5173}}}],"partialFingerprints":{"codehealthFindingId/v1":"aadc8a63bc34c7649b9e6e48c239b295f4793141049f2402030b55f09130e600"}},{"ruleId":"D1","level":"warning","message":{"text":"Program.HandleCommandLineArguments (cyclomatic 90): Program.HandleCommandLineArguments has cyclomatic complexity 90 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c4dfd88ded51c5ca0065daf9c0d33ae6e8e63927b58e2304f59b41da2c317c7"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecutePrint (cyclomatic 86): Interactive.ExecutePrint has cyclomatic complexity 86 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12312}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fa4b79254eeef681617b1091da02c3f841b409cb3030df6e0af9917ab965532"}},{"ruleId":"D1","level":"warning","message":{"text":"QBasic.GetPressed (cyclomatic 82): QBasic.GetPressed has cyclomatic complexity 82 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":2160}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a8143229eaa8db5d79f3080da84d502d0f2e4c09293607f668f75aa30abb6a5"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.PlayCommand (cyclomatic 81): Evaluator.PlayCommand has cyclomatic complexity 81 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":5804}}}],"partialFingerprints":{"codehealthFindingId/v1":"123cf9a8b4af26b36b77ebd96daca1d04dadcc63f41d12dd232099f47d85e693"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecutePrintUsing (cyclomatic 80): Interactive.ExecutePrintUsing has cyclomatic complexity 80 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12698}}}],"partialFingerprints":{"codehealthFindingId/v1":"c33209c0b6287a6613d72f01382afac7d2856e8f51b69004568279c817aa4915"}},{"ruleId":"D1","level":"warning","message":{"text":"Common.GetChar (cyclomatic 78): Common.GetChar has cyclomatic complexity 78 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Common.vb"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"20374acdd9d94c30903b782d4d3eb7f5b519da396201f56c7f2f2b84d1ff7a4b"}},{"ruleId":"D1","level":"warning","message":{"text":"DocumentPanel.ProcessKeys (cyclomatic 78): DocumentPanel.ProcessKeys has cyclomatic complexity 78 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"96f55e9be485cd4bc4a553ee74d480febf16b3652fe2d3bdac3c8a4e4ea602fb"}},{"ruleId":"D1","level":"warning","message":{"text":"TextboxControl.OnKeyPress (cyclomatic 75): TextboxControl.OnKeyPress has cyclomatic complexity 75 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/TextBoxControl.vb"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"391721e766c0c0173c06aa8eabca91d39365ae694c9397b834fa2df963a596a4"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteDraw (cyclomatic 72): Interactive.ExecuteDraw has cyclomatic complexity 72 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":18064}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f6e71be534e747109c7412dd6f1cbdec70a8c25157772e082c81c26a0e4a10"}},{"ruleId":"D1","level":"warning","message":{"text":"Lexer.ReadIdentifierOrKeyword (cyclomatic 66): Lexer.ReadIdentifierOrKeyword has cyclomatic complexity 66 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b976b9df4b74a91fbdb52c61e3412fb690063db4647a62fb997bbd25d05875e"}},{"ruleId":"D1","level":"warning","message":{"text":"Video.INKEY (cyclomatic 66): Video.INKEY has cyclomatic complexity 66 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Video.PALETTE (cyclomatic 69) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":2095}}}],"partialFingerprints":{"codehealthFindingId/v1":"c041d99e01a11bb582e7044dd022c53019378caa752e3c36ec806930584360ab"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.InternalInputCompletedProcess (cyclomatic 65): Interactive.InternalInputCompletedProcess has cyclomatic complexity 65 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":17020}}}],"partialFingerprints":{"codehealthFindingId/v1":"584eb96cb643d6c26586bfd80d2cc23db2b2815a7146d7c3ac47e2be0918a39e"}},{"ruleId":"D1","level":"warning","message":{"text":"Console.INKEY (cyclomatic 62): Console.INKEY has cyclomatic complexity 62 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Console.vb"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"e662fe4d221a868c26eb003192b5aec24124a2b664b2d2ca0577ab88025f4c91"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteWidth (cyclomatic 61): Interactive.ExecuteWidth has cyclomatic complexity 61 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16251}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf049244c028b8c3af27acf5d4d5b3cb6452bbd4c815434ea8fcd6acac11bd3e"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.InternalProcessText (cyclomatic 61): Interactive.InternalProcessText has cyclomatic complexity 61 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":18676}}}],"partialFingerprints":{"codehealthFindingId/v1":"a13d4d89d13a46c483b79cbdae4dcefa197e507f029a0dca03291f5f02a917ac"}},{"ruleId":"D1","level":"warning","message":{"text":"WindowsFileSystem.Input (cyclomatic 59): WindowsFileSystem.Input has cyclomatic complexity 59 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/WindowsFileSystem.vb"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"3672752b54eee091f3b135ddf43bb14d17e72c14566d384f4fa852c4f1f10d2c"}},{"ruleId":"D1","level":"warning","message":{"text":"DocumentPanel.WordRightAction (cyclomatic 54): DocumentPanel.WordRightAction has cyclomatic complexity 54 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":814}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a6d4cc03e3bc2f7ac47ba6d206238bf26190a6bea84ab3905966aaceb70b2ee"}},{"ruleId":"D1","level":"warning","message":{"text":"Video.CIRCLE (cyclomatic 54): Video.CIRCLE has cyclomatic complexity 54 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Video.PALETTE (cyclomatic 69) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1341}}}],"partialFingerprints":{"codehealthFindingId/v1":"723f4d30c5d753f079001e1eeaf3983c5a1d6f15e4e703e802d5c8333bc4cc41"}},{"ruleId":"D1","level":"warning","message":{"text":"Video.CIRCLE (cyclomatic 51): Video.CIRCLE has cyclomatic complexity 51 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Video.PALETTE (cyclomatic 69) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1080}}}],"partialFingerprints":{"codehealthFindingId/v1":"e83a7356e5a710e991fed940ff89d7e51d857f42d6f43b1496578c18ccd108e1"}},{"ruleId":"D1","level":"warning","message":{"text":"Display.Circle (cyclomatic 50): Display.Circle has cyclomatic complexity 50 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1919}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c94e7518ee87689e549461ee2f3d06064477af0a9d14c350ba028545ebcf132"}},{"ruleId":"D1","level":"warning","message":{"text":"Display.RowCount.Set (cyclomatic 48): Display.RowCount.Set has cyclomatic complexity 48 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2487}}}],"partialFingerprints":{"codehealthFindingId/v1":"e222e66f8b7e261f400ec59c533207c79b7201137d4f11bddaed37a9b22f3014"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ProcessInterpreter (cyclomatic 47): Interactive.ProcessInterpreter has cyclomatic complexity 47 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1415}}}],"partialFingerprints":{"codehealthFindingId/v1":"36c7dcece75bec6f62a46c6dde992bd47458f583e84afc8f7d931366f96c5052"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteOpen (cyclomatic 47): Interactive.ExecuteOpen has cyclomatic complexity 47 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11697}}}],"partialFingerprints":{"codehealthFindingId/v1":"526570e4332a5d52ea99273b653c62c40df0386daa017eed85df0e01c0d3f0ce"}},{"ruleId":"D1","level":"warning","message":{"text":"Video.LINE (cyclomatic 47): Video.LINE has cyclomatic complexity 47 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Video.PALETTE (cyclomatic 69) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1611}}}],"partialFingerprints":{"codehealthFindingId/v1":"b97decfe419a348614b29485d9aed467cdf8bf6f7132185da1ce2464ce181eae"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteComparison (cyclomatic 46): Interactive.ExecuteComparison has cyclomatic complexity 46 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2981}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bcd25420efe1b6131b5f1b0b7dbb77727603d12ddec927763dddfd6c37b3a25"}},{"ruleId":"D1","level":"warning","message":{"text":"Display.ColumnCount.Set (cyclomatic 45): Display.ColumnCount.Set has cyclomatic complexity 45 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2629}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8eab4f913bf1279105699cee965c567d2ab7601f818b209c2dc0e8002644ed4"}},{"ruleId":"D1","level":"warning","message":{"text":"Form.OnKeyPress (cyclomatic 45): Form.OnKeyPress has cyclomatic complexity 45 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/Form.vb"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"891153e43b7c6ee07c69fdd0960773a8a967e0d5fb2675588edccb7d27259b00"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.ParseNumericFormat (cyclomatic 45): Evaluator.ParseNumericFormat has cyclomatic complexity 45 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2710}}}],"partialFingerprints":{"codehealthFindingId/v1":"745ae4ea57850890ada1319dc4500cc3862b120925125860f39125a67a79ba8b"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.FormatNumericWithSpec (cyclomatic 45): Evaluator.FormatNumericWithSpec has cyclomatic complexity 45 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2833}}}],"partialFingerprints":{"codehealthFindingId/v1":"6475a59e5dc46b55b7472f1073d491aebbf3433935012d1809ebf7f9c6afe3e0"}},{"ruleId":"D1","level":"warning","message":{"text":"BoundBinaryOperator.Initialize (cyclomatic 44): BoundBinaryOperator.Initialize has cyclomatic complexity 44 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundBinaryOperator.vb"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"3574a7273788ffa41cd009f903ec2824130cb8d3b985fdc927a3c809c84db2c0"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteCircle (cyclomatic 43): Interactive.ExecuteCircle has cyclomatic complexity 43 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6254}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3642363ccbdc4484418883fd8791ee177d52eceb88da2be006eb4f4782be99b"}},{"ruleId":"D1","level":"warning","message":{"text":"Binder.BindCallExpression (cyclomatic 43): Binder.BindCallExpression has cyclomatic complexity 43 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Binder.BindStatementInternal (cyclomatic 115) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":900}}}],"partialFingerprints":{"codehealthFindingId/v1":"b610418f19c3bfac775b420fbd112eb069161730f523b8f6156c865d437092cb"}},{"ruleId":"D1","level":"warning","message":{"text":"MainMenu.ProcessKeys (cyclomatic 42): MainMenu.ProcessKeys has cyclomatic complexity 42 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/MainMenu.vb"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"9da8b93ee613ff40e038febfd958fbea2ea26666f6b0f45a4327929d830e87a4"}},{"ruleId":"D1","level":"warning","message":{"text":"DocumentPanel.WordLeftAction (cyclomatic 41): DocumentPanel.WordLeftAction has cyclomatic complexity 41 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"351e34a886aab64299fda9c0194f1b7901c0b1e5fbe443008c71f1e1e3892b20"}},{"ruleId":"D1","level":"warning","message":{"text":"SyntaxNode.PrettyPrint2 (cyclomatic 40): SyntaxNode.PrettyPrint2 has cyclomatic complexity 40 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6f74721247a94ab336259cc13e0849852f37b6236ddf414c0ac04b4f5da8761"}},{"ruleId":"D1","level":"warning","message":{"text":"Display.Color (cyclomatic 39): Display.Color has cyclomatic complexity 39 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":3982}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e75f354cf817fbc7e3b6789f627f2ca865c41bcf4f755596092e745b3d5b685"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateOpenStatement (cyclomatic 38): Evaluator.EvaluateOpenStatement has cyclomatic complexity 38 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":5067}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa7e20e08d8ba39ae43e0779ee697ffb9797b05c639799d309061f27690421ee"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteInput (cyclomatic 37): Interactive.ExecuteInput has cyclomatic complexity 37 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":9910}}}],"partialFingerprints":{"codehealthFindingId/v1":"877a191fc01e502f19a5f64e3fb346739fcafdaaa3cb86b0013e9d2ecbe991eb"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteScreen (cyclomatic 37): Interactive.ExecuteScreen has cyclomatic complexity 37 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15053}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee015b5126f7c4b68f7ad7fca1050bd227fc946ff41f3df0c225d0fb4f30d43e"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.CalculatePosition (cyclomatic 37): Interactive.CalculatePosition has cyclomatic complexity 37 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":18457}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2e1157da7855f4a151d8099504a5221951cefa8fcb7e93bb10b166fba86cc9f"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteLet (cyclomatic 36): Interactive.ExecuteLet has cyclomatic complexity 36 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10284}}}],"partialFingerprints":{"codehealthFindingId/v1":"545d11ad789d98d440fc6ca1844fc351492f1de3407b12c4fafc649d42d61a2b"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.InternalLoadCompleted (cyclomatic 35): Interactive.InternalLoadCompleted has cyclomatic complexity 35 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6024}}}],"partialFingerprints":{"codehealthFindingId/v1":"e44ee6562162ce73efa43423a8c164cfd4711cd4559d7bec0dc1a8a3de817ce4"}},{"ruleId":"D1","level":"warning","message":{"text":"Display.Pset (cyclomatic 34): Display.Pset has cyclomatic complexity 34 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2231}}}],"partialFingerprints":{"codehealthFindingId/v1":"8afc7e462f326c58e0c6b244f54d9329643cac0fb0a4ec96313b8dc72f762eb5"}},{"ruleId":"D1","level":"warning","message":{"text":"Display.Paint (cyclomatic 33): Display.Paint has cyclomatic complexity 33 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1601}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c9e14d5fc4467dd3451aad85b8e999527c2cce3118cde991ee23efe68904bd9"}},{"ruleId":"D1","level":"warning","message":{"text":"OpenDialog.ProcessKeys (cyclomatic 33): OpenDialog.ProcessKeys has cyclomatic complexity 33 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/OpenDialog.vb"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8feebe009e06f1c236a52f4ba68b260cb37c7fabe0ad6abd9c7bf991e8ece3c"}},{"ruleId":"D1","level":"warning","message":{"text":"Binder.BindGlobalScope (cyclomatic 33): Binder.BindGlobalScope has cyclomatic complexity 33 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Binder.BindStatementInternal (cyclomatic 115) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"d44ad6a4e4194fd3f183d021556208627853a426150972606c10ca81b2aa2e17"}},{"ruleId":"D1","level":"warning","message":{"text":"Lexer.ReadToken (cyclomatic 33): Lexer.ReadToken has cyclomatic complexity 33 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f35daf039b6573ef24ee550858efa0a0d362e557a9f5c2d09b3355d9fc763df"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteClear (cyclomatic 32): Interactive.ExecuteClear has cyclomatic complexity 32 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6373}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72602ead8f3084bf8ce49b213fde2d67a2a2cb50235d4a8db0b52824ed543d3"}},{"ruleId":"D1","level":"warning","message":{"text":"DocumentPanel.HandleSelection (cyclomatic 32): DocumentPanel.HandleSelection has cyclomatic complexity 32 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"5294bf2f6480685d4e3166d9b8bcf1fa78e9705381cd69b9b9b98d3747adf87e"}},{"ruleId":"D1","level":"warning","message":{"text":"Binder.BindIdentifierExpression (cyclomatic 31): Binder.BindIdentifierExpression has cyclomatic complexity 31 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Binder.BindStatementInternal (cyclomatic 115) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1920}}}],"partialFingerprints":{"codehealthFindingId/v1":"35cdeda80dcbd8b2c265c0fcda0225edeed25c16ec4fcb0a86ea7a3bb2db42d0"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteLineInput (cyclomatic 30): Interactive.ExecuteLineInput has cyclomatic complexity 30 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10668}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2323d2319711a23bf8e4bcfe01c7ccbe40cf1ddb460e52ee1feab969d8690dc"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecutePaint (cyclomatic 30): Interactive.ExecutePaint has cyclomatic complexity 30 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11986}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdb5969b2835e60f093c63a48f4b577b8da17d3138bfcedbf330856536b8f861"}},{"ruleId":"D1","level":"warning","message":{"text":"JsEmitter.EmitBinaryExpression (cyclomatic 30): JsEmitter.EmitBinaryExpression has cyclomatic complexity 30 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"0553b77c15ea7031d270fa7688d41fdd7475dbd848bb44223e274d58ed0f6aed"}},{"ruleId":"D1","level":"warning","message":{"text":"VbEmitter.EmitBinaryExpression (cyclomatic 30): VbEmitter.EmitBinaryExpression has cyclomatic complexity 30 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c4036abc9bd9adea122a3927007d0cd36df887c2cf80bc37ff2950d2062451c"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateArrayAccessExpressionForAssignment (cyclomatic 30): Evaluator.EvaluateArrayAccessExpressionForAssignment has cyclomatic complexity 30 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3732}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ea4b9e51d8c19891cb5311c38a25d7686bdc174d7993ee946dad147d497a947"}},{"ruleId":"D1","level":"warning","message":{"text":"Display.Screen (cyclomatic 29): Display.Screen has cyclomatic complexity 29 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2752}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4d6831f6d4771f50f2c04747a4c2006b5955700a241d8c05a55245fe45940bd"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteLine (cyclomatic 29): Interactive.ExecuteLine has cyclomatic complexity 29 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10427}}}],"partialFingerprints":{"codehealthFindingId/v1":"02c2b5dc5f447f6f9e7a6cb617f67a4bfe9aba279c76ace31687d9cc109da70c"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteLocate (cyclomatic 29): Interactive.ExecuteLocate has cyclomatic complexity 29 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10530}}}],"partialFingerprints":{"codehealthFindingId/v1":"03619f73ddc478a3cc6adb5d7623240d69c88cdf1aa20dc5fe6740daa2a0f4c0"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.FormatNumber (cyclomatic 29): Interactive.FormatNumber has cyclomatic complexity 29 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":13076}}}],"partialFingerprints":{"codehealthFindingId/v1":"75fd2aed93e5cd7032c06bbd238adba5be965a2abbaced695eea16ea46f8ba1a"}},{"ruleId":"D1","level":"warning","message":{"text":"MsilEmitter.EmitBinaryExpression (cyclomatic 29): MsilEmitter.EmitBinaryExpression has cyclomatic complexity 29 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/MsilEmitter.vb"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"76dc88b8aa95618e9eee294c9bd51f05b6033285750ef160625ee649aafdc30b"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphBuilder.Build (cyclomatic 27): GraphBuilder.Build has cyclomatic complexity 27 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ControlFlowGraph.vb"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"7310b59015b1d69f3bd894d91dd9afda46c7cfd16ec0b7849d71e59f6e3745a4"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateArrayAccessExpression (cyclomatic 27): Evaluator.EvaluateArrayAccessExpression has cyclomatic complexity 27 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3632}}}],"partialFingerprints":{"codehealthFindingId/v1":"79d63c13c7005692fd7d56b092dfea89f395d0e69860f8c184164e0a027638a4"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateConversionExpression (cyclomatic 27): Evaluator.EvaluateConversionExpression has cyclomatic complexity 27 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":4866}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a436a4a7a349e5e27efc9ece7112959d69a4b452e10b2fc60f67e8f2f63c7b1"}},{"ruleId":"D1","level":"warning","message":{"text":"Parser.ParseForStatement (cyclomatic 27): Parser.ParseForStatement has cyclomatic complexity 27 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":1537}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbc29817d5b124b46623a180b32df8497eb71cb40610560e4b9c52e1447b6a4c"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteColor (cyclomatic 26): Interactive.ExecuteColor has cyclomatic complexity 26 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6480}}}],"partialFingerprints":{"codehealthFindingId/v1":"e40f05bec86fcfd959e55cb5b24b3ff80ea81ff4c823ca8d98b660412def5415"}},{"ruleId":"D1","level":"warning","message":{"text":"DocumentPanel.Render (cyclomatic 26): DocumentPanel.Render has cyclomatic complexity 26 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbff083b6833515ed1a1728583f00d3a3f8bea992a961ebd0afe80a121141f0c"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteKey (cyclomatic 25): Interactive.ExecuteKey has cyclomatic complexity 25 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10121}}}],"partialFingerprints":{"codehealthFindingId/v1":"34c5be89787d19070323ee7f423b8e361434425c3bb98f3abf8dc91924b3c065"}},{"ruleId":"D1","level":"warning","message":{"text":"Lexer.ReadNumberToken (cyclomatic 25): Lexer.ReadNumberToken has cyclomatic complexity 25 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"991d02f71f42cff411a084b190043c67a27bded496bb087639e27ffe701cff49"}},{"ruleId":"D1","level":"warning","message":{"text":"Parser.ParseNameOrCallExpression (cyclomatic 25): Parser.ParseNameOrCallExpression has cyclomatic complexity 25 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":4237}}}],"partialFingerprints":{"codehealthFindingId/v1":"923973682869d8f639f74349f2f3bb724962f89d84cea82ed13dfd85288b9f24"}},{"ruleId":"D1","level":"warning","message":{"text":"SyntaxNode.PrettyPrint (cyclomatic 25): SyntaxNode.PrettyPrint has cyclomatic complexity 25 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"cec58f92713c26d8f399eb194f0b163cbe2c9f2f5d4a0457d9f3123510cf7d69"}},{"ruleId":"D1","level":"warning","message":{"text":"SaveAsDialog.ProcessKeys (cyclomatic 25): SaveAsDialog.ProcessKeys has cyclomatic complexity 25 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/SaveAsDialog.vb"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"b153db60a2820d9ef3070bff380046065a770dad2562e5efcae177c6663f1092"}},{"ruleId":"D1","level":"warning","message":{"text":"SavePrompt.ProcessKeys (cyclomatic 25): SavePrompt.ProcessKeys has cyclomatic complexity 25 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/SavePrompt.vb"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ab66f293e169bf43f5e4b3e2b740d084d20a8027b5c18fef1e08859fba8405e"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteView (cyclomatic 24): Interactive.ExecuteView has cyclomatic complexity 24 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15857}}}],"partialFingerprints":{"codehealthFindingId/v1":"108ac720bb59b65752afe9bc10cd6feab609314d7e643f36ff80e9f07fb3d6d0"}},{"ruleId":"D1","level":"warning","message":{"text":"Binder.BindMemberAccessExpression (cyclomatic 24): Binder.BindMemberAccessExpression has cyclomatic complexity 24 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Binder.BindStatementInternal (cyclomatic 115) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1068}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8fdb3f5d298940e9f16c2aa0027008ebf1651803ba3c9ab97ce7a3970c411ea"}},{"ruleId":"D1","level":"warning","message":{"text":"Video.InputAsync (cyclomatic 24): Video.InputAsync has cyclomatic complexity 24 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Video.PALETTE (cyclomatic 69) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1815}}}],"partialFingerprints":{"codehealthFindingId/v1":"437d1e6651041eec2c09a9323d29e1e6668189f2a37e273ddf2316693472517a"}},{"ruleId":"D1","level":"warning","message":{"text":"Video.LineInputAsync (cyclomatic 24): Video.LineInputAsync has cyclomatic complexity 24 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This shape REPEATS in the file: one other method here (Video.InputAsync) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared. This is NOT this file\u0027s highest cyclomatic complexity: Video.PALETTE (cyclomatic 69) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1470}}}],"partialFingerprints":{"codehealthFindingId/v1":"b81fbfd2b5f041e3fdd7ad73888bb8aac121e145c440fb640d39edf8e1f1382c"}},{"ruleId":"D1","level":"warning","message":{"text":"Video.InputAsync (cyclomatic 24): Video.InputAsync has cyclomatic complexity 24 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This shape REPEATS in the file: one other method here (Video.LineInputAsync) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared. This is NOT this file\u0027s highest cyclomatic complexity: Video.PALETTE (cyclomatic 69) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1616}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa29c579573f1af0932c4893063da07fac0cdaf4397bf432cecc2b06b971ae0d"}},{"ruleId":"D1","level":"warning","message":{"text":"HorizontalListboxControl.OnKeyPress (cyclomatic 23): HorizontalListboxControl.OnKeyPress has cyclomatic complexity 23 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/HorizontalListBoxControl.vb"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8467d4739f385c69154dd2e185832eaec02bb7fab3f274ebfbf0048bf89ea04"}},{"ruleId":"D1","level":"warning","message":{"text":"MainMenu.Render (cyclomatic 23): MainMenu.Render has cyclomatic complexity 23 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/MainMenu.vb"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f33530ef97c7e5cfd2ea1f29027b1040991d5abe496aef8e554dab33091cbbb"}},{"ruleId":"D1","level":"warning","message":{"text":"Binder.BindInputStatement (cyclomatic 23): Binder.BindInputStatement has cyclomatic complexity 23 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Binder.BindStatementInternal (cyclomatic 115) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1575}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e680918db44ebe6a73789b82709aa7283b9dcf2863962b0b8bd0956b5c32d76"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteMid (cyclomatic 22): Interactive.ExecuteMid has cyclomatic complexity 22 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11078}}}],"partialFingerprints":{"codehealthFindingId/v1":"6257d42cd4752da85b520a28bc2302607393b66af8d107fc7aa49dbaaf77c388"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.CheckKeyPressed (cyclomatic 22): Evaluator.CheckKeyPressed has cyclomatic complexity 22 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1970}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0410c613cc50aca14d9d7d2120796d3327b445cff9abdb58a2a36c1906235f8"}},{"ruleId":"D1","level":"warning","message":{"text":"IndentedSyntaxWriter.RewriteGotoGosubUsingSyntaxTree (cyclomatic 22): IndentedSyntaxWriter.RewriteGotoGosubUsingSyntaxTree has cyclomatic complexity 22 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/GwBasicToQBasicRewriter.vb"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"607719de85f9f46ce7640c1e67fca6eb7e02d230030ab6467abc56b72308bc73"}},{"ruleId":"D1","level":"warning","message":{"text":"Display.SetPalette (cyclomatic 21): Display.SetPalette has cyclomatic complexity 21 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":4409}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a17c4340f4f83cf1d0409efdef53a0fe5321f61293a4ba1cb93f4ac8970002d"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.InternalOpen (cyclomatic 21): Interactive.InternalOpen has cyclomatic complexity 21 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16762}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e207562af48047e34e5c8b3619951b3ecac63488ca105221bc73cc39f2931c"}},{"ruleId":"D1","level":"warning","message":{"text":"Display.Paint (cyclomatic 21): Display.Paint has cyclomatic complexity 21 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/Display.vb"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"d32f074cae1759152fa8980703c54c23af24bbb3999a1357cea1e24ecc40234d"}},{"ruleId":"D1","level":"warning","message":{"text":"Binder.BindPrintStatement (cyclomatic 21): Binder.BindPrintStatement has cyclomatic complexity 21 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Binder.BindStatementInternal (cyclomatic 115) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2095}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aeba85226ec27f05fbe82316d15182d3629199f43ce786ae587821e2a9be149"}},{"ruleId":"D1","level":"warning","message":{"text":"Binder.BindVariableReference (cyclomatic 21): Binder.BindVariableReference has cyclomatic complexity 21 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Binder.BindStatementInternal (cyclomatic 115) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":3156}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2fe0b7c17415b1e28989a5828fa42a8b27a0f155caf7be6105be9ac38a55b61"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateKeyStatement (cyclomatic 21): Evaluator.EvaluateKeyStatement has cyclomatic complexity 21 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1739}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfc1ce0aa39bbd1f963ac5a94df8fe240f5a4693978902fefc31fd446f2f2d77"}},{"ruleId":"D1","level":"warning","message":{"text":"TypeSymbol.TypeSymbolToType (cyclomatic 21): TypeSymbol.TypeSymbolToType has cyclomatic complexity 21 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Symbols/TypeSymbol.vb"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"b125c9b4663da9b4f840d58570e9c3ea9dee5ce8f60ff0b4c03b3b68ffa9f2a2"}},{"ruleId":"D1","level":"warning","message":{"text":"InternalPage.New.ctor (cyclomatic 20): InternalPage.New.ctor has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c04da0f35c722656354a26e596b0caf5a5c7824a4ef66a0182d26b05cfeeaa6"}},{"ruleId":"D1","level":"warning","message":{"text":"InternalPage.SetPalette (cyclomatic 20): InternalPage.SetPalette has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"278da87526bcfc2528c2321e20d92c3365f06e8e967d96baf1b0ef743b598d3b"}},{"ruleId":"D1","level":"warning","message":{"text":"Display.Line (cyclomatic 20): Display.Line has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2123}}}],"partialFingerprints":{"codehealthFindingId/v1":"66f3225f1ed4179c148b4ec6c23fad7c324388c3cc4d2019ceba5f58f329f7e2"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteOn (cyclomatic 20): Interactive.ExecuteOn has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11312}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdcb28b36574aca11f38d162d7e5f5a71df530ae72497defec0d36835ac79f97"}},{"ruleId":"D1","level":"warning","message":{"text":"Parser.ScanParse (cyclomatic 20): Parser.ScanParse has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"9362cad132fc54922ae65946871b3344697e96fa9cbfcdb8b5df45aff419ca4b"}},{"ruleId":"D1","level":"warning","message":{"text":"Parser.FindEndOfStatement (cyclomatic 20): Parser.FindEndOfStatement has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":970}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a4d920acb6bd7de78f1d4c501728914c4267b29c7565a9989f463b51078e6d3"}},{"ruleId":"D1","level":"warning","message":{"text":"ListboxControl.OnKeyPress (cyclomatic 20): ListboxControl.OnKeyPress has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/ListBoxControl.vb"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0cf260312bff1bda4508dbbf710b3b8f36c5b11e434c630df03835adb7c0f57"}},{"ruleId":"D1","level":"warning","message":{"text":"BoundLiteralExpression.New.ctor (cyclomatic 20): BoundLiteralExpression.New.ctor has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundLiteralExpression.vb"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"be9cd40b1467e3016f6c2735707f71c5f9f86dd6c763995a2303f2f92ef9588f"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.Assign (cyclomatic 20): Evaluator.Assign has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":4909}}}],"partialFingerprints":{"codehealthFindingId/v1":"d81f9bb239a117e34deda8ba6cb85f562616ec86672f0af9acc88a56da55142f"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.Assign (cyclomatic 20): Evaluator.Assign has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":4994}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2c16576aba3f9fe8acaaf04f119e1403f19c4de3518a8dface5c10cf4c941fc"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteChain (cyclomatic 19): Interactive.ExecuteChain has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":5837}}}],"partialFingerprints":{"codehealthFindingId/v1":"20b82c3d63a05027e072f3187b4c29362de4b53c9cb573d77ec3f2a412165066"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteDef (cyclomatic 19): Interactive.ExecuteDef has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6834}}}],"partialFingerprints":{"codehealthFindingId/v1":"f83fbe342535a9f8a0aeb8e12ab096458abf4354d9b2c87adbf2e5de165c4f85"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteDefInt (cyclomatic 19): Interactive.ExecuteDefInt has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This shape REPEATS in the file: 2 other methods here (Interactive.ExecuteDefSng, Interactive.ExecuteDefDbl) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6945}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaae6ca9e94be9bc329e17a7020d6f6f9168012ecd94824c677262dcd6a74ab1"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteDefSng (cyclomatic 19): Interactive.ExecuteDefSng has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This shape REPEATS in the file: 2 other methods here (Interactive.ExecuteDefInt, Interactive.ExecuteDefDbl) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7026}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef880dade9831ab0614465b68a906538f5c2da36177c295bc0e89155d5a95dda"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteDefDbl (cyclomatic 19): Interactive.ExecuteDefDbl has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This shape REPEATS in the file: 2 other methods here (Interactive.ExecuteDefInt, Interactive.ExecuteDefSng) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7107}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c8ef25a0dd7dd1d719c6bf4ea9b25626cdb57cfbd372cfe68edc618192726a5"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteFilesParseResult (cyclomatic 19): Interactive.ExecuteFilesParseResult has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7730}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d7b33189f990575dd81bf1baa68ca62db7be10e30dfcbe9988583477b28e18c"}},{"ruleId":"D1","level":"warning","message":{"text":"QBasic.OnUserCreate (cyclomatic 19): QBasic.OnUserCreate has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: QBasic.Menu_OnClick (cyclomatic 40) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eab0f07258e82f2edcef4e219db89e50e2a851835dd2419955f37c819fd3fc0"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateVariableExpression (cyclomatic 19): Evaluator.EvaluateVariableExpression has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3517}}}],"partialFingerprints":{"codehealthFindingId/v1":"04cd1a37bf4103c3ecb174197d6f3c508b5171f8fb26c3229a9dcf3c0f1d6b11"}},{"ruleId":"D1","level":"warning","message":{"text":"WindowsAudio.StreamingLoop (cyclomatic 19): WindowsAudio.StreamingLoop has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/WindowsAudio.vb"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aa88a2eade9ad679b8485e58835ab533041187826b773524fc13d626bad717f"}},{"ruleId":"D1","level":"warning","message":{"text":"Extensions.IsNumeric (cyclomatic 18): Extensions.IsNumeric has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Extensions.vb"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"603611bc3c97221e7e9c777eb05628c6f60ed6251f499b3c9fd3eacbf3e06f96"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteCommon (cyclomatic 18): Interactive.ExecuteCommon has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6646}}}],"partialFingerprints":{"codehealthFindingId/v1":"23b51b01c46d9532f08dd20976941b880c78e774454b6ed3994305e5065c162d"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteDim (cyclomatic 18): Interactive.ExecuteDim has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7328}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e84e5451d35601dd63fc086cfeba10e71b2dfdf2695854a0fa9076612db4753"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteFor (cyclomatic 18): Interactive.ExecuteFor has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7850}}}],"partialFingerprints":{"codehealthFindingId/v1":"14a7b0892d2600a7ec8a598bff44cc47830b2ab610881c3b3475acec090413c2"}},{"ruleId":"D1","level":"warning","message":{"text":"Conversion.Hex (cyclomatic 18): Conversion.Hex has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This shape REPEATS in the file: one other method here (Conversion.Oct) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/VisualBasic/Conversion.vb"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc3cf77c55e307a0c89e8f16bc575c796d21ec522968e1986ae98160097fecdc"}},{"ruleId":"D1","level":"warning","message":{"text":"Conversion.Oct (cyclomatic 18): Conversion.Oct has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This shape REPEATS in the file: one other method here (Conversion.Hex) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/VisualBasic/Conversion.vb"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"976b2a42203caaac948229a0612966d5d1a73c24af26eeef86ccce4e907db620"}},{"ruleId":"D1","level":"warning","message":{"text":"WindowsFileSystem.Files (cyclomatic 18): WindowsFileSystem.Files has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/WindowsFileSystem.vb"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"1be0a624b24ca83a277de0f0ef090c2e7f625bf849ec09de3b491cfa4bc8d97a"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageDialog.ProcessKeys (cyclomatic 18): MessageDialog.ProcessKeys has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/MessageDialog.vb"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb062889278dcf9eb9908eaeb5a3351703b61d9def88db4bbc1608ecd83033e3"}},{"ruleId":"D1","level":"warning","message":{"text":"QBasicToVbNetRewriter.ConvertPrintStatementUsingSyntax (cyclomatic 18): QBasicToVbNetRewriter.ConvertPrintStatementUsingSyntax has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/QBasicToVbNetRewriter.vb"},"region":{"startLine":588}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f593ae40438d58dd5090a57d2eed31a15f5683beb6d4b6605539c7ef220657f"}},{"ruleId":"D1","level":"warning","message":{"text":"Video.WriteCharacter (cyclomatic 18): Video.WriteCharacter has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Video.PALETTE (cyclomatic 69) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":2276}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dfa58ac316dd9951c370dece8fb101d7106bd91d7f4034d33a2982c2cce2d4b"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.RealPath (cyclomatic 17): Interactive.RealPath has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2152}}}],"partialFingerprints":{"codehealthFindingId/v1":"a372905dd6f0546de8ad625b60edba06cb3edcb65c1f6a648a74ea1f5ca629c5"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteMultiplyDivide (cyclomatic 17): Interactive.ExecuteMultiplyDivide has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":3098}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdd56aa72b83fc8c589e7ab86a2589d29880699de8f758cd06ab749c5f1eba86"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteDefStr (cyclomatic 17): Interactive.ExecuteDefStr has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7188}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e5631179e24d368206765767da551cf8af0f3efcf742d25a21a2edd00da31dd"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteNextDecision (cyclomatic 17): Interactive.ExecuteNextDecision has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8418}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c5a0d1138c9158dfd4015d619e23a1aa59893db92797ea388ac990615c48177"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ExecuteOnErrorGoto (cyclomatic 17): Interactive.ExecuteOnErrorGoto has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11431}}}],"partialFingerprints":{"codehealthFindingId/v1":"773f8d2d25affda4b561c8b1f398aac4f4e75bf1244e2f0225757c1a78748ad4"}},{"ruleId":"D1","level":"warning","message":{"text":"MainMenu.ProcessMouse (cyclomatic 17): MainMenu.ProcessMouse has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/MainMenu.vb"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad8a965fb25b5db211fc59c89681c3604486693f267278a1db9d5fb568de00b3"}},{"ruleId":"D1","level":"warning","message":{"text":"Binder.BindSubDeclaration (cyclomatic 17): Binder.BindSubDeclaration has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Binder.BindStatementInternal (cyclomatic 115) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"054b5f950fc47d366005b7e557e49333aea2947c8e5960bc08ef924e24347e40"}},{"ruleId":"D1","level":"warning","message":{"text":"Binder.BindRedimStatement (cyclomatic 17): Binder.BindRedimStatement has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Binder.BindStatementInternal (cyclomatic 115) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2826}}}],"partialFingerprints":{"codehealthFindingId/v1":"757c3922e21d6bcf7eaa4f985a88cc44e6070dcd75f1717778f2ecfba7ab549f"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateSelectCaseStatement (cyclomatic 17): Evaluator.EvaluateSelectCaseStatement has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2194}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1222e756ba357359d70754ae509630a0f60028b4dad8c85e23cabb6009fe372"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.FormatUsingOutput (cyclomatic 17): Evaluator.FormatUsingOutput has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2461}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6bb0416d7ed722fe868b70b7cdec6ccb7a2fca24a62153d480d4dd28f84b0b9"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateWriteStatement (cyclomatic 17): Evaluator.EvaluateWriteStatement has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2543}}}],"partialFingerprints":{"codehealthFindingId/v1":"7697b729daff2b958d7a7ff50bd9952c48d349395fefa60ae4756d1c86a9bc9c"}},{"ruleId":"D1","level":"warning","message":{"text":"Parser.ParsePrintStatement (cyclomatic 17): Parser.ParsePrintStatement has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":3001}}}],"partialFingerprints":{"codehealthFindingId/v1":"b889f81337a13bf00e980414f0bc1ee1b7fe8fc67250fd3d178d4086560c0693"}},{"ruleId":"D1","level":"warning","message":{"text":"SyntaxNode.WriteNodeWithTrivia (cyclomatic 17): SyntaxNode.WriteNodeWithTrivia has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"874b88f66d811992d9b7a75c1ed355c3406670c946daabb3629dd083688b2ccb"}},{"ruleId":"D1","level":"warning","message":{"text":"Video.PRINT (cyclomatic 17): Video.PRINT has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Video.PALETTE (cyclomatic 69) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1192}}}],"partialFingerprints":{"codehealthFindingId/v1":"dacc59bd25c36954f82042feed410274227c02dfdf9e8a296392a11cce7cb0cf"}},{"ruleId":"D1","level":"warning","message":{"text":"Display.InternalPrint (cyclomatic 16): Display.InternalPrint has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":4534}}}],"partialFingerprints":{"codehealthFindingId/v1":"666238e104d6b9219150b4c246acf8c53d724d2dbcca45dc304b666f85ab67cd"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.ThrowBasicError (cyclomatic 16): Interactive.ThrowBasicError has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2012}}}],"partialFingerprints":{"codehealthFindingId/v1":"54d415515f1bf1fc3cfd7ec96ef1cb4b86d3000425437b816160310237992ae5"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.FoundMatchingNext (cyclomatic 16): Interactive.FoundMatchingNext has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This shape REPEATS in the file: one other method here (Interactive.JumpToNext) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7920}}}],"partialFingerprints":{"codehealthFindingId/v1":"8af86916cb25415948b98c2dfd26f5050117d54a290f7f4ec7161318ae9c1620"}},{"ruleId":"D1","level":"warning","message":{"text":"Interactive.JumpToNext (cyclomatic 16): Interactive.JumpToNext has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This shape REPEATS in the file: one other method here (Interactive.FoundMatchingNext) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8019}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c8051b4cda6384424b5506c198e0bb721dc117b01d67e187a095790d5a540c8"}},{"ruleId":"D1","level":"warning","message":{"text":"Parser.ParseStatement (cyclomatic 16): Parser.ParseStatement has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"4476319aae551ca3ec7c5796d4547df57a7f67de7527e5834ca2d09d453f4361"}},{"ruleId":"D1","level":"warning","message":{"text":"DocumentPanel.TabAction (cyclomatic 16): DocumentPanel.TabAction has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"f77a1b61b102eccab62f010c4a74f9df679a5088a4697c420d4db64a580523a2"}},{"ruleId":"D1","level":"warning","message":{"text":"WindowsFileSystem.EnforceActualPath (cyclomatic 16): WindowsFileSystem.EnforceActualPath has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/WindowsFileSystem.vb"},"region":{"startLine":876}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a65c59d6832fef61a4fffdd9e40ae06c73e8df702b421de997df397bb08fc15"}},{"ruleId":"D1","level":"warning","message":{"text":"QBasic.NewWndProc (cyclomatic 16): QBasic.NewWndProc has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: QBasic.Menu_OnClick (cyclomatic 40) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1104}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d0ce928d926ebafc460f9f2ff43a9e0723937b7d6e8364e11f770bbd1ac8163"}},{"ruleId":"D1","level":"warning","message":{"text":"Binder.BindConversion (cyclomatic 16): Binder.BindConversion has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Binder.BindStatementInternal (cyclomatic 115) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1264}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d67cd920f80202043fead589716f2684ea9be8fa10b85e4e64abdeda1b26a91"}},{"ruleId":"D1","level":"warning","message":{"text":"BoundTreeRewriter.RewritePrintStatement (cyclomatic 16): BoundTreeRewriter.RewritePrintStatement has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundTreeRewriter.vb"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"26ee15b65130c97986cc2f367e417ddcc9c301e61d627fe1928cac55e72a1c87"}},{"ruleId":"D1","level":"warning","message":{"text":"ControlFlowGraph.CountFunctionNameAssignments (cyclomatic 16): ControlFlowGraph.CountFunctionNameAssignments has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ControlFlowGraph.vb"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"b34b3fcb64700870fa32e8f0146bf920cea8e52092a97e0ff8a0261e87a73319"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.EvaluateDimStatement (cyclomatic 16): Evaluator.EvaluateDimStatement has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3261}}}],"partialFingerprints":{"codehealthFindingId/v1":"d54f21d6f30ffc712b3a159e942d6f7d89cede0c2fe1c19e4599ec67d8368b52"}},{"ruleId":"D1","level":"warning","message":{"text":"Parser.ParseOnStatement (cyclomatic 16): Parser.ParseOnStatement has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":2548}}}],"partialFingerprints":{"codehealthFindingId/v1":"abe46656c4b0e983e20fe5716803e489179b78ef6d8c8e195b139941ebb893ef"}},{"ruleId":"D1","level":"warning","message":{"text":"Parser.ParseOpenStatement (cyclomatic 16): Parser.ParseOpenStatement has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":2703}}}],"partialFingerprints":{"codehealthFindingId/v1":"56849894c193da32c0c7dccffee9c2200ac4db06a73cd41af8aa61e8095c58fc"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioDevice.EmitTone (cyclomatic 16): AudioDevice.EmitTone has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/AudioDevice.vb"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"965a1f7955b7d903e516f806a3fae90f6eb7778d919bb117d5fb5e8c8543d346"}},{"ruleId":"D1","level":"warning","message":{"text":"Video.POINT (cyclomatic 16): Video.POINT has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table. This is NOT this file\u0027s highest cyclomatic complexity: Video.PALETTE (cyclomatic 69) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":2335}}}],"partialFingerprints":{"codehealthFindingId/v1":"44e3efbce735180fb9a47f6a3d31f74f112fb5ad5a1013a3317447e8256f3024"}},{"ruleId":"D2","level":"warning","message":{"text":"QBasic.OnUserUpdate (cognitive 931): QBasic.OnUserUpdate has cognitive complexity 931 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1176}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0346b821c067464fbca62c27a81b413ba89b069d2d788524c015c43296d0b6f"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecutePrimary (cognitive 662): Interactive.ExecutePrimary has cognitive complexity 662 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":3199}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9b3c76603a9ef3d803a41c9c34d68efafd221b5e203d409eeeba19170534005"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ProcessKeyInternal (cognitive 524): Interactive.ProcessKeyInternal has cognitive complexity 524 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"66460e75a39c272498d4fed5c62eaab23de5bff70ab34781a30ead6f08c72d5f"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateStatement (cognitive 464): Evaluator.EvaluateStatement has cognitive complexity 464 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":510}}}],"partialFingerprints":{"codehealthFindingId/v1":"74b28286370a541024d9467803b1f1bc33c50cf0d1388dd0281663de7d1ec2dd"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.InteractiveProcessKey (cognitive 423): Interactive.InteractiveProcessKey has cognitive complexity 423 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1119}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bef347222ace6c7a851dbdcde7a08fc31aacf180b06976ee2d3f6497c3963ea"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteGet (cognitive 376): Interactive.ExecuteGet has cognitive complexity 376 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8515}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a4f102754851f45b65cd10ac00058aca8c00d556ebcd4022a34e0ba2eaf5e1e"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.PeekToken (cognitive 357): Parser.PeekToken has cognitive complexity 357 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"b34a13d29afdd368647fa5971ac3fcb577748b7e0181d38edc60eca1484f6585"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateCallExpression (cognitive 307): Evaluator.EvaluateCallExpression has cognitive complexity 307 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":4192}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0c619eb3552760bb81076fbfb5cae13048234e2958e58bffdce46bc0c4e45c5"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecutePrint (cognitive 282): Interactive.ExecutePrint has cognitive complexity 282 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12312}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d988c44c66fdda08d9c9b1dd940ec70e352f1f8f2c524b2b7994db01dfe8a47"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteStringPrimary (cognitive 281): Interactive.ExecuteStringPrimary has cognitive complexity 281 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2308}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ead1b13f33d59e008b9b8a2c6659c3dab47aef9c7ddae87caa22c432ccb2e32"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecutePrintUsing (cognitive 280): Interactive.ExecutePrintUsing has cognitive complexity 280 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12698}}}],"partialFingerprints":{"codehealthFindingId/v1":"07aed068bf3cbf1f18c62987879c633d979fc6dcd6acf856e8eba9f121afa732"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateBinaryExpression (cognitive 258): Evaluator.EvaluateBinaryExpression has cognitive complexity 258 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3872}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba366b41b04475a650c78fe6ee66cc1ddaab5caf49bbc4a4e497b0c6b6292996"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecutePut (cognitive 230): Interactive.ExecutePut has cognitive complexity 230 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":13632}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d15371bf29e2f73c9a52046a283413f675a99e2404cadeaa926299ef9f9e267"}},{"ruleId":"D2","level":"warning","message":{"text":"ConstantFolding.Fold (cognitive 216): ConstantFolding.Fold has cognitive complexity 216 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ConstantFolding.vb"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc6ce2ea3fb537f1138a657178f41f44f2107315b03227cc4478718064798afb"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.PlayCommand (cognitive 182): Evaluator.PlayCommand has cognitive complexity 182 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":5804}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ff8399cebd2b516fb23b8768ef1deca775a39ecc7721aba978913d3786f880c"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.InternalInputCompletedProcess (cognitive 176): Interactive.InternalInputCompletedProcess has cognitive complexity 176 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":17020}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7dfbdfb6b07af03c69398294ac36a6c02bb5655e3e33acf437d8c192bf8e56b"}},{"ruleId":"D2","level":"warning","message":{"text":"TextboxControl.OnKeyPress (cognitive 169): TextboxControl.OnKeyPress has cognitive complexity 169 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/TextBoxControl.vb"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e043c85d295f3455d3c2eff714fe493a194b1acd185d62b5462f1fee1542c1f"}},{"ruleId":"D2","level":"warning","message":{"text":"MainMenu.ProcessKeys (cognitive 159): MainMenu.ProcessKeys has cognitive complexity 159 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/MainMenu.vb"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf6ec1b796b9b6a89f4e7a988ee8b90137c9d4eb18e28320b857a57154ef09f9"}},{"ruleId":"D2","level":"warning","message":{"text":"OpenDialog.ProcessKeys (cognitive 156): OpenDialog.ProcessKeys has cognitive complexity 156 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/OpenDialog.vb"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"1db37425c3d569aa78928e28db1056acb6e3267a7750f10475f5686e6f79b089"}},{"ruleId":"D2","level":"warning","message":{"text":"Form.OnKeyPress (cognitive 138): Form.OnKeyPress has cognitive complexity 138 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/Form.vb"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"15cca3e8e4bd2d664b779135d9f797066a04079c91c0c03cd1cf16f8db81bbd6"}},{"ruleId":"D2","level":"warning","message":{"text":"WindowsFileSystem.Input (cognitive 138): WindowsFileSystem.Input has cognitive complexity 138 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/WindowsFileSystem.vb"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a6cd9acd7ae19dfc5c9b5268b52b4485a284d9b9cf639addd66afdc87e655fe"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteOpen (cognitive 134): Interactive.ExecuteOpen has cognitive complexity 134 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11697}}}],"partialFingerprints":{"codehealthFindingId/v1":"102efecedbd77564cc11dd0ee3d8f01af2b1425453ca08d3435a023854df2cac"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteInput (cognitive 133): Interactive.ExecuteInput has cognitive complexity 133 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":9910}}}],"partialFingerprints":{"codehealthFindingId/v1":"84a8da74160e133bfc51c6bcea69cfd114fb7e7220534850dbd817b402700587"}},{"ruleId":"D2","level":"warning","message":{"text":"BoundBinaryOperator.Initialize (cognitive 130): BoundBinaryOperator.Initialize has cognitive complexity 130 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundBinaryOperator.vb"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7ee95d417624a3aafd09f7dd88d64cd103d99a6ed69dc022a9e2632646e90b0"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteDraw (cognitive 120): Interactive.ExecuteDraw has cognitive complexity 120 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":18064}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb020b578e958b6fcf3126b67c00c1e7b9d46c25f4d7babb0d082402f3d15c70"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.RowCount.Set (cognitive 117): Display.RowCount.Set has cognitive complexity 117 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2487}}}],"partialFingerprints":{"codehealthFindingId/v1":"abc56384497ee625eece6e385d251f8a110c0ccb86be0373b35fe4f9f646ca2b"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteWidth (cognitive 115): Interactive.ExecuteWidth has cognitive complexity 115 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16251}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6e25660e84ebe6c0411de84fcecfe18514a62402a7ef51e8f165275723e987a"}},{"ruleId":"D2","level":"warning","message":{"text":"Video.LINE (cognitive 112): Video.LINE has cognitive complexity 112 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1611}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea738463c463a86f8b9a6790236d18cb2c5f58c6b1deb7cf869cd06c20b85c95"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.InternalLoadCompleted (cognitive 111): Interactive.InternalLoadCompleted has cognitive complexity 111 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6024}}}],"partialFingerprints":{"codehealthFindingId/v1":"8394190a0a009f5c0deb88a9315074f16a1bed361e2b5bfd3eb1e77beebb478c"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.FormatNumericWithSpec (cognitive 107): Evaluator.FormatNumericWithSpec has cognitive complexity 107 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2833}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1ec5fab7972b4fc881f8b58f2f9b74bdfa46be66f0153f32bd5c94067ce383c"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteComparison (cognitive 106): Interactive.ExecuteComparison has cognitive complexity 106 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2981}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9a09950c8f1dec9c5f4578f78d5d97ae9f9541283b2446f3471ea5243dcf3e4"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ProcessInterpreter (cognitive 101): Interactive.ProcessInterpreter has cognitive complexity 101 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1415}}}],"partialFingerprints":{"codehealthFindingId/v1":"26ad08f75404ae64beceaa63a37a0593b043d18ccf9544f168b857a3796317b9"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteLet (cognitive 101): Interactive.ExecuteLet has cognitive complexity 101 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10284}}}],"partialFingerprints":{"codehealthFindingId/v1":"37905efbfb43086e194e549e337bbdaf44cc979a812177b372e64460fed35f90"}},{"ruleId":"D2","level":"warning","message":{"text":"SaveAsDialog.ProcessKeys (cognitive 100): SaveAsDialog.ProcessKeys has cognitive complexity 100 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/SaveAsDialog.vb"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec94c262caf3550da1e3b9b34a150dd468c86b2db6982d60be1553cbec04e868"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteLineInput (cognitive 98): Interactive.ExecuteLineInput has cognitive complexity 98 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10668}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7d7be9b19bfe143b5ced3f210ca4a70ee371f6535417e04d618498c1938c792"}},{"ruleId":"D2","level":"warning","message":{"text":"Conversion.Classify (cognitive 98): Conversion.Classify has cognitive complexity 98 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Conversion.vb"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8cca9505cdc0c8e8d528b29f93d3f9114ef5e9a5b10d326d98d23299650079a"}},{"ruleId":"D2","level":"warning","message":{"text":"Decode.ProcessInternal (cognitive 97): Decode.ProcessInternal has cognitive complexity 97 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Tokenizer/Decode.vb"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f66dab4a48e3ce9a3c74d83537a0fc4052995d3188ffad377d1036fbcb3b7ae"}},{"ruleId":"D2","level":"warning","message":{"text":"Lexer.ReadIdentifierOrKeyword (cognitive 93): Lexer.ReadIdentifierOrKeyword has cognitive complexity 93 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"5668e1b22bd12fae3d445b9131c526116f7be97420161d439fbb6d7ad80a68e5"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.Paint (cognitive 90): Display.Paint has cognitive complexity 90 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1601}}}],"partialFingerprints":{"codehealthFindingId/v1":"77aa4bac194d7dffc7ceaa23445560843d9dfb7166a5039188198a6a84d354c9"}},{"ruleId":"D2","level":"warning","message":{"text":"QBasic.GetPressed (cognitive 82): QBasic.GetPressed has cognitive complexity 82 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":2160}}}],"partialFingerprints":{"codehealthFindingId/v1":"12df4f64a35c095684d394d89b7f6947c1e858c86d648772b83e48efb62eae20"}},{"ruleId":"D2","level":"warning","message":{"text":"Video.INKEY (cognitive 81): Video.INKEY has cognitive complexity 81 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":2095}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1c110f4cb8d4286cde25ef2e96a46f7afd33d0bc5c3072377e6becdcd0cdf5c"}},{"ruleId":"D2","level":"warning","message":{"text":"Video.CIRCLE (cognitive 80): Video.CIRCLE has cognitive complexity 80 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1341}}}],"partialFingerprints":{"codehealthFindingId/v1":"7018e1e7e37783664f22a26775d1a3c999d1e7acd48f33ef9544d5986229c3e8"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteView (cognitive 78): Interactive.ExecuteView has cognitive complexity 78 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15857}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2d66945e1d41996ac4eb1e1797a533064a15768fbe6e0c7ab8f1489a3f7dc95"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.Circle (cognitive 77): Display.Circle has cognitive complexity 77 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1919}}}],"partialFingerprints":{"codehealthFindingId/v1":"f25110bdb75b6ac9e08e43fdc31a407e682df80556f331c42bd9dbfbe932fe63"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.Line (cognitive 77): Display.Line has cognitive complexity 77 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2123}}}],"partialFingerprints":{"codehealthFindingId/v1":"d82c50388e1ce648f5c10454cb258c16527390a8ff30cb0fd30d0789d0b2aaea"}},{"ruleId":"D2","level":"warning","message":{"text":"Video.CIRCLE (cognitive 77): Video.CIRCLE has cognitive complexity 77 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1080}}}],"partialFingerprints":{"codehealthFindingId/v1":"5704697fbb30464039e1746eff51baa19c9403204f537496701dc69c730290e0"}},{"ruleId":"D2","level":"warning","message":{"text":"Program.HandleCommandLineArguments (cognitive 75): Program.HandleCommandLineArguments has cognitive complexity 75 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a5c1363e69f3794c45ce4bc6738e3ddb0f3e8c4ed74d1e0f65ddabead5f76a1"}},{"ruleId":"D2","level":"warning","message":{"text":"Common.GetChar (cognitive 73): Common.GetChar has cognitive complexity 73 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Common.vb"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdcfe45c27f3eddf46069c61371698234d6f40bad43a02204fd3da4d38b80314"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindCallExpression (cognitive 73): Binder.BindCallExpression has cognitive complexity 73 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":900}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9cdeb43f5ec3304c23b7871c3921d6d06dd204a130148e99d6b8788ef115ab3"}},{"ruleId":"D2","level":"warning","message":{"text":"DocumentPanel.ProcessKeys (cognitive 72): DocumentPanel.ProcessKeys has cognitive complexity 72 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4ccc35b7bf16e6590f51c5746a1546100464d6aa9430a4d9e5ec5a709c9af21"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.ParseForStatement (cognitive 72): Parser.ParseForStatement has cognitive complexity 72 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":1537}}}],"partialFingerprints":{"codehealthFindingId/v1":"11992018cb8c0ae675003ab9246fd22d8aad4358905b0fc3ebcdc2b480bac258"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindMemberAccessExpression (cognitive 71): Binder.BindMemberAccessExpression has cognitive complexity 71 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1068}}}],"partialFingerprints":{"codehealthFindingId/v1":"dae84e1fb96254da30a18b39c850dc426c5341e3ef3296bcd53c0cff9db0cc11"}},{"ruleId":"D2","level":"warning","message":{"text":"Video.InputAsync (cognitive 71): Video.InputAsync has cognitive complexity 71 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1815}}}],"partialFingerprints":{"codehealthFindingId/v1":"48f080019240a52e80b7431da85ef7eb65fd2259a1f7b8b11e9eeeec1d54ab2b"}},{"ruleId":"D2","level":"warning","message":{"text":"DocumentPanel.HandleSelection (cognitive 70): DocumentPanel.HandleSelection has cognitive complexity 70 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"34dca292795989218544e427b07c267ce29767eefa09a44b3ba56866817ffaee"}},{"ruleId":"D2","level":"warning","message":{"text":"Video.LineInputAsync (cognitive 70): Video.LineInputAsync has cognitive complexity 70 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Video.InputAsync) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1470}}}],"partialFingerprints":{"codehealthFindingId/v1":"55ce96fe71060b9e64bc949781bf06dd6e09d53bd4147f97d8e2bbf14925dceb"}},{"ruleId":"D2","level":"warning","message":{"text":"Video.InputAsync (cognitive 70): Video.InputAsync has cognitive complexity 70 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Video.LineInputAsync) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1616}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc3e51575ca9bbc205a4cc3b794155b98653237426701c512e09b2beb49f17d3"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteKey (cognitive 68): Interactive.ExecuteKey has cognitive complexity 68 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10121}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a91dbc6908168554ba1dd43ea0b93cc45344742745f278879ad4befdd435576"}},{"ruleId":"D2","level":"warning","message":{"text":"SavePrompt.ProcessKeys (cognitive 67): SavePrompt.ProcessKeys has cognitive complexity 67 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/SavePrompt.vb"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"41393961e696c68a8f606f17495d926e4be8d3441c2d3c1de1ff34654abeee0f"}},{"ruleId":"D2","level":"warning","message":{"text":"DocumentPanel.WordRightAction (cognitive 65): DocumentPanel.WordRightAction has cognitive complexity 65 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":814}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea80993d801ea7fa214dd6c6ab6b3d8022445983ef0234c43b09770c5a8f51e2"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphBuilder.Build (cognitive 65): GraphBuilder.Build has cognitive complexity 65 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ControlFlowGraph.vb"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"db8fc19de12ef64f943b7d66d2993469019ff3e11e533a7d348778b36a98ace4"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteDim (cognitive 64): Interactive.ExecuteDim has cognitive complexity 64 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7328}}}],"partialFingerprints":{"codehealthFindingId/v1":"94b0c989bc04118fe0f91fcb3a9c4ffb948d800c54d7cbbe45c74bef5c6f53a8"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteDefInt (cognitive 63): Interactive.ExecuteDefInt has cognitive complexity 63 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: 2 other methods here (Interactive.ExecuteDefSng, Interactive.ExecuteDefDbl) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6945}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b361d24fec60b3e133ebc658aed49d1c67dd3749c4da88d7ecbd42a1bf8bf84"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteDefSng (cognitive 63): Interactive.ExecuteDefSng has cognitive complexity 63 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: 2 other methods here (Interactive.ExecuteDefInt, Interactive.ExecuteDefDbl) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7026}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aeb79123b4a1ce0d4c24a5b3af6aab1159b16c1c4c6ab48dad3dae636f49434"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteDefDbl (cognitive 63): Interactive.ExecuteDefDbl has cognitive complexity 63 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: 2 other methods here (Interactive.ExecuteDefInt, Interactive.ExecuteDefSng) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7107}}}],"partialFingerprints":{"codehealthFindingId/v1":"07c5ce5ec194c13d325eaa2544eb30033aefa9efe92ffcc3685d9947df46d58a"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindGlobalScope (cognitive 63): Binder.BindGlobalScope has cognitive complexity 63 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"4661951f8fc3d5c988687d4bacec47fa5eef4c396d7679516a5f12d6df9cd36b"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteCommon (cognitive 62): Interactive.ExecuteCommon has cognitive complexity 62 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6646}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8581f0410d2ba3b558a2a49477f112ed6a5c6bb23c3f741f21b781c36f82bd3"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteOnErrorGoto (cognitive 61): Interactive.ExecuteOnErrorGoto has cognitive complexity 61 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11431}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f12030e812721964d5b7e115b7c91ee9dc23606f6003fb7b3ad93967094fc95"}},{"ruleId":"D2","level":"warning","message":{"text":"Console.INKEY (cognitive 60): Console.INKEY has cognitive complexity 60 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Console.vb"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"dba521f3ac5a05fc0bdd4dd43c0252ba6ee3311253bc740526f6020a499836bd"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.ColumnCount.Set (cognitive 58): Display.ColumnCount.Set has cognitive complexity 58 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2629}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ea27f7b69e1429a2e1a9fe01654ffb91beb83b241df27e664065d7207a49824"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteDef (cognitive 58): Interactive.ExecuteDef has cognitive complexity 58 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6834}}}],"partialFingerprints":{"codehealthFindingId/v1":"0da26946c42eef071139d1815d727c1f2b1d2feb56a1b3ff7710f29f49412c87"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteChain (cognitive 55): Interactive.ExecuteChain has cognitive complexity 55 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":5837}}}],"partialFingerprints":{"codehealthFindingId/v1":"46ba12ade79fedaf4b7d8a80e0ccc1293a7d4837c3a197519c9c8e262374516b"}},{"ruleId":"D2","level":"warning","message":{"text":"DocumentPanel.Render (cognitive 55): DocumentPanel.Render has cognitive complexity 55 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f994ef7599c65154cedbba9ec5fd782f250fa31be89a523d6bd1e52aa6fa5d5"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.Paint (cognitive 55): Display.Paint has cognitive complexity 55 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/Display.vb"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a0aaa4c2c3abd597d3107d05fa950fb05a2bdae07c76992dbb616e933ecb29c"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateArrayAccessExpressionForAssignment (cognitive 54): Evaluator.EvaluateArrayAccessExpressionForAssignment has cognitive complexity 54 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3732}}}],"partialFingerprints":{"codehealthFindingId/v1":"eac260f857a05dac2d479919f1fc3dc6fef733332ca50173d34796c5d356582e"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecutePaint (cognitive 53): Interactive.ExecutePaint has cognitive complexity 53 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11986}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6364f8fb1f0ba60badc8c79cd81eecfe1d5988e5cc43e618115795408bf79a3"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteDefStr (cognitive 52): Interactive.ExecuteDefStr has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7188}}}],"partialFingerprints":{"codehealthFindingId/v1":"b96771ce6fb7fe9922165507c71f3f03a8310543712360233546eb46c93d02d0"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteOn (cognitive 52): Interactive.ExecuteOn has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11312}}}],"partialFingerprints":{"codehealthFindingId/v1":"54d5d1fba38e0bfe1233fc38c36468f25ea06b6a3af6967879ca61595b3277bd"}},{"ruleId":"D2","level":"warning","message":{"text":"SyntaxNode.PrettyPrint2 (cognitive 52): SyntaxNode.PrettyPrint2 has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5184bb37808b9434bc575216342e9fd35bdeb97310b3e762ad45a396198afcc"}},{"ruleId":"D2","level":"warning","message":{"text":"WindowsAudio.StreamingLoop (cognitive 52): WindowsAudio.StreamingLoop has cognitive complexity 52 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/WindowsAudio.vb"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"319055c661561e924b7921a0bf9c33b64c79dcb5dccbe71378b869cc1a62438d"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.FoundMatchingNext (cognitive 51): Interactive.FoundMatchingNext has cognitive complexity 51 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.JumpToNext) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7920}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bbc9b15ec812222d1815b1bb86eb27b25b997e4b9c6d75b1b07def29fe36259"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.JumpToNext (cognitive 51): Interactive.JumpToNext has cognitive complexity 51 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.FoundMatchingNext) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8019}}}],"partialFingerprints":{"codehealthFindingId/v1":"5034fdfcec72a596697ebb2363c9bc87f5614346a4e9379e6016b048ab0cc2cc"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindIdentifierExpression (cognitive 51): Binder.BindIdentifierExpression has cognitive complexity 51 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1920}}}],"partialFingerprints":{"codehealthFindingId/v1":"466a41dc649e32744a35eaadbf4ad3e1e32b69962557bbe07a620ed0cd2d7267"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateArrayAccessExpression (cognitive 50): Evaluator.EvaluateArrayAccessExpression has cognitive complexity 50 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3632}}}],"partialFingerprints":{"codehealthFindingId/v1":"27fabb4b50debd7bb317c5d8a28e6d10b46ebfc35fb151a60d964b5ddc8aab32"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteFor (cognitive 48): Interactive.ExecuteFor has cognitive complexity 48 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7850}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b6847a9d1baafa0deb7b77eb9aceab84bec41c9537c05e41b7c15eb8125848d"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteLine (cognitive 48): Interactive.ExecuteLine has cognitive complexity 48 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10427}}}],"partialFingerprints":{"codehealthFindingId/v1":"c38086304e5d07f5a2d6a44457e3aadc2f75b4834249c30db56e727d2794872e"}},{"ruleId":"D2","level":"warning","message":{"text":"SyntaxNode.WriteNodeWithTrivia (cognitive 48): SyntaxNode.WriteNodeWithTrivia has cognitive complexity 48 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"be051aceff12c7f8b33410e3c526fd816b1d08082a1ae798c062d8d4b1d64765"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.Pset (cognitive 47): Display.Pset has cognitive complexity 47 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2231}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f1a35ba5ec5396d9e97184e7883487607297ff87c8640617dae7349ac1bd273"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.Color (cognitive 47): Display.Color has cognitive complexity 47 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":3982}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc73264d3ca0b3611f04ff60825627f1b6528f24181e0d5c46122075da724afb"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteMid (cognitive 47): Interactive.ExecuteMid has cognitive complexity 47 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11078}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bdbe49f8d0e58ae43a41a7792a8e7b77caf3e6f4faefe9e0458d218404ca4ee"}},{"ruleId":"D2","level":"warning","message":{"text":"DocumentPanel.TabAction (cognitive 47): DocumentPanel.TabAction has cognitive complexity 47 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"e71067402ddc1fdcc8ce25f065dd9b38110adf9a7d21d130b457f0316dfc3431"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.Assign (cognitive 47): Evaluator.Assign has cognitive complexity 47 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":4909}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b4466b7ea88060f81b362c4189650db33d5f16a559efeb9c6327d13def9ffe0"}},{"ruleId":"D2","level":"warning","message":{"text":"MainMenu.Render (cognitive 46): MainMenu.Render has cognitive complexity 46 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/MainMenu.vb"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"15241859e580ef500a470e07460bc6e79f27bcc40199e183e222053fdb4fcac1"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindInputStatement (cognitive 46): Binder.BindInputStatement has cognitive complexity 46 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1575}}}],"partialFingerprints":{"codehealthFindingId/v1":"257533eae8e550d3b138738bdc5b506eff5f12390c64dce9cad79adfe3ced8f9"}},{"ruleId":"D2","level":"warning","message":{"text":"InternalPage.SetPalette (cognitive 45): InternalPage.SetPalette has cognitive complexity 45 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"0923f8372c514cae35801bb5b8ffbc4610b764b30b1d2880810d6f42d927bc6a"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.FormatNumber (cognitive 45): Interactive.FormatNumber has cognitive complexity 45 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":13076}}}],"partialFingerprints":{"codehealthFindingId/v1":"389ca5c9282eea2c9c548729d2266dfe6353498e33f2a6a806eca04f17d8553f"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindTypeStatement (cognitive 45): Binder.BindTypeStatement has cognitive complexity 45 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2345}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a8f64d56a3a50ba6b0e164b906df1912da837401121450dece4da3ebb8cf6a6"}},{"ruleId":"D2","level":"warning","message":{"text":"Video.WriteCharacter (cognitive 45): Video.WriteCharacter has cognitive complexity 45 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":2276}}}],"partialFingerprints":{"codehealthFindingId/v1":"9056bb855a4c88111d06f00e4682d9c49136b9f7f63b14e16e7fd4b033da3b18"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteFunction (cognitive 44): Interactive.ExecuteFunction has cognitive complexity 44 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.ExecuteStringFunction) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":4198}}}],"partialFingerprints":{"codehealthFindingId/v1":"203aef8c9a77bcb3804b98b72ac12366a7df1ca37afc27794b92cc548dff99d1"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteStringFunction (cognitive 44): Interactive.ExecuteStringFunction has cognitive complexity 44 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.ExecuteFunction) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":4386}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fdd6eb708ba1a0cf6c38031639b8142c5eae02e8ab626051990302d74d5ed2d"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecutePoke (cognitive 44): Interactive.ExecutePoke has cognitive complexity 44 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12190}}}],"partialFingerprints":{"codehealthFindingId/v1":"dda736756f42df41f406324f803ba2ad39cb6767616407e2e477dc24d50ab43f"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.ScanParse (cognitive 44): Parser.ScanParse has cognitive complexity 44 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"128e32e369544a2978f6d8cb5831eb631ea61e92d02b1fec4abb322cd51ba0ab"}},{"ruleId":"D2","level":"warning","message":{"text":"SyntaxNode.PrettyPrint (cognitive 44): SyntaxNode.PrettyPrint has cognitive complexity 44 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"053e59ce806d08d1672b7a0c9bf1968434eff31c500f91cc1be732a3fb02ad32"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteIf (cognitive 42): Interactive.ExecuteIf has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":9584}}}],"partialFingerprints":{"codehealthFindingId/v1":"e62671ce42f41fc0d3cd69ddd25c8faee1a6e1920686578394c6aa0cd01228f2"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteRandomize (cognitive 42): Interactive.ExecuteRandomize has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":14092}}}],"partialFingerprints":{"codehealthFindingId/v1":"76dccc50e89ba5e4ff363167ca5e2f709383d254eda46aa1bc2b5dc37199c2ed"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteWindow (cognitive 42): Interactive.ExecuteWindow has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16431}}}],"partialFingerprints":{"codehealthFindingId/v1":"3407a861c984de989fb2130f7014bab305f2b3c836fcc5400d5737fb1e8cb4f6"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindVariableReference (cognitive 42): Binder.BindVariableReference has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":3156}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e190a756032e90dd6eaafa00bfd62b056ccedd166a52ca6df9c2b957c7e1eb5"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateVariableExpression (cognitive 42): Evaluator.EvaluateVariableExpression has cognitive complexity 42 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3517}}}],"partialFingerprints":{"codehealthFindingId/v1":"c979f88eaab3c41624bd930b5c1c3f5d1532160c8e81f6a4e0ad88ff089d2dca"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteClear (cognitive 41): Interactive.ExecuteClear has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6373}}}],"partialFingerprints":{"codehealthFindingId/v1":"d94c165535d9542a38914584b43b461d600f8f16582bf689e04405bb46b8cc1a"}},{"ruleId":"D2","level":"warning","message":{"text":"MainMenu.ProcessMouse (cognitive 41): MainMenu.ProcessMouse has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/MainMenu.vb"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"75c227233bc1afad5433a53517b72a2ea18b54d86b2f4d55429a33626cdf52c6"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateEraseStatement (cognitive 41): Evaluator.EvaluateEraseStatement has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3384}}}],"partialFingerprints":{"codehealthFindingId/v1":"acc34033fa3aa06ea4c932a01246dab2d6a6da52dd3b0aee3e0b9b3451f99c24"}},{"ruleId":"D2","level":"warning","message":{"text":"IndentedSyntaxWriter.RewriteGotoGosubUsingSyntaxTree (cognitive 41): IndentedSyntaxWriter.RewriteGotoGosubUsingSyntaxTree has cognitive complexity 41 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/GwBasicToQBasicRewriter.vb"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"8145b79be1d01225233b9a9bcd28a402af9e24a49521f9850f4a9d158450dace"}},{"ruleId":"D2","level":"warning","message":{"text":"WelcomeDialog.ProcessKeys (cognitive 40): WelcomeDialog.ProcessKeys has cognitive complexity 40 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/WelcomeDialog.vb"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a7fe338aae5cae40b669f6c7b78ed47f9fda3848a8b723447c3fba78155421c"}},{"ruleId":"D2","level":"warning","message":{"text":"WindowsFileSystem.Files (cognitive 39): WindowsFileSystem.Files has cognitive complexity 39 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/WindowsFileSystem.vb"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5761aa989600cb4daab5f7dd4edcdc07178d23da1ff05fd945c855ca56d86be"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateWriteStatement (cognitive 39): Evaluator.EvaluateWriteStatement has cognitive complexity 39 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2543}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9869413ce3c2b7955b90114235500f92056f57d9e75cedc7a5fa46bca9947bd"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.ParseNumericFormat (cognitive 39): Evaluator.ParseNumericFormat has cognitive complexity 39 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2710}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee448cbf61d85787e6fe8eaa950bfb289540403fa0675c8c1ca27f7cd6fb9318"}},{"ruleId":"D2","level":"warning","message":{"text":"Lexer.ReadNumberToken (cognitive 39): Lexer.ReadNumberToken has cognitive complexity 39 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"fddafb0ca3ad2c2bcf4ac6136ec141718547c6d68d86b8ebee2d892ed1407177"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.InternalPrint (cognitive 38): Display.InternalPrint has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":4534}}}],"partialFingerprints":{"codehealthFindingId/v1":"2150f7632231d3365f5cbf3cceb05a3334621f1690d5598ab76d32b08c904048"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteLocate (cognitive 38): Interactive.ExecuteLocate has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10530}}}],"partialFingerprints":{"codehealthFindingId/v1":"2de7595a1afa6755ebbec5cb53116d9bfa06ab8a00a5ecc88780c57bd1f3761f"}},{"ruleId":"D2","level":"warning","message":{"text":"DocumentPanel.WordLeftAction (cognitive 38): DocumentPanel.WordLeftAction has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"76b70f5a4c6cab5dfc287e7b2857d25baa93a439fc99cc5567c8ba9f12c060a5"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindSubDeclaration (cognitive 38): Binder.BindSubDeclaration has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"03af08f6b6bb4a70f2f14fc39f517f88d76f6fe5fcd79421271abc03f1060b8f"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindRedimStatement (cognitive 38): Binder.BindRedimStatement has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2826}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0ab0733df228f2c3ec791ea9b1b7b4c4d6a154ab517d7f503d0551bae927dd7"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateDimStatement (cognitive 38): Evaluator.EvaluateDimStatement has cognitive complexity 38 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3261}}}],"partialFingerprints":{"codehealthFindingId/v1":"603a9545791c615379f9aec4807ef5addd8da42f6208c663399d3e05278be979"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteCircle (cognitive 37): Interactive.ExecuteCircle has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6254}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b4d50cd55ca0b062a38dd98c7c5f817bec7e71ee11320cbf56064696efff546"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteNext (cognitive 37): Interactive.ExecuteNext has cognitive complexity 37 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8185}}}],"partialFingerprints":{"codehealthFindingId/v1":"9092a4603f1b2a3dd62405b9091c90731b15c3f0814f8a8446f4673e3612066e"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.Assign (cognitive 36): Evaluator.Assign has cognitive complexity 36 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":4994}}}],"partialFingerprints":{"codehealthFindingId/v1":"14dc552fae18e6cb5bb538ea2a4272e76da543dd7e2703eee9fc5d0ddd9cbfef"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteErase (cognitive 34): Interactive.ExecuteErase has cognitive complexity 34 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7567}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf82424af5415aae3cf3bbdd681f26bfb3793de7207c890a104bcba064deef7b"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteNextDecision (cognitive 34): Interactive.ExecuteNextDecision has cognitive complexity 34 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8418}}}],"partialFingerprints":{"codehealthFindingId/v1":"59d66ac2d494047c9b03289f44bb9d9b8a6e9420dec1dda6210c09352f71c8a0"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.GotoLabelOrLineNumber (cognitive 34): Interactive.GotoLabelOrLineNumber has cognitive complexity 34 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":9282}}}],"partialFingerprints":{"codehealthFindingId/v1":"16f84316f74e22238f0afba7e211c0ddbd75c5ad828dec71434c303117f7d739"}},{"ruleId":"D2","level":"warning","message":{"text":"HorizontalListboxControl.OnKeyPress (cognitive 34): HorizontalListboxControl.OnKeyPress has cognitive complexity 34 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/HorizontalListBoxControl.vb"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a6df20aedc50c0c8cc9a2ffa711552b74252f9da835d8b207faef9aa2cbef3b"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateKeyStatement (cognitive 34): Evaluator.EvaluateKeyStatement has cognitive complexity 34 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1739}}}],"partialFingerprints":{"codehealthFindingId/v1":"03b1176ee4c9e6d93a9dc69032a64c88fc160354c655dae4f1a569587e14983b"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateConversionExpression (cognitive 34): Evaluator.EvaluateConversionExpression has cognitive complexity 34 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":4866}}}],"partialFingerprints":{"codehealthFindingId/v1":"8392d4daba0623294753d194ca6b6dbb7f17bae297ecabedc7f24967698c15de"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteMultiplyDivide (cognitive 33): Interactive.ExecuteMultiplyDivide has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":3098}}}],"partialFingerprints":{"codehealthFindingId/v1":"994ca4992fc04bca01f14d99d352f1023030f1f4d162cf05156b7a5f9997be93"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteRead (cognitive 33): Interactive.ExecuteRead has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":14199}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9981195f029a3cbb10d2316e86f660848f90f3d485be1ba0235a2f1ab7e77cd"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteScreen (cognitive 33): Interactive.ExecuteScreen has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15053}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c2dce3198702889659b1b84d805fd0f1bdd9cd741b59abc3434a3208d73c7a1"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.InternalReadCompletedProcess (cognitive 33): Interactive.InternalReadCompletedProcess has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":17397}}}],"partialFingerprints":{"codehealthFindingId/v1":"d37b2050bb07086a7d600c57b1c9ee359ffaedb153524675972e01491d48b13b"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateOpenStatement (cognitive 33): Evaluator.EvaluateOpenStatement has cognitive complexity 33 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":5067}}}],"partialFingerprints":{"codehealthFindingId/v1":"b68756c2e924475e7334d02eae124f6178b099d671ca73ed21cee526b29f5121"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ThrowBasicError (cognitive 32): Interactive.ThrowBasicError has cognitive complexity 32 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2012}}}],"partialFingerprints":{"codehealthFindingId/v1":"06edab4fb1f43cb6a11d96d7158b4bf7206bf3f5df989e8f11e0201ca47fe333"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.RealPath (cognitive 32): Interactive.RealPath has cognitive complexity 32 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2152}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dc7972cb5741e1fcd94609f076e19abe34956425265b4c87870c029681ef13b"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.FormatUsingOutput (cognitive 32): Evaluator.FormatUsingOutput has cognitive complexity 32 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2461}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e8790e5745f60527f1fb66123689b0ecd125c2803284841b3e0e62f3f5bd792"}},{"ruleId":"D2","level":"warning","message":{"text":"AboutDialog.ProcessKeys (cognitive 31): AboutDialog.ProcessKeys has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/AboutDialog.vb"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"a20a31f8819c272968e914dec047552b5c8509868c1cf5e4f9a020c7d07c03b0"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.FoundMatchingWend (cognitive 31): Interactive.FoundMatchingWend has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.JumpToWend) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16125}}}],"partialFingerprints":{"codehealthFindingId/v1":"30655f3976e65e470357d7435b875da6cf5044718220ce4c528e351782f379d8"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.JumpToWend (cognitive 31): Interactive.JumpToWend has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.FoundMatchingWend) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16188}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f3a82abb9b8bb38c2d4740827ba60eacb531509e7f6549b346961362112c362"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.InternalOpen (cognitive 31): Interactive.InternalOpen has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16762}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c53bdec45af57dc2e90fe14b629d08267d4a0a3da0e221a93cd69a78712b8a7"}},{"ruleId":"D2","level":"warning","message":{"text":"CsvSplit.CsvSplit (cognitive 31): CsvSplit.CsvSplit has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Utils/CsvSplit.vb"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c391e87c9b9960695176c475310ddf0d3d5c45db9c19605c6d378fb8262f8d6"}},{"ruleId":"D2","level":"warning","message":{"text":"ChangeDialog.ProcessKeys (cognitive 31): ChangeDialog.ProcessKeys has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/ChangeDialog.vb"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d766bb85173e9d692ecab1d18916df2cb84c428f946c39ef590d3b9844f0359"}},{"ruleId":"D2","level":"warning","message":{"text":"DisplayDialog.ProcessKeys (cognitive 31): DisplayDialog.ProcessKeys has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DisplayDialog.vb"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6291f34771834472bb7ea667bde4cfb12cea55b6209ca7f44d7191f4a2fcc80"}},{"ruleId":"D2","level":"warning","message":{"text":"FindDialog.ProcessKeys (cognitive 31): FindDialog.ProcessKeys has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/FindDialog.vb"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6db78b743c5a3b5f3cce25cd3ae886408c3b6df47ede507a0a724c661414533"}},{"ruleId":"D2","level":"warning","message":{"text":"HelpPathDialog.ProcessKeys (cognitive 31): HelpPathDialog.ProcessKeys has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/HelpPathDialog.vb"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"d131eea1414919ebe98a0cdd9bc8ebf8924ea0239746ccc70a588ca428fe6c0e"}},{"ruleId":"D2","level":"warning","message":{"text":"NewFunctionDialog.ProcessKeys (cognitive 31): NewFunctionDialog.ProcessKeys has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/NewFunctionDialog.vb"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bd646c7dc30871beae5d7334f157afd4b7b77130abff54ae988a025604bf8e8"}},{"ruleId":"D2","level":"warning","message":{"text":"NewSubDialog.ProcessKeys (cognitive 31): NewSubDialog.ProcessKeys has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/NewSubDialog.vb"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"416013ad8f38aa7546ce6bd66fcd3f6edc39dfde0fbb9d1d44be958a6c89a0ba"}},{"ruleId":"D2","level":"warning","message":{"text":"PrintDialog.ProcessKeys (cognitive 31): PrintDialog.ProcessKeys has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/PrintDialog.vb"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"b981c92f6cf169a9632934b1aeb69d61207b4a71274ff361d7bb0eccfcff61f3"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.ParseSelectCaseStatement (cognitive 31): Parser.ParseSelectCaseStatement has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":3562}}}],"partialFingerprints":{"codehealthFindingId/v1":"50b2a69f4d55a6a8a1ddfc0c05dc41066bff8b327b9b0236d5cb13d365ada35b"}},{"ruleId":"D2","level":"warning","message":{"text":"Video.PRINT (cognitive 31): Video.PRINT has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1192}}}],"partialFingerprints":{"codehealthFindingId/v1":"b738ca8b4610a6b6f78e0a7ed2f951d8959c774feb82649a28169083477bcfc8"}},{"ruleId":"D2","level":"warning","message":{"text":"SubsDialog.ProcessKeys (cognitive 31): SubsDialog.ProcessKeys has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/SubsDialog.vb"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"b15647ede5e66a17adeac699f42841a4384d1e2e0832a597f9e8bce25beee4ea"}},{"ruleId":"D2","level":"warning","message":{"text":"SyntaxTreeForm.PopulateTreeview (cognitive 31): SyntaxTreeForm.PopulateTreeview has cognitive complexity 31 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/vbcompare/SyntaxTreeForm.vb"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd66aa30d0f5716acdd3d04938b36c05079a101e83113a04090e3a09291e7cf6"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.EditKeyPress (cognitive 30): Display.EditKeyPress has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":4999}}}],"partialFingerprints":{"codehealthFindingId/v1":"207c98eb1fb7da8d8871a92e12ce2bec23740f80ac940718cbb4e176b30727a7"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ParseValue (cognitive 30): Interactive.ParseValue has cognitive complexity 30 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":18390}}}],"partialFingerprints":{"codehealthFindingId/v1":"1515fb497e8cdb21e7725888a1188a21ad0f4414f0791de656880958107a7efd"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.WriteCharacter (cognitive 29): Display.WriteCharacter has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":3435}}}],"partialFingerprints":{"codehealthFindingId/v1":"72666a424a23f65b9d8d2fd1c7ab0bd631805e734c2d308819f6438721b43560"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.InitArray (cognitive 29): Interactive.InitArray has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7452}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8ce774854ec3e505e0ca09071d476f00371f81db41af315600544cad15008d9"}},{"ruleId":"D2","level":"warning","message":{"text":"WindowsFileSystem.CsvSplit (cognitive 29): WindowsFileSystem.CsvSplit has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/WindowsFileSystem.vb"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"235af136f6c6191616e34728719079621739de82787980680f9a535e0ef17024"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindPrintStatement (cognitive 29): Binder.BindPrintStatement has cognitive complexity 29 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2095}}}],"partialFingerprints":{"codehealthFindingId/v1":"83049d4e8d08ba8ff14e4775b298c0a88873c4decb70f0b937d37c16072b0f87"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.SetPalette (cognitive 28): Display.SetPalette has cognitive complexity 28 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":4409}}}],"partialFingerprints":{"codehealthFindingId/v1":"f86be5dcaad83fe990ed60095a4c39c0172dd6e9ca80498983c8268b64a2cb20"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.InternalClose (cognitive 27): Interactive.InternalClose has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":5770}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e3b0dca42ad4cac3f0d406cc2a3e463bdf0882e631b277ca472cadb6d31b223"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteFilesParseResult (cognitive 27): Interactive.ExecuteFilesParseResult has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7730}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e87658980d711236450aef00278d7cd67184abdd7bc3b6cb36fa95bad305059"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteOnKey (cognitive 27): Interactive.ExecuteOnKey has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.ExecuteOnTimer) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11520}}}],"partialFingerprints":{"codehealthFindingId/v1":"c81a18457d619a802031ed9a67fcd2a8b344069639590acc445ad5807f4801a8"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteOnTimer (cognitive 27): Interactive.ExecuteOnTimer has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.ExecuteOnKey) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11563}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d52dc840ea7d17cfb2a3438607e9b467a986c04904ca57ea4025ac4ea3c1d2a"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteOption (cognitive 27): Interactive.ExecuteOption has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11923}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2d50cf2429f90cd3ad3060e2064e93df47ee10381f7dd28d93b09263e5128fe"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageDialog.ProcessKeys (cognitive 27): MessageDialog.ProcessKeys has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/MessageDialog.vb"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"83226d6edd940a92ef4363f31f4239d4ce87f2e2df00f129acf651922f8ab238"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateIfStatement (cognitive 27): Evaluator.EvaluateIfStatement has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3165}}}],"partialFingerprints":{"codehealthFindingId/v1":"c21302760bc53c2f50ac0052d79be5f63f435a2ff67cebae962d67e077a29519"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.ParseOnStatement (cognitive 27): Parser.ParseOnStatement has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":2548}}}],"partialFingerprints":{"codehealthFindingId/v1":"1627bde379c2e80e5d75ea2dd7c706366121400086b6a5581fa83f51f740cbb5"}},{"ruleId":"D2","level":"warning","message":{"text":"SyntaxNode.GetChildren (cognitive 27): SyntaxNode.GetChildren has cognitive complexity 27 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"3612e02ca483a6aefadcfd4e22d68b2a0c70bef54c80550d6340cc0eb9c077dd"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.Screen (cognitive 26): Display.Screen has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2752}}}],"partialFingerprints":{"codehealthFindingId/v1":"96b1ba91ae8897d79820e34afd82fa20d2055a26e97a1a18113393d2d9512212"}},{"ruleId":"D2","level":"warning","message":{"text":"ListboxControl.OnKeyPress (cognitive 26): ListboxControl.OnKeyPress has cognitive complexity 26 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/ListBoxControl.vb"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"37417719bbc5489fcc715f237cb4d7deeeb50aba426b188761d72af20f64494b"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindDimStatement (cognitive 25): Binder.BindDimStatement has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2736}}}],"partialFingerprints":{"codehealthFindingId/v1":"2236aeef9833e85fb2fe96e0e7e4819c7ba8683d9c92d00f1bc2f414c40e2780"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.CheckKeyPressed (cognitive 25): Evaluator.CheckKeyPressed has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1970}}}],"partialFingerprints":{"codehealthFindingId/v1":"875bda7c5cec022572429fe09978f83d495d230a21b7ad9f586a0de7aeddcacd"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateSelectCaseStatement (cognitive 25): Evaluator.EvaluateSelectCaseStatement has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2194}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae4a856e53507d0e101525e781facb5f13cf72d3129a6cc756581cb6e4006bd2"}},{"ruleId":"D2","level":"warning","message":{"text":"QBasicToVbNetRewriter.ConvertPrintStatementUsingSyntax (cognitive 25): QBasicToVbNetRewriter.ConvertPrintStatementUsingSyntax has cognitive complexity 25 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/QBasicToVbNetRewriter.vb"},"region":{"startLine":588}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d8b482b428d1a1a46ab645cce9507ee0cd52e461800bfe1c4fa40a967428c0d"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteResume (cognitive 24): Interactive.ExecuteResume has cognitive complexity 24 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":14610}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b2843e94fe556ea287c39ac5e952c7e9691a651fb0783b7f66093a51448da0c"}},{"ruleId":"D2","level":"warning","message":{"text":"BoundLiteralExpression.New.ctor (cognitive 24): BoundLiteralExpression.New.ctor has cognitive complexity 24 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundLiteralExpression.vb"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"7221d5eca35aafebae27e74df14869eb242b19097638c5a6a9f75c2b12426dac"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.InternalGetBounds (cognitive 23): Interactive.InternalGetBounds has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":4536}}}],"partialFingerprints":{"codehealthFindingId/v1":"02d0e856ed12f5b30f349df5f0e8b5a4005f2a38f77d91a8ad291d505eac9089"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteOnPen (cognitive 23): Interactive.ExecuteOnPen has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11607}}}],"partialFingerprints":{"codehealthFindingId/v1":"82b8b2cdc855a4e695463ce8c41ca4ab9f189605a52ac2bf1c9058699e4847da"}},{"ruleId":"D2","level":"warning","message":{"text":"DocumentPanel.InsertAction (cognitive 23): DocumentPanel.InsertAction has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":1009}}}],"partialFingerprints":{"codehealthFindingId/v1":"c09cff734ca95e498a22770bbb3b992d416ce56568ba346318b9723af5c3f60f"}},{"ruleId":"D2","level":"warning","message":{"text":"Program.Main (cognitive 23): Program.Main has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"18f9d75efd89207bb8f9720393a9b7cdd98e72577c139e993ba130ff38102617"}},{"ruleId":"D2","level":"warning","message":{"text":"QBasic.OnUserCreate (cognitive 23): QBasic.OnUserCreate has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1c75d4c689ab688de4bf385efb977cadffc0d63ed5b1f708076bf14e8a0d1fe"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindFieldStatement (cognitive 23): Binder.BindFieldStatement has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1406}}}],"partialFingerprints":{"codehealthFindingId/v1":"64ff8be7e68abedaec97098cbca59b5a31dda45b87e37f309451519cc35f7a1e"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.ParseLineStatement (cognitive 23): Parser.ParseLineStatement has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":2246}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4e95ba2e9ab1c8ff506fcf18d04d09e11c9c4b0d8baeb07f72d2eeb73751584"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioDevice.EmitTone (cognitive 23): AudioDevice.EmitTone has cognitive complexity 23 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/AudioDevice.vb"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"61976758c658b6f04ee6b4135f0c5db30548201eba9434d1ffbbf75a93dce784"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteClose (cognitive 22): Interactive.ExecuteClose has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":5705}}}],"partialFingerprints":{"codehealthFindingId/v1":"971e8fe4f512d75c66d98fff60147f02f93285336bc627fa41ef72f46899c87b"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteField (cognitive 22): Interactive.ExecuteField has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7649}}}],"partialFingerprints":{"codehealthFindingId/v1":"75d18d32177adb254124750a7d23885ed09bec83dc38f7cb01aeb621ea74e927"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteShell (cognitive 22): Interactive.ExecuteShell has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15458}}}],"partialFingerprints":{"codehealthFindingId/v1":"676179bdd39161d9922a80f4bcf36caef8ec4624ee2a1973df68e2eef82e3bf8"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteSwap (cognitive 22): Interactive.ExecuteSwap has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15633}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc75759fbf1c8a1c3e589b95ba98f6a0e7da74ede9c62c2eae315b8d8451c486"}},{"ruleId":"D2","level":"warning","message":{"text":"Program.WriteNodeWithTrivia (cognitive 22): Program.WriteNodeWithTrivia has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":478}}}],"partialFingerprints":{"codehealthFindingId/v1":"90ce10d9d62e9f39ec6af2ab7c465bb4e9f55df8d64d0f0db62a7e5594d1cfe7"}},{"ruleId":"D2","level":"warning","message":{"text":"QBasic.NewWndProc (cognitive 22): QBasic.NewWndProc has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1104}}}],"partialFingerprints":{"codehealthFindingId/v1":"de1ae3a558a8f26e5fed8d10d8cfaa724e2b5daa776d59c368e21268bfc0e99e"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindDefTypeStatement (cognitive 22): Binder.BindDefTypeStatement has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2292}}}],"partialFingerprints":{"codehealthFindingId/v1":"3101de9b754d2f1830aece25f8202e3044ac8790ff36382aa3fc875f33316c19"}},{"ruleId":"D2","level":"warning","message":{"text":"BoundConversionExpression.New.ctor (cognitive 22): BoundConversionExpression.New.ctor has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundConversionExpression.vb"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdff0c2d122c3e3f5bb476b5fce4d1dd295141848c0a913c50aa5fcbcbab6676"}},{"ruleId":"D2","level":"warning","message":{"text":"BoundTreeRewriter.RewritePrintStatement (cognitive 22): BoundTreeRewriter.RewritePrintStatement has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundTreeRewriter.vb"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"00fc3c3973e82dadd82b21e5d906788e2fa9ce5ebf7abdd93dd8905af3a0a54f"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EmitPlayNote (cognitive 22): Evaluator.EmitPlayNote has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":6081}}}],"partialFingerprints":{"codehealthFindingId/v1":"090567d057a966bee4024eb5d6e3658b33eb56adf501d31f03dad076947802a0"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.ParseStatement (cognitive 22): Parser.ParseStatement has cognitive complexity 22 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"05287730c5096f77a2c9b69b8a17de3139c31f4661f981145197212c175a4255"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ProcessCommand (cognitive 21): Interactive.ProcessCommand has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1673}}}],"partialFingerprints":{"codehealthFindingId/v1":"460cb3c33e6b0ba9f3b94af6fe05fb3a640eec379a738be717cfa0d14862ffbd"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteColor (cognitive 21): Interactive.ExecuteColor has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6480}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd38303e5e3e32a509953b548f7749815de1d8566469d77bf6068d16febee9f4"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecutePreset (cognitive 21): Interactive.ExecutePreset has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.ExecutePset) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12258}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9f38d2b641d349b751d6f557aa73b7692ff62bf3dfd277295b106877bb7853d"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecutePset (cognitive 21): Interactive.ExecutePset has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.ExecutePreset) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":13578}}}],"partialFingerprints":{"codehealthFindingId/v1":"def38901ca7c68a89b8cc7fa57634361c03f55bb9dc9a11534bc05d723ddcbd6"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.SetNumericVariable (cognitive 21): Interactive.SetNumericVariable has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16605}}}],"partialFingerprints":{"codehealthFindingId/v1":"a074d2225a01b0b5c81d7b8b16396fb2d6e67c2aed401a33453fddabcdb8b133"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.FindEndOfStatement (cognitive 21): Parser.FindEndOfStatement has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":970}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8b8a4df8e23e61716876cb0fd0e6d7da239b4657118d2e7268f707c112cc770"}},{"ruleId":"D2","level":"warning","message":{"text":"DocumentPanel.DeleteRestOfWordAction (cognitive 21): DocumentPanel.DeleteRestOfWordAction has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":982}}}],"partialFingerprints":{"codehealthFindingId/v1":"503a7089166d6bba15a70a3a55637a8ac21a1fa9d49f497d5a1d4ee9659a2220"}},{"ruleId":"D2","level":"warning","message":{"text":"HelpDialog.ProcessKeys (cognitive 21): HelpDialog.ProcessKeys has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/HelpDialog.vb"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b304564077202b2f51c8af28abedf65672f89c7bfe0400eee8242a2c2458a1d"}},{"ruleId":"D2","level":"warning","message":{"text":"QBasic.MakeExeFileFbcAction (cognitive 21): QBasic.MakeExeFileFbcAction has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":2674}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebdc83b131620d25f4f66389cef30ec29301a0999d1a286ab64e43d3f01fdd97"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindSingleLineIfStatement (cognitive 21): Binder.BindSingleLineIfStatement has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2552}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab44bdc163d054d079fe9c6d996c51c1379a2963c5fad59e03fcdcef4382d9ed"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.ParsePrintUsingFormat (cognitive 21): Evaluator.ParsePrintUsingFormat has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2631}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad9dd848c5598598ef44387b2db6c6091cc42ae165ed5e2e9c5844397dc4948e"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.New.ctor (cognitive 21): Parser.New.ctor has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"88bf4b0939f3b2a9477ceee49f89a68b3673a51639db3fdb588c992cbaf475fb"}},{"ruleId":"D2","level":"warning","message":{"text":"Video.POINT (cognitive 21): Video.POINT has cognitive complexity 21 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":2335}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd5a16908e711c964607632519d85d406163da56133f91b4cd457094ddff83ca"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteKill (cognitive 20): Interactive.ExecuteKill has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10233}}}],"partialFingerprints":{"codehealthFindingId/v1":"65fb157e567aeb07f12f52086adc61f4c2fbeb4c7c18b9873d31bd0d283df68d"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.PullNumericFormat (cognitive 20): Interactive.PullNumericFormat has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12647}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba42e873f9b739dbfb20794e3c43b0ba810c6e204a04c5a14a595a95326ab47f"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteSound (cognitive 20): Interactive.ExecuteSound has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15556}}}],"partialFingerprints":{"codehealthFindingId/v1":"83a8597c8f12ffe0c28c8e5d226732b687a2bf3098fb923324fe8047b4341708"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindConstStatement (cognitive 20): Binder.BindConstStatement has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2774}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ca4c385276749d85db66bb3c27e3a97fe009e8c399875737241ad3afcee42cb"}},{"ruleId":"D2","level":"warning","message":{"text":"BoundScope.TryLookupFunctionByNameAndArityPreferSpecific (cognitive 20): BoundScope.TryLookupFunctionByNameAndArityPreferSpecific has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundScope.vb"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"95aa67c08db25cc4bd7e69e6b9f4883f5270910f86c277383691a931e2005a86"}},{"ruleId":"D2","level":"warning","message":{"text":"ConstantFolding.ComputeConstant (cognitive 20): ConstantFolding.ComputeConstant has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ConstantFolding.vb"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc6b60767fdffa47d3e887fe56ccb715fc986efc5a3e01363c879bd30cd09dd2"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeSymbol.TypeSymbolToType (cognitive 20): TypeSymbol.TypeSymbolToType has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Symbols/TypeSymbol.vb"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5c39938a84860e7a421655bcdab63870802b11f93eee9bbd01e0d23c9eb7167"}},{"ruleId":"D2","level":"warning","message":{"text":"Video.WriteCharacter (cognitive 20): Video.WriteCharacter has cognitive complexity 20 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":2109}}}],"partialFingerprints":{"codehealthFindingId/v1":"66b8d70453f4371405d3635de3146f1bad230c108747e731c6519ac00061da37"}},{"ruleId":"D2","level":"warning","message":{"text":"SoundGenerator.InternalNew (cognitive 19): SoundGenerator.InternalNew has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Audio/SoundGenerator.vb"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4528884732a7e928b2a5091ca3d227709d31991eb792d47716189c802746b31"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.InsertUpdateSourceLine (cognitive 19): Interactive.InsertUpdateSourceLine has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1836}}}],"partialFingerprints":{"codehealthFindingId/v1":"16f1b69aa0094e4680138e71c92d69cc96204c685dd35bc257dd064a8bedddeb"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteLock (cognitive 19): Interactive.ExecuteLock has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.ExecuteUnlock) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10613}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad62a12604dca81058347167d187d4aac7a7f342c77d21ff9f852a199c51cc6e"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteUnlock (cognitive 19): Interactive.ExecuteUnlock has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Interactive.ExecuteLock) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15790}}}],"partialFingerprints":{"codehealthFindingId/v1":"86fb27e1ad3aeed2d619f1e8ce62210a29d1cdf1ae3f1d1a898c5270500453e2"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteWrite (cognitive 19): Interactive.ExecuteWrite has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16500}}}],"partialFingerprints":{"codehealthFindingId/v1":"caae07cd65c3cb33675c5025d9bc5d6fa284831963466cfa44d40501050a019d"}},{"ruleId":"D2","level":"warning","message":{"text":"MkCv.CVS (cognitive 19): MkCv.CVS has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (MkCv.CVD) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/VisualBasic/MKI.vb"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"4991458c00cd2c3dc74592cb26267324a87799eb1de35e5ba1232b2f3adc0eb2"}},{"ruleId":"D2","level":"warning","message":{"text":"MkCv.CVD (cognitive 19): MkCv.CVD has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (MkCv.CVS) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/VisualBasic/MKI.vb"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c62dc11c57bd2b1043ad13c30915cc56d4f50ae4e0baca0a9043783392d6851"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindLetStatement (cognitive 19): Binder.BindLetStatement has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1674}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf6d6e7c02b1af2d93efdd91e7450401dc1810b69ee245348597141feeb86339"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindReturnStatement (cognitive 19): Binder.BindReturnStatement has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2483}}}],"partialFingerprints":{"codehealthFindingId/v1":"85842964dfb93770c52bb214931d0714f87c41088ebc8037ef3eef345470539a"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateRestoreStatement (cognitive 19): Evaluator.EvaluateRestoreStatement has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1446}}}],"partialFingerprints":{"codehealthFindingId/v1":"b41e9333d2ee52e76b2433aa9c3187b7d3f52019d5d16236c84cc38db5d4549d"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateHandlePrintStatement (cognitive 19): Evaluator.EvaluateHandlePrintStatement has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3098}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc5d8c474b9e86393ed515c42185f9abd4413df8ce70e7ff9891b7f002c5dc9b"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.ParseOpenStatement (cognitive 19): Parser.ParseOpenStatement has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":2703}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fd20fe029a782907634a5455c90f645daed8d1148f6a0952951b27a325863a7"}},{"ruleId":"D2","level":"warning","message":{"text":"Core.CVDMBF (cognitive 19): Core.CVDMBF has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Core.vb"},"region":{"startLine":750}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a50b7d12b9f86ca82a29ae5abd4b40c964e67df13df96e32cde88e5f855f527"}},{"ruleId":"D2","level":"warning","message":{"text":"Devices.CVS (cognitive 19): Devices.CVS has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Devices.CVD) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Devices.vb"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9c3d710038d50c34410c147bad2fc28d200e511eae4b32316c804341c6b0dda"}},{"ruleId":"D2","level":"warning","message":{"text":"Devices.CVD (cognitive 19): Devices.CVD has cognitive complexity 19 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function. This shape REPEATS in the file: one other method here (Devices.CVS) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Devices.vb"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8571cc1349c043bf128c55f36fce114112371bf5daebc7948e6538a9c033b6b"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteExponentation (cognitive 18): Interactive.ExecuteExponentation has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":3166}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ac6b1c09eebef4a98e7b609801719de6c04a9106fd68a0bd16d8a305198fa24"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.InternalPut (cognitive 18): Interactive.InternalPut has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":17468}}}],"partialFingerprints":{"codehealthFindingId/v1":"40f7c7a9615d54e3f512f18c59d8371cd40e97e055a1e56dfe22998c5a4b64df"}},{"ruleId":"D2","level":"warning","message":{"text":"Form.OnDraw (cognitive 18): Form.OnDraw has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/Form.vb"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"25d51cc4fc14329d5f09667c77e12629ed86a7c79fefa12d91eefda6efe952a5"}},{"ruleId":"D2","level":"warning","message":{"text":"HorizontalListboxControl.OnDraw (cognitive 18): HorizontalListboxControl.OnDraw has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/HorizontalListBoxControl.vb"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"260c430b9c44d2ac20ca02c3a589dc4535706c1eea20e176daee603e0829b2ea"}},{"ruleId":"D2","level":"warning","message":{"text":"WindowsFileSystem.EnforceActualPath (cognitive 18): WindowsFileSystem.EnforceActualPath has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/WindowsFileSystem.vb"},"region":{"startLine":876}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5046d2e9d70b790c5a4e1c7e8a9168ae2f513e63bc60421fd43ead6cd498ca3"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindEraseStatement (cognitive 18): Binder.BindEraseStatement has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2905}}}],"partialFingerprints":{"codehealthFindingId/v1":"609442ca34aae1dbea95b480e869f6ef733797b0d083cdcd30c3e543ad539d1a"}},{"ruleId":"D2","level":"warning","message":{"text":"JsEmitter.EmitBinaryExpression (cognitive 18): JsEmitter.EmitBinaryExpression has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0da511cc9f1704f440cc29c6e916f0e9d4fd2cbaa5f0bb4cb25c7434d79232e"}},{"ruleId":"D2","level":"warning","message":{"text":"MsilEmitter.Emit_ResolveMethod (cognitive 18): MsilEmitter.Emit_ResolveMethod has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/MsilEmitter.vb"},"region":{"startLine":651}}}],"partialFingerprints":{"codehealthFindingId/v1":"90da2220fdaf677a430c8b72f3f79dc33813d66a0d5b969cef64e23cc814ac53"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.Evaluate (cognitive 18): Evaluator.Evaluate has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"b74cd8de137bc7a315b7fbab2db7a1207f30514a103d131d8ef7233f82b31b07"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateRedimStatement (cognitive 18): Evaluator.EvaluateRedimStatement has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3347}}}],"partialFingerprints":{"codehealthFindingId/v1":"85c13258178545b980737af0532aef377bbd01cc26a2fa57d3fee3887f9d70d5"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluatePrintFileStatement (cognitive 18): Evaluator.EvaluatePrintFileStatement has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":5377}}}],"partialFingerprints":{"codehealthFindingId/v1":"01f2f59ff90087e6b5f7cc34de8667cdc11ba451c7d365c7d13d7c27bbcdadbf"}},{"ruleId":"D2","level":"warning","message":{"text":"Core.CVSMBF (cognitive 18): Core.CVSMBF has cognitive complexity 18 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Core.vb"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"84ba3bf17f5b3b829e8b780ec956c44e9b21ea13f798ee5032386d9b5e684d3c"}},{"ruleId":"D2","level":"warning","message":{"text":"Display.CheckPointBoundary (cognitive 17): Display.CheckPointBoundary has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1795}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d438a040842b5ddbd75332a7a3586fa0cb7a7931a60ba2fe2e9c8e45266f304"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.PrepareData (cognitive 17): Interactive.PrepareData has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":14912}}}],"partialFingerprints":{"codehealthFindingId/v1":"66ab408f555c5a8e64e994ca0b2c24d2e7af146b37823c265b9662002beaee48"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecuteViewPrint (cognitive 17): Interactive.ExecuteViewPrint has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15967}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbcd2e1ad58628b2987da111c0e4cd4b872454f8af74c7a3fe6dd72356d78365"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.InternalProcessText (cognitive 17): Interactive.InternalProcessText has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":18676}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a59312e6bd43f8a5cd7bbd3936e10ba3ed3ef5068b32d5d9f2e05434b51dbab"}},{"ruleId":"D2","level":"warning","message":{"text":"Common.QInstrB (cognitive 17): Common.QInstrB has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Common.vb"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"e905eb665ea1b58a687e49b0947a225e8ad6cd3533a88a5b1bc2082859e58cd2"}},{"ruleId":"D2","level":"warning","message":{"text":"DocumentPanel.RemoveBlock (cognitive 17): DocumentPanel.RemoveBlock has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"86143d800c3e3b9d96f6a2f19b3449ac727d847d2d1f646392f24a6d4d361a1b"}},{"ruleId":"D2","level":"warning","message":{"text":"MsilEmitter.EmitBinaryExpression (cognitive 17): MsilEmitter.EmitBinaryExpression has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/MsilEmitter.vb"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ca760e227b3fbe25e97cec5ed083b66321860a33be34923a17324d68d66ea99"}},{"ruleId":"D2","level":"warning","message":{"text":"VbEmitter.EmitBinaryExpression (cognitive 17): VbEmitter.EmitBinaryExpression has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f1b9a509c63de52c7234b641e4cd6ff8df3c16ec146b7f1bcc193cb79810981"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateGetFileStatement (cognitive 17): Evaluator.EvaluateGetFileStatement has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":5474}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f3534058c04a63f0cf6d55d866e5099a184df48fee6ca5abef5dcdc3f48e994"}},{"ruleId":"D2","level":"warning","message":{"text":"Lowerer.RewriteIfStatement (cognitive 17): Lowerer.RewriteIfStatement has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Lowering/Lowerer.vb"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee315a28dd8e8a16a93546d49a05666ed2f98c6e2b5b104c8b8b21d22db93754"}},{"ruleId":"D2","level":"warning","message":{"text":"Lexer.ReadTrivia (cognitive 17): Lexer.ReadTrivia has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b7ba5198836e4382136adf06d22b5e7fa440c2244741bb051fa5edb058a49b3"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.ParseInputStatement (cognitive 17): Parser.ParseInputStatement has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":2067}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4dc2230ceadc58c85a990cf486dd48b9536c9e9e11a0cafaf78b9eeee0dc009"}},{"ruleId":"D2","level":"warning","message":{"text":"QBasicToVbNetRewriter.AnalyzeCompilationUnit (cognitive 17): QBasicToVbNetRewriter.AnalyzeCompilationUnit has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/QBasicToVbNetRewriter.vb"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"df06ea6b347bd4ee4ff88dc9c2218b0f64b06bb5585983a95a621f418709544f"}},{"ruleId":"D2","level":"warning","message":{"text":"QBasicToVbNetRewriter.ConvertPrintNodesToConsoleCalls (cognitive 17): QBasicToVbNetRewriter.ConvertPrintNodesToConsoleCalls has cognitive complexity 17 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/QBasicToVbNetRewriter.vb"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d21cc0596df2eb52de6bffd1c80165cf22693546cb192aa0135a81f2a5422f"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.CheckLoopStacksBeforeReturn (cognitive 16): Interactive.CheckLoopStacksBeforeReturn has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":9413}}}],"partialFingerprints":{"codehealthFindingId/v1":"03b9eb3c1dc425280b13ca7335f788742f70ea64ca1e3aa9223b1681326a08ae"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.GetLabelList (cognitive 16): Interactive.GetLabelList has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11665}}}],"partialFingerprints":{"codehealthFindingId/v1":"869658b40eaf6fae8f6e655a0cd57311b24c90e34723b7601443d75ace6afae1"}},{"ruleId":"D2","level":"warning","message":{"text":"Interactive.ExecutePalette (cognitive 16): Interactive.ExecutePalette has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12098}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9cff8e81e7296dfb92c546ea7bcc4c3fd8457e7be6ea63bbd73c2a7628943a1"}},{"ruleId":"D2","level":"warning","message":{"text":"WindowsFileSystem.Write (cognitive 16): WindowsFileSystem.Write has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/WindowsFileSystem.vb"},"region":{"startLine":814}}}],"partialFingerprints":{"codehealthFindingId/v1":"d11975216b97af314cbcfaad6a56c10b2757ce4296a0d9da0598d0fc70da6b08"}},{"ruleId":"D2","level":"warning","message":{"text":"Program.HandleRoundtripMode (cognitive 16): Program.HandleRoundtripMode has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"bccc91d3068b15c5a3ff5466c45afe85f5d7ea51c0ea3f5198b3d0cdb8193d02"}},{"ruleId":"D2","level":"warning","message":{"text":"Binder.BindDefDeclaration (cognitive 16): Binder.BindDefDeclaration has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"49f38038a9b45977dcc9e8d9d8ad118d9fcf45cb0be5b393950cd676e3bcc942"}},{"ruleId":"D2","level":"warning","message":{"text":"ControlFlowGraph.CountFunctionNameAssignments (cognitive 16): ControlFlowGraph.CountFunctionNameAssignments has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ControlFlowGraph.vb"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"801602af4ebd17f786fa2660a9198373ff7c598156f7635dd80d68ecc018f7d5"}},{"ruleId":"D2","level":"warning","message":{"text":"Compilation.GetSymbols (cognitive 16): Compilation.GetSymbols has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Compilation.vb"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"83a18905b63185218f151a08875934c7c551043d6fc0b0e4880f34ab094b9e5f"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.EvaluateForStatement (cognitive 16): Evaluator.EvaluateForStatement has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1352}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e4e8625e31725c5fc871213c2c42c452d4436ca31b5dd4b5ab2f6f141cfb61a"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser.ParseIfStatement (cognitive 16): Parser.ParseIfStatement has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":1937}}}],"partialFingerprints":{"codehealthFindingId/v1":"94466497ba0e0aac640899db14ab160e90a1ce42f51b2c06df6e11b38a29158d"}},{"ruleId":"D2","level":"warning","message":{"text":"Interpreter.Run (cognitive 16): Interpreter.Run has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/Interpreter.vb"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8e8b7f6bb4c6f9904a61acb988cc5d356a2b5c334f0627f5f299b31fa67477e"}},{"ruleId":"D2","level":"warning","message":{"text":"WindowsAudio.GenerateBuffer (cognitive 16): WindowsAudio.GenerateBuffer has cognitive complexity 16 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/WindowsAudio.vb"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"882d1df6d5e93bbab223a1b75b05ec72db510c9c7b4dd527ae089a190f38c619"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Interactive/Interactive.vb: FileTooLong \u2014 10678 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 10178 over it, 21.36\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b585f72b505b512853c17a9dfa1618698580c070a2620a013844606796ea188"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: CodeAnalysis/Evaluator.vb: FileTooLong \u2014 4845 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 4345 over it, 9.69\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6901c09237072db3945ebe2a7b5fada6df481898fe028a634496da9eaf65925b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: QBasic.OnUserUpdate: MethodTooLong \u2014 OnUserUpdate runs 771 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 671 over it, 7.71\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1176}}}],"partialFingerprints":{"codehealthFindingId/v1":"1329acbd741869581a9507f2e8392967fdeb5c9df2400141853211e4d79ba55b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Interactive: TooManyMethods \u2014 10675 significant lines (blank, comment-only and punctuation-only lines excluded), 212 methods. The bar is 30 methods; this is 182 over it, 7.07\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"152395910bbab1b752300bb9aeb596437822864036115aabe9308d3f4eef5152"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Evaluator.EvaluateStatement: MethodTooLong \u2014 EvaluateStatement runs 703 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 603 over it, 7.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":510}}}],"partialFingerprints":{"codehealthFindingId/v1":"77cecc9fa03abd69fd0867c261f59e0bb6d2aac2789740eb59e5178d183abf2c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Syntax/Parser.vb: FileTooLong \u2014 3177 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2677 over it, 6.35\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"117f315ebad02921df88591e55196042e77d5cf70ba9bbf47463b922051c8d10"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Display/Display.vb: FileTooLong \u2014 3075 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2575 over it, 6.15\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af6070f24304d98347dc45c4c746dda05dd290a0b0ccd08ddf9526b18b28c1cd"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Parser: TooManyMethods \u2014 3172 significant lines (blank, comment-only and punctuation-only lines excluded), 178 methods. The bar is 30 methods; this is 148 over it, 5.93\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c29eee9cf41b9e7a218137fb421f6b5fd90339e7225915bc91ba42c93258abaa"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Evaluator.EvaluateCallExpression: MethodTooLong \u2014 EvaluateCallExpression runs 587 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 487 over it, 5.87\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":4192}}}],"partialFingerprints":{"codehealthFindingId/v1":"db4c3f47ad0658fa7c72eaff185c864f141e315727eaad18dd04cb62f0d6c7c4"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecutePrimary: MethodTooLong \u2014 ExecutePrimary runs 549 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 449 over it, 5.49\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":3199}}}],"partialFingerprints":{"codehealthFindingId/v1":"69d02e647cdb8db059adaeba3277b7cd9b3b5aaf4c2909ffbeb9cfc3dd4d983f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Binding/Binder.vb: FileTooLong \u2014 2646 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2146 over it, 5.29\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e353660e0bb3b39e5f443be6fc0090af51e90a964b33a3dcc7415ee577b5e4c6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Binder: TooManyMethods \u2014 2637 significant lines (blank, comment-only and punctuation-only lines excluded), 154 methods. The bar is 30 methods; this is 124 over it, 5.13\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"552a50d2d5302d650817453223c660ab08fc59883409145d3939246db6ac724d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: qbasic/Program.vb: FileTooLong \u2014 2381 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1881 over it, 4.76\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"951474c67d728451a9a5201e6017a110e01c10e6f7c8276f8f72880d0a868b13"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Evaluator: TooManyMethods \u2014 4820 significant lines (blank, comment-only and punctuation-only lines excluded), 136 methods. The bar is 30 methods; this is 106 over it, 4.53\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc5387bf308294946e3f95b7625eee19a90fca02f182e20dfaf180798594f4dd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: QBLib/Video.vb: FileTooLong \u2014 1880 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1380 over it, 3.76\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac81c026a9c1f06a74311b198839fed0aa15f60d9aedbffe500296c7f84fcb34"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecutePut: MethodTooLong \u2014 ExecutePut runs 360 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 260 over it, 3.60\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":13632}}}],"partialFingerprints":{"codehealthFindingId/v1":"af4ef36e1661e459991c6cb0403a8d329af078b7f8af279922c1350f062ccf2a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Parser.PeekToken: MethodTooLong \u2014 PeekToken runs 342 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 242 over it, 3.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce558ca897c25754a98ed2fb2a23329c4d3538bf954d90113749dc010ebb3d9f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecuteGet: MethodTooLong \u2014 ExecuteGet runs 335 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 235 over it, 3.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8515}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0f30778b53a2c4e9fbdffaa4198db2ca04e17b77d0ed1beecddb769b1523aaf"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecuteStringPrimary: MethodTooLong \u2014 ExecuteStringPrimary runs 322 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 222 over it, 3.22\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2308}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cdbfde6b27212ddc765951ce17f9f1fa6d4a8c7b10c92e8e7e5dac33a11db1b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: qbasic.compatibility/Video.vb: FileTooLong \u2014 1470 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 970 over it, 2.94\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"03c8db259d706b376abb2c69d4324404c54dbca5fe0f022a20a78418f238ac1b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecutePrintUsing: MethodTooLong \u2014 ExecutePrintUsing runs 290 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 190 over it, 2.90\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12698}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0009d0d6f9c4791e13c019b31e2f9d6ea34196acf20c3b75c7bb812c1978315"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecutePrint: MethodTooLong \u2014 ExecutePrint runs 268 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 168 over it, 2.68\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12312}}}],"partialFingerprints":{"codehealthFindingId/v1":"9490302513d525385a9d2cf25a357d0ac5a3295c2b69740fe6de90b6b30090a3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Evaluator.EvaluateBinaryExpression: MethodTooLong \u2014 EvaluateBinaryExpression runs 268 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 168 over it, 2.68\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3872}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a666bbd5c1eef664f90674f9f9a1f046ed6cd5e01bc4e1d56dd3152c15f0bb5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: QBasic: TooManyMethods \u2014 1868 significant lines (blank, comment-only and punctuation-only lines excluded), 79 methods. The bar is 30 methods; this is 49 over it, 2.63\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4e0c06490cb0ecdc30809e4db373eacf256c6caa7adad15a0091ff619254da5"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Display.InternalPage.InitializeVgaPalette: MethodTooLong \u2014 InitializeVgaPalette runs 258 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 158 over it, 2.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":830}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4d26923fa3e2a752969886397a27ba11bbbfddfe7c841ec3401d81fbd2b9afb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ConstantFolding.Fold: MethodTooLong \u2014 Fold runs 256 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 156 over it, 2.56\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ConstantFolding.vb"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"d45008e983ed0a77de6de7b2c3edd69d18be6934a936646d1a68dd2cdaf9a7b0"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Display: TooManyMethods \u2014 3073 significant lines (blank, comment-only and punctuation-only lines excluded), 75 methods. The bar is 30 methods; this is 45 over it, 2.50\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"42b9e8d0b2cd8ae2f5685c5c86138bb7435ec63cabcc691db599550a331a1d6a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.InteractiveProcessKey: MethodTooLong \u2014 InteractiveProcessKey runs 249 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 149 over it, 2.49\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1119}}}],"partialFingerprints":{"codehealthFindingId/v1":"3655aa7a62337675c1cc3a994520d5e32c74a1f9d500ec8bee961bb199a1c6e6"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Display.InternalPage.SetPalette: MethodTooLong \u2014 SetPalette runs 243 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 143 over it, 2.43\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ebd6dfe69664338beeb3f22fedcee9d96155150c626b84ef71a66d521911c6b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Display.InternalPage: ClassTooLong \u2014 954 significant lines (blank, comment-only and punctuation-only lines excluded), 7 methods. The bar is 400 significant lines; this is 554 over it, 2.39\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"981e76cd7d1a105ccdf3b788e6f8bca23be2da80d7b5003b0f83f9d57bc34810"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: JsEmitter.Emit: MethodTooLong \u2014 Emit runs 238 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 138 over it, 2.38\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"a91d59ae731e152b1050b8c3d5885b47f7e0f3277604cbb4c6c0599b5c7f90b9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ProcessKeyInternal: MethodTooLong \u2014 ProcessKeyInternal runs 207 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 107 over it, 2.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3044970fcb928271e48524cc88a11ff49c06f6f646f8578ce173757bef78118"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecuteDraw: MethodTooLong \u2014 ExecuteDraw runs 202 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 102 over it, 2.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":18064}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ab633b35f7fab05787b87f0f8af53e9a0b2630d9d6bcf559b5ebc1e08a0c966"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SyntaxFacts.GetText: MethodTooLong \u2014 GetText runs 200 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 100 over it, 2.00\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxFacts.vb"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"6716fb856127ad8a615cb04ed3ec320ef32a38b4c284a51f9109f6d7540666d8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: qbasic/DocumentPanel.vb: FileTooLong \u2014 991 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 491 over it, 1.98\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4460093aff46ccaa72889386f5dcb01b889ce91096897c82aa181d906f2a976a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.InternalProcessText: MethodTooLong \u2014 InternalProcessText runs 197 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 97 over it, 1.97\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":18676}}}],"partialFingerprints":{"codehealthFindingId/v1":"399936f1132a3d22e50a27e894fa964159a98d85b3f9d3341b3ca2f30f820a73"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Evaluator.PlayCommand: MethodTooLong \u2014 PlayCommand runs 197 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 97 over it, 1.97\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":5804}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0563664aa875d8564db42c5ceb1aaaf6808875991d9678aeea5ad214d55ae7b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CharMap: ClassTooLong \u2014 782 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 382 over it, 1.96\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/CharMap.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"383b985ececc853d818cc74da311aaf0da59fe4b0be2987f60fed5eb66fce088"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Display.Screen: MethodTooLong \u2014 Screen runs 195 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 95 over it, 1.95\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2752}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aec8a847fac08fed316571165beeb2b31beaccd2848315912c1ff54bed3a801"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DiagnosticBag: TooManyMethods \u2014 223 significant lines (blank, comment-only and punctuation-only lines excluded), 58 methods. The bar is 30 methods; this is 28 over it, 1.93\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/DiagnosticBag.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f6df1be6adb164492dc4c459d0545dc7cf236682e441ebf576f1905207fbaed"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Display.InternalPage.SetPalette: MethodTooLong \u2014 SetPalette runs 193 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 93 over it, 1.93\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"c61790e295bc946e2dc2fb982e82af0f9b6b19881833566f6bf0d8b45813e6d0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BoundBinaryOperator.Initialize: MethodTooLong \u2014 Initialize runs 187 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 87 over it, 1.87\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundBinaryOperator.vb"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"73980f93d769c7a9a5485b4a9f7e804da592b78fd2bf8fc11782fae444d5adcc"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SyntaxFacts.GetKeywordKind: MethodTooLong \u2014 GetKeywordKind runs 180 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 80 over it, 1.80\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxFacts.vb"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ab9e5ba2826b5cfd72aaff68db483bdd1668baf032d298441a7322f3e716bdb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.InternalInputCompletedProcess: MethodTooLong \u2014 InternalInputCompletedProcess runs 175 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 75 over it, 1.75\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":17020}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e74a2b402bbf01d2a8b1d7e42ce463247704a51330ef9217800c953a14cea8d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Program.HandleCommandLineArguments: MethodTooLong \u2014 HandleCommandLineArguments runs 175 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 75 over it, 1.75\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"49e307e2ab7ed054a87c90c51c4a8c033516c3e582e5ce9d5cd39b5c5a6fe169"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Lexer.ReadIdentifierOrKeyword: MethodTooLong \u2014 ReadIdentifierOrKeyword runs 171 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 71 over it, 1.71\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"4513ef131f937800f644e47bd025ba8e1e94d128882fcf236e079ddf5647d10e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Common: TooManyMethods \u2014 535 significant lines (blank, comment-only and punctuation-only lines excluded), 51 methods. The bar is 30 methods; this is 21 over it, 1.70\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Common.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"04f2f0ab639680fbe3b8338b9cc9780018eac6f588ec8f2b7c0c5abb53d8304a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Core.QBAsc: MethodTooLong \u2014 QBAsc runs 169 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 69 over it, 1.69\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Core.vb"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d2a0c7511795ca4058ea03525b006a16c01cfb7db58c8f4e35734bd9beaac5"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Core.QBChr: MethodTooLong \u2014 QBChr runs 168 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 68 over it, 1.68\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Core.vb"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d5ad4ffe09369a289b2838a7a778be5422a4615ff5686026b7d0e61d8b7a9a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Core.QBChr: MethodTooLong \u2014 QBChr runs 168 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 68 over it, 1.68\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Core.vb"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"21e713c02d90a93dcc031a98a4fa24308085be3e0f94895c81ace8e91487da96"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecuteOpen: MethodTooLong \u2014 ExecuteOpen runs 167 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 67 over it, 1.67\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11697}}}],"partialFingerprints":{"codehealthFindingId/v1":"dccabafee58bd4c5936682a2ca5dfdb1a0365a7f6d672efd19b28a804d10cd07"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Video: TooManyMethods \u2014 1456 significant lines (blank, comment-only and punctuation-only lines excluded), 48 methods. The bar is 30 methods; this is 18 over it, 1.60\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8664d8213c30167669289cf032475390e3c86fa4b1ada72a7539e7c6645811a5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Display/CharMap.vb: FileTooLong \u2014 784 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 284 over it, 1.57\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/CharMap.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1174f5a8a00841b8aafc64d9b831123263199db5728660c7ae0b98ee11aeddd1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Parser.ParseStatement: MethodTooLong \u2014 ParseStatement runs 153 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 53 over it, 1.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2d0efcb9806904a31c7a6d7ad7bc67502994d1df82c35e2f275b6f37eae46b7"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Parser: ClassTooLong \u2014 595 significant lines (blank, comment-only and punctuation-only lines excluded), 13 methods. The bar is 400 significant lines; this is 195 over it, 1.49\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd26a921187c0bbb9d888a95fd52c4c3d3b8e8921bc5037df67aeff5c9081ce6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DocumentPanel: TooManyMethods \u2014 988 significant lines (blank, comment-only and punctuation-only lines excluded), 44 methods. The bar is 30 methods; this is 14 over it, 1.47\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88c59af77e4269a638f2038919b1a3537545c018a1bfc365c7e39bd505ff59dc"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TextboxControl.OnKeyPress: MethodTooLong \u2014 OnKeyPress runs 145 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 45 over it, 1.45\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/TextBoxControl.vb"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"77352cc687e0d7f1160d0ab87fe4a98d4e0ace44bffc6d227deed09fcab069f1"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Video: TooManyMethods \u2014 1866 significant lines (blank, comment-only and punctuation-only lines excluded), 43 methods. The bar is 30 methods; this is 13 over it, 1.43\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9ae45f50059ca0caeaadcbbe36e036d61084dea4b1c4c77b6ee06080c082150"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Lexer: ClassTooLong \u2014 568 significant lines (blank, comment-only and punctuation-only lines excluded), 14 methods. The bar is 400 significant lines; this is 168 over it, 1.42\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b47757bb613ff88880da654d337f6efe9eb499d74000ab58877c7c3b14672557"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Evaluator.FormatNumericWithSpec: MethodTooLong \u2014 FormatNumericWithSpec runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2833}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7abf91d3c733364330078496a9873332c387f78dc94629d2a5c091e5630ce84"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Parser.ParseOnStatement: MethodTooLong \u2014 ParseOnStatement runs 138 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 38 over it, 1.38\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":2548}}}],"partialFingerprints":{"codehealthFindingId/v1":"44105bdf57348da3a6d7c1d6894a593e4fb281165292446886fdd18750de2c49"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.InternalLoadCompleted: MethodTooLong \u2014 InternalLoadCompleted runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6024}}}],"partialFingerprints":{"codehealthFindingId/v1":"b052219abf37635b145ef8701beefcefe3ce62f4cbab072d6ac6509d1d9cc0af"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Binder.BindGlobalScope: MethodTooLong \u2014 BindGlobalScope runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"828d57031ef63c4d613f98e65443a6375fa9864224dead9e8275a1cd6f690014"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Video.CIRCLE: MethodTooLong \u2014 CIRCLE runs 134 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 34 over it, 1.34\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1341}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3e372af33944fb76c22e1eee6f4b26226064b89f8f345b97fbb64743fd695ed"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Syntax/SyntaxKind.vb: FileTooLong \u2014 651 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 151 over it, 1.30\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Syntax/SyntaxKind.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3724df1f222352ae896503260769c6e8643ab1696b0eac3fd20d9cd6979e8b8d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: JsEmitter: ClassTooLong \u2014 518 significant lines (blank, comment-only and punctuation-only lines excluded), 24 methods. The bar is 400 significant lines; this is 118 over it, 1.30\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8565380f5515d6f442a61b8201c8295e43f6eb29a7a09b11c3a754fda1d4b872"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecuteStatement: MethodTooLong \u2014 ExecuteStatement runs 129 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 29 over it, 1.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":5173}}}],"partialFingerprints":{"codehealthFindingId/v1":"0149937544d05daac99516b58cc8901f1d6a5c2d4df0aab30f56e71626eaebf3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecuteWidth: MethodTooLong \u2014 ExecuteWidth runs 129 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 29 over it, 1.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16251}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa9d70e478b4ce23c28c53daa5470607f2a32a56328799a7ff0c076b2ff2248"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: QBasic.OnUserCreate: MethodTooLong \u2014 OnUserCreate runs 127 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 27 over it, 1.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fdde87c1fbe3cb3540c0d3fadc6acbc52be26204c40013e30ae5ab63eef565c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Video.CIRCLE: MethodTooLong \u2014 CIRCLE runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1080}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e6f262fa64ab5309d1764a61cb82d5c04896e70782238eb1d30d5b56b36a6ce"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecuteInput: MethodTooLong \u2014 ExecuteInput runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":9910}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e9bc662df7e8c7b5c6eaa3435ffce7406607d968241f0ff000cb887a96862f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Program: ClassTooLong \u2014 499 significant lines (blank, comment-only and punctuation-only lines excluded), 14 methods. The bar is 400 significant lines; this is 99 over it, 1.25\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66902599d11f29935ce8ae210e6e763da8b4964b26ef47eda06bcf940f9f99dd"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ProcessInterpreter: MethodTooLong \u2014 ProcessInterpreter runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1415}}}],"partialFingerprints":{"codehealthFindingId/v1":"d500c47ccd59c75ca894d7e89e8cd13644e892c01b1d1b193c0cce2c54e83fb9"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: QBasicToVbNetRewriter: TooManyMethods \u2014 413 significant lines (blank, comment-only and punctuation-only lines excluded), 37 methods. The bar is 30 methods; this is 7 over it, 1.23\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/QBasicToVbNetRewriter.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9e24d323977858f8ccdf562bb12da9b25a68870c0a490f863de615a0bbd6b4d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Display.Circle: MethodTooLong \u2014 Circle runs 122 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 22 over it, 1.22\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1919}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2c1d8f0274cfb6c755e61d2ad0958556af279cb23e40e7e392f8717f5ce0f40"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Binder.BindStatementInternal: MethodTooLong \u2014 BindStatementInternal runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":653}}}],"partialFingerprints":{"codehealthFindingId/v1":"997373dac88a4a49531c505dd5207ee418a69c45400953b297b6a2f339140c5c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: WindowsAudio: TooManyMethods \u2014 472 significant lines (blank, comment-only and punctuation-only lines excluded), 36 methods. The bar is 30 methods; this is 6 over it, 1.20\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/WindowsAudio.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"337acb471407ac651dfe13e9e7f0c1c9aee41e73758b498f11bdf9e8b758d6bd"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BoundNodePrinter: TooManyMethods \u2014 372 significant lines (blank, comment-only and punctuation-only lines excluded), 36 methods. The bar is 30 methods; this is 6 over it, 1.20\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundNodePrinter.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"06f0443b63942eb3bb6d870276c567fe6cd42a9748f31af0f17e7d757d6f962a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Parser/Parser.vb: FileTooLong \u2014 597 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 97 over it, 1.19\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"51dedd7099dc483195a8d3a955c5b32c8be9807156338923f2d32766d00d632a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Binder.BindCallExpression: MethodTooLong \u2014 BindCallExpression runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":900}}}],"partialFingerprints":{"codehealthFindingId/v1":"904a5eaec84e15be693d242948e9c0365bed1b77e38174e3b140a72e767ebeb8"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AudioDevice: TooManyMethods \u2014 351 significant lines (blank, comment-only and punctuation-only lines excluded), 35 methods. The bar is 30 methods; this is 5 over it, 1.17\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/AudioDevice.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b67a9c9342d0f098b22d7c5e5c598aafe46ecbfa0dc65089f443862296342391"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Syntax/Lexer.vb: FileTooLong \u2014 574 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 74 over it, 1.15\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"abb4b72b9c545dadda827e41aba1c7926e940a2d068d5a1f28db2e561d0a967f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SyntaxFacts: ClassTooLong \u2014 456 significant lines (blank, comment-only and punctuation-only lines excluded), 10 methods. The bar is 400 significant lines; this is 56 over it, 1.14\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxFacts.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"49ed481b69ed7900e45973ec00d139d71d84fa5562fbf38999efacbabd74846c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MainMenu.ProcessKeys: MethodTooLong \u2014 ProcessKeys runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 14 over it, 1.14\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/MainMenu.vb"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f57605ff2d17fcf1bf0aa50fa77b40231c7c0ff401f994c2e83f8c34f10b80a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: KeyEventArgs: ClassTooLong \u2014 450 significant lines (blank, comment-only and punctuation-only lines excluded), 8 methods. The bar is 400 significant lines; this is 50 over it, 1.13\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Input/KeyEventArgs.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e1acd0caeb837ece84011a08a972a953cf3084e15c60b275436631a9fe94e24"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: KeyEventArgs.ToKeyScanCode: MethodTooLong \u2014 ToKeyScanCode runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Input/KeyEventArgs.vb"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"21515454e05ae056bd3797b79e53333668147db1032484abadc48dd1103429ef"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: KeyEventArgs.ToKey: MethodTooLong \u2014 ToKey runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Input/KeyEventArgs.vb"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"13d69d01ec7fcb3d40033642dc85eb3a229fc5d570e5feeb9126ae1fb650fc5b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Video.LINE: MethodTooLong \u2014 LINE runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1611}}}],"partialFingerprints":{"codehealthFindingId/v1":"99157bcbfd64987e7feeb1dcaca297b15bcd418824ca70fafaedb9effbd02ef5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MsilEmitter: TooManyMethods \u2014 535 significant lines (blank, comment-only and punctuation-only lines excluded), 33 methods. The bar is 30 methods; this is 3 over it, 1.10\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/MsilEmitter.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bd621d9000b03c1a968fdbe5b20de40fa791cf58a752cbc77110bf2da44d4c6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: qbasic/Common.vb: FileTooLong \u2014 547 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 47 over it, 1.09\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Common.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c638bdd76132e9c5003434adf170c2590c21d5c96a4f9e0e16c32b25775763de"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Emit/MsilEmitter.vb: FileTooLong \u2014 546 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 46 over it, 1.09\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/MsilEmitter.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dce38cb6d289362055bbd499dde245a1df8db3f85475846846060cb2a1dc6e2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: KeyEventArgs.ToKey: MethodTooLong \u2014 ToKey runs 109 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 9 over it, 1.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Input/KeyEventArgs.vb"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcd19192fc212f6dd1f09942a0beb5f8ab7e00af449966bf2b5b9c6be4f56e59"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Display.Color: MethodTooLong \u2014 Color runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":3982}}}],"partialFingerprints":{"codehealthFindingId/v1":"4da05d66a9aa1ee87ed276bfe29cf4dad98518552ecfe195d36f3cf3fe776d34"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: QBLib/Core.vb: FileTooLong \u2014 539 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 39 over it, 1.08\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Core.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cacc1b29a513deea2336b8def6b98e9159dbc9e92f4d775917fdd8000cc42579"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Parser.ParseForStatement: MethodTooLong \u2014 ParseForStatement runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":1537}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b78ea97ceb90ea93ffd8b8d71b5693cf75a380e289e04b09e7d29855fdf21a6"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Video.SCREEN: MethodTooLong \u2014 SCREEN runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":984}}}],"partialFingerprints":{"codehealthFindingId/v1":"77744e2ac888bb8ef11af3d68a85b4b9cb683f9a6e449ea002af0df6125e3188"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Core: ClassTooLong \u2014 423 significant lines (blank, comment-only and punctuation-only lines excluded), 20 methods. The bar is 400 significant lines; this is 23 over it, 1.06\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Core.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d49acc14cb357cd60b8953df1c03fddfc97232aa905fdb30cf2229c3ba178ce7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Emit/JsEmitter.vb: FileTooLong \u2014 525 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 25 over it, 1.05\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"564ff0b2d4a0ad2097b4f59742bc4008ba667a7e088a492912b7c157c9021f22"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecuteLineInput: MethodTooLong \u2014 ExecuteLineInput runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 5 over it, 1.05\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10668}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a31f4ff973ce875b9099ea9d50e5f6cbd6c96ea5a886823306e6df83c1e011d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DocumentPanel.HandleSelection: MethodTooLong \u2014 HandleSelection runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 5 over it, 1.05\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7f987c7179df3febe5e695fec89d3a7b94c941a32a131df4c52f264cc7e9b5d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Core: TooManyMethods \u2014 537 significant lines (blank, comment-only and punctuation-only lines excluded), 31 methods. The bar is 30 methods; this is 1 over it, 1.03\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Core.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec863dc971ce2b5f997e27bdc59d97ac6c384350fe1b985ac3fef00e0a52fce7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Console: TooManyMethods \u2014 258 significant lines (blank, comment-only and punctuation-only lines excluded), 31 methods. The bar is 30 methods; this is 1 over it, 1.03\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Console.vb"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af0a3fb0c90666c93d55a5b4bb2814ac186a62a0241332e3636e2fdf9782fb98"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecuteLet: MethodTooLong \u2014 ExecuteLet runs 103 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10284}}}],"partialFingerprints":{"codehealthFindingId/v1":"a24238f4038df1e6e490d119c79f2f4cd99aa87f99c81387ece12bf70a53d608"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.FormatNumber: MethodTooLong \u2014 FormatNumber runs 102 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2 over it, 1.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":13076}}}],"partialFingerprints":{"codehealthFindingId/v1":"28f028313282bc24a12525e64f2afbeb9a4eb33d49f0d5cc2e5b4909d22ffdc2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Interactive.ExecuteScreen: MethodTooLong \u2014 ExecuteScreen runs 102 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2 over it, 1.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15053}}}],"partialFingerprints":{"codehealthFindingId/v1":"7daf02a91db968af7bb6920c4537d56758f1097b922f653e60ef25d08f263d25"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: OpenDialog.ProcessKeys: MethodTooLong \u2014 ProcessKeys runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/OpenDialog.vb"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4eadaa7cce86dd7d73f7f84d398fcd29e7fe7b4106505b7653d9fb49a183d11"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (88 shared lines): src/qbasic/Basic/Interactive/Interactive.vb:7922-8015 | src/qbasic/Basic/Interactive/Interactive.vb:8021-8116 \u2014 These two members are variants of one another: 88 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7922}}}],"partialFingerprints":{"codehealthFindingId/v1":"17a0782733c4c4dc40e55a165d0fe50566b994d8d7f08eceacf60c2cb15e3204"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (92 corresponding lines): src/qbasic/QB/CodeAnalysis/Evaluator.vb:3633-3729 | src/qbasic/QB/CodeAnalysis/Evaluator.vb:3733-3836 \u2014 These two members are one piece of code written twice and then edited apart: 92 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3633}}}],"partialFingerprints":{"codehealthFindingId/v1":"25ff64c324436d069b7820239d5da544fa9feb94f62f62a92778a7cf34142af5"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (35 corresponding lines): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:468-502 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:508-544 \u2014 These two members are one piece of code written twice and then edited apart: 35 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ad8c59cb34175d4c36fe7e0e52d6ad629932f72c35062acc92c41f803173df0"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (16 corresponding lines): src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb:463-481 | src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb:360-384 \u2014 These two members are one piece of code written twice and then edited apart: 16 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5c143e29548bfe21298b009f1ee7a0759fe54597b87b12367495162df4eaefe"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (14 members, 50\u002B identical tokens): src/qbasic/AboutDialog.vb:66-96 | src/qbasic/ChangeDialog.vb:99-129 | src/qbasic/DisplayDialog.vb:152-182 | src/qbasic/FindDialog.vb:83-113 | src/qbasic/HelpPathDialog.vb:70-100 | src/qbasic/MessageDialog.vb:62-90 | src/qbasic/NewFunctionDialog.vb:78-108 | src/qbasic/NewSubDialog.vb:78-108 | src/qbasic/OpenDialog.vb:152-251 | src/qbasic/PrintDialog.vb:88-118 | src/qbasic/SaveAsDialog.vb:139-212 | src/qbasic/SavePrompt.vb:73-114 | src/qbasic/SubsDialog.vb:100-130 | src/qbasic/WelcomeDialog.vb:71-101 \u2014 These 14 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 14 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 14 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/AboutDialog.vb"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"d85df62b58a75cf2089f982175702365aacb98f6ce29048379703e52d09c24e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (6 members, 50\u002B identical tokens): src/qbasic/NewFunctionDialog.vb:24-58 | src/qbasic/NewSubDialog.vb:24-58 | src/qbasic/OpenDialog.vb:40-121 | src/qbasic/PrintDialog.vb:26-70 | src/qbasic/SaveAsDialog.vb:39-106 | src/qbasic/SubsDialog.vb:26-77 \u2014 These 6 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 6 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 6 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/NewFunctionDialog.vb"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a66c47c05898c5a147fb339e4dca2d0f1969db62308218a3f0cf9f7f76db59b"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): src/qbasic/Basic/Parser/Dialect/Parser.Dialect.AmigaBasic.vb:110-127 | src/qbasic/Basic/Parser/Dialect/Parser.Dialect.GwBasic.vb:211-228 | src/qbasic/Basic/Parser/Dialect/Parser.Dialect.Hybrid.vb:133-150 | src/qbasic/Basic/Parser/Dialect/Parser.Dialect.Qbasic.vb:117-134 | src/qbasic/Basic/Parser/Dialect/Parser.Dialect.TinyBasic.vb:111-128 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Dialect/Parser.Dialect.AmigaBasic.vb"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"652df892c603fab0e6b2a4c861d81908683a14174b17c87946e0df4461ecbd56"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): src/qbasic/Basic/Display/Display.vb:1864-1881 | src/qbasic/Basic/Display/Display.vb:2233-2282 | src/qbasic/Basic/Display/Display.vb:2318-2343 | src/qbasic/Basic/Display/Display.vb:2349-2373 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1864}}}],"partialFingerprints":{"codehealthFindingId/v1":"b10fbd1670a49ecd033d5d3a6ec1936d5876e33cc69397fee3a9a613bc42a5a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): src/qbasic/Basic/Interactive/Interactive.vb:5665-5701 | src/qbasic/Basic/Interactive/Interactive.vb:10235-10280 | src/qbasic/Basic/Interactive/Interactive.vb:11186-11220 | src/qbasic/Basic/Interactive/Interactive.vb:14694-14731 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":5665}}}],"partialFingerprints":{"codehealthFindingId/v1":"6577d2d5ac6e143fe8ad9978fd6410bf1c0144677af282971d4d1b9dfe2a7c81"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): src/qbasic/Basic/Interactive/Interactive.vb:6256-6344 | src/qbasic/Basic/Interactive/Interactive.vb:8520-9163 | src/qbasic/Basic/Interactive/Interactive.vb:10429-10526 | src/qbasic/Basic/Interactive/Interactive.vb:11988-12094 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6256}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2b5a32d0bcb48990e1e31f4ac590f01fcbd6fbee2841e1392c66dff667fe5d9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (175 lines \u00D7 2): src/qbasic.compatibility/Core.vb:241-415 | src/qbasic/QBLib/Core.vb:236-410 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Core.vb"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"78ae8cac3af9cee8906e5343dfbaa0cb31c95ab5db8200a608bcd8dab1a90097"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (103 lines \u00D7 2): src/qbasic.compatibility/Video.vb:1471-1573 | src/qbasic.compatibility/Video.vb:1617-1719 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1471}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e0a99ea8060c02ede8474bd9cfda978a531ea9914a84eeb313d0899c8d233d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27\u201354 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:8865-8918 | src/qbasic/Basic/Interactive/Interactive.vb:8939-8965 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8865}}}],"partialFingerprints":{"codehealthFindingId/v1":"093715c657c41b09e1ae5ebdd1925bc3030edd3f247bed972b6a748ecee764e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (52\u201353 lines \u00D7 2): src/qbasic.compatibility/Console.vb:130-182 | src/qbasic/QBLib/Video.vb:2138-2189 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Console.vb"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"d65374e07795a95f57648794c686e3ebbd0aca2738baaff8ce8811a55e0e6fe5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201346 lines \u00D7 3): src/qbasic/Basic/Interactive/Interactive.vb:15185-15230 | src/qbasic/Basic/Interactive/Interactive.vb:15261-15269 | src/qbasic/Basic/Interactive/Interactive.vb:15410-15421 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15185}}}],"partialFingerprints":{"codehealthFindingId/v1":"460dd249dfebad23723b3a34b01f5c214eca9fbbf04c2ac9f06b91e412da26f6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (44 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:10615-10658 | src/qbasic/Basic/Interactive/Interactive.vb:15792-15835 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10615}}}],"partialFingerprints":{"codehealthFindingId/v1":"737948412416db91f15d88931f2d2ece70e025b9b053fbfdeb0a5e5a57ed1a64"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29\u201343 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1580-1608 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1617-1659 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1580}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d04f275e31bab9c4047876e78fb144237aaccb24de4b5045989dc0be8df5b62"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (42 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:7974-8015 | src/qbasic/Basic/Interactive/Interactive.vb:8075-8116 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/Basic/Interactive/Interactive.vb:8074\u0060 calls \u0060m_interpreter\u0060, \u0060Statements\u0060 and \u0060src/qbasic/Basic/Interactive/Interactive.vb:7973\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7974}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c4f69e32b3dbba788dd6a397e7e0ef905d00f79c8c5ca91b7bace28648f24df"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (38\u201340 lines \u00D7 2): src/qbasic.compatibility/Core.vb:55-94 | src/qbasic/QBLib/Core.vb:49-86 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Core.vb"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"360adfdfdc838cb4c75fbbdc8e3f515f58adc2a5cb94f448c96360da8b73d235"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2): src/qbasic.compatibility/Console.vb:94-132 | src/qbasic/QBLib/Video.vb:2099-2137 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Console.vb"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea574df39e6d87a3a83cda0c59f5760f4f7dea5e5a92b08499f9674fc5ac9e95"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (38 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:465-502 | src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:510-547 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b59a87268abd985b05b366fc0433f7da462e8d506959e87cb1da6d090411872"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (37 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:577-613 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:3295-3331 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":577}}}],"partialFingerprints":{"codehealthFindingId/v1":"88ab2192a2534a7558ab5cd57ae5231f71a70fe8889b00cca3480276fe92f91d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (35\u201336 lines \u00D7 2): src/qbasic/Program.vb:2310-2344 | src/qbasic/Program.vb:2372-2407 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":2310}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d70bc7877f5965ec5f284e4e256c7024b12aaf65e0c9ce587698e6e2fe2b585"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1724-1757 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1761-1794 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1724}}}],"partialFingerprints":{"codehealthFindingId/v1":"84d40841792303d09d20f31528fd753dbe6ca7d2f252fe141693853702af5e15"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 4): src/qbasic/Basic/Display/Display.vb:2825-2857 | src/qbasic/Basic/Display/Display.vb:2870-2902 | src/qbasic/Basic/Display/Display.vb:2915-2947 | src/qbasic/Basic/Display/Display.vb:2960-2992 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/Basic/Display/Display.vb:2955\u0060 calls \u0060lines\u0060 and \u0060src/qbasic/Basic/Display/Display.vb:2865\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2825}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6f66b2d625ad8a67a2a30591ff7862f066d420cd2e339169bbdf3080a551b9d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:12260-12292 | src/qbasic/Basic/Interactive/Interactive.vb:13580-13612 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12260}}}],"partialFingerprints":{"codehealthFindingId/v1":"14d355707542598f371a06185adb3b1ded2e2fd2f4845e476f6b09703184e912"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb:349-381 | src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb:244-276 \u2014 before extracting anything, compare \u0060src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb\u0060 and \u0060src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 92 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f0a81d18bada7083243567acc2d749f80781f6b8397ec62079bee461562d856"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Lowering/Lowerer.vb:231-262 | src/qbasic/QB/CodeAnalysis/Lowering/Lowerer.vb:299-330 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Lowering/Lowerer.vb"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"81e8c25658f9b3998635daf6844c12d11618e7cd0418bef77f0a7b20be9e7964"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 3): src/qbasic/Basic/Interactive/Interactive.vb:12808-12838 | src/qbasic/Basic/Interactive/Interactive.vb:12842-12872 | src/qbasic/Basic/Interactive/Interactive.vb:12873-12903 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12808}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c319ef2ba9723fcd1b12d045cd0218df9d6a8966e9fa0dfa84d0c096df0331f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:16154-16184 | src/qbasic/Basic/Interactive/Interactive.vb:16217-16247 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16154}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6cf268906ce90c341defcf6c9ce200651c6702837b4917df47f9639d6fae3b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2): src/qbasic/Program.vb:479-509 | src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb:420-450 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f5ff14dd5e09f454fc5bfe8c48212c24c997d95fa2e9ce9eb248385ba30b1ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:7922-7951 | src/qbasic/Basic/Interactive/Interactive.vb:8021-8050 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7922}}}],"partialFingerprints":{"codehealthFindingId/v1":"b14d413db33e7ef55cbf02f5fedca48977a263a4b5f0a2bd4b7330e3e361d4a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 8): src/qbasic/ChangeDialog.vb:101-129 | src/qbasic/DisplayDialog.vb:154-182 | src/qbasic/FindDialog.vb:85-113 | src/qbasic/HelpPathDialog.vb:72-100 | src/qbasic/NewFunctionDialog.vb:80-108 | src/qbasic/NewSubDialog.vb:80-108 | src/qbasic/PrintDialog.vb:90-118 | src/qbasic/SubsDialog.vb:102-130 \u2014 before extracting anything, compare \u0060src/qbasic/ChangeDialog.vb\u0060 and \u0060src/qbasic/DisplayDialog.vb\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 53 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/ChangeDialog.vb"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"6df324b9d4f6932996cadda9416774b72d1a51c1a9679498fd986127d1e917c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27\u201329 lines \u00D7 4): src/qbasic/Basic/Interactive/Interactive.vb:12808-12836 | src/qbasic/Basic/Interactive/Interactive.vb:12842-12870 | src/qbasic/Basic/Interactive/Interactive.vb:12873-12901 | src/qbasic/Basic/Interactive/Interactive.vb:12904-12930 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12808}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a327f75416f245a20a4bf8a064569ecdabaed2695ae5cc0f9400bd5b9adb804"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25\u201329 lines \u00D7 3): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1681-1709 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1727-1751 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1764-1788 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1681}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c9a24d399cf1bad02325b7faff903196b7d446102896d30671181498e6b1741"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (28 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:12400-12427 | src/qbasic/Basic/Interactive/Interactive.vb:12458-12485 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12400}}}],"partialFingerprints":{"codehealthFindingId/v1":"d509717904c9b465fe4338fcb3f81f595305bc372a1abbe37b6341997e86e74c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (28 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb:697-724 | src/qbasic/QB/CodeAnalysis/Emit/MsilEmitter.vb:566-593 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":697}}}],"partialFingerprints":{"codehealthFindingId/v1":"f57dfff032e51e41430c67f8fa3e40186139eb647b316455da5a1c541b198320"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 3): src/qbasic/Basic/Interactive/Interactive.vb:8865-8891 | src/qbasic/Basic/Interactive/Interactive.vb:8939-8965 | src/qbasic/Basic/Interactive/Interactive.vb:9028-9054 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8865}}}],"partialFingerprints":{"codehealthFindingId/v1":"3066c187183b0ca396dab96bb61977570a1bb2991502b2361aa22717e83af806"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23\u201326 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:18136-18161 | src/qbasic/Basic/Interactive/Interactive.vb:18176-18198 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":18136}}}],"partialFingerprints":{"codehealthFindingId/v1":"3299ebc64aacd0658f64c2af16be43c70eb6639fe7bd6d324ced696ae700f258"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201326 lines \u00D7 2): src/qbasic/Basic/VisualBasic/MKI.vb:69-94 | src/qbasic/QBLib/Core.vb:585-603 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/VisualBasic/MKI.vb"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a2dd5fd2d89b5dca2d61d5d08315278bc3f289460bf2bacb3d748a402d9b1bf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201326 lines \u00D7 2): src/qbasic/Basic/VisualBasic/MKI.vb:146-171 | src/qbasic/QBLib/Core.vb:773-791 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/VisualBasic/MKI.vb"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"b926aef09a2895b175dfb4a2a00d00262ce9c123246b9028ee13b748df4c0efb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Evaluator.vb:2334-2359 | src/qbasic/QB/CodeAnalysis/Evaluator.vb:2371-2396 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2334}}}],"partialFingerprints":{"codehealthFindingId/v1":"e08f85ec3cd571712414d8241a511b49ae8153540e5241785ab3359c9a11c208"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201325 lines \u00D7 3): src/qbasic/Basic/Display/Display.vb:303-327 | src/qbasic/Basic/Display/Display.vb:353-374 | src/qbasic/Basic/Display/Display.vb:394-415 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/Basic/Display/Display.vb:391\u0060 calls \u0060m_attributeEgaPalette\u0060 and \u0060src/qbasic/Basic/Display/Display.vb:351\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"253444b409a86515e028e80bbac6203a85375557eeef3a61354d44be7fe43854"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 3): src/qbasic/NewFunctionDialog.vb:34-58 | src/qbasic/NewSubDialog.vb:34-58 | src/qbasic/PrintDialog.vb:46-70 \u2014 before extracting anything, compare \u0060src/qbasic/NewFunctionDialog.vb\u0060 and \u0060src/qbasic/NewSubDialog.vb\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 116 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/NewFunctionDialog.vb"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6048eadf55fb90c45c6b3d9950cc80a4e7865ccd52a21c07478833f7d329f33"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): src/qbasic/Basic/Display/Display.vb:2650-2674 | src/qbasic/Basic/Display/Display.vb:2690-2714 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2650}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e6f97f8c46b29f6ec3841542e0457889cccbbc774e9a2eb8b7cf120b90a5dec"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:10254-10278 | src/qbasic/Basic/Interactive/Interactive.vb:16910-16934 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10254}}}],"partialFingerprints":{"codehealthFindingId/v1":"169ec0a59109cb1968df8135cd3a6222b3a2fd9c7e27d74389c1c632272bc760"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:10731-10755 | src/qbasic/Basic/Interactive/Interactive.vb:14118-14142 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10731}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b6051625003d422611adbe631e7d6e0e8f50f73adf9be5ac0f23e63eb5afd88"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:11002-11025 | src/qbasic/Basic/Interactive/Interactive.vb:14743-14766 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11002}}}],"partialFingerprints":{"codehealthFindingId/v1":"cedf8aad45d02f244d1c0cb2123eaf2504cf11641b4191ec6230b34c89e33a33"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:15066-15089 | src/qbasic/Basic/Interactive/Interactive.vb:15090-15113 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15066}}}],"partialFingerprints":{"codehealthFindingId/v1":"23563693600e1b8e8e9db08fd59259ac334d85bfb9095ecf59f9689c694b8d82"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:16127-16150 | src/qbasic/Basic/Interactive/Interactive.vb:16190-16213 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16127}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c1c0aa4ad007c6b30403dda3e8bd69ee06f04f0e823596aa40edc0c60123f87"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): src/qbasic/Basic/Tokenizer/Decode.vb:390-413 | src/qbasic/Basic/Tokenizer/Decode.vb:441-464 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/qbasic/Basic/Tokenizer/Decode.vb:441\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Tokenizer/Decode.vb"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"c073723158efdc80748d40aaffadce9473afe91234a3c43fa2c05a372cd18c9e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:1863-1886 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:3153-3176 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:1863\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":1863}}}],"partialFingerprints":{"codehealthFindingId/v1":"de9ab850b2002731371d34e1a0651170fdad2460247cda7446049a01bb70a750"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): src/qbasic/QBLib/Video.vb:1673-1696 | src/qbasic/QBLib/Video.vb:1700-1723 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1673}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a467fd1c62f076ef379238cba0410fdd9df1cd3128e6bf8a40e3203da8b485e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201323 lines \u00D7 3): src/qbasic/Basic/Display/Display.vb:2678-2700 | src/qbasic/Basic/Display/Display.vb:2706-2721 | src/qbasic/Basic/Display/Display.vb:2726-2741 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2678}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca86965d90ec3a834293a4b1191ade12f0d0325a8770cd82989e7059d61ea224"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:6494-6519 | src/qbasic/Basic/Interactive/Interactive.vb:15059-15081 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060src/qbasic/Basic/Interactive/Interactive.vb:6519\u0060 calls \u0060PeekToken\u0060 and \u0060src/qbasic/Basic/Interactive/Interactive.vb:15081\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6494}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cfccc56079d4b8991dbb960667646a751751f94f72aebb968b40746522bae6f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): src/qbasic/OpenDialog.vb:87-109 | src/qbasic/SaveAsDialog.vb:72-94 \u2014 before extracting anything, compare \u0060src/qbasic/OpenDialog.vb\u0060 and \u0060src/qbasic/SaveAsDialog.vb\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 95 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/SaveAsDialog.vb:71\u0060 calls \u0060SelectAll\u0060 and \u0060src/qbasic/OpenDialog.vb:86\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/OpenDialog.vb"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f35bcdbc56947f4911a2f10b93de379c731b3c15701e9ecd689bfbb7bae7c1a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): src/qbasic/Program.vb:2730-2752 | src/qbasic/Program.vb:2758-2780 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":2730}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e1def88290deb9b31a140d2f23fe5e09205e5e7e50bbd79377aaf93aa5ddacd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:2627-2649 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:2674-2696 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2627}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc7481e99dce3011325a82ebea869614c3171a9c32937cc9561272d14be3a50c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb:669-691 | src/qbasic/QB/CodeAnalysis/Emit/MsilEmitter.vb:538-560 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"8549d559e0aa55dc0e71478e2492ace505b4414c5221e6d98927e0db3ffa6c9a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 3): src/qbasic/Basic/Display/Display.vb:421-442 | src/qbasic/Basic/Display/Display.vb:446-467 | src/qbasic/Basic/Display/Display.vb:471-492 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060src/qbasic/Basic/Display/Display.vb:496\u0060 calls \u0060m_attributeEgaPalette\u0060 and \u0060src/qbasic/Basic/Display/Display.vb:443\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"d13f5c198087dc51eb0ddc3554d4e244d21afd5284fe5765cc07efc541d297ba"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201322 lines \u00D7 2): src/qbasic/Basic/Audio/SoundGenerator.vb:563-570 | src/qbasic/Basic/Audio/SoundGenerator.vb:579-600 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Audio/SoundGenerator.vb"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"94b0fd4e2ae8850f4632a7f97457eb8792b097ef11febf9f02616c5429dc76d9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): src/qbasic/Basic/Display/Display.vb:678-699 | src/qbasic/Basic/Display/Display.vb:712-733 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":678}}}],"partialFingerprints":{"codehealthFindingId/v1":"a22831ad8f3361f12700250984bed2a1d5679fe3f14c12797f56d63dd39dfdf1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:12003-12024 | src/qbasic/Basic/Interactive/Interactive.vb:12025-12046 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12003}}}],"partialFingerprints":{"codehealthFindingId/v1":"c16d4190577c998ece47eba6b787cac9e417f1fcfd8cde935808f47f03e64f04"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21\u201322 lines \u00D7 2): src/qbasic/Basic/VisualBasic/MKI.vb:259-279 | src/qbasic/QBLib/Core.vb:655-676 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/VisualBasic/MKI.vb"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"2611141eb3bf895dcba2ae6d0806a36301572a55ea07c4250271390512bd3e72"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:946-967 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:3261-3282 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:3261\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":946}}}],"partialFingerprints":{"codehealthFindingId/v1":"96b1b6ff109e21759d04b3e6f29611838c0d6b10e6b07bf1fe967c085b9ad64e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 5): src/qbasic/NewFunctionDialog.vb:34-54 | src/qbasic/NewSubDialog.vb:34-54 | src/qbasic/OpenDialog.vb:97-117 | src/qbasic/PrintDialog.vb:46-66 | src/qbasic/SaveAsDialog.vb:82-102 \u2014 before extracting anything, compare \u0060src/qbasic/NewFunctionDialog.vb\u0060 and \u0060src/qbasic/NewSubDialog.vb\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 116 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/NewFunctionDialog.vb"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b2a8eaafc1f7708c5d0c6c6b47aeccd8f3b0bcb9bdc36efae8d52fe05485a07"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 3): src/qbasic/Basic/Interactive/Interactive.vb:6497-6519 | src/qbasic/Basic/Interactive/Interactive.vb:15061-15081 | src/qbasic/Basic/Interactive/Interactive.vb:15085-15105 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060src/qbasic/Basic/Interactive/Interactive.vb:6519\u0060 calls \u0060PeekToken\u0060 and \u0060src/qbasic/Basic/Interactive/Interactive.vb:15081\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6497}}}],"partialFingerprints":{"codehealthFindingId/v1":"7237f2a2cbb17ebfddc0d2b3a81ad39562faa1bffa25fb721fcf28af281697c3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201321 lines \u00D7 2): src/qbasic/Basic/Display/Display.vb:322-342 | src/qbasic/Basic/Display/Display.vb:494-511 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"623db0e3e67286e140e551748473a3c435f2be00c9f0a298ab553d707aaad249"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201321 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:6385-6403 | src/qbasic/Basic/Interactive/Interactive.vb:6417-6437 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6385}}}],"partialFingerprints":{"codehealthFindingId/v1":"673c05df135c66da979005511c0816d11dea0a93b0baa8ff0dd01e73d3b6f318"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): src/qbasic.compatibility/Devices.vb:349-369 | src/qbasic/Basic/VisualBasic/MKI.vb:342-362 \u2014 before extracting anything, compare \u0060src/qbasic.compatibility/Devices.vb\u0060 and \u0060src/qbasic/Basic/VisualBasic/MKI.vb\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 99 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Devices.vb"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9ae751a08cf22d72bfe6778db25da47169480f61784468648b57e10242c1c4c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 6): src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:594-613 | src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:622-641 | src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:650-669 | src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:678-697 | src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:706-725 | src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:734-753 \u2014 all 6 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:590\u0060 calls \u0060ToString\u0060 and \u0060src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:620\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ba4ed6c7ca7c5a150cdb6edc7599a02c5816bdeb8544ef8160925dd139f387d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201320 lines \u00D7 4): src/qbasic/Basic/Display/Display.vb:326-344 | src/qbasic/Basic/Display/Display.vb:428-447 | src/qbasic/Basic/Display/Display.vb:453-472 | src/qbasic/Basic/Display/Display.vb:498-513 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/Basic/Display/Display.vb:496\u0060 calls \u0060m_attributeEgaPalette\u0060 and \u0060src/qbasic/Basic/Display/Display.vb:427\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"43acae8eaee816748c7b936194d946fba664eedb77a76a60d98ab9c8ad8d42f6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 3): src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:424-444 | src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:465-484 | src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:510-529 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb:424\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c64c5910068b58bf15b9f2e9788ed0edba90433edfcbf72b85432f78ae99b7e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:15494-15513 | src/qbasic/Basic/Interactive/Interactive.vb:15526-15545 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15494}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba4521c21e7bd13caf7762e2357995692747f9d7c4d61aba46d980030433d313"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/qbasic/Basic/Display/Display.vb:744-762 | src/qbasic/Basic/Display/Display.vb:767-785 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"a37ed80ea5958d2896b26fd68963801dd9e225753e43f6f798d44afb2527f645"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:6812-6830 | src/qbasic/Basic/Interactive/Interactive.vb:15714-15732 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6812}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d8acc50870d7ef962a85502c1176c4835c715d48caae7c68ac08494d5695a15"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:7783-7801 | src/qbasic/Basic/Interactive/Interactive.vb:7807-7825 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7783}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f1c0eed5f95a4db2d529c49dd82f1b07e5fe99cf8f6e8d989b8ae89e09310c8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/qbasic.compatibility/Devices.vb:130-148 | src/qbasic/Basic/VisualBasic/MKI.vb:124-142 \u2014 before extracting anything, compare \u0060src/qbasic.compatibility/Devices.vb\u0060 and \u0060src/qbasic/Basic/VisualBasic/MKI.vb\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 99 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Devices.vb"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7697a68f47165adec6a965cd6ce1a341c58b1faaac5957727aa1d2ef6cb5968"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/qbasic/Implementation/WindowsFileSystem.vb:143-161 | src/qbasic/Implementation/WindowsFileSystem.vb:165-183 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/WindowsFileSystem.vb"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f157605ba342bb015bd356837abfac8681b42df387ad868bf885d1f122901a5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Evaluator.vb:3635-3653 | src/qbasic/QB/CodeAnalysis/Evaluator.vb:3745-3763 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3635}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f54ac3d3c8777a9370db29e642c3720297e7da2d2be565496bbda874f04754d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 6): src/qbasic/Basic/Interactive/Interactive.vb:18745-18762 | src/qbasic/Basic/Interactive/Interactive.vb:18866-18883 | src/qbasic/Basic/Interactive/Interactive.vb:18888-18905 | src/qbasic/Basic/Interactive/Interactive.vb:18910-18927 | src/qbasic/Basic/Interactive/Interactive.vb:18932-18949 | src/qbasic/Basic/Interactive/Interactive.vb:18954-18971 \u2014 all 6 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":18745}}}],"partialFingerprints":{"codehealthFindingId/v1":"40c417ff3acd6e6d48902f75f6fd6c3e9a923219362367e6ebc4ad5f318d59a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 5): src/qbasic/Basic/Parser/Dialect/Parser.Dialect.AmigaBasic.vb:110-127 | src/qbasic/Basic/Parser/Dialect/Parser.Dialect.GwBasic.vb:211-228 | src/qbasic/Basic/Parser/Dialect/Parser.Dialect.Hybrid.vb:133-150 | src/qbasic/Basic/Parser/Dialect/Parser.Dialect.Qbasic.vb:117-134 | src/qbasic/Basic/Parser/Dialect/Parser.Dialect.TinyBasic.vb:111-128 \u2014 before extracting anything, compare \u0060src/qbasic/Basic/Parser/Dialect/Parser.Dialect.AmigaBasic.vb\u0060 and \u0060src/qbasic/Basic/Parser/Dialect/Parser.Dialect.GwBasic.vb\u0060 as WHOLE FILES: 85% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 1 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Dialect/Parser.Dialect.AmigaBasic.vb"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"28629c11aab8990ff1753b1cf1da4988de5cee3335c340e5a5e37562997f75c4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/qbasic.compatibility/Devices.vb:54-71 | src/qbasic/Basic/VisualBasic/MKI.vb:48-65 \u2014 before extracting anything, compare \u0060src/qbasic.compatibility/Devices.vb\u0060 and \u0060src/qbasic/Basic/VisualBasic/MKI.vb\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 99 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Devices.vb"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"98a8234939f8206d8a3cf46da738a50c02d5df17bb063aaed33d2a68fab90b5d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 6): src/qbasic/NewFunctionDialog.vb:42-58 | src/qbasic/NewSubDialog.vb:42-58 | src/qbasic/OpenDialog.vb:105-121 | src/qbasic/PrintDialog.vb:54-70 | src/qbasic/SaveAsDialog.vb:90-106 | src/qbasic/SubsDialog.vb:55-71 \u2014 before extracting anything, compare \u0060src/qbasic/NewFunctionDialog.vb\u0060 and \u0060src/qbasic/NewSubDialog.vb\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 116 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/NewFunctionDialog.vb"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb438e27cad03f9026b72c7a4eb825c43e82ec3c2b6e2b70abc78173ccaa6554"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 4): src/qbasic/QBLib/Video.vb:996-1020 | src/qbasic/QBLib/Video.vb:1036-1052 | src/qbasic/QBLib/Video.vb:1060-1076 | src/qbasic/QBLib/Video.vb:1084-1100 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/qbasic/QBLib/Video.vb:996\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":996}}}],"partialFingerprints":{"codehealthFindingId/v1":"199fae78be457dcc28b42546b4f8ba47d2bc4d7d2128fa36212a93e863c18098"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3): src/qbasic/Basic/Interactive/Interactive.vb:5665-5681 | src/qbasic/Basic/Interactive/Interactive.vb:11190-11206 | src/qbasic/Basic/Interactive/Interactive.vb:14698-14714 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/qbasic/Basic/Interactive/Interactive.vb:5665\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/Basic/Interactive/Interactive.vb:5660\u0060 calls \u0060ExecuteChDir\u0060 and \u0060src/qbasic/Basic/Interactive/Interactive.vb:11188\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":5665}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ede87ad5944c8cb7eca2a98fa0e844b76d2d9e2b4d868c8673f4a07942c3f57"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3): src/qbasic/DisplayDialog.vb:74-90 | src/qbasic/FindDialog.vb:47-63 | src/qbasic/HelpPathDialog.vb:34-50 \u2014 before extracting anything, compare \u0060src/qbasic/DisplayDialog.vb\u0060 and \u0060src/qbasic/FindDialog.vb\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 70 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DisplayDialog.vb"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c902ff972fba73c0259d5c8688bd440415140663363ec9bdc7ae4efc5c870af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201317 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:865-877 | src/qbasic/Basic/Interactive/Interactive.vb:1121-1137 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":865}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cf980b15485471743e18bc00e112e2e130beae87083d2db9eac85b120d7db67"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:11522-11538 | src/qbasic/Basic/Interactive/Interactive.vb:11565-11581 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11522}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d50c2aedd8e406c588c85bdcc6b88f55622ce4f512b632b892be9edd27ec15a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/qbasic/Basic/VisualBasic/MKI.vb:322-338 | src/qbasic/QBLib/Core.vb:827-844 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/VisualBasic/MKI.vb"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dc174c04f5b89bbda2c9b4dca039922ae4312dfabf679a82bd1eec361a83753"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Evaluator.vb:2550-2566 | src/qbasic/QB/CodeAnalysis/Evaluator.vb:2580-2596 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2550}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c48e86573e307245d4b305684d49a6980525d0d5c41b6a8f3bdc16ad7c26808"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 3): src/qbasic.compatibility/Devices.vb:264-278 | src/qbasic/Basic/VisualBasic/MKI.vb:257-271 | src/qbasic/QBLib/Core.vb:653-668 \u2014 before extracting anything, compare \u0060src/qbasic.compatibility/Devices.vb\u0060 and \u0060src/qbasic/Basic/VisualBasic/MKI.vb\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 99 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Devices.vb"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd6dd0c94b458ef065f3dd66335115cb982586c7b2225c794d97183dcc998a97"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/qbasic/AboutDialog.vb:67-82 | src/qbasic/MessageDialog.vb:63-78 \u2014 before extracting anything, compare \u0060src/qbasic/AboutDialog.vb\u0060 and \u0060src/qbasic/MessageDialog.vb\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 35 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/AboutDialog.vb"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"87c48384d3c39faeb5e15b62c39d09c025cce0f4dae6ef73e8e758e220b8a1e4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:7955-7970 | src/qbasic/Basic/Interactive/Interactive.vb:8055-8070 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/Basic/Interactive/Interactive.vb:8054\u0060 calls \u0060m_interpreter\u0060, \u0060Statements\u0060 and \u0060src/qbasic/Basic/Interactive/Interactive.vb:7954\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7955}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecd46970d3751618c6f161c25eabea1b6a2ea635e2bcfde58b78f09ff18a2277"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:12936-12951 | src/qbasic/Basic/Interactive/Interactive.vb:12952-12967 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12936}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8106bfd4f0f543cebb468a67563ad68550119b1dfbe0d1a11b287a771374dee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:15893-15908 | src/qbasic/Basic/Interactive/Interactive.vb:16452-16467 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":15893}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd1adfda5a234003ab218c2807873586851c0fadf04647b2a6144689c3fcc0e8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/qbasic.compatibility/Devices.vb:322-337 | src/qbasic/Basic/VisualBasic/MKI.vb:315-330 \u2014 before extracting anything, compare \u0060src/qbasic.compatibility/Devices.vb\u0060 and \u0060src/qbasic/Basic/VisualBasic/MKI.vb\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 99 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Devices.vb"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"a038c55de88651a7bb5d05039f7117b811e7dfde74bdad4b44d928709bb52137"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb:463-478 | src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb:360-375 \u2014 before extracting anything, compare \u0060src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb\u0060 and \u0060src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 92 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"b306fc6b0b06db083dd99781d01a2392bc938866c751d462bee513a4c074dc9d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:2973-2988 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:3095-3110 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:2973\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":2973}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dcfba852b56fc7d3045dc379cd1a5a96b105040d96c5a340d89a26e7555239e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 10): src/qbasic/ChangeDialog.vb:99-113 | src/qbasic/DisplayDialog.vb:152-166 | src/qbasic/FindDialog.vb:83-97 | src/qbasic/HelpPathDialog.vb:70-84 | src/qbasic/NewFunctionDialog.vb:78-92 | src/qbasic/NewSubDialog.vb:78-92 | src/qbasic/OpenDialog.vb:152-166 | src/qbasic/PrintDialog.vb:88-102 | src/qbasic/SaveAsDialog.vb:139-153 | src/qbasic/SubsDialog.vb:100-114 \u2014 before extracting anything, compare \u0060src/qbasic/ChangeDialog.vb\u0060 and \u0060src/qbasic/DisplayDialog.vb\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 53 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/ChangeDialog.vb"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec52d632ed290dc10e2554d1375c4e2d7811c1b534fa997b6ffd7e5392fb3d41"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 7): src/qbasic/Basic/Display/Display.vb:278-292 | src/qbasic/Basic/Display/Display.vb:332-346 | src/qbasic/Basic/Display/Display.vb:369-383 | src/qbasic/Basic/Display/Display.vb:410-424 | src/qbasic/Basic/Display/Display.vb:435-449 | src/qbasic/Basic/Display/Display.vb:460-474 | src/qbasic/Basic/Display/Display.vb:501-515 \u2014 all 7 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/Basic/Display/Display.vb:432\u0060 calls \u0060m_attributeEgaPalette\u0060 and \u0060src/qbasic/Basic/Display/Display.vb:499\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"e59c325149fa42d6f67d9dc5c1554b70f2410f47aeadff83adc3170041e2ccf8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 6): src/qbasic/Basic/Display/Display.vb:550-564 | src/qbasic/Basic/Display/Display.vb:663-677 | src/qbasic/Basic/Display/Display.vb:697-711 | src/qbasic/Basic/Display/Display.vb:731-745 | src/qbasic/Basic/Display/Display.vb:754-768 | src/qbasic/Basic/Display/Display.vb:777-791 \u2014 all 6 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"d187e917fd2302346606c4fbdd5ce546c2a69fa85f9db7df02005603b51aea55"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): src/qbasic/Basic/Interactive/Interactive.vb:10235-10249 | src/qbasic/Basic/Interactive/Interactive.vb:11186-11200 | src/qbasic/Basic/Interactive/Interactive.vb:14694-14708 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10235}}}],"partialFingerprints":{"codehealthFindingId/v1":"f310f352562a79ab44949db1c1ae8e4484cfdfc3c586848cefab0b9c03ee9e72"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/qbasic/Basic/Display/Display.vb:573-587 | src/qbasic/Basic/Display/Display.vb:614-628 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"87a63181d27776a645a548261ebac57fd9a1308adb9b983053e1a42977d7dd07"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:3007-3021 | src/qbasic/Basic/Interactive/Interactive.vb:3049-3063 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060src/qbasic/Basic/Interactive/Interactive.vb:3024\u0060 calls \u0060ThrowBasicError\u0060 and \u0060src/qbasic/Basic/Interactive/Interactive.vb:3065\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":3007}}}],"partialFingerprints":{"codehealthFindingId/v1":"2218d0a0f2f2f672dcdb5d3ad3dfe6aae2b2f8c730dcb64a59a79ca5e7a17702"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:5798-5812 | src/qbasic/Basic/Interactive/Interactive.vb:16841-16855 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":5798}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b7c53d5526bd6cc67e547a99e6468a2888cd0ecd87b48977e34e76de3a49f07"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:16972-16986 | src/qbasic/Basic/Interactive/Interactive.vb:16994-17008 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/qbasic/Basic/Interactive/Interactive.vb:16972\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16972}}}],"partialFingerprints":{"codehealthFindingId/v1":"13360ecf64026048a6eb8539607b1e966ebe077974ff4f66cc4887be1b95bd34"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb:506-520 | src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb:414-428 \u2014 before extracting anything, compare \u0060src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb\u0060 and \u0060src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 92 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb:501\u0060 calls \u0060EmitExpression\u0060 and \u0060src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb:409\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4dd98e230e34d852a53fb571a46fc5edb6176a476599b07b8f569aeac34d43e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 3): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:1762-1775 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:1797-1809 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:3795-3807 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:1812\u0060 calls \u0060ParseOptionalAsClause\u0060 and \u0060src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:3809\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":1762}}}],"partialFingerprints":{"codehealthFindingId/v1":"82100909ed1d2d791ddd08e99615fe4aca61a1a264ecf097fd69df6721c0a34b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/qbasic/Basic/Display/Display.vb:5163-5176 | src/qbasic/Basic/Display/Display.vb:5201-5214 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":5163}}}],"partialFingerprints":{"codehealthFindingId/v1":"14f3f143a72e5276ed52679662d56253462fd3edbf7a8d7924d73d345f366d32"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/qbasic/Basic/Input/KeyEventArgs.vb:186-200 | src/qbasic/Basic/Input/KeyEventArgs.vb:274-287 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Input/KeyEventArgs.vb"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a16c43c010e59c7bad97dcc757c382242511bf360b133142477cefa820cfe1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:4052-4065 | src/qbasic/Basic/Interactive/Interactive.vb:4070-4083 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":4052}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd462229c88807535e6b971629638192fdc3d8274317bf90e44a50d7c00ab988"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:17614-17627 | src/qbasic/Basic/Interactive/Interactive.vb:17633-17646 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":17614}}}],"partialFingerprints":{"codehealthFindingId/v1":"a037f14344ea311fece52becca1aae43b69a8897b0ee0dee6fcdc09dfadcf547"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1516-1529 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1533-1546 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1516}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef69dd63fdfe1e033f55d61a5e70324af7f50e5f3e5e8bfb05984f1c5ce68e6d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:468-481 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:521-534 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:468\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9fd49c9b4543da078459f6f5a0d2460fb0e40f02df8b8371bcea511c47e7f20"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 9): src/qbasic/Basic/Display/Display.vb:553-565 | src/qbasic/Basic/Display/Display.vb:566-578 | src/qbasic/Basic/Display/Display.vb:594-606 | src/qbasic/Basic/Display/Display.vb:607-619 | src/qbasic/Basic/Display/Display.vb:666-678 | src/qbasic/Basic/Display/Display.vb:700-712 | src/qbasic/Basic/Display/Display.vb:734-746 | src/qbasic/Basic/Display/Display.vb:757-769 | src/qbasic/Basic/Display/Display.vb:780-792 \u2014 all 9 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":553}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fc75ec107ecb51337ca213d7b6232c0c04e70c3e1172f0b25313ce8a9abdce4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 5): src/qbasic/Basic/Input/KeyEventArgs.vb:187-200 | src/qbasic/Basic/Input/KeyEventArgs.vb:201-214 | src/qbasic/Basic/Input/KeyEventArgs.vb:215-228 | src/qbasic/Basic/Input/KeyEventArgs.vb:229-242 | src/qbasic/Basic/Input/KeyEventArgs.vb:275-287 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Input/KeyEventArgs.vb"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"2690a90e9c639db38453540e0726ffffaa4a54dea3595b1211998f2f62544359"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): src/qbasic/Basic/Display/Display.vb:2165-2177 | src/qbasic/Basic/Display/Display.vb:2184-2196 | src/qbasic/Basic/Display/Display.vb:2208-2220 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2165}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ee7a346921deaf58f84cd0687d4dc1cec709b42f2c7ace9561c864c800c1ead"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): src/qbasic/Basic/Interactive/Interactive.vb:865-877 | src/qbasic/Basic/Interactive/Interactive.vb:1121-1133 | src/qbasic/Basic/Interactive/Interactive.vb:18680-18692 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":865}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f70100e7e33e71a15e2bee3a72c077e04f96a2100039162577c4ce34344ba1c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/qbasic/AboutDialog.vb:76-88 | src/qbasic/WelcomeDialog.vb:81-93 \u2014 before extracting anything, compare \u0060src/qbasic/AboutDialog.vb\u0060 and \u0060src/qbasic/WelcomeDialog.vb\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 32 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/AboutDialog.vb"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"a39fbaecab8fa651c29e569676b367db496947366d01d41604b2b6a7ab7a55f8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/qbasic/Program.vb:719-731 | src/qbasic/Program.vb:1346-1358 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":719}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3067c7c709107df6e98a0f21fabb5e0a0da3600523e14f5a5b31ca20f41a026"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:485-497 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:527-539 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1a5f187c8fe100d6f368bf5503d8a0141c721e216de80b11f5d799fc34cd6dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:4269-4280 | src/qbasic/Basic/Interactive/Interactive.vb:4459-4470 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":4269}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b6791ec3024c1359cbfa93b3acd99160bdaaa0fed3613fab84235415afd866a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:6699-6710 | src/qbasic/Basic/Interactive/Interactive.vb:10311-10322 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6699}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c3640cac1680b7c1fd48a10cbce71330076778ca4b348865425621623bb9229"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:11365-11376 | src/qbasic/Basic/Interactive/Interactive.vb:11393-11404 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/Basic/Interactive/Interactive.vb:11363\u0060 calls \u0060ExecuteExpression\u0060 and \u0060src/qbasic/Basic/Interactive/Interactive.vb:11391\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":11365}}}],"partialFingerprints":{"codehealthFindingId/v1":"a99dc9a4503de7013a27f56ee30acd6cca26df75e22f773055bb00874d79a79f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/qbasic/Components/Form.vb:72-83 | src/qbasic/Components/Form.vb:87-98 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/Form.vb"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ab7c16c24d64ab506c9be95a8167ced7a64d20cb6d6104697bbb0db8d43b1b3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/qbasic/DocumentPanel.vb:164-176 | src/qbasic/HelpPanel.vb:67-78 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"a51eebdc56c8b206609886885a3f884599d7e6e48ebe5f26f4dcbc57e6c72d45"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): src/qbasic/DocumentPanel.vb:219-228 | src/qbasic/HelpPanel.vb:95-106 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fc113129f21ef0ad9620adb940c1893f266caffe8dcc1d8e3c6dfb7e61013e8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:2040-2051 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:2061-2072 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2040}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f7ba57f0ec1958ef0b157715f2b99dba2b7210e9ed56ceaf8b57a346d157573"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Evaluator.vb:3538-3549 | src/qbasic/QB/CodeAnalysis/Evaluator.vb:3562-3576 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3538}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bfba052ec8de4cea043f430ef3267fa5b1816d450752230bee037ffb806f134"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:1838-1849 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:3128-3139 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":1838}}}],"partialFingerprints":{"codehealthFindingId/v1":"a97eb71ba1d6759aea6ff5f4ab1298b7baa095f83dab263fb8b10392b3afddb2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4): src/qbasic/Basic/Display/Display.vb:1864-1874 | src/qbasic/Basic/Display/Display.vb:2233-2243 | src/qbasic/Basic/Display/Display.vb:2318-2328 | src/qbasic/Basic/Display/Display.vb:2349-2359 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1864}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2d58c0f381f1666c600837fe2a445d83fa635ce7c659f7c8c1e1f4e4072b63a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:2340-2350 | src/qbasic/Basic/Interactive/Interactive.vb:2362-2372 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2340}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fd5dc52ea457f99ed247c66a63a3df9ea3490cde8ea51be6735132dc27938cd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:2735-2745 | src/qbasic/Basic/Interactive/Interactive.vb:3393-3401 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/Basic/Interactive/Interactive.vb:2733\u0060 calls \u0060PopToken\u0060 and \u0060src/qbasic/Basic/Interactive/Interactive.vb:3392\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2735}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8e8e62ae9fda089ddf73eb35e3e4e86e07eceac375438f82eb2b69eef63f0ad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/qbasic/Basic/Parser/Parser.vb:482-492 | src/qbasic/Basic/Parser/Parser.vb:603-614 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"41fffb2c73e8f12d46c5847f5e6b3d1c955c10209a0a0cf4e2f98770859594fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/qbasic/ChangeDialog.vb:29-39 | src/qbasic/FindDialog.vb:27-37 \u2014 before extracting anything, compare \u0060src/qbasic/ChangeDialog.vb\u0060 and \u0060src/qbasic/FindDialog.vb\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 64 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/ChangeDialog.vb"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6b52c2bb9a1e0361abb7df226d6bf5ba910c37147c6b5f67a92f6f17c76f1ca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/qbasic/Components/Form.vb:121-131 | src/qbasic/Components/Form.vb:144-154 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/Form.vb"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"69e1788a4682eebe8a8bc84585f642da1be191e52e2c9f22b8256b9cf750774c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:274-285 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:4265-4275 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"df762efb9d5d75f3e9e328aabd16192861781f6dcf4db5d5a5160704e41159bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1091-1101 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1108-1117 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1145-1157 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1160-1169 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1091}}}],"partialFingerprints":{"codehealthFindingId/v1":"04379b06c8907f641cf48c89a55c6ba4831038ebf4d908cf99b324372949c996"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): src/qbasic/AboutDialog.vb:66-75 | src/qbasic/MessageDialog.vb:62-71 | src/qbasic/WelcomeDialog.vb:71-80 \u2014 before extracting anything, compare \u0060src/qbasic/AboutDialog.vb\u0060 and \u0060src/qbasic/MessageDialog.vb\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 35 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/AboutDialog.vb"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"b31c0ea4f9513b2f9531ea7a82bd16f7e406d071207fd2e694d2146660536d20"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:469-478 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:493-502 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:522-531 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":469}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2ccc053a7318a6a959275dd12f6635739acdf2a6e8e4b6810b305bcdd86fc32"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:10464-10472 | src/qbasic/Basic/Interactive/Interactive.vb:11994-12003 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":10464}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff93b220a0db7602a3bca63dc9865bfe6f0e42caa1d5493329ee4872015efc7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/qbasic/Basic/Parser/Parser.vb:542-551 | src/qbasic/Basic/Parser/Parser.vb:646-655 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f6dfd30959bdea70da5b708a57c4a4ece8db60f9b5833d2207deb01ebc2c96b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/qbasic/Common.vb:520-531 | src/qbasic/Common.vb:546-555 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Common.vb"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d9fd6e9b3c1a465d71f78ed186d690352e2412ac32985ce6b60ae3f76626756"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/qbasic/MainMenu.vb:86-95 | src/qbasic/MainMenu.vb:158-167 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/MainMenu.vb"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce400982e711144920cbd4da6b6332200e58aad7fb93e2b7addb6ffd133e8541"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/qbasic/OpenDialog.vb:68-77 | src/qbasic/SaveAsDialog.vb:63-72 \u2014 before extracting anything, compare \u0060src/qbasic/OpenDialog.vb\u0060 and \u0060src/qbasic/SaveAsDialog.vb\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 95 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/OpenDialog.vb"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"5997bebd92e4b53c59b9ad354a808d0d16b6d85109fa41e9d8fcb2aab1ca6bfd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1012-1021 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:1032-1040 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1012}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3061008ac31431fbedb76498d61a8537b34e7a004a9038361f4bb696194a6dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:2403-2412 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:3903-3912 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":2403}}}],"partialFingerprints":{"codehealthFindingId/v1":"9651dcb9ed9dd6a3775f628ce54ce39d769959d9ddcde83b8193d2a7e2c644ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 14): src/qbasic/AboutDialog.vb:66-74 | src/qbasic/ChangeDialog.vb:99-107 | src/qbasic/DisplayDialog.vb:152-160 | src/qbasic/FindDialog.vb:83-91 | src/qbasic/HelpPathDialog.vb:70-78 | src/qbasic/MessageDialog.vb:62-70 | src/qbasic/NewFunctionDialog.vb:78-86 | src/qbasic/NewSubDialog.vb:78-86 | src/qbasic/OpenDialog.vb:152-160 | src/qbasic/PrintDialog.vb:88-96 | src/qbasic/SaveAsDialog.vb:139-147 | src/qbasic/SavePrompt.vb:73-81 | src/qbasic/SubsDialog.vb:100-108 | src/qbasic/WelcomeDialog.vb:71-79 \u2014 before extracting anything, compare \u0060src/qbasic/AboutDialog.vb\u0060 and \u0060src/qbasic/MessageDialog.vb\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 35 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/AboutDialog.vb"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"982a105e6edc465e25f8abbb8d1f9b5268aa4ea941c3ed026b77e6f135f9238e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb:362-370 | src/qbasic/QB/CodeAnalysis/Emit/MsilEmitter.vb:238-246 | src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb:257-265 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"acc617d82d33466cbcacc5397d6adedc242924321be1296f0314e31828cddf97"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/qbasic.compatibility/Devices.vb:229-237 | src/qbasic/Basic/VisualBasic/MKI.vb:222-230 \u2014 before extracting anything, compare \u0060src/qbasic.compatibility/Devices.vb\u0060 and \u0060src/qbasic/Basic/VisualBasic/MKI.vb\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 99 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Devices.vb"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"fddc27ba107bd1ceea26fbf049690f46e9766a6f7f6e24ee07f5ceeb612074b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/qbasic/Common.vb:716-724 | src/qbasic/Common.vb:728-736 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Common.vb"},"region":{"startLine":716}}}],"partialFingerprints":{"codehealthFindingId/v1":"b56204b962d116f0e84a5090190d29936458fc617c3a2b8e80ade0abe217ffc4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/qbasic/DocumentPanel.vb:927-935 | src/qbasic/DocumentPanel.vb:1035-1043 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060src/qbasic/DocumentPanel.vb:1044\u0060 calls \u0060Enter\u0060 and \u0060src/qbasic/DocumentPanel.vb:936\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":927}}}],"partialFingerprints":{"codehealthFindingId/v1":"be4f35adb81a8d2b37c83daa902dcf60d7417a33ee732939ff0c4fd5625456da"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20139 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Evaluator.vb:3656-3664 | src/qbasic/QB/CodeAnalysis/Evaluator.vb:3701-3707 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3656}}}],"partialFingerprints":{"codehealthFindingId/v1":"73aa82f60ce942f7da60bf8d652dc09e80483e0b3805c8fa498a56d6ad0371e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20139 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Evaluator.vb:3766-3774 | src/qbasic/QB/CodeAnalysis/Evaluator.vb:3809-3815 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3766}}}],"partialFingerprints":{"codehealthFindingId/v1":"feb0c15e64b2cebf57ed5cb50e335c404574e4b754cd06b1f573bf4033f7b350"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:770-778 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:1849-1857 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":770}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbba14bbf5d5f98a42c4d2c947f74286685968d280de8908232e139fb4ab12fb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:2848-2856 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:3955-3964 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":2848}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1ec23e1ddbfb2c0e1bcc624443002144b6dbc4ef7b6df0b2bc99fbe47e49873"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:771-778 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:1850-1857 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:3133-3140 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"d32a22414a648bc02de00215bbd13906e2b35b101e160075983a2bea13244c84"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:8701-8708 | src/qbasic/Basic/Interactive/Interactive.vb:8754-8761 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8701}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e725832def68fe5ea2e3340e9737a02092108e59e730885730938b1671c137f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/qbasic/Components/TextBoxControl.vb:147-154 | src/qbasic/DocumentPanel.vb:310-317 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/qbasic/DocumentPanel.vb:310\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/TextBoxControl.vb"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce84580937984f7dce4db6b22695979099be2cc00cd5d9f059aac68f039bbcf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:388-395 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:495-502 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"f88cb74be8c51173b14de7f783a737cfb962e1a0ecd72ac1aeff925102504850"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:2198-2205 | src/qbasic/QB/CodeAnalysis/Binding/Binder.vb:2220-2227 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":2198}}}],"partialFingerprints":{"codehealthFindingId/v1":"a06065ade57f59888489065a5b351d12f75482b1f05d14de9303e08c28caed1e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 5): src/qbasic/Basic/Interactive/Interactive.vb:8701-8707 | src/qbasic/Basic/Interactive/Interactive.vb:8754-8760 | src/qbasic/Basic/Interactive/Interactive.vb:8835-8850 | src/qbasic/Basic/Interactive/Interactive.vb:8909-8924 | src/qbasic/Basic/Interactive/Interactive.vb:8998-9013 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8701}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1e3c6f9ee9603f4cc0eccb9b80e4f6083b91279103df441308a6254bcf7e7a2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:1365-1371 | src/qbasic/Basic/Interactive/Interactive.vb:1373-1379 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/qbasic/Basic/Interactive/Interactive.vb:1373\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1365}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa08b942619df2fa4fb9d222b859d04955d8cd256dc29b6376c47a161df80ecf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:6295-6301 | src/qbasic/Basic/Interactive/Interactive.vb:8539-8545 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6295}}}],"partialFingerprints":{"codehealthFindingId/v1":"4435ad4f77fd96271a35b1769caea617c98871c678f8e324e75012d3fc843cb5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:8538-8544 | src/qbasic/Basic/Interactive/Interactive.vb:10464-10471 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8538}}}],"partialFingerprints":{"codehealthFindingId/v1":"34eb62633fed6a952630a2d93c4591ade3021e5919052cd6c633933d1af3a0a6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:16586-16594 | src/qbasic/Basic/Interactive/Interactive.vb:16706-16712 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060src/qbasic/Basic/Interactive/Interactive.vb:16704\u0060 calls \u0060m_numericVariableList\u0060 and \u0060src/qbasic/Basic/Interactive/Interactive.vb:16584\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16586}}}],"partialFingerprints":{"codehealthFindingId/v1":"38f034d3cf90ed30c12b46aafaaaf369c48093a45b4c1e506ed2f3e0468f5fcc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 10): src/qbasic/QBLib/Video.vb:2018-2023 | src/qbasic/QBLib/Video.vb:2024-2029 | src/qbasic/QBLib/Video.vb:2030-2035 | src/qbasic/QBLib/Video.vb:2036-2041 | src/qbasic/QBLib/Video.vb:2042-2047 | src/qbasic/QBLib/Video.vb:2048-2053 | src/qbasic/QBLib/Video.vb:2054-2059 | src/qbasic/QBLib/Video.vb:2060-2065 | src/qbasic/QBLib/Video.vb:2066-2071 | src/qbasic/QBLib/Video.vb:2072-2077 \u2014 all 10 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":2018}}}],"partialFingerprints":{"codehealthFindingId/v1":"51ddd128a8b78f2f603b6bf89b1f0d26a15ce642676efc46a8b68d5e16c467e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): src/qbasic/Basic/Display/Display.vb:2247-2252 | src/qbasic/Basic/Display/Display.vb:2253-2258 | src/qbasic/Basic/Display/Display.vb:2259-2265 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2247}}}],"partialFingerprints":{"codehealthFindingId/v1":"b05df5d5ebfadbdf6d94b234bfeb90c169212dc93a67e7b74dba5b6205883219"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/qbasic/Basic/Display/Display.vb:2066-2071 | src/qbasic/Basic/Display/Display.vb:2112-2117 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":2066}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8b8855f013a48f80000b4adc84e381d65878949e12d6cb5fdd0cc4acbc26d5e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/qbasic/Basic/Interactive/Interactive.vb:6280-6285 | src/qbasic/Basic/Interactive/Interactive.vb:6286-6291 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6280}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed8fb303e54a87481dcbcd49be3819a7cc68d4992af8826c63b31d57b34d0444"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:780-785 | src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb:786-791 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":780}}}],"partialFingerprints":{"codehealthFindingId/v1":"52c4fe2ce39d216112d2d8e45185e9751bf450434251069d65ef9a9f9306468d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/qbasic/QBLib/Audio/WindowsAudio.vb:614-619 | src/qbasic/QBLib/Audio/WindowsAudio.vb:643-648 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/WindowsAudio.vb"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2717f793dd35b37946aa9f6c7996e2aef98d5711584141f2a00c2d4bc0b1205"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/qbasic/QBLib/Video.vb:1498-1503 | src/qbasic/QBLib/Video.vb:1544-1549 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1498}}}],"partialFingerprints":{"codehealthFindingId/v1":"09d6ad9d014676885a6c23246cec491951a0a2f59c0eea1545b9383b6031e648"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/qbasic.compatibility/Video.vb:1226-1231 | src/qbasic.compatibility/Video.vb:1272-1277 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1226}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e4aacae02b96a7734674c7b6f9f5046332980d6f032c6168519ed4b28495706"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 51): src/qbasic/Basic/Display/Display.vb:832-836 | src/qbasic/Basic/Display/Display.vb:837-841 | src/qbasic/Basic/Display/Display.vb:842-846 | src/qbasic/Basic/Display/Display.vb:847-851 | src/qbasic/Basic/Display/Display.vb:852-856 | src/qbasic/Basic/Display/Display.vb:857-861 | src/qbasic/Basic/Display/Display.vb:862-866 | src/qbasic/Basic/Display/Display.vb:867-871 | src/qbasic/Basic/Display/Display.vb:872-876 | src/qbasic/Basic/Display/Display.vb:877-881 | src/qbasic/Basic/Display/Display.vb:882-886 | src/qbasic/Basic/Display/Display.vb:887-891 | src/qbasic/Basic/Display/Display.vb:892-896 | src/qbasic/Basic/Display/Display.vb:897-901 | src/qbasic/Basic/Display/Display.vb:902-906 | src/qbasic/Basic/Display/Display.vb:907-911 | src/qbasic/Basic/Display/Display.vb:912-916 | src/qbasic/Basic/Display/Display.vb:917-921 | src/qbasic/Basic/Display/Display.vb:922-926 | src/qbasic/Basic/Display/Display.vb:927-931 | src/qbasic/Basic/Display/Display.vb:932-936 | src/qbasic/Basic/Display/Display.vb:937-941 | src/qbasic/Basic/Display/Display.vb:942-946 | src/qbasic/Basic/Display/Display.vb:947-951 | src/qbasic/Basic/Display/Display.vb:952-956 | src/qbasic/Basic/Display/Display.vb:957-961 | src/qbasic/Basic/Display/Display.vb:962-966 | src/qbasic/Basic/Display/Display.vb:967-971 | src/qbasic/Basic/Display/Display.vb:972-976 | src/qbasic/Basic/Display/Display.vb:977-981 | src/qbasic/Basic/Display/Display.vb:982-986 | src/qbasic/Basic/Display/Display.vb:987-991 | src/qbasic/Basic/Display/Display.vb:992-996 | src/qbasic/Basic/Display/Display.vb:997-1001 | src/qbasic/Basic/Display/Display.vb:1002-1006 | src/qbasic/Basic/Display/Display.vb:1007-1011 | src/qbasic/Basic/Display/Display.vb:1012-1016 | src/qbasic/Basic/Display/Display.vb:1017-1021 | src/qbasic/Basic/Display/Display.vb:1022-1026 | src/qbasic/Basic/Display/Display.vb:1027-1031 | src/qbasic/Basic/Display/Display.vb:1032-1036 | src/qbasic/Basic/Display/Display.vb:1037-1041 | src/qbasic/Basic/Display/Display.vb:1042-1046 | src/qbasic/Basic/Display/Display.vb:1047-1051 | src/qbasic/Basic/Display/Display.vb:1052-1056 | src/qbasic/Basic/Display/Display.vb:1057-1061 | src/qbasic/Basic/Display/Display.vb:1062-1066 | src/qbasic/Basic/Display/Display.vb:1067-1071 | src/qbasic/Basic/Display/Display.vb:1072-1076 | src/qbasic/Basic/Display/Display.vb:1077-1081 | src/qbasic/Basic/Display/Display.vb:1082-1086 \u2014 all 51 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":832}}}],"partialFingerprints":{"codehealthFindingId/v1":"52477ea116f95ae8c471a08feab9b9f9fd50cf91bd627a498bb09988a5696ecb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (4\u20135 lines \u00D7 13): src/qbasic/Basic/Display/Display.vb:1093-1097 | src/qbasic/Basic/Display/Display.vb:1098-1102 | src/qbasic/Basic/Display/Display.vb:1103-1107 | src/qbasic/Basic/Display/Display.vb:1108-1112 | src/qbasic/Basic/Display/Display.vb:1113-1117 | src/qbasic/Basic/Display/Display.vb:1118-1122 | src/qbasic/Basic/Display/Display.vb:1123-1127 | src/qbasic/Basic/Display/Display.vb:1128-1132 | src/qbasic/Basic/Display/Display.vb:1133-1137 | src/qbasic/Basic/Display/Display.vb:1138-1142 | src/qbasic/Basic/Display/Display.vb:1143-1147 | src/qbasic/Basic/Display/Display.vb:1148-1152 | src/qbasic/Basic/Display/Display.vb:1153-1156 \u2014 all 13 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":1093}}}],"partialFingerprints":{"codehealthFindingId/v1":"94db8c1aa362b5fe867771d5182c0fdd96b95ef103b942969b79d5b4a8a689f7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): src/qbasic/Components/HorizontalListBoxControl.vb:105-109 | src/qbasic/Components/ListBoxControl.vb:93-98 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/HorizontalListBoxControl.vb"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"29a3ff2ef67185ab684c5c5361bcac1bf28622c116d61a2d2660ec15e69d1340"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Binding/BoundScope.vb:161-165 | src/qbasic/QB/CodeAnalysis/Binding/BoundScope.vb:176-180 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundScope.vb"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a24ced90a6d51a32579b7537b55f1b25e4eb63fdb758ef64d6a20791804ea1d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Symbols/GlobalVariableSymbol.vb:9-28 | src/qbasic/QB/CodeAnalysis/Symbols/LocalVariableSymbol.vb:9-33 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Symbols/GlobalVariableSymbol.vb"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"270fa14f1fc22fc8d8f2efaf1a1cea281194fe9f3861f201adb27921f1babaf3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/qbasic/Components/ButtonControl.vb:42-48 | src/qbasic/Components/RadioButtonControl.vb:33-39 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/ButtonControl.vb"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"055c9829ec8173a41812f872422317a0c1fbf9077037ca8622aaad06182d378e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/qbasic/Components/CheckboxControl.vb:9-14 | src/qbasic/Components/RadioButtonControl.vb:9-14 \u2014 before extracting anything, compare \u0060src/qbasic/Components/CheckboxControl.vb\u0060 and \u0060src/qbasic/Components/RadioButtonControl.vb\u0060 as WHOLE FILES: 91% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 1 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Components/CheckboxControl.vb"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbb6bb209c227081aeca16d3ca2334788c1503d7e09d33f5a11150ea3a3de2a0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb:531-535 | src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb:439-443 \u2014 before extracting anything, compare \u0060src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb\u0060 and \u0060src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 92 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"e87ea6ac4e426a0e1101b6d1ecd2f7ebe4bdc6cd3f136db9746aa37dd938d81e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb:571-575 | src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb:488-492 \u2014 before extracting anything, compare \u0060src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb\u0060 and \u0060src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 92 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"e76924131780ca3451da3706b6b43d0107ec740adbf714782c0321cdb50bcb31"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb:755-763 | src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb:676-681 \u2014 before extracting anything, compare \u0060src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb\u0060 and \u0060src/qbasic/QB/CodeAnalysis/Emit/VbEmitter.vb\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 92 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/JsEmitter.vb"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"7311439dffa53783f52ab42f993d06bcf2decbc7cd98e4a298f8d8f716a14a56"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/qbasic.compatibility/Video.vb:2042-2050 | src/qbasic/QBLib/Video.vb:2219-2227 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":2042}}}],"partialFingerprints":{"codehealthFindingId/v1":"afd9adcb3e3783bfbb4af7f36e0e778c04fa77479b9cba99b7e3e598c123adda"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: QBasic: QBasic: abstractness 0.05, instability 0.00, distance 0.95 \u2014 an application entry point, so it is concrete by design \u2014 the distance is expected; what is worth checking is that other projects depend on it at all, since a host should be a leaf of the graph."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"532d874c7a1c5d030783bcc58a8f4dab895c90a6a831849e289c40b5b0fabe9c"}},{"ruleId":"D8","level":"warning","message":{"text":"Coverage not measured \u2014 no coverage collector is wired up: Coverage NOT MEASURED: \u0060--collect:\u0022XPlat Code Coverage\u0022\u0060 names a data collector that ships in the \u0060coverlet.collector\u0060 package, and this repository wires up none \u2014 no test project references it and no runsettings declares one. The absence of coverage here is therefore not evidence about the suite or about our analyzer environment: without a collector, \u0060--collect\u0060 produces nothing even from a suite that builds and passes. Add a \u0060coverlet.collector\u0060 PackageReference to the test project(s) (or commit the Cobertura/OpenCover/lcov report your CI produces) and real coverage will be measured. It is excluded from the score rather than counted as a near-zero defect."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"62e63e619c28f057e129f2997c965d32a457366a9ce18ca019ffb6bdfba85c99"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QB/CodeAnalysis/Evaluator.vb: src/qbasic/QB/CodeAnalysis/Evaluator.vb changed 122 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 276 in Evaluator.EvaluateBinaryExpression at line 3872. 24 of those changes were fix/bug commits, and the other 98 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Evaluator.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":3872}}}],"partialFingerprints":{"codehealthFindingId/v1":"607c603054fb619ed2f9be94d9a4f0264bb6e55ed1d46761dc178cc035cdda97"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/Program.vb: src/qbasic/Program.vb changed 42 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 379 in QBasic.OnUserUpdate at line 1176. 5 of those changes were fix/bug commits, and the other 37 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/Program.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1176}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0469965a59538df2415b9ab1fda8bd47529214e2d93980d7e36a7ef840ef1f5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QB/CodeAnalysis/Binding/Binder.vb: src/qbasic/QB/CodeAnalysis/Binding/Binder.vb changed 78 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 115 in Binder.BindStatementInternal at line 653. 19 of those changes were fix/bug commits, and the other 59 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Binding/Binder.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":653}}}],"partialFingerprints":{"codehealthFindingId/v1":"e22d8d7ad6cfa0c1f262467c6d3adbbc50c28efa6a6305ea44645c3abf360f3f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb: src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb changed 38 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 126 in Parser.ParseStatement at line 127. 8 of those changes were fix/bug commits, and the other 30 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"d799bdffc8dab9aff1d7fe3ed299b1361a2bd98f08be078354c78dc152ac97f9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QB/CodeAnalysis/Binding/ConstantFolding.vb: src/qbasic/QB/CodeAnalysis/Binding/ConstantFolding.vb changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 257 in ConstantFolding.Fold at line 44. 4 of those changes were fix/bug commits, and the other 4 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Binding/ConstantFolding.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ConstantFolding.vb"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"20fd18dd9431cc04d45dbc6c0b484e3762262ba75b5556c4c48591e9b99bbc55"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QBLib/Video.vb: src/qbasic/QBLib/Video.vb changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 66 in Video.INKEY at line 2095. 4 of those changes were fix/bug commits, and the other 11 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QBLib/Video.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":2095}}}],"partialFingerprints":{"codehealthFindingId/v1":"cce4eeb1f201d7b4409a3f2a35a0fd00fdb7879e79e530bf5824432b36a7f5a8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QB/CodeAnalysis/Syntax/SyntaxFacts.vb: src/qbasic/QB/CodeAnalysis/Syntax/SyntaxFacts.vb changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 195 in SyntaxFacts.GetText at line 287. 1 of those changes was a fix/bug commit, and the other 2 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Syntax/SyntaxFacts.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxFacts.vb"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"40ef980eae72c407fcb3c70911b2f2c8363c1da00d4bd22d5cf17a251b945b31"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb: src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 66 in Lexer.ReadIdentifierOrKeyword at line 551. 2 of those changes were fix/bug commits, and the other 6 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"334327db38c77fa9e8c72624fc732e79d499dd9fbfef5020fa99155b3d2b1a4c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/Common.vb: src/qbasic/Common.vb changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 78 in Common.GetChar at line 66. 2 of those changes were fix/bug commits, and the other 4 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/Common.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Common.vb"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"5043bafa1491acc77c69ac9f7abbb99168d365392bf47c13b8d08d37f38b858c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QBLib/Audio/WindowsAudio.vb: src/qbasic/QBLib/Audio/WindowsAudio.vb changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in WindowsAudio.StreamingLoop at line 294. 1 of those changes was a fix/bug commit, and the other 19 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QBLib/Audio/WindowsAudio.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/WindowsAudio.vb"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"f39ce18e444bf82d958f748b6fca02d7f81b229f1e44c5650f6d0f2fb4dcc6b7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QBLib/Audio/AudioDevice.vb: src/qbasic/QBLib/Audio/AudioDevice.vb changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in AudioDevice.EmitTone at line 460. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QBLib/Audio/AudioDevice.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/AudioDevice.vb"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"4be8108fbbb5d50d637d41651ff2cb1198f0d95e5a907b041edb29b92f5eb171"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QB/CodeAnalysis/Binding/BoundBinaryOperator.vb: src/qbasic/QB/CodeAnalysis/Binding/BoundBinaryOperator.vb changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 44 in BoundBinaryOperator.Initialize at line 226. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Binding/BoundBinaryOperator.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundBinaryOperator.vb"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"880e1e4bed48856b72a1d9ba7bb1d80799055c83142f89d5079c335f3e206623"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QB/CodeAnalysis/Syntax/QBasicToVbNetRewriter.vb: src/qbasic/QB/CodeAnalysis/Syntax/QBasicToVbNetRewriter.vb changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in QBasicToVbNetRewriter.ConvertPrintStatementUsingSyntax at line 588. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Syntax/QBasicToVbNetRewriter.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/QBasicToVbNetRewriter.vb"},"region":{"startLine":588}}}],"partialFingerprints":{"codehealthFindingId/v1":"12094af3be1a4223e2d4a6e0e293495cbec4cd7fc95d674e433de07ea661d988"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QB/CodeAnalysis/Binding/ControlFlowGraph.vb: src/qbasic/QB/CodeAnalysis/Binding/ControlFlowGraph.vb changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in GraphBuilder.Build at line 163. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Binding/ControlFlowGraph.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ControlFlowGraph.vb"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ed905c8ba62abfe95e468cb919b438a2730c9d8e29a8e44c3d419b4fa8d43f3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QB/CodeAnalysis/Binding/BoundTreeRewriter.vb: src/qbasic/QB/CodeAnalysis/Binding/BoundTreeRewriter.vb changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in BoundTreeRewriter.RewritePrintStatement at line 177. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Binding/BoundTreeRewriter.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundTreeRewriter.vb"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6375ab218fcce7b471adebff2868c16d2f7f9a0f95682edd7e8ca2cec3f0668"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb: src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in SyntaxNode.WriteNodeWithTrivia at line 419. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxNode.vb"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"e63566c13536af34380209e996f92dd43a2115eb364493082af764c5f8265df4"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/qbasic/QB/CodeAnalysis/Lowering/Lowerer.vb: src/qbasic/QB/CodeAnalysis/Lowering/Lowerer.vb changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is Lowerer.RewriteIfStatement at line 77), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201CMore file io stuff; fixed some issues found in the process.\u201D; \u201CFixed FOR issue.\u201D; \u201CFixed stepper in FOR not working\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-01-17..2026-04-17, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-01-17 12:29:34 -05:00\u0027 --until=\u00272026-04-17 12:29:34 -05:00\u0027 --full-history --no-merges -- src/qbasic/QB/CodeAnalysis/Lowering/Lowerer.vb\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Lowering/Lowerer.vb"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d7a9f628b17f2c52977ca09f3a841a9ed3d3016b315b43f6e2e6d0423d11206"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027                \u0027TODO - davidsch - In C\u002B\u002B code there is a call to GreedilyParseColonSeparatedStatements.  Why? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"720ccedf918622c120af9f34be23dd045d27a571c8199904bef1c7e3a9469f7f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027          \u0027TODO Move all of this code to ParseIdentifier \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":1076}}}],"partialFingerprints":{"codehealthFindingId/v1":"f99823fa3f18033942a7e1e363f9c7ec5fcfafb3b47faad25e8859e463586f27"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027                \u0027TODO - Move the check below ExecutableStatementContext.ProcessStatement \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":1188}}}],"partialFingerprints":{"codehealthFindingId/v1":"8943cea6c7033ed7f91ccbdc69a9f6185d13c033c28849d67452ccd85df1725a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027      \u0027TODO - Remove when select is fully implemented \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":1232}}}],"partialFingerprints":{"codehealthFindingId/v1":"0852ac80f147ff20de5ec035c1a971a406426290bcbb442490b66c08815310af"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027        \u0027TODO - Consider moving the error to the Declaration context \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":1715}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b6012fe018c00422b79a2520e1584226e45073d3d64f4c6a13950560cc68b84"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027    \u0027TODO - Compare this method with IsDeclarationStatement. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":1833}}}],"partialFingerprints":{"codehealthFindingId/v1":"27a4adaf50ec44c089fb081e7aa9131ca6c1f86bf934d0ce9b9a0ba44be4ff71"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027    \u0027TODO - davidsch - The error checking here looks like parser doing semantics.  The grammar allows \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":1916}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fba62d97fb99a4ab4daf24ab5f849c55cfe28ebdd1345770e9963c3659917fd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027        \u0027TODO - For better error recovery consider adding a resync here for \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":2137}}}],"partialFingerprints":{"codehealthFindingId/v1":"f39f975a7f56c6a8195fb3e5d1c6f4ee19fdac5a13e986260252d16073fef162"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027        \u0027 TODO - Consider improving the handling of implicit line continuations. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":2276}}}],"partialFingerprints":{"codehealthFindingId/v1":"a55c67403c57357655caed3c8d9a0762f196b5155be714d60e6b81a4a3b41b39"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027          \u0027TODO - davidsch - This used to call ParseInitializer which checked for DotToken before calling ParseAssignmentInitializer \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":2463}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1832ee8276ca79e933461d4ea42e086a141c35fb2b4e39590f12cec0a07683b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027          \u0027TODO - davidsch - Dev10 error is on .Name? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":2560}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f87d2b05bde4a79402420a6960b4df70a24be2c04e76d4aa50e6e98076d7135"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027                \u0027 TODO -  In Dev 10 error is on the xmlName \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":2611}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eb3f9bff6324ff0316a528dbf756d838bb149484b68dee71f4dff008f927acd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027        \u0027TODO - \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":3031}}}],"partialFingerprints":{"codehealthFindingId/v1":"388246ab6e46529d2412ba302fa79c2a210981118683ea87d911a09ffc0e52b3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027        \u0027TODO - davidsch \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":3455}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd7005a50a18b4c00f97ec61c35c8d39caacdbc4f07c2107e9d46b0fc01d58fe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027      \u0027TODO - davidsch Can ParseFunctionOrDelegateDeclaration and \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":3813}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fdfcad6127f5c47275694c5beedeeaabbbf96a1a580c9843916d7b84fbf0278"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027        \u0027 TODO - davidsch - Why do ParseFunctionDeclaration and ParseSubDeclaration have \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":3827}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebd217f42ab9c1a98c41d6c1a5117366d6a8245ace6d118110980e9a19a4db2c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027      \u0027TODO - davidsch \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":3907}}}],"partialFingerprints":{"codehealthFindingId/v1":"a811639f526c8c9b2b072a402d815522207094530b10ce1194c43850576d7b8f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027        \u0027TODO - davidsch - What should be created here? For now use \u002B as a canonical operator \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":3943}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3ae3e1d212e2ae50429308874204fbb3a737f1402473f4c240c05b83d693050"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027        \u0027TODO - davidsch - Why does operator resync here with different condition than Sub and Function? Seems like these should be consistent. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":3970}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff858b2d1920a013b95fcfd6bb23fc6e232c05ae73e4f8f633a0f6e3ee4284d0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027          \u0027 TODO - Which keyword SUB or FUNCTION? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":4226}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ee59bacc9a9da9307087ec5ac11e4bb569449b58738078c8638e886eef06414"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027          \u0027 TODO - Consider adding this as another case of VerifyExpectedToken \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":4228}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e3ca30a8d44901e3c7532b02972c30cb3e9fd811abb8b4a692d2fb6b4063af8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027          \u0027 TODO - Bug 889301 - Dev10 does a resync here when there is an error.  That prevents ERRID_InvalidParameterSyntax below from \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":4486}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6310f052410bd828c97a53d9a54f41f2c39df8875a8f5bbe1e4e7e1722eca68"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027      \u0027TODO - Move these checks to Binder_Utils.DecodeParameterModifiers \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":4555}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9f1ed4a55bce12685acfc76291f0469feaaac64b286653314f5756833f4c16a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027      \u0027 TODO - Move these errors (ERRID.ERR_DefaultValueForNonOptionalParamout, ERRID.ERR_ObsoleteOptionalWithoutValue) of the parser. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":4653}}}],"partialFingerprints":{"codehealthFindingId/v1":"adaa8ed4d591f5d1dc5b5e9892673ef327414c91cb77cacd3a8d83d5db0aecfb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027        \u0027todo - davidsch - if sub/function keyword is missing. Use the existence of AS to infer Function \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":5117}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd9530736e422eb2320fd7303de7a90b14834166440f513ab4c148d21042aaf6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027    \u0027 TODO: this function is so complex (n^2 loop?) it times out in CC verifier. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":5443}}}],"partialFingerprints":{"codehealthFindingId/v1":"67e53135ef1bf585e67a325a60aaa583c0e4a6eadc05ee76b05e2c4dfa12e31b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027  \u0027TODO - These should be removed.  Checks should be in binding. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Parser/Parser.vb"},"region":{"startLine":6142}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1a3fd42b9c7567d946e39220f9186aa8182bba156ce3bf59a102630e2e44400"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027    \u0027 TODO: this could be vastly simplified if we could ignore line continuations. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Scanner/Scanner.vb"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fb3ee6596fda38e8bf65881b0486b8508085aba90adc83c62e9127d232e5f74"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027      \u0027 TODO: should this be a Require? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Scanner/Scanner.vb"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0773584dc16557ef524c89ac8bfe44c8b15f39ad8f0a7b85e4be529cf670a1a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027            \u0027 TODO: do we allow widechars in keywords? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Scanner/Scanner.vb"},"region":{"startLine":1251}}}],"partialFingerprints":{"codehealthFindingId/v1":"c58e3b9d0be9d1a86c6ca838ac87b6539b1f8b89d3befba9d739ea2e95b7590c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027            \u0027 TODO: do we allow widechars in keywords? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Scanner/Scanner.vb"},"region":{"startLine":1260}}}],"partialFingerprints":{"codehealthFindingId/v1":"75710b5042ac57442300569a7328af03a04a5cf7e0bb4b5574a1c536e35d023b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027            \u0027 TODO: do we allow widechars in keywords? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Scanner/Scanner.vb"},"region":{"startLine":1269}}}],"partialFingerprints":{"codehealthFindingId/v1":"4248d2708fea3a94a68f45bdb64256ed43010ac2f352087827612b07cf5ae368"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027      \u0027 TODO: make sure we get good perf here \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Scanner/Scanner.vb"},"region":{"startLine":1507}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d5ccb2a77af6e0317edee1147b7427374029e9db78789650f8254d1a77cebb6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027            \u0027 TODO: this should be provable? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Scanner/Scanner.vb"},"region":{"startLine":1641}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f8dab150db74712061e3a50698289ae8862437f2d06996b035b6e2c8601fd22"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027            \u0027 TODO: consider interning. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Compilers/Qbx/CodeAnalysis/QBasic/Scanner/Scanner.vb"},"region":{"startLine":1644}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c0fe02b4dd0cf109876544529a5b00c867bf35eec706f1f3c23e641c8fb31e6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to get LTRIM$ with an empty string working... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Tests/QBasic.CodeAnalysis.Tests/EvaluatorTests.vb"},"region":{"startLine":839}}}],"partialFingerprints":{"codehealthFindingId/v1":"d66ebf679bde400f7f94389d4a4adfe2fdede96d76591303b4675ce1833208b3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to get RTRIM$ with an empty string working... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Tests/QBasic.CodeAnalysis.Tests/EvaluatorTests.vb"},"region":{"startLine":859}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b283bafb447f88e3a3c540911188cef3e6852f4a655a3b1e713a139b9bd73fe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to mrege with COMMAND$ (in FunctionTests)... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Tests/QBasic.CodeAnalysis.Tests/EvaluatorTests.vb"},"region":{"startLine":1145}}}],"partialFingerprints":{"codehealthFindingId/v1":"003e9f8253b9b64edc8b82cca6f47c07e6de8e88f1daafae2363b553ed35b8fc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to work on E-notation... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Tests/QBasic.CodeAnalysis.Tests/SampleTests.vb"},"region":{"startLine":1079}}}],"partialFingerprints":{"codehealthFindingId/v1":"00875f70f17596e02e16e61090245d3224e78a15ec15fe0c8ee288e886e941c4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to work on \u0022printing\u0022 E-notation. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Tests/QBasic.CodeAnalysis.Tests/SampleTests.vb"},"region":{"startLine":2275}}}],"partialFingerprints":{"codehealthFindingId/v1":"37cfc6c55d7cbe1460ecb44abb4ecb416536506b2a9fe2eba7b9c2a1b26b2469"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: QBasic results in \u0022 345692811\u0022 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Tests/QBasic.CodeAnalysis.Tests/SampleTests.vb"},"region":{"startLine":2339}}}],"partialFingerprints":{"codehealthFindingId/v1":"7387988b770119e9e61c91933b92e2f7567fa429af4abcfbed5bcaa5b8b230bd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: For now, just call the base. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Console.vb"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"890e5be55dd2c538a13c173ca613f4766fe5018c40b0722f65970fd8fdd71d3e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: For now, just call the base. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":1610}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b3653ab3594ae3b132124641c601ae4f49881c97d616367bc78bf77d1732df1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: For now, just call the base. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":961}}}],"partialFingerprints":{"codehealthFindingId/v1":"c436b9c147805fb873baa4230472075d81eb7acbb1af3e9b613436447ed869c3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: (Possibly) Need to take into account the usage of TAB \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Console.vb"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"090fdf7f92b5b2b284a41d455bd4a97c50db14bdef38fd9200805a691a79af9c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: (Possibly) Need to take into account the usage of TAB \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Video.vb"},"region":{"startLine":992}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ac8b24429fa43059f18af3211fbf9b73f395c5f147b7111339f03a082e5b825"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: (Possibly) Need to take into account the usage of TAB \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1213}}}],"partialFingerprints":{"codehealthFindingId/v1":"23aa48085ee0d74b630a7ba6e66ec500d5d385ba5058643367452baf81cbecf0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to actually implement... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Console.vb"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"a60c087b3b2bbfdc8b0a46e18befdde50003b03f98c466e74a99c31009141bf0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: \u0027NOTE: End statement cannot be used in a class library project. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Development.vb"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"35f08124d8ee47ef19088969aaed52f9cdad0275b43d3c1ffeff386818cc652d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to implement play... for now we have silence. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic.compatibility/Multimedia.vb"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6fc489a3e8fa2823e8fac8219a877aef9594d17803dbf47e0302182ad64aa49"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: dispose managed state (managed objects). \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Audio/SoundGenerator.vb"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"db8be124622bc891917dced3aeef3e53c4e2284e43a6d6948d39a4087455f999"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: free unmanaged resources (unmanaged objects) and override Finalize() below. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Audio/SoundGenerator.vb"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e5754007022d05418c879de4224d823869622a7c290ade348a1a1775ffaaa0a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: set large fields to null. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Audio/SoundGenerator.vb"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7de0c723f25768ff3341a0e151a1fc8849abb0111929b90561360ce5272140e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Audio/SoundGenerator.vb"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"7970588048332bc8b82c6fa081400dde2ccc5199e88ad68024867b87353187a3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 Todo, need to remove the last line segment. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":3584}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc73d972decf8913f310551d15fcb7d74d11272d0c7a09e6bcf02f6ba2035fec"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: May have to do some work with segments... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":3799}}}],"partialFingerprints":{"codehealthFindingId/v1":"e38f22597c2b3bdb432ff95c06d328bb039f8e04d7d571cbb056cd073f0d1baa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: need to check constraints against m_topRow and m_bottomRow (VIEW PRINT) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":3852}}}],"partialFingerprints":{"codehealthFindingId/v1":"281d4fd42c3e61e6d26666cd6dc0216df38a641faa549ec6d7ec62de380f9712"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027      \u0027TODO: Handle \u0022border\u0022. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":4240}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4e92c0b30d9fafa22ed37697b5a24ea5a413f1abd9292f4e4155d7d223ff53b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to only adjust segments that are in the view range. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/Display.vb"},"region":{"startLine":4923}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2ddf09bacdb5faa2cfc9955342b4fbc34bfce5e30bb5ed89d87ce60d1be2577"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: \u0027HACK: to get same behavior as GW-BASIC, need to \u0022confuse\u0022 things. \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Extensions.vb"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"1423b95d89cd68b7fd094cf864427eb06320014416155e5b879d841ab6578863"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027  \u0027TODO: Implement TRACE eventing for Amiga or QBasic. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":1668}}}],"partialFingerprints":{"codehealthFindingId/v1":"137ec9451fae141bcc862a9e07b4384ed0c4498c6a8f8adbb963a8b3b264da90"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027  \u0027TODO: Need to determine \u0022last encountered line number\u0022. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2030}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2451b68f7e590d8ad4b4053ca724d25e1af264487579ca1b3060586e5eab876"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027  \u0027TODO: Need to determine \u0022last encountered line number\u0022. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":2033}}}],"partialFingerprints":{"codehealthFindingId/v1":"75da4258266e69fc0565e69b9795d1002fd595fe452801092dfeaaa4e220a667"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Consider implementing memory constraints similar to original GW-BASIC. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":3361}}}],"partialFingerprints":{"codehealthFindingId/v1":"b21b2492ec07c6c4c18b2ecb95442167fdda5c0db1cca07fe651741fa66a9de6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Not sure what this code is supposed to be doing. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":3525}}}],"partialFingerprints":{"codehealthFindingId/v1":"575e70a3b740589a7de0304800bc466b31d45c66ba0da0e10d91d809fe587b4f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 Recently added... TODO: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":4910}}}],"partialFingerprints":{"codehealthFindingId/v1":"55415f7daf4cc1499bf3eafc58c99e3ca6db1fb7d02f97ce4096b60ef724a72f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Handle CHDIR\u0022 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":5662}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcf5262201255611460f460bd68de411ab16c274f080bbd48e55b663ea38f5c5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: ? Handle CHDIR\u0022..\\..\\..\\folder \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":5663}}}],"partialFingerprints":{"codehealthFindingId/v1":"6424992948aadc034e8aaa75ae6a249130e82ae9b3811a46c01c19f92caf0820"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to determine if DEF FN entries are still valid after the merge. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":6053}}}],"partialFingerprints":{"codehealthFindingId/v1":"0027fd3aee76638cbb0eeb5b30637c831f383361a00233e265b38ce1973d9edd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Lower depends on state of OPTION BASE 0 or 1 state. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":7363}}}],"partialFingerprints":{"codehealthFindingId/v1":"354734656e969cdefc573a4ede8c1c5305bbe34ae03c12c0bf9b1ce78a96944f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: May need to store as an interlaced image. (first half, even scan lines, second half, odd scan lines.) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":8676}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceb8d9f33a67f3b27e94865a1fa543bc888f60ebaf80d212f2d87bbb2c7eafa8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: copy pages... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12155}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4f29403d31336523cd1853373963675b6cb98bc2dcce0e978a876610477e4e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to implement the PLAY statement once the SOUND statement is finished. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12171}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4a3e931f571dc19a825b0b00f39099040283968b1ce0d431393cf0181374524"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":12180}}}],"partialFingerprints":{"codehealthFindingId/v1":"c76862eb29355c366fc2c90453dd98c924c31abafc7753d746f904f110ab09fc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":715}}}],"partialFingerprints":{"codehealthFindingId/v1":"e45eaaaa43afaaad0317815f6412100113958641639adde1b58ff8bf27fc3746"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Set seed value... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":14192}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff5c7a8716270b4b4f03674059ceef1ae5ec312691b39c22e9d45720a81fcac5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027    \u0027TODO: Need to verify that line numbers exist -\u003E old number. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":14489}}}],"partialFingerprints":{"codehealthFindingId/v1":"38ad1f7c6e948d19aa2b7f644a0b0ee9127144bad2067867fdc1f9a5dd58c1a0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027    \u0027TODO: Need to verify that new line number (in concideration of old line number) does not cause a crossover situation. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":14490}}}],"partialFingerprints":{"codehealthFindingId/v1":"daa4aeed8088c06ce90c386770729dd17e1137cfe91dd575e2398608e53ddffb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027    \u0027TODO: Need to parse each line for ELSE, GOTO, GOSUB, THEN, ON...GOTO, ON...GOSUB, RESTORE, RESUME and ERL statements and renumber accordingly. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":14491}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab1ef90daebd9b157fef45f170c066bace3baadbba4e3732e0a6ac4fc7fdaea9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027    \u0027TODO: Need to report error on any reference to a nonexistent line number when processing statements. (\u0022Undefined line {0} in {1}.\u0022) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":14492}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa5c2d89c0da8e1e8e6cd59371211d160ce593785066138193e05547f7d8e867"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027  \u0027TODO: Need to work with open file numbers and set accordingly. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16416}}}],"partialFingerprints":{"codehealthFindingId/v1":"61310540fbf53a7b0fc3d0eaa7975929f6e3b1e6f98a7fdebf0963d574cf05ff"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Implementation \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Interactive/Interactive.vb"},"region":{"startLine":16490}}}],"partialFingerprints":{"codehealthFindingId/v1":"664e60776fba0ddf3e403127f399f7674ce2f79c4df2dde079fe155564672590"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to take into account the _ line continuation character. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"63a7252cbca0dd650541c293af6c8e8f6fbb9d603328f7eda0e6a0b1f4a09bd7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to take into account the _ line continuation character. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"9482330de03c86209958038c4762a15dd80b8edca85dab426ad54b5864991a54"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to take into account the _ line continuation character. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd8ddf3e60972cfb86b4d5670ff099c9644ebfd35b9a92f4a5e672b30c9d76de"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to take into account the _ line continuation character. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":974}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5fc81a24cf015c162700107569551dfd597d16fc957275b174fc84b767cefcd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to take into account the _ line continuation character. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Parser/Parser.vb"},"region":{"startLine":1046}}}],"partialFingerprints":{"codehealthFindingId/v1":"779cae3309b8bd93206df1d4c363c6aa4789997c8e56bfd9a86675bcc7dc4225"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: \u0027FIXME:ArgumentException 5 Number is not a numeric type. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/VisualBasic/Conversion.vb"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ed43294ffa9918b6bdc35af3e175bc6cda932ffeea873c4f007968ff84a3cb3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: The original would \u0022mark\u0022 the line before doing the following. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8b282263cef116da59b3436d8cefa91f03c68fa98b0d23096347b37546b139b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Should this be limited? It is in the original, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/DocumentPanel.vb"},"region":{"startLine":1076}}}],"partialFingerprints":{"codehealthFindingId/v1":"0097b6d0290c06ae2d84ec6a0f944d6b9cdb19cdb5294b0bb67f3d4dd25ae7b0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Determine current position within the scrollbars... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/HelpPanel.vb"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"c678acee8c7a53951f11e385955737953a5d543c22e781af6434f14e1a3b9f3e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027    \u0027\u0027\u0027TODO: need to figure out a way to block the a beep until the currently active beep is completed. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Implementation/Sound.vb"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cb5dfdb9993531740d7ea17abc70c122211c06607a483e28cf6164ba19ac697"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: How to set the icon on Linux? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1270}}}],"partialFingerprints":{"codehealthFindingId/v1":"f60926f2659ec4cbf10cb85d9a297f9ca8866c64311ac0a3dc8ee72f0a3a8af7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Take a \u0022snapshot\u0022 of the screen \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1464}}}],"partialFingerprints":{"codehealthFindingId/v1":"7898a8c4bad68a6bad0639af6587d2a8c1782363ec78e026926a01f1834812e2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: if in a document and on a keyword, open help. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1780}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d8f87a084fccbddbc7092a15585a3bba5e6cfd83411265c206cdf4a32a63ba"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to determine how/where this value is overflowing... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":1993}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d79c3f1f967bbcd47ea47b69a2074cfdbb02aa9c8e405bc64241e287de8493"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Program.vb"},"region":{"startLine":959}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b1a35d4939f8a5d4abcd544434a0c48d5823f4bdc9b2e5250c7ec1b0110a55e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1311}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c4546a911026bc618fe61f6b2b691e5f11f7ca3a436031a263f56a1592d2124"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1315}}}],"partialFingerprints":{"codehealthFindingId/v1":"97549130e1ff4297715a9b2c691ede030c8553e3c7a0596824b6ffd6e51785b5"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":5137}}}],"partialFingerprints":{"codehealthFindingId/v1":"070bbafee24785daf58de48848276ba253fc37d5e32f83bc58b69d391dc4dd28"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/GwBasicToQBasicRewriter.vb"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"4924cf68dd51e0e02e716868c181b733beeb4f7bce85c4b95e5a07462a3c0cfd"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/LinuxAudio.vb"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f348ffc0c21f264f5a85c47fc638042feb9272c06adb1ae1259692296331b98"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/LinuxAudio.vb"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcdab0fbeb77f42946a3e1644da7659c848a5dc2f24701b3e137c3bbd49118cc"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/LinuxAudio.vb"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3201f75cdf39775a5dbef32539b57a6c53b389c81a49eed90d8261a7eb60e55"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/LinuxAudio.vb"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"73de0c4ec4f6e8cda477cf08b32dea19b03dde10b0cab26afe5c3bdab164bec1"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Audio/WindowsAudio.vb"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"97ea4b3f881efc5e6570a5997105ba222bc378f87446318940fefbf76c463f3b"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":939}}}],"partialFingerprints":{"codehealthFindingId/v1":"40aaf5c50a7bbc45179661ee2865915c04bf904a9976aaaa01aa670ca8025f9a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027\u0027TODO: Need to figure out a way to significantly improve the following code. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7d44353d9c2e18090005d40912c1ca0edc56e859e99b6d4b61d291b85588c86"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027            \u0027TODO: Need to transform the LineNumberTrivia into a numbered Label. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ba1d77d474b3d64e1127b8f0c1c3fc2762d998672a1f66886ae367a5ecf4c96"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to transform the LineNumberTrivia into a numbered Label. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"eddd8172ed783617aaa5830aa1f1da2f1b798f77fb7c60ad43b69177b9448f3a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Handle overloading/optional parameters. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":575}}}],"partialFingerprints":{"codehealthFindingId/v1":"affcdb7f28f2413f79a590adb1c5ec6df93ae0f86fafae4db5f5d2b49b4b97bb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: This needs to be set based on current DEFINT, etc. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1642}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a9426b341da7b6f2e09b48888fbe2258a1d9c611c94d2062cf14eb6907f5255"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: This needs to be set based on current DEFINT, etc. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1700}}}],"partialFingerprints":{"codehealthFindingId/v1":"6de7ef7920313eb908eaba907f62bd7b7f4eda62a148b0bbbd8a3759eabacddf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Infer???? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1702}}}],"partialFingerprints":{"codehealthFindingId/v1":"703565d257a3cc703ae4c1041f3209e7b26b623050823630c4707405a5137efb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027        \u0027TODO: This needs to be set based on current DEFINT, etc. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1817}}}],"partialFingerprints":{"codehealthFindingId/v1":"0788691eab3f4bbbdee0f789e51005c475ce860748bbbc9f999aaf0a16d68f95"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027        \u0027TODO: Infer???? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/Binder.vb"},"region":{"startLine":1819}}}],"partialFingerprints":{"codehealthFindingId/v1":"437e21b0bc31f022a1d49b1299f24e4d598a4167d803b2d485fffb1c98b68e8d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Consider having a \u0022raw\u0022 bound tree view containing the following... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundNode.vb"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"3845d1357bab73c39c029086d14d07929905ec9689b3e8e1aba2ff09addc8cab"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: \u0022A\u0022c \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundNodePrinter.vb"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"eea5e7a51be8c974c467137ab78f2308f5c1462a9e8fb02243a9cbe7e60725da"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Might be OK; but could cause problems in *some* situations; see directly above this code. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundTreeRewriter.vb"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe7afb4a188fd716e1b02233427f4d2686f5f1cc79d4bd1ce5073273cba029db"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Might be OK; but could cause problems in *some* situations; see directly above this code. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundTreeRewriter.vb"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"88129123f6de883988c3f81f1b986a5699e5b4a351568331614d493fea458b8a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Might be OK; but could cause problems in *some* situations; see directly above this code. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ControlFlowGraph.vb"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"5560297b2b35fad635494250ec158630158834347db67a3805acbad5ff4449fc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Might be OK; but could cause problems in *some* situations; see directly above this code. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ControlFlowGraph.vb"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"962151a7856f4fd4c883fc637c62a041b025f6be498fc8c9dc240add339ed5fc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: need to lower the parameter(s) of \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/BoundTreeRewriter.vb"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a659674ca8bfa11f7cf7a726b1f319408a63ea05e55309601cdc35bdc425187"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to revisit this in the future to see if there is a way to \u0022detect\u0022 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Binding/ControlFlowGraph.vb"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"06dc0405a7612cf677b1b3b763f6857d702ab578437550bcfdc76d6725413cfd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: References should be part of the compilation, not arguments for Emit \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Compilation.vb"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb2b2ed9e5e5f5b46653f53d33f3962c3bee061e36e24d4f69351fdf390e7ada"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: This constructor does too much. Resolution should be factored out. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/MsilEmitter.vb"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f7496b86c553d2a4d3fd3ef2ce9bc3be45acabc74bd985403c97de55276dc46"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Implement short-circuit evaluation #111"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/MsilEmitter.vb"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f63c360253d0426286bd164446d77acd9bae220341d04d39e55761457d866a1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Implement short-circuit evaluation #111"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Emit/MsilEmitter.vb"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aa0cb305dc77e662d6eef47d085e8674bda21a04a6bb829e35eaa1808d229af"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to make this scoped. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac6c4652ff36cb3d22d9ecbcdaef205b85fcaeed56f8492777b850dc8f2f611c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to see if done within a subroutine (GOSUB?)... if so, generate \u0022Return without GOSUB\u0022 error. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":747}}}],"partialFingerprints":{"codehealthFindingId/v1":"54a257abf6242cf9067f2cea5d2906d3400a4c318e733574a071e6aefe96cec8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Revisit after SCREEN, WIDTH, VIEW. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":767}}}],"partialFingerprints":{"codehealthFindingId/v1":"37a3075866711b64d7ce9f7f7352def3a38bd249d7af18bc4b39780c9f99e040"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Revisit after SCREEN, WIDTH, VIEW. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":770}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9fc82216e7f9a0d6afcb432dd5fa7afbbbfa5fa16da14f066e3ccbac31d2892"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Check in-range for values/types. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"899447eb18a45237f6b107e9f67d340145d53dbeb833b4ac99453d78f907c701"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to determine if this is a \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1111}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1b6f7ce59d878405ebc6743abf828a30f991c40c5a15cad8442d2cf569e4d82"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: Implement actual date setting if needed \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1519}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b48d1af1219c5f8d05f90dd0d6dcdb46a0d944046cd315c81a92c77986703ec"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: Implement actual time setting if needed \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":1528}}}],"partialFingerprints":{"codehealthFindingId/v1":"56dfff6087f880173bdcac412afaa5369a8bf996c2467499fbc447c7e778f6b5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: Check for other ON events (COM, KEY, PEN, PLAY, STRIG) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2104}}}],"partialFingerprints":{"codehealthFindingId/v1":"819375ff0d42618d6b053c09f6313e624522fd8495846eca327b9263c5e867b5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: Implement SPC function - for now just print spaces \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2438}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c429027450947ef14be24be57a05df0cfed7f0f399e48499b9390c86464b72e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: Implement TAB function - for now just print \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Evaluator.vb"},"region":{"startLine":2443}}}],"partialFingerprints":{"codehealthFindingId/v1":"24cf5b615bf43b190c447d73b742dba93c6f69358a9c8cceef8ed91139d76b6c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: Consider creating a BoundNodeFactory to construct nodes to make lowering easier to read. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Lowering/Lowerer.vb"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"723949efea78ac9e23702d1522b1911da27a94ea06db395804c379f37d345f30"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 TODO: Constructors should be internal \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Symbols/Symbol.vb"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a755e0912a85065d6f0ddee6b0051dc9c3a70cf80c343cb6f21dca88f020adf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Determine if we want to allow unterminated string literals??? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"94ad70c562befe55ee695973975375b3c7d07f3e533eaad76ff9c6ee00abf967"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Forced Literal Types \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Lexer.vb"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf628abc09edf4a94f47a27f945d5e517a54f16a967350f464f62b6b77cc2c43"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Are the first two characters FN?  If not, error! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":1262}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f3b4cce1a5103693a326baed442e8c0db3fe69547532c1a21ad2640e9cc7e82"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: How to determine if what is after the equal \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":2519}}}],"partialFingerprints":{"codehealthFindingId/v1":"43bcb6a9460c6d5f491f5f39167f26f661e670005ab84a2256370fd246357325"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to decide how to handle WEND and END WHILE... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":4036}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b5b948478e2f95ef36d0c5a17b69b6f8c5b3d5cc835bea35dd5751a03023390"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Need to determine if there is an expression and whether or not it is a string or numeric... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/Parser.vb"},"region":{"startLine":4065}}}],"partialFingerprints":{"codehealthFindingId/v1":"986354082564efd83065795323c990ee227a7f55d4ea221710d51384a7e632d7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: Consider additional operators... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QB/CodeAnalysis/Syntax/SyntaxFacts.vb"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"173e39538be1bc0809ff3938e68ce7f98fcce2dec78716967753f0bfc99f687f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: This is just so that the unit test will pass when running in --stdout mode. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":1982}}}],"partialFingerprints":{"codehealthFindingId/v1":"8be96d0da009e6c19e678678d0c158feadde18abe224018f4f204d664682ee57"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027 For now, return empty string (TODO: implement GUI key detection) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/QBLib/Video.vb"},"region":{"startLine":2197}}}],"partialFingerprints":{"codehealthFindingId/v1":"f77386008f7a0bf389a827070b34372f82aaa5dd3a023b771c029c70ff6adbf5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: there\u0027s a path in the textbox... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/SaveAsDialog.vb"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"64f53574df8b1bd711a7f397efad032cdde00f222a04bbe30deab5f9985c96c0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: \u0027TODO: change up one directory (if possible) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060\u0027 REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/SaveAsDialog.vb"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ca0ab4879bf7d7ab93fb5d14cbe6b6c5904ab4f87256cb446232a3fd0ba6a2"}},{"ruleId":"D18","level":"warning","message":{"text":"Solution references a project that does not exist: \u0060src/QBasic.sln\u0060 declares 1 project file(s) that are missing from the tree (\u0060vbPixelGameEngine.vbproj\u0060). A solution-level restore or build fails on a dangling reference, so anyone building the solution rather than an individual project is blocked. Delete the stale entry from the solution, or restore the missing project file."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/QBasic.sln"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"628e2fb073bd28c2d51c81f2ddebe0c1d1a5d6265a00225d5cf4ba52cdb27c49"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no architecture or design documentation: The README documents only a language reference and character set, with no architecture or design documentation despite the outline naming those sections. Add an Architecture section describing how the QBasic interpreter is structured (input parsing, tokenization, semantics engine) so readers can understand the project\u0027s shape."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"documentation/README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef28c822785df939486b308989ca444f48ef9e5ee4d1784399cfcdb8825f896f"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found. No recognised ADR directory (\u0060docs/adr/\u0060, \u0060docs/decisions/\u0060, \u0060adr/\u0060, \u0060docs/rfcs/\u0060, an \u0060ADR0001/\u0060 folder, or their siblings) exists anywhere in this tree. What was searched, so you can tell an empty log from a search that missed one: every directory under the tree (build output, dependencies and VCS metadata excepted), for a document that is either any non-index page inside a recognised ADR directory, whatever its name and however deeply nested (\u0060docs/adr/use-postgres.md\u0060, \u0060docs/adr/2024/0001-x.md\u0060); or a file anywhere whose name is ADR-shaped (\u00600001-use-postgres.md\u0060, \u0060adr-012-caching.md\u0060); or, when neither turned anything up, a document carrying the decision-record signature (an \u0022Architecture Decision Record\u0022 heading, or Status / Context / Decision / Consequences as section headings). A decision log that clears none of these \u2014 unnumbered files outside any recognised directory, without those headings \u2014 is not seen by this check and this row is then wrong. If that is your case, say so rather than renaming anything; otherwise, consider recording architectural decisions in \u0060docs/adr/\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 1 of 5 project(s) overshoot their size bounds, lowering Project Cohesion to 6.0/10. The most over is \u0060QBasic\u0060 (70677 LoC, 202 public types across 22 namespaces). Review these for cohesion \u2014 split a project that spans unrelated responsibilities."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d5a94650dc74886a0f1f08eb9fb6775f1fc395279ef7e901c970c9d26f767a72"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: IDirect (30 members): \u0060IDirect\u0060 declares 30 members: \u0060Screen\u0060, \u0060VisualPage\u0060, \u0060ScreenWidth\u0060, \u0060ScreenHeight\u0060, \u0060Pcopy\u0060, \u0060Point\u0060, \u0060ActivePage\u0060, \u0060Circle\u0060, \u0060Line\u0060, \u0060Pset\u0060, \u0060Pset\u0060, \u0060Preset\u0060, \u0060Preset\u0060, \u0060ScreenMode\u0060, \u0060IsKeyOn\u0060, \u0060Screen\u0060, \u0060ViewPrint\u0060, \u0060ViewPrint\u0060, \u0060KeyOn\u0060, \u0060Cls\u0060, \u0060CsrLin\u0060, \u0060Pos\u0060, \u0060Locate\u0060, \u0060Color\u0060, \u0060Color\u0060, \u0060Color\u0060, \u0060SetPalette\u0060, \u0060SetPalette\u0060, \u0060WriteCharacter\u0060, \u0060View\u0060. Counted as the author wrote them \u2014 a property is ONE member and its get/set accessors are not counted separately, and an event counts once. Those 30 declarations carry 23 distinct name(s), so part of the width is overloading rather than separate responsibilities \u2014 but 23 operations clears the \u003E15 bar on its own, so the row is about responsibilities, not signatures. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/Display/IDirect.vb"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"2531832c177a11465ba9cd1154bfce1a97d0ce138d43d6dfab95797c4c200aef"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: IVirtualFileSystem (17 members): \u0060IVirtualFileSystem\u0060 declares 17 members: \u0060ChDir\u0060, \u0060Files\u0060, \u0060Kill\u0060, \u0060Load\u0060, \u0060MkDir\u0060, \u0060Name\u0060, \u0060RmDir\u0060, \u0060Save\u0060, \u0060Open\u0060, \u0060Read\u0060, \u0060Input\u0060, \u0060Write\u0060, \u0060Lock\u0060, \u0060Unlock\u0060, \u0060Close\u0060, \u0060InitialPath\u0060, \u0060IsEightDotThree\u0060. Counted as the author wrote them \u2014 a property is ONE member and its get/set accessors are not counted separately, and an event counts once. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/qbasic/Basic/IO/IVirtualFileSystem.vb"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebbb3e01e58846b4f26b40a058a7c35ef9d26f6b24800006774c66bedff47bd7"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"M2","level":"note","message":{"text":"No architecture diagram/doc: No C4/Structurizr/PlantUML/Mermaid/Graphviz/D2 diagram, no drawn diagram named for the architecture, no file named \u0060architecture\u0060 or \u0060design\u0060 in any markup this check reads, and nothing in the README, docs or contributor guides that announces the shape \u2014 no \u0060## Architecture\u0060 heading, no \u0022architecture overview\u0022/\u0022high-level design\u0022 phrasing, no \u0022the architecture is \u2026\u0022 introduction, no guided code tour. A shape laid out in prose that never names itself as the architecture is not visible to this check, and neither is one kept outside the repository, so this row reports the absence of a re-findable shape document \u2014 not evidence that nobody wrote the shape down."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0c190e7c159d1850ee706c3ac4486e151e8a4fe169de4bf61436b9f399654f06"}},{"ruleId":"M3","level":"note","message":{"text":"Inconsistent root namespaces: Only 2/5 projects share a common root namespace \u2014 the code\u0027s module identity is inconsistent."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c8031c9fb77ad97c2e4a8ddb29978f4bf30140d481913bd7fde8b5adbbb83ede"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: README claims QBASIC is native to Windows/Linux and possibly other platforms but there are NO projects targeting Linux or cross-platform \u2014 reported by the model that read the README against this repository; no term search was run for this one, so nothing here has been checked against the tree. Treat it as a reading to confirm, not as a measured contradiction: verify it against the code before acting on it, and if the footprint it describes does exist, this row is wrong."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"343bbbd51ceb8de7a9ff88d79f7c797abf9b5921f8727b67b4d0f4f8a22c5e49"}},{"ruleId":"P1","level":"warning","message":{"text":"No CI pipeline: No CI workflow found (.github/workflows, azure-pipelines.yml, .gitlab-ci.yml, \u2026) \u2014 changes aren\u0027t gated by an automated build/test."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"44f01af96e50474fba2df84d95ddf4f7e1d34c29c307830b9efc9057daa6b670"}},{"ruleId":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add a Roslyn security analyzer package referenced from the project (the analyzer packages do analyse VB.NET), plus gitleaks for committed secrets \u2014 CodeQL has no VB.NET extractor, so its csharp pack would extract nothing from this tree and then report it clean \u2014 this repository has no CI pipeline yet, so run it locally to clear the existing findings, then make it a step of the first workflow you add so a regression fails the build. What was searched, so you can tell an absence from a miss: the 0 CI workflow file(s) in this repository, and the scanner and linter configuration checked in beside them. A scan that runs outside CI, one configured in your forge\u0027s web UI rather than in a committed file, or a tool whose name is none of those this check carries, is not seen \u2014 if that is your case the row is wrong, and saying so is more useful than adding a second scanner."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6e54424179c892f03ef2fd003130ac4bd43f39bbf3b1ca0a0143e25acb80ec87"}},{"ruleId":"P6","level":"note","message":{"text":"No changelog: No CHANGELOG/HISTORY/RELEASES file \u2014 what shipped when isn\u0027t easy to reconstruct for support or audit. (Versioning/tagging makes releases traceable, but a changelog records the what.)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dda5aa5aed8cbb292c3ef2b733bc138f614293ae6426c85e98bf31ef330d9415"}},{"ruleId":"SC1","level":"warning","message":{"text":"NuGet dependencies are not locked: No packages.lock.json and no central package management \u2014 restores aren\u0027t reproducible or pinned (SSDF PW.4.4). Enable \u003CRestorePackagesWithLockFile\u003Etrue\u003C/RestorePackagesWithLockFile\u003E (commit the lockfile) or adopt Directory.Packages.props. Advisory \u2014 never scored."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0a97b4f69ccac509400ece7eedefb06d3ede0522cd4d8bcb5c068bea719545a6"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","informationUri":"https://cwe.mitre.org/","isComprehensive":false,"shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Command Injection","shortDescription":{"text":"Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"OS Command Injection","shortDescription":{"text":"OS Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Cross-site Scripting (XSS)","shortDescription":{"text":"Cross-site Scripting (XSS)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"SQL Injection","shortDescription":{"text":"SQL Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Code Injection","shortDescription":{"text":"Code Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":0,"secretScannerRunsExcluded":0}}}]}