| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | /****************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2016-01-15 14:55:33 +01:00
										 |  |  | ** Copyright (C) 2016 The Qt Company Ltd. | 
					
						
							|  |  |  | ** Contact: https://www.qt.io/licensing/
 | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Commercial License Usage | 
					
						
							|  |  |  | ** Licensees holding valid commercial Qt licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the commercial license agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							| 
									
										
										
										
											2016-01-15 14:55:33 +01:00
										 |  |  | ** a written agreement between you and The Qt Company. For licensing terms | 
					
						
							|  |  |  | ** and conditions see https://www.qt.io/terms-conditions. For further
 | 
					
						
							|  |  |  | ** information use the contact form at https://www.qt.io/contact-us.
 | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2016-01-15 14:55:33 +01:00
										 |  |  | ** GNU General Public License Usage | 
					
						
							|  |  |  | ** Alternatively, this file may be used under the terms of the GNU | 
					
						
							|  |  |  | ** General Public License version 3 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT | 
					
						
							|  |  |  | ** included in the packaging of this file. Please review the following | 
					
						
							|  |  |  | ** information to ensure the GNU General Public License requirements will | 
					
						
							|  |  |  | ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
 | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | ** | 
					
						
							|  |  |  | ****************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-15 17:41:41 +02:00
										 |  |  | #include "googletest.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | #include <codecompleter.h>
 | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  | #include <clangdocument.h>
 | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | #include <filecontainer.h>
 | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  | #include <clangdocuments.h>
 | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | #include <unsavedfiles.h>
 | 
					
						
							|  |  |  | #include <utf8stringvector.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-31 12:40:14 +02:00
										 |  |  | #include <QCoreApplication>
 | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | #include <QFile>
 | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | #include <QTemporaryDir>
 | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | using ::testing::ElementsAreArray; | 
					
						
							|  |  |  | using ::testing::Contains; | 
					
						
							|  |  |  | using ::testing::AllOf; | 
					
						
							|  |  |  | using ::testing::Not; | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | using ::testing::PrintToString; | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-16 11:56:00 +02:00
										 |  |  | using ClangBackEnd::CodeCompletion; | 
					
						
							| 
									
										
										
										
											2018-09-27 15:50:12 +02:00
										 |  |  | using ClangBackEnd::CodeCompletionChunk; | 
					
						
							| 
									
										
										
										
											2015-06-16 11:56:00 +02:00
										 |  |  | using ClangBackEnd::CodeCompleter; | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | MATCHER_P2(IsCodeCompletion, text, completionKind, | 
					
						
							|  |  |  |            std::string(negation ? "isn't" : "is") + " code completion with text " | 
					
						
							|  |  |  |            + PrintToString(text) + " and kind " + PrintToString(completionKind) | 
					
						
							|  |  |  |            ) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |     if (arg.text != text) { | 
					
						
							|  |  |  |         *result_listener << "text is " + PrintToString(arg.text) + " and not " +  PrintToString(text); | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |     if (arg.completionKind != completionKind) { | 
					
						
							|  |  |  |         *result_listener << "kind is " + PrintToString(arg.completionKind) + " and not " +  PrintToString(completionKind); | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-27 15:50:12 +02:00
										 |  |  | MATCHER_P(IsOverloadCompletion, text, | 
					
						
							|  |  |  |           std::string(negation ? "isn't" : "is") + " overload completion with text " + PrintToString(text)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Utf8String overloadName; | 
					
						
							|  |  |  |     for (auto &chunk : arg.chunks) { | 
					
						
							|  |  |  |         if (chunk.kind == CodeCompletionChunk::Text) { | 
					
						
							|  |  |  |             overloadName = chunk.text; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (overloadName != text) { | 
					
						
							|  |  |  |         *result_listener << "text is " + PrintToString(overloadName) + " and not " +  PrintToString(text); | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (arg.completionKind != CodeCompletion::FunctionOverloadCompletionKind) { | 
					
						
							|  |  |  |         *result_listener << "kind is " + PrintToString(arg.completionKind) + " and not " +  PrintToString(CodeCompletion::FunctionOverloadCompletionKind); | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-15 14:35:58 +02:00
										 |  |  | MATCHER(HasFixIts, "") | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return !arg.requiredFixIts.empty(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | class CodeCompleter : public ::testing::Test | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | protected: | 
					
						
							|  |  |  |     void SetUp(); | 
					
						
							|  |  |  |     void copyTargetHeaderToTemporaryIncludeDirecory(); | 
					
						
							|  |  |  |     void copyChangedTargetHeaderToTemporaryIncludeDirecory(); | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |     ClangBackEnd::CodeCompleter setupCompleter(const ClangBackEnd::FileContainer &fileContainer); | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |     static Utf8String readFileContent(const QString &fileName); | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |     QTemporaryDir includeDirectory; | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |     Utf8String includePathArgument{QStringLiteral("-I") + includeDirectory.path()}; | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |     QString targetHeaderPath{includeDirectory.path() + QStringLiteral("/complete_target_header.h")}; | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |     ClangBackEnd::FileContainer mainFileContainer{Utf8StringLiteral(TESTDATA_DIR | 
					
						
							|  |  |  |                                                                     "/complete_completer_main.cpp"), | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |                                                   Utf8StringVector{includePathArgument}, | 
					
						
							|  |  |  |                                                   {}}; | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |     ClangBackEnd::UnsavedFiles unsavedFiles; | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |     ClangBackEnd::Documents documents{unsavedFiles}; | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     ClangBackEnd::Document document; | 
					
						
							| 
									
										
										
										
											2016-06-05 19:59:23 +02:00
										 |  |  |     QScopedPointer<ClangBackEnd::CodeCompleter> completer; | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |     ClangBackEnd::FileContainer unsavedMainFileContainer{mainFileContainer.filePath, | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |                                                          {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |                                                          {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |                                                          readFileContent("/complete_completer_main_unsaved.cpp"), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                                                          true}; | 
					
						
							|  |  |  |     ClangBackEnd::FileContainer unsavedTargetHeaderFileContainer{targetHeaderPath, | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |                                                                  {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |                                                                  {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |                                                                  readFileContent("/complete_target_header_unsaved.h"), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                                                                  true}; | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ClangBackEnd::FileContainer arrowFileContainer{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_arrow.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_arrow.cpp"), | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     ClangBackEnd::FileContainer dotArrowCorrectionForPointerFileContainer{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withDotArrowCorrectionForPointer.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withDotArrowCorrectionForPointer.cpp"), | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2016-06-23 16:34:03 +02:00
										 |  |  |     ClangBackEnd::FileContainer dotArrowCorrectionForPointerFileContainerBeforeTyping{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withDotArrowCorrectionForPointer.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withDotArrowCorrectionForPointer_beforeTyping.cpp"), | 
					
						
							| 
									
										
										
										
											2016-06-23 16:34:03 +02:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     ClangBackEnd::FileContainer dotArrowCorrectionForPointerFileContainerAfterTyping{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withDotArrowCorrectionForPointer.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withDotArrowCorrectionForPointer_afterTyping.cpp"), | 
					
						
							| 
									
										
										
										
											2016-06-23 16:34:03 +02:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2016-04-29 11:35:42 +02:00
										 |  |  |     ClangBackEnd::FileContainer dotArrowCorrectionForPointerFileContainerInitial{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withDotArrowCorrectionForPointer.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withDotArrowCorrectionForPointerInitial.cpp"), | 
					
						
							| 
									
										
										
										
											2016-04-29 11:35:42 +02:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     ClangBackEnd::FileContainer dotArrowCorrectionForPointerFileContainerUpdated{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withDotArrowCorrectionForPointer.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withDotArrowCorrectionForPointerUpdated.cpp"), | 
					
						
							| 
									
										
										
										
											2016-04-29 11:35:42 +02:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |     ClangBackEnd::FileContainer noDotArrowCorrectionForObjectFileContainer{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withNoDotArrowCorrectionForObject.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withNoDotArrowCorrectionForObject.cpp"), | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     ClangBackEnd::FileContainer noDotArrowCorrectionForFloatFileContainer{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withNoDotArrowCorrectionForFloat.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withNoDotArrowCorrectionForFloat.cpp"), | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     ClangBackEnd::FileContainer noDotArrowCorrectionForObjectWithArrowOperatortFileContainer{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withNoDotArrowCorrectionForObjectWithArrowOperator.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withNoDotArrowCorrectionForObjectWithArrowOperator.cpp"), | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     ClangBackEnd::FileContainer noDotArrowCorrectionForDotDotFileContainer{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withNoDotArrowCorrectionForDotDot.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withNoDotArrowCorrectionForDotDot.cpp"), | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     ClangBackEnd::FileContainer noDotArrowCorrectionForArrowDotFileContainer{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withNoDotArrowCorrectionForArrowDot.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withNoDotArrowCorrectionForArrowDot.cpp"), | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2016-01-22 17:24:36 +01:00
										 |  |  |     ClangBackEnd::FileContainer noDotArrowCorrectionForOnlyDotFileContainer{ | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withNoDotArrowCorrectionForOnlyDot.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withNoDotArrowCorrectionForOnlyDot.cpp"), | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2016-01-28 18:43:14 +01:00
										 |  |  |     ClangBackEnd::FileContainer noDotArrowCorrectionForColonColonFileContainer{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withNoDotArrowCorrectionForColonColon.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withNoDotArrowCorrectionForColonColon.cpp"), | 
					
						
							| 
									
										
										
										
											2016-01-28 18:43:14 +01:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-06-02 15:23:18 +02:00
										 |  |  |     ClangBackEnd::FileContainer dotArrowCorrectionForForwardDeclaredClassPointer{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withDotArrowCorrectionForForwardDeclaredClassPointer.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withDotArrowCorrectionForForwardDeclaredClassPointer.cpp"), | 
					
						
							| 
									
										
										
										
											2017-06-02 15:23:18 +02:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     ClangBackEnd::FileContainer globalCompletionAfterForwardDeclaredClassPointer{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_withGlobalCompletionAfterForwardDeclaredClassPointer.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_withGlobalCompletionAfterForwardDeclaredClassPointer.cpp"), | 
					
						
							| 
									
										
										
										
											2017-06-02 15:23:18 +02:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-08-10 11:05:48 +02:00
										 |  |  |     ClangBackEnd::FileContainer smartPointerCompletion{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/complete_smartpointer.cpp"), | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-04-04 18:25:23 +02:00
										 |  |  |         readFileContent("/complete_smartpointer.cpp"), | 
					
						
							| 
									
										
										
										
											2017-08-10 11:05:48 +02:00
										 |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2018-09-27 15:50:12 +02:00
										 |  |  |     ClangBackEnd::FileContainer completionsOrder{ | 
					
						
							|  |  |  |         Utf8StringLiteral(TESTDATA_DIR"/completions_order.cpp"), | 
					
						
							|  |  |  |         {includePathArgument}, | 
					
						
							| 
									
										
										
										
											2018-10-19 10:20:27 +02:00
										 |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2018-09-27 15:50:12 +02:00
										 |  |  |         readFileContent("/completions_order.cpp"), | 
					
						
							|  |  |  |         true | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | using CodeCompleterSlowTest = CodeCompleter; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | Utf8String CodeCompleter::readFileContent(const QString &fileName) | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |     QFile readFileContentFile(QStringLiteral(TESTDATA_DIR) + fileName); | 
					
						
							|  |  |  |     bool hasOpened = readFileContentFile.open(QIODevice::ReadOnly | QIODevice::Text); | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |     EXPECT_TRUE(hasOpened); | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |     return Utf8String::fromByteArray(readFileContentFile.readAll()); | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | void CodeCompleter::copyTargetHeaderToTemporaryIncludeDirecory() | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |     QFile::remove(targetHeaderPath); | 
					
						
							| 
									
										
										
										
											2015-11-24 11:07:51 +01:00
										 |  |  |     bool hasCopied = QFile::copy(QString::fromUtf8(TESTDATA_DIR "/complete_target_header.h"), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                                  targetHeaderPath); | 
					
						
							|  |  |  |     EXPECT_TRUE(hasCopied); | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | void CodeCompleter::copyChangedTargetHeaderToTemporaryIncludeDirecory() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QFile::remove(targetHeaderPath); | 
					
						
							| 
									
										
										
										
											2015-11-24 11:07:51 +01:00
										 |  |  |     bool hasCopied = QFile::copy(QString::fromUtf8(TESTDATA_DIR "/complete_target_header_changed.h"), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                                  targetHeaderPath); | 
					
						
							|  |  |  |     EXPECT_TRUE(hasCopied); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CodeCompleter::SetUp() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     EXPECT_TRUE(includeDirectory.isValid()); | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     documents.create({mainFileContainer}); | 
					
						
							|  |  |  |     document = documents.document(mainFileContainer); | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |     completer.reset(new ClangBackEnd::CodeCompleter(document.translationUnit(), unsavedFiles)); | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     copyTargetHeaderToTemporaryIncludeDirecory(); | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     document.parse(); | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, FunctionInUnsavedFile) | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |     unsavedFiles.createOrUpdate({unsavedMainFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     documents.update({unsavedMainFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 14:50:58 +02:00
										 |  |  |     ClangBackEnd::CodeCompleter myCompleter(document.translationUnit(), unsavedFiles); | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 19:59:23 +02:00
										 |  |  |     ASSERT_THAT(myCompleter.complete(27, 1), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                 AllOf(Contains(IsCodeCompletion(Utf8StringLiteral("FunctionWithArguments"), | 
					
						
							|  |  |  |                                                 CodeCompletion::FunctionCompletionKind)), | 
					
						
							|  |  |  |                       Contains(IsCodeCompletion(Utf8StringLiteral("Function"), | 
					
						
							|  |  |  |                                                 CodeCompletion::FunctionCompletionKind)), | 
					
						
							|  |  |  |                       Contains(IsCodeCompletion(Utf8StringLiteral("UnsavedFunction"), | 
					
						
							|  |  |  |                                                 CodeCompletion::FunctionCompletionKind)), | 
					
						
							|  |  |  |                       Contains(IsCodeCompletion(Utf8StringLiteral("f"), | 
					
						
							|  |  |  |                                                 CodeCompletion::FunctionCompletionKind)), | 
					
						
							|  |  |  |                       Not(Contains(IsCodeCompletion(Utf8StringLiteral("SavedFunction"), | 
					
						
							|  |  |  |                                                     CodeCompletion::FunctionCompletionKind))))); | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, VariableInUnsavedFile) | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     unsavedFiles.createOrUpdate({unsavedMainFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     documents.update({unsavedMainFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 14:50:58 +02:00
										 |  |  |     ClangBackEnd::CodeCompleter myCompleter(document.translationUnit(), unsavedFiles); | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 19:59:23 +02:00
										 |  |  |     ASSERT_THAT(myCompleter.complete(27, 1), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("VariableInUnsavedFile"), | 
					
						
							|  |  |  |                                           CodeCompletion::VariableCompletionKind))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, GlobalVariableInUnsavedFile) | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     unsavedFiles.createOrUpdate({unsavedMainFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     documents.update({unsavedMainFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 14:50:58 +02:00
										 |  |  |     ClangBackEnd::CodeCompleter myCompleter(document.translationUnit(), unsavedFiles); | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 19:59:23 +02:00
										 |  |  |     ASSERT_THAT(myCompleter.complete(27, 1), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("GlobalVariableInUnsavedFile"), | 
					
						
							|  |  |  |                                           CodeCompletion::VariableCompletionKind))); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, Macro) | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |     unsavedFiles.createOrUpdate({unsavedMainFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     documents.update({unsavedMainFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 14:50:58 +02:00
										 |  |  |     ClangBackEnd::CodeCompleter myCompleter(document.translationUnit(), unsavedFiles); | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 19:59:23 +02:00
										 |  |  |     ASSERT_THAT(myCompleter.complete(27, 1), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("Macro"), | 
					
						
							|  |  |  |                                           CodeCompletion::PreProcessorCompletionKind))); | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, Keyword) | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-05 19:59:23 +02:00
										 |  |  |     ASSERT_THAT(completer->complete(27, 1), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("switch"), | 
					
						
							|  |  |  |                                           CodeCompletion::KeywordCompletionKind))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, FunctionInIncludedHeader) | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-05 19:59:23 +02:00
										 |  |  |     ASSERT_THAT(completer->complete(27, 1), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("FunctionInIncludedHeader"), | 
					
						
							|  |  |  |                                           CodeCompletion::FunctionCompletionKind))); | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 11:05:48 +02:00
										 |  |  | TEST_F(CodeCompleterSlowTest, UniquePointerCompletion) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(smartPointerCompletion); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-27 15:50:12 +02:00
										 |  |  |     ASSERT_THAT(myCompleter.complete(59, 54, 59, 32), | 
					
						
							|  |  |  |                 Contains(IsOverloadCompletion(Utf8StringLiteral("Bar")))); | 
					
						
							| 
									
										
										
										
											2017-08-10 11:05:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(CodeCompleterSlowTest, SharedPointerCompletion) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(smartPointerCompletion); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-27 15:50:12 +02:00
										 |  |  |     ASSERT_THAT(myCompleter.complete(60, 55, 60, 33), | 
					
						
							|  |  |  |                 Contains(IsOverloadCompletion(Utf8StringLiteral("Bar")))); | 
					
						
							| 
									
										
										
										
											2017-08-10 11:05:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(CodeCompleterSlowTest, QSharedPointerCompletion) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(smartPointerCompletion); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-27 15:50:12 +02:00
										 |  |  |     ASSERT_THAT(myCompleter.complete(61, 60, 61, 32), | 
					
						
							|  |  |  |                 Contains(IsOverloadCompletion(Utf8StringLiteral("Bar")))); | 
					
						
							| 
									
										
										
										
											2017-08-10 11:05:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, FunctionInUnsavedIncludedHeader) | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     unsavedFiles.createOrUpdate({unsavedTargetHeaderFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     documents.create({unsavedTargetHeaderFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 14:50:58 +02:00
										 |  |  |     ClangBackEnd::CodeCompleter myCompleter(document.translationUnit(), unsavedFiles); | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 19:59:23 +02:00
										 |  |  |     ASSERT_THAT(myCompleter.complete(27, 1), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("FunctionInIncludedHeaderUnsaved"), | 
					
						
							|  |  |  |                                           CodeCompletion::FunctionCompletionKind))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, DISABLED_FunctionInChangedIncludedHeader) | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     copyChangedTargetHeaderToTemporaryIncludeDirecory(); | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 19:59:23 +02:00
										 |  |  |     ASSERT_THAT(completer->complete(27, 1), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("FunctionInIncludedHeaderChanged"), | 
					
						
							|  |  |  |                                           CodeCompletion::FunctionCompletionKind))); | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, DISABLED_FunctionInChangedIncludedHeaderWithUnsavedContentInMainFile) // it's not that bad because we reparse anyway
 | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     unsavedFiles.createOrUpdate({unsavedMainFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     documents.update({unsavedMainFileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 14:50:58 +02:00
										 |  |  |     ClangBackEnd::CodeCompleter myCompleter(document.translationUnit(), unsavedFiles); | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     copyChangedTargetHeaderToTemporaryIncludeDirecory(); | 
					
						
							| 
									
										
										
										
											2015-06-01 18:51:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 19:59:23 +02:00
										 |  |  |     ASSERT_THAT(myCompleter.complete(27, 1), | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("FunctionInIncludedHeaderChanged"), | 
					
						
							|  |  |  |                                           CodeCompletion::FunctionCompletionKind))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, ArrowCompletion) | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(arrowFileContainer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 10); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(completions, | 
					
						
							|  |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("member"), | 
					
						
							|  |  |  |                                           CodeCompletion::VariableCompletionKind))); | 
					
						
							| 
									
										
										
										
											2018-06-15 14:35:58 +02:00
										 |  |  |     ASSERT_THAT(completions, Not(Contains(HasFixIts()))); | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, DotToArrowCompletionForPointer) | 
					
						
							| 
									
										
										
										
											2016-01-28 18:43:14 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(dotArrowCorrectionForPointerFileContainer); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-23 16:34:03 +02:00
										 |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 9); | 
					
						
							| 
									
										
										
										
											2016-01-28 18:43:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-23 16:34:03 +02:00
										 |  |  |     ASSERT_THAT(completions, | 
					
						
							|  |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("member"), | 
					
						
							|  |  |  |                                           CodeCompletion::VariableCompletionKind))); | 
					
						
							| 
									
										
										
										
											2018-06-15 14:35:58 +02:00
										 |  |  |     ASSERT_THAT(completions, Contains(HasFixIts())); | 
					
						
							| 
									
										
										
										
											2016-01-28 18:43:14 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, DotToArrowCompletionForPointerInOutdatedDocument) | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-23 16:34:03 +02:00
										 |  |  |     auto fileContainerBeforeTyping = dotArrowCorrectionForPointerFileContainerBeforeTyping; | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     documents.create({fileContainerBeforeTyping}); | 
					
						
							| 
									
										
										
										
											2016-05-30 10:25:52 +02:00
										 |  |  |     unsavedFiles.createOrUpdate({fileContainerBeforeTyping}); | 
					
						
							| 
									
										
										
										
											2018-09-25 09:41:32 +02:00
										 |  |  |     auto document = documents.document(fileContainerBeforeTyping.filePath); | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     document.parse(); | 
					
						
							| 
									
										
										
										
											2016-06-23 16:34:03 +02:00
										 |  |  |     unsavedFiles.createOrUpdate({dotArrowCorrectionForPointerFileContainerAfterTyping}); | 
					
						
							| 
									
										
										
										
											2016-09-07 14:50:58 +02:00
										 |  |  |     ClangBackEnd::CodeCompleter myCompleter(documents.document(dotArrowCorrectionForPointerFileContainerAfterTyping).translationUnit(), | 
					
						
							| 
									
										
										
										
											2016-05-30 10:25:52 +02:00
										 |  |  |                                             unsavedFiles); | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 9); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(completions, | 
					
						
							|  |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("member"), | 
					
						
							|  |  |  |                                           CodeCompletion::VariableCompletionKind))); | 
					
						
							| 
									
										
										
										
											2018-06-15 14:35:58 +02:00
										 |  |  |     ASSERT_THAT(completions, Contains(HasFixIts())); | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, NoDotToArrowCompletionForObject) | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(noDotArrowCorrectionForObjectFileContainer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 9); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(completions, | 
					
						
							|  |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("member"), | 
					
						
							|  |  |  |                                           CodeCompletion::VariableCompletionKind))); | 
					
						
							| 
									
										
										
										
											2018-06-15 14:35:58 +02:00
										 |  |  |     ASSERT_THAT(completions, Not(Contains(HasFixIts()))); | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, NoDotToArrowCompletionForFloat) | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(noDotArrowCorrectionForFloatFileContainer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(3, 18); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_TRUE(completions.isEmpty()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForObjectWithArrowOperator) | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(noDotArrowCorrectionForObjectWithArrowOperatortFileContainer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(8, 9); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(completions, | 
					
						
							|  |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("member"), | 
					
						
							|  |  |  |                                           CodeCompletion::VariableCompletionKind))); | 
					
						
							| 
									
										
										
										
											2018-06-15 14:35:58 +02:00
										 |  |  |     ASSERT_THAT(completions, Not(Contains(HasFixIts()))); | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForDotDot) | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(noDotArrowCorrectionForDotDotFileContainer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 10); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_TRUE(completions.isEmpty()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForArrowDot) | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(noDotArrowCorrectionForArrowDotFileContainer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 11); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_TRUE(completions.isEmpty()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForOnlyDot) | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-01-22 17:24:36 +01:00
										 |  |  |     auto myCompleter = setupCompleter(noDotArrowCorrectionForOnlyDotFileContainer); | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 6); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-02 15:23:18 +02:00
										 |  |  |     ASSERT_TRUE(completions.isEmpty()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(CodeCompleterSlowTest, GlobalCompletionForSpaceAfterOnlyDot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(noDotArrowCorrectionForOnlyDotFileContainer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 7); | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |     ASSERT_THAT(completions, | 
					
						
							|  |  |  |                 Contains(IsCodeCompletion(Utf8StringLiteral("Foo"), | 
					
						
							|  |  |  |                                           CodeCompletion::ClassCompletionKind))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 11:39:17 +01:00
										 |  |  | TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForColonColon) | 
					
						
							| 
									
										
										
										
											2016-01-28 18:43:14 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(noDotArrowCorrectionForColonColonFileContainer); | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(1, 7); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-15 14:35:58 +02:00
										 |  |  |     ASSERT_THAT(completions, Not(Contains(HasFixIts()))); | 
					
						
							| 
									
										
										
										
											2017-06-02 15:23:18 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-22 09:05:00 +02:00
										 |  |  | // Our workaround is not applicable with LLVM/Clang 10 anymore, so disable this test for that version.
 | 
					
						
							|  |  |  | // Luckily, the workaround is not needed anymore with LLVM/Clang 11.
 | 
					
						
							|  |  |  | TEST_F(CodeCompleterSlowTest, DISABLED_FOR_CLANG_10(NoGlobalCompletionAfterForwardDeclaredClassPointer)) | 
					
						
							| 
									
										
										
										
											2017-06-02 15:23:18 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(globalCompletionAfterForwardDeclaredClassPointer); | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 10); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_TRUE(completions.isEmpty()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(CodeCompleterSlowTest, GlobalCompletionAfterForwardDeclaredClassPointer) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(globalCompletionAfterForwardDeclaredClassPointer); | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(6, 4); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 12:25:11 +02:00
										 |  |  |     ASSERT_EQ(completions.isEmpty(), CINDEX_VERSION_MINOR != 59); | 
					
						
							| 
									
										
										
										
											2017-06-02 15:23:18 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-27 15:50:12 +02:00
										 |  |  | TEST_F(CodeCompleterSlowTest, ConstructorCompletionExists) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(completionsOrder); | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(8, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int constructorIndex = Utils::indexOf(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							|  |  |  |         return codeCompletion.text == "Constructor" && codeCompletion.completionKind == CodeCompletion::ConstructorCompletionKind; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(constructorIndex != -1, true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(CodeCompleterSlowTest, ClassConstructorCompletionsOrder) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(completionsOrder); | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(8, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int classIndex = Utils::indexOf(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							|  |  |  |         return codeCompletion.text == "Constructor" && codeCompletion.completionKind == CodeCompletion::ClassCompletionKind; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     int constructorIndex = Utils::indexOf(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							|  |  |  |         return codeCompletion.text == "Constructor" && codeCompletion.completionKind == CodeCompletion::ConstructorCompletionKind; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(classIndex < constructorIndex, true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(CodeCompleterSlowTest, SharedPointerCompletionsOrder) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(smartPointerCompletion); | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(62, 11); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int resetIndex = Utils::indexOf(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							|  |  |  |         return codeCompletion.text == "reset"; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     int barDestructorIndex = Utils::indexOf(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							|  |  |  |         return codeCompletion.text == "~Bar"; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(barDestructorIndex < resetIndex, true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(CodeCompleterSlowTest, ConstructorHasOverloadCompletions) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(completionsOrder); | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(8, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int constructorsCount = Utils::count(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							|  |  |  |         return codeCompletion.text == "Constructor" && codeCompletion.completionKind == CodeCompletion::ConstructorCompletionKind; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(constructorsCount, 2); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 10:03:21 +02:00
										 |  |  | TEST_F(CodeCompleterSlowTest, FunctionOverloadsNoParametersOrder) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(completionsOrder); | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(27, 7); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-10 16:18:11 +02:00
										 |  |  |     const int fooCount = Utils::count(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							| 
									
										
										
										
											2018-10-25 10:03:21 +02:00
										 |  |  |         return codeCompletion.text == "foo"; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-10 16:18:11 +02:00
										 |  |  |     ASSERT_THAT(fooCount, 1); | 
					
						
							| 
									
										
										
										
											2018-10-25 10:03:21 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(CodeCompleterSlowTest, FunctionOverloadsWithParametersOrder) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(completionsOrder); | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(27, 7); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int firstIndex = Utils::indexOf(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							|  |  |  |         return codeCompletion.text == "bar"; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     int secondIndex = Utils::indexOf(completions, [i = 0, firstIndex](const CodeCompletion &codeCompletion) mutable { | 
					
						
							|  |  |  |         return (i++) > firstIndex && codeCompletion.text == "bar"; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(abs(firstIndex - secondIndex), 1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(CodeCompleterSlowTest, FunctionOverloadsWithoutDotOrArrowOrder) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(completionsOrder); | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(21, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int firstIndex = Utils::indexOf(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							|  |  |  |         return codeCompletion.text == "bar"; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     int secondIndex = Utils::indexOf(completions, [i = 0, firstIndex](const CodeCompletion &codeCompletion) mutable { | 
					
						
							|  |  |  |         return (i++) > firstIndex && codeCompletion.text == "bar"; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(abs(firstIndex - secondIndex), 1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-10 09:42:27 +02:00
										 |  |  | TEST_F(CodeCompleterSlowTest, LexicographicalSorting) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto myCompleter = setupCompleter(completionsOrder); | 
					
						
							|  |  |  |     const ClangBackEnd::CodeCompletions completions = myCompleter.complete(40, 18); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const int funcAIndex = Utils::indexOf(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							|  |  |  |         return codeCompletion.text == "memberFuncAAA"; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     const int funcBIndex = Utils::indexOf(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							|  |  |  |         return codeCompletion.text == "memberFuncBB"; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     const int funcCIndex = Utils::indexOf(completions, [](const CodeCompletion &codeCompletion) { | 
					
						
							|  |  |  |         return codeCompletion.text == "memberFuncC"; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_NE(funcAIndex, -1); | 
					
						
							|  |  |  |     ASSERT_EQ(funcBIndex, funcAIndex + 1); | 
					
						
							|  |  |  |     ASSERT_EQ(funcCIndex, funcAIndex + 2); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | ClangBackEnd::CodeCompleter CodeCompleter::setupCompleter( | 
					
						
							|  |  |  |         const ClangBackEnd::FileContainer &fileContainer) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     documents.create({fileContainer}); | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  |     unsavedFiles.createOrUpdate({fileContainer}); | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     document = documents.document(fileContainer); | 
					
						
							|  |  |  |     document.parse(); | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 10:42:12 +02:00
										 |  |  |     ClangBackEnd::Document document = documents.document(fileContainer); | 
					
						
							| 
									
										
										
										
											2016-09-07 14:50:58 +02:00
										 |  |  |     return ClangBackEnd::CodeCompleter(document.translationUnit(), | 
					
						
							| 
									
										
										
										
											2016-05-30 10:25:52 +02:00
										 |  |  |                                        unsavedFiles); | 
					
						
							| 
									
										
										
										
											2016-01-11 15:20:04 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 15:04:41 +02:00
										 |  |  | } |