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