Skip to content

Commit 268dbfe

Browse files
committed
parse less than token rather than left shift in context of type arguments
1 parent f3ceebe commit 268dbfe

8 files changed

+47
-1
lines changed

src/compiler/parser.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1093,6 +1093,10 @@ namespace ts {
10931093
return currentToken = scanner.reScanTemplateToken();
10941094
}
10951095

1096+
function reScanLessThanToken(): SyntaxKind {
1097+
return currentToken = scanner.reScanLessThanToken();
1098+
}
1099+
10961100
function scanJsxIdentifier(): SyntaxKind {
10971101
return currentToken = scanner.scanJsxIdentifier();
10981102
}
@@ -2263,7 +2267,7 @@ namespace ts {
22632267
function parseTypeReference(): TypeReferenceNode {
22642268
const node = <TypeReferenceNode>createNode(SyntaxKind.TypeReference);
22652269
node.typeName = parseEntityName(/*allowReservedWords*/ true, Diagnostics.Type_expected);
2266-
if (!scanner.hasPrecedingLineBreak() && token() === SyntaxKind.LessThanToken) {
2270+
if (!scanner.hasPrecedingLineBreak() && reScanLessThanToken() === SyntaxKind.LessThanToken) {
22672271
node.typeArguments = parseBracketedList(ParsingContext.TypeArguments, parseType, SyntaxKind.LessThanToken, SyntaxKind.GreaterThanToken);
22682272
}
22692273
return finishNode(node);

src/compiler/scanner.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ namespace ts {
3131
scanJsxIdentifier(): SyntaxKind;
3232
scanJsxAttributeValue(): SyntaxKind;
3333
reScanJsxToken(): JsxTokenSyntaxKind;
34+
reScanLessThanToken(): SyntaxKind;
3435
scanJsxToken(): JsxTokenSyntaxKind;
3536
scanJSDocToken(): JsDocSyntaxKind;
3637
scan(): SyntaxKind;
@@ -845,6 +846,7 @@ namespace ts {
845846
scanJsxIdentifier,
846847
scanJsxAttributeValue,
847848
reScanJsxToken,
849+
reScanLessThanToken,
848850
scanJsxToken,
849851
scanJSDocToken,
850852
scan,
@@ -1840,6 +1842,14 @@ namespace ts {
18401842
return token = scanJsxToken();
18411843
}
18421844

1845+
function reScanLessThanToken(): SyntaxKind {
1846+
if (token === SyntaxKind.LessThanLessThanToken) {
1847+
pos = tokenPos + 1;
1848+
return token = SyntaxKind.LessThanToken;
1849+
}
1850+
return token;
1851+
}
1852+
18431853
function scanJsxToken(): JsxTokenSyntaxKind {
18441854
startPos = tokenPos = pos;
18451855

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3071,6 +3071,7 @@ declare namespace ts {
30713071
scanJsxIdentifier(): SyntaxKind;
30723072
scanJsxAttributeValue(): SyntaxKind;
30733073
reScanJsxToken(): JsxTokenSyntaxKind;
3074+
reScanLessThanToken(): SyntaxKind;
30743075
scanJsxToken(): JsxTokenSyntaxKind;
30753076
scanJSDocToken(): JsDocSyntaxKind;
30763077
scan(): SyntaxKind;

tests/baselines/reference/api/typescript.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3071,6 +3071,7 @@ declare namespace ts {
30713071
scanJsxIdentifier(): SyntaxKind;
30723072
scanJsxAttributeValue(): SyntaxKind;
30733073
reScanJsxToken(): JsxTokenSyntaxKind;
3074+
reScanLessThanToken(): SyntaxKind;
30743075
scanJsxToken(): JsxTokenSyntaxKind;
30753076
scanJSDocToken(): JsDocSyntaxKind;
30763077
scan(): SyntaxKind;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//// [parseGenericArrowRatherThanLeftShift.ts]
2+
type Bar = ReturnType<<T>(x: T) => number>;
3+
4+
declare const a: Bar;
5+
6+
7+
//// [parseGenericArrowRatherThanLeftShift.js]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
=== tests/cases/compiler/parseGenericArrowRatherThanLeftShift.ts ===
2+
type Bar = ReturnType<<T>(x: T) => number>;
3+
>Bar : Symbol(Bar, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 0))
4+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
5+
>T : Symbol(T, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 23))
6+
>x : Symbol(x, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 26))
7+
>T : Symbol(T, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 23))
8+
9+
declare const a: Bar;
10+
>a : Symbol(a, Decl(parseGenericArrowRatherThanLeftShift.ts, 2, 13))
11+
>Bar : Symbol(Bar, Decl(parseGenericArrowRatherThanLeftShift.ts, 0, 0))
12+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
=== tests/cases/compiler/parseGenericArrowRatherThanLeftShift.ts ===
2+
type Bar = ReturnType<<T>(x: T) => number>;
3+
>Bar : number
4+
>x : T
5+
6+
declare const a: Bar;
7+
>a : number
8+
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
type Bar = ReturnType<<T>(x: T) => number>;
2+
3+
declare const a: Bar;

0 commit comments

Comments
 (0)