language/duchain
abstractfunctiondeclaration.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef ABSTRACTFUNCTIONDECLARATION_H
00021 #define ABSTRACTFUNCTIONDECLARATION_H
00022
00023 #include <QtCore/QString>
00024 #include "../languageexport.h"
00025 #include "indexedstring.h"
00026
00027 namespace KDevelop
00028 {
00029 class DUContext;
00030
00031 class AbstractFunctionDeclarationData
00032 {
00033 public:
00034 AbstractFunctionDeclarationData() : m_isVirtual(false), m_isInline(false), m_isExplicit(false) {
00035 }
00036 bool m_isVirtual: 1;
00037 bool m_isInline: 1;
00038 bool m_isExplicit: 1;
00039 };
00040
00045 class KDEVPLATFORMLANGUAGE_EXPORT AbstractFunctionDeclaration
00046 {
00047 public:
00048 virtual ~AbstractFunctionDeclaration();
00049
00050 enum FunctionSpecifier {
00051 VirtualSpecifier = 0x1 ,
00052 InlineSpecifier = 0x2 ,
00053 ExplicitSpecifier = 0x4
00054 };
00055 Q_DECLARE_FLAGS(FunctionSpecifiers, FunctionSpecifier)
00056
00057 void setFunctionSpecifiers(FunctionSpecifiers specifiers);
00058
00059 bool isInline() const;
00060 void setInline(bool isInline);
00061
00063 bool isVirtual() const;
00064 void setVirtual(bool isVirtual);
00065
00067 bool isExplicit() const;
00068 void setExplicit(bool isExplicit);
00069
00073 DUContext* internalFunctionContext() const;
00074
00082 virtual const IndexedString* defaultParameters() const = 0;
00083 virtual unsigned int defaultParametersSize() const = 0;
00084 virtual void addDefaultParameter(const IndexedString& str) = 0;
00085 virtual void clearDefaultParameters() = 0;
00088 IndexedString defaultParameterForArgument(int index) const;
00089
00090 private:
00091
00092 virtual const AbstractFunctionDeclarationData* data() const = 0;
00093 virtual AbstractFunctionDeclarationData* dynamicData() = 0;
00094 };
00095
00096 Q_DECLARE_OPERATORS_FOR_FLAGS(KDevelop::AbstractFunctionDeclaration::FunctionSpecifiers)
00097
00101 template<class Base, class _Data>
00102 class MergeAbstractFunctionDeclaration : public Base, public AbstractFunctionDeclaration {
00103 public:
00104 template<class BaseData>
00105 MergeAbstractFunctionDeclaration(BaseData& data) : Base(data) {
00106 }
00107 template<class BaseData, class Arg2>
00108 MergeAbstractFunctionDeclaration(BaseData& data, const Arg2& arg2) : Base(data, arg2) {
00109 }
00110 template<class BaseData, class Arg2, class Arg3>
00111 MergeAbstractFunctionDeclaration(BaseData& data, const Arg2& arg2, const Arg3& arg3) : Base(data, arg2, arg3) {
00112 }
00113
00114 private:
00115 virtual const AbstractFunctionDeclarationData* data() const {
00116 return static_cast<const _Data*>(Base::d_func());
00117 }
00118 virtual AbstractFunctionDeclarationData* dynamicData() {
00119 return static_cast<_Data*>(Base::d_func_dynamic());
00120 }
00121 };
00122
00123 }
00124
00125 #endif // ABSTRACTFUNCTIONDECLARATION_H
00126
00127