Skip to content

Commit 2936d5c

Browse files
committed
Keep all JS syntax checking in a single checkJSSyntax function
1 parent a5d60c7 commit 2936d5c

File tree

1 file changed

+18
-55
lines changed

1 file changed

+18
-55
lines changed

internal/parser/parser.go

Lines changed: 18 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,11 +1690,7 @@ func (p *Parser) parseHeritageClause() *ast.Node {
16901690
kind := p.token
16911691
p.nextToken()
16921692
types := p.parseDelimitedList(PCHeritageClauseElement, (*Parser).parseExpressionWithTypeArguments)
1693-
result := p.finishNode(p.factory.NewHeritageClause(kind, types), pos)
1694-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 && kind == ast.KindImplementsKeyword {
1695-
p.jsErrorAtRange(result.Loc, diagnostics.X_implements_clauses_can_only_be_used_in_TypeScript_files)
1696-
}
1697-
return result
1693+
return p.checkJSSyntax(p.finishNode(p.factory.NewHeritageClause(kind, types), pos))
16981694
}
16991695

17001696
func (p *Parser) parseExpressionWithTypeArguments() *ast.Node {
@@ -1951,9 +1947,7 @@ func (p *Parser) parseInterfaceDeclaration(pos int, hasJSDoc bool, modifiers *as
19511947
members := p.parseObjectTypeMembers()
19521948
result := p.finishNode(p.factory.NewInterfaceDeclaration(modifiers, name, typeParameters, heritageClauses, members), pos)
19531949
p.withJSDoc(result, hasJSDoc)
1954-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 {
1955-
p.jsErrorAtRange(name.Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, "interface")
1956-
}
1950+
p.checkJSSyntax(result)
19571951
return result
19581952
}
19591953

@@ -1974,9 +1968,7 @@ func (p *Parser) parseTypeAliasDeclaration(pos int, hasJSDoc bool, modifiers *as
19741968
p.parseSemicolon()
19751969
result := p.finishNode(p.factory.NewTypeAliasDeclaration(modifiers, name, typeParameters, typeNode), pos)
19761970
p.withJSDoc(result, hasJSDoc)
1977-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 {
1978-
p.jsErrorAtRange(name.Loc, diagnostics.Type_aliases_can_only_be_used_in_TypeScript_files)
1979-
}
1971+
p.checkJSSyntax(result)
19801972
return result
19811973
}
19821974

@@ -2014,9 +2006,7 @@ func (p *Parser) parseEnumDeclaration(pos int, hasJSDoc bool, modifiers *ast.Mod
20142006
}
20152007
result := p.finishNode(p.factory.NewEnumDeclaration(modifiers, name, members), pos)
20162008
p.withJSDoc(result, hasJSDoc)
2017-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 {
2018-
p.jsErrorAtRange(name.Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, "enum")
2019-
}
2009+
p.checkJSSyntax(result)
20202010
p.statementHasAwaitIdentifier = saveHasAwaitIdentifier
20212011
return result
20222012
}
@@ -2093,9 +2083,7 @@ func (p *Parser) parseModuleOrNamespaceDeclaration(pos int, hasJSDoc bool, modif
20932083
}
20942084
result := p.finishNode(p.factory.NewModuleDeclaration(modifiers, keyword, name, body), pos)
20952085
p.withJSDoc(result, hasJSDoc)
2096-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 {
2097-
p.jsErrorAtRange(name.Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, scanner.TokenToString(keyword))
2098-
}
2086+
p.checkJSSyntax(result)
20992087
p.statementHasAwaitIdentifier = saveHasAwaitIdentifier
21002088
return result
21012089
}
@@ -2120,11 +2108,8 @@ func (p *Parser) parseImportDeclarationOrImportEqualsDeclaration(pos int, hasJSD
21202108
}
21212109
}
21222110
if identifier != nil && !p.tokenAfterImportedIdentifierDefinitelyProducesImportDeclaration() {
2123-
importEquals := p.parseImportEqualsDeclaration(pos, hasJSDoc, modifiers, identifier, isTypeOnly)
2111+
importEquals := p.checkJSSyntax(p.parseImportEqualsDeclaration(pos, hasJSDoc, modifiers, identifier, isTypeOnly))
21242112
p.statementHasAwaitIdentifier = saveHasAwaitIdentifier // Import= declaration is always parsed in an Await context, no need to reparse
2125-
if importEquals.Flags&ast.NodeFlagsJavaScriptFile != 0 {
2126-
p.jsErrorAtRange(importEquals.Loc, diagnostics.X_import_can_only_be_used_in_TypeScript_files)
2127-
}
21282113
return importEquals
21292114
}
21302115
importClause := p.tryParseImportClause(identifier, afterImportPos, isTypeOnly, false /*skipJSDocLeadingAsterisks*/)
@@ -2134,9 +2119,7 @@ func (p *Parser) parseImportDeclarationOrImportEqualsDeclaration(pos int, hasJSD
21342119
p.parseSemicolon()
21352120
result := p.finishNode(p.factory.NewImportDeclaration(modifiers, importClause, moduleSpecifier, attributes), pos)
21362121
p.withJSDoc(result, hasJSDoc)
2137-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 && isTypeOnly {
2138-
p.jsErrorAtRange(result.Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, "import type")
2139-
}
2122+
p.checkJSSyntax(result)
21402123
return result
21412124
}
21422125

