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