File indexing completed on 2024-05-12 04:37:55

0001 /*
0002     SPDX-FileCopyrightText: 2007 Hamish Rodda <rodda@kde.org>
0003     SPDX-FileCopyrightText: 2007-2008 David Nolden <david.nolden.kdevelop@art-master.de>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-only
0006 */
0007 
0008 #include "abstractfunctiondeclaration.h"
0009 
0010 #include "types/functiontype.h"
0011 #include "declaration.h"
0012 #include "ducontext.h"
0013 #include <serialization/indexedstring.h>
0014 
0015 namespace KDevelop {
0016 AbstractFunctionDeclaration::~AbstractFunctionDeclaration()
0017 {
0018 }
0019 
0020 bool AbstractFunctionDeclaration::isVirtual() const
0021 {
0022     return data()->m_isVirtual;
0023 }
0024 
0025 void AbstractFunctionDeclaration::setVirtual(bool isVirtual)
0026 {
0027     dynamicData()->m_isVirtual = isVirtual;
0028 }
0029 
0030 bool AbstractFunctionDeclaration::isInline() const
0031 {
0032     return data()->m_isInline;
0033 }
0034 
0035 void AbstractFunctionDeclaration::setInline(bool isInline)
0036 {
0037     dynamicData()->m_isInline = isInline;
0038 }
0039 
0040 bool AbstractFunctionDeclaration::isExplicit() const
0041 {
0042     return data()->m_isExplicit;
0043 }
0044 
0045 void AbstractFunctionDeclaration::setExplicit(bool isExplicit)
0046 {
0047     dynamicData()->m_isExplicit = isExplicit;
0048 }
0049 
0050 void AbstractFunctionDeclaration::setFunctionSpecifiers(FunctionSpecifiers specifiers)
0051 {
0052     dynamicData()->m_isInline = specifiers & InlineSpecifier;
0053     dynamicData()->m_isExplicit = specifiers & ExplicitSpecifier;
0054     dynamicData()->m_isVirtual = specifiers & VirtualSpecifier;
0055 }
0056 
0057 IndexedString AbstractFunctionDeclaration::defaultParameterForArgument(int index) const
0058 {
0059     FunctionType::Ptr fType = dynamic_cast<const Declaration*>(this)->type<FunctionType>();
0060     if (fType && index >= 0 && index < fType->arguments().size()) {
0061         index -= (fType->arguments().size() - defaultParametersSize());
0062         if (index >= 0 && index < ( int )defaultParametersSize())
0063             return defaultParameters()[index];
0064     }
0065 
0066     return IndexedString();
0067 }
0068 
0069 void AbstractFunctionDeclaration::setInternalFunctionContext(DUContext* context)
0070 {
0071     Q_ASSERT(!context || context->type() == DUContext::Function);
0072     dynamicData()->m_functionContext = context;
0073 }
0074 DUContext* AbstractFunctionDeclaration::internalFunctionContext() const
0075 {
0076     return data()->m_functionContext.context();
0077 }
0078 }