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