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 }