improve test case

This commit is contained in:
王文璐 2018-08-27 11:47:10 +08:00
parent 268dbfe093
commit 78444bb724
8 changed files with 46 additions and 13 deletions

View file

@ -1093,8 +1093,8 @@ namespace ts {
return currentToken = scanner.reScanTemplateToken();
}
function reScanLessThanToken(): SyntaxKind {
return currentToken = scanner.reScanLessThanToken();
function reScanLesserToken(): SyntaxKind {
return currentToken = scanner.reScanLesserToken();
}
function scanJsxIdentifier(): SyntaxKind {
@ -2267,7 +2267,7 @@ namespace ts {
function parseTypeReference(): TypeReferenceNode {
const node = <TypeReferenceNode>createNode(SyntaxKind.TypeReference);
node.typeName = parseEntityName(/*allowReservedWords*/ true, Diagnostics.Type_expected);
if (!scanner.hasPrecedingLineBreak() && reScanLessThanToken() === SyntaxKind.LessThanToken) {
if (!scanner.hasPrecedingLineBreak() && reScanLesserToken() === SyntaxKind.LessThanToken) {
node.typeArguments = parseBracketedList(ParsingContext.TypeArguments, parseType, SyntaxKind.LessThanToken, SyntaxKind.GreaterThanToken);
}
return finishNode(node);
@ -4506,7 +4506,8 @@ namespace ts {
function parseCallExpressionRest(expression: LeftHandSideExpression): LeftHandSideExpression {
while (true) {
expression = parseMemberExpressionRest(expression);
if (token() === SyntaxKind.LessThanToken) {
// handle 'foo<<T>()'
if (token() === SyntaxKind.LessThanToken || token() === SyntaxKind.LessThanLessThanToken) {
// See if this is the start of a generic invocation. If so, consume it and
// keep checking for postfix expressions. Otherwise, it's just a '<' that's
// part of an arithmetic expression. Break out so we consume it higher in the
@ -4548,9 +4549,10 @@ namespace ts {
}
function parseTypeArgumentsInExpression() {
if (!parseOptional(SyntaxKind.LessThanToken)) {
if (reScanLesserToken() !== SyntaxKind.LessThanToken) {
return undefined;
}
nextToken();
const typeArguments = parseDelimitedList(ParsingContext.TypeArguments, parseType);
if (!parseExpected(SyntaxKind.GreaterThanToken)) {

View file

@ -31,7 +31,7 @@ namespace ts {
scanJsxIdentifier(): SyntaxKind;
scanJsxAttributeValue(): SyntaxKind;
reScanJsxToken(): JsxTokenSyntaxKind;
reScanLessThanToken(): SyntaxKind;
reScanLesserToken(): SyntaxKind;
scanJsxToken(): JsxTokenSyntaxKind;
scanJSDocToken(): JsDocSyntaxKind;
scan(): SyntaxKind;
@ -846,7 +846,7 @@ namespace ts {
scanJsxIdentifier,
scanJsxAttributeValue,
reScanJsxToken,
reScanLessThanToken,
reScanLesserToken,
scanJsxToken,
scanJSDocToken,
scan,
@ -1842,7 +1842,7 @@ namespace ts {
return token = scanJsxToken();
}
function reScanLessThanToken(): SyntaxKind {
function reScanLesserToken(): SyntaxKind {
if (token === SyntaxKind.LessThanLessThanToken) {
pos = tokenPos + 1;
return token = SyntaxKind.LessThanToken;

View file

@ -3071,7 +3071,7 @@ declare namespace ts {
scanJsxIdentifier(): SyntaxKind;
scanJsxAttributeValue(): SyntaxKind;
reScanJsxToken(): JsxTokenSyntaxKind;
reScanLessThanToken(): SyntaxKind;
reScanLesserToken(): SyntaxKind;
scanJsxToken(): JsxTokenSyntaxKind;
scanJSDocToken(): JsDocSyntaxKind;
scan(): SyntaxKind;

View file

@ -3071,7 +3071,7 @@ declare namespace ts {
scanJsxIdentifier(): SyntaxKind;
scanJsxAttributeValue(): SyntaxKind;
reScanJsxToken(): JsxTokenSyntaxKind;
reScanLessThanToken(): SyntaxKind;
reScanLesserToken(): SyntaxKind;
scanJsxToken(): JsxTokenSyntaxKind;
scanJSDocToken(): JsDocSyntaxKind;
scan(): SyntaxKind;

View file

@ -1,7 +1,11 @@
//// [parseGenericArrowRatherThanLeftShift.ts]
type Bar = ReturnType<<T>(x: T) => number>;
declare const a: Bar;
function foo<T>(_x: T) {}
const b = foo<<T>(x: T) => number>(() => 1);
//// [parseGenericArrowRatherThanLeftShift.js]
function foo(_x) { }
var b = foo(function () { return 1; });

View file

@ -7,6 +7,19 @@ type Bar = ReturnType<<T>(x: T) => number>;
>T : Symbol(T, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 23))
declare const a: Bar;
>a : Symbol(a, Decl(parseGenericArrowRatherThanLeftShift.ts, 2, 13))
>a : Symbol(a, Decl(parseGenericArrowRatherThanLeftShift.ts, 1, 13))
>Bar : Symbol(Bar, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 0))
function foo<T>(_x: T) {}
>foo : Symbol(foo, Decl(parseGenericArrowRatherThanLeftShift.ts, 1, 21))
>T : Symbol(T, Decl(parseGenericArrowRatherThanLeftShift.ts, 3, 13))
>_x : Symbol(_x, Decl(parseGenericArrowRatherThanLeftShift.ts, 3, 16))
>T : Symbol(T, Decl(parseGenericArrowRatherThanLeftShift.ts, 3, 13))
const b = foo<<T>(x: T) => number>(() => 1);
>b : Symbol(b, Decl(parseGenericArrowRatherThanLeftShift.ts, 4, 5))
>foo : Symbol(foo, Decl(parseGenericArrowRatherThanLeftShift.ts, 1, 21))
>T : Symbol(T, Decl(parseGenericArrowRatherThanLeftShift.ts, 4, 15))
>x : Symbol(x, Decl(parseGenericArrowRatherThanLeftShift.ts, 4, 18))
>T : Symbol(T, Decl(parseGenericArrowRatherThanLeftShift.ts, 4, 15))

View file

@ -6,3 +6,15 @@ type Bar = ReturnType<<T>(x: T) => number>;
declare const a: Bar;
>a : number
function foo<T>(_x: T) {}
>foo : <T>(_x: T) => void
>_x : T
const b = foo<<T>(x: T) => number>(() => 1);
>b : void
>foo<<T>(x: T) => number>(() => 1) : void
>foo : <T>(_x: T) => void
>x : T
>() => 1 : () => number
>1 : 1

View file

@ -1,3 +1,5 @@
type Bar = ReturnType<<T>(x: T) => number>;
declare const a: Bar;
function foo<T>(_x: T) {}
const b = foo<<T>(x: T) => number>(() => 1);