1 /** 2 * Copyright (c) 2021 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_IR_EXPRESSION_LITERAL_NUMBER_LITERAL_H 17 #define ES2PANDA_IR_EXPRESSION_LITERAL_NUMBER_LITERAL_H 18 19 #include <ir/expressions/literal.h> 20 #include <util/ustring.h> 21 22 namespace panda::es2panda::compiler { 23 class PandaGen; 24 } // namespace panda::es2panda::compiler 25 26 namespace panda::es2panda::checker { 27 class Checker; 28 class Type; 29 } // namespace panda::es2panda::checker 30 31 namespace panda::es2panda::ir { 32 33 class NumberLiteral : public Literal { 34 public: NumberLiteral(double num)35 explicit NumberLiteral(double num) : Literal(AstNodeType::NUMBER_LITERAL), number_(num) {} NumberLiteral(double num,util::StringView str)36 explicit NumberLiteral(double num, util::StringView str) 37 : Literal(AstNodeType::NUMBER_LITERAL), number_(num), str_(str) 38 { 39 } 40 41 template <typename T = double> Number()42 T Number() const 43 { 44 return static_cast<T>(number_); 45 } 46 Str()47 const util::StringView &Str() const 48 { 49 return str_; 50 } 51 Tag()52 LiteralTag Tag() const override 53 { 54 return IsInteger() ? LiteralTag::INTEGER : LiteralTag::DOUBLE; 55 } 56 57 bool operator==(const NumberLiteral &other) const 58 { 59 return number_ == other.number_; 60 } 61 62 bool IsInteger() const; 63 64 void Iterate(const NodeTraverser &cb) const override; 65 void Dump(ir::AstDumper *dumper) const override; 66 void Compile(compiler::PandaGen *pg) const override; 67 checker::Type *Check(checker::Checker *checker) const override; 68 void UpdateSelf([[maybe_unused]] const NodeUpdater &cb, [[maybe_unused]] binder::Binder *binder) override; 69 70 private: 71 double number_; 72 util::StringView str_; 73 }; 74 75 class UserTypeIndexLiteral : public NumberLiteral { 76 public: UserTypeIndexLiteral(double num,util::StringView str)77 explicit UserTypeIndexLiteral(double num, util::StringView str) : NumberLiteral(num, str) {} 78 Tag()79 LiteralTag Tag() const override 80 { 81 return LiteralTag::LITERALARRAY; 82 } 83 }; 84 85 class BuiltinTypeIndexLiteral : public NumberLiteral { 86 public: BuiltinTypeIndexLiteral(double num)87 explicit BuiltinTypeIndexLiteral(double num) : NumberLiteral(num) {} 88 Tag()89 LiteralTag Tag() const override 90 { 91 return LiteralTag::BUILTINTYPEINDEX; 92 } 93 }; 94 95 } // namespace panda::es2panda::ir 96 97 #endif /* NUMBER_LITERAL_H */ 98