(pos int, jsdoc jsdocScannerInfo, modifiers *ast.ModifierList, kind ast.Kind)
| 1746 | } |
| 1747 | |
| 1748 | func (p *Parser) parseClassDeclarationOrExpression(pos int, jsdoc jsdocScannerInfo, modifiers *ast.ModifierList, kind ast.Kind) *ast.Node { |
| 1749 | saveContextFlags := p.contextFlags |
| 1750 | saveHasAwaitIdentifier := p.statementHasAwaitIdentifier |
| 1751 | p.parseExpected(ast.KindClassKeyword) |
| 1752 | // We don't parse the name here in await context, instead we will report a grammar error in the checker. |
| 1753 | name := p.parseNameOfClassDeclarationOrExpression() |
| 1754 | typeParameters := p.parseTypeParameters() |
| 1755 | if modifiers != nil && core.Some(modifiers.Nodes, isExportModifier) { |
| 1756 | p.setContextFlags(ast.NodeFlagsAwaitContext, true /*value*/) |
| 1757 | } |
| 1758 | heritageClauses := p.parseHeritageClauses() |
| 1759 | var members *ast.NodeList |
| 1760 | if p.parseExpected(ast.KindOpenBraceToken) { |
| 1761 | // ClassTail[Yield,Await] : (Modified) See 14.5 |
| 1762 | // ClassHeritage[?Yield,?Await]opt { ClassBody[?Yield,?Await]opt } |
| 1763 | members = p.parseList(PCClassMembers, (*Parser).parseClassElement) |
| 1764 | p.parseExpected(ast.KindCloseBraceToken) |
| 1765 | } else { |
| 1766 | members = p.createMissingList() |
| 1767 | } |
| 1768 | p.contextFlags = saveContextFlags |
| 1769 | var result *ast.Node |
| 1770 | if modifiers != nil && ast.ModifiersToFlags(modifiers.Nodes)&ast.ModifierFlagsAmbient != 0 { |
| 1771 | p.statementHasAwaitIdentifier = saveHasAwaitIdentifier |
| 1772 | } |
| 1773 | if kind == ast.KindClassDeclaration { |
| 1774 | result = p.factory.NewClassDeclaration(modifiers, name, typeParameters, heritageClauses, members) |
| 1775 | } else { |
| 1776 | result = p.factory.NewClassExpression(modifiers, name, typeParameters, heritageClauses, members) |
| 1777 | } |
| 1778 | p.finishNode(result, pos) |
| 1779 | p.withJSDoc(result, jsdoc) |
| 1780 | if result.Flags&ast.NodeFlagsJavaScriptFile != 0 { |
| 1781 | p.checkJSSyntax(result) |
| 1782 | if heritageClauses != nil { |
| 1783 | for _, clause := range heritageClauses.Nodes { |
| 1784 | if clause.AsHeritageClause().Token == ast.KindExtendsKeyword { |
| 1785 | for _, expr := range clause.AsHeritageClause().Types.Nodes { |
| 1786 | p.checkJSSyntax(expr) |
| 1787 | } |
| 1788 | } |
| 1789 | } |
| 1790 | } |
| 1791 | } |
| 1792 | return result |
| 1793 | } |
| 1794 | |
| 1795 | func (p *Parser) parseNameOfClassDeclarationOrExpression() *ast.Node { |
| 1796 | // implements is a future reserved word so |
no test coverage detected