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 *> &params, 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 *> &params);
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 *> &params, 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