1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of Qt Creator.
7 **
8 ** Commercial License Usage
9 ** Licensees holding valid commercial Qt licenses may use this file in
10 ** accordance with the commercial license agreement provided with the
11 ** Software or, alternatively, in accordance with the terms contained in
12 ** a written agreement between you and The Qt Company. For licensing terms
13 ** and conditions see https://www.qt.io/terms-conditions. For further
14 ** information use the contact form at https://www.qt.io/contact-us.
15 **
16 ** GNU General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU
18 ** General Public License version 3 as published by the Free Software
19 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
20 ** included in the packaging of this file. Please review the following
21 ** information to ensure the GNU General Public License requirements will
22 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
23 **
24 ****************************************************************************/
25 
26 #pragma once
27 
28 #include "clangsupport_global.h"
29 #include "codecompletionchunk.h"
30 #include "fixitcontainer.h"
31 
32 #include <sqlite/utf8string.h>
33 
34 #include <QDataStream>
35 #include <QVector>
36 
37 namespace ClangBackEnd {
38 
39 class CodeCompletion;
40 using CodeCompletions = QVector<CodeCompletion>;
41 
42 class CodeCompletion
43 {
44 public:
45     enum Kind : uint8_t {
46         Other = 0,
47         FunctionCompletionKind,
48         FunctionDefinitionCompletionKind,
49         FunctionOverloadCompletionKind,
50         TemplateFunctionCompletionKind,
51         ClassCompletionKind,
52         ConstructorCompletionKind,
53         DestructorCompletionKind,
54         VariableCompletionKind,
55         TypeAliasCompletionKind,
56         TemplateClassCompletionKind,
57         EnumerationCompletionKind,
58         EnumeratorCompletionKind,
59         NamespaceCompletionKind,
60         PreProcessorCompletionKind,
61         SignalCompletionKind,
62         SlotCompletionKind,
63         ObjCMessageCompletionKind,
64         KeywordCompletionKind,
65         ClangSnippetKind
66     };
67 
68     enum Availability : quint32 {
69         Available,
70         Deprecated,
71         NotAvailable,
72         NotAccessible
73     };
74 
75 public:
76     CodeCompletion() = default;
77     CodeCompletion(const Utf8String &text,
78                    quint32 priority = 0,
79                    Kind completionKind = Other,
80                    Availability availability = Available,
81                    bool hasParameters = false)
text(text)82         : text(text),
83           priority(priority),
84           completionKind(completionKind),
85           availability(availability),
86           hasParameters(hasParameters)
87     {
88     }
89 
90     friend QDataStream &operator<<(QDataStream &out, const CodeCompletion &message)
91     {
92         out << message.text;
93         out << message.briefComment;
94         out << message.chunks;
95         out << message.requiredFixIts;
96         out << message.priority;
97         out << static_cast<quint32>(message.completionKind);
98         out << static_cast<quint32>(message.availability);
99         out << message.hasParameters;
100 
101         return out;
102     }
103 
104     friend QDataStream &operator>>(QDataStream &in, CodeCompletion &message)
105     {
106         quint32 completionKind;
107         quint32 availability;
108 
109         in >> message.text;
110         in >> message.briefComment;
111         in >> message.chunks;
112         in >> message.requiredFixIts;
113         in >> message.priority;
114         in >> completionKind;
115         in >> availability;
116         in >> message.hasParameters;
117 
118         message.completionKind = static_cast<CodeCompletion::Kind>(completionKind);
119         message.availability = static_cast<CodeCompletion::Availability>(availability);
120 
121         return in;
122     }
123 
124     friend bool operator==(const CodeCompletion &first, const CodeCompletion &second)
125     {
126         return first.text == second.text
127                 && first.completionKind == second.completionKind
128                 && first.requiredFixIts == second.requiredFixIts;
129     }
130 
131 public:
132     Utf8String text;
133     Utf8String briefComment;
134     CodeCompletionChunks chunks;
135     QVector<FixItContainer> requiredFixIts;
136     quint32 priority = 0;
137     Kind completionKind = Other;
138     Availability availability = NotAvailable;
139     bool hasParameters = false;
140 };
141 
142 CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const CodeCompletion &message);
143 CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, CodeCompletion::Kind kind);
144 
145 CLANGSUPPORT_EXPORT std::ostream &operator<<(std::ostream &os, const CodeCompletion::Kind kind);
146 CLANGSUPPORT_EXPORT std::ostream &operator<<(std::ostream &os, const CodeCompletion::Availability availability);
147 } // namespace ClangBackEnd
148