From f9eb976319b0c4ce2a5a3751b90fc499db0f3aff Mon Sep 17 00:00:00 2001 From: Klaus Meinhardt Date: Tue, 10 Jul 2018 22:42:21 +0200 Subject: [PATCH] handle multiple prologue directives Fixes: #24689 --- src/compiler/utilities.ts | 21 ++++++++----------- .../reference/api/tsserverlibrary.d.ts | 9 ++------ .../destructuringTempOccursAfterPrologue.js | 2 ++ ...structuringTempOccursAfterPrologue.symbols | 3 ++- ...destructuringTempOccursAfterPrologue.types | 3 +++ .../destructuringTempOccursAfterPrologue.ts | 1 + 6 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 7034c284c7..1270875549 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -401,21 +401,18 @@ namespace ts { } /** - * Appends a range of value to begin of an array, returning the array. - * - * @param to The array to which `value` is to be appended. If `to` is `undefined`, a new array - * is created if `value` was appended. - * @param from The values to append to the array. If `from` is `undefined`, nothing is - * appended. If an element of `from` is `undefined`, that element is not appended. + * Prepends statements to an array taking care of prologue directives. */ - export function prependStatements(to: T[], from: ReadonlyArray | undefined): T[] | undefined { + export function prependStatements(to: T[], from: ReadonlyArray | undefined): T[] { if (from === undefined || from.length === 0) return to; - if (to === undefined) return from.slice(); - const prologue = to.length && isPrologueDirective(to[0]) && to.shift(); - to.unshift(...from); - if (prologue) { - to.unshift(prologue); + let statementIndex = 0; + // skip all prologue directives to insert at the correct position + for (; statementIndex < to.length; ++statementIndex) { + if (!isPrologueDirective(to[statementIndex])) { + break; + } } + to.splice(statementIndex, 0, ...from); return to; } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 9ec195ea31..0ef244f860 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -6094,14 +6094,9 @@ declare namespace ts { function nodeIsMissing(node: Node | undefined): boolean; function nodeIsPresent(node: Node | undefined): boolean; /** - * Appends a range of value to begin of an array, returning the array. - * - * @param to The array to which `value` is to be appended. If `to` is `undefined`, a new array - * is created if `value` was appended. - * @param from The values to append to the array. If `from` is `undefined`, nothing is - * appended. If an element of `from` is `undefined`, that element is not appended. + * Prepends statements to an array taking care of prologue directives. */ - function prependStatements(to: T[], from: ReadonlyArray | undefined): T[] | undefined; + function prependStatements(to: T[], from: ReadonlyArray | undefined): T[]; /** * Determine if the given comment is a triple-slash * diff --git a/tests/baselines/reference/destructuringTempOccursAfterPrologue.js b/tests/baselines/reference/destructuringTempOccursAfterPrologue.js index a739070856..62786ec422 100644 --- a/tests/baselines/reference/destructuringTempOccursAfterPrologue.js +++ b/tests/baselines/reference/destructuringTempOccursAfterPrologue.js @@ -1,12 +1,14 @@ //// [destructuringTempOccursAfterPrologue.ts] function test(p: any) { 'use strict'; + 'use strong'; p = { prop: p } = p; } //// [destructuringTempOccursAfterPrologue.js] function test(p) { 'use strict'; + 'use strong'; var _a; p = (_a = p, p = _a.prop, _a); } diff --git a/tests/baselines/reference/destructuringTempOccursAfterPrologue.symbols b/tests/baselines/reference/destructuringTempOccursAfterPrologue.symbols index 0e68259e6c..0328f00601 100644 --- a/tests/baselines/reference/destructuringTempOccursAfterPrologue.symbols +++ b/tests/baselines/reference/destructuringTempOccursAfterPrologue.symbols @@ -4,9 +4,10 @@ function test(p: any) { >p : Symbol(p, Decl(destructuringTempOccursAfterPrologue.ts, 0, 14)) 'use strict'; + 'use strong'; p = { prop: p } = p; >p : Symbol(p, Decl(destructuringTempOccursAfterPrologue.ts, 0, 14)) ->prop : Symbol(prop, Decl(destructuringTempOccursAfterPrologue.ts, 2, 9)) +>prop : Symbol(prop, Decl(destructuringTempOccursAfterPrologue.ts, 3, 9)) >p : Symbol(p, Decl(destructuringTempOccursAfterPrologue.ts, 0, 14)) >p : Symbol(p, Decl(destructuringTempOccursAfterPrologue.ts, 0, 14)) } diff --git a/tests/baselines/reference/destructuringTempOccursAfterPrologue.types b/tests/baselines/reference/destructuringTempOccursAfterPrologue.types index 8a62e25b68..426345838f 100644 --- a/tests/baselines/reference/destructuringTempOccursAfterPrologue.types +++ b/tests/baselines/reference/destructuringTempOccursAfterPrologue.types @@ -6,6 +6,9 @@ function test(p: any) { 'use strict'; >'use strict' : "use strict" + 'use strong'; +>'use strong' : "use strong" + p = { prop: p } = p; >p = { prop: p } = p : any >p : any diff --git a/tests/cases/compiler/destructuringTempOccursAfterPrologue.ts b/tests/cases/compiler/destructuringTempOccursAfterPrologue.ts index 96dec6e608..20ef750750 100644 --- a/tests/cases/compiler/destructuringTempOccursAfterPrologue.ts +++ b/tests/cases/compiler/destructuringTempOccursAfterPrologue.ts @@ -1,4 +1,5 @@ function test(p: any) { 'use strict'; + 'use strong'; p = { prop: p } = p; } \ No newline at end of file