summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@theqtcompany.com>2015-06-01 11:36:24 +0200
committerNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-06-01 10:17:28 +0000
commita6de50e82a54e275bf0c06c2cb27a9c0e4d90655 (patch)
tree25401017ecbfd62f228a18cc67eb3e26ccb9f1f8
parentdc575e3a14e4a30b884fb20f5b5310197849ae7c (diff)
downloadqt-creator-a6de50e82a54e275bf0c06c2cb27a9c0e4d90655.tar.gz
Fix optional recursion
Change-Id: I9c1ed7d7b0f48f656c730dd5538677e62727682c Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
-rw-r--r--src/tools/codemodelbackend/ipcsource/codecompletionchunkconverter.cpp97
-rw-r--r--src/tools/codemodelbackend/ipcsource/codecompletionchunkconverter.h61
-rw-r--r--src/tools/codemodelbackend/ipcsource/codecompletionsextractor.cpp38
-rw-r--r--src/tools/codemodelbackend/ipcsource/codecompletionsextractor.h4
-rw-r--r--src/tools/codemodelbackend/ipcsource/codemodelbackendclangipc-source.pri6
-rw-r--r--tests/unit/codemodelbackend/unittest/codecompletionsextractortest.cpp9
-rw-r--r--tests/unit/codemodelbackend/unittest/data/complete_extractor_function.cpp2
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 {