File indexing completed on 2024-05-12 04:38:01

0001 /*
0002     SPDX-FileCopyrightText: 2002-2005 Roberto Raggi <roberto@kdevelop.org>
0003     SPDX-FileCopyrightText: 2006 Adam Treat <treat@kde.org>
0004     SPDX-FileCopyrightText: 2006-2007 Hamish Rodda <rodda@kde.org>
0005     SPDX-FileCopyrightText: 2007-2008 David Nolden <david.nolden.kdevelop@art-master.de>
0006 
0007     SPDX-License-Identifier: LGPL-2.0-only
0008 */
0009 
0010 #include "functiondeclaration.h"
0011 #include "ducontext.h"
0012 #include "duchainregister.h"
0013 #include "types/functiontype.h"
0014 #include <debug.h>
0015 
0016 namespace KDevelop {
0017 REGISTER_DUCHAIN_ITEM(FunctionDeclaration);
0018 
0019 DEFINE_LIST_MEMBER_HASH(FunctionDeclarationData, m_defaultParameters, IndexedString)
0020 
0021 FunctionDeclaration::FunctionDeclaration(FunctionDeclarationData& data) : FunctionDeclarationBase(data)
0022 {
0023 }
0024 
0025 FunctionDeclaration::FunctionDeclaration(FunctionDeclarationData& data,
0026                                          const RangeInRevision& range) : FunctionDeclarationBase(data, range)
0027 {
0028 }
0029 
0030 FunctionDeclaration::FunctionDeclaration(const FunctionDeclaration& rhs) : FunctionDeclarationBase(*new FunctionDeclarationData(
0031             *rhs.d_func()))
0032 {
0033 }
0034 
0035 FunctionDeclaration::FunctionDeclaration(const RangeInRevision& range, DUContext* context)
0036     : FunctionDeclarationBase(*new FunctionDeclarationData, range)
0037 {
0038     d_func_dynamic()->setClassId(this);
0039     if (context)
0040         setContext(context);
0041 }
0042 
0043 FunctionDeclaration::~FunctionDeclaration()
0044 {
0045 }
0046 
0047 Declaration* FunctionDeclaration::clonePrivate() const
0048 {
0049     return new FunctionDeclaration(*this);
0050 }
0051 
0052 bool FunctionDeclaration::isFunctionDeclaration() const
0053 {
0054     return true;
0055 }
0056 
0057 void FunctionDeclaration::setAbstractType(AbstractType::Ptr type)
0058 {
0059     if (type && !type.dynamicCast<FunctionType>()) {
0060         qCDebug(LANGUAGE) << "wrong type attached to function declaration:" << type->toString();
0061     }
0062     Declaration::setAbstractType(type);
0063 }
0064 
0065 QString FunctionDeclaration::toString() const
0066 {
0067     AbstractType::Ptr type = abstractType();
0068     if (!type)
0069         return Declaration::toString();
0070 
0071     auto function = type.dynamicCast<FunctionType>();
0072     if (function) {
0073         return QStringLiteral("%1 %2 %3").arg(function->partToString(FunctionType::SignatureReturn),
0074                                               identifier().toString(),
0075                                               function->partToString(FunctionType::SignatureArguments));
0076     } else {
0077         return Declaration::toString();
0078     }
0079 }
0080 
0081 uint FunctionDeclaration::additionalIdentity() const
0082 {
0083     if (abstractType())
0084         return abstractType()->hash();
0085     else
0086         return 0;
0087 }
0088 
0089 const IndexedString* FunctionDeclaration::defaultParameters() const
0090 {
0091     return d_func()->m_defaultParameters();
0092 }
0093 
0094 unsigned int FunctionDeclaration::defaultParametersSize() const
0095 {
0096     return d_func()->m_defaultParametersSize();
0097 }
0098 
0099 void FunctionDeclaration::addDefaultParameter(const IndexedString& str)
0100 {
0101     d_func_dynamic()->m_defaultParametersList().append(str);
0102 }
0103 
0104 void FunctionDeclaration::clearDefaultParameters()
0105 {
0106     d_func_dynamic()->m_defaultParametersList().clear();
0107 }
0108 }