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 }