1 /* 2 * Copyright (c) 2021 - 2024 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 PANDA_TYPECHECKER_H 17 #define PANDA_TYPECHECKER_H 18 19 #include "ir/visitor/IterateAstVisitor.h" 20 21 namespace ark::es2panda::checker { 22 23 /* 24 * This class should be launched after Checker pass. 25 * Should contain all type checks, which are non-critical for `Checker` (`Checker` can keep working with such type 26 * error). 27 */ 28 class TypeChecker : public ir::visitor::IterateAstVisitor { 29 public: 30 // NOTE(aleksisch): after merging #14938 add `const-AstVisitor` and make this pass const Check(ir::AstNode * node)31 bool Check(ir::AstNode *node) 32 { 33 node->Accept(this); 34 return true; 35 } 36 37 protected: 38 // NOTE(aleksisch): checker should be replaced with some `ErrorHandler` TypeChecker(Checker * checker)39 explicit TypeChecker(Checker *checker) : checker_(checker) {} 40 LogTypeError(std::initializer_list<TypeErrorMessageElement> list,const lexer::SourcePosition & pos)41 void LogTypeError(std::initializer_list<TypeErrorMessageElement> list, const lexer::SourcePosition &pos) 42 { 43 checker_->LogTypeError(list, pos); 44 } 45 46 private: 47 Checker *const checker_; 48 }; 49 50 class ETSTypeChecker : public TypeChecker { 51 public: ETSTypeChecker(Checker * checker)52 explicit ETSTypeChecker(Checker *checker) : TypeChecker(checker) {} 53 54 private: 55 void VisitArrowFunctionExpression(ir::ArrowFunctionExpression *node) override; 56 }; 57 58 class JSTypeChecker : public TypeChecker { 59 public: JSTypeChecker(Checker * checker)60 explicit JSTypeChecker(Checker *checker) : TypeChecker(checker) {} 61 }; 62 63 class TSTypeChecker : public TypeChecker { 64 public: TSTypeChecker(Checker * checker)65 explicit TSTypeChecker(Checker *checker) : TypeChecker(checker) {} 66 }; 67 68 class ASTypeChecker : public TypeChecker { 69 public: ASTypeChecker(Checker * checker)70 explicit ASTypeChecker(Checker *checker) : TypeChecker(checker) {} 71 }; 72 73 bool RunTypeChecker(Checker *checker, ScriptExtension ext, ir::AstNode *node); 74 75 } // namespace ark::es2panda::checker 76 #endif // PANDA_TYPECHECKER_H 77