13af6ab5fSopenharmony_ci/** 23af6ab5fSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License. 53af6ab5fSopenharmony_ci * You may obtain a copy of the License at 63af6ab5fSopenharmony_ci * 73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 83af6ab5fSopenharmony_ci * 93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and 133af6ab5fSopenharmony_ci * limitations under the License. 143af6ab5fSopenharmony_ci */ 153af6ab5fSopenharmony_ci 163af6ab5fSopenharmony_ci#ifndef ES2PANDA_PARSER_CORE_TS_PARSER_H 173af6ab5fSopenharmony_ci#define ES2PANDA_PARSER_CORE_TS_PARSER_H 183af6ab5fSopenharmony_ci 193af6ab5fSopenharmony_ci#include "TypedParser.h" 203af6ab5fSopenharmony_ci#include "parserFlags.h" 213af6ab5fSopenharmony_ci 223af6ab5fSopenharmony_cinamespace ark::es2panda::ir { 233af6ab5fSopenharmony_ciclass Decorator; 243af6ab5fSopenharmony_cienum class TSTupleKind; 253af6ab5fSopenharmony_ci} // namespace ark::es2panda::ir 263af6ab5fSopenharmony_ci 273af6ab5fSopenharmony_cinamespace ark::es2panda::parser { 283af6ab5fSopenharmony_ciclass TSParser : public TypedParser { 293af6ab5fSopenharmony_cipublic: 303af6ab5fSopenharmony_ci TSParser(Program *program, const CompilerOptions &options, ParserStatus status = ParserStatus::NO_OPTS) 313af6ab5fSopenharmony_ci : TypedParser(program, options, status) 323af6ab5fSopenharmony_ci { 333af6ab5fSopenharmony_ci } 343af6ab5fSopenharmony_ci 353af6ab5fSopenharmony_ciprivate: 363af6ab5fSopenharmony_ci [[nodiscard]] std::unique_ptr<lexer::Lexer> InitLexer(const SourceFile &sourceFile) override; 373af6ab5fSopenharmony_ci bool IsStartOfMappedType() const; 383af6ab5fSopenharmony_ci bool IsStartOfTypePredicate() const; 393af6ab5fSopenharmony_ci bool IsStartOfAbstractConstructorType() const; 403af6ab5fSopenharmony_ci bool CurrentLiteralIsBasicType() const; 413af6ab5fSopenharmony_ci ir::TypeNode *ParseTypeAnnotationElement(ir::TypeNode *typeAnnotation, TypeAnnotationParsingOptions *options); 423af6ab5fSopenharmony_ci class ParseTypeAnnotationElementHelper; 433af6ab5fSopenharmony_ci class ParsePotentialArrowExpressionHelper; 443af6ab5fSopenharmony_ci ir::TypeNode *ParseTypeOperatorOrTypeReference(); 453af6ab5fSopenharmony_ci ir::TypeNode *ParseIdentifierReference(); 463af6ab5fSopenharmony_ci class ParseBasicTypeHelper; 473af6ab5fSopenharmony_ci ir::TypeNode *ParseBasicType(); 483af6ab5fSopenharmony_ci ir::TSTypeReference *ParseConstExpression(); 493af6ab5fSopenharmony_ci ir::TSIntersectionType *ParseIntersectionType(ir::Expression *type, bool inUnion, bool restrictExtends); 503af6ab5fSopenharmony_ci ir::TSUnionType *ParseUnionType(ir::TypeNode *type, bool restrictExtends); 513af6ab5fSopenharmony_ci ir::TypeNode *ParseParenthesizedOrFunctionType(ir::TypeNode *typeAnnotation, bool throwError); 523af6ab5fSopenharmony_ci ir::TSArrayType *ParseArrayType(ir::TypeNode *elementType); 533af6ab5fSopenharmony_ci ir::TypeNode *ParseFunctionType(lexer::SourcePosition startLoc, bool isConstructionType, bool throwError, 543af6ab5fSopenharmony_ci bool abstractConstructor = false); 553af6ab5fSopenharmony_ci ir::TSTypeParameter *ParseMappedTypeParameter(); 563af6ab5fSopenharmony_ci ir::MappedOption ParseMappedOption(lexer::TokenType tokenType); 573af6ab5fSopenharmony_ci ir::TSMappedType *ParseMappedType(); 583af6ab5fSopenharmony_ci ir::TSTypePredicate *ParseTypePredicate(); 593af6ab5fSopenharmony_ci ir::TypeNode *ParseConditionalType(ir::Expression *checkType, bool restrictExtends); 603af6ab5fSopenharmony_ci ir::TypeNode *ParseThisType(bool throwError); 613af6ab5fSopenharmony_ci ir::TypeNode *ParseIndexAccessType(ir::TypeNode *typeName); 623af6ab5fSopenharmony_ci ir::TypeNode *ParseTypeReferenceOrQuery(bool parseQuery = false); 633af6ab5fSopenharmony_ci ir::TypeNode *ParseTupleElement(ir::TSTupleKind *kind, bool *seenOptional); 643af6ab5fSopenharmony_ci ir::TSTupleType *ParseTupleType(); 653af6ab5fSopenharmony_ci ir::TSImportType *ParseImportType(const lexer::SourcePosition &startLoc, bool isTypeof = false); 663af6ab5fSopenharmony_ci ir::TypeNode *ParseTypeLiteralOrMappedType(ir::TypeNode *typeAnnotation); 673af6ab5fSopenharmony_ci ir::TypeNode *ParseTypeReferenceOrTypePredicate(ir::TypeNode *typeAnnotation, bool canBeTsTypePredicate); 683af6ab5fSopenharmony_ci ir::TypeNode *ParseThisTypeOrTypePredicate(ir::TypeNode *typeAnnotation, bool canBeTsTypePredicate, 693af6ab5fSopenharmony_ci bool throwError); 703af6ab5fSopenharmony_ci ir::TSSignatureDeclaration *ParseSignatureMember(bool isCallSignature); 713af6ab5fSopenharmony_ci bool IsPotentiallyIndexSignature(); 723af6ab5fSopenharmony_ci void CreateTSVariableForProperty(ir::AstNode *node, const ir::Expression *key, varbinder::VariableFlags flags); 733af6ab5fSopenharmony_ci void ValidateFunctionParam(const ArenaVector<ir::Expression *> ¶ms, const ir::Expression *parameter, 743af6ab5fSopenharmony_ci bool *seenOptional); 753af6ab5fSopenharmony_ci ir::TSParameterProperty *CreateParameterProperty(ir::Expression *parameter, ir::ModifierFlags modifiers); 763af6ab5fSopenharmony_ci void ValidateFunctionOverloadParams(const ArenaVector<ir::Expression *> ¶ms); 773af6ab5fSopenharmony_ci ir::Expression *ParseModuleReference(); 783af6ab5fSopenharmony_ci ir::TSImportEqualsDeclaration *ParseTsImportEqualsDeclaration(const lexer::SourcePosition &startLoc, 793af6ab5fSopenharmony_ci bool isExport = false); 803af6ab5fSopenharmony_ci void ParseOptionalFunctionParameter(ir::AnnotatedExpression *returnNode, bool isRest = false); 813af6ab5fSopenharmony_ci 823af6ab5fSopenharmony_ci // NOLINTNEXTLINE(google-default-arguments) 833af6ab5fSopenharmony_ci ir::Statement *ParseStatement(StatementParsingFlags flags = StatementParsingFlags::NONE) override; 843af6ab5fSopenharmony_ci ir::AnnotatedExpression *ParsePatternElementGetReturnNode(ExpressionParseFlags &flags, bool &isOptional); 853af6ab5fSopenharmony_ci // NOLINTNEXTLINE(google-default-arguments) 863af6ab5fSopenharmony_ci ir::Expression *ParsePatternElement(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS, 873af6ab5fSopenharmony_ci bool allowDefault = true) override; 883af6ab5fSopenharmony_ci bool CurrentIsBasicType() override; 893af6ab5fSopenharmony_ci ir::TypeNode *ParseTypeAnnotation(TypeAnnotationParsingOptions *options) override; 903af6ab5fSopenharmony_ci // NOLINTNEXTLINE(google-default-arguments) 913af6ab5fSopenharmony_ci ir::ObjectExpression *ParseObjectExpression(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS) override; 923af6ab5fSopenharmony_ci // NOLINTNEXTLINE(google-default-arguments) 933af6ab5fSopenharmony_ci ir::ArrayExpression *ParseArrayExpression(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS) override; 943af6ab5fSopenharmony_ci ir::ArrowFunctionExpression *ParsePotentialArrowExpression(ir::Expression **returnExpression, 953af6ab5fSopenharmony_ci const lexer::SourcePosition &startLoc) override; 963af6ab5fSopenharmony_ci bool ParsePotentialGenericFunctionCall(ir::Expression *primaryExpr, ir::Expression **returnExpression, 973af6ab5fSopenharmony_ci const lexer::SourcePosition &startLoc, bool ignoreCallExpression) override; 983af6ab5fSopenharmony_ci bool ParsePotentialNonNullExpression(ir::Expression **returnExpression, lexer::SourcePosition startLoc) override; 993af6ab5fSopenharmony_ci bool IsNamedFunctionExpression() override; 1003af6ab5fSopenharmony_ci ir::Identifier *ParsePrimaryExpressionIdent(ExpressionParseFlags flags) override; 1013af6ab5fSopenharmony_ci void ValidateArrowFunctionRestParameter(ir::SpreadElement *restElement) override; 1023af6ab5fSopenharmony_ci ir::Decorator *ParseDecorator() override; 1033af6ab5fSopenharmony_ci void AddDecorators(ir::AstNode *node, ArenaVector<ir::Decorator *> &decorators) override; 1043af6ab5fSopenharmony_ci ir::TSTypeAliasDeclaration *ParseTypeAliasDeclaration() override; 1053af6ab5fSopenharmony_ci ir::AstNode *ParseTypeLiteralOrInterfaceMember() override; 1063af6ab5fSopenharmony_ci // NOLINTNEXTLINE(google-default-arguments) 1073af6ab5fSopenharmony_ci ir::TSIndexSignature *ParseIndexSignature(const lexer::SourcePosition &startLoc, bool isReadonly = false) override; 1083af6ab5fSopenharmony_ci ir::AstNode *ParsePropertyOrMethodSignature(const lexer::SourcePosition &startLoc, bool isReadonly) override; 1093af6ab5fSopenharmony_ci std::tuple<ir::Expression *, bool> ParseInterfacePropertyKey() override; 1103af6ab5fSopenharmony_ci ArenaVector<ir::Expression *> ParseFunctionParams() override; 1113af6ab5fSopenharmony_ci ir::Expression *ParseFunctionParameter() override; 1123af6ab5fSopenharmony_ci ir::TypeNode *ParseClassKeyAnnotation() override; 1133af6ab5fSopenharmony_ci void ValidateClassMethodStart(ClassElementDescriptor *desc, ir::TypeNode *typeAnnotation) override; 1143af6ab5fSopenharmony_ci ir::MethodDefinition *ParseClassMethod(ClassElementDescriptor *desc, const ArenaVector<ir::AstNode *> &properties, 1153af6ab5fSopenharmony_ci ir::Expression *propName, lexer::SourcePosition *propEnd) override; 1163af6ab5fSopenharmony_ci void ValidateClassSetter(ClassElementDescriptor *desc, const ArenaVector<ir::AstNode *> &properties, 1173af6ab5fSopenharmony_ci ir::Expression *propName, ir::ScriptFunction *func) override; 1183af6ab5fSopenharmony_ci void ValidateClassGetter(ClassElementDescriptor *desc, const ArenaVector<ir::AstNode *> &properties, 1193af6ab5fSopenharmony_ci ir::Expression *propName, ir::ScriptFunction *func) override; 1203af6ab5fSopenharmony_ci bool IsModifierKind(const lexer::Token &token) override; 1213af6ab5fSopenharmony_ci void CheckIfTypeParameterNameIsReserved() override; 1223af6ab5fSopenharmony_ci void ThrowErrorIfStaticConstructor(ir::ModifierFlags flags) override; 1233af6ab5fSopenharmony_ci std::tuple<bool, bool, bool> ParseComputedClassFieldOrIndexSignature(ir::Expression **propName) override; 1243af6ab5fSopenharmony_ci ir::TypeNode *ParseFunctionReturnType(ParserStatus status) override; 1253af6ab5fSopenharmony_ci std::tuple<bool, ir::BlockStatement *, lexer::SourcePosition, bool> ParseFunctionBody( 1263af6ab5fSopenharmony_ci const ArenaVector<ir::Expression *> ¶ms, ParserStatus newStatus, ParserStatus contextStatus) override; 1273af6ab5fSopenharmony_ci ir::AstNode *ParseImportDefaultSpecifier(ArenaVector<ir::AstNode *> *specifiers) override; 1283af6ab5fSopenharmony_ci ir::Statement *ParseExportDeclaration(StatementParsingFlags flags) override; 1293af6ab5fSopenharmony_ci // NOLINTNEXTLINE(google-default-arguments) 1303af6ab5fSopenharmony_ci ir::Expression *ParseCoverParenthesizedExpressionAndArrowParameterList( 1313af6ab5fSopenharmony_ci ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS) override; 1323af6ab5fSopenharmony_ci ir::Expression *ParseArrowFunctionRestParameter(lexer::SourcePosition start); 1333af6ab5fSopenharmony_ci ir::Expression *ParseArrowFunctionNoParameter(lexer::SourcePosition start); 1343af6ab5fSopenharmony_ci ir::Statement *ParseConstStatement(StatementParsingFlags flags) override; 1353af6ab5fSopenharmony_ci ir::Statement *ParsePotentialConstEnum(VariableParsingFlags flags) override; 1363af6ab5fSopenharmony_ci void ParseCatchParamTypeAnnotation(ir::AnnotatedExpression *param) override; 1373af6ab5fSopenharmony_ci ir::AnnotatedExpression *ParseVariableDeclaratorKey(VariableParsingFlags flags) override; 1383af6ab5fSopenharmony_ci void ThrowPossibleOutOfBoundaryJumpError(bool allowBreak) override; 1393af6ab5fSopenharmony_ci void ThrowIllegalBreakError() override; 1403af6ab5fSopenharmony_ci void ThrowIllegalContinueError() override; 1413af6ab5fSopenharmony_ci void ThrowIfBodyEmptyError(ir::Statement *consequent) override; 1423af6ab5fSopenharmony_ci void ThrowMultipleDefaultError() override; 1433af6ab5fSopenharmony_ci void ThrowIllegalNewLineErrorAfterThrow() override; 1443af6ab5fSopenharmony_ci // NOLINTNEXTLINE(google-default-arguments) 1453af6ab5fSopenharmony_ci ir::ExportDefaultDeclaration *ParseExportDefaultDeclaration(const lexer::SourcePosition &startLoc, 1463af6ab5fSopenharmony_ci bool isExportEquals = false) override; 1473af6ab5fSopenharmony_ci ir::Statement *GetDeclarationForNamedExport(ir::ClassDefinitionModifiers &classModifiers, ir::ModifierFlags &flags); 1483af6ab5fSopenharmony_ci ir::ExportNamedDeclaration *ParseNamedExportDeclaration(const lexer::SourcePosition &startLoc) override; 1493af6ab5fSopenharmony_ci ir::Statement *ParseImportDeclaration(StatementParsingFlags flags) override; 1503af6ab5fSopenharmony_ci void ValidateIndexSignatureTypeAnnotation(ir::TypeNode *typeAnnotation) override; 1513af6ab5fSopenharmony_ci ir::Expression *ParsePotentialAsExpression(ir::Expression *expr) override; 1523af6ab5fSopenharmony_ci 1533af6ab5fSopenharmony_ci bool AllowInterfaceRedeclaration() override 1543af6ab5fSopenharmony_ci { 1553af6ab5fSopenharmony_ci return true; 1563af6ab5fSopenharmony_ci } 1573af6ab5fSopenharmony_ci}; 1583af6ab5fSopenharmony_ci} // namespace ark::es2panda::parser 1593af6ab5fSopenharmony_ci 1603af6ab5fSopenharmony_ci#endif 161