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 <utils/cpplanguage_details.h>
29 #include <utils/optional.h>
30 #include <utils/smallstringio.h>
31 #include <utils/variant.h>
32 
33 #include <clangsupport_global.h>
34 
35 #include <QtGlobal>
36 
37 #include <iosfwd>
38 
39 #include <gtest/gtest-printers.h>
40 
41 class Utf8String;
42 void PrintTo(const Utf8String &text, ::std::ostream *os);
43 
44 namespace Sqlite {
45 class Value;
46 class ValueView;
47 class SessionChangeSet;
48 enum class Operation : char;
49 enum class LockingMode : char;
50 
51 std::ostream &operator<<(std::ostream &out, const Value &value);
52 std::ostream &operator<<(std::ostream &out, const ValueView &value);
53 std::ostream &operator<<(std::ostream &out, Operation operation);
54 std::ostream &operator<<(std::ostream &out, const SessionChangeSet &changeset);
55 std::ostream &operator<<(std::ostream &out, LockingMode lockingMode);
56 
57 namespace SessionChangeSetInternal {
58 class ConstIterator;
59 class ConstTupleIterator;
60 class SentinelIterator;
61 class Tuple;
62 class ValueViews;
63 enum class State : char;
64 
65 std::ostream &operator<<(std::ostream &out, SentinelIterator iterator);
66 std::ostream &operator<<(std::ostream &out, const ConstIterator &iterator);
67 std::ostream &operator<<(std::ostream &out, const ConstTupleIterator &iterator);
68 std::ostream &operator<<(std::ostream &out, const Tuple &tuple);
69 std::ostream &operator<<(std::ostream &out, State operation);
70 std::ostream &operator<<(std::ostream &out, const ValueViews &valueViews);
71 
72 } // namespace SessionChangeSetInternal
73 } // namespace Sqlite
74 
75 namespace Utils {
76 class LineColumn;
77 class SmallStringView;
78 class FilePath;
79 
80 std::ostream &operator<<(std::ostream &out, const LineColumn &lineColumn);
81 std::ostream &operator<<(std::ostream &out, const Utils::Language &language);
82 std::ostream &operator<<(std::ostream &out, const Utils::LanguageVersion &languageVersion);
83 std::ostream &operator<<(std::ostream &out, const Utils::LanguageExtension &languageExtension);
84 std::ostream &operator<<(std::ostream &out, const FilePath &filePath);
85 
86 template<typename Type>
87 std::ostream &operator<<(std::ostream &out, const optional<Type> &optional)
88 {
89     if (optional)
90         return out << "optional " << optional.value();
91     else
92         return out << "empty optional()";
93 }
94 
95 template<typename Type>
PrintTo(const optional<Type> & optional,::std::ostream * os)96 void PrintTo(const optional<Type> &optional, ::std::ostream *os)
97 {
98     *os << optional;
99 }
100 
101 template<typename... Type>
102 std::ostream &operator<<(std::ostream &out, const variant<Type...> &variant)
103 {
104     return Utils::visit([&](auto &&value) -> std::ostream & { return out << value; }, variant);
105 }
106 
107 void PrintTo(Utils::SmallStringView text, ::std::ostream *os);
108 void PrintTo(const Utils::SmallString &text, ::std::ostream *os);
109 void PrintTo(const Utils::PathString &text, ::std::ostream *os);
110 
111 } // namespace Utils
112 
113 namespace ClangBackEnd {
114 class AliveMessage;
115 class CompletionsMessage;
116 class EchoMessage;
117 class AnnotationsMessage;
118 class ReferencesMessage;
119 class ToolTipMessage;
120 class FollowSymbolResult;
121 class FollowSymbolMessage;
122 class RequestCompletionsMessage;
123 class EndMessage;
124 class DocumentsOpenedMessage;
125 class DocumentsClosedMessage;
126 class CodeCompletion;
127 class CodeCompletionChunk;
128 class DiagnosticContainer;
129 class FileContainer;
130 class FixItContainer;
131 class FullTokenInfo;
132 class HighlightingMarkContainer;
133 class UnsavedFilesUpdatedMessage;
134 class RequestAnnotationsMessage;
135 class RequestFollowSymbolMessage;
136 class RequestReferencesMessage;
137 class RequestToolTipMessage;
138 class SourceLocationContainer;
139 class SourceRangeContainer;
140 class TokenInfo;
141 template<class T>
142 class TokenProcessor;
143 class DocumentsChangedMessage;
144 class DocumentVisibilityChangedMessage;
145 class ToolTipInfo;
146 class SuspendResumeJobsEntry;
147 class ReferencesResult;
148 struct ExtraInfo;
149 class TokenInfoContainer;
150 class UnsavedFilesRemovedMessage;
151 
152 std::ostream &operator<<(std::ostream &out, const AliveMessage &message);
153 std::ostream &operator<<(std::ostream &out, const CompletionsMessage &message);
154 std::ostream &operator<<(std::ostream &out, const EchoMessage &message);
155 std::ostream &operator<<(std::ostream &out, const AnnotationsMessage &message);
156 std::ostream &operator<<(std::ostream &out, const ReferencesMessage &message);
157 std::ostream &operator<<(std::ostream &out, const ToolTipMessage &message);
158 std::ostream &operator<<(std::ostream &out, const FollowSymbolResult &result);
159 std::ostream &operator<<(std::ostream &out, const FollowSymbolMessage &message);
160 std::ostream &operator<<(std::ostream &out, const RequestCompletionsMessage &message);
161 std::ostream &operator<<(std::ostream &out, const EndMessage &message);
162 std::ostream &operator<<(std::ostream &out, const DocumentsOpenedMessage &message);
163 std::ostream &operator<<(std::ostream &out, const DocumentsClosedMessage &message);
164 std::ostream &operator<<(std::ostream &out, const CodeCompletion &message);
165 std::ostream &operator<<(std::ostream &out, const CodeCompletionChunk &chunk);
166 std::ostream &operator<<(std::ostream &out, const DiagnosticContainer &container);
167 std::ostream &operator<<(std::ostream &out, const FileContainer &container);
168 std::ostream &operator<<(std::ostream &out, const FixItContainer &container);
169 std::ostream &operator<<(std::ostream &out, HighlightingType highlightingType);
170 std::ostream &operator<<(std::ostream &out, HighlightingTypes types);
171 std::ostream &operator<<(std::ostream &out, const HighlightingMarkContainer &container);
172 std::ostream &operator<<(std::ostream &out, const UnsavedFilesUpdatedMessage &message);
173 std::ostream &operator<<(std::ostream &out, const RequestAnnotationsMessage &message);
174 std::ostream &operator<<(std::ostream &out, const RequestFollowSymbolMessage &message);
175 std::ostream &operator<<(std::ostream &out, const RequestReferencesMessage &message);
176 std::ostream &operator<<(std::ostream &out, const RequestToolTipMessage &message);
177 std::ostream &operator<<(std::ostream &out, const ToolTipInfo &info);
178 std::ostream &operator<<(std::ostream &out, const SourceLocationContainer &container);
179 std::ostream &operator<<(std::ostream &out, const SourceRangeContainer &container);
180 std::ostream &operator<<(std::ostream &out, const DocumentsChangedMessage &message);
181 std::ostream &operator<<(std::ostream &out, const DocumentVisibilityChangedMessage &message);
182 std::ostream &operator<<(std::ostream &out, const TokenInfo& tokenInfo);
183 template<class T>
184 std::ostream &operator<<(std::ostream &out, const TokenProcessor<T> &tokenInfos);
185 extern template
186 std::ostream &operator<<(std::ostream &out, const TokenProcessor<TokenInfo> &tokenInfos);
187 extern template std::ostream &operator<<(std::ostream &out,
188                                          const TokenProcessor<FullTokenInfo> &tokenInfos);
189 std::ostream &operator<<(std::ostream &out, SymbolKind symbolKind);
190 std::ostream &operator<<(std::ostream &out, SymbolTag symbolTag);
191 std::ostream &operator<<(std::ostream &out, SymbolTags symbolTags);
192 std::ostream &operator<<(std::ostream &os, const SuspendResumeJobsEntry &entry);
193 std::ostream &operator<<(std::ostream &os, const ReferencesResult &value);
194 std::ostream &operator<<(std::ostream &os, const ExtraInfo &extraInfo);
195 std::ostream &operator<<(std::ostream &os, const TokenInfoContainer &container);
196 std::ostream &operator<<(std::ostream &os, const UnsavedFilesRemovedMessage &message);
197 
198 } // namespace ClangBackEnd
199 
200 namespace Debugger {
201 class DiagnosticLocation;
202 std::ostream &operator<<(std::ostream &out, const DiagnosticLocation &loc);
203 } // namespace Debugger
204 
205 namespace ClangTools {
206 namespace Internal {
207 class ExplainingStep;
208 class Diagnostic;
209 std::ostream &operator<<(std::ostream &out, const ExplainingStep &step);
210 std::ostream &operator<<(std::ostream &out, const Diagnostic &diag);
211 } // namespace Internal
212 } // namespace CppTools
213 
214 namespace QmlDesigner {
215 class ModelNode;
216 class VariantProperty;
217 template<auto Type, typename InternalIntergerType>
218 class BasicId;
219 
220 std::ostream &operator<<(std::ostream &out, const ModelNode &node);
221 std::ostream &operator<<(std::ostream &out, const VariantProperty &property);
222 
223 template<auto Type, typename InternalIntergerType>
224 std::ostream &operator<<(std::ostream &out, const BasicId<Type, InternalIntergerType> &id)
225 {
226     return out << "id=" << &id;
227 }
228 
229 namespace Cache {
230 class SourceContext;
231 
232 std::ostream &operator<<(std::ostream &out, const SourceContext &sourceContext);
233 } // namespace Cache
234 
235 namespace Storage {
236 class Type;
237 class ExportedType;
238 class NativeType;
239 class ExplicitExportedType;
240 using TypeName = Utils::variant<NativeType, ExportedType, ExplicitExportedType>;
241 class Version;
242 class VersionNumber;
243 enum class TypeAccessSemantics : int;
244 enum class PropertyDeclarationTraits : unsigned int;
245 class PropertyDeclaration;
246 class FunctionDeclaration;
247 class ParameterDeclaration;
248 class SignalDeclaration;
249 class EnumerationDeclaration;
250 class EnumeratorDeclaration;
251 class BasicImport;
252 class Import;
253 
254 std::ostream &operator<<(std::ostream &out, TypeAccessSemantics accessSemantics);
255 std::ostream &operator<<(std::ostream &out, VersionNumber versionNumber);
256 std::ostream &operator<<(std::ostream &out, Version version);
257 std::ostream &operator<<(std::ostream &out, const Type &type);
258 std::ostream &operator<<(std::ostream &out, const ExportedType &exportedType);
259 std::ostream &operator<<(std::ostream &out, const NativeType &nativeType);
260 std::ostream &operator<<(std::ostream &out, const ExplicitExportedType &exportedType);
261 std::ostream &operator<<(std::ostream &out, const PropertyDeclaration &propertyDeclaration);
262 std::ostream &operator<<(std::ostream &out, PropertyDeclarationTraits traits);
263 std::ostream &operator<<(std::ostream &out, const FunctionDeclaration &functionDeclaration);
264 std::ostream &operator<<(std::ostream &out, const ParameterDeclaration &parameter);
265 std::ostream &operator<<(std::ostream &out, const SignalDeclaration &signalDeclaration);
266 std::ostream &operator<<(std::ostream &out, const EnumerationDeclaration &enumerationDeclaration);
267 std::ostream &operator<<(std::ostream &out, const EnumeratorDeclaration &enumeratorDeclaration);
268 std::ostream &operator<<(std::ostream &out, const BasicImport &import);
269 std::ostream &operator<<(std::ostream &out, const Import &import);
270 
271 } // namespace Storage
272 
273 namespace Internal {
274 class ImageCacheStorageImageEntry;
275 class ImageCacheStorageIconEntry;
276 
277 std::ostream &operator<<(std::ostream &out, const ImageCacheStorageImageEntry &entry);
278 std::ostream &operator<<(std::ostream &out, const ImageCacheStorageIconEntry &entry);
279 
280 } // namespace Internal
281 } // namespace QmlDesigner
282