public Node parseExportNamedDeclaration(Node node) { Node declaration = null; bool isExportFromIdentifier = false; string src = null; List<Node> specifiers = new List<Node>(); // non-default export if (lookahead.type == TokenType.Keyword) { // covers: // export var f = 1; switch (lookahead.value) { case "let": case "const": case "var": case "class": case "function": declaration = parseStatementListItem(); return node.finishExportNamedDeclaration(declaration, specifiers, null); } } expect("{"); while (!match("}")) { isExportFromIdentifier = isExportFromIdentifier || matchKeyword("default"); specifiers.Add(parseExportSpecifier()); if (!match("}")) { expect(","); if (match("}")) { break; } } } expect("}"); if (matchContextualKeyword("from")) { // covering: // export {default} from "foo"; // export {foo} from "foo"; lex(); //src = parseModuleSpecifier(); consumeSemicolon(); } else if (isExportFromIdentifier) { // covering: // export {default}; // missing fromClause throwError(lookahead.value != null ? Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value); } else { // cover // export {foo}; consumeSemicolon(); } return node.finishExportNamedDeclaration(declaration, specifiers, src); }