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_COMPILER_CHECKER_TYPES_ETS_STRING_TYPE_H 17 #define ES2PANDA_COMPILER_CHECKER_TYPES_ETS_STRING_TYPE_H 18 19 #include "checker/types/ets/etsObjectType.h" 20 21 namespace ark::es2panda::checker { 22 class ETSStringType : public ETSObjectType { 23 public: ETSStringType(ArenaAllocator * allocator,ETSObjectType * super)24 explicit ETSStringType(ArenaAllocator *allocator, ETSObjectType *super) 25 : ETSObjectType(allocator, "", compiler::Signatures::BUILTIN_STRING, super->GetDeclNode(), 26 ETSObjectFlags::CLASS | ETSObjectFlags::STRING | ETSObjectFlags::RESOLVED_SUPER) 27 { 28 SetSuperType(super); 29 } 30 ETSStringType(ArenaAllocator * allocator,ETSObjectType * super,TypeRelation * relation)31 explicit ETSStringType(ArenaAllocator *allocator, ETSObjectType *super, TypeRelation *relation) 32 : ETSObjectType(allocator, "", compiler::Signatures::BUILTIN_STRING, 33 std::make_tuple(super->GetDeclNode(), 34 ETSObjectFlags::CLASS | ETSObjectFlags::STRING | ETSObjectFlags::RESOLVED_SUPER, 35 relation)) 36 { 37 SetSuperType(super); 38 } 39 ETSStringType(ArenaAllocator * allocator,ETSObjectType * super,TypeRelation * relation,util::StringView value)40 explicit ETSStringType(ArenaAllocator *allocator, ETSObjectType *super, TypeRelation *relation, 41 util::StringView value) 42 : ETSObjectType(allocator, "", compiler::Signatures::BUILTIN_STRING, 43 std::make_tuple(super->GetDeclNode(), 44 ETSObjectFlags::CLASS | ETSObjectFlags::STRING | ETSObjectFlags::RESOLVED_SUPER, 45 relation)), 46 value_(value) 47 { 48 SetSuperType(super); 49 AddTypeFlag(TypeFlag::CONSTANT); 50 variable_ = super->Variable(); 51 } 52 53 void Identical(TypeRelation *relation, Type *other) override; 54 bool AssignmentSource(TypeRelation *relation, Type *target) override; 55 void AssignmentTarget(TypeRelation *relation, Type *source) override; 56 Type *Instantiate(ArenaAllocator *allocator, TypeRelation *relation, GlobalTypesHolder *globalTypes) override; 57 void IsSupertypeOf(TypeRelation *relation, Type *source) override; 58 void IsSubtypeOf(TypeRelation *relation, Type *source) override; 59 ToString(std::stringstream & ss,bool precise)60 void ToString(std::stringstream &ss, [[maybe_unused]] bool precise) const override 61 { 62 if (IsConstantType()) { 63 ss << "\"" << value_ << "\""; 64 } else { 65 ss << lexer::TokenToString(lexer::TokenType::KEYW_STRING); 66 } 67 } 68 ToAssemblerType(std::stringstream & ss)69 void ToAssemblerType(std::stringstream &ss) const override 70 { 71 ss << compiler::Signatures::BUILTIN_STRING; 72 } 73 GetValue()74 util::StringView GetValue() const 75 { 76 return value_; 77 } 78 ResolveConditionExpr()79 std::tuple<bool, bool> ResolveConditionExpr() const override 80 { 81 return {IsConstantType(), IsConstantType() ? (GetValue().Length() != 0) : false}; 82 } 83 84 private: 85 util::StringView value_ {}; 86 }; 87 } // namespace ark::es2panda::checker 88 89 #endif 90