• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ES2PANDA_PARSER_CORE_PARSER_IMPL_H
17 #define ES2PANDA_PARSER_CORE_PARSER_IMPL_H
18 
19 #include <binder/binder.h>
20 #include <es2panda.h>
21 #include <ir/astNode.h>
22 #include <ir/base/methodDefinition.h>
23 #include <lexer/token/sourceLocation.h>
24 #include <macros.h>
25 #include <mem/arena_allocator.h>
26 #include <parser/context/parserContext.h>
27 #include <parser/module/sourceTextModuleRecord.h>
28 #include <parser/parserFlags.h>
29 #include <parser/program/program.h>
30 #include <util/enumbitops.h>
31 #include <util/ustring.h>
32 
33 #include <memory>
34 #include <sstream>
35 #include <unordered_map>
36 #include <unordered_set>
37 
38 namespace panda::es2panda::lexer {
39 enum class TokenFlags;
40 enum class TokenType;
41 class LexerPosition;
42 class Token;
43 class Lexer;
44 }  // namespace panda::es2panda::lexer
45 
46 namespace panda::es2panda::ir {
47 class ArrowFunctionExpression;
48 class AstNode;
49 class BlockStatement;
50 class BreakStatement;
51 class CallExpression;
52 class ClassDeclaration;
53 class ClassDefinition;
54 class ContinueStatement;
55 class DoWhileStatement;
56 class ExportAllDeclaration;
57 class ExportDefaultDeclaration;
58 class ExportNamedDeclaration;
59 class ExportNamedDeclaration;
60 class Expression;
61 class FunctionDeclaration;
62 class FunctionExpression;
63 class Identifier;
64 class IfStatement;
65 class ImportDeclaration;
66 class LabelledStatement;
67 class NewExpression;
68 class ObjectExpression;
69 class ReturnStatement;
70 class ScriptFunction;
71 class SequenceExpression;
72 class SpreadElement;
73 class Statement;
74 class StringLiteral;
75 class SwitchCaseStatement;
76 class SwitchStatement;
77 class TSArrayType;
78 class TSEnumDeclaration;
79 class TSFunctionType;
80 class TSInterfaceDeclaration;
81 class TSIntersectionType;
82 class TSTupleType;
83 class TSTypeAliasDeclaration;
84 class TSUnionType;
85 class TSImportType;
86 class TemplateLiteral;
87 class ThrowStatement;
88 class TryStatement;
89 class VariableDeclaration;
90 class WhileStatement;
91 class WithStatement;
92 class TSTypeParameter;
93 class TSTypeParameterDeclaration;
94 class MemberExpression;
95 class MethodDefinition;
96 class TSTypeReference;
97 class TSMappedType;
98 class TSTypePredicate;
99 class Decorator;
100 class TSIndexSignature;
101 class Property;
102 class TSTypeParameterInstantiation;
103 class TSParameterProperty;
104 class TSTypeAssertion;
105 class TSAsExpression;
106 class YieldExpression;
107 class MetaProperty;
108 class TSModuleDeclaration;
109 class TSImportEqualsDeclaration;
110 class TSModuleBlock;
111 class EmptyStatement;
112 class DebuggerStatement;
113 class CatchClause;
114 class VariableDeclarator;
115 
116 enum class PropertyKind;
117 enum class TSTupleKind;
118 enum class MethodDefinitionKind;
119 enum class ModifierFlags;
120 }  // namespace panda::es2panda::ir
121 
122 namespace panda::es2panda::parser {
123 
124 class Program;
125 class ParserContext;
126 
127 class ClassElmentDescriptor {
128 public:
129     ir::MethodDefinitionKind methodKind {};
130     ParserStatus newStatus {};
131     ir::ModifierFlags modifiers {};
132     lexer::SourcePosition methodStart {};
133     lexer::SourcePosition propStart {};
134     bool isPrivateIdent {};
135     bool hasSuperClass {};
136     bool isGenerator {};
137     bool invalidComputedProperty {};
138     bool isComputed {};
139     bool isIndexSignature {};
140     bool classMethod {};
141     bool classField {};
142 };
143 
144 class ArrowFunctionDescriptor {
145 public:
ArrowFunctionDescriptor(ArenaVector<ir::Expression * > && p,binder::FunctionParamScope * ps,lexer::SourcePosition sl,ParserStatus ns)146     explicit ArrowFunctionDescriptor(ArenaVector<ir::Expression *> &&p, binder::FunctionParamScope *ps,
147                                      lexer::SourcePosition sl, ParserStatus ns)
148         : params(p), paramScope(ps), startLoc(sl), newStatus(ns)
149     {
150     }
151 
152     ArenaVector<ir::Expression *> params;
153     binder::FunctionParamScope *paramScope;
154     lexer::SourcePosition startLoc;
155     ParserStatus newStatus;
156 };
157 
158 enum class TypeAnnotationParsingOptions {
159     NO_OPTS = 0,
160     IN_UNION = 1 << 0,
161     ALLOW_CONST = 1 << 1,
162     IN_INTERSECTION = 1 << 2,
163     RESTRICT_EXTENDS = 1 << 3,
164     THROW_ERROR = 1 << 4,
165     CAN_BE_TS_TYPE_PREDICATE = 1 << 5,
166     BREAK_AT_NEW_LINE = 1 << 6,
167     IN_MODIFIER = 1 << 7,
168 };
169 
DEFINE_BITOPS(TypeAnnotationParsingOptions)170 DEFINE_BITOPS(TypeAnnotationParsingOptions)
171 
172 class ArrowFunctionContext;
173 
174 class ParserImpl {
175 public:
176     explicit ParserImpl(es2panda::ScriptExtension extension);
177     NO_COPY_SEMANTIC(ParserImpl);
178     NO_MOVE_SEMANTIC(ParserImpl);
179     ~ParserImpl() = default;
180 
181     Program Parse(const std::string &fileName, const std::string &source,
182                   const std::string &recordName, ScriptKind kind);
183 
184     ScriptExtension Extension() const;
185 
186     void AddPatchFixHelper(util::PatchFix *patchFixHelper);
187 
188     ArenaAllocator *Allocator() const
189     {
190         return program_.Allocator();
191     }
192     bool IsDtsFile() const;
193     void SetDebug(bool isDebug)
194     {
195         program_.SetDebug(isDebug);
196     }
197 
198 private:
199     bool IsStartOfMappedType() const;
200     bool IsStartOfTsTypePredicate() const;
201     bool IsStartOfAbstractConstructorType() const;
202 
203     bool CurrentTokenIsModifier(char32_t nextCp) const;
204     [[noreturn]] void ThrowParameterModifierError(ir::ModifierFlags status) const;
205     [[noreturn]] void ThrowSyntaxError(std::string_view errorMessage) const;
206     [[noreturn]] void ThrowSyntaxError(std::initializer_list<std::string_view> list) const;
207     [[noreturn]] void ThrowSyntaxError(std::initializer_list<std::string_view> list,
208                                        const lexer::SourcePosition &pos) const;
209 
210     [[noreturn]] void ThrowSyntaxError(std::string_view errorMessage, const lexer::SourcePosition &pos) const;
211 
212     template <typename T, typename... Args>
213     T *AllocNode(Args &&... args)
214     {
215         auto ret = program_.Allocator()->New<T>(std::forward<Args>(args)...);
216         if (ret == nullptr) {
217             throw Error(ErrorType::GENERIC, "Unsuccessful allocation during parsing");
218         }
219         return ret;
220     }
221 
222     [[nodiscard]] std::unique_ptr<lexer::Lexer> InitLexer(const std::string &fileName, const std::string &source);
223     void ParseScript();
224     void ParseModule();
225 
226     /*
227      * Transform the commonjs module's AST by wrap the sourceCode & use Reflect.apply to invoke this wrapper with [this]
228      * pointing to [exports] object
229      *
230      * Reflect.apply(function (exports, require, module, __filename, __dirname) {
231      *   [SourceCode]
232      * }, exports, [exports, require, module, __filename, __dirname]);
233      */
234     void ParseCommonjs();
235     void AddCommonjsParams(ArenaVector<ir::Expression *> &params);
236     void AddReflectApplyArgs(ArenaVector<ir::Expression *> &args, ir::FunctionExpression *wrapper);
237     void ParseProgram(ScriptKind kind);
238     bool CheckTopStatementsForRequiredDeclare(const ArenaVector<ir::Statement *> &statements);
239     static ExpressionParseFlags CarryExpressionParserFlag(ExpressionParseFlags origin, ExpressionParseFlags carry);
240     static ExpressionParseFlags CarryPatternFlags(ExpressionParseFlags flags);
241     static ExpressionParseFlags CarryAllowTsParamAndPatternFlags(ExpressionParseFlags flags);
242     bool CurrentIsBasicType();
243     bool CurrentLiteralIsBasicType();
244     static bool CheckTypeNameIsReserved(const util::StringView &paramName);
245     static bool IsPropertyKeysAreSame(const ir::Expression *exp1, const ir::Expression *exp2);
246     static bool IsMemberExpressionsAreSame(const ir::MemberExpression *mExp1, const ir::MemberExpression *mExp2);
247     static bool IsMethodDefinitionsAreSame(const ir::MethodDefinition *property, ir::MethodDefinition *overload);
248     ir::TSTypeReference *ParseTsConstExpression();
249     ir::Expression *ParseTsTypeOperatorOrTypeReference(bool throwError);
250     ir::Expression *ParseTsIdentifierReference(TypeAnnotationParsingOptions options);
251     ir::Expression *ParseTsBasicType(TypeAnnotationParsingOptions options);
252     ir::TSIntersectionType *ParseTsIntersectionType(ir::Expression *type, bool inUnion, bool restrictExtends);
253     ir::TSUnionType *ParseTsUnionType(ir::Expression *type, bool restrictExtends);
254     ir::Expression *ParseTsParenthesizedOrFunctionType(ir::Expression *typeAnnotation, bool throwError);
255     ir::TSArrayType *ParseTsArrayType(ir::Expression *elementType);
256     bool IsTsFunctionType();
257     ir::Expression *ParseTsFunctionType(lexer::SourcePosition startLoc, bool isConstructionType, bool throwError,
258                                         bool abstractConstructor = false);
259     ir::TSTypeParameter *ParseTsMappedTypeParameter();
260     ir::MappedOption ParseMappedOption(lexer::TokenType tokenType);
261     ir::TSMappedType *ParseTsMappedType();
262     ir::TSTypePredicate *ParseTsTypePredicate();
263     ir::Expression *ParseTsTypeLiteralOrInterfaceKey(bool *computed, bool *signature, bool *isIndexSignature);
264     ir::Expression *ParseTsConditionalType(ir::Expression *checkType, bool restrictExtends);
265     ir::Expression *ParseTsTypeLiteralOrInterfaceMember();
266     ArenaVector<ir::Expression *> ParseTsTypeLiteralOrInterface();
267     ir::Expression *ParseTsThisType(bool throwError);
268     ir::Expression *ParseTsIndexAccessType(ir::Expression *typeName, bool throwError);
269     ir::Expression *ParseTsQualifiedReference(ir::Expression *typeName);
270     ir::Expression *ParseTsTypeReferenceOrQuery(TypeAnnotationParsingOptions options, bool parseQuery = false);
271     bool IsTSNamedTupleMember();
272     void HandleRestType(ir::AstNodeType elementType, bool *hasRestType) const;
273     ir::Expression *ParseTsTupleElement(ir::TSTupleKind *kind, bool *seenOptional, bool *hasRestType);
274     ir::TSTupleType *ParseTsTupleType();
275     ir::TSImportType *ParseTsImportType(const lexer::SourcePosition &startLoc, bool isTypeof = false);
276     ir::Expression *ParseTsTypeAnnotation(TypeAnnotationParsingOptions *options);
277     ir::Expression *ParseTsTypeLiteralOrTsMappedType(ir::Expression *typeAnnotation);
278     ir::Expression *ParseTsTypeReferenceOrTsTypePredicate(ir::Expression *typeAnnotation, bool canBeTsTypePredicate,
279                                                           bool throwError);
280     ir::Expression *ParseTsThisTypeOrTsTypePredicate(ir::Expression *typeAnnotation, bool canBeTsTypePredicate,
281                                                      bool throwError);
282     ir::Expression *ParseTsTemplateLiteralType(bool throwError);
283     ir::Expression *ParseTsTypeAnnotationElement(ir::Expression *typeAnnotation, TypeAnnotationParsingOptions *options);
284     ir::ModifierFlags ParseModifiers();
285 
286     void ThrowIfPrivateIdent(ClassElmentDescriptor *desc, const char *msg);
287     void ValidateClassKey(ClassElmentDescriptor *desc, bool isDeclare);
288 
289     void ValidateClassMethodStart(ClassElmentDescriptor *desc, ir::Expression *typeAnnotation);
290     ir::Expression *ParseClassKey(ClassElmentDescriptor *desc, bool isDeclare);
291 
292     void ValidateClassSetter(ClassElmentDescriptor *desc, const ArenaVector<ir::Statement *> &properties,
293                              ir::Expression *propName, ir::ScriptFunction *func, bool hasDecorator,
294                              lexer::SourcePosition errorInfo);
295     void ValidateClassGetter(ClassElmentDescriptor *desc, const ArenaVector<ir::Statement *> &properties,
296                              ir::Expression *propName, ir::ScriptFunction *func, bool hasDecorator,
297                              lexer::SourcePosition errorInfo);
298     ir::MethodDefinition *ParseClassMethod(ClassElmentDescriptor *desc, const ArenaVector<ir::Statement *> &properties,
299                                            ir::Expression *propName, lexer::SourcePosition *propEnd,
300                                            ArenaVector<ir::Decorator *> &&decorators, bool isDeclare);
301     ir::Statement *ParseClassProperty(ClassElmentDescriptor *desc, const ArenaVector<ir::Statement *> &properties,
302                                       ir::Expression *propName, ir::Expression *typeAnnotation,
303                                       ArenaVector<ir::Decorator *> &&decorators, bool isDeclare);
304     void ParseClassKeyModifiers(ClassElmentDescriptor *desc);
305     void CheckClassGeneratorMethod(ClassElmentDescriptor *desc);
306     void CheckClassPrivateIdentifier(ClassElmentDescriptor *desc);
307     ir::Expression *ParseClassKeyAnnotation();
308     ir::Decorator *ParseDecorator();
309     ArenaVector<ir::Decorator *> ParseDecorators();
310     ir::Statement *ParseClassElement(const ArenaVector<ir::Statement *> &properties,
311                                      ArenaVector<ir::TSIndexSignature *> *indexSignatures, bool hasSuperClass,
312                                      bool isDeclare, bool isAbstractClass);
313     ir::MethodDefinition *CreateImplicitConstructor(ir::Expression *superClass,
314                                                     bool hasSuperClass, bool isDeclare = false);
315     ir::MethodDefinition *CheckClassMethodOverload(ir::Statement *property, ir::MethodDefinition **ctor, bool isDeclare,
316                                                    lexer::SourcePosition errorInfo, ir::MethodDefinition *lastOverload,
317                                                    bool implExists, bool isAbstract = false);
318     ir::Identifier *SetIdentNodeInClassDefinition(bool isDeclare, binder::ConstDecl **decl);
319     ir::ClassDefinition *ParseClassDefinition(bool isDeclaration, bool idRequired = true, bool isDeclare = false,
320                                               bool isAbstract = false);
321 
322     void ValidateClassConstructor(ir::MethodDefinition *ctor,
323                                   ArenaVector<ir::Statement *> &properties,
324                                   ir::Expression *superClass,
325                                   bool isDeclare, bool hasConstructorFuncBody, bool hasSuperClass);
326     void FindSuperCallInConstructor(const ir::AstNode *parent, bool *hasSuperCall);
327     void FindSuperCallInConstructorChildNode(const ir::AstNode *childNode, bool *hasSuperCall);
328     bool SuperCallShouldBeFirst(ir::MethodDefinition *ctor, ArenaVector<ir::Statement *> &properties);
329     void ValidateAccessor(ExpressionParseFlags flags, lexer::TokenFlags currentTokenFlags);
330     void CheckPropertyKeyAsycModifier(ParserStatus *methodStatus);
331     ir::Property *ParseShorthandProperty(const lexer::LexerPosition *startPos);
332     void ParseGeneratorPropertyModifier(ExpressionParseFlags flags, ParserStatus *methodStatus);
333     bool ParsePropertyModifiers(ExpressionParseFlags flags, ir::PropertyKind *propertyKind, ParserStatus *methodStatus);
334     ir::Expression *ParsePropertyKey(ExpressionParseFlags flags);
335     ir::Expression *ParsePropertyValue(const ir::PropertyKind *propertyKind, const ParserStatus *methodStatus,
336                                        ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
337     bool ParsePropertyEnd();
338 
339     ir::Expression *ParsePropertyDefinition(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
340     ir::TSTypeParameter *ParseTsTypeParameter(bool throwError, bool addBinding = false);
341     ir::TSTypeParameterDeclaration *ParseTsTypeParameterDeclaration(bool throwError = true);
342     ir::TSTypeParameterInstantiation *ParseTsTypeParameterInstantiation(bool throwError = true);
343     ir::ScriptFunction *ParseFunction(ParserStatus newStatus = ParserStatus::NO_OPTS,
344                                       bool isDeclare = false,
345                                       ArenaVector<ir::ParamDecorators> *paramDecorators = nullptr);
346     void ValidateFunctionParam(const ArenaVector<ir::Expression *> &params, const ir::Expression *parameter,
347                                bool *seenOptional);
348     void ValidateTsFunctionOverloadParams(const ArenaVector<ir::Expression *> &params);
349     void CheckAccessorPair(const ArenaVector<ir::Statement *> &properties, const ir::Expression *propName,
350                            ir::MethodDefinitionKind methodKind, ir::ModifierFlags access, bool hasDecorator,
351                            lexer::SourcePosition errorInfo);
352     ArenaVector<ir::Expression *> ParseFunctionParams(bool isDeclare = false,
353                                                       ArenaVector<ir::ParamDecorators> *paramDecorators = nullptr);
354     ir::SpreadElement *ParseSpreadElement(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
355     ir::TSParameterProperty *CreateTsParameterProperty(ir::Expression *parameter, ir::ModifierFlags modifiers);
356     ir::Expression *ParseFunctionParameter(bool isDeclare);
357     void CreateTSVariableForProperty(ir::AstNode *node, const ir::Expression *key, binder::VariableFlags flags);
358     void CheckObjectTypeForDuplicatedProperties(ir::Expression *member, ArenaVector<ir::Expression *> const &members);
359 
360     // ExpressionParser.Cpp
361 
362     ir::Expression *ParseExpression(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
363     ir::ArrowFunctionExpression *ParseTsGenericArrowFunction();
364     ir::TSTypeAssertion *ParseTsTypeAssertion(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
365     ir::TSAsExpression *ParseTsAsExpression(ir::Expression *expr, ExpressionParseFlags flags);
366     ir::Expression *ParseArrayExpression(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
367     ir::YieldExpression *ParseYieldExpression();
368     ir::Expression *ParsePotentialExpressionSequence(ir::Expression *expr, ExpressionParseFlags flags);
369     ParserStatus ValidateArrowParameter(ir::Expression *expr);
370 
371     ArrowFunctionDescriptor ConvertToArrowParameter(ir::Expression *expr, bool isAsync,
372                                                     binder::FunctionParamScope *paramScope);
373     ir::ArrowFunctionExpression *ParseArrowFunctionExpressionBody(ArrowFunctionContext *arrowFunctionContext,
374                                                                   binder::FunctionScope *functionScope,
375                                                                   ArrowFunctionDescriptor *desc,
376                                                                   ir::TSTypeParameterDeclaration *typeParamDecl,
377                                                                   ir::Expression *returnTypeAnnotation);
378     ir::ArrowFunctionExpression *ParseArrowFunctionExpression(ir::Expression *expr,
379                                                               ir::TSTypeParameterDeclaration *typeParamDecl,
380                                                               ir::Expression *returnTypeAnnotation, bool isAsync);
381     ir::Expression *ParseCoverParenthesizedExpressionAndArrowParameterList();
382     ir::Expression *ParseKeywordExpression();
383     ir::Expression *ParseBinaryExpression(ir::Expression *left);
384     ir::CallExpression *ParseCallExpression(ir::Expression *callee, bool isOptionalChain = false, bool isAsync = false);
385     ir::ArrowFunctionExpression *ParsePotentialArrowExpression(ir::Expression **returnExpression,
386                                                                const lexer::SourcePosition &startLoc,
387                                                                bool ignoreCallExpression);
388 
389     void ValidateUpdateExpression(ir::Expression *returnExpression, bool isChainExpression);
390     bool ParsePotentialTsGenericFunctionCall(ir::Expression **returnExpression, const lexer::SourcePosition &startLoc,
391                                              bool ignoreCallExpression);
392     ir::Expression *ParsePostPrimaryExpression(ir::Expression *primaryExpr, lexer::SourcePosition startLoc,
393                                                bool ignoreCallExpression, bool *isChainExpression);
394     ir::Expression *ParseMemberExpression(bool ignoreCallExpression = false,
395                                           ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
396     ir::ObjectExpression *ParseObjectExpression(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
397     ir::SequenceExpression *ParseSequenceExpression(ir::Expression *startExpr, bool acceptRest = false,
398                                                     bool acceptTsParam = false);
399     ir::Expression *ParseUnaryOrPrefixUpdateExpression(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
400     ir::Expression *ParseLeftHandSideExpression(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
401     ir::MetaProperty *ParsePotentialNewTarget();
402     void CheckInvalidDestructuring(const ir::AstNode *object) const;
403     void ValidateParenthesizedExpression(ir::Expression *lhsExpression);
404     ir::Expression *ParseAssignmentExpression(ir::Expression *lhsExpression,
405                                               ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
406     ir::Expression *ParsePrimaryExpression(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
407     ir::NewExpression *ParseNewExpression();
408     void ParsePotentialTsFunctionParameter(ExpressionParseFlags flags, ir::Expression *returnNode,
409                                            bool isDeclare = false);
410     ir::Expression *ParsePatternElement(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS,
411                                         bool allowDefault = true, bool isDeclare = false);
412     ir::TemplateLiteral *ParseTemplateLiteral();
413     ir::Expression *ParseImportExpression();
414     ir::FunctionExpression *ParseFunctionExpression(ParserStatus newStatus = ParserStatus::NO_OPTS);
415     ir::Expression *ParseOptionalChain(ir::Expression *leftSideExpr);
416     void ParseNameSpaceImport(ArenaVector<ir::AstNode *> *specifiers, bool isType);
417     ir::Identifier *ParseNamedImport(const lexer::Token &importedToken);
418     binder::Decl *AddImportDecl(bool isType,
419                                 util::StringView name,
420                                 lexer::SourcePosition startPos,
421                                 binder::DeclarationFlags flag);
422 
423     ir::StringLiteral *ParseFromClause(bool requireFrom = true);
424     void ParseNamedImportSpecifiers(ArenaVector<ir::AstNode *> *specifiers, bool isType);
425     ir::Expression *ParseModuleReference();
426     ir::AstNode *ParseImportDefaultSpecifier(ArenaVector<ir::AstNode *> *specifiers, bool isType);
427     ir::AstNode *ParseImportSpecifiers(ArenaVector<ir::AstNode *> *specifiers, bool isType);
428     void ValidateAssignmentTarget(ExpressionParseFlags flags, ir::Expression *node);
429     void ValidateLvalueAssignmentTarget(ir::Expression *node) const;
430     void ValidateArrowParameterBindings(const ir::Expression *node);
431 
432     ir::ExportDefaultDeclaration *ParseExportDefaultDeclaration(const lexer::SourcePosition &startLoc,
433                                                                 ArenaVector<ir::Decorator *> decorators,
434                                                                 bool isExportEquals = false);
435     ir::ExportAllDeclaration *ParseExportAllDeclaration(const lexer::SourcePosition &startLoc);
436     ir::ExportNamedDeclaration *ParseExportNamedSpecifiers(const lexer::SourcePosition &startLoc, bool isType);
437     ir::ExportNamedDeclaration *ParseNamedExportDeclaration(const lexer::SourcePosition &startLoc,
438                                                             ArenaVector<ir::Decorator *> &&decorators);
439     ir::Identifier *ParseNamedExport(const lexer::Token &exportedToken);
440     void CheckStrictReservedWord() const;
441 
442     // StatementParser.Cpp
443 
444     void ConsumeSemicolon(ir::Statement *statement);
445     void CheckFunctionDeclaration(StatementParsingFlags flags);
446 
447     void CheckLabelledFunction(const ir::Statement *node);
448     bool CheckDeclare();
449 
450     bool IsLabelFollowedByIterationStatement();
451 
452     void AddImportEntryItem(const ir::StringLiteral *source, const ArenaVector<ir::AstNode *> *specifiers, bool isType);
453     void AddExportNamedEntryItem(const ArenaVector<ir::ExportSpecifier *> &specifiers,
454                                  const ir::StringLiteral *source, bool isType);
455     void AddExportStarEntryItem(const lexer::SourcePosition &startLoc, const ir::StringLiteral *source,
456                                 const ir::Identifier *exported);
457     void AddExportDefaultEntryItem(const ir::AstNode *declNode);
458     void AddExportLocalEntryItem(const ir::Statement *declNode, bool isTsModule);
459     void AddTsTypeExportLocalEntryItem(const ir::Statement *declNode, bool isTsModule,
460                                        binder::TSModuleScope *tsModuleScope);
461     parser::SourceTextModuleRecord *GetSourceTextModuleRecord();
462     parser::SourceTextModuleRecord *GetSourceTextTypeModuleRecord();
463 
464     bool ParseDirective(ArenaVector<ir::Statement *> *statements);
465     void ParseDirectivePrologue(ArenaVector<ir::Statement *> *statements);
466     ArenaVector<ir::Statement *> ParseStatementList(StatementParsingFlags flags = StatementParsingFlags::ALLOW_LEXICAL);
467     bool IsTsDeclarationStatement() const;
468     ir::Statement *ParseStatement(StatementParsingFlags flags = StatementParsingFlags::NONE);
469     ir::TSModuleDeclaration *ParseTsModuleDeclaration(bool isDeclare, bool isExport = false);
470     ir::TSModuleDeclaration *ParseTsAmbientExternalModuleDeclaration(const lexer::SourcePosition &startLoc,
471                                                                      bool isDeclare);
472     ir::TSModuleDeclaration *ParseTsModuleOrNamespaceDelaration(const lexer::SourcePosition &startLoc,
473                                                                 bool isDeclare,
474                                                                 bool isExport);
475 
476     ir::TSImportEqualsDeclaration *ParseTsImportEqualsDeclaration(const lexer::SourcePosition &startLoc,
477                                                                   bool isExport = false);
478     ir::TSNamespaceExportDeclaration *ParseTsNamespaceExportDeclaration(const lexer::SourcePosition &startLoc);
479     ir::TSModuleBlock *ParseTsModuleBlock();
480     ir::BlockStatement *ParseFunctionBody();
481     ir::BlockStatement *ParseBlockStatement();
482     ir::BlockStatement *ParseBlockStatement(binder::Scope *scope);
483     ir::EmptyStatement *ParseEmptyStatement();
484     ir::DebuggerStatement *ParseDebuggerStatement();
485     ir::BreakStatement *ParseBreakStatement();
486     ir::ContinueStatement *ParseContinueStatement();
487     ir::DoWhileStatement *ParseDoWhileStatement();
488     ir::Statement *ParsePotentialExpressionStatement(StatementParsingFlags flags, bool isDeclare);
489     ir::Statement *ParseVarStatement(bool isDeclare);
490     ir::Statement *ParseLetStatement(StatementParsingFlags flags, bool isDeclare);
491     ir::Statement *ParseConstStatement(StatementParsingFlags flags, bool isDeclare);
492     ir::Statement *ParseExpressionStatement(StatementParsingFlags flags = StatementParsingFlags::NONE);
493     ir::Statement *ParseFunctionStatement(StatementParsingFlags flags, bool isDeclare);
494     ir::FunctionDeclaration *ParseFunctionDeclaration(bool canBeAnonymous = false,
495                                                       ParserStatus newStatus = ParserStatus::NO_OPTS,
496                                                       bool isDeclare = false);
497     void AddFunctionToBinder(ir::ScriptFunction *func, ParserStatus newStatus);
498     void CheckOptionalBindingPatternParameter(ir::ScriptFunction *func) const;
499     ir::Statement *ParseExportDeclaration(StatementParsingFlags flags, ArenaVector<ir::Decorator *> &&decorators);
500     std::tuple<ForStatementKind, ir::AstNode *, ir::Expression *, ir::Expression *> ParseForInOf(
501         ir::Expression *leftNode, ExpressionParseFlags exprFlags, bool isAwait);
502     std::tuple<ForStatementKind, ir::Expression *, ir::Expression *> ParseForInOf(ir::AstNode *initNode,
503                                                                                   ExpressionParseFlags exprFlags,
504                                                                                   bool isAwait);
505     std::tuple<ir::Expression *, ir::Expression *> ParseForUpdate(bool isAwait);
506     ir::Statement *ParseForStatement();
507     ir::IfStatement *ParseIfStatement();
508 
509     ir::Statement *ParseImportDeclaration(StatementParsingFlags flags);
510     ir::LabelledStatement *ParseLabelledStatement(const lexer::LexerPosition &pos);
511     ir::ReturnStatement *ParseReturnStatement();
512     ir::ClassDeclaration *ParseClassStatement(StatementParsingFlags flags, bool isDeclare,
513                                               ArenaVector<ir::Decorator *> &&decorators, bool isAbstract = false);
514     ir::ClassDeclaration *ParseClassDeclaration(bool idRequired, ArenaVector<ir::Decorator *> &&decorators,
515                                                 bool isDeclare = false, bool isAbstract = false,
516                                                 bool isExported = false);
517     ir::TSTypeAliasDeclaration *ParseTsTypeAliasDeclaration(bool isDeclare);
518     ir::TSEnumDeclaration *ParseEnumMembers(ir::Identifier *key, const lexer::SourcePosition &enumStart,
519                                             bool isExport, bool isDeclare, bool isConst);
520     ir::TSEnumDeclaration *ParseEnumDeclaration(bool isExport = false, bool isDeclare = false, bool isConst = false);
521     ir::TSInterfaceDeclaration *ParseTsInterfaceDeclaration(bool isDeclare);
522     ir::SwitchCaseStatement *ParseSwitchCaseStatement(bool *seenDefault);
523     ir::SwitchStatement *ParseSwitchStatement();
524     ir::ThrowStatement *ParseThrowStatement();
525     ir::Expression *ParseCatchParam();
526     ir::CatchClause *ParseCatchClause();
527     ir::TryStatement *ParseTryStatement();
528     void ValidateDeclaratorId();
529     ir::VariableDeclarator *ParseVariableDeclaratorInitializer(ir::Expression *init, VariableParsingFlags flags,
530                                                                const lexer::SourcePosition &startLoc, bool isDeclare);
531     ir::VariableDeclarator *ParseVariableDeclarator(VariableParsingFlags flags, bool isDeclare);
532     ir::Statement *ParseVariableDeclaration(VariableParsingFlags flags = VariableParsingFlags::NO_OPTS,
533                                             bool isDeclare = false, bool isExport = false);
534     ir::WhileStatement *ParseWhileStatement();
535     ir::VariableDeclaration *ParseContextualLet(VariableParsingFlags flags,
536                                                 StatementParsingFlags stmFlags = StatementParsingFlags::ALLOW_LEXICAL,
537                                                 bool isDeclare = false);
538 
539     util::StringView GetNamespaceExportInternalName()
540     {
541         std::string name = std::string(parser::SourceTextModuleRecord::ANONY_NAMESPACE_NAME) +
542                            std::to_string(namespaceExportCount_++);
543         util::UString internalName(name, Allocator());
544         return internalName.View();
545     }
546 
547     binder::Binder *Binder()
548     {
549         return program_.Binder();
550     }
551 
552     friend class Lexer;
553     friend class SavedParserContext;
554     friend class ArrowFunctionContext;
555 
556     Program program_;
557     ParserContext context_;
558     lexer::Lexer *lexer_ {nullptr};
559     size_t namespaceExportCount_ {0};
560 };
561 
562 template <ParserStatus status>
563 class SavedStatusContext {
564 public:
SavedStatusContext(ParserContext * ctx)565     explicit SavedStatusContext(ParserContext *ctx)
566         // NOLINTNEXTLINE(readability-magic-numbers)
567         : ctx_(ctx), savedStatus_(static_cast<ParserStatus>(ctx->Status()))
568     {
569         // NOLINTNEXTLINE(readability-magic-numbers)
570         ctx->Status() |= status;
571     }
572 
573     NO_COPY_SEMANTIC(SavedStatusContext);
574     NO_MOVE_SEMANTIC(SavedStatusContext);
575 
~SavedStatusContext()576     ~SavedStatusContext()
577     {
578         ctx_->Status() = savedStatus_;
579     }
580 
581 private:
582     ParserContext *ctx_;
583     ParserStatus savedStatus_;
584 };
585 
586 class SwitchContext : public SavedStatusContext<ParserStatus::IN_SWITCH> {
587 public:
SwitchContext(ParserContext * ctx)588     explicit SwitchContext(ParserContext *ctx) : SavedStatusContext(ctx) {}
589     NO_COPY_SEMANTIC(SwitchContext);
590     NO_MOVE_SEMANTIC(SwitchContext);
591     ~SwitchContext() = default;
592 };
593 
594 template <typename T>
595 class IterationContext : public SavedStatusContext<ParserStatus::IN_ITERATION> {
596 public:
IterationContext(ParserContext * ctx,binder::Binder * binder)597     explicit IterationContext(ParserContext *ctx, binder::Binder *binder)
598         : SavedStatusContext(ctx), lexicalScope_(binder)
599     {
600     }
601 
602     NO_COPY_SEMANTIC(IterationContext);
603     NO_MOVE_SEMANTIC(IterationContext);
604     ~IterationContext() = default;
605 
LexicalScope()606     const auto &LexicalScope() const
607     {
608         return lexicalScope_;
609     }
610 
611 private:
612     binder::LexicalScope<T> lexicalScope_;
613 };
614 
615 class FunctionParameterContext : public SavedStatusContext<ParserStatus::FUNCTION_PARAM> {
616 public:
FunctionParameterContext(ParserContext * ctx,binder::Binder * binder)617     explicit FunctionParameterContext(ParserContext *ctx, binder::Binder *binder)
618         : SavedStatusContext(ctx), lexicalScope_(binder)
619     {
620     }
621 
LexicalScope()622     const auto &LexicalScope() const
623     {
624         return lexicalScope_;
625     }
626 
627     NO_COPY_SEMANTIC(FunctionParameterContext);
628     NO_MOVE_SEMANTIC(FunctionParameterContext);
629     ~FunctionParameterContext() = default;
630 
631 private:
632     binder::LexicalScope<binder::FunctionParamScope> lexicalScope_;
633 };
634 
635 class SavedParserContext {
636 public:
637     template <typename... Args>
SavedParserContext(ParserImpl * parser,Args &&...args)638     explicit SavedParserContext(ParserImpl *parser, Args &&... args) : parser_(parser), prev_(parser->context_)
639     {
640         parser_->context_ = ParserContext(&prev_, std::forward<Args>(args)...);
641     }
642 
643     NO_COPY_SEMANTIC(SavedParserContext);
644     DEFAULT_MOVE_SEMANTIC(SavedParserContext);
645 
~SavedParserContext()646     ~SavedParserContext()
647     {
648         parser_->context_ = prev_;
649     }
650 
651 protected:
Binder()652     binder::Binder *Binder()
653     {
654         return parser_->Binder();
655     }
656 
657     ParserImpl *parser_;
658     ParserContext prev_;
659 };
660 
661 class FunctionContext : public SavedParserContext {
662 public:
FunctionContext(ParserImpl * parser,ParserStatus newStatus)663     explicit FunctionContext(ParserImpl *parser, ParserStatus newStatus) : SavedParserContext(parser, newStatus)
664     {
665         if (newStatus & ParserStatus::GENERATOR_FUNCTION) {
666             flags_ |= ir::ScriptFunctionFlags::GENERATOR;
667         }
668 
669         if (newStatus & ParserStatus::ASYNC_FUNCTION) {
670             flags_ |= ir::ScriptFunctionFlags::ASYNC;
671         }
672 
673         if (newStatus & ParserStatus::CONSTRUCTOR_FUNCTION) {
674             flags_ |= ir::ScriptFunctionFlags::CONSTRUCTOR;
675         }
676     }
677 
Flags()678     ir::ScriptFunctionFlags Flags() const
679     {
680         return flags_;
681     }
682 
AddFlag(ir::ScriptFunctionFlags flags)683     void AddFlag(ir::ScriptFunctionFlags flags)
684     {
685         flags_ |= flags;
686     }
687 
688     NO_COPY_SEMANTIC(FunctionContext);
689     NO_MOVE_SEMANTIC(FunctionContext);
690     ~FunctionContext() = default;
691 
692 protected:
693     ir::ScriptFunctionFlags flags_ {ir::ScriptFunctionFlags::NONE};
694 };
695 
696 class ArrowFunctionContext : public FunctionContext {
697 public:
ArrowFunctionContext(ParserImpl * parser,bool isAsync)698     explicit ArrowFunctionContext(ParserImpl *parser, bool isAsync)
699         : FunctionContext(parser, InitialFlags(parser->context_.Status()))
700     {
701         if (isAsync) {
702             AddFlag(ir::ScriptFunctionFlags::ASYNC);
703         }
704 
705         AddFlag(ir::ScriptFunctionFlags::ARROW);
706     }
707 
708     NO_COPY_SEMANTIC(ArrowFunctionContext);
709     NO_MOVE_SEMANTIC(ArrowFunctionContext);
710     ~ArrowFunctionContext() = default;
711 
712 private:
InitialFlags(ParserStatus currentStatus)713     static ParserStatus InitialFlags(ParserStatus currentStatus)
714     {
715         return ParserStatus::FUNCTION | ParserStatus::ARROW_FUNCTION |
716                static_cast<ParserStatus>(currentStatus & (ParserStatus::ALLOW_SUPER | ParserStatus::ALLOW_SUPER_CALL));
717     }
718 };
719 
720 }  // namespace panda::es2panda::parser
721 
722 #endif
723