Skip to content

Commit 8b95466

Browse files
authored
Support emit for parameter property initializers (microsoft#479)
1 parent d508afb commit 8b95466

File tree

7 files changed

+412
-81
lines changed

7 files changed

+412
-81
lines changed

internal/ast/ast.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2496,6 +2496,10 @@ func (node *TryStatement) Clone(f *NodeFactory) *Node {
24962496
return cloneNode(f.NewTryStatement(node.TryBlock, node.CatchClause, node.FinallyBlock), node.AsNode(), f.hooks)
24972497
}
24982498

2499+
func IsTryStatement(node *Node) bool {
2500+
return node.Kind == KindTryStatement
2501+
}
2502+
24992503
// CatchClause
25002504

25012505
type CatchClause struct {

internal/ast/utilities.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,6 +1495,50 @@ func GetContainingClass(node *Node) *Node {
14951495
return FindAncestor(node.Parent, IsClassLike)
14961496
}
14971497

1498+
func GetExtendsHeritageClauseElement(node *Node) *ExpressionWithTypeArgumentsNode {
1499+
return core.FirstOrNil(GetExtendsHeritageClauseElements(node))
1500+
}
1501+
1502+
func GetExtendsHeritageClauseElements(node *Node) []*ExpressionWithTypeArgumentsNode {
1503+
return getHeritageElements(node, KindExtendsKeyword)
1504+
}
1505+
1506+
func GetImplementsHeritageClauseElements(node *Node) []*ExpressionWithTypeArgumentsNode {
1507+
return getHeritageElements(node, KindImplementsKeyword)
1508+
}
1509+
1510+
func getHeritageElements(node *Node, kind Kind) []*Node {
1511+
clause := getHeritageClause(node, kind)
1512+
if clause != nil {
1513+
return clause.AsHeritageClause().Types.Nodes
1514+
}
1515+
return nil
1516+
}
1517+
1518+
func getHeritageClause(node *Node, kind Kind) *Node {
1519+
clauses := getHeritageClauses(node)
1520+
if clauses != nil {
1521+
for _, clause := range clauses.Nodes {
1522+
if clause.AsHeritageClause().Token == kind {
1523+
return clause
1524+
}
1525+
}
1526+
}
1527+
return nil
1528+
}
1529+
1530+
func getHeritageClauses(node *Node) *NodeList {
1531+
switch node.Kind {
1532+
case KindClassDeclaration:
1533+
return node.AsClassDeclaration().HeritageClauses
1534+
case KindClassExpression:
1535+
return node.AsClassExpression().HeritageClauses
1536+
case KindInterfaceDeclaration:
1537+
return node.AsInterfaceDeclaration().HeritageClauses
1538+
}
1539+
return nil
1540+
}
1541+
14981542
func IsPartOfTypeQuery(node *Node) bool {
14991543
for node.Kind == KindQualifiedName || node.Kind == KindIdentifier {
15001544
node = node.Parent
@@ -1844,6 +1888,10 @@ func isJSXTagName(node *Node) bool {
18441888
return false
18451889
}
18461890

1891+
func IsSuperCall(node *Node) bool {
1892+
return IsCallExpression(node) && node.AsCallExpression().Expression.Kind == KindSuperKeyword
1893+
}
1894+
18471895
func IsImportCall(node *Node) bool {
18481896
return IsCallExpression(node) && node.AsCallExpression().Expression.Kind == KindImportKeyword
18491897
}

internal/checker/checker.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2526,7 +2526,7 @@ func (c *Checker) checkConstructorDeclaration(node *ast.Node) {
25262526
// Constructors of classes with no extends clause may not contain super calls, whereas
25272527
// constructors of derived classes must contain at least one super call somewhere in their function body.
25282528
containingClassDecl := node.Parent
2529-
if getExtendsTypeNode(containingClassDecl) == nil {
2529+
if ast.GetExtendsHeritageClauseElement(containingClassDecl) == nil {
25302530
return
25312531
}
25322532
classExtendsNull := c.classDeclarationExtendsNull(containingClassDecl)
@@ -3937,7 +3937,7 @@ func (c *Checker) checkClassLikeDeclaration(node *ast.Node) {
39373937
c.checkTypeParameterListsIdentical(symbol)
39383938
c.checkFunctionOrConstructorSymbol(symbol)
39393939
c.checkObjectTypeForDuplicateDeclarations(node, true /*checkPrivateNames*/)
3940-
baseTypeNode := getExtendsTypeNode(node)
3940+
baseTypeNode := ast.GetExtendsHeritageClauseElement(node)
39413941
if baseTypeNode != nil {
39423942
c.checkSourceElements(baseTypeNode.TypeArguments())
39433943
baseTypes := c.getBaseTypes(classType)
@@ -3988,7 +3988,7 @@ func (c *Checker) checkClassLikeDeclaration(node *ast.Node) {
39883988
}
39893989
}
39903990
c.checkMembersForOverrideModifier(node, classType, typeWithThis, staticType)
3991-
implementedTypeNodes := getImplementsTypeNodes(node)
3991+
implementedTypeNodes := ast.GetImplementsHeritageClauseElements(node)
39923992
for _, typeRefNode := range implementedTypeNodes {
39933993
expr := typeRefNode.Expression()
39943994
if !ast.IsEntityNameExpression(expr) || ast.IsOptionalChain(expr) {
@@ -4308,7 +4308,7 @@ func (c *Checker) isPropertyAbstractOrInterface(declaration *ast.Node, baseDecla
43084308

43094309
func (c *Checker) checkMembersForOverrideModifier(node *ast.Node, t *Type, typeWithThis *Type, staticType *Type) {
43104310
var baseWithThis *Type
4311-
baseTypeNode := getExtendsTypeNode(node)
4311+
baseTypeNode := ast.GetExtendsHeritageClauseElement(node)
43124312
if baseTypeNode != nil {
43134313
baseTypes := c.getBaseTypes(t)
43144314
if len(baseTypes) > 0 {
@@ -4611,7 +4611,7 @@ func (c *Checker) checkInterfaceDeclaration(node *ast.Node) {
46114611
}
46124612
}
46134613
c.checkObjectTypeForDuplicateDeclarations(node, false /*checkPrivateNames*/)
4614-
for _, heritageElement := range getExtendsTypeNodes(node) {
4614+
for _, heritageElement := range ast.GetExtendsHeritageClauseElements(node) {
46154615
expr := heritageElement.Expression()
46164616
if !ast.IsEntityNameExpression(expr) || ast.IsOptionalChain(expr) {
46174617
c.error(expr, diagnostics.An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments)
@@ -7336,7 +7336,7 @@ func (c *Checker) checkSuperExpression(node *ast.Node) *Type {
73367336
}
73377337
// at this point the only legal case for parent is ClassLikeDeclaration
73387338
classLikeDeclaration := container.Parent
7339-
if getExtendsTypeNode(classLikeDeclaration) == nil {
7339+
if ast.GetExtendsHeritageClauseElement(classLikeDeclaration) == nil {
73407340
c.error(node, diagnostics.X_super_can_only_be_referenced_in_a_derived_class)
73417341
return c.errorType
73427342
}
@@ -7871,7 +7871,7 @@ func (c *Checker) resolveCallExpression(node *ast.Node, candidatesOutArray *[]*S
78717871
if !c.isErrorType(superType) {
78727872
// In super call, the candidate signatures are the matching arity signatures of the base constructor function instantiated
78737873
// with the type arguments specified in the extends clause.
7874-
baseTypeNode := getExtendsTypeNode(ast.GetContainingClass(node))
7874+
baseTypeNode := ast.GetExtendsHeritageClauseElement(ast.GetContainingClass(node))
78757875
if baseTypeNode != nil {
78767876
baseConstructors := c.getInstantiatedConstructorsForTypeArguments(superType, baseTypeNode.TypeArguments(), baseTypeNode)
78777877
return c.resolveCall(node, baseConstructors, candidatesOutArray, checkMode, SignatureFlagsNone, nil)
@@ -11422,7 +11422,7 @@ func (c *Checker) checkThisInStaticClassFieldInitializerInDecoratedClass(thisExp
1142211422

1142311423
func (c *Checker) checkThisBeforeSuper(node *ast.Node, container *ast.Node, diagnosticMessage *diagnostics.Message) {
1142411424
containingClassDecl := container.Parent
11425-
baseTypeNode := getExtendsTypeNode(containingClassDecl)
11425+
baseTypeNode := ast.GetExtendsHeritageClauseElement(containingClassDecl)
1142611426
// If a containing class does not have extends clause or the class extends null
1142711427
// skip checking whether super statement is called before "this" accessing.
1142811428
if baseTypeNode != nil && !c.classDeclarationExtendsNull(containingClassDecl) {
@@ -15740,7 +15740,7 @@ func (c *Checker) isThislessInterface(symbol *ast.Symbol) bool {
1574015740
if declaration.Flags&ast.NodeFlagsContainsThis != 0 {
1574115741
return false
1574215742
}
15743-
baseTypeNodes := getExtendsTypeNodes(declaration)
15743+
baseTypeNodes := ast.GetExtendsHeritageClauseElements(declaration)
1574415744
for _, node := range baseTypeNodes {
1574515745
if ast.IsEntityNameExpression(node.Expression()) {
1574615746
baseSymbol := c.resolveEntityName(node.Expression(), ast.SymbolFlagsType, true /*ignoreErrors*/, false, nil)
@@ -17453,7 +17453,7 @@ func (c *Checker) resolveBaseTypesOfClass(t *Type) {
1745317453
func getBaseTypeNodeOfClass(t *Type) *ast.Node {
1745417454
decl := getClassLikeDeclarationOfSymbol(t.symbol)
1745517455
if decl != nil {
17456-
return getExtendsTypeNode(decl)
17456+
return ast.GetExtendsHeritageClauseElement(decl)
1745717457
}
1745817458
return nil
1745917459
}
@@ -17687,7 +17687,7 @@ func (c *Checker) resolveBaseTypesOfInterface(t *Type) {
1768717687
data := t.AsInterfaceType()
1768817688
for _, declaration := range t.symbol.Declarations {
1768917689
if ast.IsInterfaceDeclaration(declaration) {
17690-
for _, node := range getExtendsTypeNodes(declaration) {
17690+
for _, node := range ast.GetExtendsHeritageClauseElements(declaration) {
1769117691
baseType := c.getReducedType(c.getTypeFromTypeNode(node))
1769217692
if !c.isErrorType(baseType) {
1769317693
if c.isValidBaseType(baseType) {

internal/checker/utilities.go

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1273,50 +1273,6 @@ func parameterIsThisKeyword(parameter *ast.Node) bool {
12731273
return ast.IsThisParameter(parameter)
12741274
}
12751275

1276-
func getExtendsTypeNode(node *ast.Node) *ast.Node {
1277-
return core.FirstOrNil(getExtendsTypeNodes(node))
1278-
}
1279-
1280-
func getExtendsTypeNodes(node *ast.Node) []*ast.Node {
1281-
return getHeritageTypeNodes(node, ast.KindExtendsKeyword)
1282-
}
1283-
1284-
func getImplementsTypeNodes(node *ast.Node) []*ast.Node {
1285-
return getHeritageTypeNodes(node, ast.KindImplementsKeyword)
1286-
}
1287-
1288-
func getHeritageTypeNodes(node *ast.Node, kind ast.Kind) []*ast.Node {
1289-
clause := getHeritageClause(node, kind)
1290-
if clause != nil {
1291-
return clause.AsHeritageClause().Types.Nodes
1292-
}
1293-
return nil
1294-
}
1295-
1296-
func getHeritageClause(node *ast.Node, kind ast.Kind) *ast.Node {
1297-
clauses := getHeritageClauses(node)
1298-
if clauses != nil {
1299-
for _, clause := range clauses.Nodes {
1300-
if clause.AsHeritageClause().Token == kind {
1301-
return clause
1302-
}
1303-
}
1304-
}
1305-
return nil
1306-
}
1307-
1308-
func getHeritageClauses(node *ast.Node) *ast.NodeList {
1309-
switch node.Kind {
1310-
case ast.KindClassDeclaration:
1311-
return node.AsClassDeclaration().HeritageClauses
1312-
case ast.KindClassExpression:
1313-
return node.AsClassExpression().HeritageClauses
1314-
case ast.KindInterfaceDeclaration:
1315-
return node.AsInterfaceDeclaration().HeritageClauses
1316-
}
1317-
return nil
1318-
}
1319-
13201276
func isObjectOrArrayLiteralType(t *Type) bool {
13211277
return t.objectFlags&(ObjectFlagsObjectLiteral|ObjectFlagsArrayLiteral) != 0
13221278
}

0 commit comments

Comments
 (0)