@@ -2266,10 +2249,7 @@ func (p *Parser) parseImportSpecifier() *ast.Node {
22662249
identifierName = p.newIdentifier("")
22672250
p.finishNode(identifierName, name.Pos())
22682251
}
2269-
result := p.finishNode(p.factory.NewImportSpecifier(isTypeOnly, propertyName, identifierName), pos)
2270-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 && isTypeOnly {
2271-
p.jsErrorAtRange(result.Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, "import...type")
2272-
}
2252+
result := p.checkJSSyntax(p.finishNode(p.factory.NewImportSpecifier(isTypeOnly, propertyName, identifierName), pos))
22732253
return result
22742254
}
22752255

@@ -2384,9 +2364,7 @@ func (p *Parser) parseExportAssignment(pos int, hasJSDoc bool, modifiers *ast.Mo
23842364
p.statementHasAwaitIdentifier = saveHasAwaitIdentifier
23852365
result := p.finishNode(p.factory.NewExportAssignment(modifiers, isExportEquals, nil /*typeNode*/, expression), pos)
23862366
p.withJSDoc(result, hasJSDoc)
2387-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 && isExportEquals {
2388-
p.jsErrorAtRange(result.Loc, diagnostics.X_export_can_only_be_used_in_TypeScript_files)
2389-
}
2367+
p.checkJSSyntax(result)
23902368
return result
23912369
}
23922370

@@ -2436,9 +2414,7 @@ func (p *Parser) parseExportDeclaration(pos int, hasJSDoc bool, modifiers *ast.M
24362414
p.statementHasAwaitIdentifier = saveHasAwaitIdentifier
24372415
result := p.finishNode(p.factory.NewExportDeclaration(modifiers, isTypeOnly, exportClause, moduleSpecifier, attributes), pos)
24382416
p.withJSDoc(result, hasJSDoc)
2439-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 && isTypeOnly {
2440-
p.jsErrorAtRange(result.Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, "export type")
2441-
}
2417+
p.checkJSSyntax(result)
24422418
return result
24432419
}
24442420

@@ -2463,9 +2439,7 @@ func (p *Parser) parseExportSpecifier() *ast.Node {
24632439
isTypeOnly, propertyName, name := p.parseImportOrExportSpecifier(ast.KindExportSpecifier)
24642440
result := p.finishNode(p.factory.NewExportSpecifier(isTypeOnly, propertyName, name), pos)
24652441
p.withJSDoc(result, hasJSDoc)
2466-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 && isTypeOnly {
2467-
p.jsErrorAtRange(result.Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, "export...type")
2468-
}
2442+
p.checkJSSyntax(result)
24692443
return result
24702444
}
24712445

@@ -4503,19 +4477,11 @@ func (p *Parser) parseBinaryExpressionRest(precedence ast.OperatorPrecedence, le
45034477
}
45044478

