From 0e122b563309622a0fe70739ec773b47ce16204e Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 25 Nov 2014 17:41:49 -0800 Subject: [PATCH 01/12] Keep track of unterminated literal expressions. --- src/compiler/checker.ts | 4 ++-- src/compiler/emitter.ts | 4 ++-- src/compiler/parser.ts | 23 ++++--------------- src/compiler/scanner.ts | 10 ++++++++ src/compiler/types.ts | 1 + src/services/services.ts | 43 ++++++----------------------------- src/services/signatureHelp.ts | 2 +- src/services/utilities.ts | 4 ++-- 8 files changed, 29 insertions(+), 62 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5ee9fa4ab3..ea4c04e8b8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5302,7 +5302,7 @@ module ts { var templateExpression = tagExpression.template; var lastSpan = lastOrUndefined(templateExpression.templateSpans); Debug.assert(lastSpan !== undefined); // we should always have at least one span. - callIsIncomplete = lastSpan.literal.kind === SyntaxKind.Missing || isUnterminatedTemplateEnd(lastSpan.literal); + callIsIncomplete = lastSpan.literal.kind === SyntaxKind.Missing || !!lastSpan.literal.isUnterminated; } else { // If the template didn't end in a backtick, or its beginning occurred right prior to EOF, @@ -5310,7 +5310,7 @@ module ts { // so we consider the call to be incomplete. var templateLiteral = tagExpression.template; Debug.assert(templateLiteral.kind === SyntaxKind.NoSubstitutionTemplateLiteral); - callIsIncomplete = isUnterminatedTemplateEnd(templateLiteral); + callIsIncomplete = !!templateLiteral.isUnterminated; } } else { diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 5cdf98aa63..4595c8cb47 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -715,7 +715,7 @@ module ts { }; } } - + function emitEnumDeclaration(node: EnumDeclaration) { if (resolver.isDeclarationVisible(node)) { emitJsDocComments(node); @@ -3558,7 +3558,7 @@ module ts { return leadingComments; } - + function getLeadingCommentsToEmit(node: Node) { // Emit the leading comments only if the parent's pos doesn't match because parent should take care of emitting these comments if (node.parent.kind === SyntaxKind.SourceFile || node.pos !== node.parent.pos) { diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 8d7bf9e4fe..c08ba6a7ab 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -809,25 +809,6 @@ module ts { return SyntaxKind.FirstTriviaToken <= token && token <= SyntaxKind.LastTriviaToken; } - export function isUnterminatedTemplateEnd(node: LiteralExpression) { - Debug.assert(isTemplateLiteralKind(node.kind)); - var sourceText = getSourceFileOfNode(node).text; - - // If we're not at the EOF, we know we must be terminated. - if (node.end !== sourceText.length) { - return false; - } - - // The literal can only be unterminated if it is a template tail or a no-sub template. - if (node.kind !== SyntaxKind.TemplateTail && node.kind !== SyntaxKind.NoSubstitutionTemplateLiteral) { - return false; - } - - // If we didn't end in a backtick, we must still be in the middle of a template. - // If we did, make sure that it's not the *initial* backtick. - return sourceText.charCodeAt(node.end - 1) !== CharacterCodes.backtick || node.text.length === 0; - } - export function isModifier(token: SyntaxKind): boolean { switch (token) { case SyntaxKind.PublicKeyword: @@ -1544,6 +1525,10 @@ module ts { var text = scanner.getTokenValue(); node.text = internName ? internIdentifier(text) : text; + if (scanner.isUnterminated()) { + node.isUnterminated = true; + } + var tokenPos = scanner.getTokenPos(); nextToken(); finishNode(node); diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 4858265932..f9d23166fe 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -22,6 +22,7 @@ module ts { hasPrecedingLineBreak(): boolean; isIdentifier(): boolean; isReservedWord(): boolean; + isUnterminated(): boolean; reScanGreaterToken(): SyntaxKind; reScanSlashToken(): SyntaxKind; reScanTemplateToken(): SyntaxKind; @@ -470,6 +471,7 @@ module ts { var token: SyntaxKind; var tokenValue: string; var precedingLineBreak: boolean; + var tokenUnterminated: boolean; function error(message: DiagnosticMessage): void { if (onError) { @@ -553,6 +555,7 @@ module ts { while (true) { if (pos >= len) { result += text.substring(start, pos); + tokenUnterminated = true; error(Diagnostics.Unterminated_string_literal); break; } @@ -570,6 +573,7 @@ module ts { } if (isLineBreak(ch)) { result += text.substring(start, pos); + tokenUnterminated = true; error(Diagnostics.Unterminated_string_literal); break; } @@ -593,6 +597,7 @@ module ts { while (true) { if (pos >= len) { contents += text.substring(start, pos); + tokenUnterminated = true; error(Diagnostics.Unterminated_template_literal); resultingToken = startedWithBacktick ? SyntaxKind.NoSubstitutionTemplateLiteral : SyntaxKind.TemplateTail; break; @@ -756,6 +761,7 @@ module ts { function scan(): SyntaxKind { startPos = pos; precedingLineBreak = false; + tokenUnterminated = false; while (true) { tokenPos = pos; if (pos >= len) { @@ -912,6 +918,7 @@ module ts { continue; } else { + tokenUnterminated = !commentClosed; return token = SyntaxKind.MultiLineCommentTrivia; } } @@ -1069,12 +1076,14 @@ module ts { // If we reach the end of a file, or hit a newline, then this is an unterminated // regex. Report error and return what we have so far. if (p >= len) { + tokenUnterminated = true; error(Diagnostics.Unterminated_regular_expression_literal) break; } var ch = text.charCodeAt(p); if (isLineBreak(ch)) { + tokenUnterminated = true; error(Diagnostics.Unterminated_regular_expression_literal) break; } @@ -1167,6 +1176,7 @@ module ts { hasPrecedingLineBreak: () => precedingLineBreak, isIdentifier: () => token === SyntaxKind.Identifier || token > SyntaxKind.LastReservedWord, isReservedWord: () => token >= SyntaxKind.FirstReservedWord && token <= SyntaxKind.LastReservedWord, + isUnterminated: () => tokenUnterminated, reScanGreaterToken, reScanSlashToken, reScanTemplateToken, diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 83937c24ed..3bfd8bc341 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -467,6 +467,7 @@ module ts { // For a NumericLiteral, the stored value is the toString() representation of the number. For example 1, 1.00, and 1e0 are all stored as just "1". export interface LiteralExpression extends Expression { text: string; + isUnterminated?: boolean; } export interface TemplateExpression extends Expression { diff --git a/src/services/services.ts b/src/services/services.ts index 67e8aba34d..8ff61b05a7 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -2497,10 +2497,11 @@ module ts { } function isInStringOrRegularExpressionOrTemplateLiteral(previousToken: Node): boolean { - if (previousToken.kind === SyntaxKind.StringLiteral || isTemplateLiteralKind(previousToken.kind)) { + if (previousToken.kind === SyntaxKind.StringLiteral + || previousToken.kind === SyntaxKind.RegularExpressionLiteral + || isTemplateLiteralKind(previousToken.kind)) { // The position has to be either: 1. entirely within the token text, or - // 2. at the end position, and the string literal is not terminated - + // 2. at the end position of an unterminated token. var start = previousToken.getStart(); var end = previousToken.getEnd(); @@ -2508,36 +2509,9 @@ module ts { return true; } else if (position === end) { - var width = end - start; - var text = previousToken.getSourceFile().text; - - // If the token is a single character, or its second-to-last charcter indicates an escape code, - // then we can immediately say that we are in the middle of an unclosed string. - if (width <= 1 || text.charCodeAt(end - 2) === CharacterCodes.backslash) { - return true; - } - - // Now check if the last character is a closing character for the token. - switch (previousToken.kind) { - case SyntaxKind.StringLiteral: - case SyntaxKind.NoSubstitutionTemplateLiteral: - return text.charCodeAt(start) !== text.charCodeAt(end - 1); - - case SyntaxKind.TemplateHead: - case SyntaxKind.TemplateMiddle: - return text.charCodeAt(end - 1) !== CharacterCodes.openBrace - || text.charCodeAt(end - 2) !== CharacterCodes.$; - - case SyntaxKind.TemplateTail: - return text.charCodeAt(end - 1) !== CharacterCodes.backtick; - } - - return false; + return !!(previousToken).isUnterminated; } } - else if (previousToken.kind === SyntaxKind.RegularExpressionLiteral) { - return previousToken.getStart() < position && position < previousToken.getEnd(); - } return false; } @@ -5579,7 +5553,7 @@ module ts { if (token === SyntaxKind.StringLiteral) { // Check to see if we finished up on a multiline string literal. var tokenText = scanner.getTokenText(); - if (tokenText.length > 0 && tokenText.charCodeAt(tokenText.length - 1) === CharacterCodes.backslash) { + if (scanner.isUnterminated()) { var quoteChar = tokenText.charCodeAt(0); result.finalLexState = quoteChar === CharacterCodes.doubleQuote ? EndOfLineState.InDoubleQuoteStringLiteral @@ -5588,10 +5562,7 @@ module ts { } else if (token === SyntaxKind.MultiLineCommentTrivia) { // Check to see if the multiline comment was unclosed. - var tokenText = scanner.getTokenText() - if (!(tokenText.length > 3 && // need to avoid catching '/*/' - tokenText.charCodeAt(tokenText.length - 2) === CharacterCodes.asterisk && - tokenText.charCodeAt(tokenText.length - 1) === CharacterCodes.slash)) { + if (scanner.isUnterminated()) { result.finalLexState = EndOfLineState.InMultiLineCommentTrivia; } } diff --git a/src/services/signatureHelp.ts b/src/services/signatureHelp.ts index e2b65e3c6e..4ec0b1dfbc 100644 --- a/src/services/signatureHelp.ts +++ b/src/services/signatureHelp.ts @@ -296,7 +296,7 @@ module ts.SignatureHelp { Debug.assert(templateExpression.kind === SyntaxKind.TemplateExpression); // If we're just after a template tail, don't show signature help. - if (node.kind === SyntaxKind.TemplateTail && position >= node.getEnd() && !isUnterminatedTemplateEnd(node)) { + if (node.kind === SyntaxKind.TemplateTail && position >= node.getEnd() && !(node).isUnterminated) { return undefined; } diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 75bea36bf3..4a3301312f 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -322,7 +322,7 @@ module ts { } export function isInsideTemplateLiteral(node: LiteralExpression, position: number) { - return (node.getStart() < position && position < node.getEnd()) - || (isUnterminatedTemplateEnd(node) && position === node.getEnd()); + return isTemplateLiteralKind(node.kind) + && (node.getStart() < position && position < node.getEnd()) || (!!node.isUnterminated && position === node.getEnd()); } } \ No newline at end of file From 86c7def8cc45300c80de1c56f235cf6cbcf9797d Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 26 Nov 2014 13:38:27 -0800 Subject: [PATCH 02/12] tokenUnterminated -> tokenIsUnterminated --- src/compiler/scanner.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index f9d23166fe..36cb50e365 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -471,7 +471,7 @@ module ts { var token: SyntaxKind; var tokenValue: string; var precedingLineBreak: boolean; - var tokenUnterminated: boolean; + var tokenIsUnterminated: boolean; function error(message: DiagnosticMessage): void { if (onError) { @@ -555,7 +555,7 @@ module ts { while (true) { if (pos >= len) { result += text.substring(start, pos); - tokenUnterminated = true; + tokenIsUnterminated = true; error(Diagnostics.Unterminated_string_literal); break; } @@ -573,7 +573,7 @@ module ts { } if (isLineBreak(ch)) { result += text.substring(start, pos); - tokenUnterminated = true; + tokenIsUnterminated = true; error(Diagnostics.Unterminated_string_literal); break; } @@ -597,7 +597,7 @@ module ts { while (true) { if (pos >= len) { contents += text.substring(start, pos); - tokenUnterminated = true; + tokenIsUnterminated = true; error(Diagnostics.Unterminated_template_literal); resultingToken = startedWithBacktick ? SyntaxKind.NoSubstitutionTemplateLiteral : SyntaxKind.TemplateTail; break; @@ -761,7 +761,7 @@ module ts { function scan(): SyntaxKind { startPos = pos; precedingLineBreak = false; - tokenUnterminated = false; + tokenIsUnterminated = false; while (true) { tokenPos = pos; if (pos >= len) { @@ -918,7 +918,7 @@ module ts { continue; } else { - tokenUnterminated = !commentClosed; + tokenIsUnterminated = !commentClosed; return token = SyntaxKind.MultiLineCommentTrivia; } } @@ -1076,14 +1076,14 @@ module ts { // If we reach the end of a file, or hit a newline, then this is an unterminated // regex. Report error and return what we have so far. if (p >= len) { - tokenUnterminated = true; + tokenIsUnterminated = true; error(Diagnostics.Unterminated_regular_expression_literal) break; } var ch = text.charCodeAt(p); if (isLineBreak(ch)) { - tokenUnterminated = true; + tokenIsUnterminated = true; error(Diagnostics.Unterminated_regular_expression_literal) break; } @@ -1176,7 +1176,7 @@ module ts { hasPrecedingLineBreak: () => precedingLineBreak, isIdentifier: () => token === SyntaxKind.Identifier || token > SyntaxKind.LastReservedWord, isReservedWord: () => token >= SyntaxKind.FirstReservedWord && token <= SyntaxKind.LastReservedWord, - isUnterminated: () => tokenUnterminated, + isUnterminated: () => tokenIsUnterminated, reScanGreaterToken, reScanSlashToken, reScanTemplateToken, From cef50627919cd43775e5ba542ae64b71d172f9a9 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 26 Nov 2014 16:32:30 -0800 Subject: [PATCH 03/12] Fixed issue where classifier didn't check for backslash-newline. --- src/services/services.ts | 19 ++++-- .../completionListInStringLiterals1.ts | 10 ++++ .../completionListInStringLiterals2.ts | 11 ++++ ...signatureHelpTaggedTemplatesIncomplete7.ts | 21 +++++++ ...signatureHelpTaggedTemplatesIncomplete8.ts | 18 ++++++ ...signatureHelpTaggedTemplatesIncomplete9.ts | 18 ++++++ .../cases/unittests/services/colorization.ts | 60 ++++++++++++++++++- 7 files changed, 150 insertions(+), 7 deletions(-) create mode 100644 tests/cases/fourslash/completionListInStringLiterals1.ts create mode 100644 tests/cases/fourslash/completionListInStringLiterals2.ts create mode 100644 tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete7.ts create mode 100644 tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete8.ts create mode 100644 tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete9.ts diff --git a/src/services/services.ts b/src/services/services.ts index 8ff61b05a7..68177066b8 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -5549,15 +5549,24 @@ module ts { addResult(end - start, classFromKind(token)); if (end >= text.length) { - // We're at the end. if (token === SyntaxKind.StringLiteral) { // Check to see if we finished up on a multiline string literal. var tokenText = scanner.getTokenText(); if (scanner.isUnterminated()) { - var quoteChar = tokenText.charCodeAt(0); - result.finalLexState = quoteChar === CharacterCodes.doubleQuote - ? EndOfLineState.InDoubleQuoteStringLiteral - : EndOfLineState.InSingleQuoteStringLiteral; + var lastCharIndex = tokenText.length - 1; + + var numBackslashes = 0; + while (tokenText.charCodeAt(lastCharIndex - numBackslashes) === CharacterCodes.backslash) { + numBackslashes++; + } + + // If we have an odd number of backslashes, then the multiline string is unclosed + if (numBackslashes & 1) { + var quoteChar = tokenText.charCodeAt(0); + result.finalLexState = quoteChar === CharacterCodes.doubleQuote + ? EndOfLineState.InDoubleQuoteStringLiteral + : EndOfLineState.InSingleQuoteStringLiteral; + } } } else if (token === SyntaxKind.MultiLineCommentTrivia) { diff --git a/tests/cases/fourslash/completionListInStringLiterals1.ts b/tests/cases/fourslash/completionListInStringLiterals1.ts new file mode 100644 index 0000000000..e394e8dfe7 --- /dev/null +++ b/tests/cases/fourslash/completionListInStringLiterals1.ts @@ -0,0 +1,10 @@ +/// + +////"/*1*/ /*2*/\/*3*/ +//// /*4*/ \\/*5*/ + +test.markers().forEach(marker => { + goTo.position(marker.position); + + verify.completionListIsEmpty() +}); \ No newline at end of file diff --git a/tests/cases/fourslash/completionListInStringLiterals2.ts b/tests/cases/fourslash/completionListInStringLiterals2.ts new file mode 100644 index 0000000000..10cb05a4f9 --- /dev/null +++ b/tests/cases/fourslash/completionListInStringLiterals2.ts @@ -0,0 +1,11 @@ +/// + +////"/*1*/ /*2*/\/*3*/ +//// /*4*/ \\\/*5*/ +//// /*6*/ + +test.markers().forEach(marker => { + goTo.position(marker.position); + + verify.completionListIsEmpty() +}); \ No newline at end of file diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete7.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete7.ts new file mode 100644 index 0000000000..ae322acf0b --- /dev/null +++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete7.ts @@ -0,0 +1,21 @@ +/// + +//// function f(templateStrings, x, y, z) { return 10; } +//// function g(templateStrings, x, y, z) { return ""; } +//// +//// f ` ${ 123 } /*1*/${ } /*2*/\/*3*/ +//// /*4*/\\/*5*/ +//// /*6*/\\\/*7*/ +//// /*8*/ + +test.markers().forEach(m => { + goTo.position(m.position); + + verify.signatureHelpCountIs(1); + verify.signatureHelpArgumentCountIs(1); + + verify.currentSignatureParameterCountIs(4); + verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number'); + verify.currentParameterHelpArgumentNameIs("templateStrings"); + verify.currentParameterSpanIs("templateStrings: any"); +}); \ No newline at end of file diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete8.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete8.ts new file mode 100644 index 0000000000..86455a65cc --- /dev/null +++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete8.ts @@ -0,0 +1,18 @@ +/// + +//// function f(templateStrings, x, y, z) { return 10; } +//// function g(templateStrings, x, y, z) { return ""; } +//// +//// f `/*1*/\/*2*/`/*3*/ /*4*/ + +test.markers().forEach(m => { + goTo.position(m.position); + + verify.signatureHelpCountIs(1); + verify.signatureHelpArgumentCountIs(1); + + verify.currentSignatureParameterCountIs(4); + verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number'); + verify.currentParameterHelpArgumentNameIs("templateStrings"); + verify.currentParameterSpanIs("templateStrings: any"); +}); \ No newline at end of file diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete9.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete9.ts new file mode 100644 index 0000000000..de42a33b39 --- /dev/null +++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete9.ts @@ -0,0 +1,18 @@ +/// + +//// function f(templateStrings, x, y, z) { return 10; } +//// function g(templateStrings, x, y, z) { return ""; } +//// +//// f `/*1*/ \\\/*2*/`/*3*/ /*4*/ + +test.markers().forEach(m => { + goTo.position(m.position); + + verify.signatureHelpCountIs(1); + verify.signatureHelpArgumentCountIs(1); + + verify.currentSignatureParameterCountIs(4); + verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number'); + verify.currentParameterHelpArgumentNameIs("templateStrings"); + verify.currentParameterSpanIs("templateStrings: any"); +}); \ No newline at end of file diff --git a/tests/cases/unittests/services/colorization.ts b/tests/cases/unittests/services/colorization.ts index 3031cefb56..b29f119f94 100644 --- a/tests/cases/unittests/services/colorization.ts +++ b/tests/cases/unittests/services/colorization.ts @@ -130,20 +130,76 @@ describe('Colorization', function () { operator(",")); }); - it("correctly classifies an unterminated multi-line string", function () { + it("correctly classifies a multi-line string with one backslash", function () { test("'line1\\", ts.EndOfLineState.Start, stringLiteral("'line1\\"), finalEndOfLineState(ts.EndOfLineState.InSingleQuoteStringLiteral)); }); - it("correctly classifies the second line of an unterminated multi-line string", function () { + it("correctly classifies a multi-line string with three backslashes", function () { + test("'line1\\\\\\", + ts.EndOfLineState.Start, + stringLiteral("'line1\\\\\\"), + finalEndOfLineState(ts.EndOfLineState.InSingleQuoteStringLiteral)); + }); + + it("correctly classifies an unterminated single-line string with no backslashes", function () { + test("'line1", + ts.EndOfLineState.Start, + stringLiteral("'line1"), + finalEndOfLineState(ts.EndOfLineState.Start)); + }); + + it("correctly classifies an unterminated single-line string with two backslashes", function () { + test("'line1\\\\", + ts.EndOfLineState.Start, + stringLiteral("'line1\\\\"), + finalEndOfLineState(ts.EndOfLineState.Start)); + }); + + it("correctly classifies an unterminated single-line string with four backslashes", function () { + test("'line1\\\\\\\\", + ts.EndOfLineState.Start, + stringLiteral("'line1\\\\\\\\"), + finalEndOfLineState(ts.EndOfLineState.Start)); + }); + + it("correctly classifies the continuing line of a multi-line string ending in one backslash", function () { test("\\", ts.EndOfLineState.InDoubleQuoteStringLiteral, stringLiteral("\\"), finalEndOfLineState(ts.EndOfLineState.InDoubleQuoteStringLiteral)); }); + it("correctly classifies the continuing line of a multi-line string ending in three backslashes", function () { + test("\\", + ts.EndOfLineState.InDoubleQuoteStringLiteral, + stringLiteral("\\"), + finalEndOfLineState(ts.EndOfLineState.InDoubleQuoteStringLiteral)); + }); + + it("correctly classifies the last line of an unterminated multi-line string ending in no backslashes", function () { + test(" ", + ts.EndOfLineState.InDoubleQuoteStringLiteral, + stringLiteral(" "), + finalEndOfLineState(ts.EndOfLineState.Start)); + }); + + it("correctly classifies the last line of an unterminated multi-line string ending in two backslashes", function () { + test("\\\\", + ts.EndOfLineState.InDoubleQuoteStringLiteral, + stringLiteral("\\\\"), + finalEndOfLineState(ts.EndOfLineState.Start)); + }); + + it("correctly classifies the last line of an unterminated multi-line string ending in four backslashes", function () { + test("\\\\\\\\", + ts.EndOfLineState.InDoubleQuoteStringLiteral, + stringLiteral("\\\\\\\\"), + finalEndOfLineState(ts.EndOfLineState.Start)); + }); + it("correctly classifies the last line of a multi-line string", function () { test("'", ts.EndOfLineState.InSingleQuoteStringLiteral, From 0c348d28d54fecce630bf73def64e961f03b266d Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 26 Nov 2014 17:00:44 -0800 Subject: [PATCH 04/12] Confused count with index. --- .../cases/fourslash/signatureHelpTaggedTemplatesIncomplete7.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete7.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete7.ts index ae322acf0b..a8afe2d9c6 100644 --- a/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete7.ts +++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete7.ts @@ -12,7 +12,7 @@ test.markers().forEach(m => { goTo.position(m.position); verify.signatureHelpCountIs(1); - verify.signatureHelpArgumentCountIs(1); + verify.signatureHelpArgumentCountIs(3); verify.currentSignatureParameterCountIs(4); verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number'); From ae384470a4ba370e068a356cd65e4195e99d296f Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 26 Nov 2014 17:14:08 -0800 Subject: [PATCH 05/12] Tests for terminated/unterminated template strings. --- tests/baselines/reference/templateStringTermination1.js | 6 ++++++ .../baselines/reference/templateStringTermination1.types | 4 ++++ .../baselines/reference/templateStringTermination1_ES6.js | 5 +++++ .../reference/templateStringTermination1_ES6.types | 3 +++ tests/baselines/reference/templateStringTermination2.js | 6 ++++++ .../baselines/reference/templateStringTermination2.types | 4 ++++ .../baselines/reference/templateStringTermination2_ES6.js | 5 +++++ .../reference/templateStringTermination2_ES6.types | 3 +++ tests/baselines/reference/templateStringTermination3.js | 6 ++++++ .../baselines/reference/templateStringTermination3.types | 4 ++++ .../baselines/reference/templateStringTermination3_ES6.js | 5 +++++ .../reference/templateStringTermination3_ES6.types | 3 +++ tests/baselines/reference/templateStringTermination4.js | 6 ++++++ .../baselines/reference/templateStringTermination4.types | 4 ++++ .../baselines/reference/templateStringTermination4_ES6.js | 5 +++++ .../reference/templateStringTermination4_ES6.types | 3 +++ tests/baselines/reference/templateStringTermination5.js | 6 ++++++ .../baselines/reference/templateStringTermination5.types | 4 ++++ .../baselines/reference/templateStringTermination5_ES6.js | 5 +++++ .../reference/templateStringTermination5_ES6.types | 3 +++ .../reference/templateStringUnterminated1.errors.txt | 8 ++++++++ .../reference/templateStringUnterminated1_ES6.errors.txt | 7 +++++++ .../reference/templateStringUnterminated2.errors.txt | 8 ++++++++ .../reference/templateStringUnterminated2_ES6.errors.txt | 7 +++++++ .../reference/templateStringUnterminated3.errors.txt | 8 ++++++++ .../reference/templateStringUnterminated3_ES6.errors.txt | 7 +++++++ .../reference/templateStringUnterminated4.errors.txt | 8 ++++++++ .../reference/templateStringUnterminated4_ES6.errors.txt | 7 +++++++ .../reference/templateStringUnterminated5.errors.txt | 8 ++++++++ .../reference/templateStringUnterminated5_ES6.errors.txt | 7 +++++++ .../es6/templates/templateStringTermination1.ts | 2 ++ .../es6/templates/templateStringTermination1_ES6.ts | 2 ++ .../es6/templates/templateStringTermination2.ts | 2 ++ .../es6/templates/templateStringTermination2_ES6.ts | 2 ++ .../es6/templates/templateStringTermination3.ts | 2 ++ .../es6/templates/templateStringTermination3_ES6.ts | 2 ++ .../es6/templates/templateStringTermination4.ts | 2 ++ .../es6/templates/templateStringTermination4_ES6.ts | 2 ++ .../es6/templates/templateStringTermination5.ts | 2 ++ .../es6/templates/templateStringTermination5_ES6.ts | 2 ++ .../es6/templates/templateStringUnterminated1.ts | 2 ++ .../es6/templates/templateStringUnterminated1_ES6.ts | 2 ++ .../es6/templates/templateStringUnterminated2.ts | 2 ++ .../es6/templates/templateStringUnterminated2_ES6.ts | 2 ++ .../es6/templates/templateStringUnterminated3.ts | 2 ++ .../es6/templates/templateStringUnterminated3_ES6.ts | 2 ++ .../es6/templates/templateStringUnterminated4.ts | 2 ++ .../es6/templates/templateStringUnterminated4_ES6.ts | 2 ++ .../es6/templates/templateStringUnterminated5.ts | 2 ++ .../es6/templates/templateStringUnterminated5_ES6.ts | 2 ++ 50 files changed, 205 insertions(+) create mode 100644 tests/baselines/reference/templateStringTermination1.js create mode 100644 tests/baselines/reference/templateStringTermination1.types create mode 100644 tests/baselines/reference/templateStringTermination1_ES6.js create mode 100644 tests/baselines/reference/templateStringTermination1_ES6.types create mode 100644 tests/baselines/reference/templateStringTermination2.js create mode 100644 tests/baselines/reference/templateStringTermination2.types create mode 100644 tests/baselines/reference/templateStringTermination2_ES6.js create mode 100644 tests/baselines/reference/templateStringTermination2_ES6.types create mode 100644 tests/baselines/reference/templateStringTermination3.js create mode 100644 tests/baselines/reference/templateStringTermination3.types create mode 100644 tests/baselines/reference/templateStringTermination3_ES6.js create mode 100644 tests/baselines/reference/templateStringTermination3_ES6.types create mode 100644 tests/baselines/reference/templateStringTermination4.js create mode 100644 tests/baselines/reference/templateStringTermination4.types create mode 100644 tests/baselines/reference/templateStringTermination4_ES6.js create mode 100644 tests/baselines/reference/templateStringTermination4_ES6.types create mode 100644 tests/baselines/reference/templateStringTermination5.js create mode 100644 tests/baselines/reference/templateStringTermination5.types create mode 100644 tests/baselines/reference/templateStringTermination5_ES6.js create mode 100644 tests/baselines/reference/templateStringTermination5_ES6.types create mode 100644 tests/baselines/reference/templateStringUnterminated1.errors.txt create mode 100644 tests/baselines/reference/templateStringUnterminated1_ES6.errors.txt create mode 100644 tests/baselines/reference/templateStringUnterminated2.errors.txt create mode 100644 tests/baselines/reference/templateStringUnterminated2_ES6.errors.txt create mode 100644 tests/baselines/reference/templateStringUnterminated3.errors.txt create mode 100644 tests/baselines/reference/templateStringUnterminated3_ES6.errors.txt create mode 100644 tests/baselines/reference/templateStringUnterminated4.errors.txt create mode 100644 tests/baselines/reference/templateStringUnterminated4_ES6.errors.txt create mode 100644 tests/baselines/reference/templateStringUnterminated5.errors.txt create mode 100644 tests/baselines/reference/templateStringUnterminated5_ES6.errors.txt create mode 100644 tests/cases/conformance/es6/templates/templateStringTermination1.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringTermination1_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringTermination2.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringTermination2_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringTermination3.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringTermination3_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringTermination4.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringTermination4_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringTermination5.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringTermination5_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringUnterminated1.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringUnterminated1_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringUnterminated2.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringUnterminated2_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringUnterminated3.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringUnterminated3_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringUnterminated4.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringUnterminated4_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringUnterminated5.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringUnterminated5_ES6.ts diff --git a/tests/baselines/reference/templateStringTermination1.js b/tests/baselines/reference/templateStringTermination1.js new file mode 100644 index 0000000000..2243871f9a --- /dev/null +++ b/tests/baselines/reference/templateStringTermination1.js @@ -0,0 +1,6 @@ +//// [templateStringTermination1.ts] + +`` + +//// [templateStringTermination1.js] +""; diff --git a/tests/baselines/reference/templateStringTermination1.types b/tests/baselines/reference/templateStringTermination1.types new file mode 100644 index 0000000000..5c3cf73af4 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination1.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/es6/templates/templateStringTermination1.ts === + +No type information for this code.`` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringTermination1_ES6.js b/tests/baselines/reference/templateStringTermination1_ES6.js new file mode 100644 index 0000000000..4d4dc6a2d9 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination1_ES6.js @@ -0,0 +1,5 @@ +//// [templateStringTermination1_ES6.ts] +`` + +//// [templateStringTermination1_ES6.js] +``; diff --git a/tests/baselines/reference/templateStringTermination1_ES6.types b/tests/baselines/reference/templateStringTermination1_ES6.types new file mode 100644 index 0000000000..b0829b31b6 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination1_ES6.types @@ -0,0 +1,3 @@ +=== tests/cases/conformance/es6/templates/templateStringTermination1_ES6.ts === +`` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringTermination2.js b/tests/baselines/reference/templateStringTermination2.js new file mode 100644 index 0000000000..de7792482e --- /dev/null +++ b/tests/baselines/reference/templateStringTermination2.js @@ -0,0 +1,6 @@ +//// [templateStringTermination2.ts] + +`\\` + +//// [templateStringTermination2.js] +"\"; diff --git a/tests/baselines/reference/templateStringTermination2.types b/tests/baselines/reference/templateStringTermination2.types new file mode 100644 index 0000000000..927f257c21 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination2.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/es6/templates/templateStringTermination2.ts === + +No type information for this code.`\\` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringTermination2_ES6.js b/tests/baselines/reference/templateStringTermination2_ES6.js new file mode 100644 index 0000000000..b2a8459968 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination2_ES6.js @@ -0,0 +1,5 @@ +//// [templateStringTermination2_ES6.ts] +`\\` + +//// [templateStringTermination2_ES6.js] +`\\`; diff --git a/tests/baselines/reference/templateStringTermination2_ES6.types b/tests/baselines/reference/templateStringTermination2_ES6.types new file mode 100644 index 0000000000..21bc0e07a2 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination2_ES6.types @@ -0,0 +1,3 @@ +=== tests/cases/conformance/es6/templates/templateStringTermination2_ES6.ts === +`\\` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringTermination3.js b/tests/baselines/reference/templateStringTermination3.js new file mode 100644 index 0000000000..1bb2c2ab00 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination3.js @@ -0,0 +1,6 @@ +//// [templateStringTermination3.ts] + +`\`` + +//// [templateStringTermination3.js] +"`"; diff --git a/tests/baselines/reference/templateStringTermination3.types b/tests/baselines/reference/templateStringTermination3.types new file mode 100644 index 0000000000..a59aef6bfe --- /dev/null +++ b/tests/baselines/reference/templateStringTermination3.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/es6/templates/templateStringTermination3.ts === + +No type information for this code.`\`` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringTermination3_ES6.js b/tests/baselines/reference/templateStringTermination3_ES6.js new file mode 100644 index 0000000000..5c632fe83b --- /dev/null +++ b/tests/baselines/reference/templateStringTermination3_ES6.js @@ -0,0 +1,5 @@ +//// [templateStringTermination3_ES6.ts] +`\`` + +//// [templateStringTermination3_ES6.js] +`\``; diff --git a/tests/baselines/reference/templateStringTermination3_ES6.types b/tests/baselines/reference/templateStringTermination3_ES6.types new file mode 100644 index 0000000000..8d0119ee5c --- /dev/null +++ b/tests/baselines/reference/templateStringTermination3_ES6.types @@ -0,0 +1,3 @@ +=== tests/cases/conformance/es6/templates/templateStringTermination3_ES6.ts === +`\`` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringTermination4.js b/tests/baselines/reference/templateStringTermination4.js new file mode 100644 index 0000000000..7ef4970366 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination4.js @@ -0,0 +1,6 @@ +//// [templateStringTermination4.ts] + +`\\\\` + +//// [templateStringTermination4.js] +"\\"; diff --git a/tests/baselines/reference/templateStringTermination4.types b/tests/baselines/reference/templateStringTermination4.types new file mode 100644 index 0000000000..ecf2ad9749 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination4.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/es6/templates/templateStringTermination4.ts === + +No type information for this code.`\\\\` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringTermination4_ES6.js b/tests/baselines/reference/templateStringTermination4_ES6.js new file mode 100644 index 0000000000..c177f86379 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination4_ES6.js @@ -0,0 +1,5 @@ +//// [templateStringTermination4_ES6.ts] +`\\\\` + +//// [templateStringTermination4_ES6.js] +`\\\\`; diff --git a/tests/baselines/reference/templateStringTermination4_ES6.types b/tests/baselines/reference/templateStringTermination4_ES6.types new file mode 100644 index 0000000000..18f5d6f7bd --- /dev/null +++ b/tests/baselines/reference/templateStringTermination4_ES6.types @@ -0,0 +1,3 @@ +=== tests/cases/conformance/es6/templates/templateStringTermination4_ES6.ts === +`\\\\` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringTermination5.js b/tests/baselines/reference/templateStringTermination5.js new file mode 100644 index 0000000000..af7f1d6a0a --- /dev/null +++ b/tests/baselines/reference/templateStringTermination5.js @@ -0,0 +1,6 @@ +//// [templateStringTermination5.ts] + +`\\\\\\` + +//// [templateStringTermination5.js] +"\\\"; diff --git a/tests/baselines/reference/templateStringTermination5.types b/tests/baselines/reference/templateStringTermination5.types new file mode 100644 index 0000000000..8ae94a1803 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination5.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/es6/templates/templateStringTermination5.ts === + +No type information for this code.`\\\\\\` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringTermination5_ES6.js b/tests/baselines/reference/templateStringTermination5_ES6.js new file mode 100644 index 0000000000..120b72970a --- /dev/null +++ b/tests/baselines/reference/templateStringTermination5_ES6.js @@ -0,0 +1,5 @@ +//// [templateStringTermination5_ES6.ts] +`\\\\\\` + +//// [templateStringTermination5_ES6.js] +`\\\\\\`; diff --git a/tests/baselines/reference/templateStringTermination5_ES6.types b/tests/baselines/reference/templateStringTermination5_ES6.types new file mode 100644 index 0000000000..c687c51df9 --- /dev/null +++ b/tests/baselines/reference/templateStringTermination5_ES6.types @@ -0,0 +1,3 @@ +=== tests/cases/conformance/es6/templates/templateStringTermination5_ES6.ts === +`\\\\\\` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringUnterminated1.errors.txt b/tests/baselines/reference/templateStringUnterminated1.errors.txt new file mode 100644 index 0000000000..3353c06244 --- /dev/null +++ b/tests/baselines/reference/templateStringUnterminated1.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/es6/templates/templateStringUnterminated1.ts(2,2): error TS1160: Unterminated template literal. + + +==== tests/cases/conformance/es6/templates/templateStringUnterminated1.ts (1 errors) ==== + + ` + +!!! error TS1160: Unterminated template literal. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringUnterminated1_ES6.errors.txt b/tests/baselines/reference/templateStringUnterminated1_ES6.errors.txt new file mode 100644 index 0000000000..3d55b8aa1e --- /dev/null +++ b/tests/baselines/reference/templateStringUnterminated1_ES6.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/es6/templates/templateStringUnterminated1_ES6.ts(1,2): error TS1160: Unterminated template literal. + + +==== tests/cases/conformance/es6/templates/templateStringUnterminated1_ES6.ts (1 errors) ==== + ` + +!!! error TS1160: Unterminated template literal. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringUnterminated2.errors.txt b/tests/baselines/reference/templateStringUnterminated2.errors.txt new file mode 100644 index 0000000000..0fd78e097b --- /dev/null +++ b/tests/baselines/reference/templateStringUnterminated2.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/es6/templates/templateStringUnterminated2.ts(2,4): error TS1160: Unterminated template literal. + + +==== tests/cases/conformance/es6/templates/templateStringUnterminated2.ts (1 errors) ==== + + `\` + +!!! error TS1160: Unterminated template literal. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringUnterminated2_ES6.errors.txt b/tests/baselines/reference/templateStringUnterminated2_ES6.errors.txt new file mode 100644 index 0000000000..7a5bd9a778 --- /dev/null +++ b/tests/baselines/reference/templateStringUnterminated2_ES6.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/es6/templates/templateStringUnterminated2_ES6.ts(1,4): error TS1160: Unterminated template literal. + + +==== tests/cases/conformance/es6/templates/templateStringUnterminated2_ES6.ts (1 errors) ==== + `\` + +!!! error TS1160: Unterminated template literal. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringUnterminated3.errors.txt b/tests/baselines/reference/templateStringUnterminated3.errors.txt new file mode 100644 index 0000000000..1b25de284d --- /dev/null +++ b/tests/baselines/reference/templateStringUnterminated3.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/es6/templates/templateStringUnterminated3.ts(2,4): error TS1160: Unterminated template literal. + + +==== tests/cases/conformance/es6/templates/templateStringUnterminated3.ts (1 errors) ==== + + `\\ + +!!! error TS1160: Unterminated template literal. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringUnterminated3_ES6.errors.txt b/tests/baselines/reference/templateStringUnterminated3_ES6.errors.txt new file mode 100644 index 0000000000..e41c0e9362 --- /dev/null +++ b/tests/baselines/reference/templateStringUnterminated3_ES6.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/es6/templates/templateStringUnterminated3_ES6.ts(1,4): error TS1160: Unterminated template literal. + + +==== tests/cases/conformance/es6/templates/templateStringUnterminated3_ES6.ts (1 errors) ==== + `\\ + +!!! error TS1160: Unterminated template literal. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringUnterminated4.errors.txt b/tests/baselines/reference/templateStringUnterminated4.errors.txt new file mode 100644 index 0000000000..8eb4192118 --- /dev/null +++ b/tests/baselines/reference/templateStringUnterminated4.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/es6/templates/templateStringUnterminated4.ts(2,6): error TS1160: Unterminated template literal. + + +==== tests/cases/conformance/es6/templates/templateStringUnterminated4.ts (1 errors) ==== + + `\\\` + +!!! error TS1160: Unterminated template literal. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringUnterminated4_ES6.errors.txt b/tests/baselines/reference/templateStringUnterminated4_ES6.errors.txt new file mode 100644 index 0000000000..a677836b7a --- /dev/null +++ b/tests/baselines/reference/templateStringUnterminated4_ES6.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/es6/templates/templateStringUnterminated4_ES6.ts(1,6): error TS1160: Unterminated template literal. + + +==== tests/cases/conformance/es6/templates/templateStringUnterminated4_ES6.ts (1 errors) ==== + `\\\` + +!!! error TS1160: Unterminated template literal. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringUnterminated5.errors.txt b/tests/baselines/reference/templateStringUnterminated5.errors.txt new file mode 100644 index 0000000000..20fd54e811 --- /dev/null +++ b/tests/baselines/reference/templateStringUnterminated5.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/es6/templates/templateStringUnterminated5.ts(2,8): error TS1160: Unterminated template literal. + + +==== tests/cases/conformance/es6/templates/templateStringUnterminated5.ts (1 errors) ==== + + `\\\\\` + +!!! error TS1160: Unterminated template literal. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringUnterminated5_ES6.errors.txt b/tests/baselines/reference/templateStringUnterminated5_ES6.errors.txt new file mode 100644 index 0000000000..be279696e1 --- /dev/null +++ b/tests/baselines/reference/templateStringUnterminated5_ES6.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/es6/templates/templateStringUnterminated5_ES6.ts(1,8): error TS1160: Unterminated template literal. + + +==== tests/cases/conformance/es6/templates/templateStringUnterminated5_ES6.ts (1 errors) ==== + `\\\\\` + +!!! error TS1160: Unterminated template literal. \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringTermination1.ts b/tests/cases/conformance/es6/templates/templateStringTermination1.ts new file mode 100644 index 0000000000..751a791707 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringTermination1.ts @@ -0,0 +1,2 @@ + +`` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringTermination1_ES6.ts b/tests/cases/conformance/es6/templates/templateStringTermination1_ES6.ts new file mode 100644 index 0000000000..f6577ea804 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringTermination1_ES6.ts @@ -0,0 +1,2 @@ +// @target: ES6 +`` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringTermination2.ts b/tests/cases/conformance/es6/templates/templateStringTermination2.ts new file mode 100644 index 0000000000..8125524cac --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringTermination2.ts @@ -0,0 +1,2 @@ + +`\\` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringTermination2_ES6.ts b/tests/cases/conformance/es6/templates/templateStringTermination2_ES6.ts new file mode 100644 index 0000000000..da00446952 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringTermination2_ES6.ts @@ -0,0 +1,2 @@ +// @target: ES6 +`\\` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringTermination3.ts b/tests/cases/conformance/es6/templates/templateStringTermination3.ts new file mode 100644 index 0000000000..0e08c4915e --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringTermination3.ts @@ -0,0 +1,2 @@ + +`\`` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringTermination3_ES6.ts b/tests/cases/conformance/es6/templates/templateStringTermination3_ES6.ts new file mode 100644 index 0000000000..55c4f689a6 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringTermination3_ES6.ts @@ -0,0 +1,2 @@ +// @target: ES6 +`\`` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringTermination4.ts b/tests/cases/conformance/es6/templates/templateStringTermination4.ts new file mode 100644 index 0000000000..79e622ae6d --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringTermination4.ts @@ -0,0 +1,2 @@ + +`\\\\` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringTermination4_ES6.ts b/tests/cases/conformance/es6/templates/templateStringTermination4_ES6.ts new file mode 100644 index 0000000000..657d4a6c37 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringTermination4_ES6.ts @@ -0,0 +1,2 @@ +// @target: ES6 +`\\\\` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringTermination5.ts b/tests/cases/conformance/es6/templates/templateStringTermination5.ts new file mode 100644 index 0000000000..f94422a087 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringTermination5.ts @@ -0,0 +1,2 @@ + +`\\\\\\` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringTermination5_ES6.ts b/tests/cases/conformance/es6/templates/templateStringTermination5_ES6.ts new file mode 100644 index 0000000000..14e66aff84 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringTermination5_ES6.ts @@ -0,0 +1,2 @@ +// @target: ES6 +`\\\\\\` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringUnterminated1.ts b/tests/cases/conformance/es6/templates/templateStringUnterminated1.ts new file mode 100644 index 0000000000..7165d30822 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringUnterminated1.ts @@ -0,0 +1,2 @@ + +` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringUnterminated1_ES6.ts b/tests/cases/conformance/es6/templates/templateStringUnterminated1_ES6.ts new file mode 100644 index 0000000000..0d96bf6030 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringUnterminated1_ES6.ts @@ -0,0 +1,2 @@ +// @target: ES6 +` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringUnterminated2.ts b/tests/cases/conformance/es6/templates/templateStringUnterminated2.ts new file mode 100644 index 0000000000..11b2627cad --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringUnterminated2.ts @@ -0,0 +1,2 @@ + +`\` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringUnterminated2_ES6.ts b/tests/cases/conformance/es6/templates/templateStringUnterminated2_ES6.ts new file mode 100644 index 0000000000..6de78a5b15 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringUnterminated2_ES6.ts @@ -0,0 +1,2 @@ +// @target: ES6 +`\` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringUnterminated3.ts b/tests/cases/conformance/es6/templates/templateStringUnterminated3.ts new file mode 100644 index 0000000000..2f5ae60085 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringUnterminated3.ts @@ -0,0 +1,2 @@ + +`\\ \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringUnterminated3_ES6.ts b/tests/cases/conformance/es6/templates/templateStringUnterminated3_ES6.ts new file mode 100644 index 0000000000..b8430e6a72 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringUnterminated3_ES6.ts @@ -0,0 +1,2 @@ +// @target: ES6 +`\\ \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringUnterminated4.ts b/tests/cases/conformance/es6/templates/templateStringUnterminated4.ts new file mode 100644 index 0000000000..2654b1895c --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringUnterminated4.ts @@ -0,0 +1,2 @@ + +`\\\` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringUnterminated4_ES6.ts b/tests/cases/conformance/es6/templates/templateStringUnterminated4_ES6.ts new file mode 100644 index 0000000000..4cfc3143c5 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringUnterminated4_ES6.ts @@ -0,0 +1,2 @@ +// @target: ES6 +`\\\` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringUnterminated5.ts b/tests/cases/conformance/es6/templates/templateStringUnterminated5.ts new file mode 100644 index 0000000000..06574b5852 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringUnterminated5.ts @@ -0,0 +1,2 @@ + +`\\\\\` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringUnterminated5_ES6.ts b/tests/cases/conformance/es6/templates/templateStringUnterminated5_ES6.ts new file mode 100644 index 0000000000..6beeb15727 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringUnterminated5_ES6.ts @@ -0,0 +1,2 @@ +// @target: ES6 +`\\\\\` \ No newline at end of file From 9ed27b23aba2356d5dff855dc28639727ed7529e Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 30 Nov 2014 11:04:15 -0800 Subject: [PATCH 06/12] Handel assert for missing node kind in isDeclarationVisible for functionType and constructorType --- src/compiler/checker.ts | 2 ++ .../reference/constructorTypeDeclarations.js | 22 ++++++++++++++++ .../constructorTypeDeclarations.types | 17 ++++++++++++ .../reference/functionTypeDeclarations.js | 26 +++++++++++++++++++ .../reference/functionTypeDeclarations.types | 24 +++++++++++++++++ .../compiler/constructorTypeDeclarations.ts | 7 +++++ .../compiler/functionTypeDeclarations.ts | 9 +++++++ 7 files changed, 107 insertions(+) create mode 100644 tests/baselines/reference/constructorTypeDeclarations.js create mode 100644 tests/baselines/reference/constructorTypeDeclarations.types create mode 100644 tests/baselines/reference/functionTypeDeclarations.js create mode 100644 tests/baselines/reference/functionTypeDeclarations.types create mode 100644 tests/cases/compiler/constructorTypeDeclarations.ts create mode 100644 tests/cases/compiler/functionTypeDeclarations.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6afbbcdd51..dacca9b07d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1617,7 +1617,9 @@ module ts { case SyntaxKind.Constructor: case SyntaxKind.ConstructSignature: + case SyntaxKind.ConstructorType: case SyntaxKind.CallSignature: + case SyntaxKind.FunctionType: case SyntaxKind.IndexSignature: case SyntaxKind.Parameter: case SyntaxKind.ModuleBlock: diff --git a/tests/baselines/reference/constructorTypeDeclarations.js b/tests/baselines/reference/constructorTypeDeclarations.js new file mode 100644 index 0000000000..7b983a69bd --- /dev/null +++ b/tests/baselines/reference/constructorTypeDeclarations.js @@ -0,0 +1,22 @@ +//// [constructorTypeDeclarations.ts] + +module schema { + export function createValidator(schema: any): new (data: T) => T { + return undefined; + } +} + +//// [constructorTypeDeclarations.js] +var schema; +(function (_schema) { + function createValidator(schema) { + return undefined; + } + _schema.createValidator = createValidator; +})(schema || (schema = {})); + + +//// [constructorTypeDeclarations.d.ts] +declare module schema { + function createValidator(schema: any): new (data: T) => T; +} diff --git a/tests/baselines/reference/constructorTypeDeclarations.types b/tests/baselines/reference/constructorTypeDeclarations.types new file mode 100644 index 0000000000..34bd616665 --- /dev/null +++ b/tests/baselines/reference/constructorTypeDeclarations.types @@ -0,0 +1,17 @@ +=== tests/cases/compiler/constructorTypeDeclarations.ts === + +module schema { +>schema : typeof schema + + export function createValidator(schema: any): new (data: T) => T { +>createValidator : (schema: any) => new (data: T) => T +>schema : any +>T : T +>data : T +>T : T +>T : T + + return undefined; +>undefined : undefined + } +} diff --git a/tests/baselines/reference/functionTypeDeclarations.js b/tests/baselines/reference/functionTypeDeclarations.js new file mode 100644 index 0000000000..34408f74b5 --- /dev/null +++ b/tests/baselines/reference/functionTypeDeclarations.js @@ -0,0 +1,26 @@ +//// [functionTypeDeclarations.ts] + +module schema { + export function createValidator(schema: any): (data: T) => T { + return (data: T) => { + return data; + } + } +} + +//// [functionTypeDeclarations.js] +var schema; +(function (_schema) { + function createValidator(schema) { + return function (data) { + return data; + }; + } + _schema.createValidator = createValidator; +})(schema || (schema = {})); + + +//// [functionTypeDeclarations.d.ts] +declare module schema { + function createValidator(schema: any): (data: T) => T; +} diff --git a/tests/baselines/reference/functionTypeDeclarations.types b/tests/baselines/reference/functionTypeDeclarations.types new file mode 100644 index 0000000000..1118444fdf --- /dev/null +++ b/tests/baselines/reference/functionTypeDeclarations.types @@ -0,0 +1,24 @@ +=== tests/cases/compiler/functionTypeDeclarations.ts === + +module schema { +>schema : typeof schema + + export function createValidator(schema: any): (data: T) => T { +>createValidator : (schema: any) => (data: T) => T +>schema : any +>T : T +>data : T +>T : T +>T : T + + return (data: T) => { +>(data: T) => { return data; } : (data: T) => T +>T : T +>data : T +>T : T + + return data; +>data : T + } + } +} diff --git a/tests/cases/compiler/constructorTypeDeclarations.ts b/tests/cases/compiler/constructorTypeDeclarations.ts new file mode 100644 index 0000000000..48d6f88463 --- /dev/null +++ b/tests/cases/compiler/constructorTypeDeclarations.ts @@ -0,0 +1,7 @@ +// @declaration: true + +module schema { + export function createValidator(schema: any): new (data: T) => T { + return undefined; + } +} \ No newline at end of file diff --git a/tests/cases/compiler/functionTypeDeclarations.ts b/tests/cases/compiler/functionTypeDeclarations.ts new file mode 100644 index 0000000000..e0d7c7cdbf --- /dev/null +++ b/tests/cases/compiler/functionTypeDeclarations.ts @@ -0,0 +1,9 @@ +// @declaration: true + +module schema { + export function createValidator(schema: any): (data: T) => T { + return (data: T) => { + return data; + } + } +} \ No newline at end of file From 0246daec8376afc1af29cf80fc7de9da8da68525 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 30 Nov 2014 11:47:41 -0800 Subject: [PATCH 07/12] Handel TypeLiterals, ParenTypes, UnionTypes, and ArrayTypes --- src/compiler/checker.ts | 9 +- .../reference/constructorTypeDeclarations.js | 22 --- .../constructorTypeDeclarations.types | 17 --- .../reference/functionTypeDeclarations.js | 26 ---- .../reference/functionTypeDeclarations.types | 24 --- .../isDeclarationVisibleNodeKinds.js | 139 ++++++++++++++++++ .../isDeclarationVisibleNodeKinds.types | 121 +++++++++++++++ .../compiler/constructorTypeDeclarations.ts | 7 - .../compiler/functionTypeDeclarations.ts | 9 -- .../compiler/isDeclarationVisibleNodeKinds.ts | 51 +++++++ 10 files changed, 318 insertions(+), 107 deletions(-) delete mode 100644 tests/baselines/reference/constructorTypeDeclarations.js delete mode 100644 tests/baselines/reference/constructorTypeDeclarations.types delete mode 100644 tests/baselines/reference/functionTypeDeclarations.js delete mode 100644 tests/baselines/reference/functionTypeDeclarations.types create mode 100644 tests/baselines/reference/isDeclarationVisibleNodeKinds.js create mode 100644 tests/baselines/reference/isDeclarationVisibleNodeKinds.types delete mode 100644 tests/cases/compiler/constructorTypeDeclarations.ts delete mode 100644 tests/cases/compiler/functionTypeDeclarations.ts create mode 100644 tests/cases/compiler/isDeclarationVisibleNodeKinds.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index dacca9b07d..025837511c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1617,13 +1617,18 @@ module ts { case SyntaxKind.Constructor: case SyntaxKind.ConstructSignature: - case SyntaxKind.ConstructorType: case SyntaxKind.CallSignature: - case SyntaxKind.FunctionType: case SyntaxKind.IndexSignature: case SyntaxKind.Parameter: case SyntaxKind.ModuleBlock: case SyntaxKind.TypeParameter: + case SyntaxKind.FunctionType: + case SyntaxKind.ConstructorType: + case SyntaxKind.TypeLiteral: + case SyntaxKind.ArrayType: + case SyntaxKind.TupleType: + case SyntaxKind.UnionType: + case SyntaxKind.ParenType: return isDeclarationVisible(node.parent); // Source file is always visible diff --git a/tests/baselines/reference/constructorTypeDeclarations.js b/tests/baselines/reference/constructorTypeDeclarations.js deleted file mode 100644 index 7b983a69bd..0000000000 --- a/tests/baselines/reference/constructorTypeDeclarations.js +++ /dev/null @@ -1,22 +0,0 @@ -//// [constructorTypeDeclarations.ts] - -module schema { - export function createValidator(schema: any): new (data: T) => T { - return undefined; - } -} - -//// [constructorTypeDeclarations.js] -var schema; -(function (_schema) { - function createValidator(schema) { - return undefined; - } - _schema.createValidator = createValidator; -})(schema || (schema = {})); - - -//// [constructorTypeDeclarations.d.ts] -declare module schema { - function createValidator(schema: any): new (data: T) => T; -} diff --git a/tests/baselines/reference/constructorTypeDeclarations.types b/tests/baselines/reference/constructorTypeDeclarations.types deleted file mode 100644 index 34bd616665..0000000000 --- a/tests/baselines/reference/constructorTypeDeclarations.types +++ /dev/null @@ -1,17 +0,0 @@ -=== tests/cases/compiler/constructorTypeDeclarations.ts === - -module schema { ->schema : typeof schema - - export function createValidator(schema: any): new (data: T) => T { ->createValidator : (schema: any) => new (data: T) => T ->schema : any ->T : T ->data : T ->T : T ->T : T - - return undefined; ->undefined : undefined - } -} diff --git a/tests/baselines/reference/functionTypeDeclarations.js b/tests/baselines/reference/functionTypeDeclarations.js deleted file mode 100644 index 34408f74b5..0000000000 --- a/tests/baselines/reference/functionTypeDeclarations.js +++ /dev/null @@ -1,26 +0,0 @@ -//// [functionTypeDeclarations.ts] - -module schema { - export function createValidator(schema: any): (data: T) => T { - return (data: T) => { - return data; - } - } -} - -//// [functionTypeDeclarations.js] -var schema; -(function (_schema) { - function createValidator(schema) { - return function (data) { - return data; - }; - } - _schema.createValidator = createValidator; -})(schema || (schema = {})); - - -//// [functionTypeDeclarations.d.ts] -declare module schema { - function createValidator(schema: any): (data: T) => T; -} diff --git a/tests/baselines/reference/functionTypeDeclarations.types b/tests/baselines/reference/functionTypeDeclarations.types deleted file mode 100644 index 1118444fdf..0000000000 --- a/tests/baselines/reference/functionTypeDeclarations.types +++ /dev/null @@ -1,24 +0,0 @@ -=== tests/cases/compiler/functionTypeDeclarations.ts === - -module schema { ->schema : typeof schema - - export function createValidator(schema: any): (data: T) => T { ->createValidator : (schema: any) => (data: T) => T ->schema : any ->T : T ->data : T ->T : T ->T : T - - return (data: T) => { ->(data: T) => { return data; } : (data: T) => T ->T : T ->data : T ->T : T - - return data; ->data : T - } - } -} diff --git a/tests/baselines/reference/isDeclarationVisibleNodeKinds.js b/tests/baselines/reference/isDeclarationVisibleNodeKinds.js new file mode 100644 index 0000000000..65fddb0a92 --- /dev/null +++ b/tests/baselines/reference/isDeclarationVisibleNodeKinds.js @@ -0,0 +1,139 @@ +//// [isDeclarationVisibleNodeKinds.ts] + +// Function types +module schema { + export function createValidator1(schema: any): (data: T) => T { + return undefined; + } +} + +// Constructor types +module schema { + export function createValidator2(schema: any): new (data: T) => T { + return undefined; + } +} + +// union types +module schema { + export function createValidator3(schema: any): number | { new (data: T): T; } { + return undefined; + } +} + +// Array types +module schema { + export function createValidator4(schema: any): { new (data: T): T; }[] { + return undefined; + } +} + + +// TypeLiterals +module schema { + export function createValidator5(schema: any): { new (data: T): T } { + return undefined; + } +} + +// Tuple types +module schema { + export function createValidator6(schema: any): [ new (data: T) => T, number] { + return undefined; + } +} + +// Paren Types +module schema { + export function createValidator7(schema: any): (new (data: T)=>T )[] { + return undefined; + } +} + +//// [isDeclarationVisibleNodeKinds.js] +// Function types +var schema; +(function (_schema) { + function createValidator1(schema) { + return undefined; + } + _schema.createValidator1 = createValidator1; +})(schema || (schema = {})); +// Constructor types +var schema; +(function (_schema) { + function createValidator2(schema) { + return undefined; + } + _schema.createValidator2 = createValidator2; +})(schema || (schema = {})); +// union types +var schema; +(function (_schema) { + function createValidator3(schema) { + return undefined; + } + _schema.createValidator3 = createValidator3; +})(schema || (schema = {})); +// Array types +var schema; +(function (_schema) { + function createValidator4(schema) { + return undefined; + } + _schema.createValidator4 = createValidator4; +})(schema || (schema = {})); +// TypeLiterals +var schema; +(function (_schema) { + function createValidator5(schema) { + return undefined; + } + _schema.createValidator5 = createValidator5; +})(schema || (schema = {})); +// Tuple types +var schema; +(function (_schema) { + function createValidator6(schema) { + return undefined; + } + _schema.createValidator6 = createValidator6; +})(schema || (schema = {})); +// Paren Types +var schema; +(function (_schema) { + function createValidator7(schema) { + return undefined; + } + _schema.createValidator7 = createValidator7; +})(schema || (schema = {})); + + +//// [isDeclarationVisibleNodeKinds.d.ts] +declare module schema { + function createValidator1(schema: any): (data: T) => T; +} +declare module schema { + function createValidator2(schema: any): new (data: T) => T; +} +declare module schema { + function createValidator3(schema: any): number | { + new (data: T): T; + }; +} +declare module schema { + function createValidator4(schema: any): { + new (data: T): T; + }[]; +} +declare module schema { + function createValidator5(schema: any): { + new (data: T): T; + }; +} +declare module schema { + function createValidator6(schema: any): [new (data: T) => T, number]; +} +declare module schema { + function createValidator7(schema: any): (new (data: T) => T)[]; +} diff --git a/tests/baselines/reference/isDeclarationVisibleNodeKinds.types b/tests/baselines/reference/isDeclarationVisibleNodeKinds.types new file mode 100644 index 0000000000..c95ded99be --- /dev/null +++ b/tests/baselines/reference/isDeclarationVisibleNodeKinds.types @@ -0,0 +1,121 @@ +=== tests/cases/compiler/isDeclarationVisibleNodeKinds.ts === + +// Function types +module schema { +>schema : typeof schema + + export function createValidator1(schema: any): (data: T) => T { +>createValidator1 : (schema: any) => (data: T) => T +>schema : any +>T : T +>data : T +>T : T +>T : T + + return undefined; +>undefined : undefined + } +} + +// Constructor types +module schema { +>schema : typeof schema + + export function createValidator2(schema: any): new (data: T) => T { +>createValidator2 : (schema: any) => new (data: T) => T +>schema : any +>T : T +>data : T +>T : T +>T : T + + return undefined; +>undefined : undefined + } +} + +// union types +module schema { +>schema : typeof schema + + export function createValidator3(schema: any): number | { new (data: T): T; } { +>createValidator3 : (schema: any) => number | (new (data: T) => T) +>schema : any +>T : T +>data : T +>T : T +>T : T + + return undefined; +>undefined : undefined + } +} + +// Array types +module schema { +>schema : typeof schema + + export function createValidator4(schema: any): { new (data: T): T; }[] { +>createValidator4 : (schema: any) => (new (data: T) => T)[] +>schema : any +>T : T +>data : T +>T : T +>T : T + + return undefined; +>undefined : undefined + } +} + + +// TypeLiterals +module schema { +>schema : typeof schema + + export function createValidator5(schema: any): { new (data: T): T } { +>createValidator5 : (schema: any) => new (data: T) => T +>schema : any +>T : T +>data : T +>T : T +>T : T + + return undefined; +>undefined : undefined + } +} + +// Tuple types +module schema { +>schema : typeof schema + + export function createValidator6(schema: any): [ new (data: T) => T, number] { +>createValidator6 : (schema: any) => [new (data: T) => T, number] +>schema : any +>T : T +>data : T +>T : T +>T : T + + return undefined; +>undefined : undefined + } +} + +// Paren Types +module schema { +>schema : typeof schema + + export function createValidator7(schema: any): (new (data: T)=>T )[] { +>createValidator7 : (schema: any) => (new (data: T) => T)[] +>schema : any +>T : T +>data : T +>T : T +>T : T + + return undefined; +>undefined : undefined + } +} diff --git a/tests/cases/compiler/constructorTypeDeclarations.ts b/tests/cases/compiler/constructorTypeDeclarations.ts deleted file mode 100644 index 48d6f88463..0000000000 --- a/tests/cases/compiler/constructorTypeDeclarations.ts +++ /dev/null @@ -1,7 +0,0 @@ -// @declaration: true - -module schema { - export function createValidator(schema: any): new (data: T) => T { - return undefined; - } -} \ No newline at end of file diff --git a/tests/cases/compiler/functionTypeDeclarations.ts b/tests/cases/compiler/functionTypeDeclarations.ts deleted file mode 100644 index e0d7c7cdbf..0000000000 --- a/tests/cases/compiler/functionTypeDeclarations.ts +++ /dev/null @@ -1,9 +0,0 @@ -// @declaration: true - -module schema { - export function createValidator(schema: any): (data: T) => T { - return (data: T) => { - return data; - } - } -} \ No newline at end of file diff --git a/tests/cases/compiler/isDeclarationVisibleNodeKinds.ts b/tests/cases/compiler/isDeclarationVisibleNodeKinds.ts new file mode 100644 index 0000000000..3e8b890ef5 --- /dev/null +++ b/tests/cases/compiler/isDeclarationVisibleNodeKinds.ts @@ -0,0 +1,51 @@ +// @declaration: true + +// Function types +module schema { + export function createValidator1(schema: any): (data: T) => T { + return undefined; + } +} + +// Constructor types +module schema { + export function createValidator2(schema: any): new (data: T) => T { + return undefined; + } +} + +// union types +module schema { + export function createValidator3(schema: any): number | { new (data: T): T; } { + return undefined; + } +} + +// Array types +module schema { + export function createValidator4(schema: any): { new (data: T): T; }[] { + return undefined; + } +} + + +// TypeLiterals +module schema { + export function createValidator5(schema: any): { new (data: T): T } { + return undefined; + } +} + +// Tuple types +module schema { + export function createValidator6(schema: any): [ new (data: T) => T, number] { + return undefined; + } +} + +// Paren Types +module schema { + export function createValidator7(schema: any): (new (data: T)=>T )[] { + return undefined; + } +} \ No newline at end of file From fde249d6a8e3f63acb0a7d24d9e50062e84437ed Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 30 Nov 2014 23:54:21 -0800 Subject: [PATCH 08/12] Handle TypeReference nodes --- src/compiler/checker.ts | 1 + .../isDeclarationVisibleNodeKinds.js | 23 ++++++++++++++++++- .../isDeclarationVisibleNodeKinds.types | 19 +++++++++++++++ .../compiler/isDeclarationVisibleNodeKinds.ts | 9 +++++++- 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 025837511c..9b4f6e16c7 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1625,6 +1625,7 @@ module ts { case SyntaxKind.FunctionType: case SyntaxKind.ConstructorType: case SyntaxKind.TypeLiteral: + case SyntaxKind.TypeReference: case SyntaxKind.ArrayType: case SyntaxKind.TupleType: case SyntaxKind.UnionType: diff --git a/tests/baselines/reference/isDeclarationVisibleNodeKinds.js b/tests/baselines/reference/isDeclarationVisibleNodeKinds.js index 65fddb0a92..fbdb179e6c 100644 --- a/tests/baselines/reference/isDeclarationVisibleNodeKinds.js +++ b/tests/baselines/reference/isDeclarationVisibleNodeKinds.js @@ -48,7 +48,15 @@ module schema { export function createValidator7(schema: any): (new (data: T)=>T )[] { return undefined; } -} +} + +// Type reference +module schema { + export function createValidator8(schema: any): Array<{ (data: T) : T}> { + return undefined; + } +} + //// [isDeclarationVisibleNodeKinds.js] // Function types @@ -107,6 +115,14 @@ var schema; } _schema.createValidator7 = createValidator7; })(schema || (schema = {})); +// Type reference +var schema; +(function (_schema) { + function createValidator8(schema) { + return undefined; + } + _schema.createValidator8 = createValidator8; +})(schema || (schema = {})); //// [isDeclarationVisibleNodeKinds.d.ts] @@ -137,3 +153,8 @@ declare module schema { declare module schema { function createValidator7(schema: any): (new (data: T) => T)[]; } +declare module schema { + function createValidator8(schema: any): Array<{ + (data: T): T; + }>; +} diff --git a/tests/baselines/reference/isDeclarationVisibleNodeKinds.types b/tests/baselines/reference/isDeclarationVisibleNodeKinds.types index c95ded99be..70b0fa09eb 100644 --- a/tests/baselines/reference/isDeclarationVisibleNodeKinds.types +++ b/tests/baselines/reference/isDeclarationVisibleNodeKinds.types @@ -119,3 +119,22 @@ module schema { >undefined : undefined } } + +// Type reference +module schema { +>schema : typeof schema + + export function createValidator8(schema: any): Array<{ (data: T) : T}> { +>createValidator8 : (schema: any) => ((data: T) => T)[] +>schema : any +>Array : T[] +>T : T +>data : T +>T : T +>T : T + + return undefined; +>undefined : undefined + } +} + diff --git a/tests/cases/compiler/isDeclarationVisibleNodeKinds.ts b/tests/cases/compiler/isDeclarationVisibleNodeKinds.ts index 3e8b890ef5..34950be894 100644 --- a/tests/cases/compiler/isDeclarationVisibleNodeKinds.ts +++ b/tests/cases/compiler/isDeclarationVisibleNodeKinds.ts @@ -48,4 +48,11 @@ module schema { export function createValidator7(schema: any): (new (data: T)=>T )[] { return undefined; } -} \ No newline at end of file +} + +// Type reference +module schema { + export function createValidator8(schema: any): Array<{ (data: T) : T}> { + return undefined; + } +} From bf731646ecd5b91d8ec03e939aca8c9d10691843 Mon Sep 17 00:00:00 2001 From: vvakame Date: Wed, 26 Nov 2014 22:28:52 +0900 Subject: [PATCH 09/12] Add missing prototype properties --- src/lib/core.d.ts | 1 + src/lib/extensions.d.ts | 3 +++ .../reference/constDeclarationShadowedByVarDeclaration3.types | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lib/core.d.ts b/src/lib/core.d.ts index 7f498488f2..5abc7fe203 100644 --- a/src/lib/core.d.ts +++ b/src/lib/core.d.ts @@ -822,6 +822,7 @@ interface RegExp { declare var RegExp: { new (pattern: string, flags?: string): RegExp; (pattern: string, flags?: string): RegExp; + prototype: RegExp; // Non-standard extensions $1: string; diff --git a/src/lib/extensions.d.ts b/src/lib/extensions.d.ts index 82cc129ecb..f4387543c0 100644 --- a/src/lib/extensions.d.ts +++ b/src/lib/extensions.d.ts @@ -631,6 +631,7 @@ interface Map { } declare var Map: { new (): Map; + prototype: Map; } interface WeakMap { @@ -642,6 +643,7 @@ interface WeakMap { } declare var WeakMap: { new (): WeakMap; + prototype: WeakMap; } interface Set { @@ -654,6 +656,7 @@ interface Set { } declare var Set: { new (): Set; + prototype: Set; } declare module Intl { diff --git a/tests/baselines/reference/constDeclarationShadowedByVarDeclaration3.types b/tests/baselines/reference/constDeclarationShadowedByVarDeclaration3.types index 89490567f1..3e688cc767 100644 --- a/tests/baselines/reference/constDeclarationShadowedByVarDeclaration3.types +++ b/tests/baselines/reference/constDeclarationShadowedByVarDeclaration3.types @@ -7,7 +7,7 @@ class Rule { >regex : RegExp >RegExp : RegExp >new RegExp('') : RegExp ->RegExp : { (pattern: string, flags?: string): RegExp; new (pattern: string, flags?: string): RegExp; $1: string; $2: string; $3: string; $4: string; $5: string; $6: string; $7: string; $8: string; $9: string; lastMatch: string; } +>RegExp : { (pattern: string, flags?: string): RegExp; new (pattern: string, flags?: string): RegExp; prototype: RegExp; $1: string; $2: string; $3: string; $4: string; $5: string; $6: string; $7: string; $8: string; $9: string; lastMatch: string; } public name: string = ''; >name : string From 0f6574e7e6c15213d2afcea740540cde65ab44ca Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 1 Dec 2014 13:20:56 -0800 Subject: [PATCH 10/12] Add test for getters and setters --- .../isDeclarationVisibleNodeKinds.js | 41 ++++++++++++++++++- .../isDeclarationVisibleNodeKinds.types | 28 +++++++++++++ .../compiler/isDeclarationVisibleNodeKinds.ts | 13 ++++++ 3 files changed, 81 insertions(+), 1 deletion(-) diff --git a/tests/baselines/reference/isDeclarationVisibleNodeKinds.js b/tests/baselines/reference/isDeclarationVisibleNodeKinds.js index fbdb179e6c..0d1664c7f5 100644 --- a/tests/baselines/reference/isDeclarationVisibleNodeKinds.js +++ b/tests/baselines/reference/isDeclarationVisibleNodeKinds.js @@ -56,7 +56,18 @@ module schema { return undefined; } } - + + +module schema { + export class T { + get createValidator9(): (data: T) => T { + return undefined; + } + + set createValidator10(v: (data: T) => T) { + } + } +} //// [isDeclarationVisibleNodeKinds.js] // Function types @@ -123,6 +134,28 @@ var schema; } _schema.createValidator8 = createValidator8; })(schema || (schema = {})); +var schema; +(function (schema) { + var T = (function () { + function T() { + } + Object.defineProperty(T.prototype, "createValidator9", { + get: function () { + return undefined; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(T.prototype, "createValidator10", { + set: function (v) { + }, + enumerable: true, + configurable: true + }); + return T; + })(); + schema.T = T; +})(schema || (schema = {})); //// [isDeclarationVisibleNodeKinds.d.ts] @@ -158,3 +191,9 @@ declare module schema { (data: T): T; }>; } +declare module schema { + class T { + createValidator9: (data: T) => T; + createValidator10: (data: T) => T; + } +} diff --git a/tests/baselines/reference/isDeclarationVisibleNodeKinds.types b/tests/baselines/reference/isDeclarationVisibleNodeKinds.types index 70b0fa09eb..b3fe8d684b 100644 --- a/tests/baselines/reference/isDeclarationVisibleNodeKinds.types +++ b/tests/baselines/reference/isDeclarationVisibleNodeKinds.types @@ -138,3 +138,31 @@ module schema { } } + +module schema { +>schema : typeof schema + + export class T { +>T : T + + get createValidator9(): (data: T) => T { +>createValidator9 : (data: T) => T +>T : T +>data : T +>T : T +>T : T + + return undefined; +>undefined : undefined + } + + set createValidator10(v: (data: T) => T) { +>createValidator10 : (data: T) => T +>v : (data: T) => T +>T : T +>data : T +>T : T +>T : T + } + } +} diff --git a/tests/cases/compiler/isDeclarationVisibleNodeKinds.ts b/tests/cases/compiler/isDeclarationVisibleNodeKinds.ts index 34950be894..0434c40ee6 100644 --- a/tests/cases/compiler/isDeclarationVisibleNodeKinds.ts +++ b/tests/cases/compiler/isDeclarationVisibleNodeKinds.ts @@ -1,4 +1,5 @@ // @declaration: true +// @target: es5 // Function types module schema { @@ -56,3 +57,15 @@ module schema { return undefined; } } + + +module schema { + export class T { + get createValidator9(): (data: T) => T { + return undefined; + } + + set createValidator10(v: (data: T) => T) { + } + } +} \ No newline at end of file From 7358b0f7d33733b64db08237dced05a0b3673172 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Mon, 1 Dec 2014 13:29:49 -0800 Subject: [PATCH 11/12] take token kind from the tree in case if token kind from scanner is different --- src/services/formatting/formattingScanner.ts | 17 +++++++++++++++-- .../fourslash/formattingKeywordAsIdentifier.ts | 7 +++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 tests/cases/fourslash/formattingKeywordAsIdentifier.ts diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts index 220ac21bd8..bc79b91a55 100644 --- a/src/services/formatting/formattingScanner.ts +++ b/src/services/formatting/formattingScanner.ts @@ -146,7 +146,7 @@ module ts.formatting { if (lastTokenInfo && expectedScanAction === lastScanAction) { // readTokenInfo was called before with the same expected scan action. // No need to re-scan text, return existing 'lastTokenInfo' - return lastTokenInfo; + return fixTokenKind(lastTokenInfo, n); } if (scanner.getStartPos() !== savedPos) { @@ -207,11 +207,13 @@ module ts.formatting { } } - return lastTokenInfo = { + lastTokenInfo = { leadingTrivia: leadingTrivia, trailingTrivia: trailingTrivia, token: token } + + return fixTokenKind(lastTokenInfo, n); } function isOnToken(): boolean { @@ -219,5 +221,16 @@ module ts.formatting { var startPos = (lastTokenInfo && lastTokenInfo.token.pos) || scanner.getStartPos(); return startPos < endPos && current !== SyntaxKind.EndOfFileToken && !isTrivia(current); } + + // when containing node in the tree is token + // but its kind differs from the kind that was returned by the scanner, + // then kind needs to be fixed. This might happen in cases + // when parser interprets token differently, i.e keyword treated as identifier + function fixTokenKind(tokenInfo: TokenInfo, container: Node): TokenInfo { + if (isToken(container) && tokenInfo.token.kind !== container.kind) { + tokenInfo.token.kind = container.kind; + } + return tokenInfo; + } } } \ No newline at end of file diff --git a/tests/cases/fourslash/formattingKeywordAsIdentifier.ts b/tests/cases/fourslash/formattingKeywordAsIdentifier.ts new file mode 100644 index 0000000000..aa1a636f62 --- /dev/null +++ b/tests/cases/fourslash/formattingKeywordAsIdentifier.ts @@ -0,0 +1,7 @@ +/// + +////declare var module/*1*/ + +goTo.marker("1"); +edit.insert(";"); +verify.currentLineContentIs("declare var module;"); \ No newline at end of file From 5286f87b48e00c47c6158bbe6613c0294fc24748 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Mon, 1 Dec 2014 15:50:17 -0800 Subject: [PATCH 12/12] added comments --- src/services/formatting/formattingScanner.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts index bc79b91a55..710881bf80 100644 --- a/src/services/formatting/formattingScanner.ts +++ b/src/services/formatting/formattingScanner.ts @@ -146,6 +146,10 @@ module ts.formatting { if (lastTokenInfo && expectedScanAction === lastScanAction) { // readTokenInfo was called before with the same expected scan action. // No need to re-scan text, return existing 'lastTokenInfo' + // it is ok to call fixTokenKind here since it does not affect + // what portion of text is consumed. In opposize rescanning can change it, + // i.e. for '>=' when originally scanner eats just one character + // and rescanning forces it to consume more. return fixTokenKind(lastTokenInfo, n); }