File indexing completed on 2024-05-12 04:39:13

0001 /*
0002     SPDX-FileCopyrightText: 2014 Kevin Funk <kfunk@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "macrodefinition.h"
0008 
0009 #include <language/duchain/appendedlist.h>
0010 #include <language/duchain/declarationdata.h>
0011 
0012 using namespace KDevelop;
0013 
0014 DEFINE_LIST_MEMBER_HASH(MacroDefinitionData, parameters, IndexedString)
0015 
0016 class MacroDefinitionData : public DeclarationData
0017 {
0018 public:
0019     MacroDefinitionData()
0020         : isFunctionLike(false)
0021     {
0022         initializeAppendedLists();
0023     }
0024     MacroDefinitionData(const MacroDefinitionData& rhs)
0025         : DeclarationData(rhs)
0026         , definition(rhs.definition)
0027         , isFunctionLike(rhs.isFunctionLike)
0028     {
0029         initializeAppendedLists();
0030         copyListsFrom(rhs);
0031     }
0032     ~MacroDefinitionData()
0033     {
0034         freeAppendedLists();
0035     }
0036 
0037     MacroDefinitionData& operator=(const MacroDefinitionData& rhs) = delete;
0038 
0039     IndexedString definition;
0040     bool isFunctionLike : 1;
0041 
0042     START_APPENDED_LISTS_BASE(MacroDefinitionData, DeclarationData);
0043     APPENDED_LIST_FIRST(MacroDefinitionData, IndexedString, parameters);
0044     END_APPENDED_LISTS(MacroDefinitionData, parameters);
0045 };
0046 
0047 MacroDefinition::MacroDefinition(const MacroDefinition& rhs)
0048     : Declaration(*new MacroDefinitionData(*rhs.d_func()))
0049 {
0050 }
0051 
0052 MacroDefinition::MacroDefinition(MacroDefinitionData& data)
0053     : Declaration(data)
0054 {
0055 }
0056 
0057 MacroDefinition::MacroDefinition(const RangeInRevision& range, DUContext* context )
0058   : Declaration(*new MacroDefinitionData, range)
0059 {
0060     d_func_dynamic()->setClassId(this);
0061     setKind(Declaration::Macro);
0062     if(context)
0063         setContext(context);
0064 }
0065 
0066 MacroDefinition::~MacroDefinition()
0067 {
0068 }
0069 
0070 IndexedString MacroDefinition::definition() const
0071 {
0072     return d_func()->definition;
0073 }
0074 
0075 void MacroDefinition::setDefinition(const IndexedString& definition)
0076 {
0077     d_func_dynamic()->definition = definition;
0078 }
0079 
0080 bool MacroDefinition::isFunctionLike() const
0081 {
0082     return d_func()->isFunctionLike;
0083 }
0084 
0085 void MacroDefinition::setFunctionLike(bool isFunctionLike)
0086 {
0087     d_func_dynamic()->isFunctionLike = isFunctionLike;
0088 }
0089 
0090 const IndexedString* MacroDefinition::parameters() const
0091 {
0092     return d_func()->parameters();
0093 }
0094 
0095 unsigned int MacroDefinition::parametersSize() const
0096 {
0097     return d_func()->parametersSize();
0098 }
0099 
0100 void MacroDefinition::addParameter(const IndexedString& str)
0101 {
0102     d_func_dynamic()->parametersList().append(str);
0103 }
0104 
0105 void MacroDefinition::clearParameters()
0106 {
0107     d_func_dynamic()->parametersList().clear();
0108 }
0109 
0110 QString MacroDefinition::toString() const
0111 {
0112     return i18n("Macro %1", identifier().toString());
0113 }
0114 
0115 DUCHAIN_DEFINE_TYPE(MacroDefinition)