File indexing completed on 2024-06-16 04:23:16

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 "arraytype.h"
0010 
0011 #include "typeregister.h"
0012 #include "typesystem.h"
0013 
0014 namespace KDevelop {
0015 REGISTER_TYPE(ArrayType);
0016 
0017 ArrayType::ArrayType(const ArrayType& rhs) : AbstractType(copyData<ArrayType>(*rhs.d_func()))
0018 {
0019 }
0020 
0021 ArrayType::ArrayType(ArrayTypeData& data) : AbstractType(data)
0022 {
0023 }
0024 
0025 AbstractType* ArrayType::clone() const
0026 {
0027     return new ArrayType(*this);
0028 }
0029 
0030 bool ArrayType::equals(const AbstractType* _rhs) const
0031 {
0032     if (!AbstractType::equals(_rhs))
0033         return false;
0034 
0035     Q_ASSERT(dynamic_cast<const ArrayType*>(_rhs));
0036     const auto* rhs = static_cast<const ArrayType*>(_rhs);
0037 
0038     TYPE_D(ArrayType);
0039     if (d->m_dimension != rhs->d_func()->m_dimension)
0040         return false;
0041 
0042     return d->m_elementType == rhs->d_func()->m_elementType;
0043 }
0044 
0045 ArrayType::ArrayType()
0046     : AbstractType(createData<ArrayType>())
0047 {
0048 }
0049 
0050 ArrayType::~ArrayType()
0051 {
0052 }
0053 
0054 int ArrayType::dimension() const
0055 {
0056     return d_func()->m_dimension;
0057 }
0058 
0059 void ArrayType::setDimension(int dimension)
0060 {
0061     d_func_dynamic()->m_dimension = dimension;
0062 }
0063 
0064 AbstractType::Ptr ArrayType::elementType() const
0065 {
0066     return d_func()->m_elementType.abstractType();
0067 }
0068 
0069 void ArrayType::setElementType(const AbstractType::Ptr& type)
0070 {
0071     d_func_dynamic()->m_elementType = IndexedType(type);
0072 }
0073 
0074 QString ArrayType::toString() const
0075 {
0076     if (d_func()->m_dimension == 0) {
0077         return QStringLiteral("%1[]").arg(elementType() ? elementType()->toString() : QStringLiteral("<notype>"));
0078     }
0079     return QStringLiteral("%1[%2]").arg(elementType() ? elementType()->toString() : QStringLiteral("<notype>")).arg(
0080         d_func()->m_dimension);
0081 }
0082 
0083 void ArrayType::accept0(TypeVisitor* v) const
0084 {
0085     if (v->visit(this)) {
0086         acceptType(d_func()->m_elementType.abstractType(), v);
0087     }
0088 
0089     v->endVisit(this);
0090 }
0091 
0092 void ArrayType::exchangeTypes(TypeExchanger* exchanger)
0093 {
0094     TYPE_D_DYNAMIC(ArrayType);
0095     d->m_elementType = IndexedType(exchanger->exchange(d->m_elementType.abstractType()));
0096 }
0097 
0098 AbstractType::WhichType ArrayType::whichType() const
0099 {
0100     return TypeArray;
0101 }
0102 
0103 uint ArrayType::hash() const
0104 {
0105     return KDevHash(AbstractType::hash())
0106            << (elementType() ? elementType()->hash() : 0) << dimension();
0107 }
0108 }