From a9f534f271dcc171e35e3aa27313982b930d467d Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 14 Jan 2026 19:13:51 -0800 Subject: [PATCH] Correctly split line endings for `// @testOption: value` parsing (#62987) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/harness/harnessUtils.ts | 18 +++++-------- .../decoratedClassExportsCommonJS1.js | 5 ++-- .../decoratedClassExportsCommonJS1.symbols | 26 +++++++++++-------- .../decoratedClassExportsCommonJS1.types | 7 ++++- tests/baselines/reference/genericArray0.js | 1 - .../baselines/reference/genericArray0.symbols | 15 +++++------ tests/baselines/reference/genericArray0.types | 1 - .../reference/templateStringMultiline3.js | 5 +--- .../templateStringMultiline3.symbols | 1 + .../reference/templateStringMultiline3.types | 6 +++-- .../reference/templateStringMultiline3_ES6.js | 9 +------ .../templateStringMultiline3_ES6.symbols | 4 --- .../templateStringMultiline3_ES6.types | 6 ----- 13 files changed, 45 insertions(+), 59 deletions(-) diff --git a/src/harness/harnessUtils.ts b/src/harness/harnessUtils.ts index b0b0edd8af8..f7683258971 100644 --- a/src/harness/harnessUtils.ts +++ b/src/harness/harnessUtils.ts @@ -15,19 +15,15 @@ export function evalFile(fileContents: string, fileName: string, nodeContext?: a } } -/** Splits the given string on \r\n, or on only \n if that fails, or on only \r if *that* fails. */ +const newlineRegex = /\r?\n/; + +/** + * Splits the given string on the two reasonable line terminators (\r\n or \n). + * Does NOT split on `\r` alone, \u2028, or \u2029. + */ export function splitContentByNewlines(content: string): string[] { // Split up the input file by line - // Note: IE JS engine incorrectly handles consecutive delimiters here when using RegExp split, so - // we have to use string-based splitting instead and try to figure out the delimiting chars - let lines = content.split("\r\n"); - if (lines.length === 1) { - lines = content.split("\n"); - - if (lines.length === 1) { - lines = content.split("\r"); - } - } + const lines = content.split(newlineRegex); return lines; } diff --git a/tests/baselines/reference/decoratedClassExportsCommonJS1.js b/tests/baselines/reference/decoratedClassExportsCommonJS1.js index ad8a57ab012..6e2b258cd87 100644 --- a/tests/baselines/reference/decoratedClassExportsCommonJS1.js +++ b/tests/baselines/reference/decoratedClassExportsCommonJS1.js @@ -1,6 +1,7 @@ //// [tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS1.ts] //// -//// [decoratedClassExportsCommonJS1.ts] +//// [a.ts] +declare function forwardRef(x: any): any; declare var Something: any; @Something({ v: () => Testing123 }) export class Testing123 { @@ -8,7 +9,7 @@ export class Testing123 { static prop1 = Testing123.prop0; } -//// [decoratedClassExportsCommonJS1.js] +//// [a.js] "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; diff --git a/tests/baselines/reference/decoratedClassExportsCommonJS1.symbols b/tests/baselines/reference/decoratedClassExportsCommonJS1.symbols index 1134ada7588..e2bca53fe84 100644 --- a/tests/baselines/reference/decoratedClassExportsCommonJS1.symbols +++ b/tests/baselines/reference/decoratedClassExportsCommonJS1.symbols @@ -1,23 +1,27 @@ //// [tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS1.ts] //// -=== decoratedClassExportsCommonJS1.ts === +=== a.ts === +declare function forwardRef(x: any): any; +>forwardRef : Symbol(forwardRef, Decl(a.ts, 0, 0)) +>x : Symbol(x, Decl(a.ts, 0, 28)) + declare var Something: any; ->Something : Symbol(Something, Decl(decoratedClassExportsCommonJS1.ts, 0, 11)) +>Something : Symbol(Something, Decl(a.ts, 1, 11)) @Something({ v: () => Testing123 }) ->Something : Symbol(Something, Decl(decoratedClassExportsCommonJS1.ts, 0, 11)) ->v : Symbol(v, Decl(decoratedClassExportsCommonJS1.ts, 1, 12)) ->Testing123 : Symbol(Testing123, Decl(decoratedClassExportsCommonJS1.ts, 0, 27)) +>Something : Symbol(Something, Decl(a.ts, 1, 11)) +>v : Symbol(v, Decl(a.ts, 2, 12)) +>Testing123 : Symbol(Testing123, Decl(a.ts, 1, 27)) export class Testing123 { ->Testing123 : Symbol(Testing123, Decl(decoratedClassExportsCommonJS1.ts, 0, 27)) +>Testing123 : Symbol(Testing123, Decl(a.ts, 1, 27)) static prop0: string; ->prop0 : Symbol(Testing123.prop0, Decl(decoratedClassExportsCommonJS1.ts, 2, 25)) +>prop0 : Symbol(Testing123.prop0, Decl(a.ts, 3, 25)) static prop1 = Testing123.prop0; ->prop1 : Symbol(Testing123.prop1, Decl(decoratedClassExportsCommonJS1.ts, 3, 25)) ->Testing123.prop0 : Symbol(Testing123.prop0, Decl(decoratedClassExportsCommonJS1.ts, 2, 25)) ->Testing123 : Symbol(Testing123, Decl(decoratedClassExportsCommonJS1.ts, 0, 27)) ->prop0 : Symbol(Testing123.prop0, Decl(decoratedClassExportsCommonJS1.ts, 2, 25)) +>prop1 : Symbol(Testing123.prop1, Decl(a.ts, 4, 25)) +>Testing123.prop0 : Symbol(Testing123.prop0, Decl(a.ts, 3, 25)) +>Testing123 : Symbol(Testing123, Decl(a.ts, 1, 27)) +>prop0 : Symbol(Testing123.prop0, Decl(a.ts, 3, 25)) } diff --git a/tests/baselines/reference/decoratedClassExportsCommonJS1.types b/tests/baselines/reference/decoratedClassExportsCommonJS1.types index a931e19930f..368258ebdd1 100644 --- a/tests/baselines/reference/decoratedClassExportsCommonJS1.types +++ b/tests/baselines/reference/decoratedClassExportsCommonJS1.types @@ -1,6 +1,11 @@ //// [tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS1.ts] //// -=== decoratedClassExportsCommonJS1.ts === +=== a.ts === +declare function forwardRef(x: any): any; +>forwardRef : (x: any) => any +> : ^ ^^ ^^^^^ +>x : any + declare var Something: any; >Something : any diff --git a/tests/baselines/reference/genericArray0.js b/tests/baselines/reference/genericArray0.js index 833ae661cc2..b437091fcf9 100644 --- a/tests/baselines/reference/genericArray0.js +++ b/tests/baselines/reference/genericArray0.js @@ -1,7 +1,6 @@ //// [tests/cases/compiler/genericArray0.ts] //// //// [genericArray0.ts] - var x:number[]; diff --git a/tests/baselines/reference/genericArray0.symbols b/tests/baselines/reference/genericArray0.symbols index e06c294a930..9ec736a1b17 100644 --- a/tests/baselines/reference/genericArray0.symbols +++ b/tests/baselines/reference/genericArray0.symbols @@ -1,21 +1,20 @@ //// [tests/cases/compiler/genericArray0.ts] //// === genericArray0.ts === - var x:number[]; ->x : Symbol(x, Decl(genericArray0.ts, 1, 3)) +>x : Symbol(x, Decl(genericArray0.ts, 0, 3)) var y = x; ->y : Symbol(y, Decl(genericArray0.ts, 4, 3)) ->x : Symbol(x, Decl(genericArray0.ts, 1, 3)) +>y : Symbol(y, Decl(genericArray0.ts, 3, 3)) +>x : Symbol(x, Decl(genericArray0.ts, 0, 3)) function map() { ->map : Symbol(map, Decl(genericArray0.ts, 4, 10)) ->U : Symbol(U, Decl(genericArray0.ts, 6, 13)) +>map : Symbol(map, Decl(genericArray0.ts, 3, 10)) +>U : Symbol(U, Decl(genericArray0.ts, 5, 13)) var ys: U[] = []; ->ys : Symbol(ys, Decl(genericArray0.ts, 7, 7)) ->U : Symbol(U, Decl(genericArray0.ts, 6, 13)) +>ys : Symbol(ys, Decl(genericArray0.ts, 6, 7)) +>U : Symbol(U, Decl(genericArray0.ts, 5, 13)) } diff --git a/tests/baselines/reference/genericArray0.types b/tests/baselines/reference/genericArray0.types index 0589420cc24..3947445ff7d 100644 --- a/tests/baselines/reference/genericArray0.types +++ b/tests/baselines/reference/genericArray0.types @@ -1,7 +1,6 @@ //// [tests/cases/compiler/genericArray0.ts] //// === genericArray0.ts === - var x:number[]; >x : number[] > : ^^^^^^^^ diff --git a/tests/baselines/reference/templateStringMultiline3.js b/tests/baselines/reference/templateStringMultiline3.js index dfc198fcdd7..b565f6006a3 100644 --- a/tests/baselines/reference/templateStringMultiline3.js +++ b/tests/baselines/reference/templateStringMultiline3.js @@ -1,10 +1,7 @@ //// [tests/cases/conformance/es6/templates/templateStringMultiline3.ts] //// //// [templateStringMultiline3.ts] -// newlines are -` -\ -` + // newlines are ` \ ` //// [templateStringMultiline3.js] // newlines are diff --git a/tests/baselines/reference/templateStringMultiline3.symbols b/tests/baselines/reference/templateStringMultiline3.symbols index 7c687d9c91d..7d5d6a0b20e 100644 --- a/tests/baselines/reference/templateStringMultiline3.symbols +++ b/tests/baselines/reference/templateStringMultiline3.symbols @@ -2,6 +2,7 @@ === templateStringMultiline3.ts === + // newlines are ` \ diff --git a/tests/baselines/reference/templateStringMultiline3.types b/tests/baselines/reference/templateStringMultiline3.types index 57d5ea088ef..c6ce0adfa27 100644 --- a/tests/baselines/reference/templateStringMultiline3.types +++ b/tests/baselines/reference/templateStringMultiline3.types @@ -1,10 +1,12 @@ //// [tests/cases/conformance/es6/templates/templateStringMultiline3.ts] //// === templateStringMultiline3.ts === + + // newlines are ` ->`\` : "\n" -> : ^^^^ +>` \ ` : "\n" +> : ^^^^ \ ` diff --git a/tests/baselines/reference/templateStringMultiline3_ES6.js b/tests/baselines/reference/templateStringMultiline3_ES6.js index 8d8f80c654f..ef2552a932f 100644 --- a/tests/baselines/reference/templateStringMultiline3_ES6.js +++ b/tests/baselines/reference/templateStringMultiline3_ES6.js @@ -1,13 +1,6 @@ //// [tests/cases/conformance/es6/templates/templateStringMultiline3_ES6.ts] //// //// [templateStringMultiline3_ES6.ts] -// newlines are -` -\ -` + //// [templateStringMultiline3_ES6.js] -// newlines are -` -\ -`; diff --git a/tests/baselines/reference/templateStringMultiline3_ES6.symbols b/tests/baselines/reference/templateStringMultiline3_ES6.symbols index 0ba6c719beb..fddb618384a 100644 --- a/tests/baselines/reference/templateStringMultiline3_ES6.symbols +++ b/tests/baselines/reference/templateStringMultiline3_ES6.symbols @@ -2,7 +2,3 @@ === templateStringMultiline3_ES6.ts === -// newlines are -` -\ -` diff --git a/tests/baselines/reference/templateStringMultiline3_ES6.types b/tests/baselines/reference/templateStringMultiline3_ES6.types index d24a6ace43c..fddb618384a 100644 --- a/tests/baselines/reference/templateStringMultiline3_ES6.types +++ b/tests/baselines/reference/templateStringMultiline3_ES6.types @@ -1,10 +1,4 @@ //// [tests/cases/conformance/es6/templates/templateStringMultiline3_ES6.ts] //// === templateStringMultiline3_ES6.ts === -// newlines are -` ->`\` : "\n" -> : ^^^^ -\ -`