File indexing completed on 2024-06-16 04:23:17
0001 /* 0002 SPDX-FileCopyrightText: 2006 Roberto Raggi <roberto@kdevelop.org> 0003 SPDX-FileCopyrightText: 2006-2008 Hamish Rodda <rodda@kde.org> 0004 SPDX-FileCopyrightText: 2007-2008 David Nolden <david.nolden.kdevelop@art-master.de> 0005 0006 SPDX-License-Identifier: LGPL-2.0-only 0007 */ 0008 0009 #include "integraltype.h" 0010 0011 #include "typesystemdata.h" 0012 #include "typeregister.h" 0013 #include "typesystem.h" 0014 0015 namespace KDevelop { 0016 REGISTER_TYPE(IntegralType); 0017 0018 IntegralType::IntegralType(const IntegralType& rhs) : AbstractType(copyData<IntegralType>(*rhs.d_func())) 0019 { 0020 } 0021 0022 IntegralType::IntegralType(IntegralTypeData& data) : AbstractType(data) 0023 { 0024 } 0025 0026 uint IntegralType::dataType() const 0027 { 0028 return d_func()->m_dataType; 0029 } 0030 0031 void IntegralType::setDataType(uint dataType) 0032 { 0033 d_func_dynamic()->m_dataType = dataType; 0034 } 0035 0036 AbstractType* IntegralType::clone() const 0037 { 0038 return new IntegralType(*this); 0039 } 0040 0041 bool IntegralType::equals(const AbstractType* _rhs) const 0042 { 0043 if (this == _rhs) 0044 return true; 0045 0046 if (!AbstractType::equals(_rhs)) 0047 return false; 0048 0049 Q_ASSERT(dynamic_cast<const IntegralType*>(_rhs)); 0050 const auto* rhs = static_cast<const IntegralType*>(_rhs); 0051 0052 return d_func()->m_dataType == rhs->d_func()->m_dataType; 0053 } 0054 0055 IntegralType::IntegralType(uint type) 0056 : AbstractType(createData<IntegralType>()) 0057 { 0058 d_func_dynamic()->setTypeClassId<IntegralType>(); 0059 setDataType(type); 0060 } 0061 0062 IntegralType::~IntegralType() 0063 { 0064 } 0065 0066 QString IntegralType::toString() const 0067 { 0068 TYPE_D(IntegralType); 0069 0070 QString name; 0071 0072 switch (d->m_dataType) { 0073 case TypeChar: 0074 name = QStringLiteral("char"); 0075 break; 0076 case TypeChar16_t: 0077 name = QStringLiteral("char16_t"); 0078 break; 0079 case TypeChar32_t: 0080 name = QStringLiteral("char32_t"); 0081 break; 0082 case TypeWchar_t: 0083 name = QStringLiteral("wchar_t"); 0084 break; 0085 case TypeBoolean: 0086 name = QStringLiteral("bool"); 0087 break; 0088 case TypeInt: 0089 name = QStringLiteral("int"); 0090 break; 0091 case TypeFloat: 0092 name = QStringLiteral("float"); 0093 break; 0094 case TypeDouble: 0095 name = QStringLiteral("double"); 0096 break; 0097 case TypeVoid: 0098 name = QStringLiteral("void"); 0099 break; 0100 case TypeMixed: 0101 name = QStringLiteral("mixed"); 0102 break; 0103 case TypeString: 0104 name = QStringLiteral("string"); 0105 break; 0106 case TypeArray: 0107 name = QStringLiteral("array"); 0108 break; 0109 case TypeNull: 0110 name = QStringLiteral("null"); 0111 break; 0112 default: 0113 name = QStringLiteral("<unknown>"); 0114 break; 0115 } 0116 0117 if (modifiers() & UnsignedModifier) 0118 name.prepend(QLatin1String("unsigned ")); 0119 else if (modifiers() & SignedModifier) 0120 name.prepend(QLatin1String("signed ")); 0121 0122 if (modifiers() & ShortModifier) 0123 name.prepend(QLatin1String("short ")); 0124 else if (modifiers() & LongLongModifier) 0125 name.prepend(QLatin1String("long long ")); 0126 else if (modifiers() & LongModifier) 0127 name.prepend(QLatin1String("long ")); 0128 0129 return AbstractType::toString() + name; 0130 } 0131 0132 void IntegralType::accept0(TypeVisitor* v) const 0133 { 0134 v->visit(this); 0135 } 0136 0137 AbstractType::WhichType IntegralType::whichType() const 0138 { 0139 return TypeIntegral; 0140 } 0141 0142 uint IntegralType::hash() const 0143 { 0144 return KDevHash(AbstractType::hash()) << d_func()->m_dataType; 0145 } 0146 }