Skip to content

Commit 7a4c3da

Browse files
author
Andy
authored
Simplify return type parsing (#18206)
* Simplify return type parsing * Make control flow clearer
1 parent c7b4ed3 commit 7a4c3da

File tree

3 files changed

+18
-18
lines changed

3 files changed

+18
-18
lines changed

src/compiler/core.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1316,14 +1316,12 @@ namespace ts {
13161316

13171317
export function createFileDiagnostic(file: SourceFile, start: number, length: number, message: DiagnosticMessage, ...args: (string | number)[]): Diagnostic;
13181318
export function createFileDiagnostic(file: SourceFile, start: number, length: number, message: DiagnosticMessage): Diagnostic {
1319-
const end = start + length;
1320-
13211319
Debug.assertGreaterThanOrEqual(start, 0);
13221320
Debug.assertGreaterThanOrEqual(length, 0);
13231321

13241322
if (file) {
13251323
Debug.assertLessThanOrEqual(start, file.text.length);
1326-
Debug.assertLessThanOrEqual(end, file.text.length);
1324+
Debug.assertLessThanOrEqual(start + length, file.text.length);
13271325
}
13281326

13291327
let text = getLocaleSpecificMessage(message);

src/compiler/parser.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2290,25 +2290,27 @@ namespace ts {
22902290
signature.typeParameters = parseTypeParameters();
22912291
}
22922292
signature.parameters = parseParameterList(flags);
2293+
signature.type = parseReturnType(returnToken, !!(flags & SignatureFlags.Type));
2294+
}
22932295

2294-
const returnTokenRequired = returnToken === SyntaxKind.EqualsGreaterThanToken;
2295-
if (returnTokenRequired) {
2296+
function parseReturnType(returnToken: SyntaxKind.ColonToken | SyntaxKind.EqualsGreaterThanToken, isType: boolean): TypeNode | undefined {
2297+
return shouldParseReturnType(returnToken, isType) ? parseTypeOrTypePredicate() : undefined;
2298+
}
2299+
function shouldParseReturnType(returnToken: SyntaxKind.ColonToken | SyntaxKind.EqualsGreaterThanToken, isType: boolean): boolean {
2300+
if (returnToken === SyntaxKind.EqualsGreaterThanToken) {
22962301
parseExpected(returnToken);
2297-
signature.type = parseTypeOrTypePredicate();
2302+
return true;
22982303
}
2299-
else if (parseOptional(returnToken)) {
2300-
signature.type = parseTypeOrTypePredicate();
2304+
else if (parseOptional(SyntaxKind.ColonToken)) {
2305+
return true;
23012306
}
2302-
else if (flags & SignatureFlags.Type) {
2303-
const start = scanner.getTokenPos();
2304-
const length = scanner.getTextPos() - start;
2305-
const backwardToken = parseOptional(returnToken === SyntaxKind.ColonToken ? SyntaxKind.EqualsGreaterThanToken : SyntaxKind.ColonToken);
2306-
if (backwardToken) {
2307-
// This is easy to get backward, especially in type contexts, so parse the type anyway
2308-
signature.type = parseTypeOrTypePredicate();
2309-
parseErrorAtPosition(start, length, Diagnostics._0_expected, tokenToString(returnToken));
2310-
}
2307+
else if (isType && token() === SyntaxKind.EqualsGreaterThanToken) {
2308+
// This is easy to get backward, especially in type contexts, so parse the type anyway
2309+
parseErrorAtCurrentToken(Diagnostics._0_expected, tokenToString(SyntaxKind.ColonToken));
2310+
nextToken();
2311+
return true;
23112312
}
2313+
return false;
23122314
}
23132315

23142316
function parseParameterList(flags: SignatureFlags) {

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ namespace ts {
668668
name?: PropertyName;
669669
typeParameters?: NodeArray<TypeParameterDeclaration>;
670670
parameters: NodeArray<ParameterDeclaration>;
671-
type?: TypeNode;
671+
type: TypeNode | undefined;
672672
}
673673

674674
export interface CallSignatureDeclaration extends SignatureDeclaration, TypeElement {

0 commit comments

Comments
 (0)