Skip to content

Commit 56d1835

Browse files
committed
Parse return types and add them to the Vue test
1 parent 613aead commit 56d1835

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

src/compiler/parser.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ namespace ts {
138138
case SyntaxKind.ParenthesizedType:
139139
case SyntaxKind.TypeOperator:
140140
return visitNode(cbNode, (<ParenthesizedTypeNode | TypeOperatorNode>node).type);
141+
case SyntaxKind.ReturnOperator:
142+
return visitNode(cbNode, (<ReturnOperatorNode>node).type);
141143
case SyntaxKind.IndexedAccessType:
142144
return visitNode(cbNode, (<IndexedAccessTypeNode>node).objectType) ||
143145
visitNode(cbNode, (<IndexedAccessTypeNode>node).indexType);
@@ -2611,7 +2613,23 @@ namespace ts {
26112613
return type;
26122614
}
26132615

2614-
function parseTypeOperator(operator: SyntaxKind.KeyOfKeyword) {
2616+
function parseReturnOperator(operator: SyntaxKind.ReturnKeyword): TypeNode {
2617+
const node = <ReturnOperatorNode>createNode(SyntaxKind.ReturnOperator);
2618+
parseExpected(operator);
2619+
node.operator = operator;
2620+
node.type = parseReturnOperatorOrHigher();
2621+
return finishNode(node);
2622+
}
2623+
2624+
function parseReturnOperatorOrHigher(): TypeNode {
2625+
switch (token()) {
2626+
case SyntaxKind.ReturnKeyword:
2627+
return parseReturnOperator(SyntaxKind.ReturnKeyword);
2628+
}
2629+
return parseTypeOperatorOrHigher();
2630+
}
2631+
2632+
function parseTypeOperator(operator: SyntaxKind.KeyOfKeyword) {
26152633
const node = <TypeOperatorNode>createNode(SyntaxKind.TypeOperator);
26162634
parseExpected(operator);
26172635
node.operator = operator;
@@ -2644,7 +2662,7 @@ namespace ts {
26442662
}
26452663

26462664
function parseIntersectionTypeOrHigher(): TypeNode {
2647-
return parseUnionOrIntersectionType(SyntaxKind.IntersectionType, parseTypeOperatorOrHigher, SyntaxKind.AmpersandToken);
2665+
return parseUnionOrIntersectionType(SyntaxKind.IntersectionType, parseReturnOperatorOrHigher, SyntaxKind.AmpersandToken);
26482666
}
26492667

26502668
function parseUnionTypeOrHigher(): TypeNode {

src/compiler/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@
238238
ParenthesizedType,
239239
ThisType,
240240
TypeOperator,
241+
ReturnOperator,
241242
IndexedAccessType,
242243
MappedType,
243244
LiteralType,
@@ -917,6 +918,12 @@
917918
type: TypeNode;
918919
}
919920

921+
export interface ReturnOperatorNode extends TypeNode {
922+
kind: SyntaxKind.ReturnOperator;
923+
operator: SyntaxKind.ReturnKeyword;
924+
type: TypeNode;
925+
}
926+
920927
export interface IndexedAccessTypeNode extends TypeNode {
921928
kind: SyntaxKind.IndexedAccessType;
922929
objectType: TypeNode;

tests/cases/compiler/recursion.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ let x = o.m() // x: number
1414
let y = o.m2() // y: any
1515
let p = o.p // p: number
1616

17-
type Propertise<T> = { [K in keyof T]: T[K] };
17+
type Propertise<T> = { [K in keyof T]: return T[K] };
1818
type Vue<T extends { data, methods, properties }> = T['data'] & T['methods'] & Propertise<T['properties']>;
1919

2020
let options = {

0 commit comments

Comments
 (0)