From b55b6e2f6b69798ace74b28122931ac302f41870 Mon Sep 17 00:00:00 2001 From: Klaus Meinhardt Date: Mon, 12 Nov 2018 21:45:36 +0100 Subject: [PATCH 1/5] fix comment parsing at start of file * skip shebang if present (fixes: #28477) * don't parse trailing comments as they are also treated like leading comments --- src/compiler/scanner.ts | 12 ++++- src/testRunner/tsconfig.json | 1 + src/testRunner/unittests/comments.ts | 49 +++++++++++++++++++ .../exponentiationOperatorSyntaxError1.js | 3 +- .../reference/shebangBeforeReferences.js | 1 + 5 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 src/testRunner/unittests/comments.ts diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index b8d4d24807710..65e9d3598369a 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -642,8 +642,18 @@ namespace ts { let pendingKind!: CommentKind; let pendingHasTrailingNewLine!: boolean; let hasPendingCommentRange = false; - let collecting = trailing || pos === 0; + let collecting = trailing; let accumulator = initial; + if (pos === 0) { + if (collecting) { + return accumulator; + } + collecting = true; + const shebang = getShebang(text); + if (shebang) { + pos = shebang.length; + } + } scan: while (pos >= 0 && pos < text.length) { const ch = text.charCodeAt(pos); switch (ch) { diff --git a/src/testRunner/tsconfig.json b/src/testRunner/tsconfig.json index 32772ed311b56..7f164df95c491 100644 --- a/src/testRunner/tsconfig.json +++ b/src/testRunner/tsconfig.json @@ -45,6 +45,7 @@ "unittests/builder.ts", "unittests/cancellableLanguageServiceOperations.ts", "unittests/commandLineParsing.ts", + "unittests/comments.ts", "unittests/compileOnSave.ts", "unittests/compilerCore.ts", "unittests/configurationExtension.ts", diff --git a/src/testRunner/unittests/comments.ts b/src/testRunner/unittests/comments.ts new file mode 100644 index 0000000000000..60ae4afd31279 --- /dev/null +++ b/src/testRunner/unittests/comments.ts @@ -0,0 +1,49 @@ +namespace ts { + describe("comment parsing", () => { + const withShebang = `#! node +/** comment */ +// another one +;`; + const noShebang = `/** comment */ +// another one +;`; + const withTrailing = `;/* comment */ +// another one +` + it("skips shebang", () => { + const result = getLeadingCommentRanges(withShebang, 0); + assert.isDefined(result); + assert.strictEqual(result!.length, 2); + }); + + it("treats all comments at start of file as leading comments", () => { + const result = getLeadingCommentRanges(noShebang, 0); + assert.isDefined(result); + assert.strictEqual(result!.length, 2); + }); + + it("returns leading comments if position is not 0", () => { + const result = getLeadingCommentRanges(withTrailing, 1); + assert.isDefined(result); + assert.strictEqual(result!.length, 1); + assert.strictEqual(result![0].kind, SyntaxKind.SingleLineCommentTrivia); + }); + + it("returns no trailing comments at start of file", () => { + const result = getTrailingCommentRanges(noShebang, 0); + assert.isUndefined(result); + }); + + it("returns no trailing comments at start of file if shebang is present", () => { + const result = getTrailingCommentRanges(withShebang, 0); + assert.isUndefined(result); + }); + + it("returns trailing comments if position is not 0", () => { + const result = getTrailingCommentRanges(withTrailing, 1); + assert.isDefined(result); + assert.strictEqual(result!.length, 1); + assert.strictEqual(result![0].kind, SyntaxKind.MultiLineCommentTrivia); + }); + }); +} diff --git a/tests/baselines/reference/exponentiationOperatorSyntaxError1.js b/tests/baselines/reference/exponentiationOperatorSyntaxError1.js index 667abed731c48..bddd4880ee2ed 100644 --- a/tests/baselines/reference/exponentiationOperatorSyntaxError1.js +++ b/tests/baselines/reference/exponentiationOperatorSyntaxError1.js @@ -40,8 +40,7 @@ var temp = 10; //// [exponentiationOperatorSyntaxError1.js] // Error: early syntax error using ES7 SimpleUnaryExpression on left-hand side without () -Math.pow(// Error: early syntax error using ES7 SimpleUnaryExpression on left-hand side without () --1, 2); +Math.pow(-1, 2); Math.pow(+1, 2); Math.pow(1, Math.pow(-2, 3)); Math.pow(1, Math.pow(-2, -3)); diff --git a/tests/baselines/reference/shebangBeforeReferences.js b/tests/baselines/reference/shebangBeforeReferences.js index 4ebf692e1d513..30e4b7a8633c1 100644 --- a/tests/baselines/reference/shebangBeforeReferences.js +++ b/tests/baselines/reference/shebangBeforeReferences.js @@ -17,6 +17,7 @@ use(x); //// [f.js] #!/usr/bin/env node "use strict"; +/// exports.__esModule = true; var test_1 = require("test"); use(test_1.x); From 5acf8e380ba46ba0febe583563363a8fdc881db5 Mon Sep 17 00:00:00 2001 From: Klaus Meinhardt Date: Mon, 12 Nov 2018 21:47:50 +0100 Subject: [PATCH 2/5] fix lint --- src/testRunner/unittests/comments.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testRunner/unittests/comments.ts b/src/testRunner/unittests/comments.ts index 60ae4afd31279..0868a6f4ca83d 100644 --- a/src/testRunner/unittests/comments.ts +++ b/src/testRunner/unittests/comments.ts @@ -9,7 +9,7 @@ namespace ts { ;`; const withTrailing = `;/* comment */ // another one -` +`; it("skips shebang", () => { const result = getLeadingCommentRanges(withShebang, 0); assert.isDefined(result); From 451ff29263de7a64456e46a59dbe1908311ec294 Mon Sep 17 00:00:00 2001 From: Klaus Meinhardt Date: Sun, 27 Jan 2019 17:41:20 +0100 Subject: [PATCH 3/5] revert change of trailing comment parsing --- src/compiler/scanner.ts | 3 --- src/testRunner/unittests/comments.ts | 17 ----------------- 2 files changed, 20 deletions(-) diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index c39c4437ebb3f..d0ecc1298567e 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -664,9 +664,6 @@ namespace ts { let collecting = trailing; let accumulator = initial; if (pos === 0) { - if (collecting) { - return accumulator; - } collecting = true; const shebang = getShebang(text); if (shebang) { diff --git a/src/testRunner/unittests/comments.ts b/src/testRunner/unittests/comments.ts index 0868a6f4ca83d..59f3020c112bc 100644 --- a/src/testRunner/unittests/comments.ts +++ b/src/testRunner/unittests/comments.ts @@ -28,22 +28,5 @@ namespace ts { assert.strictEqual(result!.length, 1); assert.strictEqual(result![0].kind, SyntaxKind.SingleLineCommentTrivia); }); - - it("returns no trailing comments at start of file", () => { - const result = getTrailingCommentRanges(noShebang, 0); - assert.isUndefined(result); - }); - - it("returns no trailing comments at start of file if shebang is present", () => { - const result = getTrailingCommentRanges(withShebang, 0); - assert.isUndefined(result); - }); - - it("returns trailing comments if position is not 0", () => { - const result = getTrailingCommentRanges(withTrailing, 1); - assert.isDefined(result); - assert.strictEqual(result!.length, 1); - assert.strictEqual(result![0].kind, SyntaxKind.MultiLineCommentTrivia); - }); }); } From 33853e2258d02e42bb7da6ba9bd5243d79ebdb33 Mon Sep 17 00:00:00 2001 From: Klaus Meinhardt Date: Sun, 27 Jan 2019 17:46:32 +0100 Subject: [PATCH 4/5] accept baseline changes --- tests/baselines/reference/api/tsserverlibrary.d.ts | 1 - .../baselines/reference/exponentiationOperatorSyntaxError1.js | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index ae457551a5003..a384375b248c1 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -2217,7 +2217,6 @@ declare namespace ts { } interface UniqueESSymbolType extends Type { symbol: Symbol; - escapedName: __String; } interface StringLiteralType extends LiteralType { value: string; diff --git a/tests/baselines/reference/exponentiationOperatorSyntaxError1.js b/tests/baselines/reference/exponentiationOperatorSyntaxError1.js index bddd4880ee2ed..667abed731c48 100644 --- a/tests/baselines/reference/exponentiationOperatorSyntaxError1.js +++ b/tests/baselines/reference/exponentiationOperatorSyntaxError1.js @@ -40,7 +40,8 @@ var temp = 10; //// [exponentiationOperatorSyntaxError1.js] // Error: early syntax error using ES7 SimpleUnaryExpression on left-hand side without () -Math.pow(-1, 2); +Math.pow(// Error: early syntax error using ES7 SimpleUnaryExpression on left-hand side without () +-1, 2); Math.pow(+1, 2); Math.pow(1, Math.pow(-2, 3)); Math.pow(1, Math.pow(-2, -3)); From 0604ae1a8108ec8bc3d6c41cbe37fbf13f93a0c8 Mon Sep 17 00:00:00 2001 From: Klaus Meinhardt Date: Sun, 27 Jan 2019 19:35:18 +0100 Subject: [PATCH 5/5] revert invalid baseline change --- tests/baselines/reference/api/tsserverlibrary.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index a384375b248c1..ae457551a5003 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -2217,6 +2217,7 @@ declare namespace ts { } interface UniqueESSymbolType extends Type { symbol: Symbol; + escapedName: __String; } interface StringLiteralType extends LiteralType { value: string;