{"$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":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"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":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"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":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"]}},{"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":"D37","name":"Vulnerability-disclosure Policy","shortDescription":{"text":"Vulnerability-disclosure Policy"},"helpUri":"https://codehealth.canine.dev/dimensions/D37","relationships":[{"target":{"id":"CWE-1059","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1059"]}},{"id":"D43","name":"Malicious Dependencies","shortDescription":{"text":"Malicious Dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/D43","relationships":[{"target":{"id":"CWE-506","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"]}},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"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":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"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":"R1","name":"Type Safety","shortDescription":{"text":"Type Safety"},"helpUri":"https://codehealth.canine.dev/dimensions/R1"},{"id":"R10","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/R10"},{"id":"R2","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/R2"},{"id":"R3","name":"Large Files","shortDescription":{"text":"Large Files"},"helpUri":"https://codehealth.canine.dev/dimensions/R3"},{"id":"R4","name":"Test Coverage","shortDescription":{"text":"Test Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/R4"},{"id":"R5","name":"Dependency Freshness","shortDescription":{"text":"Dependency Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/R5"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (44 shared lines): internal/ipc/conn_async.go:123-197 | internal/ipc/conn_sync.go:84-158 \u2014 These two members are variants of one another: 44 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":"internal/ipc/conn_async.go"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"b61bd91903da7680492e428c369a0da3c50dfa8a98a19ae8eb6eeb9ece578cea"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (9 members, 50\u002B identical tokens): internal/api/session.go:1540-1561 | internal/api/session.go:1714-1727 | internal/api/session.go:1730-1743 | internal/api/session.go:2291-2312 | internal/api/session.go:2347-2360 | internal/api/session.go:2453-2474 | internal/api/session.go:3184-3200 | internal/api/session.go:3203-3216 | internal/api/session.go:3220-3241 \u2014 These 9 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 9 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 9 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":1540}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ec31e00f4566bcd004f75528343bca437ec72cd726235567a209d359abfb5df"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (9 members, 50\u002B identical tokens): internal/api/session.go:1692-1711 | internal/api/session.go:2975-2998 | internal/api/session.go:3002-3025 | internal/api/session.go:3029-3047 | internal/api/session.go:3067-3097 | internal/api/session.go:3101-3119 | internal/api/session.go:3140-3158 | internal/api/session.go:3162-3180 | internal/api/session.go:3410-3433 \u2014 These 9 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 9 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 9 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":1692}}}],"partialFingerprints":{"codehealthFindingId/v1":"241613ca3400c5b6be8acad305e25247ef71351598cef080271a4cd7fd60fb00"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): internal/api/session.go:1439-1463 | internal/api/session.go:1468-1485 | internal/api/session.go:1510-1536 | internal/api/session.go:1769-1793 | internal/api/session.go:1796-1822 \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":"internal/api/session.go"},"region":{"startLine":1439}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d7fb1b2232d1b5166544bcbf6c379721aa29f5972a640011c1c462d3764f020"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): internal/api/session.go:2315-2328 | internal/api/session.go:2331-2344 | internal/api/session.go:2363-2376 | internal/api/session.go:3050-3063 | internal/api/session.go:3123-3136 \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":"internal/api/session.go"},"region":{"startLine":2315}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbc3afb3e146135cf528feead552e3c07ed65be2b319208cda165af0ccf81400"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): internal/api/session.go:3281-3302 | internal/api/session.go:3307-3334 | internal/api/session.go:3338-3359 | internal/api/session.go:3363-3387 | internal/api/session.go:3770-3796 \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":"internal/api/session.go"},"region":{"startLine":3281}}}],"partialFingerprints":{"codehealthFindingId/v1":"c89f7f0e43c6b6b146c0022798e7fc557c031216707bf9dc8c0920ef63f4fb28"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): internal/printer/printer.go:1690-1704 | internal/printer/printer.go:1715-1727 | internal/printer/printer.go:1729-1743 | internal/printer/printer.go:2646-2662 | internal/printer/printer.go:3735-3753 \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":"internal/printer/printer.go"},"region":{"startLine":1690}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebdbcee53e3feb7e2c554c8f317db3376cef41241cff87e57f3a138e7f3c39b1"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): internal/testutil/contentmappertest/diagnostic_code_collision.go:15-41 | internal/testutil/contentmappertest/supplemental.go:13-33 | internal/testutil/contentmappertest/verbatim.go:15-32 | internal/testutil/contentmappertest/verbatim.go:34-52 \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":"internal/testutil/contentmappertest/diagnostic_code_collision.go"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c124562578e906537120750241657f7c74fc6bfd9c416be847ff6ea92ab9a95"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): internal/transformers/estransforms/async.go:324-354 | internal/transformers/estransforms/async.go:396-425 | internal/transformers/estransforms/async.go:431-460 | internal/transformers/estransforms/async.go:466-500 \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":"internal/transformers/estransforms/async.go"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"515241e3c62eccbdad084f13b8490c71b1abc0cba3f96e767ae00d52e7b1d9cf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (43 lines \u00D7 2): internal/checker/services.go:645-687 | internal/ls/findallreferences.go:1644-1686 \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. Each matched range is the entire body of the declaration above it, so the region is already a complete unit: move that whole declaration to the shared location and have each site call it, rather than lifting the lines out of their bodies. Any \u0060return\u0060 inside it is the body\u0027s own exit and keeps its meaning in the moved unit."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/services.go"},"region":{"startLine":645}}}],"partialFingerprints":{"codehealthFindingId/v1":"b742fa8dcda61f595c644d95c25be43227ddca21a9edd4db20091605d2a977e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26\u201339 lines \u00D7 2): internal/format/indent.go:150-175 | internal/ls/format.go:159-197 \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 \u0060internal/format/indent.go:150\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. 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. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060internal/format/indent.go:149\u0060 calls \u0060GetTokenAtPosition\u0060 and \u0060internal/ls/format.go:158\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":"internal/format/indent.go"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"a967cd6d5dc88102690b4e9ab83ed70ff6b0cb38e931bc2af943071e38104b4e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (37 lines \u00D7 2): internal/transformers/tstransforms/runtimesyntax.go:296-332 | internal/transformers/tstransforms/runtimesyntax.go:438-474 \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 \u0060internal/transformers/tstransforms/runtimesyntax.go:296\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":"internal/transformers/tstransforms/runtimesyntax.go"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bdb13485267161fc7b23da0dbc5052d85d6f41da6bd9215006d8e47853efd9d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 2): internal/fourslash/fourslash.go:4901-4933 | internal/fourslash/fourslash.go:4980-5012 \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":"internal/fourslash/fourslash.go"},"region":{"startLine":4901}}}],"partialFingerprints":{"codehealthFindingId/v1":"964a7dbbb3c0bcb3f2fc956399ffbd501e3cca8634b6cf1b8a9c34b41fb7868e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): internal/fswatch/fanotify_linux.go:237-263 | internal/fswatch/inotify_linux.go:152-178 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/fswatch/fanotify_linux.go:237\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. 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":"internal/fswatch/fanotify_linux.go"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c5e63cee9925a4e9efb6332d4533ea348e9a4f27974b25ee4f8afa6c58eab3e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 3): internal/transformers/estransforms/forawait.go:586-611 | internal/transformers/estransforms/forawait.go:631-656 | internal/transformers/estransforms/forawait.go:693-718 \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":"internal/transformers/estransforms/forawait.go"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"253ed327b7998d3b9369ffa8131efb347f1d3121cbaa2a770afdb8524ac100c8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): internal/transformers/tstransforms/runtimesyntax.go:682-706 | internal/transformers/tstransforms/runtimesyntax.go:721-745 \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":"internal/transformers/tstransforms/runtimesyntax.go"},"region":{"startLine":682}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9557df8b69d02b479b2d85c720573e1fb9ae5cfd1adb1fd6a56095da05655f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23\u201324 lines \u00D7 2): internal/fourslash/fourslash.go:1454-1476 | internal/fourslash/fourslash.go:1506-1529 \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 \u0060internal/fourslash/fourslash.go:1454\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":"internal/fourslash/fourslash.go"},"region":{"startLine":1454}}}],"partialFingerprints":{"codehealthFindingId/v1":"e54fa7f46439e45ce4e34529b1d47114a3bb4cf6ae928aa7445ece3453b94a2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): internal/fourslash/fourslash.go:2908-2931 | internal/fourslash/fourslash.go:2968-2991 \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 \u0060internal/fourslash/fourslash.go:2908\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":"internal/fourslash/fourslash.go"},"region":{"startLine":2908}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6ef5288b4cef0ab72d63ff5c6865122371cdb1da1bf3d68e2f2b6ac84bf560e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): internal/transformers/estransforms/classfields.go:3004-3027 | internal/transformers/estransforms/classfields.go:3031-3054 \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 \u0060internal/transformers/estransforms/classfields.go:3004\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":3004}}}],"partialFingerprints":{"codehealthFindingId/v1":"66769061e962548f6adb3c6bd9f62f9d2d9e4d9d1b8a25017f758939a905f5ae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201323 lines \u00D7 2): internal/printer/printer.go:2952-2974 | internal/printer/printer.go:3759-3777 \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 \u0060internal/printer/printer.go:2952\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/printer/printer.go"},"region":{"startLine":2952}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb3d11617db36cbd0a1b5b19623fb1f35143104108b2c94732eff32c9d2bd18c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): internal/fourslash/fourslash.go:5937-5956 | internal/fourslash/fourslash.go:5968-5987 \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 \u0060internal/fourslash/fourslash.go:5937\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":"internal/fourslash/fourslash.go"},"region":{"startLine":5937}}}],"partialFingerprints":{"codehealthFindingId/v1":"346cabbd912dc0298ca7ca3d9900bfcd07a74a04c0b60533ce66f3ae5e550808"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): internal/format/rules.go:66-85 | internal/ls/utilities.go:323-342 \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":"internal/format/rules.go"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f837b5e2104c97b2d377b66596273535298eb77180cd397e5a452288af8631c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): internal/execute/incremental/snapshot.go:243-261 | internal/execute/incremental/snapshot.go:275-293 \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 \u0060internal/execute/incremental/snapshot.go:243\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. 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":"internal/execute/incremental/snapshot.go"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"a31bba650dbcd09fe105ecc78d764f7a3fb14f40f636ee0cb55aef4a8df5a7eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): internal/ipc/conn_async.go:142-160 | internal/ipc/conn_sync.go:103-121 \u2014 before extracting anything, compare \u0060internal/ipc/conn_async.go\u0060 and \u0060internal/ipc/conn_sync.go\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 44 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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/ipc/conn_async.go:142\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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ipc/conn_async.go"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"18f886d088f90676c2c7545cb676b176b78553ec36938bf2cd2deba6923dfa08"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): internal/transformers/jsxtransforms/jsx.go:699-717 | internal/transformers/jsxtransforms/jsx.go:740-758 \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":"internal/transformers/jsxtransforms/jsx.go"},"region":{"startLine":699}}}],"partialFingerprints":{"codehealthFindingId/v1":"8094adcebdf1856c74f8b35ffc49bdfa32e62dcea64898d0179ffe0fd2743d68"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201319 lines \u00D7 2): internal/tspath/path.go:298-313 | internal/tspath/path.go:368-386 \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 \u0060internal/tspath/path.go:298\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. 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":"internal/tspath/path.go"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c42702e1d3daf8ff0a04b1cd89f2fa3ee5417416c054ff07542a85d8837a714"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201318 lines \u00D7 2): internal/api/session.go:1028-1045 | internal/api/session.go:1090-1105 \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":"internal/api/session.go"},"region":{"startLine":1028}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d3dbad8367c217c6ebef2e81342b2c456489e65c7746ad57a156487812159ea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): internal/api/session.go:2501-2518 | internal/api/session.go:2580-2597 \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 register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":2501}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbc37a8839c09ce73f31682522e7d0d0d96ee17c58150a8452f64bb6c9217d28"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): internal/project/configfileregistrybuilder.go:558-575 | internal/project/configfileregistrybuilder.go:596-613 \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 \u0060internal/project/configfileregistrybuilder.go:558\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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, \u0060internal/project/configfileregistrybuilder.go:551\u0060 calls \u0060FileNamesByPath\u0060, \u0060GetMatchedFileSpec\u0060 and \u0060internal/project/configfileregistrybuilder.go:594\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":"internal/project/configfileregistrybuilder.go"},"region":{"startLine":558}}}],"partialFingerprints":{"codehealthFindingId/v1":"26f8c181f68b4446593747e5da459621abae2de52b692c772aa3517082013066"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201318 lines \u00D7 2): internal/transformers/estransforms/async.go:693-710 | internal/transformers/estransforms/forawait.go:744-759 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/transformers/estransforms/async.go:693\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. 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":"internal/transformers/estransforms/async.go"},"region":{"startLine":693}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d01096186124c3a0308fba0f8b456f77ee1db6c9020a43c17523fa4574a4719"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201318 lines \u00D7 2): internal/transformers/moduletransforms/commonjsmodule.go:1563-1580 | internal/transformers/tstransforms/runtimesyntax.go:890-902 \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 \u0060internal/transformers/moduletransforms/commonjsmodule.go:1563\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":"internal/transformers/moduletransforms/commonjsmodule.go"},"region":{"startLine":1563}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b46d5fca640f88881d0f85da0f6cf0e00571ae49c99be74041823c4dbde8958"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201318 lines \u00D7 2): internal/fswatch/kqueue.go:660-673 | internal/fswatch/kqueue.go:683-700 \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":"internal/fswatch/kqueue.go"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d317c0618e25f3cd095de16b03d391bdb76f2ace37497a6d48f5f27eb2a5d5e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): internal/checker/checker.go:6456-6472 | internal/checker/checker.go:6605-6621 \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 \u0060internal/checker/checker.go:6456\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. 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":"internal/checker/checker.go"},"region":{"startLine":6456}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb3f55830db37066864607673a1b19c5dc04d169a900c0c3a031d54c401f5087"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): internal/fourslash/fourslash.go:1836-1852 | internal/fourslash/fourslash.go:1894-1910 \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 \u0060internal/fourslash/fourslash.go:1836\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/fourslash/fourslash.go"},"region":{"startLine":1836}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a910cc8b0deb1bc687880418ec4512d0be095d82d607f2f8e7fcfd895e6236a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): internal/fourslash/fourslash.go:2284-2300 | internal/fourslash/fourslash.go:2398-2414 \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 register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/fourslash.go"},"region":{"startLine":2284}}}],"partialFingerprints":{"codehealthFindingId/v1":"a04daa849965c7ba83f54a32334ef0443f813cd80d0dcc09348a608055ad1946"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): internal/fourslash/fourslash.go:3729-3745 | internal/fourslash/fourslash.go:4734-4750 \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":"internal/fourslash/fourslash.go"},"region":{"startLine":3729}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9e867683548172990622422d7c5c241f25d415e34805ce068c2ec13834f383a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): internal/ls/autoimport/registry.go:942-958 | internal/ls/autoimport/registry.go:972-988 \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 \u0060internal/ls/autoimport/registry.go:942\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":"internal/ls/autoimport/registry.go"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e35ab62db26d8f320d4deda516a58fba6f43ee4fe04fdc87eedb01c4d5721ae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): internal/ls/semantictokens.go:142-158 | internal/ls/semantictokens.go:175-191 \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 \u0060internal/ls/semantictokens.go:142\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. 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":"internal/ls/semantictokens.go"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a573e6fdf257c49cfcb237c27a490cf2836b3054dfea9425a1e1f9f023b99b3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): internal/scanner/scanner.go:2114-2130 | internal/scanner/scanner.go:2162-2178 \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 \u0060internal/scanner/scanner.go:2114\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":"internal/scanner/scanner.go"},"region":{"startLine":2114}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ff460edb7ec4e153d58d1a9fce91a4bb1b74c4cdafa1636371dd28c3dd1b1fd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (4\u201317 lines \u00D7 3): internal/fswatch/kqueue.go:388-404 | internal/fswatch/kqueue.go:491-494 | internal/fswatch/kqueue.go:542-555 \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: \u0060internal/fswatch/kqueue.go:388\u0060 is reached only past a guard at line 377 that tests \u0060entry.watchPath\u0060 and leaves the function early, and \u0060internal/fswatch/kqueue.go:491\u0060 reads \u0060entry.watchPath\u0060 with no such check. What separates these copies is not which lines they run but which PRECONDITION they enforce, so one of them is operating on state the other one refuses. Decide which is intended BEFORE unifying them \u2014 extract the shared part and whichever copy is missing the check keeps running unchecked, and if the guard is the correct behaviour then that hole is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fswatch/kqueue.go"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"c868429a9cddcd55660ea8fb032d2034e96cba4102bada2cffd1277f7e2d8a82"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): internal/compiler/emitter.go:392-407 | internal/compiler/emitter.go:421-436 \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 \u0060internal/compiler/emitter.go:392\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":"internal/compiler/emitter.go"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"92bac3bf284b176b83a7aeae31f3958c514814e9f447ac1201d80c98941463a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): internal/ls/organizeimports.go:203-218 | internal/ls/organizeimports.go:815-830 \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 \u0060internal/ls/organizeimports.go:203\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/ls/organizeimports.go"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb72e1b3cf58650e4a70be36cba0cabff01669779739f42a7545ae9d75336e08"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): internal/transformers/estransforms/async.go:642-656 | internal/transformers/estransforms/forawait.go:841-856 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/transformers/estransforms/async.go:642\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/estransforms/async.go"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa1f2b3eb43a64c0f6eb83708c3019ea83359fa48c2d0e240fcd4f30d3c59e79"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): internal/transformers/jsxtransforms/jsx.go:719-734 | internal/transformers/jsxtransforms/jsx.go:760-775 \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 \u0060internal/transformers/jsxtransforms/jsx.go:719\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/jsxtransforms/jsx.go"},"region":{"startLine":719}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ff027a3373e7e26c729fa3860b83b06dfc5c958db0b4bfa26374fd9dcb30a62"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u201315 lines \u00D7 3): internal/checker/checker.go:8605-8619 | internal/checker/checker.go:8812-8819 | internal/checker/checker.go:8838-8844 \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 \u0060internal/checker/checker.go:8605\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 after the matched lines, \u0060internal/checker/checker.go:8622\u0060 calls \u0060isErrorType\u0060, \u0060TypeArguments\u0060, \u0060error\u0060 and \u0060internal/checker/checker.go:8820\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":"internal/checker/checker.go"},"region":{"startLine":8605}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba4e365d47598126bcf1445835b96ccac564c4183541fc0da30814f2f0b6b4ea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): internal/api/session.go:2107-2121 | internal/api/session.go:2255-2269 \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 \u0060internal/api/session.go:2107\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/api/session.go"},"region":{"startLine":2107}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9de5c3d98052572116d4ce411083d1bdeab83720079ffb2490be48d12f67335"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): internal/execute/incremental/programtosnapshot.go:382-396 | internal/execute/incremental/programtosnapshot.go:419-432 \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":"internal/execute/incremental/programtosnapshot.go"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"0439c3229bc9d645397d5203cad91632c0659c63e892a92f6c05e3c6fca53251"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): internal/fourslash/fourslash.go:2502-2516 | internal/fourslash/fourslash.go:2530-2543 \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 \u0060internal/fourslash/fourslash.go:2502\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":"internal/fourslash/fourslash.go"},"region":{"startLine":2502}}}],"partialFingerprints":{"codehealthFindingId/v1":"e25b94d7c3f2448a09244e2457fd7ac32f679e96d6e0f64d021c3acf77741f4a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): internal/sourcemap/generator.go:274-288 | internal/sourcemap/generator.go:295-309 \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. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060internal/sourcemap/generator.go:311\u0060 calls \u0060New\u0060 and \u0060internal/sourcemap/generator.go:289\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":"internal/sourcemap/generator.go"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f976b9ad6c9bfb4f4ba443163cba8280a1adf647e44af08951993fecba25d17"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): internal/stringutil/js_case.go:70-84 | internal/stringutil/js_case.go:92-106 \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 \u0060internal/stringutil/js_case.go:70\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":"internal/stringutil/js_case.go"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f7c06a03a253c67ec66964cb75da695ec689b617be7b0c4a6c9abc5849e54ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201314 lines \u00D7 2): internal/api/session.go:1412-1425 | internal/api/session.go:3846-3857 \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":"internal/api/session.go"},"region":{"startLine":1412}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c23d600ce942cef44c820495a73d3bba3178b3232b443915ae62b7fbc31e1cf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): internal/api/session.go:1442-1455 | internal/api/session.go:1772-1785 \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 \u0060internal/api/session.go:1442\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. 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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":1442}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7efb51be4d5b1f4d9f550da83beb764c181039940a79068f64d8c8665719d09"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): internal/api/session.go:2081-2094 | internal/api/session.go:2125-2138 \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":"internal/api/session.go"},"region":{"startLine":2081}}}],"partialFingerprints":{"codehealthFindingId/v1":"42bf32e5fa8e9423ddc630da7dd520f2d347cf1da667169dea5078f0d3b4cb89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): internal/api/session.go:2207-2220 | internal/api/session.go:2249-2262 \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":"internal/api/session.go"},"region":{"startLine":2207}}}],"partialFingerprints":{"codehealthFindingId/v1":"211c1a71ffa141748bfca6c958e4aad8ae00e908a08b9c82ab491c10322fdc7b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): internal/api/session.go:2231-2244 | internal/api/session.go:2272-2285 \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":"internal/api/session.go"},"region":{"startLine":2231}}}],"partialFingerprints":{"codehealthFindingId/v1":"3762647e41abcdd3ffe0ca05fa40ae76752709fb18f2e0c2a761398dcef6a10a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): internal/api/session.go:2380-2393 | internal/api/session.go:2399-2411 \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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":2380}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e957977fbf639573bbc2198f1c1acacfa021044317cc62887d7e72d067fcdf8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): internal/ipc/conn_async.go:184-197 | internal/ipc/conn_sync.go:145-158 \u2014 before extracting anything, compare \u0060internal/ipc/conn_async.go\u0060 and \u0060internal/ipc/conn_sync.go\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 44 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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/ipc/conn_async.go:184\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/ipc/conn_async.go"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f15ac7b0e44b4fe7e976f18f89f3cc1ae40cf58989faf0e3e1ead6c73f0a05"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): internal/checker/jsdoc.go:87-100 | internal/ls/jsdoc.go:86-99 \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. Each matched range is the entire body of the declaration above it, so the region is already a complete unit: move that whole declaration to the shared location and have each site call it, rather than lifting the lines out of their bodies. Any \u0060return\u0060 inside it is the body\u0027s own exit and keeps its meaning in the moved unit."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/jsdoc.go"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa0f6c927425b09d6cb14070df6ddc1cd6eb8d0e2518749c1025ff28b409a27"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): internal/transformers/declarations/transform.go:1459-1472 | internal/transformers/declarations/transform.go:1500-1513 \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 \u0060internal/transformers/declarations/transform.go:1459\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, \u0060internal/transformers/declarations/transform.go:1455\u0060 calls \u0060IsIdentifier\u0060, \u0060Text\u0060 and \u0060internal/transformers/declarations/transform.go:1497\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":"internal/transformers/declarations/transform.go"},"region":{"startLine":1459}}}],"partialFingerprints":{"codehealthFindingId/v1":"02d37c297b6ff16069a91fb3473b72d97fbd2afa1ee927be12fe4b30c505b504"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): internal/transformers/tstransforms/metadata.go:190-203 | internal/transformers/tstransforms/metadata.go:230-243 \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 \u0060internal/transformers/tstransforms/metadata.go:190\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":"internal/transformers/tstransforms/metadata.go"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c273e863cc76a90599d030f4071f34e698060ef8e3fc441673202a8aad862f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 5): internal/api/session.go:3282-3294 | internal/api/session.go:3308-3320 | internal/api/session.go:3339-3351 | internal/api/session.go:3364-3376 | internal/api/session.go:3771-3783 \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. 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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":3282}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc45593f0ca887c3c71ca2522108712c1ff82bcf5e3afa7891e3dfd7fa6fdec6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): internal/api/encoder/encoder.go:374-386 | internal/api/encoder/encoder.go:516-528 \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 \u0060internal/api/encoder/encoder.go:374\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/encoder/encoder.go"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"00f3df57044e7bd5192517a2de873df694a091c86d8cb4c1ae07db7084dfab7d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): internal/api/session.go:3262-3274 | internal/api/session.go:3391-3403 \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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":3262}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a49e8d5010002e26dcf90d3b0d55a56ee5cee218077cdb6e2086cef7b2b0d94"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201313 lines \u00D7 2): internal/fourslash/fourslash.go:489-501 | internal/fourslash/fourslash.go:594-604 \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":"internal/fourslash/fourslash.go"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e20dd0a54eb93a4c933250cf7e39ea228334e5e4210571c4b35a8975fa65845"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): internal/ls/completions.go:980-992 | internal/ls/completions.go:1007-1019 \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 \u0060internal/ls/completions.go:980\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/ls/completions.go"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd989b6e914f70b2c8626ccde45ce088466e9e18330050eb6e09b85f13efdbe1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): internal/ls/inlay_hints.go:652-664 | internal/ls/inlay_hints.go:678-690 \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, \u0060internal/ls/inlay_hints.go:691\u0060 calls \u0060visitParametersAndTypeParameters\u0060 and \u0060internal/ls/inlay_hints.go:665\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":"internal/ls/inlay_hints.go"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"23e0b3d016c1d88a41d98c2f94eb2518aa2ea9884d83ea32fc71bed9788cb3fd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): internal/ls/signaturehelp.go:559-571 | internal/ls/signaturehelp.go:637-649 \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 \u0060internal/ls/signaturehelp.go:559\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":"internal/ls/signaturehelp.go"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f381b3b3c7c0459257eff49606152b5be4a06348f164615b0766d56ef88515d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): internal/transformers/declarations/transform.go:2521-2533 | internal/transformers/declarations/transform.go:2549-2561 \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 \u0060internal/transformers/declarations/transform.go:2521\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. 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":"internal/transformers/declarations/transform.go"},"region":{"startLine":2521}}}],"partialFingerprints":{"codehealthFindingId/v1":"1daae8ec905f6413fd167eef3630dad59e720ad8bf91779a9526822cd41baa81"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201313 lines \u00D7 2): internal/transformers/estransforms/esdecorator.go:1993-2003 | internal/transformers/estransforms/esdecorator.go:2082-2094 \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 \u0060internal/transformers/estransforms/esdecorator.go:1993\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":"internal/transformers/estransforms/esdecorator.go"},"region":{"startLine":1993}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cdab34282a397d9889a202398ff2051f173895bb9ac9582dd22fc5249ee93c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): internal/ast/deepclone.go:34-46 | internal/ast/deepclone.go:53-65 \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 \u0060internal/ast/deepclone.go:34\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ast/deepclone.go"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"60be683b744718ceee036b69e87691a711803e80ed57ae4074e8eb85be69a689"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5): internal/api/session.go:1542-1553 | internal/api/session.go:2293-2304 | internal/api/session.go:2455-2466 | internal/api/session.go:3186-3197 | internal/api/session.go:3222-3233 \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. 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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":1542}}}],"partialFingerprints":{"codehealthFindingId/v1":"9960b5b4c96dad0b657728efa528724b93b1da8ead8b57756af71eec27330413"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4): internal/testutil/contentmappertest/diagnostic_code_collision.go:16-27 | internal/testutil/contentmappertest/supplemental.go:14-25 | internal/testutil/contentmappertest/verbatim.go:16-27 | internal/testutil/contentmappertest/verbatim.go:35-46 \u2014 there are 4 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/testutil/contentmappertest/diagnostic_code_collision.go:16\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. 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":"internal/testutil/contentmappertest/diagnostic_code_collision.go"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"5186095cf662ce09fa14db7adf984a85dbb0b9747b6480fd99144a12ff5ec69f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/api/session.go:1302-1313 | internal/api/session.go:1328-1339 \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 \u0060internal/api/session.go:1302\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":"internal/api/session.go"},"region":{"startLine":1302}}}],"partialFingerprints":{"codehealthFindingId/v1":"f05f586de993996aa8a49f87c89d7ea56859438fe104bcca4dc21a28089677ea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/checker/checker.go:16106-16117 | internal/checker/checker.go:19777-19788 \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":"internal/checker/checker.go"},"region":{"startLine":16106}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffc2091f9d94589dfa7e2db1e84de0e54b66d8ff508bb858267a1da96dff24e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): internal/execute/watcher.go:448-458 | internal/execute/watcher.go:523-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 \u0060internal/execute/watcher.go:448\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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/execute/watcher.go"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ff90ae711a382748f78a6dbdcd0192c63d628ae5bc3040f01a7f1fd63d41127"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): internal/fourslash/fourslash.go:448-459 | internal/fourslash/fourslash.go:538-548 \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":"internal/fourslash/fourslash.go"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e35d94064696a2086a8acb5bec31981ccf67106108468219542b418a2caf727"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/ls/callhierarchy.go:574-585 | internal/ls/callhierarchy.go:944-955 \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":"internal/ls/callhierarchy.go"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5c9c23c4a5b82b0dedbc02af037b98b0e3bafe3e72a78589fb6761a4ef3620e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/ls/callhierarchy.go:1051-1062 | internal/ls/callhierarchy.go:1087-1098 \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 \u0060internal/ls/callhierarchy.go:1051\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":"internal/ls/callhierarchy.go"},"region":{"startLine":1051}}}],"partialFingerprints":{"codehealthFindingId/v1":"bffedc38010013c281a05c5a12a07a30a007ce033cb4dee7b4635b73f3ba66e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/ls/findallreferences.go:534-545 | internal/ls/findallreferences.go:548-559 \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 \u0060internal/ls/findallreferences.go:534\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. 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":"internal/ls/findallreferences.go"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9c4d2dedf487df70a1dfda8b040db55fc7e3a2ad39ded9489950d2e951f9733"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/ls/findallreferences.go:897-908 | internal/ls/findallreferences.go:952-963 \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 \u0060internal/ls/findallreferences.go:897\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":"internal/ls/findallreferences.go"},"region":{"startLine":897}}}],"partialFingerprints":{"codehealthFindingId/v1":"799623fd87f504d4a7afa96db6b6cd75577a8bf190f0f0e0eee54fb601ecb1b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/printer/printer.go:1936-1947 | internal/printer/printer.go:1954-1965 \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 \u0060internal/printer/printer.go:1936\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/printer/printer.go"},"region":{"startLine":1936}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ba6e5fe6627c57625bc52248f865ef07cfc20bdea45cc704f55cfe468110f35"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/project/configfileregistrybuilder.go:459-470 | internal/project/configfileregistrybuilder.go:472-483 \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 \u0060internal/project/configfileregistrybuilder.go:459\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":"internal/project/configfileregistrybuilder.go"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef91be3e7c1ece41f5ec44a7751562979e9e2be623fdbe3119663e1a6907ac11"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201312 lines \u00D7 2): internal/testutil/contentmappertest/editing.go:29-40 | internal/testutil/contentmappertest/supplemental_diagnostics.go:28-36 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/testutil/contentmappertest/editing.go:29\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it. 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. 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":"internal/testutil/contentmappertest/editing.go"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"736e5a18e16a2fd711176cc69591eeb9d72321e6eb340536f70deba3325c4e16"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/transformers/estransforms/async.go:361-372 | internal/transformers/estransforms/async.go:379-390 \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 \u0060internal/transformers/estransforms/async.go:361\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/estransforms/async.go"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6f9a1a77d03505afe68713a32699626fa43befd1181ccd616542f2604f7a3af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/transformers/estransforms/classfields.go:1141-1152 | internal/transformers/estransforms/esdecorator.go:2023-2034 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/transformers/estransforms/classfields.go:1141\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, \u0060internal/transformers/estransforms/esdecorator.go:2020\u0060 calls \u0060Factory\u0060, \u0060EmitContext\u0060 and \u0060internal/transformers/estransforms/classfields.go:1140\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":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":1141}}}],"partialFingerprints":{"codehealthFindingId/v1":"a19288a6777452bbb0fc816743f2a7ef2924b3afa2583b53d0568c35f902b827"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/transformers/estransforms/classfields.go:3030-3041 | internal/transformers/estransforms/classfields.go:3058-3069 \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":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":3030}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3b3ef6210beeb1eeca2d596833b5e0c2548b60087b8e1e23e4248ddb340c205"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/transformers/moduletransforms/commonjsmodule.go:804-815 | internal/transformers/moduletransforms/esmodule.go:133-144 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/transformers/moduletransforms/commonjsmodule.go:804\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/moduletransforms/commonjsmodule.go"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"b431aaf308cb107e5d38f156a5e5000e0d9cec0a5763320d162496606185e868"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): internal/transformers/moduletransforms/commonjsmodule.go:1490-1501 | internal/transformers/moduletransforms/commonjsmodule.go:1514-1523 \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 \u0060internal/transformers/moduletransforms/commonjsmodule.go:1490\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":"internal/transformers/moduletransforms/commonjsmodule.go"},"region":{"startLine":1490}}}],"partialFingerprints":{"codehealthFindingId/v1":"4477e3ec928d930d285027323e656112c66e063dce6702f8e7dbc9ed3b62106f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): internal/transformers/tstransforms/importelision.go:93-103 | internal/transformers/tstransforms/typeeraser.go:352-363 \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. 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":"internal/transformers/tstransforms/importelision.go"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"88ee6cfe6def3245bf25b115026196d2dfb827172d475d4bf91be31ef1bbb9a8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/fswatch/fsevents_darwin.go:571-582 | internal/fswatch/fsevents_darwin.go:596-607 \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":"internal/fswatch/fsevents_darwin.go"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0360f9d2f668b0290ddfb26e758fd5ed864fa9b8b25c0ec54e2da5c9017d8eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4): internal/api/session.go:1441-1451 | internal/api/session.go:1512-1522 | internal/api/session.go:1771-1781 | internal/api/session.go:1798-1808 \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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":1441}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9b3360ead111be6b8f680ee100d219fa389faacfc67d9daae9179e4a46cd9c8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): internal/fourslash/fourslash.go:2037-2047 | internal/fourslash/fourslash.go:2290-2300 | internal/fourslash/fourslash.go:2404-2414 \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":"internal/fourslash/fourslash.go"},"region":{"startLine":2037}}}],"partialFingerprints":{"codehealthFindingId/v1":"f973fac070d111c0aa5fafe6a2271c9644a79f3843b77927a56446ea6515a3f1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): internal/scanner/scanner.go:759-769 | internal/scanner/scanner.go:787-797 | internal/scanner/scanner.go:857-867 \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 \u0060internal/scanner/scanner.go:759\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":"internal/scanner/scanner.go"},"region":{"startLine":759}}}],"partialFingerprints":{"codehealthFindingId/v1":"4374c8b0156e45ba7a8a5cff799e66afbea89c7b4311550931a357f6d5ffe10d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/api/session.go:1048-1058 | internal/api/session.go:1106-1116 \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":"internal/api/session.go"},"region":{"startLine":1048}}}],"partialFingerprints":{"codehealthFindingId/v1":"51c265d71ccdf82e55f0d223053651c6de6f8abe80dbf3204e005e65516db6f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): internal/api/session.go:1646-1656 | internal/api/session.go:1668-1677 \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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":1646}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bfdcfaeabe7ad6fdeba1f92a1b6cc5da736551012ceb746ec2e697544bfcc9d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/fourslash/fourslash.go:4838-4848 | internal/fourslash/fourslash.go:5171-5181 \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 register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/fourslash.go"},"region":{"startLine":4838}}}],"partialFingerprints":{"codehealthFindingId/v1":"e163bd26a8f46027c77862d2d97cdc0fb2c1b85e98cb0c8806cfe7c5b7497ead"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/ipc/conn_async.go:169-179 | internal/ipc/conn_sync.go:130-140 \u2014 before extracting anything, compare \u0060internal/ipc/conn_async.go\u0060 and \u0060internal/ipc/conn_sync.go\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 44 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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/ipc/conn_async.go:169\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":"internal/ipc/conn_async.go"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eba6e16002c91218b1074a5905b3188c1ef3426a15d71ddde8858d996bd20fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/ls/signaturehelp.go:534-544 | internal/ls/signaturehelp.go:601-611 \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":"internal/ls/signaturehelp.go"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"370b7e541b4160147bb053b5ee9270cc9d9855aea6052ab994dd9f5b7a0569e1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/parser/jsdoc.go:312-322 | internal/parser/jsdoc.go:621-631 \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 \u0060internal/parser/jsdoc.go:312\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":"internal/parser/jsdoc.go"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bd2c68ce11f5dba8c430a42618a626be1fbafa60988aa2708b15d39c31f9f5e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/printer/factory.go:30-40 | internal/printer/factory.go:108-118 \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 \u0060internal/printer/factory.go:30\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":"internal/printer/factory.go"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"f34a15aed9c2b766570a35eaf07cc8e134bf07b6ef778bda1f3f89dbdc1bb37a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/printer/printer.go:3970-3980 | internal/printer/printer.go:4111-4121 \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":"internal/printer/printer.go"},"region":{"startLine":3970}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2c6af8c2e7daf2307de6a373f719d05a4cb8578b6dce6ddfbceda4443b95448"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/transformers/estransforms/esdecorator.go:2586-2596 | internal/transformers/estransforms/esdecorator.go:2605-2615 \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 \u0060internal/transformers/estransforms/esdecorator.go:2586\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. 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":"internal/transformers/estransforms/esdecorator.go"},"region":{"startLine":2586}}}],"partialFingerprints":{"codehealthFindingId/v1":"3951649c2c47d9b719786243ca2ad39311e7161c808be335295b97f045d36b1c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/transformers/estransforms/objectrestspread.go:200-210 | internal/transformers/estransforms/objectrestspread.go:231-241 \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 \u0060internal/transformers/estransforms/objectrestspread.go:200\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/transformers/estransforms/objectrestspread.go"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"5896093a0dc69d218e335f1a8ce0a422f79c69e0962d9515107662e9da3c2dd3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 9): internal/api/session.go:1541-1550 | internal/api/session.go:1715-1724 | internal/api/session.go:1731-1740 | internal/api/session.go:2292-2301 | internal/api/session.go:2348-2357 | internal/api/session.go:2454-2463 | internal/api/session.go:3185-3194 | internal/api/session.go:3204-3213 | internal/api/session.go:3221-3230 \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. 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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":1541}}}],"partialFingerprints":{"codehealthFindingId/v1":"a96cb6ca32c7397914b2d0a676953205ed1ae5d828051d932238fa3be641819f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 9): internal/api/session.go:1693-1702 | internal/api/session.go:2976-2985 | internal/api/session.go:3003-3012 | internal/api/session.go:3030-3039 | internal/api/session.go:3068-3077 | internal/api/session.go:3102-3111 | internal/api/session.go:3141-3150 | internal/api/session.go:3163-3172 | internal/api/session.go:3411-3420 \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. 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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":1693}}}],"partialFingerprints":{"codehealthFindingId/v1":"b663455bdefa52e040d6c09b4f05af98608cb0134168676f0683593d9f9fc902"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 5): internal/api/session.go:1440-1449 | internal/api/session.go:1469-1478 | internal/api/session.go:1511-1520 | internal/api/session.go:1770-1779 | internal/api/session.go:1797-1806 \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. 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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":1440}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb774ec705e56b5db3bab0790bf37cd105dbaca1a6efe0c8bf555c2b6dd049cc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 5): internal/api/session.go:2316-2325 | internal/api/session.go:2332-2341 | internal/api/session.go:2364-2373 | internal/api/session.go:3051-3060 | internal/api/session.go:3124-3133 \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. 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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":2316}}}],"partialFingerprints":{"codehealthFindingId/v1":"298aca6004c0c6e4a5b92fe193ae1ef9e28ecc191481fb7952b6448d17284df6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): internal/scanner/scanner.go:757-766 | internal/scanner/scanner.go:785-794 | internal/scanner/scanner.go:810-819 | internal/scanner/scanner.go:855-864 \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 \u0060internal/scanner/scanner.go:757\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":"internal/scanner/scanner.go"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"09bc4718ab9fac516fb0af996a13e2bc7ad0061c966123aa8239c29c5270fd4d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): internal/api/session.go:1591-1600 | internal/api/session.go:1629-1638 | internal/api/session.go:3245-3254 \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. 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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":1591}}}],"partialFingerprints":{"codehealthFindingId/v1":"f100fd19b358fe8320020c9d615de584287c706b95bddf1ed901319bea2b1cad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): internal/transformers/estransforms/async.go:326-335 | internal/transformers/estransforms/async.go:398-407 | internal/transformers/estransforms/async.go:433-442 \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 \u0060internal/transformers/estransforms/async.go:326\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":"internal/transformers/estransforms/async.go"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fe09e3d8b2a73607d57be2ee6655b5c532d37e0b72956ec2633e008081d1f0c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/api/encoder/encoder.go:755-764 | internal/api/encoder/encoder.go:770-779 \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. Each matched range is the entire body of the declaration above it, so the region is already a complete unit: move that whole declaration to the shared location and have each site call it, rather than lifting the lines out of their bodies. Any \u0060return\u0060 inside it is the body\u0027s own exit and keeps its meaning in the moved unit."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/encoder/encoder.go"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5f87abd34d7160906b6e757c09679cb7958ac6a9c6b24f5034ba0475ea80194"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/api/session.go:2417-2426 | internal/api/session.go:2943-2952 \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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":2417}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b3863feda7a03a1e1fcc774375c74054440b6210d4ddd02563502c7db1eee86"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/api/session.go:2880-2889 | internal/api/session.go:2896-2905 \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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":2880}}}],"partialFingerprints":{"codehealthFindingId/v1":"14dcc4aaf8d5fe7a315afa805fe354c3f858727ee3911608bbad1dfd798896c4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/api/session.go:3436-3445 | internal/api/session.go:3451-3460 \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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":3436}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecc0797160682c59e5309233f619bd86d558859ac58245a1e76821a3c99ac965"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/binder/binder.go:245-254 | internal/binder/binder.go:260-269 \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":"internal/binder/binder.go"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d4056a6367716877065e3a6f42af944dc85e22255bb11bec353f083ad29ef2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): internal/compiler/program.go:358-367 | internal/compiler/program.go:374-382 \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 \u0060internal/compiler/program.go:358\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. 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":"internal/compiler/program.go"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"13acd71c12d57af45096fafb3cdc0aa541836d76e1c75666b63d15fe302460b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/fourslash/fourslash.go:1193-1202 | internal/fourslash/fourslash.go:1214-1223 \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":"internal/fourslash/fourslash.go"},"region":{"startLine":1193}}}],"partialFingerprints":{"codehealthFindingId/v1":"78102b087525cdcf2b0e666de5e3fdd4e7b4eb3afedc1a9c62e936dcda1d7eb8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/fourslash/fourslash.go:2065-2074 | internal/fourslash/fourslash.go:2310-2321 \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 \u0060internal/fourslash/fourslash.go:2065\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":"internal/fourslash/fourslash.go"},"region":{"startLine":2065}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ac00f9d0e2b9046f767aa8c26627f6f78e7e9c40c6b80093cfa4feb31f3afd4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/fourslash/fourslash.go:2953-2962 | internal/fourslash/fourslash.go:3137-3146 \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 \u0060internal/fourslash/fourslash.go:2953\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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, \u0060internal/fourslash/fourslash.go:3135\u0060 calls \u0060Sprintf\u0060 and \u0060internal/fourslash/fourslash.go:2951\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":"internal/fourslash/fourslash.go"},"region":{"startLine":2953}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7ddae794f37b317b74821e3117bc83fb5bae8f53b074f8d1dc3fa6df0e184fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/fourslash/fourslash.go:4505-4514 | internal/fourslash/fourslash.go:4531-4540 \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":"internal/fourslash/fourslash.go"},"region":{"startLine":4505}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab176ede69d66f29ae091f6f42ba8f8d47db8ec6eafd87080f1bbebe2ab438df"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): internal/ls/completions.go:6206-6214 | internal/ls/completions.go:6249-6258 \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 \u0060internal/ls/completions.go:6249\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. 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":"internal/ls/completions.go"},"region":{"startLine":6206}}}],"partialFingerprints":{"codehealthFindingId/v1":"57e77f5fa14f095ed704c9d4f645a5b8814fbf892061e75386f21e0cddb200d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/printer/factory.go:48-57 | internal/printer/factory.go:128-137 \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 \u0060internal/printer/factory.go:48\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/factory.go"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"799fdc08311687207e6d9b92eab5962f856d400339ceaa1d6ef8823c6fb29e85"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/printer/printer.go:1797-1806 | internal/printer/printer.go:5136-5145 \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 \u0060internal/printer/printer.go:1797\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. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060internal/printer/printer.go:5135\u0060 calls \u0060emitMethodSignature\u0060, \u0060AsMethodSignatureDeclaration\u0060 and \u0060internal/printer/printer.go:1796\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":"internal/printer/printer.go"},"region":{"startLine":1797}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e58e71bc59c35c6929035963fa804a4fe4efe6ca21140c79c965b19e8f0b031"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/transformers/estransforms/classfields.go:1076-1085 | internal/transformers/estransforms/classfields.go:1119-1128 \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 \u0060internal/transformers/estransforms/classfields.go:1076\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":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":1076}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ad01ad08221f1e8d2802495d57b513dddcfe73f5a24c8e7b4a35794c1a31f3c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 5): internal/printer/printer.go:1696-1704 | internal/printer/printer.go:1719-1727 | internal/printer/printer.go:1735-1743 | internal/printer/printer.go:2654-2662 | internal/printer/printer.go:3745-3753 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/printer/printer.go:1696\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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, \u0060internal/printer/printer.go:2651\u0060 calls \u0060emitTokenNode\u0060, \u0060writeSpace\u0060, \u0060emitIdentifierNameNode\u0060 and \u0060internal/printer/printer.go:1718\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":"internal/printer/printer.go"},"region":{"startLine":1696}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba4b9a3286498e992ab45bde04c2297f7e346d960797ae81abf5806c9d94a9ca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): internal/printer/printer.go:1680-1688 | internal/printer/printer.go:1755-1763 | internal/printer/printer.go:1769-1777 \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 \u0060internal/printer/printer.go:1680\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/printer/printer.go"},"region":{"startLine":1680}}}],"partialFingerprints":{"codehealthFindingId/v1":"171e3d74af67d26feb1c5f8e89d636b6d0c19cdd6a3e97fb85aa045d66289997"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/api/session.go:2607-2615 | internal/api/session.go:2778-2786 \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":"internal/api/session.go"},"region":{"startLine":2607}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e931a64b71b792e1e6ca7c5da73ff6991086a6191321caedc3daf0f818d3a34"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/checker/checker.go:4912-4920 | internal/checker/checker.go:4953-4961 \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 \u0060internal/checker/checker.go:4912\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":"internal/checker/checker.go"},"region":{"startLine":4912}}}],"partialFingerprints":{"codehealthFindingId/v1":"97157dda0d9d404cf8e2388d72a86eaebcdd129cf67c23abede294eed3eb0fd6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/checker/checker.go:30286-30294 | internal/checker/checker.go:30433-30441 \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 \u0060internal/checker/checker.go:30286\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":"internal/checker/checker.go"},"region":{"startLine":30286}}}],"partialFingerprints":{"codehealthFindingId/v1":"b70557d6ffe4ef9e5eec927726adfdd906b2803f0083e7db6f0a5a54c6640a7e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/fourslash/fourslash.go:4329-4337 | internal/fourslash/fourslash.go:4489-4497 \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":"internal/fourslash/fourslash.go"},"region":{"startLine":4329}}}],"partialFingerprints":{"codehealthFindingId/v1":"d98caab4cbeb7d03461aaf3e145feee58a23618804c6b488f250f55508e00d7d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/parser/jsdoc.go:1145-1153 | internal/parser/jsdoc.go:1161-1169 \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":"internal/parser/jsdoc.go"},"region":{"startLine":1145}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a21b7c0dbf8354e4d651798dfb226c61dc115c6f5c238350e08f1626975912b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/printer/printer.go:4382-4390 | internal/printer/printer.go:4425-4433 \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 \u0060internal/printer/printer.go:4382\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":"internal/printer/printer.go"},"region":{"startLine":4382}}}],"partialFingerprints":{"codehealthFindingId/v1":"043d62ea08b5efdc3f10bc677cdf343a7cd651575ea8b0f471dfc9a02228a8bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): internal/testutil/contentmappertest/duplicate.go:30-38 | internal/testutil/contentmappertest/duplicate.go:50-57 \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":"internal/testutil/contentmappertest/duplicate.go"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"453cb3d0e9ae96609505e1cf89b6cedd2acfc431cd885b083cce3a46a0fff34b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/testutil/harnessutil/harnessutil.go:665-673 | internal/testutil/harnessutil/harnessutil.go:681-689 \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":"internal/testutil/harnessutil/harnessutil.go"},"region":{"startLine":665}}}],"partialFingerprints":{"codehealthFindingId/v1":"882ee2c5fb66495447684017b3daa4a8f62189a03a34bc3e6872e5412e8ad0ba"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/transformers/estransforms/async.go:235-243 | internal/transformers/estransforms/async.go:252-260 \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 \u0060internal/transformers/estransforms/async.go:235\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. 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":"internal/transformers/estransforms/async.go"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"5986379156efd2159c9459cd3371f3c1e6f9443e63a2b141a9bb0649722add29"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/transformers/estransforms/classfields.go:1141-1149 | internal/transformers/estransforms/classfields.go:3581-3589 \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":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":1141}}}],"partialFingerprints":{"codehealthFindingId/v1":"f37c9057af805cd8d5f9cc0d4bf29033ea00976205b43af6c9bc92cfb7ed8d45"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/transformers/estransforms/classfields.go:1546-1555 | internal/transformers/estransforms/esdecorator.go:1959-1967 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/transformers/estransforms/classfields.go:1546\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":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":1546}}}],"partialFingerprints":{"codehealthFindingId/v1":"40d731b6f3452b50427e6ebbbe601abe103b012e7fb4f3e738902287223e7751"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/transformers/estransforms/classfields.go:2030-2038 | internal/transformers/estransforms/classfields.go:2118-2126 \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, \u0060internal/transformers/estransforms/classfields.go:2128\u0060 calls \u0060EmitContext\u0060, \u0060MostOriginal\u0060, \u0060getClassLexicalEnvironment\u0060 and \u0060internal/transformers/estransforms/classfields.go:2039\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":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":2030}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ba8ab8df4ade5135f0866af30f6cde9d6d35e22444d68c1900b54edbf8af153"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/transformers/estransforms/forawait.go:556-564 | internal/transformers/estransforms/forawait.go:574-582 \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 \u0060internal/transformers/estransforms/forawait.go:556\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/estransforms/forawait.go"},"region":{"startLine":556}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bc1c1de808c034aea7ccd16778c9970328dfdf36c8368124ee8c763dc687941"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/transformers/estransforms/objectrestspread.go:302-310 | internal/transformers/estransforms/objectrestspread.go:360-368 \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 \u0060internal/transformers/estransforms/objectrestspread.go:302\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":"internal/transformers/estransforms/objectrestspread.go"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1c8fc82be33355db60aa509b38badd3f012c3a8b5fb3deb47b275dfb5c705f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/transformers/tstransforms/typeeraser.go:327-335 | internal/transformers/tstransforms/typeeraser.go:364-373 \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":"internal/transformers/tstransforms/typeeraser.go"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"efa7d97bba4b6c08411b021bf754a8b386c2c1bcf2a61e7c0db5a13e4bee4ce9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): internal/fswatch/fanotify_linux.go:268-275 | internal/fswatch/inotify_linux.go:186-193 | internal/fswatch/kqueue.go:244-251 \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. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060internal/fswatch/fanotify_linux.go:266\u0060 calls \u0060Lock\u0060, \u0060Unlock\u0060 and \u0060internal/fswatch/kqueue.go:243\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":"internal/fswatch/fanotify_linux.go"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce4b943f4dcd6ec8a678f53c459d71a78d5a99d628de3513b57d5a38cae10dd9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): internal/transformers/estransforms/namedevaluation.go:332-339 | internal/transformers/estransforms/namedevaluation.go:366-373 | internal/transformers/estransforms/namedevaluation.go:402-409 \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":"internal/transformers/estransforms/namedevaluation.go"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"c73bd6996a3c7cf722e57f58b245e56a112899cfffadaf32b49b13e1c9cc63aa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/checker/checker.go:13502-13509 | internal/checker/checker.go:13511-13518 \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":"internal/checker/checker.go"},"region":{"startLine":13502}}}],"partialFingerprints":{"codehealthFindingId/v1":"3adf5a6e3f82263e9b7ad0b3b70adf04fa5a0f99142e54093ddc5dfc66fecbcc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 2): internal/checker/flow.go:1162-1169 | internal/checker/flow.go:1188-1194 \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":"internal/checker/flow.go"},"region":{"startLine":1162}}}],"partialFingerprints":{"codehealthFindingId/v1":"215dddc0ee0f4cc9c13c5a7c5c451b305c8ee603d3f7307551d5d94dcd15d97d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/execute/incremental/program.go:457-464 | internal/execute/incremental/program.go:492-499 \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 \u0060internal/execute/incremental/program.go:457\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":"internal/execute/incremental/program.go"},"region":{"startLine":457}}}],"partialFingerprints":{"codehealthFindingId/v1":"60fd2e95486c5fa1d85059d1573c36645c1fc51f016c4598424f5f499b3c6832"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/execute/incremental/snapshot.go:170-177 | internal/execute/incremental/snapshot.go:213-220 \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":"internal/execute/incremental/snapshot.go"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"378bafa0dabd573cbb846bc961775cd57507e499e1a710597cca8a091f02d310"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/execute/tsc/help.go:126-133 | internal/execute/tsc/help.go:140-147 \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 \u0060internal/execute/tsc/help.go:126\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/execute/tsc/help.go"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"f590e06a07107ad0e17ad5d84bfd40037ec2ecb8572221c8545647493887403e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/fourslash/baselineutil.go:387-394 | internal/fourslash/baselineutil.go:442-449 \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":"internal/fourslash/baselineutil.go"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"4338cf5180dd7518994dfee43d64dc5e094101aabcd7cfcceebccbb4bb192f3d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/fswatch/fanotify_linux.go:222-229 | internal/fswatch/inotify_linux.go:138-145 \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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fswatch/fanotify_linux.go"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb2fb59fc0729c0bcf8f57fedb994328d17eb0d1461c50cd6cbe683d1c5f1be7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/ls/hover.go:411-418 | internal/ls/hover.go:449-456 \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 \u0060internal/ls/hover.go:411\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/ls/hover.go"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"55ce888069cfbce29f54d76013f49bbbdc78bb75086358a8b2bca98f39e1a30a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/parser/jsdoc.go:28-35 | internal/parser/jsdoc.go:82-89 \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":"internal/parser/jsdoc.go"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"baf0568453bbbd6e409ab9f5f9f9d2f2040d83101e98bc5de84739a5a96b1544"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/project/snapshotfs.go:562-569 | internal/project/snapshotfs.go:575-582 \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 \u0060internal/project/snapshotfs.go:562\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":"internal/project/snapshotfs.go"},"region":{"startLine":562}}}],"partialFingerprints":{"codehealthFindingId/v1":"38bbb69348709a435e7852d0963c6805f8bfe8384e760e14521408920157b3f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/spanmap/spanmap.go:563-570 | internal/spanmap/spanmap.go:591-598 \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 \u0060internal/spanmap/spanmap.go:563\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":"internal/spanmap/spanmap.go"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"0df0e95a5fb7b79f66067980bf1fad77f35a46ae17ed30bda9616c28870b65ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/testutil/contentmappertest/dynamic_verbatim.go:35-42 | internal/testutil/contentmappertest/protocol.go:60-67 \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":"internal/testutil/contentmappertest/dynamic_verbatim.go"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"04c77512601305bcc86fe105b10dffeedb93a35efcdcf6cc1f56fa35d1bd6eeb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/transformers/estransforms/optionalchain.go:80-87 | internal/transformers/estransforms/optionalchain.go:174-181 \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 \u0060internal/transformers/estransforms/optionalchain.go:80\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":"internal/transformers/estransforms/optionalchain.go"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"49c8019a538734bd1818acbcdf4b0ee7551149a61fa9562ca082fcda3c97a896"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/transformers/moduletransforms/commonjsmodule.go:1179-1186 | internal/transformers/moduletransforms/commonjsmodule.go:1331-1338 \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 \u0060internal/transformers/moduletransforms/commonjsmodule.go:1179\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. 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":"internal/transformers/moduletransforms/commonjsmodule.go"},"region":{"startLine":1179}}}],"partialFingerprints":{"codehealthFindingId/v1":"44a70aa5aeeb08d4b1f2c11de0792c6c49060aaeaadf4a4902719cd5f6db44b1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/transformers/tstransforms/metadata.go:89-96 | internal/transformers/tstransforms/metadata.go:108-115 \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 \u0060internal/transformers/tstransforms/metadata.go:89\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/transformers/tstransforms/metadata.go"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"1531f0bd606f94d6f93e26e5c9df8ba261d4dd7c1c5922279b66ffddb8091f54"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/transformers/tstransforms/typeeraser.go:166-173 | internal/transformers/tstransforms/typeeraser.go:178-185 \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":"internal/transformers/tstransforms/typeeraser.go"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e94ff6fc2669d239c053be16775346cc00ed1d2db8dba9fa0e008017cc918fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4): internal/transformers/estransforms/async.go:330-336 | internal/transformers/estransforms/async.go:402-408 | internal/transformers/estransforms/async.go:437-443 | internal/transformers/estransforms/async.go:480-486 \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 \u0060internal/transformers/estransforms/async.go:330\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":"internal/transformers/estransforms/async.go"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"e44ccb9976d978bcec2533e0220aee9104bb9b65e20f19c4a96e70e6644205c1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): internal/transformers/declarations/transform.go:1274-1280 | internal/transformers/declarations/transform.go:1468-1474 | internal/transformers/declarations/transform.go:1509-1515 \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":"internal/transformers/declarations/transform.go"},"region":{"startLine":1274}}}],"partialFingerprints":{"codehealthFindingId/v1":"c253051a5ae4ce375861a2161fa247b605da6a088340004d8a22275abc959aac"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20137 lines \u00D7 2): internal/parser/parser.go:3101-3107 | internal/parser/parser.go:3148-3153 \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 \u0060internal/parser/parser.go:3101\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":"internal/parser/parser.go"},"region":{"startLine":3101}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d8e981af678d824888562da138a3defaafdb5c18c773a15a712fd45138ba357"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): internal/printer/printer.go:506-513 | internal/printer/printer.go:602-608 \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 \u0060internal/printer/printer.go:506\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. 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":"internal/printer/printer.go"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"f36bb3c98e1038a02ba7a1d22975cacc37fa3ca5aea68ce7af313773a5fda4d3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): internal/scanner/regexp.go:570-576 | internal/scanner/regexp.go:675-681 \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 \u0060internal/scanner/regexp.go:570\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":"internal/scanner/regexp.go"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"92043b8be6c5f024e25d610c57b0a2489288be2d080be381441a878453378f78"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): internal/testutil/contentmappertest/component.go:44-50 | internal/testutil/contentmappertest/transforming.go:115-121 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/testutil/contentmappertest/component.go:44\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":"internal/testutil/contentmappertest/component.go"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"808e9197fd5f839115c1fdd3434241a427117bcdd62e4bbbc1640e8309d7d6f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): internal/transformers/estransforms/async.go:672-678 | internal/transformers/estransforms/forawait.go:736-742 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/transformers/estransforms/async.go:672\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":"internal/transformers/estransforms/async.go"},"region":{"startLine":672}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a368fe60b427f3ec98512af192d62e7d90a2c5b25405f5df29c808b8a14eba4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): internal/transformers/estransforms/esdecorator.go:1966-1972 | internal/transformers/estransforms/esdecorator.go:2043-2050 \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, \u0060internal/transformers/estransforms/esdecorator.go:1964\u0060 calls \u0060Visitor\u0060, \u0060VisitNode\u0060, \u0060IsCompoundAssignment\u0060 and \u0060internal/transformers/estransforms/esdecorator.go:2042\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":"internal/transformers/estransforms/esdecorator.go"},"region":{"startLine":1966}}}],"partialFingerprints":{"codehealthFindingId/v1":"51c0064aaaf4e21d0bd1f1d99ad015c7caa916222cf21ff24c90b08f5334200e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): internal/transformers/tstransforms/metadata.go:80-86 | internal/transformers/tstransforms/metadata.go:99-105 \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. The matched lines also register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/tstransforms/metadata.go"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfcb6426c86a56787f8ef98859c9a3c73bcced9680dc35fcd188bf48f74ca2dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): internal/checker/pseudotypenodebuilder.go:184-190 | internal/checker/pseudotypenodebuilder.go:243-249 \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":"internal/checker/pseudotypenodebuilder.go"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"5959befe2703fcef676c141806a69eab49884aec1d85fe2dd11061b8a87c60e4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): internal/parser/reparser.go:401-407 | internal/parser/reparser.go:413-419 \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 \u0060internal/parser/reparser.go:401\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":"internal/parser/reparser.go"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dd60509b4569912007c6ced64f510eaf2abbf01fa3c791c4452348d3d3f0360"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): internal/transformers/declarations/transform.go:1465-1470 | internal/transformers/declarations/transform.go:1485-1490 | internal/transformers/declarations/transform.go:1506-1511 \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 \u0060internal/transformers/declarations/transform.go:1465\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":"internal/transformers/declarations/transform.go"},"region":{"startLine":1465}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcb813c15ef31d23e0fb4614daf8b4131e707cea216cbe763db5e029c98a0e98"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): internal/transformers/tstransforms/metadata.go:146-151 | internal/transformers/tstransforms/metadata.go:164-169 | internal/transformers/tstransforms/metadata.go:182-187 \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 \u0060internal/transformers/tstransforms/metadata.go:146\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/transformers/tstransforms/metadata.go"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"16430a17d440cb01884262f90ae8d160aecce9ebc98032b8478968454094db44"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): _tools/gen-proto/main.go:558-563 | _tools/gen-proto/main.go:598-603 \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 \u0060_tools/gen-proto/main.go:558\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":"_tools/gen-proto/main.go"},"region":{"startLine":558}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b6b1b65b63a94231eaaaa9b9b49663c1df027ce1b91ed0230653c0a86d2ee4b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): internal/fswatch/fanotify_linux.go:723-728 | internal/fswatch/inotify_linux.go:368-373 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/fswatch/fanotify_linux.go:723\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. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060internal/fswatch/inotify_linux.go:374\u0060 calls \u0060InotifyRmWatch\u0060 and \u0060internal/fswatch/fanotify_linux.go:729\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":"internal/fswatch/fanotify_linux.go"},"region":{"startLine":723}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcd4ffc8a30825ca76277536c2cbe69b48bee1004c4a1c859de0bc199d9fb285"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): internal/modulespecifiers/specifiers.go:1273-1278 | internal/modulespecifiers/specifiers.go:1281-1286 \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 \u0060internal/modulespecifiers/specifiers.go:1273\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. 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":"internal/modulespecifiers/specifiers.go"},"region":{"startLine":1273}}}],"partialFingerprints":{"codehealthFindingId/v1":"dad954a593e4042f5a4561e119e58a9d71ac4ed18c4b7c12ccad893f7b96c8a9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): internal/printer/factory.go:1013-1018 | internal/printer/factory.go:1037-1042 \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":"internal/printer/factory.go"},"region":{"startLine":1013}}}],"partialFingerprints":{"codehealthFindingId/v1":"706a397b23ea5695237749bf2eea8589afee6a52e0982f9e7b68106d9322aefb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): internal/printer/printer.go:2647-2652 | internal/printer/printer.go:3736-3741 \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":"internal/printer/printer.go"},"region":{"startLine":2647}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3e02957e344ba21f3096e48e34b076dca161f8f4d55575d86fe5074116aaa60"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): internal/project/watch.go:128-133 | internal/project/watch.go:143-149 \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 \u0060internal/project/watch.go:143\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":"internal/project/watch.go"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9519e67c56856ccc7faad9b97c76f891a73106a9316d0997d3b72c065ab72f1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): internal/testutil/harnessutil/harnessutil.go:560-565 | internal/testutil/harnessutil/harnessutil.go:572-577 \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 \u0060internal/testutil/harnessutil/harnessutil.go:560\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. 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":"internal/testutil/harnessutil/harnessutil.go"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e1359727cd8b38ef0c06728d41cf04ef1c1220e62086c1935fd549e4f466fe1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): internal/transformers/declarations/transform.go:2289-2294 | internal/transformers/inliners/constenum.go:47-52 \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 \u0060internal/transformers/declarations/transform.go:2289\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":"internal/transformers/declarations/transform.go"},"region":{"startLine":2289}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c7f81bdaac978243ffeb77adf487834113582220f7699819069fc7bfd30d99a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): internal/checker/checker.go:22900-22904 | internal/core/core.go:154-158 | internal/core/core.go:170-174 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/checker/checker.go:22900\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":"internal/checker/checker.go"},"region":{"startLine":22900}}}],"partialFingerprints":{"codehealthFindingId/v1":"1395603b6d703736ec32ad859527ca2dfe50891ff4463f8e9dc713b7de4246d0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/api/encoder/encoder.go:499-503 | internal/api/encoder/encoder.go:532-536 \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 \u0060internal/api/encoder/encoder.go:499\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":"internal/api/encoder/encoder.go"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"d99ea634714cd8acc877346bfd5ec40804ad4293dff90a0582493c3c88aec21e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/api/encoder/encoder.go:852-856 | internal/api/encoder/encoder.go:865-869 \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 \u0060internal/api/encoder/encoder.go:852\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. 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":"internal/api/encoder/encoder.go"},"region":{"startLine":852}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dc8a3b9d5e8cea136f2de31acd19c0b53c9175b08d6b21cb8923d084317e11c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/checker/checker.go:5648-5653 | internal/checker/checker.go:28679-28683 \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":"internal/checker/checker.go"},"region":{"startLine":5648}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2b791c4ac4e4d92b43b16dd64d08065a793a758e12641c392d7135c145897cb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/checker/checker.go:13662-13666 | internal/checker/checker.go:13692-13696 \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 \u0060internal/checker/checker.go:13662\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":"internal/checker/checker.go"},"region":{"startLine":13662}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd9ed9ef406940f240e0811270e1a895c458d7783241f634f139b0b573a81cbd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/checker/flow.go:2468-2472 | internal/checker/flow.go:2490-2494 \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":"internal/checker/flow.go"},"region":{"startLine":2468}}}],"partialFingerprints":{"codehealthFindingId/v1":"053740b5e51a8e165a9898c8ee2ac745f6c030983463dd1e819a5759c95e3ab3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/checker/flow.go:2478-2482 | internal/checker/flow.go:2501-2505 \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 \u0060internal/checker/flow.go:2478\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":"internal/checker/flow.go"},"region":{"startLine":2478}}}],"partialFingerprints":{"codehealthFindingId/v1":"e454edd1164ffcc089b15c0d98b7f1dfb02b9aba2df6f7882eac9a167603aeef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/execute/tsc.go:297-301 | internal/execute/tsc.go:355-359 \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 register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/execute/tsc.go"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"201fa20c5164cf28e705a0def5a85e654f0fe6ddd3e95048ec2ca61091f05391"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/execute/watcher.go:441-445 | internal/execute/watcher.go:501-505 \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":"internal/execute/watcher.go"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"9071fa9efba7bb175df4dce3a1152b6e975849db8ca56b442249256d34a11931"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/lsp/server.go:1339-1343 | internal/lsp/server.go:1405-1409 \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 \u0060internal/lsp/server.go:1339\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":"internal/lsp/server.go"},"region":{"startLine":1339}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd887959ada8509b46e0d461c969a640839396556a7819ecdee2a378b696d14e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/printer/printer.go:1780-1784 | internal/printer/printer.go:2683-2687 \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":"internal/printer/printer.go"},"region":{"startLine":1780}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4f56557cfc1fba9f8f5dfce72a81e11ad7adb291a34ceb773eda0ed497df8be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/transformers/declarations/transform.go:1113-1117 | internal/transformers/declarations/transform.go:1131-1135 \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 \u0060internal/transformers/declarations/transform.go:1113\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. 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":"internal/transformers/declarations/transform.go"},"region":{"startLine":1113}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5feb264999de7f710d88a10573be0f97c0b807457ead6651669675ab74d94bf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/transformers/jsxtransforms/jsx.go:281-285 | internal/transformers/jsxtransforms/jsx.go:290-294 \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":"internal/transformers/jsxtransforms/jsx.go"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfcd0679a30b2533934c448a49f7f4d0043bbdc9771afe3502ed9c3d66504c46"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/transformers/tstransforms/metadata.go:118-122 | internal/transformers/tstransforms/metadata.go:172-176 \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":"internal/transformers/tstransforms/metadata.go"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b223804e2287aba9fd10699d3c51220b2aa8db0c32a200757dd6b182eea5490"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): internal/format/indent.go:137-142 | internal/ls/utilities.go:1212-1217 \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":"internal/format/indent.go"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"42889b5934068ecea49378e7108e97c41e1e74b38305704a6617b2a3cf671968"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): internal/fswatch/fanotify_linux.go:282-289 | internal/fswatch/inotify_linux.go:204-211 | internal/fswatch/kqueue.go:278-285 \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":"internal/fswatch/fanotify_linux.go"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"9879825eeabe1fdf495b36ff7be03a8074fc8d0c7ece3b52304bc703039e4042"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/ls/change/delete.go:183-187 | internal/ls/change/tracker.go:330-334 \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":"internal/ls/change/delete.go"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb5a71daa70ad57b7fbfa27d81154ee00e78b213f22c52ffb9582f6184fa3a9c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): internal/ls/displaypartswriter.go:88-97 | internal/printer/singlelinestringwriter.go:67-76 | internal/printer/textwriter.go:69-78 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 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 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/displaypartswriter.go"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"faaaa28efa6d7e4e88c3001444920333d42e2ef24e1ed8845a4730f2c2ac130f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/ls/file_rename.go:366-374 | internal/tsoptions/tsconfigparsing.go:1787-1795 \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":"internal/ls/file_rename.go"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"32c629fe55ebd838fcd778bf23784e311b3bc5e85be9e0cbbbc287480d9ab6fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/checker/services.go:635-642 | internal/ls/findallreferences.go:1634-1641 \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":"internal/checker/services.go"},"region":{"startLine":635}}}],"partialFingerprints":{"codehealthFindingId/v1":"dceabf712270106847f97f50933f06d3468b689b7892cafcb54cb0e16eb0596d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/checker/services.go:613-620 | internal/ls/utilities.go:73-80 \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":"internal/checker/services.go"},"region":{"startLine":613}}}],"partialFingerprints":{"codehealthFindingId/v1":"b231caa38194bacccdc990cb08d3ee8258499290c9820b28aa2190ebb9434380"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): internal/transformers/estransforms/classfields.go:1108-1114 | internal/transformers/tstransforms/legacydecorators.go:83-92 \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":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":1108}}}],"partialFingerprints":{"codehealthFindingId/v1":"adae314003eb9d2d98d6282bc57e667c7494ad6c59930033cacf79aaebeb081a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): internal/ast/diagnostic.go:444-456 | internal/fourslash/fourslash.go:5655-5667 \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":"internal/ast/diagnostic.go"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6ea53b608ca4e1d8992f4d6262518585adbe8abba492d4c07264e6d71dd2fe7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): internal/checker/utilities.go:1627-1634 | internal/printer/utilities.go:553-565 \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":"internal/checker/utilities.go"},"region":{"startLine":1627}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aef568643295486eba6c784f93e2c16b2fc38ab6ab3b3f5f6f072ab32bb0c59"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): internal/execute/incremental/buildInfo.go:230-235 | internal/execute/tsctests/readablebuildinfo.go:89-94 \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":"internal/execute/incremental/buildInfo.go"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"a23c1e1484d3f414d1accfbad24668724ccceae22af7a0f6b14a4ed48525da24"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/execute/incremental/snapshottobuildinfo.go:181-191 | internal/execute/tsctests/readablebuildinfo.go:282-292 \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":"internal/execute/incremental/snapshottobuildinfo.go"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"0663ab6b4ac92a1f4a881ab8dae77d415e6e4fe866930cd47be0605d5f2e0e1f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4): internal/transformers/estransforms/exponentiation.go:12-22 | internal/transformers/estransforms/logicalassignment.go:12-22 | internal/transformers/estransforms/nullishcoalescing.go:12-22 | internal/transformers/estransforms/optionalcatch.go:12-22 \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 4 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/estransforms/exponentiation.go"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"1953510e1862b115161d9f861f5b96c720c820866d05f3607fdcb38c6ce9ad0c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/testutil/contentmappertest/editing.go:57-73 | internal/testutil/contentmappertest/lisp.go:33-44 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/testutil/contentmappertest/editing.go:57\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/testutil/contentmappertest/editing.go"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"7500e7ac19e1b3336dc59851f52a1bfb803bc0be4ac7f94ae26d97ef93a7686c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): internal/printer/printer.go:1316-1328 | internal/printer/printer.go:1342-1354 \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. Each matched range is the entire body of the declaration above it, so the region is already a complete unit: move that whole declaration to the shared location and have each site call it, rather than lifting the lines out of their bodies. Any \u0060return\u0060 inside it is the body\u0027s own exit and keeps its meaning in the moved unit."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer.go"},"region":{"startLine":1316}}}],"partialFingerprints":{"codehealthFindingId/v1":"7231320e13dae4cbe74d85468ebdfcbd02c0715192084c1ab33ede8693b210c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/api/session.go:2522-2533 | internal/api/session.go:2562-2573 \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 \u0060internal/api/session.go:2522\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. 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":"internal/api/session.go"},"region":{"startLine":2522}}}],"partialFingerprints":{"codehealthFindingId/v1":"88b139b41895d8943b55d3de1112cd3897632b2101bac6428dd2c98cc7c78adb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): internal/testrunner/compiler_runner.go:399-410 | internal/testutil/tsbaseline/type_symbol_baseline.go:85-96 \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 \u0060internal/testrunner/compiler_runner.go:399\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/testrunner/compiler_runner.go"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"73fb4b0900b397d2095868110ad8e7646eab5394dc49d1dc15b67dd135d1dba3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/ls/autoimport/import_adder.go:225-235 | internal/ls/autoimport/import_adder.go:249-259 \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 \u0060internal/ls/autoimport/import_adder.go:225\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":"internal/ls/autoimport/import_adder.go"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"0943155459b573c6401d2600f3acbbf3a21a9f8db13ac91656468dcf2b32b713"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): internal/fswatch/fanotify_linux.go:325-335 | internal/fswatch/inotify_linux.go:218-228 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/fswatch/fanotify_linux.go:325\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":"internal/fswatch/fanotify_linux.go"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"53a8ae9a76e7e809c42d106f09e24dfe3c8538182360d181afe07c0d1c4fa64e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/printer/utilities.go:815-825 | internal/printer/utilities.go:831-840 \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 \u0060internal/printer/utilities.go:831\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. 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":"internal/printer/utilities.go"},"region":{"startLine":815}}}],"partialFingerprints":{"codehealthFindingId/v1":"81a55a1d53d2701e04f0e0c1c839c840585aa697205e6620c838777a808c2504"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/testutil/contentmappertest/editing.go:16-24 | internal/testutil/contentmappertest/supplemental_diagnostics.go:16-24 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/testutil/contentmappertest/editing.go:16\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. 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":"internal/testutil/contentmappertest/editing.go"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f274a447ca67a88da34f3805f18a00b51d5cbe246ba832507ab1716e8e354ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): internal/fourslash/fourslash.go:1741-1748 | internal/fourslash/fourslash.go:1956-1964 | internal/fourslash/fourslash.go:2007-2015 \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 \u0060internal/fourslash/fourslash.go:1741\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":"internal/fourslash/fourslash.go"},"region":{"startLine":1741}}}],"partialFingerprints":{"codehealthFindingId/v1":"e54140379287920b4e321ad0c9957f629badbafe664501e58ca46f9796726e38"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): internal/printer/factory.go:1023-1031 | internal/printer/factory.go:1078-1086 \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 \u0060internal/printer/factory.go:1023\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060internal/printer/factory.go:1075\u0060 calls \u0060NewBinaryExpression\u0060, \u0060NewToken\u0060, \u0060NewIdentifier\u0060 and \u0060internal/printer/factory.go:1020\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":"internal/printer/factory.go"},"region":{"startLine":1023}}}],"partialFingerprints":{"codehealthFindingId/v1":"012ea47f5bd8bb43950fb76bd59a1aeeab91c048a2997f62350631712507af7d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): internal/checker/checker.go:10559-10566 | internal/checker/checker.go:10575-10582 | internal/checker/checker.go:10650-10657 \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 \u0060internal/checker/checker.go:10559\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":"internal/checker/checker.go"},"region":{"startLine":10559}}}],"partialFingerprints":{"codehealthFindingId/v1":"06e43e5bb670276761d6ae6c837ca458e50dfdf8e065e0ca779f198a6deda8d9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): internal/transformers/tstransforms/metadata.go:292-299 | internal/transformers/tstransforms/metadata.go:309-316 | internal/transformers/tstransforms/metadata.go:326-333 \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 \u0060internal/transformers/tstransforms/metadata.go:292\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":"internal/transformers/tstransforms/metadata.go"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"968c2f9d07fa9b193acd108e73e5a5a213077ca38b7e3ac4476b080097d92714"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): internal/printer/printer.go:2988-2994 | internal/printer/printer.go:2998-3004 \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":"internal/printer/printer.go"},"region":{"startLine":2988}}}],"partialFingerprints":{"codehealthFindingId/v1":"54a0e76663d869e37db94edb9e6d256ced3200fb0b61bc9162cdb3204b8eb335"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): internal/testrunner/compiler_runner.go:485-490 | internal/testrunner/compiler_runner.go:505-510 \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 register a scope-exit action (a \u0060defer\u0060-style statement) that runs when the function holding them returns: moved into a called unit it would run when THAT unit returns instead \u2014 before the caller uses what it releases \u2014 so keep the registration at the call site and extract only the work around it, or have the extracted unit hand the resource back for the caller to register."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/testrunner/compiler_runner.go"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"a41064c7b95f02c1757f76fde9ff8963332e5305b1789d8b83d31ebdd76382ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): internal/pprof/pprof.go:126-131 | internal/pprof/pprof.go:148-153 \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 \u0060internal/pprof/pprof.go:126\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":"internal/pprof/pprof.go"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"f52629d9d986083ea5e6d589a75b1ab0e685a796a821764d4f8084a165bd115e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/printer/printer.go:3781-3785 | internal/printer/printer.go:3799-3803 \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, \u0060internal/printer/printer.go:3786\u0060 calls \u0060emitList\u0060, \u0060AsNode\u0060 and \u0060internal/printer/printer.go:3804\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":"internal/printer/printer.go"},"region":{"startLine":3781}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0f63542daed3e5c4ca7378f7267e7da558405684fee98db93ae98d31d6dae23"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/fourslash/fourslash.go:2117-2121 | internal/fourslash/fourslash.go:3975-3979 \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 \u0060internal/fourslash/fourslash.go:2117\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 after the matched lines, \u0060internal/fourslash/fourslash.go:3983\u0060 calls \u0060LineAndCharacterToPosition\u0060 and \u0060internal/fourslash/fourslash.go:2123\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":"internal/fourslash/fourslash.go"},"region":{"startLine":2117}}}],"partialFingerprints":{"codehealthFindingId/v1":"b27d17b274ec25035aa6823e332a5b84d456b7d1b00da0ef3f500b7a6ac68972"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/ls/definition.go:38-42 | internal/ls/sourcedefinition.go:31-35 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060internal/ls/definition.go:38\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, \u0060internal/ls/definition.go:35\u0060 calls \u0060GetClientCapabilities\u0060 and \u0060internal/ls/sourcedefinition.go:30\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":"internal/ls/definition.go"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"41fa558ca5d55e174e5905e5f47e0a4c4e9c891bf1471ab834eea48afbcf69ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/module/resolver.go:1148-1152 | internal/module/resolver.go:1688-1692 \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 \u0060internal/module/resolver.go:1148\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":"internal/module/resolver.go"},"region":{"startLine":1148}}}],"partialFingerprints":{"codehealthFindingId/v1":"931f6d17258c07f6236b3dedf3e7bfa4aee6cf35c2664d1bb76d84cf590b59dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/modulespecifiers/specifiers.go:1247-1251 | internal/modulespecifiers/specifiers.go:1255-1259 \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 \u0060internal/modulespecifiers/specifiers.go:1247\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":"internal/modulespecifiers/specifiers.go"},"region":{"startLine":1247}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceec94c705ec176b789a182b0539fa0a1806db2ee06ef585dd80a8d358fab8e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): internal/printer/printer.go:3558-3562 | internal/printer/printer.go:3577-3581 | internal/printer/printer.go:3621-3625 \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 \u0060internal/printer/printer.go:3558\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"internal/printer/printer.go"},"region":{"startLine":3558}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4c3648513af5ec6478183e1aee7825011c56b64824149e75b0afb9c76f5a8b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/printer/printer.go:3938-3942 | internal/printer/printer.go:4082-4086 \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":"internal/printer/printer.go"},"region":{"startLine":3938}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4394b9591abc02f486defcc4adb474a4b712c76fe1818ca8eb7fcf1772e4d85"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/transformers/estransforms/async.go:614-618 | internal/transformers/estransforms/async.go:720-724 \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":"internal/transformers/estransforms/async.go"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"588c9e8285523725875b7665460f0c558a6483af0a74029f8492906362016726"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/transformers/moduletransforms/commonjsmodule.go:1703-1707 | internal/transformers/moduletransforms/commonjsmodule.go:1741-1745 \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 \u0060internal/transformers/moduletransforms/commonjsmodule.go:1703\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":"internal/transformers/moduletransforms/commonjsmodule.go"},"region":{"startLine":1703}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8c433a3aacd2b85474c8ac86dc2c86b8e79327197996cb9a187de87368c15bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/transformers/tstransforms/metadata.go:134-138 | internal/transformers/tstransforms/metadata.go:154-158 \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":"internal/transformers/tstransforms/metadata.go"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2cfee1e8bacaa6a853d75b326f1f327579639bf31968eb5bc3da7bbb62bed5b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): internal/transformers/tstransforms/runtimesyntax.go:337-343 | internal/transformers/tstransforms/runtimesyntax.go:479-485 \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 \u0060internal/transformers/tstransforms/runtimesyntax.go:337\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/tstransforms/runtimesyntax.go"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"5568f39919304b7baa082660bd688c1b1ce8200e7f4cca90f1aa60894f242008"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): internal/parser/reparser.go:95-99 | internal/parser/reparser.go:114-118 \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":"internal/parser/reparser.go"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"39f93d78e80019e55bee7911f577737570e538c9091ffa8a6ce77d5a843d5c8f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/testutil/autoimporttestutil/fixtures.go:484-493 | internal/testutil/autoimporttestutil/fixtures.go:518-527 \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 \u0060internal/testutil/autoimporttestutil/fixtures.go:484\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":"internal/testutil/autoimporttestutil/fixtures.go"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c27428f0cf5f8d5d1a6a41e95e6833729f4782a509f4a8ec7e337b6a7cd9025"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): internal/testutil/autoimporttestutil/fixtures.go:498-507 | internal/testutil/autoimporttestutil/fixtures.go:531-540 \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":"internal/testutil/autoimporttestutil/fixtures.go"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe3d70b36470c3076ce46db1a74e2a9bc9ec9280388f28e3e78a2b44100a0dff"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Benchmarks: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/test/async/api.test.ts"},"region":{"startLine":6455}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a3df2de4bd0d8ad9d619076646bd2f9b9edb22daf5a62a2a57c9ca3a050c2d8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Benchmarks: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/test/sync/api.test.ts"},"region":{"startLine":6440}}}],"partialFingerprints":{"codehealthFindingId/v1":"61de1963ffb0e4e09e3d7848f8b4c06d582183f355fd32a214019ce8e9f2e1d2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/checker.go: internal/checker/checker.go changed 56 times in last 90 days, max cyclomatic complexity 106 in Checker.resolveExternalModule at line 15243. 22 of those changes were fix/bug commits, and the other 34 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/checker.go\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":"internal/checker/checker.go"},"region":{"startLine":15243}}}],"partialFingerprints":{"codehealthFindingId/v1":"1efc8e64b6611efe48ed0137c9aff2de776739963ce178e10ebac89fb4f9850c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/api/session.go: internal/api/session.go changed 39 times in last 90 days, max cyclomatic complexity 142 in Session.HandleRequest at line 583. 3 of those changes were fix/bug commits, and the other 36 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/api/session.go\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":"internal/api/session.go"},"region":{"startLine":583}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3fe1ca0317f6f4005a4cc1e1ae4345348c2a5d44c0f39e575bd84dc2c0e0f06"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/completions.go: internal/ls/completions.go changed 8 times in last 90 days, max cyclomatic complexity 312 in LanguageService.getCompletionData at line 529. 1 of those changes was a fix/bug commit, and the other 7 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/completions.go\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":"internal/ls/completions.go"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"6058a5ab4ee2463fc2f6aa78dbd18a34169d209703fb089fbc400f5628dca7d8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/compiler/program.go: internal/compiler/program.go changed 15 times in last 90 days, max cyclomatic complexity 157 in Program.verifyCompilerOptions at line 857. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/compiler/program.go\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":"internal/compiler/program.go"},"region":{"startLine":857}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fddb394c40b8b25077ad21062c63c3ab7ec34f81f77f668523ca28a0af5713a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/relater.go: internal/checker/relater.go changed 9 times in last 90 days, max cyclomatic complexity 229 in Relater.structuredTypeRelatedToWorker at line 3293. 4 of those changes were fix/bug commits, and the other 5 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/relater.go\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":"internal/checker/relater.go"},"region":{"startLine":3293}}}],"partialFingerprints":{"codehealthFindingId/v1":"78bc90138354366169bd61b053d322755cdadb38050f43a73d07f98444913053"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/hover.go: internal/ls/hover.go changed 13 times in last 90 days, max cyclomatic complexity 132 in ls.getQuickInfoAndDeclarationAtLocation at line 380. 6 of those changes were fix/bug commits, and the other 7 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/hover.go\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":"internal/ls/hover.go"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"0014835a23a9e3f97261f4ade07bd05d24412b9f9102bdf42e37c69ce4fdec68"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/nodebuilderimpl.go: internal/checker/nodebuilderimpl.go changed 17 times in last 90 days, max cyclomatic complexity 91 in NodeBuilderImpl.typeToTypeNode at line 3224. 8 of those changes were fix/bug commits, and the other 9 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/nodebuilderimpl.go\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":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":3224}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e3620bf2928b5b07ba8b83e717f676b241c4260c9638c8829cb56ea3c23f4cd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/transformers/declarations/transform.go: internal/transformers/declarations/transform.go changed 24 times in last 90 days, max cyclomatic complexity 59 in DeclarationTransformer.visitDeclarationSubtree at line 574. 7 of those changes were fix/bug commits, and the other 17 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/transformers/declarations/transform.go\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":"internal/transformers/declarations/transform.go"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c51fc421038f9d77426c8cf3825806aa06ba971ae83fcaed9088ada9da98fcd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/grammarchecks.go: internal/checker/grammarchecks.go changed 6 times in last 90 days, max cyclomatic complexity 193 in Checker.checkGrammarModifiers at line 214. 1 of those changes was a fix/bug commit, and the other 5 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/grammarchecks.go\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":"internal/checker/grammarchecks.go"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ddc7b0f8d686506ce686fb2e16d866de68a291121261cfbd02af0794985663c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/tsoptions/tsconfigparsing.go: internal/tsoptions/tsconfigparsing.go changed 14 times in last 90 days, max cyclomatic complexity 72 in tsoptions.parseJsonConfigFileContentWorker at line 1237. 5 of those changes were fix/bug commits, and the other 9 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/tsoptions/tsconfigparsing.go\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":"internal/tsoptions/tsconfigparsing.go"},"region":{"startLine":1237}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b7a0d1dc57c2ef67d0685cef1a38c396caec9bd08e83232dac9433caeb0bbc9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: _packages/native-preview/src/api/async/api.ts: _packages/native-preview/src/api/async/api.ts changed 40 times in last 90 days, max cyclomatic complexity 25 in constructor at line 2249. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- _packages/native-preview/src/api/async/api.ts\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":"_packages/native-preview/src/api/async/api.ts"},"region":{"startLine":2249}}}],"partialFingerprints":{"codehealthFindingId/v1":"e85232d412a840dfaa18f546b242001c05e202971ae637fdc45b6cf4782be509"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/scanner/scanner.go: internal/scanner/scanner.go changed 6 times in last 90 days, max cyclomatic complexity 143 in Scanner.Scan at line 469. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/scanner/scanner.go\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":"internal/scanner/scanner.go"},"region":{"startLine":469}}}],"partialFingerprints":{"codehealthFindingId/v1":"01c11febba5c39cdca8d616f52738037133f029ee07b50159ad92698abcf2e2b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/api/proto.go: internal/api/proto.go changed 36 times in last 90 days, max cyclomatic complexity 22 in api.newTypeResponse at line 850. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/api/proto.go\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":"internal/api/proto.go"},"region":{"startLine":850}}}],"partialFingerprints":{"codehealthFindingId/v1":"15e45a3e739e0d29e078df42d26979f3a3b6f5867c0c4ddf8fa3a26ab7135fc6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/parser/parser.go: internal/parser/parser.go changed 16 times in last 90 days, max cyclomatic complexity 49 in Parser.isListElement at line 824. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/parser/parser.go\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":"internal/parser/parser.go"},"region":{"startLine":824}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf179da49fb34c8874e95de29d076d4f47df5181ec611cc7e29db43aa7d82bb5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: _scripts/generate-ts-ast.ts: _scripts/generate-ts-ast.ts changed 6 times in last 90 days, max cyclomatic complexity 99 in generateFactory at line 554. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- _scripts/generate-ts-ast.ts\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":"_scripts/generate-ts-ast.ts"},"region":{"startLine":554}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd3bf9ed9b9665ad0fea8cfc3814d7114af8315e6a88c10f66e09f7b2243726c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/parser/reparser.go: internal/parser/reparser.go changed 6 times in last 90 days, max cyclomatic complexity 97 in Parser.reparseHosted at line 342. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/parser/reparser.go\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":"internal/parser/reparser.go"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"d935b15ff1ef89e9d5cff19dd9acb1e63caf0486783f343fa5c9be0e506f7b2c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: Herebyfile.mjs: Herebyfile.mjs changed 22 times in last 90 days, max cyclomatic complexity 25 in sign at line 1311. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- Herebyfile.mjs\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":"Herebyfile.mjs"},"region":{"startLine":1311}}}],"partialFingerprints":{"codehealthFindingId/v1":"58895874b92bb414f08aacf60baeb2a6515dd56667df761b91853e692aa0db20"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/utilities.go: internal/ls/utilities.go changed 5 times in last 90 days, max cyclomatic complexity 110 in ls.getAdjustedLocation at line 459. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/utilities.go\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":"internal/ls/utilities.go"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39d37ae69b76093dfec5e1dbdc8edec8aaacba8d3590ac322ddac2e21bbdeb4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/fourslash/fourslash.go: internal/fourslash/fourslash.go changed 12 times in last 90 days, max cyclomatic complexity 45 in FourslashTest.VerifySignatureHelp at line 4328. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/fourslash/fourslash.go\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":"internal/fourslash/fourslash.go"},"region":{"startLine":4328}}}],"partialFingerprints":{"codehealthFindingId/v1":"398416fced89c6f110ba5c42a6426e5b1de123cba0c52e527fc3a7225274abd3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/pseudotypenodebuilder.go: internal/checker/pseudotypenodebuilder.go changed 7 times in last 90 days, max cyclomatic complexity 74 in NodeBuilderImpl.pseudoTypeEquivalentToType at line 362. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/pseudotypenodebuilder.go\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":"internal/checker/pseudotypenodebuilder.go"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbf9d1c00dce2e1d416a58b43c889042ada660c6e41f33bd13289b9c9039276f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ast/ast.go: internal/ast/ast.go changed 14 times in last 90 days, max cyclomatic complexity 36 in Node.Expression at line 310. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ast/ast.go\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":"internal/ast/ast.go"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"5025b1ba769a2157e9b950735cba3fa8d0c526b5b82305548e0ed510e7997969"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/lsp/server.go: internal/lsp/server.go changed 19 times in last 90 days, max cyclomatic complexity 26 in Server.supportsContentMapperRegistration at line 352. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/lsp/server.go\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":"internal/lsp/server.go"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0aba1eaa745ff4034d0e5feee258dc8e40a5b927d0476f0c75466f2841ec2d5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/nodecopy.go: internal/checker/nodecopy.go changed 3 times in last 90 days, max cyclomatic complexity 148 in checker.getExistingNodeTreeVisitor at line 288. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/nodecopy.go\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":"internal/checker/nodecopy.go"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"81af9a322344193cb4e26606f6a5d2779ec5cc50c959cf60b00bb8688424cdc4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/module/resolver.go: internal/module/resolver.go changed 8 times in last 90 days, max cyclomatic complexity 54 in resolutionState.tryAddingExtensions at line 1462. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/module/resolver.go\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":"internal/module/resolver.go"},"region":{"startLine":1462}}}],"partialFingerprints":{"codehealthFindingId/v1":"d62dd0f698680cb8ff86f6648d6539a47b6ed6459d73b823176a46b52ba2561e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/printer/printer.go: internal/printer/printer.go changed 6 times in last 90 days, max cyclomatic complexity 70 in Printer.Write at line 5069. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/printer/printer.go\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":"internal/printer/printer.go"},"region":{"startLine":5069}}}],"partialFingerprints":{"codehealthFindingId/v1":"e912ada53693b196e7489608bc739ddb0a4191304e2015df9926ae862f9c93df"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/flow.go: internal/checker/flow.go changed 9 times in last 90 days, max cyclomatic complexity 39 in Checker.isMatchingReference at line 1597. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/flow.go\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":"internal/checker/flow.go"},"region":{"startLine":1597}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7174a58da3afd9923f58dd4755eea3c4d6f279b842ddbf50704b16b20617459"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/binder/binder.go: internal/binder/binder.go changed 5 times in last 90 days, max cyclomatic complexity 65 in Binder.bind at line 572. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/binder/binder.go\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":"internal/binder/binder.go"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"39543be81b7388b7966c3c2d738953c9e48d930d71d9e9cc9611c925f3716b0c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/execute/build/buildtask.go: internal/execute/build/buildtask.go changed 4 times in last 90 days, max cyclomatic complexity 79 in BuildTask.getUpToDateStatus at line 351. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/execute/build/buildtask.go\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":"internal/execute/build/buildtask.go"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"c99ff9d961c4d92cfe0f983641242ba9d93d87f42c47febd8199bd23b495e669"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/autoimport/registry.go: internal/ls/autoimport/registry.go changed 5 times in last 90 days, max cyclomatic complexity 63 in registryBuilder.updateIndexes at line 782. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/autoimport/registry.go\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":"internal/ls/autoimport/registry.go"},"region":{"startLine":782}}}],"partialFingerprints":{"codehealthFindingId/v1":"02511617648fb03e67c396ca26c07225dff246d8b7dfc8c3190754da2ba70855"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/project/snapshot.go: internal/project/snapshot.go changed 5 times in last 90 days, max cyclomatic complexity 63 in Snapshot.Clone at line 265. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/project/snapshot.go\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":"internal/project/snapshot.go"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"183690e8dfa0559351c0e7814be12671724c26860e4fc241cf0a3f2513cb23c3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/emitresolver.go: internal/checker/emitresolver.go changed 9 times in last 90 days, max cyclomatic complexity 35 in EmitResolver.GetTypeReferenceSerializationKind at line 1172. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/emitresolver.go\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":"internal/checker/emitresolver.go"},"region":{"startLine":1172}}}],"partialFingerprints":{"codehealthFindingId/v1":"a69a76825fdc30ae41112942b50e50528c22226c852b26e74f70dc53738453bc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/fswatch/watcher.go: internal/fswatch/watcher.go changed 9 times in last 90 days, max cyclomatic complexity 35 in dirWatch.triggerCallbacks at line 927. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/fswatch/watcher.go\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":"internal/fswatch/watcher.go"},"region":{"startLine":927}}}],"partialFingerprints":{"codehealthFindingId/v1":"34181a54d0e1bb83fb2a9ff5a03b119688b613420f0a3cfe0583350d2fc8df92"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/findallreferences.go: internal/ls/findallreferences.go changed 9 times in last 90 days, max cyclomatic complexity 34 in refState.forEachRelatedSymbol at line 2587. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/findallreferences.go\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":"internal/ls/findallreferences.go"},"region":{"startLine":2587}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cc00c4d7cd1e95d5f86682316c7990a631f2841c63a3122143a24f3f789b2ce"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: _scripts/generate-encoder.ts: _scripts/generate-encoder.ts changed 8 times in last 90 days, max cyclomatic complexity 37 in generateTSNodeGenerated at line 1284. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- _scripts/generate-encoder.ts\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":"_scripts/generate-encoder.ts"},"region":{"startLine":1284}}}],"partialFingerprints":{"codehealthFindingId/v1":"79630c013253d3fb830f04b8f26cd3cf79230efb6bf02fa953c59f0b198ca87c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/fourslash/baselineutil.go: internal/fourslash/baselineutil.go changed 4 times in last 90 days, max cyclomatic complexity 72 in FourslashTest.getBaselineOptions at line 97. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/fourslash/baselineutil.go\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":"internal/fourslash/baselineutil.go"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2b31d09be8dbff6105b1fbaca57d1922c8d1028dc35f43396c2ad8e3807f715"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/project/session.go: internal/project/session.go changed 13 times in last 90 days, max cyclomatic complexity 22 in project.updateWatch at line 1537. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/project/session.go\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":"internal/project/session.go"},"region":{"startLine":1537}}}],"partialFingerprints":{"codehealthFindingId/v1":"19fca87b5f77ea1aa136067734100874f08abc29ce98a4f5164654bc95e28af4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/tsoptions/parsinghelpers.go: internal/tsoptions/parsinghelpers.go changed 2 times in last 90 days, max cyclomatic complexity 135 in tsoptions.parseCompilerOptions at line 279. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/tsoptions/parsinghelpers.go\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":"internal/tsoptions/parsinghelpers.go"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"01a83f3ad1482b555bd3b4e596ddf32ecc0b6a054b01008c726aa1938203f8a5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/scanner/regexp.go: internal/scanner/regexp.go changed 5 times in last 90 days, max cyclomatic complexity 45 in regExpParser.scanClassSetExpression at line 594. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/scanner/regexp.go\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":"internal/scanner/regexp.go"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c60018ccee720bcec1a686c72659cf6492dc697f075dd9db4a2c68d08ae042c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/execute/build/orchestrator.go: internal/execute/build/orchestrator.go changed 6 times in last 90 days, max cyclomatic complexity 37 in Orchestrator.checkTasksForEventChanges at line 306. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/execute/build/orchestrator.go\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":"internal/execute/build/orchestrator.go"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"92e1939f4846fa3c732738704db58e7c9b8a36e499514a932170deb8af789d49"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/string_completions.go: internal/ls/string_completions.go changed 6 times in last 90 days, max cyclomatic complexity 33 in LanguageService.getCompletionEntriesForNonRelativeModules at line 707. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/string_completions.go\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":"internal/ls/string_completions.go"},"region":{"startLine":707}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ab9f20de5353d9ed3f1cc15e2624f66548b8b5b5afcc9f3c9c17067a2fe8934"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/selectionranges.go: internal/ls/selectionranges.go changed 3 times in last 90 days, max cyclomatic complexity 66 in ls.getSmartSelectionRange at line 186. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/selectionranges.go\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":"internal/ls/selectionranges.go"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"2331f2e05d4c962a90d658c04249ad3dd9533033143124e7febd7907e61c3831"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/project/projectcollectionbuilder.go: internal/project/projectcollectionbuilder.go changed 7 times in last 90 days, max cyclomatic complexity 28 in ProjectCollectionBuilder.HandleAPIRequest at line 161. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/project/projectcollectionbuilder.go\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":"internal/project/projectcollectionbuilder.go"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ec6416dcbd3d3e080783b5427d66d7a554b3eb6bfe159d6fb2ce8dbbba9f37a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/jsx.go: internal/checker/jsx.go changed 5 times in last 90 days, max cyclomatic complexity 38 in Checker.createJsxAttributesTypeFromAttributesProperty at line 710. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/jsx.go\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":"internal/checker/jsx.go"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"742efda1aa627c4fb1da73b994116dbd4bb7b3ea7ffbbc8bdfc4c95ec6b680d6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/execute/watcher.go: internal/execute/watcher.go changed 6 times in last 90 days, max cyclomatic complexity 31 in Watcher.doBuild at line 408. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/execute/watcher.go\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":"internal/execute/watcher.go"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d4e188c93919e517a8045a85eadcef727f580cd61887ec5da8e2cdeef6d8fd7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/utilities.go: internal/checker/utilities.go changed 3 times in last 90 days, max cyclomatic complexity 61 in checker.CompareTypes at line 415. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/utilities.go\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":"internal/checker/utilities.go"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ff604d54bbad74b1bc5e0d7b0359ae14ad0eec3bf868a441dc18f239a8315d9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/inlay_hints.go: internal/ls/inlay_hints.go changed 2 times in last 90 days, max cyclomatic complexity 90 in inlayHintState.getInlayHintLabelParts at line 441. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/inlay_hints.go\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":"internal/ls/inlay_hints.go"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"1116c6991eb964f1b6c0f12c72ca504146b398aa0c6b8e40d0af65dbdae2cf04"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/parser/jsdoc.go: internal/parser/jsdoc.go changed 4 times in last 90 days, max cyclomatic complexity 45 in Parser.parseJSDocCommentWorker at line 193. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/parser/jsdoc.go\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":"internal/parser/jsdoc.go"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca0da72db4cc3d7402a95f87ce9fd01b781d546b5fdc4a8fc73835a256f7fb40"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/transformers/tstransforms/typeeraser.go: internal/transformers/tstransforms/typeeraser.go changed 2 times in last 90 days, max cyclomatic complexity 85 in TypeEraserTransformer.visit at line 43. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/transformers/tstransforms/typeeraser.go\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":"internal/transformers/tstransforms/typeeraser.go"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab84a2c4e9336815f2b66c42cdfb4baa073930b99c31944ee89177b8aeabc5bb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/signaturehelp.go: internal/ls/signaturehelp.go changed 7 times in last 90 days, max cyclomatic complexity 24 in LanguageService.createSignatureHelpItems at line 293. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/signaturehelp.go\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":"internal/ls/signaturehelp.go"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"47be8633be19bcd080d5922aa1bcb5a283ad2e647f4fe033f8002567bd5fa3fd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ast/utilities.go: internal/ast/utilities.go changed 6 times in last 90 days, max cyclomatic complexity 28 in ast.NodeCanBeDecorated at line 4269. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ast/utilities.go\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":"internal/ast/utilities.go"},"region":{"startLine":4269}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8762468996007ce2b30bd4c18b0397122c9a2216c18cb4f04ec210f3bbc4969"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/inference.go: internal/checker/inference.go changed 2 times in last 90 days, max cyclomatic complexity 77 in Checker.inferFromTypes at line 65. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/inference.go\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":"internal/checker/inference.go"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"39bb183fdedda58b1a3c91b11baccb606bd407669ee1eb076e669a8c4166d38d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: _extension/src/util.ts: _extension/src/util.ts changed 10 times in last 90 days, max cyclomatic complexity 15 in resolveTsdkPathToExe at line 323. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- _extension/src/util.ts\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":"_extension/src/util.ts"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"90f0202f2c8224cbd29e0037eb3fcb242cab8ba2500c5eee6a13dbcc30d37e45"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/fswatch/fsevents_darwin.go: internal/fswatch/fsevents_darwin.go changed 4 times in last 90 days, max cyclomatic complexity 37 in fswatch.fsEventsCallback at line 482. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/fswatch/fsevents_darwin.go\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":"internal/fswatch/fsevents_darwin.go"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"762722816b3ef91c51775618170de708b29cca1bf0e883184953739eaf21cf25"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/compiler/fileloader.go: internal/compiler/fileloader.go changed 5 times in last 90 days, max cyclomatic complexity 29 in fileLoader.resolveImportsAndModuleAugmentations at line 816. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/compiler/fileloader.go\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":"internal/compiler/fileloader.go"},"region":{"startLine":816}}}],"partialFingerprints":{"codehealthFindingId/v1":"4945c5723966f98b9f4413a997bcf437f0ee900396927af01950a7e406fd1aae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/project/overlayfs.go: internal/project/overlayfs.go changed 3 times in last 90 days, max cyclomatic complexity 48 in overlayFS.processChanges at line 222. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/project/overlayfs.go\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":"internal/project/overlayfs.go"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed8f504af75d2e7b5807357ef4d2bc4d7dc261bc8c9f395ba3fa0a5aa5d828c2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/lsutil/userpreferences.go: internal/ls/lsutil/userpreferences.go changed 9 times in last 90 days, max cyclomatic complexity 15 in UserPreferences.withConfig at line 685. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/lsutil/userpreferences.go\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":"internal/ls/lsutil/userpreferences.go"},"region":{"startLine":685}}}],"partialFingerprints":{"codehealthFindingId/v1":"183e70812b4038e15e127caac95cee9826f49115aebd0a7dc78b8febe19903c9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/compiler/filesparser.go: internal/compiler/filesparser.go changed 3 times in last 90 days, max cyclomatic complexity 44 in filesParser.getProcessedFiles at line 330. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/compiler/filesparser.go\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":"internal/compiler/filesparser.go"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"9089b9907fbe62d46540fe942dc60bc4bc5b0c034d5e773baa18fe324f920220"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/pseudochecker/lookup.go: internal/pseudochecker/lookup.go changed 6 times in last 90 days, max cyclomatic complexity 22 in PseudoChecker.typeFromExpression at line 262. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/pseudochecker/lookup.go\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":"internal/pseudochecker/lookup.go"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1ca0ddd51342202b680b60cca5132bdfe0adf3ee77c11609339b7a71694afaa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/jsdoc.go: internal/ls/jsdoc.go changed 3 times in last 90 days, max cyclomatic complexity 43 in ls.getJSDocOrTag at line 168. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/jsdoc.go\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":"internal/ls/jsdoc.go"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"be3a64f7768adaaa3401d0f2f17981f23912f4b0957c15948a525055ef8d9bbe"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/semantictokens.go: internal/ls/semantictokens.go changed 3 times in last 90 days, max cyclomatic complexity 41 in LanguageService.collectSemanticTokensInRange 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/semantictokens.go\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":"internal/ls/semantictokens.go"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cce1f8fa66f2ab6dfb82ca0bc1f29aaf2f297a23785080e10d3e05eadb87a42"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/astnav/tokens.go: internal/astnav/tokens.go changed 2 times in last 90 days, max cyclomatic complexity 61 in astnav.getTokenAtPosition at line 37. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/astnav/tokens.go\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":"internal/astnav/tokens.go"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"c50dc9d97261b6fec1016efe0b927c20fa24dc483a32d60d619aeee3df7b8f19"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/transformers/declarations/diagnostics.go: internal/transformers/declarations/diagnostics.go changed 4 times in last 90 days, max cyclomatic complexity 30 in declarations.createGetSymbolAccessibilityDiagnosticForNode at line 139. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/transformers/declarations/diagnostics.go\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":"internal/transformers/declarations/diagnostics.go"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"61ba7fe7dc314b42de991e74bc61ad898b2130190bb50e38420c32fcdf828e0e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/fswatch/kqueue.go: internal/fswatch/kqueue.go changed 3 times in last 90 days, max cyclomatic complexity 39 in kqueueBackend.compareDir at line 565. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/fswatch/kqueue.go\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":"internal/fswatch/kqueue.go"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd7cbc0dec64784324db6d106a9487afc218c67c6e07cc0aaeb89fd4338970e3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/transformers/estransforms/async.go: internal/transformers/estransforms/async.go changed 4 times in last 90 days, max cyclomatic complexity 29 in asyncTransformer.transformAsyncFunctionBody at line 712. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/transformers/estransforms/async.go\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":"internal/transformers/estransforms/async.go"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"dce47edf75558a918a78213b0cd384d74e7a21cc5c2b74cdfc7e6fd69abca740"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: _packages/native-preview/src/ast/is.ts: _packages/native-preview/src/ast/is.ts changed 2 times in last 90 days, max cyclomatic complexity 55 in isExpressionNode at line 241. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- _packages/native-preview/src/ast/is.ts\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":"_packages/native-preview/src/ast/is.ts"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"686dae9fedb6207d4995e4846983324f55897907e17a0983101b7b88d2b4e1fb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/api/encoder/encoder.go: internal/api/encoder/encoder.go changed 4 times in last 90 days, max cyclomatic complexity 27 in encoder.encodeTree at line 432. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/api/encoder/encoder.go\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":"internal/api/encoder/encoder.go"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"d95ca2c5bda6024c305888f0cacbb13351a38d0ca8c3bd6005d7c18e3d7a1717"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/testutil/harnessutil/harnessutil.go: internal/testutil/harnessutil/harnessutil.go changed 4 times in last 90 days, max cyclomatic complexity 27 in harnessutil.CompileFilesEx at line 115. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/testutil/harnessutil/harnessutil.go\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":"internal/testutil/harnessutil/harnessutil.go"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"10f5df0e1ccc627cdb26376b9f36c57554fa4ea4265ccf585bd43adc8fc438c9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/compiler/emitter.go: internal/compiler/emitter.go changed 6 times in last 90 days, max cyclomatic complexity 17 in compiler.sourceFileMayBeEmitted at line 464. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/compiler/emitter.go\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":"internal/compiler/emitter.go"},"region":{"startLine":464}}}],"partialFingerprints":{"codehealthFindingId/v1":"031fd0116a7b5012283cf70b43b6a985a3937c32c496cda5a723daa568ce25be"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/testutil/tsbaseline/error_baseline.go: internal/testutil/tsbaseline/error_baseline.go changed 3 times in last 90 days, max cyclomatic complexity 34 in tsbaseline.iterateErrorBaseline at line 78. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/testutil/tsbaseline/error_baseline.go\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":"internal/testutil/tsbaseline/error_baseline.go"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4a40446b2d2f94ca96a44f1928e8972e4e8b82fcce62d6b2110039d7d3f626c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/crossproject.go: internal/ls/crossproject.go changed 2 times in last 90 days, max cyclomatic complexity 51 in ls.handleCrossProject at line 45. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/crossproject.go\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":"internal/ls/crossproject.go"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b71d1728d4fa79bf881b62b21f4b5fe5b970caf9a7883499384e308b70cf195"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/project/project.go: internal/project/project.go changed 5 times in last 90 days, max cyclomatic complexity 19 in Project.CreateProgram at line 369. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/project/project.go\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":"internal/project/project.go"},"region":{"startLine":369}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e6f927c6b420b1ddeb6cc6cb8fb40a9fc5fd7f4cb38a4350ecca074ca93dc31"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/nodebuilderscopes.go: internal/checker/nodebuilderscopes.go changed 2 times in last 90 days, max cyclomatic complexity 47 in NodeBuilderImpl.enterNewScope at line 59. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/nodebuilderscopes.go\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":"internal/checker/nodebuilderscopes.go"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aa869a5b3164e1e97733cf2951ed80a046db771b2830b7bd3f8a89c46695d3f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/codeactions_fixmissingtypeannotation.go: internal/ls/codeactions_fixmissingtypeannotation.go changed 4 times in last 90 days, max cyclomatic complexity 23 in isolatedDeclarationsFixer.addInlineAssertion at line 320. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/codeactions_fixmissingtypeannotation.go\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":"internal/ls/codeactions_fixmissingtypeannotation.go"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"600bec27c32cebc0ea992db70b69ac03b1850f93512588ba6c2ebc0ebfd450bd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/transformers/declarations/util.go: internal/transformers/declarations/util.go changed 4 times in last 90 days, max cyclomatic complexity 23 in declarations.canProduceDiagnostics at line 25. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/transformers/declarations/util.go\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":"internal/transformers/declarations/util.go"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ccdab7a700365413106e6a3ed714791d9267cc1ec1340b70400c91b0cb003f6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: _extension/src/session.ts: _extension/src/session.ts changed 6 times in last 90 days, max cyclomatic complexity 15 in promptSelectVersion at line 546. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- _extension/src/session.ts\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":"_extension/src/session.ts"},"region":{"startLine":546}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d3c5f08a571fcd7685fbc22177b6ef530d2a416e0e00c79541121b5767a7553"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/execute/incremental/programtosnapshot.go: internal/execute/incremental/programtosnapshot.go changed 3 times in last 90 days, max cyclomatic complexity 29 in toProgramSnapshot.computeProgramFileChanges at line 73. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/execute/incremental/programtosnapshot.go\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":"internal/execute/incremental/programtosnapshot.go"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa03287825c253464818afbad4f5d4166014ae3458f6a4c6fa82dd049559b22"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/execute/incremental/program.go: internal/execute/incremental/program.go changed 5 times in last 90 days, max cyclomatic complexity 17 in Program.ensureHasErrorsForState at line 387. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/execute/incremental/program.go\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":"internal/execute/incremental/program.go"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"229c49a8ef5367389bf4cb55786949eebabf6b8543496748db97da2794d67670"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/execute/tsc.go: internal/execute/tsc.go changed 3 times in last 90 days, max cyclomatic complexity 28 in execute.tscCompilation at line 122. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/execute/tsc.go\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":"internal/execute/tsc.go"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"dae28bec1068b47da3bb4ba312cac473c05fe4d0aba8ac1dcb9a55fa0e0666f3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/fourslash/test_parser.go: internal/fourslash/test_parser.go changed 2 times in last 90 days, max cyclomatic complexity 41 in fourslash.parseFileContent at line 242. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/fourslash/test_parser.go\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":"internal/fourslash/test_parser.go"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"c219073094c984586f5a9a2a67a336372899d0293500a3516c3ecad9dc4f61f1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/transformers/estransforms/classfields.go: internal/transformers/estransforms/classfields.go changed 2 times in last 90 days, max cyclomatic complexity 41 in classFieldsTransformer.visitClassExpressionInNewClassLexicalEnvironment at line 2007. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/transformers/estransforms/classfields.go\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":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":2007}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c2d1a9623f9415a9a121e8a2d997531f3f69966a2c8523900b12214a9bda532"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/rename.go: internal/ls/rename.go changed 3 times in last 90 days, max cyclomatic complexity 27 in LanguageService.getTextForRename at line 368. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/rename.go\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":"internal/ls/rename.go"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"948839d7867a2e7799cb17e4dd88538298e29f52b7818f6ea85b338d5cf43d50"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/project/configfileregistrybuilder.go: internal/project/configfileregistrybuilder.go changed 2 times in last 90 days, max cyclomatic complexity 40 in configFileRegistryBuilder.DidChangeFiles at line 435. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/project/configfileregistrybuilder.go\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":"internal/project/configfileregistrybuilder.go"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"669c0a3c8be10ef80867c962116db97938689093081b8a40b53d78459b04bfb3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/execute/incremental/affectedfileshandler.go: internal/execute/incremental/affectedfileshandler.go changed 4 times in last 90 days, max cyclomatic complexity 20 in affectedFilesHandler.handleDtsMayChangeOfAffectedFile at line 180. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/execute/incremental/affectedfileshandler.go\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":"internal/execute/incremental/affectedfileshandler.go"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"42cd62fc46ca1f56ca5a8d904822b94825cfbc460f97770f97ec347c33c2212d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/format/span.go: internal/format/span.go changed 3 times in last 90 days, max cyclomatic complexity 26 in formatSpanWorker.processChildNode at line 334. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/format/span.go\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":"internal/format/span.go"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f06902f398629a61981c81a516561f1d38eb3ce394ff81bdd3cf49cc08e7c06"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/execute/tsctests/sys.go: internal/execute/tsctests/sys.go changed 4 times in last 90 days, max cyclomatic complexity 19 in TestSys.OnProgram at line 338. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/execute/tsctests/sys.go\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":"internal/execute/tsctests/sys.go"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a271104b58d9c4196fa1d6b147a174551ee97bc7d58c206d27f4b111788e246"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/folding.go: internal/ls/folding.go changed 2 times in last 90 days, max cyclomatic complexity 38 in ls.visitNode at line 158. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/folding.go\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":"internal/ls/folding.go"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"91dca7b927075e04e0d352800bddcb97797f5c2ae78a8648ac0c5d0c47c92341"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/fswatch/fanotify_linux.go: internal/fswatch/fanotify_linux.go changed 4 times in last 90 days, max cyclomatic complexity 19 in fanotifyBackend.handleSubscription at line 511. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/fswatch/fanotify_linux.go\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":"internal/fswatch/fanotify_linux.go"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"75592ebaab5dcc28ffb21ea35869f17cfb869f3f439a908b59c103d6d9cac1f8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/tspath/path.go: internal/tspath/path.go changed 2 times in last 90 days, max cyclomatic complexity 37 in tspath.GetNormalizedAbsolutePath at line 394. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/tspath/path.go\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":"internal/tspath/path.go"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"49e5f3f6b8f2883c11db1288580328f0352cb4aa4903996370e24cbbfca6e1b8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/file_rename.go: internal/ls/file_rename.go changed 3 times in last 90 days, max cyclomatic complexity 24 in LanguageService.updateTsconfigFiles at line 112. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/file_rename.go\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":"internal/ls/file_rename.go"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"10ef8d7d4e0b51ce0570f7c20ff0d48848402d7dcae189acf173c6d0d314fcfd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/printer.go: internal/checker/printer.go changed 4 times in last 90 days, max cyclomatic complexity 17 in Checker.typeToStringEx at line 59. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/printer.go\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":"internal/checker/printer.go"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"67f9dc23777195aee2e7d18cbf68c326c502f11a21b9bc8908c402b4b49dbe1f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: _scripts/generate-go-ast.ts: _scripts/generate-go-ast.ts changed 4 times in last 90 days, max cyclomatic complexity 17 in generate at line 848. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- _scripts/generate-go-ast.ts\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":"_scripts/generate-go-ast.ts"},"region":{"startLine":848}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a06a51e5a10cac26162a428d2de4b5233d09c684df5cc79137aff5a85cd30f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/change/trackerimpl.go: internal/ls/change/trackerimpl.go changed 3 times in last 90 days, max cyclomatic complexity 22 in Tracker.getInsertionPositionAtSourceFileTop at line 316. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/change/trackerimpl.go\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":"internal/ls/change/trackerimpl.go"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"16d2be43945436e0910c34c6db11f74a39ab73d2d8c50d77ecc25c12213716ed"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/autoimport/fix.go: internal/ls/autoimport/fix.go changed 2 times in last 90 days, max cyclomatic complexity 32 in View.tryAddToExistingImport at line 690. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/autoimport/fix.go\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":"internal/ls/autoimport/fix.go"},"region":{"startLine":690}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb54d721e73380e56c912ea278e201666466876ca0374fda88cecde9eb270ac8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/organizeimports.go: internal/ls/organizeimports.go changed 2 times in last 90 days, max cyclomatic complexity 32 in ls.coalesceImportsWorker at line 445. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/organizeimports.go\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":"internal/ls/organizeimports.go"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"b41980581a37ec73411a79586eee90b490cb96cd6d3bb320c276cf9fd13ec83f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/testrunner/test_case_parser.go: internal/testrunner/test_case_parser.go changed 2 times in last 90 days, max cyclomatic complexity 32 in testrunner.ParseTestFilesAndSymlinksWithOptions at line 138. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/testrunner/test_case_parser.go\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":"internal/testrunner/test_case_parser.go"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fbb4ab9b45fecb728b2757fd672ca574ff5677480f281e1a7f798e7f09cc422"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/transformers/moduletransforms/commonjsmodule.go: internal/transformers/moduletransforms/commonjsmodule.go changed 3 times in last 90 days, max cyclomatic complexity 21 in CommonJSModuleTransformer.visitTopLevelVariableStatement at line 976. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/transformers/moduletransforms/commonjsmodule.go\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":"internal/transformers/moduletransforms/commonjsmodule.go"},"region":{"startLine":976}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dc0072d14b18642762a1bcf326656dd68fe15b222ee4ef4fd1bb58d0c76023b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/symbolaccessibility.go: internal/checker/symbolaccessibility.go changed 2 times in last 90 days, max cyclomatic complexity 29 in Checker.getContainersOfSymbol at line 280. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/symbolaccessibility.go\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":"internal/checker/symbolaccessibility.go"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"faa11fc1a0181ee26be71ceea55912088717569bcc0b12f0047d9a3a0705c253"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/autoinsert.go: internal/ls/autoinsert.go changed 3 times in last 90 days, max cyclomatic complexity 19 in LanguageService.ProvideOnAutoInsert at line 14. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/autoinsert.go\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":"internal/ls/autoinsert.go"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"4840cfe89d2a0f2dd4e6ed4d522a7c5fe7ddbd4a400020c714aaa97ba07897b4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/testutil/tsbaseline/js_emit_baseline.go: internal/testutil/tsbaseline/js_emit_baseline.go changed 2 times in last 90 days, max cyclomatic complexity 28 in tsbaseline.prepareDeclarationCompilationContext at line 168. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/testutil/tsbaseline/js_emit_baseline.go\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":"internal/testutil/tsbaseline/js_emit_baseline.go"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdb0f6eb9b4282f31c63377652e61f0eef3fe1810aeaf6e7820e71006d816d70"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/tsoptions/commandlineparser.go: internal/tsoptions/commandlineparser.go changed 2 times in last 90 days, max cyclomatic complexity 28 in commandLineParser.parseOptionValue at line 237. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/tsoptions/commandlineparser.go\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":"internal/tsoptions/commandlineparser.go"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"16336bc4c935f8def852b1537fc7a812dd2576fd49423b6a4323d0ad720e71f4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/transformers/tstransforms/runtimesyntax.go: internal/transformers/tstransforms/runtimesyntax.go changed 2 times in last 90 days, max cyclomatic complexity 28 in RuntimeSyntaxTransformer.visit at line 79. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/transformers/tstransforms/runtimesyntax.go\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":"internal/transformers/tstransforms/runtimesyntax.go"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"97be5e1ea95fdcbb84dbde4cdb8160f2405c98711c3a001bd4064e87bbab4c09"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/codeactions_missingmemberfixer.go: internal/ls/codeactions_missingmemberfixer.go changed 2 times in last 90 days, max cyclomatic complexity 26 in missingMemberFixer.createMemberFromSymbol at line 52. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/codeactions_missingmemberfixer.go\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":"internal/ls/codeactions_missingmemberfixer.go"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fa4c7646a348e0ef09dccc2177c0c098dfcfcac73ec9dfd665e24f6ee92bed8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/checker/services.go: internal/checker/services.go changed 2 times in last 90 days, max cyclomatic complexity 26 in Checker.getSymbolsInScope at line 21. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/checker/services.go\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":"internal/checker/services.go"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd27257e56191af20c179bb485003a2298458fdc53022b03f1cab92f11b284b0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/lsp/lspwatcher/lspwatcher.go: internal/lsp/lspwatcher/lspwatcher.go changed 3 times in last 90 days, max cyclomatic complexity 17 in watch.reconcile at line 244. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/lsp/lspwatcher/lspwatcher.go\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":"internal/lsp/lspwatcher/lspwatcher.go"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef70f80f12b28795d43aafb6e35025799c0a616e18f19acee88f683a6706278a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/displaypartswriter.go: internal/ls/displaypartswriter.go changed 3 times in last 90 days, max cyclomatic complexity 17 in ls.classificationForSymbol at line 168. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/displaypartswriter.go\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":"internal/ls/displaypartswriter.go"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"732ad486b58b72a2887a23a78d3cd49be25022d9f348a9d45d0392e7fef6a3ee"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/autoimport/import_adder.go: internal/ls/autoimport/import_adder.go changed 2 times in last 90 days, max cyclomatic complexity 24 in importAdder.AddImportFix at line 189. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/autoimport/import_adder.go\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":"internal/ls/autoimport/import_adder.go"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fcb84ca4cb5ea7b38d6b8725ab7506084a0784506162f39b990e828997314a3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/codeactions.go: internal/ls/codeactions.go changed 2 times in last 90 days, max cyclomatic complexity 22 in LanguageService.ProvideCodeActions at line 79. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/codeactions.go\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":"internal/ls/codeactions.go"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c6b74d1e2c3badd62cdf815f4a6fb8c59641391dcc71eeaf6db12c834aab3ff"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/jsdoc_snippet.go: internal/ls/jsdoc_snippet.go changed 2 times in last 90 days, max cyclomatic complexity 22 in ls.getCommentOwnerInfoWorker at line 218. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/jsdoc_snippet.go\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":"internal/ls/jsdoc_snippet.go"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb0881234187f150027c6fbf7954c72a2d35888138483928454637a5dd01bb7b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/modulespecifiers/util.go: internal/modulespecifiers/util.go changed 2 times in last 90 days, max cyclomatic complexity 22 in modulespecifiers.ProcessEntrypointEnding at line 389. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/modulespecifiers/util.go\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":"internal/modulespecifiers/util.go"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eb8d50dc6d5b8ea95aefc6bf61dace47940c4df0a76ba97803b2ca939c7d0c8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/fswatch/inotify_linux.go: internal/fswatch/inotify_linux.go changed 2 times in last 90 days, max cyclomatic complexity 21 in inotifyBackend.handleSubscription at line 330. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/fswatch/inotify_linux.go\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":"internal/fswatch/inotify_linux.go"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"059a5c1f29f1844bfe3338da5ff4448372def992891295b935263e2ba08e2cba"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/sourcedefinition.go: internal/ls/sourcedefinition.go changed 2 times in last 90 days, max cyclomatic complexity 19 in ls.getSourceDefCheckerInfo at line 199. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/sourcedefinition.go\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":"internal/ls/sourcedefinition.go"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2e8f8538db68a9e8d0f0545c82e2a6858f9e5fa4f0ab645783ea9a91c114122"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/lsconv/converters.go: internal/ls/lsconv/converters.go changed 2 times in last 90 days, max cyclomatic complexity 18 in lsconv.diagnosticToLSP at line 486. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/lsconv/converters.go\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":"internal/ls/lsconv/converters.go"},"region":{"startLine":486}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b74c81f6b6cbce01a1d32b6fb673876ae3eb9db1cc1c2126bb226f3e02c53d4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/autoimport/view.go: internal/ls/autoimport/view.go changed 2 times in last 90 days, max cyclomatic complexity 17 in View.GetCompletions at line 178. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/autoimport/view.go\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":"internal/ls/autoimport/view.go"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"af2e38b7aaf37728d3a0f33ba93c2c88890ca9f896366fe9a3ef8eff26c09518"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/codeactions_importfixes.go: internal/ls/codeactions_importfixes.go changed 2 times in last 90 days, max cyclomatic complexity 17 in ls.getFixInfos at line 172. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/codeactions_importfixes.go\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":"internal/ls/codeactions_importfixes.go"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b39f21164ed5fe3244f8df01f505ce5a39089eb5ffb4b9b868695aeb73aa3e0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: _packages/native-preview/src/api/node/node.infrastructure.ts: _packages/native-preview/src/api/node/node.infrastructure.ts changed 2 times in last 90 days, max cyclomatic complexity 17 in modifierToFlag at line 97. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- _packages/native-preview/src/api/node/node.infrastructure.ts\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":"_packages/native-preview/src/api/node/node.infrastructure.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec6b8ab0b2536d52d92237f77d66ea1c14041172f1a7ad3b1d341da1219fa3a9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/testrunner/compiler_runner.go: internal/testrunner/compiler_runner.go changed 2 times in last 90 days, max cyclomatic complexity 16 in testrunner.newCompilerTest at line 266. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/testrunner/compiler_runner.go\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":"internal/testrunner/compiler_runner.go"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"03b8a47a666e13d2cca3b0802084e7feb0e7716c0c81a945719784b4911c9f3c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/execute/watchmanager/watchbackend.go: internal/execute/watchmanager/watchbackend.go changed 2 times in last 90 days, max cyclomatic complexity 16 in watchmanager.PerceivedOsRootLengthForWatching at line 90. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/execute/watchmanager/watchbackend.go\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":"internal/execute/watchmanager/watchbackend.go"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dd463c3f21dcae1954b674378cf96199c4c32b19d32be330fb7f00d9f6c4c64"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/ls/lsutil/utilities.go: internal/ls/lsutil/utilities.go changed 2 times in last 90 days, max cyclomatic complexity 15 in lsutil.ProbablyUsesSemicolons at line 16. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/ls/lsutil/utilities.go\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":"internal/ls/lsutil/utilities.go"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"adf437d881146dd96659c176a608fbcd15cefbe078ee369512aaee7638aac876"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: internal/tsoptions/parsedcommandline.go: internal/tsoptions/parsedcommandline.go changed 2 times in last 90 days, max cyclomatic complexity 15 in ParsedCommandLine.GetOutputFileNames at line 209. 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-05-22..2026-08-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-05-22 06:46:10 \u002B00:00\u0027 --until=\u00272026-08-20 06:46:10 \u002B00:00\u0027 --full-history --no-merges -- internal/tsoptions/parsedcommandline.go\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":"internal/tsoptions/parsedcommandline.go"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f74d3f9f8ec1a4d183f2c332f78ba3500859e301352dc2f6b5cca582292e672"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 7 significant file(s) lose their only recent owner: internal/fswatch/fsevents_darwin_ffi.go, internal/vfs/vfsmatch/vfsmatch.go, internal/glob/glob.go, internal/fswatch/event.go, internal/bundled/generate.go, internal/jsnum/jsnum.go, internal/json/json.go. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"455397bfbbd845dcf78d0c290fe13a19d86d36f506b34440b69d101af6ac24c4"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 5 significant file(s) lose their only recent owner: internal/ls/jsdoc.go, internal/project/dirty/syncmap.go, internal/project/refcountcache.go, internal/project/parsecache.go, internal/project/filechange.go. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b9276176d375aa7d7afa1ebeaf9f4651d3dc25f0901e0c2e9a027a39745010e4"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 1 other contributor(s) are each the sole owner of a small amount of code below the off-boarding threshold \u2014 folded into the bus-factor score and metrics (14 single-owned of 350 analysed files in total, counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 350 of the 501 production source files in this repository met that bar). They are anonymized user #3 (1 file(s)) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support the standard reload/go-to-project-config commands while \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/session.ts"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f4cb02c6f54fad3cdb4a3f80612e1665b99cd4c7ceaa2469bad72eb74b3066"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement notification handling \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/session.go"},"region":{"startLine":912}}}],"partialFingerprints":{"codehealthFindingId/v1":"627acb62221e8dbf3173ea62f930fdf75d5e814e64a63b08825f8ae4164159b0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add logging support \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/api/server.go"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c022e2e90798c19f0c11ece666b16816bd82ea243248c83341b087ed77b2f03"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rbuckton): Move \u0060node != nil\u0060 test to call sites \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ast/utilities.go"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eb86aa6728d5562f5266e7c9903da1c62b62734974cc3082bedb302e413fdb4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rbuckton): Move \u0060node != nil\u0060 test to call sites \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ast/utilities.go"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"35e3dbbe6fe782ed7bfd1ddd353331ef2a71bdf01988af794131bd0ee4d41c7c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should we deprecate \u0060IsExternalOrCommonJSModule\u0060 in favor of this function? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ast/utilities.go"},"region":{"startLine":1674}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5f6a979eb22f0bc06df888c945be7a8f60cb9ec3179f0f9c6c9eccb20850c10"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rbuckton): ParameterDeclaration decorator support for ES decorators must wait until it is standardized \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ast/utilities.go"},"region":{"startLine":4290}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf0c16df052dd22995aa17d7e531b433e21de0aa8f3a7bc5c7e125329916ca81"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // UpdateExpression:            // TODO: Do we need to investigate the precedence here? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ast/precedence.go"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4799a9240d67093799985ad443e029164b53850bf146b664dc284527f9c26be"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: JSXElement? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ast/precedence.go"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e4f6e35982fd7f8be3f0d52b131ae9a7cd4757f35b788c45df6b40b7b61852a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should prefix \u0060\u002B\u002B\u0060 and \u0060--\u0060 be moved to the \u0060Update\u0060 precedence? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ast/precedence.go"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3719133c9a07b7831271edb8f5b884a7c646db39c6bbdeb0f7a5ddcfd86f940"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //      TODO: Make this a more specific error and decouple it from the exclusion logic. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/binder/binder.go"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"215d1b5380483621fd9c50a77872c3b53ff87659229f8073edd0a65fb48221bc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: JSDoc support \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/utilities.go"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ab60f31e183b1a6b457cf06ad4518f0eb1d345175eeb8b1ab32f68f6009f5ea"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: JSDoc support \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":625}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eddcda33e85ec458f0e2e21f3b4d2b625e7aaf43a2bff92c10a66c6e702babe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: JSDoc support \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/util.go"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"d96239496712c617af2437ff21c80a155485a1e2807a846488ee6bfac32f0b1f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: JSDoc support \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/transform.go"},"region":{"startLine":1734}}}],"partialFingerprints":{"codehealthFindingId/v1":"1147ef888eecfba330f4f1b98504b7d52456870e24376967edc8373007528abe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Strada bug? Why is this allowModules: false? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/symbolaccessibility.go"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a5bd64b951ab2a413a52094afb07c4da868f296f54b0295632ac81771f4a888"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: going through emit resolver here is weird. Relayer these APIs. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/symbolaccessibility.go"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7634bfa5ab5f8916e26766a56151fcfb1c5601f59fa9374b2534064426ad31e6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: going through emit resolver here is weird. Relayer these APIs. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":2083}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f5b805827f8f614f9b2aa646fe9f34db154ce5444710f0f82449f7af2b8241f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: the below is shared with similar code in \u0060resolveName\u0060 - in fact, rephrasing all this symbol \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/symbolaccessibility.go"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"c116d8a5dc7cf2dbcd2377027c22c7143db995fab09aec5aed0364b80ec0ac8d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should this filtered table be cached in some way? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/symbolaccessibility.go"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"c13fad2f3dc3f6da840d308962a005eb9a3bcc34d3db8d4d009264fe9193a8f5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Cache symbol existence for files to save text search \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/services.go"},"region":{"startLine":647}}}],"partialFingerprints":{"codehealthFindingId/v1":"46f84e314fc1e9eac35062cd98813cea5ab9be76a1b538b94e4d7c954dca9216"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: remove this when we support static private identifier fields and find other solutions to get privateNamesAndStaticFields test to pass \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/relater.go"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b70e500ea8fc9328fc7b4469ddc842fa3954ab0c7e05fb704808d20b1c843ee"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Stack errors so we get a pyramid for the \u0022normal\u0022 comparison above, _and_ a second for this \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/relater.go"},"region":{"startLine":3250}}}],"partialFingerprints":{"codehealthFindingId/v1":"b94fab95bb81a684d6c69f2085957a82d9d85f2b8518ea09d52792186bc7baa9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Find a nice way to include potential conditional type breakdowns in error output, if they seem good (they usually don\u0027t) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/relater.go"},"region":{"startLine":3587}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcb243302a15cb662c31d132e3f21a69b3ec1b1865dc5b43ff18a95da80f787e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: spread tuple params may mess with this check \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/pseudotypenodebuilder.go"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"d534b44c61557d2f036b16d6acfc6aa7b9cf5c13aae66cdd183bcb3923d5e5c0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: only literal types currently mapped because this is only used to determine if literal contextual typing need apply to the pseudotype \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/pseudotypenodebuilder.go"},"region":{"startLine":690}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc8c58303e82e12288152bc7dde6fa0571a568cc888a5552cf09ae8850670798"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: extract type selection logic from \u0060serializeTypeForDeclaration\u0060, not needed for current usecases but needed if completeness becomes required \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/pseudotypenodebuilder.go"},"region":{"startLine":704}}}],"partialFingerprints":{"codehealthFindingId/v1":"570c90059f7fba76a9f6edc994f40a64ec06f5f14df0eeec0e931c4fb45140ec"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Memoize once per checker to retain threadsafety \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/printer.go"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"129fac9568c642ec1aaaf95ce683e3f9e9444ca7596bab66df35daaf2dea6085"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: GH#18217"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/printer.go"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a475c28c55af5681510490dbc17705721932355dbc42439d15743d1a8abb40d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: GH#18217"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/printer.go"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f87398ad45572a17b07ff626e8503dca6d5cdeb5d4f81bb6597ed5d70a3534f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: GH#18217"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/printer.go"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"38c8c375bf25e6fba07de04510b288d126eda7e83a5264591ff71d65f40eaf5e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: GH#18217"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":3064}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a2dbe513e31e36fc7c76012714562c4217882d0510e2e177c161d4691de7487"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: GH#18217"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":3240}}}],"partialFingerprints":{"codehealthFindingId/v1":"150226a44efbb06184f1416cd9ac851b6e9876c204ee9aa6fee4f4a506be321c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: GH#18217"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":3482}}}],"partialFingerprints":{"codehealthFindingId/v1":"9706f07c89e9776eb216ea40b570b5b96daa22b5b31de2dca75294da1000cdeb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: GH#18217"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":1559}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1259fa8ee274c457b79352f14a340512ce9c09bfdf74509627c47a52b92354b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: GH#18217"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":15232}}}],"partialFingerprints":{"codehealthFindingId/v1":"c707bfebfd3e4ddb848fdbabe9d9845ee00a8bbba33b324d711585dcc4a27ad3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: GH#18217"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":29074}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1ecc8ddd1700a4772f777fbbe8026effd07d2196734bca2a5d2071afa154e40"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: GH#18217"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/findallreferences.go"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"272918656de69fc257872bfbb4d13e8072b9f9a87054b683d3ed455aed28bf12"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: Cache visitor and just reset bound\u002Bhost builder? We try this for a *lot* of nodes. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ad30c35d6fe1da5993083c2ff8f28d62eab4450fdb8c64fed4761e9107b8f8f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: wrap all these closures into methods on an object so we can guarantee we reuse the same memory on each invocation by reusing/resetting the object \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d16f64b961d02411eec909d418b25c94f630b18baccfdb1ef12065a64d976ef"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // refers to type parameter remapped by context (TODO improvement: just return the remapped param name?) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"5273516b3a3aec2ce65b171201b873cc935fb27f690b9b99b45aa0ae603a68f0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: remappings like \u0060promise\u0060 -\u003E \u0060Promise\u003Cany\u003E\u0060 are static, we *could* statically remap the nodes, too. But that only matters for \u0060isolatedDeclarations\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d5742bf4333523bf5587739c3df2bf5bba417c2403ea797a77092c11e9fc676"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: the reparser *should* make all the jsdoc remapping logic here redundant, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"6810a0c578f5ac0bfcfedbf9ba34ab7f47a5693e9fabaccb3b76ef440d704e75"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: We don\u0027t _actually_ support jsdoc namepath types, emit \u0060any\u0060 instead; verify we handle as gracefully as strada \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ee61a2280b7aa3a876a0c07d8860303d7bbdbb7398373f172fccd95e69764a3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: verify JSDocUnknwonType is hopefully just parsed into \u0060unknown\u0060 upfront; the kind no longer exists \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b1dd46f3c3d5d420e0efa97652a278ccc8d360346bd48f1a3831e467ee2cd4f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: verify this matches how jsdoc variadics are actually handled now? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":505}}}],"partialFingerprints":{"codehealthFindingId/v1":"334e276eae23f50849a9dd49036ae0afa466dcb612a66115e23d57de6cb3622d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: without typesystem backup, doing this cast unguarded seems really suspect, even though it is what strada does \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd00f49236773a9595f9994f97cde5077ce6e65de7354aeee459c16ca0bce5fa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: alternate lookup locations for the type? serialize on demand if it doesn\u0027t serialze? strada does something funky here. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"47407f56d1c8653a74448fd71fce43f469b863355d3e7ce791b777144e98d0dc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // if (ast.IsExpressionWithTypeArguments(node) || ast.IsTypeReferenceNode(node)) \u0026\u0026 ast.IsJSDocIndexSignature(node) { /// !!! TODO: JSDocIndexSignature handling hasn\u0027t been ported - readd if it\u0027s readded \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":533}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac4deb08103f48788a8b76c2dcf6f1d609d7cca133cac428635811567e20c52b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: strada never marks \u0060this\u0060 type nodes as an error - it calls \u0060canReuseTypeNode\u0060 on it, but that function always returns \u0060true\u0060 for \u0060this\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":553}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3298d972abc31661c31dbab73aa6da39c6ecc64edf06df973dd7f24acd6c62b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: invalidate node reuse if js fallback logic used in type param list/typeof lookup (but isn\u0027t this logic gone?) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":627}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6f05617257bbdebde73d07ab737a1f286164a3211775f00e26e7d1d94f15ce1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: This matches strada, but rather than recursing, this should probably fall down to later cases. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaf18918d5715b59b996b56aa90be07e11dea1e73e00e91a430902c3bcb0c692"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: this condition matches strada, but it just seems wrong? Or at the very least extraordinarily approximate, and doesn\u0027t flag a builder error... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"500ff544a729aa6c265bbc2f33c9aca9e603977d75a6773deab692a15b8612ef"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: rewriting computed names based on evaluator/typecheck results? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":756}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a97af1fd3469943f117ac76fa309c21fde7f5285f56ac3009f2ca32bbec5657"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: impossible in combination with the scope start check??? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":842}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7236da962dc3d2437f45ad8e57ce9bba950a2284ae864ce56ea0585d18add4d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this fallback matches strada behavior, but it lacks any verification that the type from \u0060node\u0060 actually matches \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodecopy.go"},"region":{"startLine":869}}}],"partialFingerprints":{"codehealthFindingId/v1":"37b10ec869b02c8d2f264825a0ae71b52db7ed991495158b25b9a0f1bcdde20e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: smuggle type arguments out \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":622}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a4d26b1f534496f88406b77f9e1712c07da6fd80209bdaf4e0f9c38d2e00657"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: smuggle type arguments out \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":717}}}],"partialFingerprints":{"codehealthFindingId/v1":"4eb2e5b32a8bb43e7b073deb7dc0c24207213b17142367bba3de3bb25cde39e4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: smuggle type arguments out \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":1434}}}],"partialFingerprints":{"codehealthFindingId/v1":"285cf32dc836fb062682cb8226da91c2cc5988569f937190a23339050851f180"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Audit usages of symbolToEntityNameNode - they should probably all be symbolToName \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":635}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f4d07e2e980e97b044d2b2960fb22ce647fedb241c206c743158f1961a4ab76"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: shouldn\u0027t be possible, \u0060lookupSymbolChain\u0060 should always at least return the input symbol and issue an error \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":647}}}],"partialFingerprints":{"codehealthFindingId/v1":"010372f7478087e317ced8e581fde4e5ae5c054c5766f9b4f71c28334c3310d3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Just use b.ctx.enclosingFile ? Or is the delayed lookup important for context moves? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0c2bd48b3e2ecefc9e99ad5eefbb5df9e2838b6da51c4e8bcc5bc94627ca036"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: the follwing in strada would assert if the number is negative, but no such assertion exists here \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":898}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4f810efbdc9a39d5f4b01d629a56dcbe1ee461f7c9fef67e2202adae1eccb39"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: in strada, this only used \u0060isIdentifierStart\u0060 on the first character, while this checks the whole string for validity \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":916}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b75d14d42024fc323a9b8dc500a48721518013f9d72466c04696ffe57c59d51"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: JS Object.defineProperty declarations \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":990}}}],"partialFingerprints":{"codehealthFindingId/v1":"b44cc43a034d456d25e80d23490ec7d5ab4d78452e008ea3047e59a967545f3b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: move \u0060lookupSymbolChain\u0060 and co to \u0060symbolaccessibility.go\u0060 (but getSpecifierForModuleSymbol uses much context which makes that hard?) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":1060}}}],"partialFingerprints":{"codehealthFindingId/v1":"7415772a3060769855cd6d51b029ca15eee0a073a2d7cfb7d1af0e4d597d4cb0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: shim, add node reuse \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":1740}}}],"partialFingerprints":{"codehealthFindingId/v1":"48bc41bca130bedad56deb85ac372c34da81b1320be210c82d497d103708d840"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: assert name is Identifier \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":1892}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d061033cf83e7a787f142e529adad8a67e718f82027f19e31b9c107e2cf6c3f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: assert name is Identifier \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":1895}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2b5ebc34d309e11e5364bf24834ca4547760513a8d6e86125036afb5be69e8a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: Smuggle type arguments of signatures out for quickinfo \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":1903}}}],"partialFingerprints":{"codehealthFindingId/v1":"76f9e0889c12303402ae129702d5b4bfd4326d94beab57d1344d7ca5d35e06e1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: getTupleElementLabel can no longer fail, investigate if this lack of falliability meaningfully changes output \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":1961}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bdccddf010690ebf3936612d5ade19f322a7a0118f5dd6ab790c54df5d8fa00"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: If annotated type node is a reference with insufficient type arguments, we should still fall back to type serialization \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":2059}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5d18a5f670984e6f18b18106d6e6b363698383b726ab316a388dfe2c4bfdd61"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: If annotated type node is a reference with insufficient type arguments, we should still fall back to type serialization \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":2250}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c1ae4296122e305dcc2a0bca6e5fd59ea6b37af5a342c8da60e21943629d35f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: prefer annotated declarations like in strada (but does this ever even matter in practice? All callers should supply a declaration!) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":2186}}}],"partialFingerprints":{"codehealthFindingId/v1":"db0290efa91c720d9dd3cf98590e7d5553c96f86230d37608e73412eacc2c269"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: JSDoc, getEmitResolver call is unfortunate layering for the helper - hoist it into checker \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":2215}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7940de9ad60911728fe56c121a895cc3c391e340e9696ed556e3d53b432d005"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Why? Reasoning lost to time. this could probably stand to be improved? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":2333}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec7a24ecf5df3f0ea9c26d70bab5ea1ef33fa326bf02bd7fe7fc6fadf04b9a52"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO:: check if we instead store late painted statements associated with this? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":3161}}}],"partialFingerprints":{"codehealthFindingId/v1":"3360edfa91556cb3863a88c973cd74675174915519e14ba079ad3643f4f2bb04"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: Attempt node reuse or parse nodes to minimize copying once text range setting is set up \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/nodebuilderimpl.go"},"region":{"startLine":3206}}}],"partialFingerprints":{"codehealthFindingId/v1":"38cbbd4d416f1df4ca7bf3aaa77e518b8c41466639461c19cbfe2da2af15cce2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(danielr): should we return early here? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/grammarchecks.go"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"b43f67579793882a1e612c3a1f7ac6f5d52c18cb0c7cc70336836e60b891e7be"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(danielr): why not error on the token? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/grammarchecks.go"},"region":{"startLine":873}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3fad5434299e7b68da99fa07536d3be67898505e8966439632b2d00c145c768"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: The spec needs to be amended to reflect this grammar. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/grammarchecks.go"},"region":{"startLine":2006}}}],"partialFingerprints":{"codehealthFindingId/v1":"02607d49248945249c2b6c5038e4a8c64c75f34356430c16340e18345130bdfc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Require an emitContext to construct an EmitResolver, remove all emitContext arguments \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b11e83687de17068db6c806e9b3a0353897103db858c95b8095af58efe1fcaa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // ast.KindJSDocEnumTag, // !!! TODO: JSDoc @enum support? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"91b9d7b556d33d39bf2e8010778a92701d1e54ae64371d39cdf8d22204f699bd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Does this even *have* to be an upfront walk? If it\u0027s not possible for a \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"0257f2e905cf5da5d2ba60346aefc551626eea7aa7ab6daed8828f0a45da0997"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: JSDoc Support \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":630}}}],"partialFingerprints":{"codehealthFindingId/v1":"04f92c3a477066df6c00355d8428122beac9ef58d19417973fe530ec8014a35e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Split into locking and non-locking API methods - only current usage is the symbol tracker, which is non-locking, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c73f20b6915b164c4de149724bc3bab191cbadf504b17a6accdb94d71c99d9a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: the emit resolver being responsible for some amount of node construction is a very leaky abstraction, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":946}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc5c8aff87ad5788b7e33aa184ee84cc490a0b41773c539bfaa4c88e0aa2e66e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: cache per-context \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":958}}}],"partialFingerprints":{"codehealthFindingId/v1":"2657c018fbe01f5261c0c2ddf8a506391d4dbce756f36241c3709114e7b5758c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: cache per-context \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":970}}}],"partialFingerprints":{"codehealthFindingId/v1":"c184c18876ae23b5e0cb3095c792170715c9a752e611f104f15424d75bea2936"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: cache per-context \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":982}}}],"partialFingerprints":{"codehealthFindingId/v1":"43b8c543923ac36263217e655ae4f4f43f0830f66aff1ed167d55d15297213c0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: cache per-context \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":1001}}}],"partialFingerprints":{"codehealthFindingId/v1":"5031cdd5ddedfa24ccdb12d35bd5a9803f2816e434e2fbeb4db359ceaed84301"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: cache per-context \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":1057}}}],"partialFingerprints":{"codehealthFindingId/v1":"236270c401fa4758f8df6c400a9fd534b629ffcc3de88e0ddfa657ae8a95da56"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: cache per-context \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":1075}}}],"partialFingerprints":{"codehealthFindingId/v1":"3384b84b32fddede20e537c4ba7d12fbe2bdc599917d6a291e5b4cd319656bb2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: cache per-context \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":1284}}}],"partialFingerprints":{"codehealthFindingId/v1":"cde756c6287831f4668025aa5a68fce513e1824b14f09c6557c0bca3731bf913"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: How!? Maybe this should be a panic. All symbols should have a type. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":994}}}],"partialFingerprints":{"codehealthFindingId/v1":"677bbf06f8ab10aec27efe326c05d4946a613b08302127d215bfa31fb9191785"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: handle those if this function is ever used for more than initializers in declaration emit \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":1004}}}],"partialFingerprints":{"codehealthFindingId/v1":"569516622b2ea41270da0d96875995dc20607338864e285464f212437b8de03b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: Complete late-bound index info support - getObjectLiteralIndexInfo does not yet add late bound components to index signatures \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/emitresolver.go"},"region":{"startLine":1094}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cec60873a1c024539fc7fcf03a6fa67ba45d591371263c475582fcaf41f8f2c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: enable this code once we support region diagnostics again. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":2425}}}],"partialFingerprints":{"codehealthFindingId/v1":"98002fd7562e7a9d973af708ec4fcb38d275d82ef6947f12885164974c42f654"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(danielr): should these be grammar errors? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":5689}}}],"partialFingerprints":{"codehealthFindingId/v1":"e20d50649ec7bdb774af14ff5a69c13cf5bdc91e3e0d57071146e23ceab74b5a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: The signature may reference any outer inference contexts, but we map pop off and then apply new inference contexts, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":7754}}}],"partialFingerprints":{"codehealthFindingId/v1":"66cbe8d24bf172ba9ef84f4bfb735eae3a2eea6334785c4d071cd7aae765bfc7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Maybe issue a better error than \u0027object is possibly undefined\u0027 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":12269}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7bfbe9895bd7023cfcc19646fa3f2c344aa08a93e0b6e495bde348afd5d0071"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: how to get name for export *? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":14600}}}],"partialFingerprints":{"codehealthFindingId/v1":"03a109f69770b630abcd2d0ecedda9d4c0282850139f3e45d0561e729ef30d87"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: remove ScriptTargetES2015 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":18075}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5be1a79c24b3e1a987d6de7c18d45415e9742d92b9e72bd7354286c2be08c60"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Given that we allow type parameters here now, is this \u0060!isGenericMappedType(type)\u0060 check really needed? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":19658}}}],"partialFingerprints":{"codehealthFindingId/v1":"885ae3f24207b416494aecb2f3b45db01a286fdb3f694efa9c411b55ff0c31a8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: GH#18217 If \u0060checkBase\u0060 is undefined, we should not call this because this will always return false."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":19664}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcbfcdb021cc071925e2676738b91e524abdef0f78722c5a2e4524bdfc717c96"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Adopt same permissive behavior in TS as in JS to reduce follow-on editing experience failures (requires editing fillMissingTypeArguments) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":23310}}}],"partialFingerprints":{"codehealthFindingId/v1":"80d9a7310f07b871fd6161a42cb8c7ef1b42b4e3749bbfc7caaaef6e23826e64"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Future work: support unions/generics/whatever via a deferred import-type \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/checker/checker.go"},"region":{"startLine":24709}}}],"partialFingerprints":{"codehealthFindingId/v1":"468f8390473231fd4c695b058eb74e7d3ccee4a9771d6ab28c0f6826449f655f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: is this needed? Can we just MarshalEncode k directly? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/collections/ordered_map.go"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"d91fdffe47f38092821af53a641a5b2c056149358245cff33962dfc5dc34b9b3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: reconsider \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/collections/ordered_map.go"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"01c7c824149c24e0e4b59526aa8701d8a447ce4dfae35b32a7140c9e2684be1f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: The module loader in corsa is fairly different than strada, it should probably be able to expose this functionality at some point, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/compiler/program.go"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c5e19b06facbb789dc28a3f5119202efaaa0539ae8f51514a38cfdc047e67d0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: reverify compiler options when config has changed? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/compiler/program.go"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"becc4bb913ba1b948b621dfa674a8cfd0256cce9e4a57b574d320e6cfe28d2d4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! todo sheetal caching \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/compiler/processingDiagnostic.go"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"dabc611f6d2253b7d01c750bebeae568390c48e872cea138cd5c7c4efd89cbdd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(jakebailey): dedupe \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/compiler/fileloader.go"},"region":{"startLine":814}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a6f0a37177e1cd601bd687338df07393c3420cb46887842a6e5aeb409e8f370"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: move this to outputpaths? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/compiler/emitter.go"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"f53082f28b41676aeaf7b54f9ec83da67c275d63183f0bcc3d1df1c9af641a66"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use p.getSourceFilesToEmit cache \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/compiler/emitter.go"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5700f8347bbbad7a8bf301b15605b8a2e591e026c877ecca81fc12539ea438a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: cache \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/compiler/emitHost.go"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"b093589a65f1e7410c456619e1d25a8435c4aa7d437cbed5980954e5f43989e4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this could be generated code instead of reflection. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/core/compileroptions.go"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc26e7b6b57e8191c5ccba8790382e6656899285f9e9f9e4f9cb6f6570f90f89"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO in 6.0: add Node16/Node18 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/core/compileroptions.go"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"84f1bb7c888dad5fddddcdd87ac54682e850f544b1d8d9b652287a5a733687ee"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO (drosen): This was never localized. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/diagnosticwriter/diagnosticwriter.go"},"region":{"startLine":509}}}],"partialFingerprints":{"codehealthFindingId/v1":"6df3fca4a05dccfa8ecbcfd613d448189bf0029100154ba428bb1c61b99c026b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: incremental suggestion diagnostics (only relevant in editor incremental builder?) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/execute/incremental/program.go"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac9473c94e4b3091850e2db7dfaff1041c5ad0c2703be65eb43dc1dffc18e4f1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo watch \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/execute/tsctests/sys.go"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d67b394beaf84253f3e042338b0714ddc729eee224c4e31546c3bb439b0b0a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: matches strada - seems like it could handle more pairs of braces, though? [] notably missing \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/format/util.go"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"e880f717f64aa7b8dc8f952cea5eb583f1ad3b508c4f196ce18c6eeb4bcd30e0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: nil check??? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/format/span.go"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1a4f1ad4e410d9681f62cadc3566cc6aa31b0816c3d559e4e9c289dd06d7e16"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: redundant? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/format/scanner.go"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"281b3a9d2308343b01dc17b96263fc82bacd3ce81c24bf1f4e01ceb5d0da8f20"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/format/rulecontext.go"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"09514d9236dffaf13b67979862382e9933315287e4598726dce7df740c86c0c8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: very different from strada, but strada\u0027s logic here is wonky - find the first ancestor without a parent? that\u0027s just the source file. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/format/rulecontext.go"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"0130bc1498136adedad6bcf52b7736e4e960c49516e2448e218e84a28a210cfb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: should this be a panic? It isn\u0027t in strada. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/format/indent.go"},"region":{"startLine":576}}}],"partialFingerprints":{"codehealthFindingId/v1":"472f55b80f9c117691b4a9cb98b7f09f0514066cc9cfe934b0a352d40a1df5aa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Move into broader LS - more than just the formatter uses the newline editor setting/host new line \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/format/api.go"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3925a16ae19034f3adc4c8c02459ae62fd7df02139e46ba51ae9d32c1ff0e2b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: handle overwrites if we need to. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/fourslash.go"},"region":{"startLine":5103}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b5aa352aba41d99dad67e5be961085bb0c63d4ea8d81687320519b2da7417f4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO Verify errors \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/tests/statefindallrefs_test.go"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ae70bd61d5a2b92936cdf3678d2e6ad4f2048adacb381f86441332d800423bd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO Verify errors \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/tests/statefindallrefs_test.go"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"358bcbbe5f7bb015bcad3a3f87db8931b8746c611c7ca3b07dfe95f907c827b5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO Verify errors \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/tests/statefindallrefs_test.go"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"32bd52921b125e53fe1c34c8033656e57b435e104f589a6893dcaa9c81a39928"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO Verify errors \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/tests/statefindallrefs_test.go"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"d323a5106fa6542ed5cfa286b52fc5722d5dc7e82b3ae07330ea51382b0ed7c9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO Verify errors \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/tests/statefindallrefs_test.go"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"6770bcf493314188615343caed8724435c7ea3e5f31a209ed8a7da46eb3a5af7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO Verify errors \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/tests/statefindallrefs_test.go"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4f52c0c3495a0889489b9f2f3a2b33b4dd11d4145bd070dd5cd5352dd194be4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Re-enable this for Windows once coalesced recursive watches have \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fswatch/watcher.go"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"e76c9c0199591b409e080b96de18d702fc3e0c8dfd81c85b8d65a9117f2768c3"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // XXX: self events don\u0027t have IN_ISDIR set. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fswatch/inotify_linux.go"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"215a6ccc12d05524f3df72549080cd86420a72ab2c43a43cc991ea057eb479df"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // case ast.KindThisType: TODO: GH#9267"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/utilities.go"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"d39830b6fafbae7ced5706f9f175829a7e2b1f97a1859cf954689c0933839633"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: check if this function needs to be changed for jsdoc updates \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/utilities.go"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ffdd48c444aea3ec380b72018e87ba570e889b6426f722e6e229ffa129a6270"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: check if this function needs to be changed for jsdoc updates \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/utilities.go"},"region":{"startLine":808}}}],"partialFingerprints":{"codehealthFindingId/v1":"123cf32f7d7aa1d33b1d3f782dc7981d0fd9e063d54e04624b8bd4bc57cbc34a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO check if the port is correct and the for loop is needed \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/utilities.go"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"199d872c9b9f09046fdd483d937a4a55aeacb6ae5889ada1859976396c12d6dc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: rewrite as \u0060ast.FindAncestor\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/utilities.go"},"region":{"startLine":1012}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba7b32953231711a7f96698fce7b3acda3ba73b1f90d05eceafe15a5f5c8d8fb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO : need to find file reference instead? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/findallreferences.go"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1748f77117d99a8a94b6bd03d95a6049e3716a1b842624b60f2cec54ffe8723"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// TODO: Cache symbol existence for files to save text search \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/findallreferences.go"},"region":{"startLine":1646}}}],"partialFingerprints":{"codehealthFindingId/v1":"5227e4bb8a8854684248f34f31faf2b13b7cd8a5e4583ee063e60d7ada2974a2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO!! symlinks need to change the URI \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/crossproject.go"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"812f13047262f2a2fe1c9e7da0271e36815e3b3eadf2e1b9147bbbac32e081a6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: microsoft/TypeScript#18169"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/completions.go"},"region":{"startLine":3197}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfc16022633b051f22c3fb393372973d63ccf757211d10aaa03efd993c8807fe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Account for computed property name \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/completions.go"},"region":{"startLine":4518}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a9e971355be4dd98a55cbff54a148930d95795176c420f6d2309d96f2ccce02"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: ast.KindTypeAliasDeclaration? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/codelens.go"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"84bc2acd5082be3f9da9ae099d96a35cb06b9e215ce3f454a8e66c30eabebb03"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //    TODO: consider removing \u0060impliedNodeFormatForEmit\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/autoimport/fix.go"},"region":{"startLine":965}}}],"partialFingerprints":{"codehealthFindingId/v1":"0da460b87459ed807e13f88dbf65d2d693ddef1daa3bc78b182b6940574db853"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: only if b would start with a \u0060(\u0060 or \u0060[\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/change/trackerimpl.go"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb4c5dba22552faaa06459a83f840eddec17f10b1671bdba6c7dfff71a2aa97b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: There\u0027s currently no unused diagnostic for this, could be a suggestion \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/change/delete.go"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9f2e319fd0ac6afe2815162c96c7fba8eab8bb89ef5cd0a985cfbe8de71c2f6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(jakebailey): collect ascii-only info per line \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/lsconv/linemap.go"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6a4e134831b51f9cee429893e8690765abdf1e281ef26341e057a05640be70f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: add tsserver.web.typeAcquisition.enabled under the js/ts section for the web variant when web support is implemented. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/lsutil/userpreferences.go"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe503a6082cfafe149f8a9941214cf0a8ecc0dd231706826a4f33d7731745e02"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: These three are the only parsers whose fallback is a non-zero value; \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/lsutil/userpreferences.go"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"836ee8b8076da7a82bca274cae050c9c8a35dca9b8850d259164d08ab92bde16"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: make consistent with other enums (see note above). Unlike the \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/lsutil/userpreferences.go"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"b20ef99b6d4fa043176a35bbcfe811251b664e230f874cf7dde2d45490e7c4c8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: make consistent with other enums (see note above): have the parser \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/lsutil/userpreferences.go"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f9e94334f61443d215e8ffc3f8a9ed539f28e36043b5f3c6e5d51afedeca3a9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: make consistent with other enums (see note above): have the parser \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/lsutil/userpreferences.go"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"d28a5a9a58165e3a1623cb782bd5c2e5fc545b68741ea5468e5763916e380bba"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: getter and setter use the same symbol. And it is rare to use only setter without getter, so in most cases the symbol always has getter flag. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/ls/lsutil/symbol_display.go"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a7d6c1707c727719095a57eccce791ad1e3522c691ba678b5c4043cb3071063"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: should we just look for the first \u0027(\u0027 and \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/lsp/stack_sanitizer.go"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ff0e1cf85061c560327052625e714a738dd8d6cdd35785ee11abeef1b55e17a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(jakebailey): error data \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/lsp/server.go"},"region":{"startLine":1115}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eacf98226ce4b21d63de31c7b3e4fb9dd8f159a1265a6f729c645a283e54110"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // Maybe TODO: splitting extensions into two priorities should be unnecessary, except \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/module/resolver.go"},"region":{"startLine":615}}}],"partialFingerprints":{"codehealthFindingId/v1":"972d603c59c8a0762223d2093d0a95bf83cc1374e6335d077a297aeb37ab7ab0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Assert that \u0060resolvedTarget\u0060 is actually within the package directory? That\u0027s what the spec says.... but I\u0027m not sure we need \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/module/resolver.go"},"region":{"startLine":803}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb6f065cbf7dcb1447f26ad50d7e820f09b6956c1aaa1f29a78ccbfaaea20f7b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We should probably error if \u0060\u0022./a.tsx\u0022\u0060 resolved to \u0060\u0022./a.ts\u0022\u0060, right? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/module/resolver.go"},"region":{"startLine":1518}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6d4f900343d938af3c61aea19cbf0fced93e270ea9fe50088ba01d08fbeb90b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: shouldn\u0027t this use readdir instead of fileexists for perf? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/modulespecifiers/util.go"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac3e887ca74287ec69b800f3ef30cb7f9712c626bc027d3df054afa52df88f62"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // GetModuleResolutionCache() any // !!! TODO: adapt new resolution cache model \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/modulespecifiers/types.go"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"855b1a24a17453321b1d29bab630f40f596d3f1cab6532068f7b96ce45252ce4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // GetFileIncludeReasons() any // !!! TODO: adapt new resolution cache model \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/modulespecifiers/types.go"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"715e65b58b7cc2556393bcd9e9753895de25754ce4c21c0501b28fd0f9cd0261"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Possible strada bug - isn\u0027t this insufficient in the presence of merge symbols? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/modulespecifiers/specifiers.go"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"797fef6bcac2d05c4a6c18499ae244d266042e3296221f6cb37569770b6350dc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: possible strada bug? -1 in js slice removes characters from the end, in go it panics - js behavior seems unwanted here? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/modulespecifiers/specifiers.go"},"region":{"startLine":843}}}],"partialFingerprints":{"codehealthFindingId/v1":"1256e75a0b552f1d6e0281e9f40242dfb108222486fa8a26fbe70acb9014352e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: possible strada bug: these are not case-switched in strada \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/modulespecifiers/specifiers.go"},"region":{"startLine":1168}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbe7fa919b9a26e73cd71686b07b9e04ff57ec4ff0b66123931b132d9239695f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: JS support \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/modulespecifiers/preferences.go"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca125a00d27cab2745edf5cea7987ad5e7c3e2660396aea318967a8f6c1e9c94"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: proper resolutionMode support \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/modulespecifiers/preferences.go"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"49d8a36d0ef0cbb025953405f2ae7d628a1b0303d7f9a720e14302c62defd4e4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: previously all symboltracker methods were optional, but now they\u0027re required. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/nodebuilder/types.go"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bec4697f1cddf9ed003e964bdc102c23e4a2e68d3409bde8cccb155c0e28fbf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Review for error recovery \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/parser/parser.go"},"region":{"startLine":1474}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7ce86d12aa2b4806bebdf908a671d9c33b0dd9b77a31520691119674a943a57"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // ( xxx : \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/parser/parser.go"},"region":{"startLine":3871}}}],"partialFingerprints":{"codehealthFindingId/v1":"20279c761a9402ccd4a66b140533732820ac43a77c66c51450b7aad7d2d6dce4"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // ( xxx , \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/parser/parser.go"},"region":{"startLine":3872}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e9c679f5cce55728cb8f6b80ec8f58e90083c76cdcca9d331d52f55303b80f0"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // ( xxx ? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/parser/parser.go"},"region":{"startLine":3873}}}],"partialFingerprints":{"codehealthFindingId/v1":"06bbb5720cb72cb7127b97f153828988803863f317c95cd0906c6d5cc373c802"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // ( xxx = \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/parser/parser.go"},"region":{"startLine":3874}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9be8f1684f24c40f52dee05c84e6fa1a2894660871b69874825b031ec206a56"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // ( xxx ) =\u003E \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/parser/parser.go"},"region":{"startLine":3878}}}],"partialFingerprints":{"codehealthFindingId/v1":"53f2ca50395faab785748d4fb3ccf3860af4d5af6c5775e9d64764601eec32a1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should be a panic, unless parseSingleJSDocComment is calling this (not ported yet) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/parser/jsdoc.go"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"110d6b2293422f85d49c118cc766dfff92b9710b5f9a4b613f99c4a99afe4cae"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Determine whether we should enforce this in the checker. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/parser/jsdoc.go"},"region":{"startLine":1301}}}],"partialFingerprints":{"codehealthFindingId/v1":"0119f6cdd268f0e952d03a0f8712f59e9834cdf07ede831b2275a26dd64430de"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider moving the \u0060constraint\u0060 to the first type parameter as we could then remove \u0060getEffectiveConstraintOfTypeParameter\u0060. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/parser/jsdoc.go"},"region":{"startLine":1302}}}],"partialFingerprints":{"codehealthFindingId/v1":"9870e007f35ecf03522378513630aa751e2543256a9a524b696f08bef9914368"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider only parsing a single type parameter if there is a constraint. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/parser/jsdoc.go"},"region":{"startLine":1303}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6b7179464babca20e8cd57b788e802f327baf0690c3684ff198fbc49d5a3074"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rbuckton): The reason as to why we do not use the original text for bigints is not mentioned in the \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/utilities.go"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ea5d1ad6ed2eba9825dc32996216c46d774aeb7e1f0181cd9ad28b036dd7983"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rbuckton) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/utilities.go"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9fac3c2b3aa14e64151611cd846e8579912971ffbaf2b87501f16f248004a9d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This is cached in tsc - should it be cached here? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/textwriter.go"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e8955ac65fd3604ee294c75832fbf8b3f7f4b03778a59737f22cfd1c6147ddc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Preserve numeric literal separators after Strada migration \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer_test.go"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"a56bef44d47b9e1ff8ae8eb261b84c0807411f2894b6a9cb531476aadeda71e6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Preserve numeric literal separators after Strada migration \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer.go"},"region":{"startLine":1040}}}],"partialFingerprints":{"codehealthFindingId/v1":"49c4909231157d6518882362b69f5761af3ba9286ddffbaa2e6033b97b0418b8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // {title: \u0022CallExpression#12\u0022, input: \u0060a\u003CT,\u003E()\u0060, output: \u0060a\u003CT,\u003E();\u0060}, // TODO: preserve trailing comma after Strada migration"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer_test.go"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a8720955ce9be685c36307c25426bc022af126370f257d5f059993b2187cffe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // {title: \u0022ParameterDeclaration#7\u0022, input: \u0022function f(a,)\u0022, output: \u0022function f(a,);\u0022}, // TODO: preserve trailing comma after Strada migration"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer_test.go"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"a86b52c56216335ca23f2898844910c655569b06803a95fa99ece2e74a620cfb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // {title: \u0022TypeParameterDeclaration#7\u0022, input: \u0022function f\u003CT,\u003E();\u0022, output: \u0022function f\u003CT,\u003E();\u0022}, // TODO: preserve trailing comma after Strada migration"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer_test.go"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed3e434d4ac5b0132c6231965c0025fb8735cb1d151c15e7ef2f6804a0ddc4d0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //\t\t// Reuse singleton single-line writer (TODO: thread safety?) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer.go"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"330611459024a907463be439b0196d70375debb04bf9617045e9fa14b55e6459"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: preserve trailing comma after Strada migration \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer.go"},"region":{"startLine":1518}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b4d064113718369dde35a24fe728be351aa11f649f14550cfeb966bf8048f60"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: preserve trailing comma after Strada migration \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer.go"},"region":{"startLine":1544}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c11c8f5e7548ba6cc892cb10b2629ebccc25673082e3411be8beade0035e77e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: preserve trailing comma after Strada migration \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer.go"},"region":{"startLine":1905}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b6320c7a11677371315ff6759db4eb468cfdd8a76e82430ac6729d3a9fe9a6d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use emitEmbeddedStatement rather than writeSpace/emitStatement here after Strada migration as it is \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer.go"},"region":{"startLine":3644}}}],"partialFingerprints":{"codehealthFindingId/v1":"54922aecd108fcdcaa27d743811bc45b4b192ce118055b4200331596ce35c266"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rbuckton): Should this be using \u0060getLiteralTextOfNode\u0060 instead? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer.go"},"region":{"startLine":4314}}}],"partialFingerprints":{"codehealthFindingId/v1":"86f1bd549cbf6f286dea91672ac99cfeb5b6dc1e1f0fbbfd02c169ddde8709c0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support emitting nameIndex for source maps \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer.go"},"region":{"startLine":5850}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bf3e1b72af8b6159060f93817cf23f80ab9a5cd494ebc07c6104609323fb1f4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support emitting nameIndex for source maps \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/printer.go"},"region":{"startLine":5885}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5a05e36c5748ec1aadcb6bf69512c2a793c444d6c2b97a601f6e740ce330265"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // assert.Equal(t, \u0022foo_1\u0022, g.GenerateName(name2)) // TODO: Fix after Strada port is complete. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/namegenerator_test.go"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"1becbfc7ccf797d0f2341b31af5c033d1120e7f53898905195453c2e51d6592d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // assert.Equal(t, \u0022foo_1\u0022, text2) // TODO: Fix after Strada port is complete. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/namegenerator_test.go"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"20280384d0035291211a88aaf12314cbdbf66c408e682e85bfc48949ae1dd140"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // (*scope).generatedNames.Add(name) // TODO: generated names should be scoped after Strada port is complete. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/namegenerator.go"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"05e8c7c9c8de2dbd5153ebe81bb2b03a791e315c8030259b8650e6304f41d9ee"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: generated names should be scoped after Strada port is complete. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/namegenerator.go"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dc8687074a6aa27b367123cc80047689a7fb110d152cda865afc01a19098d3c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rbuckton): Does this need to be parented? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/factory.go"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b9b4cee1567f67bc8d5ec22933aefc93a091de29c80b17a48af4de9c6e1d4d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rbuckton): Does this need to be parented? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/factory.go"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"d98a5fb8d999d1cd36e580105a55dc910d070dda96bd8d7741ac960aacd46ba6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Callers passing -1 should pass actual indent options once indent-related formatting is ported. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/printer/changetrackerwriter.go"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"6823ea2456caa7dc9590f27d2cc71a96951408df0347266c801e7dbc13465bf7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO!! sheetal may be change this to handle symlinks!! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/project/snapshot.go"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccf122a3870957174a3eca430f15e51aba410338d853d4e694dcc4a62d0c4068"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: sheetal:  Get other projects that contain the file with symlink \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/project/session.go"},"region":{"startLine":1194}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68380c9608565b92b9691b51c1f6989a9dd1425b80d86f360db6622bd930fe5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: sheetal:  Get other projects that contain the file with symlink \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/project/session.go"},"region":{"startLine":1206}}}],"partialFingerprints":{"codehealthFindingId/v1":"709a17ebf2ec3eadd56edbffa5db05560309d8e2fdab4fd084ded0ce953b1081"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: How much of the checker\u0027s getTypeFromPropertyDescriptor is worth trying to emulate over ASTs? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/pseudochecker/lookup.go"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceaa9631f553cd3a8dd8dcbffc05634dbc18730ffe319591cdbef0fff56a737a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: also should bail on expando declarations; reuse syntactic expando check used in declaration emit \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/pseudochecker/lookup.go"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"69d52b076892a9a8f0eb08dc80506b77b4406987edcb2714c4d49975b36d1f12"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Strada forces an inference fallback on \u0060const\u0060 variables with template expression initializers, to leave space for template literal freshness in the future \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/pseudochecker/lookup.go"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7241d489d7127ab1c64a5aa72a2f1c126d24304f272c0c7d90212d703d45150"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: support ripping return type off of .FullSignature \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/pseudochecker/lookup.go"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5042905583a2f7f42815437fd4bf268713f0e81f96449705be1b2325306484a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: support ripping return type off of .FullSignature \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/pseudochecker/lookup.go"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"450cb8e17e1d5a55e086f47a46b028aec7ed109ab0eba17a33d3d4412651caff"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: in strada, this uses symbol information to ensure \u0060node\u0060 refers to the global \u0060undefined\u0060 symbol instead \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/pseudochecker/lookup.go"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"552c7d427cddc709d8b769fe2c59d51b2ccf0c931c43ac3b637691edd46235f7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: node preservation for late-bound accessor pairs? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/pseudochecker/lookup.go"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e0718db75a905be9b067b8e8bedb45e395f0b673ecf95d19df444c579fd13cd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: handle pseudo-annotations from get accessor return positions? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/pseudochecker/lookup.go"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c2c50151f60f35e0d0ac6f20295063baa120fdaf7996e9610c400230052d4aa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: why is this not \u0060core.Every\u0060? strada treated unions and intersections the same, but logically every intersection member needs to contain a possible \u0060undefined\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/pseudochecker/lookup.go"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c379161a9994a9e3694fdb816f474d308f75e69f3886f0fc333185c26b7e0cb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: In strada, the ID checker doesn\u0027t infer a parameter type from binding pattern names, but the real checker _does_! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/pseudochecker/lookup.go"},"region":{"startLine":680}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d6ea45c0cfeca01356ea53df7f5ae311100030423aa7f385ab4f133df738b39"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Late binding/symbol merging? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/pseudochecker/checker.go"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8fd5769da20cfcb645e9378097b0bfa258cc04246ff70b28eab1de5a0c73a5b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: baselines the entire fs, possibly doesn\u0027t correctly diff all cases of emitted files, since emit isn\u0027t fully implemented and doesn\u0027t always emit the same way as strada \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/testutil/fsbaselineutil/differ.go"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"e14143e9788ea472d761030b5adea3e248c751693b10c56c79897e04d7c09e24"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo handle more cases of fs changes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/testutil/fsbaselineutil/differ.go"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea4f42eae1b21d866201f160dc920ba2d5edde9665d23af67a5e51e5e1e3a7df"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Strada is wrong here, we should be looking at \u0060currentJsLine\u0060, not \u0060currentJsLine\u002B1\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/testutil/harnessutil/sourcemap_recorder.go"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aa62137678dd4d5fa0cfe55da85c414d5e2a70d808213ee83ed496ac3d12938"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: port underline printer, memoize \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/testutil/tsbaseline/type_symbol_baseline.go"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d120cba7f98afa1f179dcececbaa04c0e25cd04ed942140c38835bed2fb7ff8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // underline: underline, // !!! TODO: underline \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/testutil/tsbaseline/type_symbol_baseline.go"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"43dac8ef6f4c1f73e2280924f2651d0204db67aa2b5657427277504cc489f0d2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: flatten nested chains? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/chain.go"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"00676737bc3f6e2ef025e8c1a8a9b17ec33e5934fed301a22d1928fb2558c8de"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // || // !!! TODO: JSDoc support \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/util.go"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e06bd92b830ca232b53363059ba4c668ab849127dd771c375f5d59928e89b1b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: parseArrayBindingElement _never_ parses out an OmittedExpression anymore, instead producing a nameless binding element \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/util.go"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"7784654de6a9af49b99a88ed081fae7b1bdeeb8437ee79ee915e22d78573a83e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Convert to transformers.TransformerFactory signature to allow more automatic composition with other transforms \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/transform.go"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"524caf0a06567572a58b089b3a0e14485d818aa360009e4331378899653a147c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Use new host GetOutputPathsFor method instead of passing in entrypoint paths (which will also better support bundled emit) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/transform.go"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"0826b34f6ba6b6b17c622ae6d7b5ae4e59975f97cec19b9785ec836f2f361c64"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Shouldn\u0027t this be a crash or assert instead of a silent continue? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/transform.go"},"region":{"startLine":495}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b18923e229f892eb3d3ca7f06b68e3fd8c10921226de6eacc774a07a4e99f2b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Probably unsafe to assume this isn\u0027t a URL, but that\u0027s what strada does \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/transform.go"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c6fb0d643fbe19f4ef6e917bc66619ceeda5addf79ba8d7d18671d52c178b25"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Is this actually reachable? should we error on this? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/transform.go"},"region":{"startLine":882}}}],"partialFingerprints":{"codehealthFindingId/v1":"39ae788bf819335877b5a3a6ce00169e99f7bf1ca000a6437ce26ee46c191b6e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: possible strada bug - not emitting const initialized binding pattern elements? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/transform.go"},"region":{"startLine":944}}}],"partialFingerprints":{"codehealthFindingId/v1":"185dda7a865bbe509e441def2a3fc4d2f9b5d0f6869a9f133b0d94b58fc3dc56"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: possible strada bug (fixed here) - const property signatures never initialized \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/transform.go"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68d811bbd5471a870591094e30cb99ef6cc5cdac1390a8f33fc4226dd32d0cf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: Also remove synthetic trailing/leading comments added by transforms \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/transform.go"},"region":{"startLine":1631}}}],"partialFingerprints":{"codehealthFindingId/v1":"2efba997623aade52e2c318c201f3a70f877368f70e0779e81b3e7c5dba36a39"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // !!! TODO: module declarations are now parsed into nested module objects with export modifiers \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/transform.go"},"region":{"startLine":1830}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b48f8ae639483b4cddc2217974bcf0ec204f614bb53b803e6595814f3e6ac98"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: If the property has an explicit \u0060@type\u0060 annotation, we should probably emit it (maybe with an \u0060override\u0060 modifier) instead of skipping it \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/transform.go"},"region":{"startLine":2112}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c5c5a7a823aee3509d139eeb5b863cfd2394802d37e640a9c5f174a71e09fae"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Do all these accessibility checks inside/after the first pass in the checker when declarations are enabled, if possible \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/tracker.go"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1d9b14f3b973612a1e2618612f0a9e560f055500afad9e39142d19d0239e2ae"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(jfreeman): Deal with computed properties in error reporting. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/diagnostics.go"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"30c677f8f5a3a0e3f82a4ecf7ef90c9869939d3b44b6b8b7795b61f570de59eb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Audit behavior - should this panic? potentially silent error state in strada \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/declarations/diagnostics.go"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"e105d032c029fcec4146f8cd80453ff777624ff1bd97daff1b6cffbffb549fa9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rbuckton): We support decorating \u0060declare x\u0060 fields with legacyDecorators, but we currently don\u0027t \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/estransforms/esdecorator.go"},"region":{"startLine":1581}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a0fe799bbc46a22a907bb5817ea141941091dc9a85e9f923f7efc49d3bea877"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: fix \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":909}}}],"partialFingerprints":{"codehealthFindingId/v1":"60d47f1a41bd02bdd900eff54c0e766af1cad034f75cdc38ccca12804dc7a467"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: can we get rid of this original checking and better coordinate with runtimesyntax? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":2779}}}],"partialFingerprints":{"codehealthFindingId/v1":"8661b33091550a9382f3f30e99906482d74c38988f74768fb3ed59d1253a40f2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: do we even need these? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/estransforms/classfields.go"},"region":{"startLine":3467}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb2446aec78dc5e258d0954892dea4e8724034b1ee32c1f140e13ac1ee08c4db"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // flag and setting a parent node. TODO: Is this still true? The emit resolver is supposed to be \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/jsxtransforms/jsx.go"},"region":{"startLine":628}}}],"partialFingerprints":{"codehealthFindingId/v1":"7559870176fdb35a6154bf4f576429f9f709fb2d26fa2f7063a723252fbed6bc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: why is \u0060unique symbol\u0060 not handled as \u0060Symbol\u0060? This falls back to \u0060Object\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/tstransforms/typeserializer.go"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"60715c9169f81b63686bfea5e0b84085040fad756d4e19ebd06f7e6e6d1cd417"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //       // TODO, blah \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/tstransforms/runtimesyntax.go"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c11b06f21abdccfd2bbbdcf71b21f6a7c361bebc267163c770d83d71f2ab0fc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //              // TODO, blah \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/tstransforms/runtimesyntax.go"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"2551085e3a22661d024bc3ae05d232921adfc00e41c05ce4edde801e8f1edc0b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //nolint:customlint // .Parent set to get node to printback using text from original file instead of processed text; TODO: this should be achievable via EmitFlags instead \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/tstransforms/runtimesyntax.go"},"region":{"startLine":787}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2a19767c669e8739e82ebea2137954f206cdd4c73487f791b07346105c95485"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //nolint:customlint // .Parent set to get node to printback using text from original file instead of processed text; TODO: this should be achievable via EmitFlags instead \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/tstransforms/runtimesyntax.go"},"region":{"startLine":791}}}],"partialFingerprints":{"codehealthFindingId/v1":"5953315f21a1cb619a081faa3f73581280d8d17d03b077790eae529c23912334"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should *probably* just load the full, real \u0060lib\u0060 for the target. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transpile/transpile.go"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bb9291052bf962ffbbde2451c59c0c04a20e757910e94956121d94cb079c636"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: how to manage null \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/tsoptions/tsconfigparsing.go"},"region":{"startLine":824}}}],"partialFingerprints":{"codehealthFindingId/v1":"49c698746d71b7c6c316724d2ed7818fa95c7f86b76b4c232727046f1c71a2fe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: !!! should be ConfigFile.ParseDiagnostics, check if they are the same \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/tsoptions/parsedcommandline.go"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7e82511755a81f557920215620ab5e96b1ffd2ca29d38a6214154f6c05f40ff"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: make the following work for tests -- currently it is difficult to do extra options of enum type \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/tsoptions/commandlineparser_test.go"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"26dff2bf66c3e141f202e4a8530508262e896bbb0c549aa29c876bf6b3251e1f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: watch options not implemented \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/tsoptions/commandlineparser_test.go"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"294b97315302e21b69860d6c1c2c477830f6b01282668cdc0ba4bca25e578181"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: watch options not implemented \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/tsoptions/commandlineparser_test.go"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3cc26fb42992c69ee9e3a27f2f022a662f7a8b878a684ff981e41351d85f441"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: revisit to see if this can be reduced to boolean \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/tsoptions/commandlineoption.go"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca20a83ee29e030c380b8d78661288ea34f8f1137ba30f02e4550596d63730d3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: revisit to see if this can be improved \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/tsoptions/commandlineoption.go"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"e091e77f438522c326657f763d68d216bc55a2c5c514165e1286b7dbedf6ec55"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO (drosen): There is potential for a fast path here. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/tspath/path.go"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"f96526d9529a11a0a583f122700b0dbfa8b90b6fa3d4adf47debed0fe7d36b45"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: #701 add retry mechanism?"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/vfs/osvfs/os.go"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"59e181ee59a49795d032ec5e7ae4039bf1a811a2265a844ec940de9c4145e9c1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: TestFS doesn\u0027t understand case-insensitive file systems. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/vfs/vfstest/vfstest_test.go"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e2cf33f024f732ede5040d87f0d7f6025576745a53e97d5b043e203faa126e4"}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5a31a0b5364830f542d37385755d27dd90f97746286a80cb6c17836bc6e14179"}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"56d7c0542bcbbd8d8c61f07327aa2080292f8d213e8f982f1a0933ffecde0a9c"}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2567ea2f56ae79977dadd3bf380bcb8e0d5204997d0db598b3e49e1891ff5525"}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aea179ab0c68cc9e97b24a42df4953f60a168b52ce1ce992dfa9d65c712f31e1"}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b916f9c0e73852125ec2823b2d4bdd088ba96534a0ffa5bb09a1984aeaa9d35e"}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7eff10640877858a518aced4599d03078dad944ca75a2bb218a45a28df443428"}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aca835284f3d8e7860c407472fe52e6dd6f7446c0112e150878c8c1ef3fcc8af"}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d845887cb49271db1e4f4ed11b97d6d024b44e212c122d8d9e64eaaf99e3de3d"}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"98645b36f3d8a19e1462b10ae8d23a6853b810993981c4fc4065e762fff2771b"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/transformers/estransforms/namedevaluation.go"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"168cd0eb3edabb10966b6225abe5980d57dd7a837334500be9879fd21df4d575"}},{"ruleId":"D34","level":"note","message":{"text":"Further orphaned files (smaller): 10 smaller file(s) also have no living knowledge \u2014 folded into the freshness score and metrics rather than raised one row each \u2014 most significant first: internal/compiler/fileInclude.go, internal/compiler/projectreferencefilemapper.go, internal/evaluator/evaluator.go, internal/execute/tsc/init.go, internal/sourcemap/decoder.go, internal/symlinks/knownsymlinks.go, internal/testutil/fsbaselineutil/differ.go, internal/testutil/tsbaseline/sourcemap_baseline.go (and 2 more) (11 orphaned of 350 analysed files in total, counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 350 of the 501 production source files in this repository met that bar). Attach the read to the next change that touches one of them: have a second person review that change, and leave behind a short comment or test recording what the file is for, so the knowledge comes back at the cost of a change you were making anyway."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce861fd78f6935114d3a342cb90ad25870f984e1042954fcbbe27c0e23be3658"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: main.go \u2194 host.go: \u0060cmd/tsgo/main.go\u0060 (context cmd) and \u0060internal/compiler/host.go\u0060 (context internal) sit in DIFFERENT parts of the tree yet change together 72% of the time (13 of the 18 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 13 shared commits counted here, the most recent 3 are \u0060bf00a76c\u0060 Remove module resolution caching for now, make resolved modules avail\u2026; \u006008dddf46\u0060 Cache ASTs in test runner (with supporting changes) (#372); \u00607edbf22e\u0060 Move DefaultLibraryPath onto hosts (#325) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cmd/tsgo/main.go"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5822b0ea995a188d73d397abe0f41a18944c7440628732678c5549fb9057bc90"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: main.go \u2194 diagnosticwriter.go: \u0060cmd/tsgo/main.go\u0060 (context cmd) and \u0060internal/diagnosticwriter/diagnosticwriter.go\u0060 (context internal) sit in DIFFERENT parts of the tree yet change together 53% of the time (8 of the 15 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u00602cf4cb4f\u0060 execute command line initial implementation (#241); \u006018416640\u0060 Separate error reporting, string baselining from compiler baselining \u2026; \u00609385c45e\u0060 Port more type checking (#133) (at that commit the file was still \u0060internal/compiler/error_reporting.go\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cmd/tsgo/main.go"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b02e07a37030dfa07f0842cf114daa05407bdb0860b27b601582437ca01276ec"}},{"ruleId":"P12","level":"warning","message":{"text":"Coverage collected but not gated: CI collects a coverage report but no step enforces a minimum \u2014 coverage could halve and CI stays green. Add a step that fails the build when coverage drops below a floor (your coverage tool\u0027s minimum-threshold flag, or a coverage-gate action) so the number guards something. What was searched, so you can tell an absence from a miss: this repository\u0027s CI files AND its coverage configuration \u2014 the well-known coverage and test-runner config files, read at the repository root and inside workspace package directories two levels down, so a floor declared beside the tests rather than in the pipeline is credited \u2014 matched against the threshold settings this check knows by name. A floor set in your coverage service\u0027s web UI rather than in a committed file, or under a setting whose name is not one of those, is not seen here."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7f63c06044cf998d9a0698692df30d8873e29bc9b0c98ee829255017c1193d33"}},{"ruleId":"P6","level":"note","message":{"text":"Changelog looks stale/thin: The changelog this check read carries 1 versioned entry, against a bar of 3. Counted as either an \u0060x.y.z\u0060 string or a version-shaped section heading (\u0060## [1.2.0]\u0060, \u0060## V14.x.x\u0060, \u0060## Updates in 8.0.x\u0060), whichever is the larger \u2014 so a log sectioned by minor series counts its sections, not its individual patch numbers. Entries recorded somewhere this check does not read \u2014 release notes generated at tag time from a generator config it did not recognise, or a log kept outside the repository \u2014 are not counted here, and this row is about what is re-findable in the tree rather than about how often you release."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c9a74c249fe67853238d9c15085f7f97d31f51bb82455046aa10c2cef82f67b8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (48 matched lines \u00D7 2 locations): _packages/native-preview/src/api/async/api.ts:1555 \u00B7 _packages/native-preview/src/api/async/api.ts:1745 \u2014 the two spans are one implementation copied and then locally edited \u2014 338 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/async/api.ts"},"region":{"startLine":1555}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4392f00d0363262b81152e7a6b422f5adb5352bb1329f774e37f98a10abf531"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (28 lines \u00D7 2 locations): _scripts/generate-go-ast.ts:465 \u00B7 _scripts/generate-go-ast.ts:694 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-go-ast.ts"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2b4f155ff742d5c76cb7f9afae088dde3b2b5f4105e9c6227539966b2ed38f4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2 locations): internal/fourslash/_scripts/convertFourslash.mts:3365 \u00B7 internal/fourslash/_scripts/convertFourslash.mts:3390 \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":"internal/fourslash/_scripts/convertFourslash.mts"},"region":{"startLine":3365}}}],"partialFingerprints":{"codehealthFindingId/v1":"447d150999a01b6725f60da54aed0de44fece3637b22c913545c747df0f20ee5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): _packages/native-preview/src/api/async/api.ts:546 \u00B7 _packages/native-preview/src/api/async/api.ts:669 \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":"_packages/native-preview/src/api/async/api.ts"},"region":{"startLine":546}}}],"partialFingerprints":{"codehealthFindingId/v1":"142352d33afd257e6a942301408274154ef191eaad6fa8b333ffcec20c93b1ce"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): _packages/native-preview/src/api/async/api.ts:1320 \u00B7 _packages/native-preview/src/api/async/api.ts:1465 \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":"_packages/native-preview/src/api/async/api.ts"},"region":{"startLine":1320}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f25cad6e98c1391154ed2ea1fc5e1342a50d38b74d7d1714f02e91fe0ced95c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): _scripts/generate-encoder.ts:342 \u00B7 _scripts/generate-encoder.ts:589 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-encoder.ts"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"31fb00a2f632c41964e17b8207809362b9ae2cac03eba0f4f0eca889d0128dbb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): _packages/native-preview/src/api/node/msgpack.ts:71 \u00B7 _packages/native-preview/src/api/node/msgpack.ts:95 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/node/msgpack.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"83cae3c1c545fac5f734c239e55ca9cae3b781f685038297706151533cb3e324"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3 locations): _packages/native-preview/src/ast/scanner.ts:1814 \u00B7 _packages/native-preview/src/ast/scanner.ts:1843 \u00B7 _packages/native-preview/src/ast/scanner.ts:1905 \u2014 all 3 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/scanner.ts"},"region":{"startLine":1814}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6eccb6805fffd87accb482a15ce969d01086c3dcac452f44057114819f28887"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): _packages/native-preview/src/api/node/msgpack.ts:162 \u00B7 _packages/native-preview/src/api/node/msgpack.ts:179 \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":"_packages/native-preview/src/api/node/msgpack.ts"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"d818d0bf46c7a55d3dfb067e7789226851e02b0b80a19e66be028d3eb0b88022"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): _scripts/generate-encoder.ts:368 \u00B7 _scripts/generate-encoder.ts: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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-encoder.ts"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca8700f2b61d752b3fb89567756b29669b64ad57e75341f4cda67c4e588d1c95"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): _scripts/generate-encoder.ts:648 \u00B7 _scripts/generate-encoder.ts:920 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-encoder.ts"},"region":{"startLine":648}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ea37897f887a11ccb20858ca902d49a8d1e56bd8b0a50eaf4c51d4e1ab39b66"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): internal/fourslash/_scripts/convertFourslash.mts:2097 \u00B7 internal/fourslash/_scripts/convertFourslash.mts:2112 \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":"internal/fourslash/_scripts/convertFourslash.mts"},"region":{"startLine":2097}}}],"partialFingerprints":{"codehealthFindingId/v1":"d22af758598d4f4936f5cb33ee52dc4476fef36f573726d6f783977ca7645b88"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): internal/lsp/lsproto/_generate/generate.mts:3318 \u00B7 internal/lsp/lsproto/_generate/generate.mts:3351 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/lsp/lsproto/_generate/generate.mts"},"region":{"startLine":3318}}}],"partialFingerprints":{"codehealthFindingId/v1":"10f6618879c37b5b1f89d984c8bc93002565a5bc71f10324f2928de36be964a1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): _packages/native-preview/src/ast/scanner.ts:1631 \u00B7 _packages/native-preview/src/ast/scanner.ts:1887 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/scanner.ts"},"region":{"startLine":1631}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0ab781651bef1e26c560bc98f18c42beb8cb09a085d72cd219bacf1bb2dff40"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): _packages/native-preview/src/ast/scanner.ts:1838 \u00B7 _packages/native-preview/src/ast/scanner.ts:1861 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/scanner.ts"},"region":{"startLine":1838}}}],"partialFingerprints":{"codehealthFindingId/v1":"07c01a93722300ec66305ffcdf0ce4e7cf2060638eb7530925fdabdb83ce4c93"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): _packages/native-preview/src/ast/scanner.ts:1937 \u00B7 _packages/native-preview/src/ast/scanner.ts:2416 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/scanner.ts"},"region":{"startLine":1937}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e46157a497f8a8e7ff8311ec978ad45f3fa36f949b8b5d5296fd795e3eb65a0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): _scripts/generate-encoder.ts:559 \u00B7 _scripts/generate-encoder.ts:676 \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":"_scripts/generate-encoder.ts"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fe5cca5e8965c750189c78acdb142f8c4b1bf7aae5b054300ff2d1f1a7a7eae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): _scripts/generate-encoder.ts:896 \u00B7 _scripts/generate-encoder.ts:909 \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":"_scripts/generate-encoder.ts"},"region":{"startLine":896}}}],"partialFingerprints":{"codehealthFindingId/v1":"0698f258ae49da46941ba4c1bef6ff7151994f6e77704bfb0996254bc76d5867"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): _scripts/generate-ts-ast.ts:922 \u00B7 _scripts/generate-ts-ast.ts:1088 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-ts-ast.ts"},"region":{"startLine":922}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1bec5e37447bdd3d2d9c010cb715a1f3adc6fd305e78a21dd73e20ead3d2f6b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): _scripts/generate-ts-ast.ts:950 \u00B7 _scripts/generate-ts-ast.ts:1102 \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":"_scripts/generate-ts-ast.ts"},"region":{"startLine":950}}}],"partialFingerprints":{"codehealthFindingId/v1":"28d45d6b19c86f48f9e101e6350ad97760716b77ff6a8b0b0a3c21eaf09817a5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): _packages/native-preview/src/api/async/api.ts:1169 \u00B7 _packages/native-preview/src/api/async/api.ts:1189 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/async/api.ts"},"region":{"startLine":1169}}}],"partialFingerprints":{"codehealthFindingId/v1":"26146f65967b76053d97a0537b641dc663e3c03255542382babd83ef98889f21"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): _packages/native-preview/src/api/async/api.ts:2569 \u00B7 _packages/native-preview/src/api/async/api.ts:2607 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/async/api.ts"},"region":{"startLine":2569}}}],"partialFingerprints":{"codehealthFindingId/v1":"43f5b794a7ade02085f9c754d880a391a37dafb28a92f46a1190db5c1c2e3904"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): _scripts/schema.ts:1091 \u00B7 _scripts/schema.ts:1107 \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":"_scripts/schema.ts"},"region":{"startLine":1091}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2dbc1651470933608428f4600ab05714de76e9979890507fff324fe39eafb1c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): internal/fourslash/_scripts/convertFourslash.mts:1626 \u00B7 internal/fourslash/_scripts/convertFourslash.mts:1748 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/_scripts/convertFourslash.mts"},"region":{"startLine":1626}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdd53036562f0a18d240eabf08c8708b5e612c263f65384becf4cee10e9fe703"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): _extension/src/client.ts:393 \u00B7 _extension/src/client.ts:409 \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":"_extension/src/client.ts"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"636828c801735f6a67f3d14115b400640f1ec0a0462ce3ee0cca268c385b28ef"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): _extension/src/session.ts:287 \u00B7 _extension/src/session.ts:299 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/session.ts"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"39be8096d8c25381e60d2952b7d1f456ab8fe00e4088bd85d36fb7790ab8daae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 5 locations): _packages/native-preview/src/api/async/api.ts:1098 \u00B7 _packages/native-preview/src/api/async/api.ts:1114 \u00B7 _packages/native-preview/src/api/async/api.ts:1130 \u00B7 _packages/native-preview/src/api/async/api.ts:1146 \u00B7 \u002B1 more site(s) not listed \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":"_packages/native-preview/src/api/async/api.ts"},"region":{"startLine":1098}}}],"partialFingerprints":{"codehealthFindingId/v1":"38ee3e4f8f8828e37eba43e7a26fd5b5b4b4429b8584ca025262773eff2228dd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 5 locations): _packages/native-preview/src/api/async/api.ts:1379 \u00B7 _packages/native-preview/src/api/async/api.ts:1541 \u00B7 _packages/native-preview/src/api/async/api.ts:1570 \u00B7 _packages/native-preview/src/api/async/api.ts:1746 \u00B7 \u002B1 more site(s) not listed \u2014 all 5 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/async/api.ts"},"region":{"startLine":1379}}}],"partialFingerprints":{"codehealthFindingId/v1":"376fb271fd5824595022d79c8986aee8defd720fe6f8357455927b09eb7cfd13"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): _packages/native-preview/src/api/async/client.ts:76 \u00B7 _packages/native-preview/src/api/sync/client.ts:38 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/async/client.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"dce5c61e5edfdb8bac65c6784442bc8afaad05e89dc11c3d2e9e59b79df8eb9f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): _packages/native-preview/src/api/node/node.ts:116 \u00B7 _packages/native-preview/src/api/node/node.ts:136 \u00B7 _packages/native-preview/src/api/node/node.ts:151 \u2014 all 3 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/node/node.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e2c23ec7c126649107a8f508c8c3dc2e56d5a52f4faf8e928cbc79d129ae7ed"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): _packages/native-preview/src/ast/scanner.ts:1660 \u00B7 _packages/native-preview/src/ast/scanner.ts:1672 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/scanner.ts"},"region":{"startLine":1660}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee044d35471e7a3c8eeb6acd33512ea090c13379f575349eb0e5e03f67746187"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 8 locations): _scripts/generate-encoder.ts:397 \u00B7 _scripts/generate-encoder.ts:447 \u00B7 _scripts/generate-encoder.ts:544 \u00B7 _scripts/generate-encoder.ts:662 \u00B7 \u002B4 more site(s) not listed \u2014 the 8 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-encoder.ts"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"49beb12f83fa194197d875f39b82eba29e7750e2061e74a0ab40e99699caa332"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): _scripts/generate-encoder.ts:848 \u00B7 _scripts/generate-encoder.ts:981 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-encoder.ts"},"region":{"startLine":848}}}],"partialFingerprints":{"codehealthFindingId/v1":"d53d4d42132b4b510c30de196877974be808fb0711ff31c0fca20f1f71ba444a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): _scripts/generate-go-ast.ts:511 \u00B7 _scripts/generate-go-ast.ts: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":"_scripts/generate-go-ast.ts"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b7f0679b63ff4527d38b825d8633b8c466bae2dcbfef40bd076206fcb85b209"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): _scripts/generate-ts-ast.ts:1109 \u00B7 _scripts/generate-ts-ast.ts:1150 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-ts-ast.ts"},"region":{"startLine":1109}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5024c02f7f013f6f857e29248f5b54ac3e93dbbd15bd5aba259de5f2fea3e0c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): internal/fourslash/_scripts/convertFourslash.mts:2123 \u00B7 internal/fourslash/_scripts/convertFourslash.mts:2308 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/_scripts/convertFourslash.mts"},"region":{"startLine":2123}}}],"partialFingerprints":{"codehealthFindingId/v1":"1506c0ff42fc806da7538156ee73ebf08b06d7a697872d204ec30cdc25b41a36"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): internal/lsp/lsproto/_generate/generate.mts:3335 \u00B7 internal/lsp/lsproto/_generate/generate.mts:3372 \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":"internal/lsp/lsproto/_generate/generate.mts"},"region":{"startLine":3335}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2a0288a771f807f53e7312f1eff6ed341a599baebbf96dd0df8aee3ad3a272f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4 locations): _packages/native-preview/src/api/async/api.ts:1001 \u00B7 _packages/native-preview/src/api/async/api.ts:1062 \u00B7 _packages/native-preview/src/api/async/api.ts:1171 \u00B7 _packages/native-preview/src/api/async/api.ts:1193 \u2014 all 4 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/async/api.ts"},"region":{"startLine":1001}}}],"partialFingerprints":{"codehealthFindingId/v1":"01304ad26a7abefd220850d7386e8281ecdcb1415f9aceeeb4b21896a472d74e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): _packages/native-preview/src/api/syncChannel.ts:545 \u00B7 _packages/native-preview/src/api/syncChannel.ts:582 \u00B7 _packages/native-preview/src/api/syncChannel.ts:609 \u2014 all 3 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/syncChannel.ts"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef74134d8cbfa9e16ff684ff0ff10bd250840e0661c9715998fee9caa031d6df"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): _packages/native-preview/src/ast/scanner.ts:460 \u00B7 _packages/native-preview/src/ast/scanner.ts:641 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/scanner.ts"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"b87d7c12cb79733a44805e8ebd5a7666753db5ae3244579bf39588545af85707"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function scan (cyclomatic 164, cognitive 278): scan has cyclomatic complexity 164 and cognitive complexity 278; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/scanner.ts"},"region":{"startLine":1531}}}],"partialFingerprints":{"codehealthFindingId/v1":"e38ffdfce435d8bba20871355ec908609ab265b8456349a0bd7cbdcb6e859436"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function generateCode (cyclomatic 121, cognitive 356): generateCode has cyclomatic complexity 121 and cognitive complexity 356; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/lsp/lsproto/_generate/generate.mts"},"region":{"startLine":2164}}}],"partialFingerprints":{"codehealthFindingId/v1":"2671142bd8de9bab83cb44f3097346b87c2319ef6135a399515dae4a6d6a3c92"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function generateFactory (cyclomatic 99, cognitive 215): generateFactory has cyclomatic complexity 99 and cognitive complexity 215; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-ts-ast.ts"},"region":{"startLine":554}}}],"partialFingerprints":{"codehealthFindingId/v1":"3712bc26968da05dc1433aba7ef14f35791b4fa0ac04005ebb5676a108323e62"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseFourslashStatement (cyclomatic 80, cognitive 28): parseFourslashStatement has cyclomatic complexity 80 and cognitive complexity 28; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/_scripts/convertFourslash.mts"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1c3f28c326e365c6b202ab5a47b951abe7850b87f15796680daba5cc63b3be0"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseExpectedCompletionItem (cyclomatic 68, cognitive 138): parseExpectedCompletionItem has cyclomatic complexity 68 and cognitive complexity 138; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/_scripts/convertFourslash.mts"},"region":{"startLine":1329}}}],"partialFingerprints":{"codehealthFindingId/v1":"05a04e7dca1ef2b71a6a5c5c30ae341f9e9a2a68a11a63f9eb99ec4aca4fbe41"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function generateCmd (cyclomatic 67, cognitive 19): generateCmd has cyclomatic complexity 67 and cognitive complexity 19; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/_scripts/convertFourslash.mts"},"region":{"startLine":4538}}}],"partialFingerprints":{"codehealthFindingId/v1":"14a702d58aae81b9d0482d1d573d2130f3936b66659594336b560cd67dbd8360"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function patchAndPreprocessModel (cyclomatic 57, cognitive 94): patchAndPreprocessModel has cyclomatic complexity 57 and cognitive complexity 94; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/lsp/lsproto/_generate/generate.mts"},"region":{"startLine":1035}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e588736d17899c496c7cf36e6415b27ec6e9fd75e043e9ef6fb5c08dd66be59"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function scanEscapeSequence (cyclomatic 55, cognitive 51): scanEscapeSequence has cyclomatic complexity 55 and cognitive complexity 51; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/scanner.ts"},"region":{"startLine":1261}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e29929cff8166fa3a04ce26ffc48cd036eaa99112d0efd8c709430003177951"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function isExpressionNode (cyclomatic 55, cognitive 9): isExpressionNode has cyclomatic complexity 55 and cognitive complexity 9; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/is.ts"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"2062ef134c642a0ff1e1bf64c5bcc3a2997efe88b174b78a3dc6dd22e723ce53"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseVerifyCompletionArg (cyclomatic 54, cognitive 114): parseVerifyCompletionArg has cyclomatic complexity 54 and cognitive complexity 114; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/_scripts/convertFourslash.mts"},"region":{"startLine":1134}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c1326a9b61ed66919359d06b597f8661ab2e06c5a921fef8529c2e3500718ac"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseOrganizeImportsArgs (cyclomatic 53, cognitive 102): parseOrganizeImportsArgs has cyclomatic complexity 53 and cognitive complexity 102; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/_scripts/convertFourslash.mts"},"region":{"startLine":2914}}}],"partialFingerprints":{"codehealthFindingId/v1":"96ac229f2445dc2b4de8eeb33c5840ef739ce27c0a82415cb643d96042675027"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseUserPreferences (cyclomatic 51, cognitive 76): parseUserPreferences has cyclomatic complexity 51 and cognitive complexity 76; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/_scripts/convertFourslash.mts"},"region":{"startLine":2358}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b6329d97369ad392462bdd2f6b427db999e9828d0dc718c40f07670051fd8bc"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function generateIsGenerated (cyclomatic 41, cognitive 75): generateIsGenerated has cyclomatic complexity 41 and cognitive complexity 75; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-ts-ast.ts"},"region":{"startLine":1222}}}],"partialFingerprints":{"codehealthFindingId/v1":"4558e0a66e9a800a37a86fee3654d63a392f183e01ff20db9486b6404fee9b62"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function isInExpressionContext (cyclomatic 39, cognitive 8): isInExpressionContext has cyclomatic complexity 39 and cognitive complexity 8; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/is.ts"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"45f745204b0f9440005ea8d7e69ed082d89411882315d93be7a02ab24fdec0f2"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function generateTSNodeGenerated (cyclomatic 37, cognitive 71): generateTSNodeGenerated has cyclomatic complexity 37 and cognitive complexity 71; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-encoder.ts"},"region":{"startLine":1284}}}],"partialFingerprints":{"codehealthFindingId/v1":"a450bd1a27193bb38cc46821e0306d279fdf3feab19b33eddceab958a74314df"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function reScanSlashToken (cyclomatic 37, cognitive 66): reScanSlashToken has cyclomatic complexity 37 and cognitive complexity 66; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/scanner.ts"},"region":{"startLine":2068}}}],"partialFingerprints":{"codehealthFindingId/v1":"24a00062ebceb14a1dd53f0788ab60a8ab5d7f0823d46736ddaf30299bbf4896"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function scanJsDocToken (cyclomatic 36, cognitive 21): scanJsDocToken has cyclomatic complexity 36 and cognitive complexity 21; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/scanner.ts"},"region":{"startLine":2358}}}],"partialFingerprints":{"codehealthFindingId/v1":"2889718ab1cdc776f04414c02367644e809da3730d744de11d82cd0d56882820"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function validate (cyclomatic 34, cognitive 63): validate has cyclomatic complexity 34 and cognitive complexity 63; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/schema.ts"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"8024b489c4827f16afa6b6cc6ea746117ef35bf625f3cd045d747ef225232786"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function iterateCommentRanges (cyclomatic 33, cognitive 78): iterateCommentRanges has cyclomatic complexity 33 and cognitive complexity 78; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/ast/scanner.ts"},"region":{"startLine":617}}}],"partialFingerprints":{"codehealthFindingId/v1":"9067557432e4bfdadc5fea29cc23e6d9fb9ca2dbcbc582a904e4f74af19e401b"}},{"ruleId":"R3","level":"warning","message":{"text":"Large Files: 15 file(s) over 400 lines (counted as significant lines \u2014 blank lines excluded \u2014 over production source only, tests excluded), largest first: _packages/native-preview/src/api/async/api.ts (2409), _packages/native-preview/src/ast/scanner.ts (2328), Herebyfile.mjs (2136), _scripts/generate-encoder.ts (1846), _scripts/generate-ts-ast.ts (1586), _scripts/schema.ts (1078) (\u002B9 more)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cecee31b569df4f07e06db732f1ca037af27b5afef9023da51f9673d931a142f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/_scripts/convertFourslash.mts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8f01967cd51e4b23c775cdcf2db3eddf1149dce4179ba0174ecd106eaab3e10"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/lsp/lsproto/_generate/generate.mts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"06ff06d4b93d06355eecdb2c8cda38d8168103a690f06c6eb6a7dfcd17627284"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Herebyfile.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b8951a6ef524b787321168b3b423ddb4888cdf50cc361e5b1422f0eb7367540"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-encoder.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"51674f5810cd5343240a9f50df045e2adce0193fb785af1fb21bb3c04a645933"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-ts-ast.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c04befb161d51b6b1d2ef654cce53f22e5572f208dc435c93531394696260a6"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/schema.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8016039a7a54a50b2e9ddfd906aac22bc9dd0fc49e644e57620f960d30c4776a"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate-go-ast.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce0d6b50dce76c35e23e90a865e35115fc75a9539da8b9c5fa5b65ed3ce32ad6"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/client.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17183ba003380048f6534e92276deeb5732a7fa11e194e1a27b0e0e8c30d2274"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/session.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0306f9cc6696b0b303c2f16e80b9f11328a0c6976f552dfc6d4f1d271cafc899"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/lsp/lsproto/_generate/metaModelSchema.mts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"476c98ac3b17e2fdbd96f2fae3f743184b7801b5154d3f4bed50fb43e8b0cbdf"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/syncChannel.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4e5afd6d9fb454255d894a0af1195a808345bae9f4a0cbee29ccc70c97961db"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/configurationMiddleware.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f0d35ca0bda407cad368d4f9015fd7230c43f2dba4a35ff1711f3e2c7863432"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/scripts/generateSync.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c3eeb150e12dd4551de05e48fa28a60e0e687f3cb0d4fc4cac183803dabad0d"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/extension.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab750a3e834b4eb35f7b938aa1db7e78a0eaf00f7ce457b5b099c2ed520a5bf"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/stringutil/_scripts/generate-unicode-data.mts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a8d963b4937bcb7e938330095e72f9a48cf60464d7f03123e638e8a450545f0"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/projectStatus.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10056bc1909c273f30504867c0c9c5d01ccfb8edf6979a57e35229fc3c53960c"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/languageFeatures/onAutoInsert.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"017291257ea86d488434d4cbce15573ac824a451ccd5f0e1d0a325cfc4b87004"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/sync/client.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"01ba7b7428c1ae7dc307869f2806150bee42c2a32244690db060ba96550ab1b2"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/_scripts/updateFailing.mts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2d87e58c3fa7bbd574495db9d71a96937ae5c18df620851531b5dd94c90f600"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/enums/characterCodes.enum.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"71ac666fe6b35d37b1cb871cc2ad404fe522ee2ee9dc63773225ed3d7be4db10"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/enums/characterCodes.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"761c0508fc6cde1e763111ff9495f86e4119deef75e0fca59a858df77a2aebb1"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/telemetryReporting.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c967df431c3ef3ff86bdfdef3d8d5a20feb6e22655a550daf6b5fee77c5dfd2f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/commands.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24f8cf6793dabbd4e8dff2086172911030d4f6d0af688e8485fd98783916ed35"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/contentMapperContributions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"06b04e24e4e20d079b4469c96ecd2ad4980a70d746cedadc15aa4a18a02b876c"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/languageFeatures/util/dependentRegistration.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b855ba36cb3b54bf17ae79d83a517d5304f467b35ff1b36b4182266690b1185a"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/languageFeatures/documentHighlight.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"27f8563373dc985e9736df343d37ad78c593055bbe2d8899e07ce95b4abaa04f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/activeJsTsEditorTracker.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b1fdf6e1961d37af7e2d370c5af428f0a5421c4807f04aba20508d326681056"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/languageFeatures/sourceDefinition.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"424e660f9cdb020c00e0afb73ba8bca700cbcf978385387b6e026b95765f7020"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/fourslash/_scripts/makeManual.mts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"81c02b2d356c906caf70642590ea68c401523fb184e3bd83aadc73cc2b8b086f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/languageFeatures/hover.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5d9e8f675e8b4c2d42e309ec69cb8287976420a83b08c6462d591bb685e94eb"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/experimentationService.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"196a2d93a9d37dd5e67563aae1f134379988ec4d311eddbd06dce05810c3d474"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/managedFileContext.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4b9b8f0e2503ba8a13f8b6930f5c4321abc75d4aa604edbae35591f9dc63d04"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/workspaceSymbolMiddleware.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a31104c330789ffe17c0d4fbaeb648b7e959c91419a33a8deda8da51ccf07c55"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/lsp/lsproto/_generate/fetchModel.mts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bb4ded0c4b4daead5f8d223f2fcb3caf21cd7d7c1013d3b25043457c374c962"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/lib/tsgo.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9afe06b548c75ddd5df1b93741747f3d167dddc7873e020c795102c1d920cd2"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/statusBar.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af9862c546964228c7103cd374734601664e3ab71bcfb219914db48774b974c4"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/enums/scriptTarget.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"60d05691f0b2a69ee213acd9d159d6363621c6c4ea8030bcc7c92bc4c087829d"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/enums/scriptTarget.enum.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"81363e150504563a14a3b84235f52e7bb60c8d94e09c373d44124b3c3ccfec57"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_scripts/generate.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"483c30a466786ba5e416f2ecbfddfaf1883a6f54d15e3f5a3e04ae1c518b05b8"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/enums/regularExpressionFlags.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"debae49930f9fa1a49a36502e92321b72798e5a3430e9a180e3a2566f4f8480f"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~620 LoC): no import path from any entry point (142 application, 143 tooling, 13046 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (_packages/native-preview/src/api/sync/client.ts) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/syncChannel.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f8e2fec6b8af277b6e29be00a4ee789e56db1b729199a8e8742b1c4a316b954"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~161 LoC): no import path from any entry point (142 application, 143 tooling, 13046 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/sync/client.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"71a26f148400a17c042bb0b0117e808eaee560d729706c6de2e4a106bdf4d8c4"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~56 LoC): no import path from any entry point (142 application, 143 tooling, 13046 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/managedFileContext.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d613b1da503314bc06818706494f851c9d20b22c9b1e464433d15077f610e260"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027enableContributedNightlyVersion\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/util.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"08303f2d11dc5c0218a5b2f47aef72e345872fe1a9109457b6a1cc782c9780b5"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027builtinTSExtensionId\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/util.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7dd736686cfdddf4ed222fb8182d366a9ade83b77c0d2d4f46d3740e6e1ce6a"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027hasTsdkConfigured\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/util.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"741fa48400ac621f9d3e9f1ad381c5400c6d1b006e31dc2a74066047f3fa17e5"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027hasNativeTsdkConfigured\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/util.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ecdd4a206f6ef2917de06e2f0ad6b3af372f42597f9b78c94a9babd53e550e9"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027popcount8\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/node/node.infrastructure.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4a577a267838fa44b3e11c1112b4e4b0dd9685dbf89e7a1ed705d2bc73e32c9"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027NODE_STRING_INDEX_MASK\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/node/node.infrastructure.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb858aea5462005943463d9f26c159b0e3efe4fc53b91291faa92d47dc4e8839"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027modifierToFlag\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/node/node.infrastructure.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"5adc19bf49b128dccb5f085b8fe348b00b00a0d1d4347a6ea0eb9fdfe7aaabfd"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027RemoteNodeBase\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in _packages/native-preview/src/api/node/node.ts, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in _packages/native-preview/src/api/node/node.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/node/node.infrastructure.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"08774b6c5b1cfa01b72f65377df9df431a64bfe54d9d3b8e709b49280d71f635"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027NODE_OFFSET_FLAGS\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/node/protocol.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"39686efab8482ad592938dc96eec9cab0c772a20c9186de87d21d30ccbb0ab6d"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027NODE_STRING_INDEX_MASK\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/node/protocol.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"285f637b5e8579702e0d46d4e822c9db35033ae78fe9b610b84e3cc0a3c0a4b2"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027NODE_EXTENDED_DATA_MASK\u0027: Nothing imports THIS copy of \u0027NODE_EXTENDED_DATA_MASK\u0027 \u2014 but _packages/native-preview/src/api/node/node.infrastructure.ts:35 in the same directory exports that same name, and it is the copy every import site resolves to. Grepping the name therefore finds live callers that do not reach this binding: it is the dead half of a duplicated pair, left behind when the API moved. Delete it here and keep _packages/native-preview/src/api/node/node.infrastructure.ts\u0027s, or, if this one is meant to be the survivor, repoint the importers before removing the other."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_packages/native-preview/src/api/node/protocol.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ad45ecb5e125213cc85ef7348a2c170cd0a92829495fbe9f2e851baa3a88e21"}},{"ruleId":"R8","level":"warning","message":{"text":"Unlisted import \u0027vscode-languageserver-protocol\u0027: Imported only as a TYPE and declared in no reachable package.json. The import is erased at compile time, so nothing is installed and no runtime resolution depends on it \u2014 but type-checking a clean clone will fail. Declare the typings it resolves through (or the package itself) in the owning package.json."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"_extension/src/configurationMiddleware.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"173823c8c0f953b181a801104dae42bd0764bd2fd68d942e0ef9d94f5105d37e"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027@unicode/unicode-15.1.0\u0027: Declared in the root package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cf9f53475b6ea44298644c5d50ad9c55cbdaf02f2cf582fb6da3c04e2a9b3c4d"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027dprint\u0027: Declared in the root package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5618252093ac522e5ffd0ab7e3d19a9e910f7cb7c5268164c79d9ddd795a660b"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060strings.Contains(lit, \u0022.min.js\u0022)\u0060 can never decide this \u0060||\u0060 \u2014 every value satisfying \u0060strings.Contains(lit, \u0022.min.js\u0022)\u0060 also satisfies \u0060strings.Contains(lit, \u0022.min.\u0022)\u0060, so the \u0060||\u0060 chain is already decided by the latter. The expression is equivalent to the chain without it, which means it is wider than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"internal/vfs/vfsmatch/vfsmatch.go"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"768f13d68cfa4c5a95861acae1793710f215d895a400640e41c1c49044e1ee94"}}],"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-1059","guid":"a2381a08-60f6-9554-a8b8-f3018cfaaca5","name":"Insufficient Technical Documentation","shortDescription":{"text":"Insufficient Technical Documentation"},"helpUri":"https://cwe.mitre.org/data/definitions/1059.html"},{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"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-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"CWE-506","shortDescription":{"text":"CWE-506"},"helpUri":"https://cwe.mitre.org/data/definitions/506.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-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.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":9,"secretScannerRunsExcluded":0}},"redactionTokens":["A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."]}]}