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 #ifndef KDEVPLATFORM_ABSTRACTFUNCTIONDECLARATION_H
0009 #define KDEVPLATFORM_ABSTRACTFUNCTIONDECLARATION_H
0010 
0011 #include <language/languageexport.h>
0012 #include "indexedducontext.h"
0013 
0014 namespace KDevelop {
0015 class DUContext;
0016 class IndexedString;
0017 
0018 class AbstractFunctionDeclarationData
0019 {
0020 public:
0021     AbstractFunctionDeclarationData() : m_isVirtual(false)
0022         , m_isInline(false)
0023         , m_isExplicit(false)
0024     {
0025     }
0026     IndexedDUContext m_functionContext;
0027     bool m_isVirtual : 1; ///@todo move into ClassFunctionDeclaration(Only valid for class-functions)
0028     bool m_isInline : 1;
0029     bool m_isExplicit : 1; ///@todo move into ClassFunctionDeclaration(Only valid for class-functions)
0030 };
0031 
0032 /**
0033  * Provides an interface to declarations which represent functions in a definition-use chain.
0034  * Don't inherit from this directly, use MergeAbstractFunctionDeclaration instead.
0035  */
0036 class KDEVPLATFORMLANGUAGE_EXPORT AbstractFunctionDeclaration
0037 {
0038 public:
0039     virtual ~AbstractFunctionDeclaration();
0040 
0041     enum FunctionSpecifier {
0042         VirtualSpecifier  = 0x1 /**< indicates a virtual function */,
0043         InlineSpecifier   = 0x2 /**< indicates a inline function */,
0044         ExplicitSpecifier = 0x4 /**< indicates a explicit function */
0045     };
0046     Q_DECLARE_FLAGS(FunctionSpecifiers, FunctionSpecifier)
0047 
0048     void setFunctionSpecifiers(FunctionSpecifiers specifiers);
0049 
0050     bool isInline() const;
0051     void setInline(bool isInline);
0052 
0053     ///Only used for class-member function declarations(see ClassFunctionDeclaration)
0054     bool isVirtual() const;
0055     void setVirtual(bool isVirtual);
0056 
0057     ///Only used for class-member function declarations(see ClassFunctionDeclaration)
0058     bool isExplicit() const;
0059     void setExplicit(bool isExplicit);
0060 
0061     ///Return the DUContext::Function type ducontext (the function parameter context) of this function
0062     ///Same as internalContext if the function has no definition
0063     DUContext* internalFunctionContext() const;
0064     void setInternalFunctionContext(DUContext* context);
0065 
0066     /**
0067      * Returns the default-parameters that are set. The last default-parameter matches the last
0068      * argument of the function, but the returned vector will only contain default-values for those
0069      * arguments that have one, for performance-reasons.
0070      *
0071      * So the vector may be empty or smaller than the count of function-arguments.
0072      * */
0073     virtual const IndexedString* defaultParameters() const = 0;
0074     virtual unsigned int defaultParametersSize() const = 0;
0075     virtual void addDefaultParameter(const IndexedString& str) = 0;
0076     virtual void clearDefaultParameters()  = 0;
0077     ///Returns the default parameter assigned to the given argument number.
0078     ///This is a convenience-function.
0079     IndexedString defaultParameterForArgument(int index) const;
0080 
0081 private:
0082     //Must be implemented by sub-classes to provide a pointer to the data
0083     virtual const AbstractFunctionDeclarationData* data() const = 0;
0084     virtual AbstractFunctionDeclarationData* dynamicData() = 0;
0085 };
0086 
0087 Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractFunctionDeclaration::FunctionSpecifiers)
0088 
0089 ///Use this to merge AbstractFunctionDeclaration into the class hierarchy. Base must be the base-class
0090 ///in the hierarchy, and Data must be the Data class of the following Declaration, and must be based on AbstractFunctionDeclarationData
0091 ///and BaseData.
0092 template <class Base, class _Data>
0093 class MergeAbstractFunctionDeclaration
0094     : public Base
0095     , public AbstractFunctionDeclaration
0096 {
0097 public:
0098     template <class BaseData>
0099     explicit MergeAbstractFunctionDeclaration(BaseData& data) : Base(data)
0100     {
0101     }
0102     template <class BaseData, class Arg2>
0103     MergeAbstractFunctionDeclaration(BaseData& data, const Arg2& arg2) : Base(data, arg2)
0104     {
0105     }
0106     template <class BaseData, class Arg2, class Arg3>
0107     MergeAbstractFunctionDeclaration(BaseData& data, const Arg2& arg2, const Arg3& arg3) : Base(data, arg2, arg3)
0108     {
0109     }
0110 
0111 private:
0112     const AbstractFunctionDeclarationData* data() const override
0113     {
0114         return static_cast<const _Data*>(Base::d_func());
0115     }
0116     AbstractFunctionDeclarationData* dynamicData() override
0117     {
0118         return static_cast<_Data*>(Base::d_func_dynamic());
0119     }
0120 };
0121 
0122 }
0123 
0124 #endif // KDEVPLATFORM_ABSTRACTFUNCTIONDECLARATION_H