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 }