diff options
author | Marco Bubke <marco.bubke@theqtcompany.com> | 2015-06-01 11:36:24 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-06-01 10:17:28 +0000 |
commit | a6de50e82a54e275bf0c06c2cb27a9c0e4d90655 (patch) | |
tree | 25401017ecbfd62f228a18cc67eb3e26ccb9f1f8 | |
parent | dc575e3a14e4a30b884fb20f5b5310197849ae7c (diff) | |
download | qt-creator-a6de50e82a54e275bf0c06c2cb27a9c0e4d90655.tar.gz |
Fix optional recursion
Change-Id: I9c1ed7d7b0f48f656c730dd5538677e62727682c
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
7 files changed, 171 insertions, 46 deletions
diff --git a/src/tools/codemodelbackend/ipcsource/codecompletionchunkconverter.cpp b/src/tools/codemodelbackend/ipcsource/codecompletionchunkconverter.cpp new file mode 100644 index 0000000000..31fb50092d --- /dev/null +++ b/src/tools/codemodelbackend/ipcsource/codecompletionchunkconverter.cpp @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** 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 +** a written agreement between you and Digia. For licensing terms and +** conditions see http://www.qt.io/licensing. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "codecompletionchunkconverter.h" + +#include "clangstring.h" + +namespace CodeModelBackEnd { + +void CodeCompletionChunkConverter::extractCompletionChunks(CXCompletionString completionString) +{ + const uint completionChunkCount = clang_getNumCompletionChunks(completionString); + + for (uint chunkIndex = 0; chunkIndex < completionChunkCount; ++chunkIndex) { + const CodeCompletionChunk::Kind kind = chunkKind(completionString, chunkIndex); + + if (kind == CodeCompletionChunk::Optional) + chunks.append(CodeCompletionChunk(kind, + chunkText(completionString, chunkIndex), + optionalChunks(completionString, chunkIndex))); + else + chunks.append(CodeCompletionChunk(kind, + chunkText(completionString, chunkIndex))); + } +} + +void CodeCompletionChunkConverter::extractOptionalCompletionChunks(CXCompletionString completionString) +{ + const uint completionChunkCount = clang_getNumCompletionChunks(completionString); + + for (uint chunkIndex = 0; chunkIndex < completionChunkCount; ++chunkIndex) { + const CodeCompletionChunk::Kind kind = chunkKind(completionString, chunkIndex); + + if (kind == CodeCompletionChunk::Optional) + extractOptionalCompletionChunks(clang_getCompletionChunkCompletionString(completionString, chunkIndex)); + else + chunks.append(CodeCompletionChunk(kind, chunkText(completionString, chunkIndex))); + } +} + +CodeCompletionChunk::Kind CodeCompletionChunkConverter::chunkKind(CXCompletionString completionString, uint chunkIndex) +{ + return CodeCompletionChunk::Kind(clang_getCompletionChunkKind(completionString, chunkIndex)); +} + +QVector<CodeCompletionChunk> CodeCompletionChunkConverter::extract(CXCompletionString completionString) +{ + CodeCompletionChunkConverter converter; + + converter.extractCompletionChunks(completionString); + + return converter.chunks; +} + +Utf8String CodeCompletionChunkConverter::chunkText(CXCompletionString completionString, uint chunkIndex) +{ + return ClangString(clang_getCompletionChunkText(completionString, chunkIndex)); +} + +QVector<CodeCompletionChunk> CodeCompletionChunkConverter::optionalChunks(CXCompletionString completionString, uint chunkIndex) +{ + CodeCompletionChunkConverter converter; + + converter.extractOptionalCompletionChunks(clang_getCompletionChunkCompletionString(completionString, chunkIndex)); + + return converter.chunks; +} + +} // namespace CodeModelBackEnd + diff --git a/src/tools/codemodelbackend/ipcsource/codecompletionchunkconverter.h b/src/tools/codemodelbackend/ipcsource/codecompletionchunkconverter.h new file mode 100644 index 0000000000..58acb37b44 --- /dev/null +++ b/src/tools/codemodelbackend/ipcsource/codecompletionchunkconverter.h @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** 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 +** a written agreement between you and Digia. For licensing terms and +** conditions see http://www.qt.io/licensing. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef CODEMODELBACKEND_CODECOMPLETIONCHUNKCONVERTER_H +#define CODEMODELBACKEND_CODECOMPLETIONCHUNKCONVERTER_H + +#include <codecompletionchunk.h> + +#include <QVector> + +#include <clang-c/Index.h> + +namespace CodeModelBackEnd { + +class CodeCompletionChunkConverter +{ +public: + static QVector<CodeCompletionChunk> extract(CXCompletionString completionString); + + static Utf8String chunkText(CXCompletionString completionString, uint chunkIndex); + +private: + QVector<CodeCompletionChunk> optionalChunks(CXCompletionString completionString, uint chunkIndex); + static CodeCompletionChunk::Kind chunkKind(CXCompletionString completionString, uint chunkIndex); + void extractCompletionChunks(CXCompletionString completionString); + void extractOptionalCompletionChunks(CXCompletionString completionString); + +private: + QVector<CodeCompletionChunk> chunks; +}; + +} // namespace CodeModelBackEnd + +#endif // CODEMODELBACKEND_CODECOMPLETIONCHUNKCONVERTER_H diff --git a/src/tools/codemodelbackend/ipcsource/codecompletionsextractor.cpp b/src/tools/codemodelbackend/ipcsource/codecompletionsextractor.cpp index 8fa691008a..a868a100f8 100644 --- a/src/tools/codemodelbackend/ipcsource/codecompletionsextractor.cpp +++ b/src/tools/codemodelbackend/ipcsource/codecompletionsextractor.cpp @@ -31,6 +31,7 @@ #include "codecompletionsextractor.h" #include "clangstring.h" +#include "codecompletionchunkconverter.h" #ifdef CODEMODELBACKEND_TESTS #include <gtest/gtest.h> @@ -159,7 +160,7 @@ void CodeCompletionsExtractor::extractText() for (uint chunkIndex = 0; chunkIndex < completionChunkCount; ++chunkIndex) { const CXCompletionChunkKind chunkKind = clang_getCompletionChunkKind(currentCxCodeCompleteResult.CompletionString, chunkIndex); if (chunkKind == CXCompletionChunk_TypedText) { - currentCodeCompletion_.setText(chunkText(currentCxCodeCompleteResult.CompletionString, chunkIndex)); + currentCodeCompletion_.setText(CodeCompletionChunkConverter::chunkText(currentCxCodeCompleteResult.CompletionString, chunkIndex)); break; } } @@ -247,40 +248,7 @@ void CodeCompletionsExtractor::extractHasParameters() void CodeCompletionsExtractor::extractCompletionChunks() { - currentCodeCompletion_.setChunks(extractCompletionChunksFromCompletionString(currentCxCodeCompleteResult.CompletionString)); -} - -QVector<CodeCompletionChunk> CodeCompletionsExtractor::extractCompletionChunksFromCompletionString(CXCompletionString completionString) -{ - QVector<CodeCompletionChunk> chunks; - - const uint completionChunkCount = clang_getNumCompletionChunks(completionString); - - for (uint chunkIndex = 0; chunkIndex < completionChunkCount; ++chunkIndex) { - const CodeCompletionChunk::Kind kind = chunkKind(completionString, chunkIndex); - - if (kind == CodeCompletionChunk::Optional) - chunks.append(CodeCompletionChunk(kind, chunkText(completionString, chunkIndex), optionalChunks(completionString, chunkIndex))); - else - chunks.append(CodeCompletionChunk(kind, chunkText(completionString, chunkIndex))); - } - - return chunks; -} - -Utf8String CodeCompletionsExtractor::chunkText(CXCompletionString completionString, uint chunkIndex) -{ - return ClangString(clang_getCompletionChunkText(completionString, chunkIndex)); -} - -CodeCompletionChunk::Kind CodeCompletionsExtractor::chunkKind(CXCompletionString completionString, uint chunkIndex) -{ - return CodeCompletionChunk::Kind(clang_getCompletionChunkKind(completionString, chunkIndex)); -} - -QVector<CodeCompletionChunk> CodeCompletionsExtractor::optionalChunks(CXCompletionString completionString, uint chunkIndex) -{ - return extractCompletionChunksFromCompletionString(clang_getCompletionChunkCompletionString(completionString, chunkIndex)); + currentCodeCompletion_.setChunks(CodeCompletionChunkConverter::extract(currentCxCodeCompleteResult.CompletionString)); } bool CodeCompletionsExtractor::hasText(const Utf8String &text, CXCompletionString cxCompletionString) const diff --git a/src/tools/codemodelbackend/ipcsource/codecompletionsextractor.h b/src/tools/codemodelbackend/ipcsource/codecompletionsextractor.h index 53067d2476..32d2c3e919 100644 --- a/src/tools/codemodelbackend/ipcsource/codecompletionsextractor.h +++ b/src/tools/codemodelbackend/ipcsource/codecompletionsextractor.h @@ -66,10 +66,6 @@ private: void extractAvailability(); void extractHasParameters(); void extractCompletionChunks(); - QVector<CodeCompletionChunk> extractCompletionChunksFromCompletionString(CXCompletionString completionString); - Utf8String chunkText(CXCompletionString completionString, uint chunkIndex); - CodeCompletionChunk::Kind chunkKind(CXCompletionString completionString, uint chunkIndex); - QVector<CodeCompletionChunk> optionalChunks(CXCompletionString completionString, uint chunkIndex); bool hasText(const Utf8String &text, CXCompletionString cxCompletionString) const; diff --git a/src/tools/codemodelbackend/ipcsource/codemodelbackendclangipc-source.pri b/src/tools/codemodelbackend/ipcsource/codemodelbackendclangipc-source.pri index 486f91e6fd..4e8800de02 100644 --- a/src/tools/codemodelbackend/ipcsource/codemodelbackendclangipc-source.pri +++ b/src/tools/codemodelbackend/ipcsource/codemodelbackendclangipc-source.pri @@ -15,7 +15,8 @@ HEADERS += $$PWD/clangipcserver.h \ $$PWD/projectpart.h \ $$PWD/translationunitfilenotexitexception.h \ $$PWD/translationunitdoesnotexistexception.h \ - $$PWD/projectpartsdonotexistexception.h + $$PWD/projectpartsdonotexistexception.h \ + $$PWD/codecompletionchunkconverter.h SOURCES += $$PWD/clangipcserver.cpp \ $$PWD/codecompleter.cpp \ @@ -32,4 +33,5 @@ SOURCES += $$PWD/clangipcserver.cpp \ $$PWD/projectpart.cpp \ $$PWD/translationunitfilenotexitexception.cpp \ $$PWD/translationunitdoesnotexistexception.cpp \ - $$PWD/projectpartsdonotexistexception.cpp + $$PWD/projectpartsdonotexistexception.cpp \ + $$PWD/codecompletionchunkconverter.cpp diff --git a/tests/unit/codemodelbackend/unittest/codecompletionsextractortest.cpp b/tests/unit/codemodelbackend/unittest/codecompletionsextractortest.cpp index fac0ca25af..d9825ba96b 100644 --- a/tests/unit/codemodelbackend/unittest/codecompletionsextractortest.cpp +++ b/tests/unit/codemodelbackend/unittest/codecompletionsextractortest.cpp @@ -609,10 +609,11 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksFunctionWithOptionalChunks) {CodeCompletionChunk::TypedText, Utf8StringLiteral("FunctionWithOptional")}, {CodeCompletionChunk::LeftParen, Utf8StringLiteral("(")}, {CodeCompletionChunk::Placeholder, Utf8StringLiteral("int x")}, - {CodeCompletionChunk::Comma, Utf8StringLiteral(", ")}, - {CodeCompletionChunk::Placeholder, Utf8StringLiteral("char y")}, - {CodeCompletionChunk::Optional, Utf8String(), QVector<CodeCompletionChunk>({{CodeCompletionChunk::Comma, Utf8StringLiteral(", ")}, - {CodeCompletionChunk::Placeholder, Utf8StringLiteral("int z")}})}, + {CodeCompletionChunk::Optional, Utf8String(), QVector<CodeCompletionChunk>({ + {CodeCompletionChunk::Comma, Utf8StringLiteral(", ")}, + {CodeCompletionChunk::Placeholder, Utf8StringLiteral("char y")}, + {CodeCompletionChunk::Comma, Utf8StringLiteral(", ")}, + {CodeCompletionChunk::Placeholder, Utf8StringLiteral("int z")}})}, {CodeCompletionChunk::RightParen, Utf8StringLiteral(")")}}))); } diff --git a/tests/unit/codemodelbackend/unittest/data/complete_extractor_function.cpp b/tests/unit/codemodelbackend/unittest/data/complete_extractor_function.cpp index f3266b39a1..a4d34fb04a 100644 --- a/tests/unit/codemodelbackend/unittest/data/complete_extractor_function.cpp +++ b/tests/unit/codemodelbackend/unittest/data/complete_extractor_function.cpp @@ -1,6 +1,6 @@ void Function(); template<class T> void TemplateFunction(); -void FunctionWithOptional(int x, char y, int z = 5); +void FunctionWithOptional(int x, char y = 1, int z = 5); #define FunctionMacro(X, Y) X + Y class base { |