45054479
func (p *Parser) makeSatisfiesExpression(expression *ast.Expression, typeNode *ast.TypeNode) *ast.Node {
4506-
result := p.finishNode(p.factory.NewSatisfiesExpression(expression, typeNode), expression.Pos())
4507-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 {
4508-
p.jsErrorAtRange(typeNode.Loc, diagnostics.Type_satisfaction_expressions_can_only_be_used_in_TypeScript_files)
4509-
}
4510-
return result
4480+
return p.checkJSSyntax(p.finishNode(p.factory.NewSatisfiesExpression(expression, typeNode), expression.Pos()))
45114481
}
45124482

45134483
func (p *Parser) makeAsExpression(left *ast.Expression, right *ast.TypeNode) *ast.Node {
4514-
result := p.finishNode(p.factory.NewAsExpression(left, right), left.Pos())
4515-
if result.Flags&ast.NodeFlagsJavaScriptFile != 0 {
4516-
p.jsErrorAtRange(right.Loc, diagnostics.Type_assertion_expressions_can_only_be_used_in_TypeScript_files)
4517-
}
4518-
return result
4484+
return p.checkJSSyntax(p.finishNode(p.factory.NewAsExpression(left, right), left.Pos()))
45194485
}
45204486

45214487
func (p *Parser) makeBinaryExpression(left *ast.Expression, operatorToken *ast.Node, right *ast.Expression, pos int) *ast.Node {
@@ -5217,10 +5183,7 @@ func (p *Parser) parseMemberExpressionRest(pos int, expression *ast.Expression,
52175183
if questionDotToken == nil {
52185184
if p.token == ast.KindExclamationToken && !p.hasPrecedingLineBreak() {
52195185
p.nextToken()
5220-
expression = p.finishNode(p.factory.NewNonNullExpression(expression, ast.NodeFlagsNone), pos)
5221-
if expression.Flags&ast.NodeFlagsJavaScriptFile != 0 {
5222-
p.jsErrorAtRange(expression.Loc, diagnostics.Non_null_assertions_can_only_be_used_in_TypeScript_files)
5223-
}
5186+
expression = p.checkJSSyntax(p.finishNode(p.factory.NewNonNullExpression(expression, ast.NodeFlagsNone), pos))
52245187
continue
52255188
}
52265189
typeArguments := p.tryParseTypeArgumentsInExpression()
@@ -6558,13 +6521,13 @@ func (p *Parser) checkJSSyntax(node *ast.Node) *ast.Node {
65586521
p.jsErrorAtRange(node.Loc, diagnostics.X_implements_clauses_can_only_be_used_in_TypeScript_files)
65596522
}
65606523
case ast.KindInterfaceDeclaration:
6561-
p.jsErrorAtRange(node.Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, "interface")
6524+
p.jsErrorAtRange(node.Name().Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, "interface")
65626525
case ast.KindModuleDeclaration:
6563-
p.jsErrorAtRange(node.Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, scanner.TokenToString(node.AsModuleDeclaration().Keyword))
6526+
p.jsErrorAtRange(node.Name().Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, scanner.TokenToString(node.AsModuleDeclaration().Keyword))
65646527
case ast.KindTypeAliasDeclaration:
6565-
p.jsErrorAtRange(node.Loc, diagnostics.Type_aliases_can_only_be_used_in_TypeScript_files)
6528+
p.jsErrorAtRange(node.Name().Loc, diagnostics.Type_aliases_can_only_be_used_in_TypeScript_files)
65666529
case ast.KindEnumDeclaration:
6567-
p.jsErrorAtRange(node.Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, "enum")
6530+
p.jsErrorAtRange(node.Name().Loc, diagnostics.X_0_declarations_can_only_be_used_in_TypeScript_files, "enum")
65686531
case ast.KindNonNullExpression:
65696532
p.jsErrorAtRange(node.Loc, diagnostics.Non_null_assertions_can_only_be_used_in_TypeScript_files)
65706533
case ast.KindAsExpression:

0 commit comments

Comments
 (0)