Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(311)

Side by Side Diff: src/parsing/parser.cc

Issue 1871923003: Add parsing for ambient declarations (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@types-devel
Patch Set: Minor fixes to address code review comments Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast/ast.h" 8 #include "src/ast/ast.h"
9 #include "src/ast/ast-expression-rewriter.h" 9 #include "src/ast/ast-expression-rewriter.h"
10 #include "src/ast/ast-expression-visitor.h" 10 #include "src/ast/ast-expression-visitor.h"
(...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 int function_token_position, FunctionLiteral::FunctionType type, 752 int function_token_position, FunctionLiteral::FunctionType type,
753 LanguageMode language_mode, typesystem::TypeFlags type_flags, bool* ok) { 753 LanguageMode language_mode, typesystem::TypeFlags type_flags, bool* ok) {
754 return parser_->ParseFunctionLiteral( 754 return parser_->ParseFunctionLiteral(
755 name, function_name_location, function_name_validity, kind, 755 name, function_name_location, function_name_validity, kind,
756 function_token_position, type, language_mode, type_flags, ok); 756 function_token_position, type, language_mode, type_flags, ok);
757 } 757 }
758 758
759 759
760 ClassLiteral* ParserTraits::ParseClassLiteral( 760 ClassLiteral* ParserTraits::ParseClassLiteral(
761 const AstRawString* name, Scanner::Location class_name_location, 761 const AstRawString* name, Scanner::Location class_name_location,
762 bool name_is_strict_reserved, int pos, bool* ok) { 762 bool name_is_strict_reserved, int pos, bool ambient, bool* ok) {
763 return parser_->ParseClassLiteral(name, class_name_location, 763 return parser_->ParseClassLiteral(name, class_name_location,
764 name_is_strict_reserved, pos, ok); 764 name_is_strict_reserved, pos, ambient, ok);
765 } 765 }
766 766
767 767
768 Parser::Parser(ParseInfo* info) 768 Parser::Parser(ParseInfo* info)
769 : ParserBase<ParserTraits>(info->zone(), &scanner_, info->stack_limit(), 769 : ParserBase<ParserTraits>(info->zone(), &scanner_, info->stack_limit(),
770 info->extension(), info->ast_value_factory(), 770 info->extension(), info->ast_value_factory(),
771 NULL, this), 771 NULL, this),
772 scanner_(info->unicode_cache()), 772 scanner_(info->unicode_cache()),
773 reusable_preparser_(NULL), 773 reusable_preparser_(NULL),
774 original_scope_(NULL), 774 original_scope_(NULL),
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 return 0; 1265 return 0;
1266 } 1266 }
1267 1267
1268 1268
1269 Statement* Parser::ParseStatementListItem(bool* ok) { 1269 Statement* Parser::ParseStatementListItem(bool* ok) {
1270 // (Ecma 262 6th Edition, 13.1): 1270 // (Ecma 262 6th Edition, 13.1):
1271 // StatementListItem: 1271 // StatementListItem:
1272 // Statement 1272 // Statement
1273 // Declaration 1273 // Declaration
1274 1274
1275 // Allow ambient variable, function, and class declarations.
1276 bool ambient =
1277 scope_->typed() && CheckContextualKeyword(CStrVector("declare"));
1278 if (ambient && !scope_->is_toplevel_scope()) {
1279 *ok = false;
1280 ReportMessage(MessageTemplate::kIllegalDeclare);
1281 return nullptr;
1282 }
1275 switch (peek()) { 1283 switch (peek()) {
1276 case Token::FUNCTION: 1284 case Token::FUNCTION:
1277 return ParseFunctionDeclaration(NULL, ok); 1285 return ParseFunctionDeclaration(NULL, ambient, ok);
1278 case Token::CLASS: 1286 case Token::CLASS:
1279 Consume(Token::CLASS); 1287 Consume(Token::CLASS);
1280 return ParseClassDeclaration(NULL, ok); 1288 return ParseClassDeclaration(NULL, ambient, ok);
1281 case Token::CONST: 1289 case Token::CONST:
1282 if (allow_const()) { 1290 if (allow_const()) {
1283 return ParseVariableStatement(kStatementListItem, NULL, ok); 1291 return ParseVariableStatement(kStatementListItem, NULL, ambient, ok);
1284 } 1292 }
1285 break; 1293 break;
1286 case Token::VAR: 1294 case Token::VAR:
1287 return ParseVariableStatement(kStatementListItem, NULL, ok); 1295 return ParseVariableStatement(kStatementListItem, NULL, ambient, ok);
1288 case Token::LET: 1296 case Token::LET:
1289 if (IsNextLetKeyword()) { 1297 if (IsNextLetKeyword()) {
1290 return ParseVariableStatement(kStatementListItem, NULL, ok); 1298 return ParseVariableStatement(kStatementListItem, NULL, ambient, ok);
1291 } 1299 }
1292 break; 1300 break;
1293 case Token::IDENTIFIER: 1301 case Token::IDENTIFIER:
1294 case Token::FUTURE_STRICT_RESERVED_WORD: { 1302 case Token::FUTURE_STRICT_RESERVED_WORD: {
1295 if (!scope_->typed()) break; 1303 if (!scope_->typed() || ambient) break;
1296 int pos = peek_position(); 1304 int pos = peek_position();
1297 if (CheckContextualKeyword(CStrVector("type"))) { 1305 if (CheckContextualKeyword(CStrVector("type"))) {
1298 return ParseTypeAliasDeclaration(pos, ok); 1306 return ParseTypeAliasDeclaration(pos, ok);
1299 } else if (CheckContextualKeyword(CStrVector("interface"))) { 1307 } else if (CheckContextualKeyword(CStrVector("interface"))) {
1300 return ParseInterfaceDeclaration(pos, ok); 1308 return ParseInterfaceDeclaration(pos, ok);
1301 } 1309 }
1302 break; 1310 break;
1303 } 1311 }
1304 // TODO(nikolaos): ambient
1305 default: 1312 default:
1306 break; 1313 break;
1307 } 1314 }
1315 if (ambient) {
1316 *ok = false;
1317 ReportMessageAt(scanner()->peek_location(),
1318 MessageTemplate::kBadAmbientDeclaration);
1319 return nullptr;
1320 }
1308 return ParseStatement(NULL, kAllowLabelledFunctionStatement, ok); 1321 return ParseStatement(NULL, kAllowLabelledFunctionStatement, ok);
1309 } 1322 }
1310 1323
1311 1324
1312 Statement* Parser::ParseModuleItem(bool* ok) { 1325 Statement* Parser::ParseModuleItem(bool* ok) {
1313 // (Ecma 262 6th Edition, 15.2): 1326 // (Ecma 262 6th Edition, 15.2):
1314 // ModuleItem : 1327 // ModuleItem :
1315 // ImportDeclaration 1328 // ImportDeclaration
1316 // ExportDeclaration 1329 // ExportDeclaration
1317 // StatementListItem 1330 // StatementListItem
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
1606 // 'export' 'default' ClassDeclaration 1619 // 'export' 'default' ClassDeclaration
1607 // 'export' 'default' AssignmentExpression[In] ';' 1620 // 'export' 'default' AssignmentExpression[In] ';'
1608 1621
1609 Expect(Token::DEFAULT, CHECK_OK); 1622 Expect(Token::DEFAULT, CHECK_OK);
1610 Scanner::Location default_loc = scanner()->location(); 1623 Scanner::Location default_loc = scanner()->location();
1611 1624
1612 const AstRawString* default_string = ast_value_factory()->default_string(); 1625 const AstRawString* default_string = ast_value_factory()->default_string();
1613 ZoneList<const AstRawString*> names(1, zone()); 1626 ZoneList<const AstRawString*> names(1, zone());
1614 Statement* result = nullptr; 1627 Statement* result = nullptr;
1615 Expression* default_export = nullptr; 1628 Expression* default_export = nullptr;
1629
1630 // Allow ambient function and class declarations to be exported as default.
1631 int ambient_pos = peek_position();
1632 bool ambient =
1633 scope_->typed() && CheckContextualKeyword(CStrVector("declare"));
1634
1616 switch (peek()) { 1635 switch (peek()) {
1617 case Token::FUNCTION: { 1636 case Token::FUNCTION: {
1618 Consume(Token::FUNCTION); 1637 Consume(Token::FUNCTION);
1619 int pos = position(); 1638 int pos = position();
1620 bool is_generator = Check(Token::MUL); 1639 bool is_generator = Check(Token::MUL);
1621 if (peek() == Token::LPAREN || (scope_->typed() && Check(Token::LT))) { 1640 if (peek() == Token::LPAREN || (scope_->typed() && peek() == Token::LT)) {
1622 // FunctionDeclaration[+Default] :: 1641 // FunctionDeclaration[+Default] ::
1623 // 'function' '(' FormalParameters ')' '{' FunctionBody '}' 1642 // 'function' '(' FormalParameters ')' '{' FunctionBody '}'
1624 // 1643 //
1625 // GeneratorDeclaration[+Default] :: 1644 // GeneratorDeclaration[+Default] ::
1626 // 'function' '*' '(' FormalParameters ')' '{' FunctionBody '}' 1645 // 'function' '*' '(' FormalParameters ')' '{' FunctionBody '}'
1627 default_export = ParseFunctionLiteral( 1646 typesystem::TypeFlags type_flags =
1628 default_string, Scanner::Location::invalid(), 1647 ambient ? typesystem::kAmbient : typesystem::kAllowSignature;
1629 kSkipFunctionNameCheck, 1648 default_export =
1630 is_generator ? FunctionKind::kGeneratorFunction 1649 ParseFunctionLiteral(default_string, Scanner::Location::invalid(),
1631 : FunctionKind::kNormalFunction, 1650 kSkipFunctionNameCheck,
1632 pos, FunctionLiteral::kDeclaration, language_mode(), 1651 is_generator ? FunctionKind::kGeneratorFunction
1633 typesystem::kAllowSignature, CHECK_OK); 1652 : FunctionKind::kNormalFunction,
1653 pos, FunctionLiteral::kDeclaration,
1654 language_mode(), type_flags, CHECK_OK);
1634 result = factory()->NewEmptyStatement(RelocInfo::kNoPosition); 1655 result = factory()->NewEmptyStatement(RelocInfo::kNoPosition);
1635 } else { 1656 } else {
1636 result = ParseFunctionDeclaration(pos, is_generator, &names, CHECK_OK); 1657 result = ParseFunctionDeclaration(pos, is_generator, &names, ambient,
1658 CHECK_OK);
1637 } 1659 }
1638 break; 1660 break;
1639 } 1661 }
1640 1662
1641 case Token::CLASS: 1663 case Token::CLASS:
1642 Consume(Token::CLASS); 1664 Consume(Token::CLASS);
1643 if (peek() == Token::EXTENDS || peek() == Token::LBRACE) { 1665 if (peek() == Token::EXTENDS || peek() == Token::LBRACE) {
1644 // ClassDeclaration[+Default] :: 1666 // ClassDeclaration[+Default] ::
1645 // 'class' ('extends' LeftHandExpression)? '{' ClassBody '}' 1667 // 'class' ('extends' LeftHandExpression)? '{' ClassBody '}'
1646 default_export = 1668 default_export =
1647 ParseClassLiteral(default_string, Scanner::Location::invalid(), 1669 ParseClassLiteral(default_string, Scanner::Location::invalid(),
1648 false, position(), CHECK_OK); 1670 false, position(), ambient, CHECK_OK);
1649 result = factory()->NewEmptyStatement(RelocInfo::kNoPosition); 1671 result = factory()->NewEmptyStatement(RelocInfo::kNoPosition);
1650 } else { 1672 } else {
1651 result = ParseClassDeclaration(&names, CHECK_OK); 1673 result = ParseClassDeclaration(&names, ambient, CHECK_OK);
1652 } 1674 }
1653 break; 1675 break;
1654 1676
1655 default: { 1677 default: {
1678 if (ambient) {
1679 *ok = false;
1680 ReportMessageAt(scanner()->peek_location(),
1681 MessageTemplate::kBadAmbientDeclaration);
1682 return nullptr;
1683 }
1684
1656 int pos = peek_position(); 1685 int pos = peek_position();
1657 ExpressionClassifier classifier(this); 1686 ExpressionClassifier classifier(this);
1658 Expression* expr = ParseAssignmentExpression(true, &classifier, CHECK_OK); 1687 Expression* expr = ParseAssignmentExpression(true, &classifier, CHECK_OK);
1659 RewriteNonPattern(&classifier, CHECK_OK); 1688 RewriteNonPattern(&classifier, CHECK_OK);
1660 1689
1661 ExpectSemicolon(CHECK_OK); 1690 ExpectSemicolon(CHECK_OK);
1662 result = factory()->NewExpressionStatement(expr, pos); 1691 result = factory()->NewExpressionStatement(expr, pos);
1663 break; 1692 break;
1664 } 1693 }
1665 } 1694 }
1666 1695
1696 // Exported ambients are not checked.
1697 if (ambient) return factory()->NewEmptyStatement(ambient_pos);
1698
1667 DCHECK_LE(names.length(), 1); 1699 DCHECK_LE(names.length(), 1);
1668 if (names.length() == 1) { 1700 if (names.length() == 1) {
1669 scope_->module()->AddLocalExport(default_string, names.first(), zone(), ok); 1701 scope_->module()->AddLocalExport(default_string, names.first(), zone(), ok);
1670 if (!*ok) { 1702 if (!*ok) {
1671 ParserTraits::ReportMessageAt( 1703 ParserTraits::ReportMessageAt(
1672 default_loc, MessageTemplate::kDuplicateExport, default_string); 1704 default_loc, MessageTemplate::kDuplicateExport, default_string);
1673 return nullptr; 1705 return nullptr;
1674 } 1706 }
1675 } else { 1707 } else {
1676 // TODO(ES6): Assign result to a const binding with the name "*default*" 1708 // TODO(ES6): Assign result to a const binding with the name "*default*"
1677 // and add an export entry with "*default*" as the local name. 1709 // and add an export entry with "*default*" as the local name.
1678 USE(default_export); 1710 USE(default_export);
1679 } 1711 }
1680 1712
1681 return result; 1713 return result;
1682 } 1714 }
1683 1715
1684 1716
1685 Statement* Parser::ParseExportDeclaration(bool* ok) { 1717 Statement* Parser::ParseExportDeclaration(bool* ok) {
1686 // ExportDeclaration: 1718 // ExportDeclaration:
1687 // 'export' '*' 'from' ModuleSpecifier ';' 1719 // 'export' '*' 'from' ModuleSpecifier ';'
1688 // 'export' ExportClause ('from' ModuleSpecifier)? ';' 1720 // 'export' ExportClause ('from' ModuleSpecifier)? ';'
1689 // 'export' VariableStatement 1721 // 'export' VariableStatement
1690 // 'export' Declaration 1722 // 'export' Declaration
1691 // 'export' 'default' ... (handled in ParseExportDefault) 1723 // 'export' 'default' ... (handled in ParseExportDefault)
1692 1724
1693 int pos = peek_position(); 1725 int pos = peek_position();
1694 Expect(Token::EXPORT, CHECK_OK); 1726 Expect(Token::EXPORT, CHECK_OK);
1695 1727
1728 // Allow exported ambient variable, function, and class declarations.
1729 bool ambient =
1730 scope_->typed() && CheckContextualKeyword(CStrVector("declare"));
1731
1696 Statement* result = NULL; 1732 Statement* result = NULL;
1697 ZoneList<const AstRawString*> names(1, zone()); 1733 ZoneList<const AstRawString*> names(1, zone());
1734 if (ambient && (peek() == Token::DEFAULT || peek() == Token::MUL ||
1735 peek() == Token::LBRACE)) {
1736 *ok = false;
1737 ReportMessageAt(scanner()->peek_location(),
1738 MessageTemplate::kBadAmbientDeclaration);
1739 return nullptr;
1740 }
1698 switch (peek()) { 1741 switch (peek()) {
1699 case Token::DEFAULT: 1742 case Token::DEFAULT:
1700 return ParseExportDefault(ok); 1743 return ParseExportDefault(ok);
1701 1744
1702 case Token::MUL: { 1745 case Token::MUL: {
1703 Consume(Token::MUL); 1746 Consume(Token::MUL);
1704 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); 1747 ExpectContextualKeyword(CStrVector("from"), CHECK_OK);
1705 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK); 1748 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK);
1706 scope_->module()->AddModuleRequest(module_specifier, zone()); 1749 scope_->module()->AddModuleRequest(module_specifier, zone());
1707 // TODO(ES6): scope_->module()->AddStarExport(...) 1750 // TODO(ES6): scope_->module()->AddStarExport(...)
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1755 scope_->module()->AddModuleRequest(indirect_export_module_specifier, 1798 scope_->module()->AddModuleRequest(indirect_export_module_specifier,
1756 zone()); 1799 zone());
1757 for (int i = 0; i < length; ++i) { 1800 for (int i = 0; i < length; ++i) {
1758 // TODO(ES6): scope_->module()->AddIndirectExport(...);( 1801 // TODO(ES6): scope_->module()->AddIndirectExport(...);(
1759 } 1802 }
1760 } 1803 }
1761 return factory()->NewEmptyStatement(pos); 1804 return factory()->NewEmptyStatement(pos);
1762 } 1805 }
1763 1806
1764 case Token::FUNCTION: 1807 case Token::FUNCTION:
1765 result = ParseFunctionDeclaration(&names, CHECK_OK); 1808 result = ParseFunctionDeclaration(&names, ambient, CHECK_OK);
1766 break; 1809 break;
1767 1810
1768 case Token::CLASS: 1811 case Token::CLASS:
1769 Consume(Token::CLASS); 1812 Consume(Token::CLASS);
1770 result = ParseClassDeclaration(&names, CHECK_OK); 1813 result = ParseClassDeclaration(&names, ambient, CHECK_OK);
1771 break; 1814 break;
1772 1815
1773 case Token::VAR: 1816 case Token::VAR:
1774 case Token::LET: 1817 case Token::LET:
1775 case Token::CONST: 1818 case Token::CONST:
1776 result = ParseVariableStatement(kStatementListItem, &names, CHECK_OK); 1819 result =
1820 ParseVariableStatement(kStatementListItem, &names, ambient, CHECK_OK);
1777 break; 1821 break;
1778 1822
1779 default: 1823 default:
1780 *ok = false; 1824 *ok = false;
1781 ReportUnexpectedToken(scanner()->current_token()); 1825 ReportUnexpectedToken(scanner()->current_token());
1782 return NULL; 1826 return NULL;
1783 } 1827 }
1784 1828
1829 // Exported ambients are not checked.
1830 if (ambient) return factory()->NewEmptyStatement(pos);
1831
1785 // Extract declared names into export declarations. 1832 // Extract declared names into export declarations.
1786 ModuleDescriptor* descriptor = scope_->module(); 1833 ModuleDescriptor* descriptor = scope_->module();
1787 for (int i = 0; i < names.length(); ++i) { 1834 for (int i = 0; i < names.length(); ++i) {
1788 descriptor->AddLocalExport(names[i], names[i], zone(), ok); 1835 descriptor->AddLocalExport(names[i], names[i], zone(), ok);
1789 if (!*ok) { 1836 if (!*ok) {
1790 // TODO(adamk): Possibly report this error at the right place. 1837 // TODO(adamk): Possibly report this error at the right place.
1791 ParserTraits::ReportMessage(MessageTemplate::kDuplicateExport, names[i]); 1838 ParserTraits::ReportMessage(MessageTemplate::kDuplicateExport, names[i]);
1792 return NULL; 1839 return NULL;
1793 } 1840 }
1794 } 1841 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1892 is_strict(language_mode()) 1939 is_strict(language_mode())
1893 ? MessageTemplate::kStrictFunction 1940 ? MessageTemplate::kStrictFunction
1894 : MessageTemplate::kSloppyFunction); 1941 : MessageTemplate::kSloppyFunction);
1895 *ok = false; 1942 *ok = false;
1896 return nullptr; 1943 return nullptr;
1897 1944
1898 case Token::DEBUGGER: 1945 case Token::DEBUGGER:
1899 return ParseDebuggerStatement(ok); 1946 return ParseDebuggerStatement(ok);
1900 1947
1901 case Token::VAR: 1948 case Token::VAR:
1902 return ParseVariableStatement(kStatement, NULL, ok); 1949 return ParseVariableStatement(kStatement, NULL, false, ok);
1903 1950
1904 default: 1951 default:
1905 return ParseExpressionOrLabelledStatement(labels, allow_function, ok); 1952 return ParseExpressionOrLabelledStatement(labels, allow_function, ok);
1906 } 1953 }
1907 } 1954 }
1908 1955
1909 Statement* Parser::ParseStatementAsUnlabelled( 1956 Statement* Parser::ParseStatementAsUnlabelled(
1910 ZoneList<const AstRawString*>* labels, bool* ok) { 1957 ZoneList<const AstRawString*>* labels, bool* ok) {
1911 switch (peek()) { 1958 switch (peek()) {
1912 case Token::CONTINUE: 1959 case Token::CONTINUE:
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
2135 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); 2182 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
2136 NativeFunctionLiteral* lit = factory()->NewNativeFunctionLiteral( 2183 NativeFunctionLiteral* lit = factory()->NewNativeFunctionLiteral(
2137 name, extension_, RelocInfo::kNoPosition); 2184 name, extension_, RelocInfo::kNoPosition);
2138 return factory()->NewExpressionStatement( 2185 return factory()->NewExpressionStatement(
2139 factory()->NewAssignment(Token::INIT, proxy, lit, RelocInfo::kNoPosition), 2186 factory()->NewAssignment(Token::INIT, proxy, lit, RelocInfo::kNoPosition),
2140 pos); 2187 pos);
2141 } 2188 }
2142 2189
2143 2190
2144 Statement* Parser::ParseFunctionDeclaration( 2191 Statement* Parser::ParseFunctionDeclaration(
2145 ZoneList<const AstRawString*>* names, bool* ok) { 2192 ZoneList<const AstRawString*>* names, bool ambient, bool* ok) {
2146 Expect(Token::FUNCTION, CHECK_OK); 2193 Expect(Token::FUNCTION, CHECK_OK);
2147 int pos = position(); 2194 int pos = position();
2148 bool is_generator = Check(Token::MUL); 2195 bool is_generator = Check(Token::MUL);
2149 return ParseFunctionDeclaration(pos, is_generator, names, ok); 2196 return ParseFunctionDeclaration(pos, is_generator, names, ambient, ok);
2150 } 2197 }
2151 2198
2152 2199
2153 Statement* Parser::ParseFunctionDeclaration( 2200 Statement* Parser::ParseFunctionDeclaration(
2154 int pos, bool is_generator, ZoneList<const AstRawString*>* names, 2201 int pos, bool is_generator, ZoneList<const AstRawString*>* names,
2155 bool* ok) { 2202 bool ambient, bool* ok) {
2156 // FunctionDeclaration :: 2203 // FunctionDeclaration ::
2157 // 'function' Identifier '(' FormalParameters ')' '{' FunctionBody '}' 2204 // 'function' Identifier '(' FormalParameters ')' '{' FunctionBody '}'
2158 // GeneratorDeclaration :: 2205 // GeneratorDeclaration ::
2159 // 'function' '*' Identifier '(' FormalParameters ')' '{' FunctionBody '}' 2206 // 'function' '*' Identifier '(' FormalParameters ')' '{' FunctionBody '}'
2160 // 2207 //
2161 // 'function' and '*' (if present) have been consumed by the caller. 2208 // 'function' and '*' (if present) have been consumed by the caller.
2162 bool is_strict_reserved = false; 2209 bool is_strict_reserved = false;
2163 const AstRawString* name = ParseIdentifierOrStrictReservedWord( 2210 const AstRawString* name = ParseIdentifierOrStrictReservedWord(
2164 &is_strict_reserved, CHECK_OK); 2211 &is_strict_reserved, CHECK_OK);
2165 2212
2166 FuncNameInferrer::State fni_state(fni_); 2213 FuncNameInferrer::State fni_state(fni_);
2167 if (fni_ != NULL) fni_->PushEnclosingName(name); 2214 if (fni_ != NULL) fni_->PushEnclosingName(name);
2215 typesystem::TypeFlags type_flags =
2216 ambient ? typesystem::kAmbient : typesystem::kAllowSignature;
2168 FunctionLiteral* fun = 2217 FunctionLiteral* fun =
2169 ParseFunctionLiteral(name, scanner()->location(), 2218 ParseFunctionLiteral(name, scanner()->location(),
2170 is_strict_reserved ? kFunctionNameIsStrictReserved 2219 is_strict_reserved ? kFunctionNameIsStrictReserved
2171 : kFunctionNameValidityUnknown, 2220 : kFunctionNameValidityUnknown,
2172 is_generator ? FunctionKind::kGeneratorFunction 2221 is_generator ? FunctionKind::kGeneratorFunction
2173 : FunctionKind::kNormalFunction, 2222 : FunctionKind::kNormalFunction,
2174 pos, FunctionLiteral::kDeclaration, language_mode(), 2223 pos, FunctionLiteral::kDeclaration, language_mode(),
2175 typesystem::kAllowSignature, CHECK_OK); 2224 type_flags, CHECK_OK);
2176 // Return no function declaration if just the signature was given. 2225 // Return no function declaration if just the signature was given.
2177 EmptyStatement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition); 2226 EmptyStatement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition);
2178 if (fun == nullptr) return empty; 2227 if (fun == nullptr) return empty;
2179 2228
2180 // Even if we're not at the top-level of the global or a function 2229 // Even if we're not at the top-level of the global or a function
2181 // scope, we treat it as such and introduce the function with its 2230 // scope, we treat it as such and introduce the function with its
2182 // initial value upon entering the corresponding scope. 2231 // initial value upon entering the corresponding scope.
2183 // In ES6, a function behaves as a lexical binding, except in 2232 // In ES6, a function behaves as a lexical binding, except in
2184 // a script scope, or the initial scope of eval or another function. 2233 // a script scope, or the initial scope of eval or another function.
2185 VariableMode mode = 2234 VariableMode mode =
(...skipping 12 matching lines...) Expand all
2198 factory()->NewSloppyBlockFunctionStatement(empty, scope_); 2247 factory()->NewSloppyBlockFunctionStatement(empty, scope_);
2199 scope_->DeclarationScope()->sloppy_block_function_map()->Declare(name, 2248 scope_->DeclarationScope()->sloppy_block_function_map()->Declare(name,
2200 delegate); 2249 delegate);
2201 return delegate; 2250 return delegate;
2202 } 2251 }
2203 return empty; 2252 return empty;
2204 } 2253 }
2205 2254
2206 2255
2207 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names, 2256 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names,
2208 bool* ok) { 2257 bool ambient, bool* ok) {
2209 // ClassDeclaration :: 2258 // ClassDeclaration ::
2210 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}' 2259 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}'
2211 // 2260 //
2212 // 'class' is expected to be consumed by the caller. 2261 // 'class' is expected to be consumed by the caller.
2213 // 2262 //
2214 // A ClassDeclaration 2263 // A ClassDeclaration
2215 // 2264 //
2216 // class C { ... } 2265 // class C { ... }
2217 // 2266 //
2218 // has the same semantics as: 2267 // has the same semantics as:
2219 // 2268 //
2220 // let C = class C { ... }; 2269 // let C = class C { ... };
2221 // 2270 //
2222 // so rewrite it as such. 2271 // so rewrite it as such.
2223 2272
2224 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { 2273 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) {
2225 ReportMessage(MessageTemplate::kSloppyLexical); 2274 ReportMessage(MessageTemplate::kSloppyLexical);
2226 *ok = false; 2275 *ok = false;
2227 return NULL; 2276 return NULL;
2228 } 2277 }
2229 2278
2230 int pos = position(); 2279 int pos = position();
2231 bool is_strict_reserved = false; 2280 bool is_strict_reserved = false;
2232 const AstRawString* name = 2281 const AstRawString* name =
2233 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); 2282 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK);
2234 ClassLiteral* value = ParseClassLiteral(name, scanner()->location(), 2283 ClassLiteral* value = ParseClassLiteral(
2235 is_strict_reserved, pos, CHECK_OK); 2284 name, scanner()->location(), is_strict_reserved, pos, ambient, CHECK_OK);
2285 // Return no class declaration in case of an ambient.
2286 if (ambient) return factory()->NewEmptyStatement(RelocInfo::kNoPosition);
2236 2287
2237 VariableProxy* proxy = NewUnresolved(name, LET); 2288 VariableProxy* proxy = NewUnresolved(name, LET);
2238 Declaration* declaration = 2289 Declaration* declaration =
2239 factory()->NewVariableDeclaration(proxy, LET, scope_, pos); 2290 factory()->NewVariableDeclaration(proxy, LET, scope_, pos);
2240 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); 2291 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
2241 proxy->var()->set_initializer_position(position()); 2292 proxy->var()->set_initializer_position(position());
2242 Assignment* assignment = 2293 Assignment* assignment =
2243 factory()->NewAssignment(Token::INIT, proxy, value, pos); 2294 factory()->NewAssignment(Token::INIT, proxy, value, pos);
2244 Statement* assignment_statement = 2295 Statement* assignment_statement =
2245 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); 2296 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2295 for (auto declaration : declarations) { 2346 for (auto declaration : declarations) {
2296 PatternRewriter::DeclareAndInitializeVariables( 2347 PatternRewriter::DeclareAndInitializeVariables(
2297 result, &descriptor, &declaration, names, CHECK_OK); 2348 result, &descriptor, &declaration, names, CHECK_OK);
2298 } 2349 }
2299 return result; 2350 return result;
2300 } 2351 }
2301 2352
2302 2353
2303 Block* Parser::ParseVariableStatement(VariableDeclarationContext var_context, 2354 Block* Parser::ParseVariableStatement(VariableDeclarationContext var_context,
2304 ZoneList<const AstRawString*>* names, 2355 ZoneList<const AstRawString*>* names,
2305 bool* ok) { 2356 bool ambient, bool* ok) {
2306 // VariableStatement :: 2357 // VariableStatement ::
2307 // VariableDeclarations ';' 2358 // VariableDeclarations ';'
2308 2359
2309 // The scope of a var/const declared variable anywhere inside a function 2360 // The scope of a var/const declared variable anywhere inside a function
2310 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). Thus we can 2361 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). Thus we can
2311 // transform a source-level var/const declaration into a (Function) 2362 // transform a source-level var/const declaration into a (Function)
2312 // Scope declaration, and rewrite the source-level initialization into an 2363 // Scope declaration, and rewrite the source-level initialization into an
2313 // assignment statement. We use a block to collect multiple assignments. 2364 // assignment statement. We use a block to collect multiple assignments.
2314 // 2365 //
2315 // We mark the block as initializer block because we don't want the 2366 // We mark the block as initializer block because we don't want the
2316 // rewriter to add a '.result' assignment to such a block (to get compliant 2367 // rewriter to add a '.result' assignment to such a block (to get compliant
2317 // behavior for code such as print(eval('var x = 7')), and for cosmetic 2368 // behavior for code such as print(eval('var x = 7')), and for cosmetic
2318 // reasons when pretty-printing. Also, unless an assignment (initialization) 2369 // reasons when pretty-printing. Also, unless an assignment (initialization)
2319 // is inside an initializer block, it is ignored. 2370 // is inside an initializer block, it is ignored.
2320 2371
2321 DeclarationParsingResult parsing_result; 2372 DeclarationParsingResult parsing_result;
2322 Block* result = 2373 Block* result = ParseVariableDeclarations(var_context, &parsing_result, names,
2323 ParseVariableDeclarations(var_context, &parsing_result, names, CHECK_OK); 2374 ambient, CHECK_OK);
2324 ExpectSemicolon(CHECK_OK); 2375 ExpectSemicolon(CHECK_OK);
2325 return result; 2376 return result;
2326 } 2377 }
2327 2378
2328 Block* Parser::ParseVariableDeclarations( 2379 Block* Parser::ParseVariableDeclarations(
2329 VariableDeclarationContext var_context, 2380 VariableDeclarationContext var_context,
2330 DeclarationParsingResult* parsing_result, 2381 DeclarationParsingResult* parsing_result,
2331 ZoneList<const AstRawString*>* names, bool* ok) { 2382 ZoneList<const AstRawString*>* names, bool ambient, bool* ok) {
2332 // VariableDeclarations :: 2383 // VariableDeclarations ::
2333 // ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[','] 2384 // ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[',']
2334 // 2385 //
2335 // The ES6 Draft Rev3 specifies the following grammar for const declarations 2386 // The ES6 Draft Rev3 specifies the following grammar for const declarations
2336 // 2387 //
2337 // ConstDeclaration :: 2388 // ConstDeclaration ::
2338 // const ConstBinding (',' ConstBinding)* ';' 2389 // const ConstBinding (',' ConstBinding)* ';'
2339 // ConstBinding :: 2390 // ConstBinding ::
2340 // Identifier '=' AssignmentExpression 2391 // Identifier '=' AssignmentExpression
2341 // 2392 //
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2393 } 2444 }
2394 } 2445 }
2395 2446
2396 // Parse optional type annotation. 2447 // Parse optional type annotation.
2397 typename TypeSystem::Type type = this->EmptyType(); 2448 typename TypeSystem::Type type = this->EmptyType();
2398 if (scope_->typed() && Check(Token::COLON)) { // Braces required here. 2449 if (scope_->typed() && Check(Token::COLON)) { // Braces required here.
2399 type = ParseValidType(CHECK_OK); 2450 type = ParseValidType(CHECK_OK);
2400 } 2451 }
2401 USE(type); // TODO(nikolaos): really use it! 2452 USE(type); // TODO(nikolaos): really use it!
2402 2453
2454 // Skip initializers, for ambient declarations.
2455 if (ambient) {
2456 first_declaration = false;
2457 continue;
2458 }
2459
2403 Scanner::Location variable_loc = scanner()->location(); 2460 Scanner::Location variable_loc = scanner()->location();
2404 const AstRawString* single_name = 2461 const AstRawString* single_name =
2405 pattern->IsVariableProxy() ? pattern->AsVariableProxy()->raw_name() 2462 pattern->IsVariableProxy() ? pattern->AsVariableProxy()->raw_name()
2406 : nullptr; 2463 : nullptr;
2407 if (single_name != nullptr) { 2464 if (single_name != nullptr) {
2408 if (fni_ != NULL) fni_->PushVariableName(single_name); 2465 if (fni_ != NULL) fni_->PushVariableName(single_name);
2409 } 2466 }
2410 2467
2411 Expression* value = NULL; 2468 Expression* value = NULL;
2412 int initializer_position = RelocInfo::kNoPosition; 2469 int initializer_position = RelocInfo::kNoPosition;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
2550 } 2607 }
2551 labels->Add(label, zone()); 2608 labels->Add(label, zone());
2552 // Remove the "ghost" variable that turned out to be a label 2609 // Remove the "ghost" variable that turned out to be a label
2553 // from the top scope. This way, we don't try to resolve it 2610 // from the top scope. This way, we don't try to resolve it
2554 // during the scope processing. 2611 // during the scope processing.
2555 scope_->RemoveUnresolved(var); 2612 scope_->RemoveUnresolved(var);
2556 Expect(Token::COLON, CHECK_OK); 2613 Expect(Token::COLON, CHECK_OK);
2557 // ES#sec-labelled-function-declarations Labelled Function Declarations 2614 // ES#sec-labelled-function-declarations Labelled Function Declarations
2558 if (peek() == Token::FUNCTION && is_sloppy(language_mode())) { 2615 if (peek() == Token::FUNCTION && is_sloppy(language_mode())) {
2559 if (allow_function == kAllowLabelledFunctionStatement) { 2616 if (allow_function == kAllowLabelledFunctionStatement) {
2560 return ParseFunctionDeclaration(labels, ok); 2617 return ParseFunctionDeclaration(labels, false, ok);
2561 } else { 2618 } else {
2562 return ParseScopedStatement(labels, true, ok); 2619 return ParseScopedStatement(labels, true, ok);
2563 } 2620 }
2564 } 2621 }
2565 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok); 2622 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok);
2566 } 2623 }
2567 2624
2568 // If we have an extension, we allow a native function declaration. 2625 // If we have an extension, we allow a native function declaration.
2569 // A native function declaration starts with "native function" with 2626 // A native function declaration starts with "native function" with
2570 // no line-terminator between the two words. 2627 // no line-terminator between the two words.
(...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after
3553 return ParseSubStatement(labels, kDisallowLabelledFunctionStatement, ok); 3610 return ParseSubStatement(labels, kDisallowLabelledFunctionStatement, ok);
3554 } else { 3611 } else {
3555 if (legacy) { 3612 if (legacy) {
3556 ++use_counts_[v8::Isolate::kLegacyFunctionDeclaration]; 3613 ++use_counts_[v8::Isolate::kLegacyFunctionDeclaration];
3557 } 3614 }
3558 // Make a block around the statement for a lexical binding 3615 // Make a block around the statement for a lexical binding
3559 // is introduced by a FunctionDeclaration. 3616 // is introduced by a FunctionDeclaration.
3560 Scope* body_scope = NewScope(scope_, BLOCK_SCOPE); 3617 Scope* body_scope = NewScope(scope_, BLOCK_SCOPE);
3561 BlockState block_state(&scope_, body_scope); 3618 BlockState block_state(&scope_, body_scope);
3562 Block* block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); 3619 Block* block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition);
3563 Statement* body = ParseFunctionDeclaration(NULL, CHECK_OK); 3620 Statement* body = ParseFunctionDeclaration(NULL, false, CHECK_OK);
3564 block->statements()->Add(body, zone()); 3621 block->statements()->Add(body, zone());
3565 body_scope->set_end_position(scanner()->location().end_pos); 3622 body_scope->set_end_position(scanner()->location().end_pos);
3566 body_scope = body_scope->FinalizeBlockScope(); 3623 body_scope = body_scope->FinalizeBlockScope();
3567 block->set_scope(body_scope); 3624 block->set_scope(body_scope);
3568 return block; 3625 return block;
3569 } 3626 }
3570 } 3627 }
3571 3628
3572 Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, 3629 Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
3573 bool* ok) { 3630 bool* ok) {
3574 int stmt_pos = peek_position(); 3631 int stmt_pos = peek_position();
3575 Statement* init = NULL; 3632 Statement* init = NULL;
3576 ZoneList<const AstRawString*> lexical_bindings(1, zone()); 3633 ZoneList<const AstRawString*> lexical_bindings(1, zone());
3577 3634
3578 // Create an in-between scope for let-bound iteration variables. 3635 // Create an in-between scope for let-bound iteration variables.
3579 Scope* for_scope = NewScope(scope_, BLOCK_SCOPE); 3636 Scope* for_scope = NewScope(scope_, BLOCK_SCOPE);
3580 3637
3581 BlockState block_state(&scope_, for_scope); 3638 BlockState block_state(&scope_, for_scope);
3582 Expect(Token::FOR, CHECK_OK); 3639 Expect(Token::FOR, CHECK_OK);
3583 Expect(Token::LPAREN, CHECK_OK); 3640 Expect(Token::LPAREN, CHECK_OK);
3584 for_scope->set_start_position(scanner()->location().beg_pos); 3641 for_scope->set_start_position(scanner()->location().beg_pos);
3585 bool is_let_identifier_expression = false; 3642 bool is_let_identifier_expression = false;
3586 DeclarationParsingResult parsing_result; 3643 DeclarationParsingResult parsing_result;
3587 if (peek() != Token::SEMICOLON) { 3644 if (peek() != Token::SEMICOLON) {
3588 if (peek() == Token::VAR || (peek() == Token::CONST && allow_const()) || 3645 if (peek() == Token::VAR || (peek() == Token::CONST && allow_const()) ||
3589 (peek() == Token::LET && IsNextLetKeyword())) { 3646 (peek() == Token::LET && IsNextLetKeyword())) {
3590 ParseVariableDeclarations(kForStatement, &parsing_result, nullptr, 3647 ParseVariableDeclarations(kForStatement, &parsing_result, nullptr, false,
3591 CHECK_OK); 3648 CHECK_OK);
3592 3649
3593 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE; 3650 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE;
3594 int each_beg_pos = scanner()->location().beg_pos; 3651 int each_beg_pos = scanner()->location().beg_pos;
3595 int each_end_pos = scanner()->location().end_pos; 3652 int each_end_pos = scanner()->location().end_pos;
3596 3653
3597 if (CheckInOrOf(&mode, ok)) { 3654 if (CheckInOrOf(&mode, ok)) {
3598 if (!*ok) return nullptr; 3655 if (!*ok) return nullptr;
3599 if (parsing_result.declarations.length() != 1) { 3656 if (parsing_result.declarations.length() != 1) {
3600 ParserTraits::ReportMessageAt( 3657 ParserTraits::ReportMessageAt(
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after
4218 4275
4219 // Parse optional type annotation. 4276 // Parse optional type annotation.
4220 typename TypeSystem::Type result_type = this->EmptyType(); 4277 typename TypeSystem::Type result_type = this->EmptyType();
4221 if (scope_->typed() && 4278 if (scope_->typed() &&
4222 !(type_flags & typesystem::kDisallowTypeAnnotation) && 4279 !(type_flags & typesystem::kDisallowTypeAnnotation) &&
4223 Check(Token::COLON)) { // Braces required here. 4280 Check(Token::COLON)) { // Braces required here.
4224 result_type = ParseValidType(CHECK_OK); 4281 result_type = ParseValidType(CHECK_OK);
4225 } 4282 }
4226 USE(result_type); // TODO(nikolaos): really use it! 4283 USE(result_type); // TODO(nikolaos): really use it!
4227 4284
4228 // Allow for a function signature (i.e., a literal without body). 4285 // Allow or even enforce a function signature (i.e., literal without body),
4229 // In that case, return a nullptr instead of a function literal. 4286 // In that case, return a nullptr instead of a function literal.
4230 if (peek() != Token::LBRACE && scope_->typed() && 4287 if ((type_flags & typesystem::kDisallowBody) ||
4231 (type_flags & typesystem::kAllowSignature)) { 4288 (peek() != Token::LBRACE && scope_->typed() &&
4289 (type_flags & typesystem::kAllowSignature))) {
4232 ExpectSemicolon(CHECK_OK); 4290 ExpectSemicolon(CHECK_OK);
4233 return nullptr; 4291 return nullptr;
4234 } 4292 }
4235 4293
4236 Expect(Token::LBRACE, CHECK_OK); 4294 Expect(Token::LBRACE, CHECK_OK);
4237 4295
4238 // Don't include the rest parameter into the function's formal parameter 4296 // Don't include the rest parameter into the function's formal parameter
4239 // count (esp. the SharedFunctionInfo::internal_formal_parameter_count, 4297 // count (esp. the SharedFunctionInfo::internal_formal_parameter_count,
4240 // which says whether we need to create an arguments adaptor frame). 4298 // which says whether we need to create an arguments adaptor frame).
4241 if (formals.has_rest) arity--; 4299 if (formals.has_rest) arity--;
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after
4800 if (pre_parse_timer_ != NULL) { 4858 if (pre_parse_timer_ != NULL) {
4801 pre_parse_timer_->Stop(); 4859 pre_parse_timer_->Stop();
4802 } 4860 }
4803 return result; 4861 return result;
4804 } 4862 }
4805 4863
4806 4864
4807 ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, 4865 ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name,
4808 Scanner::Location class_name_location, 4866 Scanner::Location class_name_location,
4809 bool name_is_strict_reserved, int pos, 4867 bool name_is_strict_reserved, int pos,
4810 bool* ok) { 4868 bool ambient, bool* ok) {
4811 // All parts of a ClassDeclaration and ClassExpression are strict code. 4869 // All parts of a ClassDeclaration and ClassExpression are strict code.
4812 if (name_is_strict_reserved) { 4870 if (name_is_strict_reserved) {
4813 ReportMessageAt(class_name_location, 4871 ReportMessageAt(class_name_location,
4814 MessageTemplate::kUnexpectedStrictReserved); 4872 MessageTemplate::kUnexpectedStrictReserved);
4815 *ok = false; 4873 *ok = false;
4816 return NULL; 4874 return NULL;
4817 } 4875 }
4818 if (IsEvalOrArguments(name)) { 4876 if (IsEvalOrArguments(name)) {
4819 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); 4877 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments);
4820 *ok = false; 4878 *ok = false;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
4887 if (Check(Token::SEMICOLON)) continue; 4945 if (Check(Token::SEMICOLON)) continue;
4888 FuncNameInferrer::State fni_state(fni_); 4946 FuncNameInferrer::State fni_state(fni_);
4889 const bool in_class = true; 4947 const bool in_class = true;
4890 const bool is_static = false; 4948 const bool is_static = false;
4891 bool is_computed_name = false; // Classes do not care about computed 4949 bool is_computed_name = false; // Classes do not care about computed
4892 // property names here. 4950 // property names here.
4893 ExpressionClassifier classifier(this); 4951 ExpressionClassifier classifier(this);
4894 const AstRawString* property_name = nullptr; 4952 const AstRawString* property_name = nullptr;
4895 ObjectLiteral::Property* property = ParsePropertyDefinition( 4953 ObjectLiteral::Property* property = ParsePropertyDefinition(
4896 &checker, in_class, has_extends, is_static, &is_computed_name, 4954 &checker, in_class, has_extends, is_static, &is_computed_name,
4897 &has_seen_constructor, &classifier, &property_name, CHECK_OK); 4955 &has_seen_constructor, &classifier, &property_name, ambient, CHECK_OK);
4898 // Ignore member variable declarations in typed mode. 4956 // Ignore member variable declarations, method signatures and members of
4957 // ambients in typed mode.
4899 if (property == nullptr) continue; 4958 if (property == nullptr) continue;
4900 RewriteNonPattern(&classifier, CHECK_OK); 4959 RewriteNonPattern(&classifier, CHECK_OK);
4901 4960
4902 if (has_seen_constructor && constructor == NULL) { 4961 if (has_seen_constructor && constructor == NULL) {
4903 constructor = GetPropertyValue(property)->AsFunctionLiteral(); 4962 constructor = GetPropertyValue(property)->AsFunctionLiteral();
4904 DCHECK_NOT_NULL(constructor); 4963 DCHECK_NOT_NULL(constructor);
4905 constructor->set_raw_name( 4964 constructor->set_raw_name(
4906 name != nullptr ? name : ast_value_factory()->empty_string()); 4965 name != nullptr ? name : ast_value_factory()->empty_string());
4907 } else { 4966 } else {
4908 properties->Add(property, zone()); 4967 properties->Add(property, zone());
(...skipping 2098 matching lines...) Expand 10 before | Expand all | Expand 10 after
7007 try_block, target); 7066 try_block, target);
7008 final_loop = target; 7067 final_loop = target;
7009 } 7068 }
7010 7069
7011 return final_loop; 7070 return final_loop;
7012 } 7071 }
7013 7072
7014 7073
7015 } // namespace internal 7074 } // namespace internal
7016 } // namespace v8 7075 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | src/parsing/preparser.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698