• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2021-2025 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_TYPED_PARSER_H
17 #define ES2PANDA_PARSER_CORE_TYPED_PARSER_H
18 
19 #include "parserImpl.h"
20 
21 namespace ark::es2panda::ir {
22 class TSClassImplements;
23 }  // namespace ark::es2panda::ir
24 
25 namespace ark::es2panda::parser {
26 class TypedParser : public ParserImpl {
27 public:
28     TypedParser(Program *program, const util::Options *options, util::DiagnosticEngine &diagnosticEngine,
29                 ParserStatus status = ParserStatus::NO_OPTS)
ParserImpl(program,options,diagnosticEngine,status)30         : ParserImpl(program, options, diagnosticEngine, status)
31     {
32     }
33 
34 protected:
35     void ParseDecorators(ArenaVector<ir::Decorator *> &decorators);
36     void CheckDeclare();
37     ir::TSModuleDeclaration *ParseAmbientExternalModuleDeclaration(const lexer::SourcePosition &startLoc);
38     ir::TSModuleBlock *ParseTsModuleBlock();
39     ir::TSModuleDeclaration *ParseModuleOrNamespaceDeclaration(const lexer::SourcePosition &startLoc);
40     ArenaVector<ir::AstNode *> ParseTypeLiteralOrInterface();
41     ArenaVector<ir::AstNode *> ParseTypeLiteralOrInterfaceBody();
42     void CheckObjectTypeForDuplicatedProperties(ir::Expression *key, ArenaVector<ir::AstNode *> &members);
43 
44     ir::ArrowFunctionExpression *ParseGenericArrowFunction();
45     ir::TSTypeAssertion *ParseTypeAssertion();
46 
47     ir::TSTypeParameterInstantiation *ParseTypeParameterInstantiation(TypeAnnotationParsingOptions *options);
48     ir::AstNode *ParseTypeParameterInstantiationImpl(TypeAnnotationParsingOptions *options);
49 
50     ir::TSTypeParameterDeclaration *ParseTypeParameterDeclaration(TypeAnnotationParsingOptions *options);
51     ir::AstNode *ParseTypeParameterDeclarationImpl(TypeAnnotationParsingOptions *options);
52 
53     ir::Expression *ParseQualifiedName(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
54     ir::Expression *ParseQualifiedReference(ir::Expression *typeName,
55                                             ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS);
56     void ParsePotentialOptionalFunctionParameter(ir::AnnotatedExpression *returnNode);
57     // NOLINTNEXTLINE(google-default-arguments)
58     ir::Expression *ParseExpression(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS) override;
59     ir::Statement *ParseInterfaceDeclaration(bool isStatic) override;
60     // NOLINTNEXTLINE(google-default-arguments)
61     ir::Statement *ParseEnumDeclaration(bool isConst = false, bool isStatic = false) override;
62     ir::Statement *ParsePotentialExpressionStatement(StatementParsingFlags flags) override;
63     void ConvertThisKeywordToIdentIfNecessary() override;
64     ir::TypeNode *ParseFunctionReturnType(ParserStatus status) override;
65     ir::TSTypeParameterDeclaration *ParseFunctionTypeParameters() override;
66     // NOLINTNEXTLINE(google-default-arguments)
67     ir::ClassDefinition *ParseClassDefinition(ir::ClassDefinitionModifiers modifiers,
68                                               ir::ModifierFlags flags = ir::ModifierFlags::NONE) override;
69     ir::AstNode *ParseClassElement(const ArenaVector<ir::AstNode *> &properties, ir::ClassDefinitionModifiers modifiers,
70                                    ir::ModifierFlags flags) override;
71 
72     static bool CheckClassElementInterfaceBody(ir::AstNode *property, ArenaVector<ir::AstNode *> &properties);
73     bool CheckClassElement(ir::AstNode *property, ir::MethodDefinition *&ctor,
74                            ArenaVector<ir::AstNode *> &properties) override;
75     bool IsNamespaceDecl();
76     bool IsPrimitiveType(const lexer::TokenType &tokenType);
77     bool IsValidTokenTypeOfArrowFunctionStart(lexer::TokenType tokenType);
78     bool EatArrowFunctionParams(lexer::Lexer *lexer);
79 
80     ir::ModifierFlags ParseModifiers() override;
81     ParserStatus ValidateArrowParameter(ir::Expression *expr, bool *seenOptional) override;
82     ir::Expression *ParsePotentialAsExpression(ir::Expression *primaryExpression) override;
83 
84     std::tuple<ir::Expression *, ir::TSTypeParameterInstantiation *> ParseSuperClass() override;
85     ir::Expression *ParseSuperClassReference() override;
86     virtual ArenaVector<ir::TSClassImplements *> ParseClassImplementClause();
87 
88     // NOLINTNEXTLINE(google-default-arguments)
89     ir::Statement *ParseModuleDeclaration(StatementParsingFlags flags = StatementParsingFlags::NONE) override;
90     virtual ir::Statement *ParseNamespace(ir::ModifierFlags flags);
CheckIfTypeParameterNameIsReserved()91     virtual void CheckIfTypeParameterNameIsReserved() {};
92     virtual ArenaVector<ir::TSInterfaceHeritage *> ParseInterfaceExtendsClause();
93     virtual ir::Statement *ParseDeclareAndDecorators(StatementParsingFlags flags);
94     virtual void ParseOptionalClassElement(ClassElementDescriptor *desc);
95     virtual ir::TSTypeParameter *ParseTypeParameter(TypeAnnotationParsingOptions *options);
96     virtual ir::TSEnumDeclaration *ParseEnumMembers(ir::Identifier *key, const lexer::SourcePosition &enumStart,
97                                                     bool isConst, bool isStatic);
98     virtual std::tuple<ir::Expression *, ir::TSTypeParameterInstantiation *> ParseClassImplementsElement();
99     virtual ir::TypeNode *ParseInterfaceExtendsElement();
100 
101     virtual void ValidateIndexSignatureTypeAnnotation(ir::TypeNode *typeAnnotation);
ParseDecorator()102     virtual ir::Decorator *ParseDecorator()
103     {
104         return nullptr;
105     }
CurrentIsBasicType()106     virtual bool CurrentIsBasicType()
107     {
108         return false;
109     }
ParseTypeAliasDeclaration()110     virtual ir::TSTypeAliasDeclaration *ParseTypeAliasDeclaration()
111     {
112         return nullptr;
113     }
ParseTypeLiteralOrInterfaceMember()114     virtual ir::AstNode *ParseTypeLiteralOrInterfaceMember()
115     {
116         return nullptr;
117     }
118     // NOLINTNEXTLINE(google-default-arguments)
119     virtual ir::TSIndexSignature *ParseIndexSignature([[maybe_unused]] const lexer::SourcePosition &startLoc,
120                                                       [[maybe_unused]] bool isReadonly = false)
121     {
122         return nullptr;
123     }
ParsePropertyOrMethodSignature(const lexer::SourcePosition & startLoc,bool isReadonly)124     virtual ir::AstNode *ParsePropertyOrMethodSignature([[maybe_unused]] const lexer::SourcePosition &startLoc,
125                                                         [[maybe_unused]] bool isReadonly)
126     {
127         return nullptr;
128     }
ParseInterfacePropertyKey()129     virtual std::tuple<ir::Expression *, bool> ParseInterfacePropertyKey()
130     {
131         return {nullptr, false};
132     }
ParseClassKeyAnnotation()133     virtual ir::TypeNode *ParseClassKeyAnnotation()
134     {
135         return nullptr;
136     }
ParseTypeAnnotation(TypeAnnotationParsingOptions * options)137     virtual ir::TypeNode *ParseTypeAnnotation([[maybe_unused]] TypeAnnotationParsingOptions *options)
138     {
139         return nullptr;
140     }
AddDecorators(ir::AstNode * node,ArenaVector<ir::Decorator * > & decorators)141     virtual void AddDecorators([[maybe_unused]] ir::AstNode *node,
142                                [[maybe_unused]] ArenaVector<ir::Decorator *> &decorators)
143     {
144     }
145 
146     ir::VariableDeclarator *ParseVariableDeclarator(ir::Expression *init, lexer::SourcePosition startLoc,
147                                                     VariableParsingFlags flags) override;
148 
149     using InterfaceId = std::tuple<ir::Identifier *, varbinder::InterfaceDecl *, bool>;
150     InterfaceId ParseInterfaceDeclarationId();
151 
AllowInterfaceRedeclaration()152     virtual bool AllowInterfaceRedeclaration()
153     {
154         return false;
155     }
156 
157 private:
158     ParserStatus ValidateArrowParameterAssignment(ir::AssignmentExpression *assignmentExpr);
159     ParserStatus ValidateArrowParameterArray(ir::ArrayExpression *arrayPattern);
160     ParserStatus ValidateArrowParameterObject(ir::ObjectExpression *objectPattern);
161 
162     ir::Expression *ParseLiteralIndent(ir::Expression *typeName, ExpressionParseFlags flags,
163                                        const lexer::SourcePosition &startLoc);
164 
165     ir::AstNode *ParseProperty(const ArenaVector<ir::AstNode *> &properties, ClassElementDescriptor &desc,
166                                ir::Expression *propName);
167 };
168 }  // namespace ark::es2panda::parser
169 
170 #endif
171