1 /*
2     SPDX-FileCopyrightText: 2008 David Nolden <david.nolden@kdevelop.org>
3     SPDX-FileCopyrightText: 2009 Lior Mualem <lior.m.kde@gmail.com>
4 
5     SPDX-License-Identifier: LGPL-2.0-only
6 */
7 
8 #ifndef KDEVPLATFORM_CLASSDECLARATION_H
9 #define KDEVPLATFORM_CLASSDECLARATION_H
10 
11 #include <language/duchain/declaration.h>
12 #include <language/duchain/declarationdata.h>
13 #include <language/duchain/classmemberdeclarationdata.h>
14 #include <language/duchain/classmemberdeclaration.h>
15 
16 namespace KDevelop {
17 class DUContext;
18 class TopDUContext;
19 }
20 
21 namespace KDevelop {
22 struct KDEVPLATFORMLANGUAGE_EXPORT BaseClassInstance
23 {
24     KDevelop::IndexedType baseClass; //May either be StructureType, or DelayedType
25     KDevelop::Declaration::AccessPolicy access;
26     bool virtualInheritance;
27 };
28 
DECLARE_LIST_MEMBER_HASH(ClassDeclarationData,baseClasses,BaseClassInstance)29 KDEVPLATFORMLANGUAGE_EXPORT DECLARE_LIST_MEMBER_HASH(ClassDeclarationData, baseClasses, BaseClassInstance)
30 
31 class KDEVPLATFORMLANGUAGE_EXPORT ClassDeclarationData
32     : public KDevelop::ClassMemberDeclarationData
33 {
34 public:
35     enum ClassType {
36         Class,
37         Struct,
38         Union,
39         Interface,
40         Trait
41     };
42 
43     enum ClassModifier {
44         Final,
45         Abstract,
46         None
47     };
48 
49     ClassDeclarationData()
50         : m_classType(Class)
51         , m_classModifier(None)
52     {
53         initializeAppendedLists();
54     }
55 
56     ~ClassDeclarationData()
57     {
58         freeAppendedLists();
59     }
60 
61     ClassDeclarationData(const ClassDeclarationData& rhs)
62         : KDevelop::ClassMemberDeclarationData(rhs)
63     {
64         initializeAppendedLists();
65         copyListsFrom(rhs);
66         m_classType = rhs.m_classType;
67         m_classModifier = rhs.m_classModifier;
68     }
69 
70     ClassDeclarationData& operator=(const ClassDeclarationData& rhs) = delete;
71 
72     /// Type of the class (struct, class, etc.)
73     ClassType m_classType;
74     /// Modifier of the class (final, abstract, etc.)
75     ClassModifier m_classModifier;
76 
77     START_APPENDED_LISTS_BASE(ClassDeclarationData, KDevelop::ClassMemberDeclarationData);
78     APPENDED_LIST_FIRST(ClassDeclarationData, BaseClassInstance, baseClasses);
79     END_APPENDED_LISTS(ClassDeclarationData, baseClasses);
80 };
81 
82 /**
83  * Represents a single template-parameter definition
84  */
85 class KDEVPLATFORMLANGUAGE_EXPORT ClassDeclaration
86     : public KDevelop::ClassMemberDeclaration
87 {
88 public:
89     ClassDeclaration(const ClassDeclaration& rhs);
90     explicit ClassDeclaration(ClassDeclarationData& data);
91     ClassDeclaration(const KDevelop::RangeInRevision& range, KDevelop::DUContext* context);
92     ClassDeclaration(ClassDeclarationData& data, const KDevelop::RangeInRevision& range, KDevelop::DUContext* context);
93     ~ClassDeclaration() override;
94 
95     void clearBaseClasses();
96     ///Count of base-classes
97     uint baseClassesSize() const;
98     ///The types this class is based on
99     const BaseClassInstance* baseClasses() const;
100     void addBaseClass(const BaseClassInstance& klass);
101     //Replaces the n'th base-class with the given one. The replaced base-class must have existed.
102     void replaceBaseClass(uint n, const BaseClassInstance& klass);
103 
104     /**Returns whether base is a public base-class of this class
105      * @param baseConversionLevels If nonzero, this will count the distance of the classes.
106      * */
107     bool isPublicBaseClass(ClassDeclaration* base, const KDevelop::TopDUContext* topContext,
108                            int* baseConversionLevels = nullptr) const;
109 
110     QString toString() const override;
111 
112     void setClassType(ClassDeclarationData::ClassType type);
113 
114     ClassDeclarationData::ClassType classType() const;
115 
116     void setClassModifier(ClassDeclarationData::ClassModifier modifier);
117 
118     ClassDeclarationData::ClassModifier classModifier() const;
119 
120     enum {
121         Identity = 17
122     };
123 
124 private:
125     KDevelop::Declaration* clonePrivate() const override;
126     DUCHAIN_DECLARE_DATA(ClassDeclaration)
127 };
128 }
129 
130 Q_DECLARE_TYPEINFO(KDevelop::BaseClassInstance, Q_MOVABLE_TYPE);
131 
132 #endif // KDEVPLATFORM_CLASSDECLARATION_H
133