Skip to content

Commit f8ba3fe

Browse files
committed
fix(1374): support declaration emit for expando functions
1 parent ed2d8c9 commit f8ba3fe

File tree

79 files changed

+2741
-299
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+2741
-299
lines changed

internal/ast/utilities.go

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1340,7 +1340,7 @@ func IsBindableStaticElementAccessExpression(node *Node, excludeThisKeyword bool
13401340
return IsLiteralLikeElementAccess(node) &&
13411341
((!excludeThisKeyword && node.Expression().Kind == KindThisKeyword) ||
13421342
IsEntityNameExpression(node.Expression()) ||
1343-
IsBindableStaticAccessExpression(node.Expression() /*excludeThisKeyword*/, true))
1343+
IsBindableStaticAccessExpression(node.Expression(), true /*excludeThisKeyword*/))
13441344
}
13451345

13461346
func IsLiteralLikeElementAccess(node *Node) bool {
@@ -2815,10 +2815,6 @@ func IsModuleExportsAccessExpression(node *Node) bool {
28152815
return false
28162816
}
28172817

2818-
func isLiteralLikeElementAccess(node *Node) bool {
2819-
return node.Kind == KindElementAccessExpression && IsStringOrNumericLiteralLike(node.AsElementAccessExpression().ArgumentExpression)
2820-
}
2821-
28222818
func IsCheckJSEnabledForFile(sourceFile *SourceFile, compilerOptions *core.CompilerOptions) bool {
28232819
if sourceFile.CheckJsDirective != nil {
28242820
return sourceFile.CheckJsDirective.Enabled
@@ -3860,3 +3856,28 @@ func IsJSDocNameReferenceContext(node *Node) bool {
38603856
func IsImportOrImportEqualsDeclaration(node *Node) bool {
38613857
return IsImportDeclaration(node) || IsImportEqualsDeclaration(node)
38623858
}
3859+
3860+
func IsKeyword(token Kind) bool {
3861+
return KindFirstKeyword <= token && token <= KindLastKeyword
3862+
}
3863+
3864+
func IsNonContextualKeyword(token Kind) bool {
3865+
return IsKeyword(token) && !IsContextualKeyword(token)
3866+
}
3867+
3868+
func HasModifier(node *Node, flags ModifierFlags) bool {
3869+
return node.ModifierFlags()&flags != 0
3870+
}
3871+
3872+
func IsExpandoInitializer(initializer *Node) bool {
3873+
if initializer == nil {
3874+
return false
3875+
}
3876+
if IsFunctionExpressionOrArrowFunction(initializer) {
3877+
return true
3878+
}
3879+
if IsInJSFile(initializer) {
3880+
return IsClassExpression(initializer) || (IsObjectLiteralExpression(initializer) && len(initializer.AsObjectLiteralExpression().Properties.Nodes) == 0)
3881+
}
3882+
return false
3883+
}

internal/binder/binder.go

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,30 +1020,18 @@ func getInitializerSymbol(symbol *ast.Symbol) *ast.Symbol {
10201020
case ast.IsVariableDeclaration(declaration) &&
10211021
(declaration.Parent.Flags&ast.NodeFlagsConst != 0 || ast.IsInJSFile(declaration)):
10221022
initializer := declaration.Initializer()
1023-
if isExpandoInitializer(initializer) {
1023+
if ast.IsExpandoInitializer(initializer) {
10241024
return initializer.Symbol()
10251025
}
10261026
case ast.IsBinaryExpression(declaration) && ast.IsInJSFile(declaration):
10271027
initializer := declaration.AsBinaryExpression().Right
1028-
if isExpandoInitializer(initializer) {
1028+
if ast.IsExpandoInitializer(initializer) {
10291029
return initializer.Symbol()
10301030
}
10311031
}
10321032
return nil
10331033
}
10341034

1035-
func isExpandoInitializer(initializer *ast.Node) bool {
1036-
if initializer == nil {
1037-
return false
1038-
}
1039-
if ast.IsFunctionExpressionOrArrowFunction(initializer) {
1040-
return true
1041-
} else if ast.IsInJSFile(initializer) {
1042-
return ast.IsClassExpression(initializer) || (ast.IsObjectLiteralExpression(initializer) && len(initializer.AsObjectLiteralExpression().Properties.Nodes) == 0)
1043-
}
1044-
return false
1045-
}
1046-
10471035
func (b *Binder) bindThisPropertyAssignment(node *ast.Node) {
10481036
if !ast.IsInJSFile(node) {
10491037
return

internal/checker/checker.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4224,7 +4224,7 @@ func (c *Checker) checkBaseTypeAccessibility(t *Type, node *ast.Node) {
42244224
signatures := c.getSignaturesOfType(t, SignatureKindConstruct)
42254225
if len(signatures) != 0 {
42264226
declaration := signatures[0].declaration
4227-
if declaration != nil && HasModifier(declaration, ast.ModifierFlagsPrivate) {
4227+
if declaration != nil && ast.HasModifier(declaration, ast.ModifierFlagsPrivate) {
42284228
typeClassDeclaration := ast.GetClassLikeDeclarationOfSymbol(t.symbol)
42294229
if !c.isNodeWithinClass(node, typeClassDeclaration) {
42304230
c.error(node, diagnostics.Cannot_extend_a_class_0_Class_constructor_is_marked_as_private, c.getFullyQualifiedName(t.symbol, nil))
@@ -6479,7 +6479,7 @@ func (c *Checker) checkAliasSymbol(node *ast.Node) {
64796479
name := node.PropertyNameOrName().Text()
64806480
c.addTypeOnlyDeclarationRelatedInfo(c.error(node, message, name), core.IfElse(isType, nil, typeOnlyAlias), name)
64816481
}
6482-
if isType && node.Kind == ast.KindImportEqualsDeclaration && HasModifier(node, ast.ModifierFlagsExport) {
6482+
if isType && node.Kind == ast.KindImportEqualsDeclaration && ast.HasModifier(node, ast.ModifierFlagsExport) {
64836483
c.error(node, diagnostics.Cannot_use_export_import_on_a_type_or_type_only_namespace_when_0_is_enabled, c.getIsolatedModulesLikeFlagName())
64846484
}
64856485
case ast.KindExportSpecifier:
@@ -6767,7 +6767,7 @@ func (c *Checker) checkUnusedClassMembers(node *ast.Node) {
67676767
break // Already would have reported an error on the getter.
67686768
}
67696769
symbol := c.getSymbolOfDeclaration(member)
6770-
if !c.isReferenced(symbol) && (HasModifier(member, ast.ModifierFlagsPrivate) || member.Name() != nil && ast.IsPrivateIdentifier(member.Name())) && member.Flags&ast.NodeFlagsAmbient == 0 {
6770+
if !c.isReferenced(symbol) && (ast.HasModifier(member, ast.ModifierFlagsPrivate) || member.Name() != nil && ast.IsPrivateIdentifier(member.Name())) && member.Flags&ast.NodeFlagsAmbient == 0 {
67716771
c.reportUnused(member, UnusedKindLocal, NewDiagnosticForNode(member.Name(), diagnostics.X_0_is_declared_but_its_value_is_never_read, c.symbolToString(symbol)))
67726772
}
67736773
case ast.KindConstructor:
@@ -8325,7 +8325,7 @@ func (c *Checker) resolveNewExpression(node *ast.Node, candidatesOutArray *[]*Si
83258325
}
83268326
if expressionType.symbol != nil {
83278327
valueDecl := ast.GetClassLikeDeclarationOfSymbol(expressionType.symbol)
8328-
if valueDecl != nil && HasModifier(valueDecl, ast.ModifierFlagsAbstract) {
8328+
if valueDecl != nil && ast.HasModifier(valueDecl, ast.ModifierFlagsAbstract) {
83298329
c.error(node, diagnostics.Cannot_create_an_instance_of_an_abstract_class)
83308330
return c.resolveErrorCall(node)
83318331
}
@@ -18826,7 +18826,7 @@ func (c *Checker) getIndexInfosOfIndexSymbol(indexSymbol *ast.Symbol, siblingSym
1882618826
}
1882718827
forEachType(c.getTypeFromTypeNode(typeNode), func(keyType *Type) {
1882818828
if c.isValidIndexKeyType(keyType) && findIndexInfo(indexInfos, keyType) == nil {
18829-
indexInfo := c.newIndexInfo(keyType, valueType, HasModifier(declaration, ast.ModifierFlagsReadonly), declaration, nil)
18829+
indexInfo := c.newIndexInfo(keyType, valueType, ast.HasModifier(declaration, ast.ModifierFlagsReadonly), declaration, nil)
1883018830
indexInfos = append(indexInfos, indexInfo)
1883118831
}
1883218832
})
@@ -26746,7 +26746,7 @@ func (c *Checker) markPropertyAsReferenced(prop *ast.Symbol, nodeForCheckWriteOn
2674626746
if prop.Flags&ast.SymbolFlagsClassMember == 0 || prop.ValueDeclaration == nil {
2674726747
return
2674826748
}
26749-
hasPrivateModifier := HasModifier(prop.ValueDeclaration, ast.ModifierFlagsPrivate)
26749+
hasPrivateModifier := ast.HasModifier(prop.ValueDeclaration, ast.ModifierFlagsPrivate)
2675026750
hasPrivateIdentifier := prop.ValueDeclaration.Name() != nil && ast.IsPrivateIdentifier(prop.ValueDeclaration.Name())
2675126751
if !hasPrivateModifier && !hasPrivateIdentifier {
2675226752
return

internal/checker/utilities.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,8 @@ func getSelectedModifierFlags(node *ast.Node, flags ast.ModifierFlags) ast.Modif
7676
return node.ModifierFlags() & flags
7777
}
7878

79-
func HasModifier(node *ast.Node, flags ast.ModifierFlags) bool {
80-
return node.ModifierFlags()&flags != 0
81-
}
82-
8379
func hasReadonlyModifier(node *ast.Node) bool {
84-
return HasModifier(node, ast.ModifierFlagsReadonly)
80+
return ast.HasModifier(node, ast.ModifierFlagsReadonly)
8581
}
8682

8783
func isStaticPrivateIdentifierProperty(s *ast.Symbol) bool {
@@ -405,7 +401,7 @@ func declarationBelongsToPrivateAmbientMember(declaration *ast.Node) bool {
405401
}
406402

407403
func isPrivateWithinAmbient(node *ast.Node) bool {
408-
return (HasModifier(node, ast.ModifierFlagsPrivate) || ast.IsPrivateIdentifierClassElementDeclaration(node)) && node.Flags&ast.NodeFlagsAmbient != 0
404+
return (ast.HasModifier(node, ast.ModifierFlagsPrivate) || ast.IsPrivateIdentifierClassElementDeclaration(node)) && node.Flags&ast.NodeFlagsAmbient != 0
409405
}
410406

411407
func isTypeAssertion(node *ast.Node) bool {

internal/ls/findallreferences.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ func getSymbolScope(symbol *ast.Symbol) *ast.Node {
349349
// If this is private property or method, the scope is the containing class
350350
if symbol.Flags&(ast.SymbolFlagsProperty|ast.SymbolFlagsMethod) != 0 {
351351
privateDeclaration := core.Find(declarations, func(d *ast.Node) bool {
352-
return checker.HasModifier(d, ast.ModifierFlagsPrivate) || ast.IsPrivateIdentifierClassElementDeclaration(d)
352+
return ast.HasModifier(d, ast.ModifierFlagsPrivate) || ast.IsPrivateIdentifierClassElementDeclaration(d)
353353
})
354354
if privateDeclaration != nil {
355355
return ast.FindAncestorKind(privateDeclaration, ast.KindClassDeclaration)

internal/parser/parser.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ func (p *Parser) lookAhead(callback func(p *Parser) bool) bool {
296296

297297
func (p *Parser) nextToken() ast.Kind {
298298
// if the keyword had an escape
299-
if isKeyword(p.token) && (p.scanner.HasUnicodeEscape() || p.scanner.HasExtendedUnicodeEscape()) {
299+
if ast.IsKeyword(p.token) && (p.scanner.HasUnicodeEscape() || p.scanner.HasExtendedUnicodeEscape()) {
300300
// issue a parse error for the escape
301301
p.parseErrorAtCurrentToken(diagnostics.Keywords_cannot_contain_escape_characters)
302302
}
@@ -644,7 +644,7 @@ func (p *Parser) parsingContextErrors(context ParsingContext) {
644644
case PCHeritageClauseElement:
645645
p.parseErrorAtCurrentToken(diagnostics.Expression_expected)
646646
case PCVariableDeclarations:
647-
if isKeyword(p.token) {
647+
if ast.IsKeyword(p.token) {
648648
p.parseErrorAtCurrentToken(diagnostics.X_0_is_not_allowed_as_a_variable_declaration_name, scanner.TokenToString(p.token))
649649
} else {
650650
p.parseErrorAtCurrentToken(diagnostics.Variable_declaration_expected)
@@ -662,7 +662,7 @@ func (p *Parser) parsingContextErrors(context ParsingContext) {
662662
case PCJSDocParameters:
663663
p.parseErrorAtCurrentToken(diagnostics.Parameter_declaration_expected)
664664
case PCParameters:
665-
if isKeyword(p.token) {
665+
if ast.IsKeyword(p.token) {
666666
p.parseErrorAtCurrentToken(diagnostics.X_0_is_not_allowed_as_a_parameter_name, scanner.TokenToString(p.token))
667667
} else {
668668
p.parseErrorAtCurrentToken(diagnostics.Parameter_declaration_expected)
@@ -2338,7 +2338,7 @@ func (p *Parser) parseModuleExportName(disallowKeywords bool) (node *ast.Node, n
23382338
if p.token == ast.KindStringLiteral {
23392339
return p.parseLiteralExpression(false /*intern*/), nameOk
23402340
}
2341-
if disallowKeywords && isKeyword(p.token) && !p.isIdentifier() {
2341+
if disallowKeywords && ast.IsKeyword(p.token) && !p.isIdentifier() {
23422342
nameOk = false
23432343
}
23442344
return p.parseIdentifierName(), nameOk
@@ -5815,7 +5815,7 @@ func (p *Parser) scanClassMemberStart() bool {
58155815
// If we were able to get any potential identifier...
58165816
if idToken != ast.KindUnknown {
58175817
// If we have a non-keyword identifier, or if we have an accessor, then it's safe to parse.
5818-
if !isKeyword(idToken) || idToken == ast.KindSetKeyword || idToken == ast.KindGetKeyword {
5818+
if !ast.IsKeyword(idToken) || idToken == ast.KindSetKeyword || idToken == ast.KindGetKeyword {
58195819
return true
58205820
}
58215821
// If it *is* a keyword, but not an accessor, check a little farther along
@@ -6215,10 +6215,6 @@ func (p *Parser) skipRangeTrivia(textRange core.TextRange) core.TextRange {
62156215
return core.NewTextRange(scanner.SkipTrivia(p.sourceText, textRange.Pos()), textRange.End())
62166216
}
62176217

6218-
func isKeyword(token ast.Kind) bool {
6219-
return ast.KindFirstKeyword <= token && token <= ast.KindLastKeyword
6220-
}
6221-
62226218
func isReservedWord(token ast.Kind) bool {
62236219
return ast.KindFirstReservedWord <= token && token <= ast.KindLastReservedWord
62246220
}

0 commit comments

Comments
 (0)