parse less than token rather than left shift in context of type arguments

This commit is contained in:
王文璐
2018-08-24 11:00:59 +08:00
parent f3ceebe552
commit 268dbfe093
8 changed files with 47 additions and 1 deletions

View File

@@ -1093,6 +1093,10 @@ namespace ts {
return currentToken = scanner.reScanTemplateToken();
}
function reScanLessThanToken(): SyntaxKind {
return currentToken = scanner.reScanLessThanToken();
}
function scanJsxIdentifier(): SyntaxKind {
return currentToken = scanner.scanJsxIdentifier();
}
@@ -2263,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() && token() === SyntaxKind.LessThanToken) {
if (!scanner.hasPrecedingLineBreak() && reScanLessThanToken() === SyntaxKind.LessThanToken) {
node.typeArguments = parseBracketedList(ParsingContext.TypeArguments, parseType, SyntaxKind.LessThanToken, SyntaxKind.GreaterThanToken);
}
return finishNode(node);

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,7 @@
//// [parseGenericArrowRatherThanLeftShift.ts]
type Bar = ReturnType<<T>(x: T) => number>;
declare const a: Bar;
//// [parseGenericArrowRatherThanLeftShift.js]

View File

@@ -0,0 +1,12 @@
=== tests/cases/compiler/parseGenericArrowRatherThanLeftShift.ts ===
type Bar = ReturnType<<T>(x: T) => number>;
>Bar : Symbol(Bar, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 0))
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 23))
>x : Symbol(x, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 26))
>T : Symbol(T, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 23))
declare const a: Bar;
>a : Symbol(a, Decl(parseGenericArrowRatherThanLeftShift.ts, 2, 13))
>Bar : Symbol(Bar, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 0))

View File

@@ -0,0 +1,8 @@
=== tests/cases/compiler/parseGenericArrowRatherThanLeftShift.ts ===
type Bar = ReturnType<<T>(x: T) => number>;
>Bar : number
>x : T
declare const a: Bar;
>a : number

View File

@@ -0,0 +1,3 @@
type Bar = ReturnType<<T>(x: T) => number>;
declare const a: Bar;