示例#1
0
        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);
        }