summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@theqtcompany.com>2015-05-28 18:03:18 +0200
committerNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-05-29 15:08:24 +0000
commitdc575e3a14e4a30b884fb20f5b5310197849ae7c (patch)
tree97ab4c77834f19a86e739f4c5d48e570d2f697a0
parent5347d4eb62f0ef44f57f3c274406700c7fe38fd2 (diff)
downloadqt-creator-dc575e3a14e4a30b884fb20f5b5310197849ae7c.tar.gz
Add converter from chunks to hints
Change-Id: Ie49c9ad890337d54183087e7edab8c7540180cd9 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
-rw-r--r--src/plugins/clangcodemodel/clangcodemodel.pro6
-rw-r--r--src/plugins/clangcodemodel/clangcodemodeltesting.pri5
-rw-r--r--src/plugins/clangcodemodel/completionchunkstotextconverter.cpp90
-rw-r--r--src/plugins/clangcodemodel/completionchunkstotextconverter.h65
-rw-r--r--tests/unit/codemodelbackend/unittest/completionchunkstotextconvertertest.cpp128
-rw-r--r--tests/unit/codemodelbackend/unittest/unittest.pro6
6 files changed, 297 insertions, 3 deletions
diff --git a/src/plugins/clangcodemodel/clangcodemodel.pro b/src/plugins/clangcodemodel/clangcodemodel.pro
index a40c9dc71a..873bcf8b54 100644
--- a/src/plugins/clangcodemodel/clangcodemodel.pro
+++ b/src/plugins/clangcodemodel/clangcodemodel.pro
@@ -41,7 +41,8 @@ SOURCES += \
$$PWD/clangprojectsettingspropertiespage.cpp \
$$PWD/raii/scopedclangoptions.cpp \
$$PWD/clangmodelmanagersupport.cpp \
- $$PWD/clangcompletioncontextanalyzer.cpp
+ $$PWD/clangcompletioncontextanalyzer.cpp \
+ $$PWD/completionchunkstotextconverter.cpp
HEADERS += \
$$PWD/clangcodemodelplugin.h \
@@ -66,7 +67,8 @@ HEADERS += \
$$PWD/clangprojectsettingspropertiespage.h \
$$PWD/raii/scopedclangoptions.h \
$$PWD/clangmodelmanagersupport.h \
- $$PWD/clangcompletioncontextanalyzer.h
+ $$PWD/clangcompletioncontextanalyzer.h \
+ $$PWD/completionchunkstotextconverter.h
HEADERS += clangutils.h \
cxprettyprinter.h
diff --git a/src/plugins/clangcodemodel/clangcodemodeltesting.pri b/src/plugins/clangcodemodel/clangcodemodeltesting.pri
new file mode 100644
index 0000000000..6094bff997
--- /dev/null
+++ b/src/plugins/clangcodemodel/clangcodemodeltesting.pri
@@ -0,0 +1,5 @@
+INCLUDEPATH += $$PWD
+
+SOURCES += $$PWD/completionchunkstotextconverter.cpp
+
+HEADERS += $$PWD/completionchunkstotextconverter.h
diff --git a/src/plugins/clangcodemodel/completionchunkstotextconverter.cpp b/src/plugins/clangcodemodel/completionchunkstotextconverter.cpp
new file mode 100644
index 0000000000..e0b595ce39
--- /dev/null
+++ b/src/plugins/clangcodemodel/completionchunkstotextconverter.cpp
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** 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 "completionchunkstotextconverter.h"
+
+namespace ClangCodeModel {
+namespace Internal {
+
+void CompletionChunksToTextConverter::parseChunks(const QVector<CodeModelBackEnd::CodeCompletionChunk> &codeCompletionChunks)
+{
+ m_text.clear();
+
+ for (const auto &codeCompletionChunk : codeCompletionChunks)
+ parse(codeCompletionChunk);
+}
+
+const QString &CompletionChunksToTextConverter::text() const
+{
+ return m_text;
+}
+
+QString CompletionChunksToTextConverter::convert(const QVector<CodeModelBackEnd::CodeCompletionChunk> &codeCompletionChunks)
+{
+ CompletionChunksToTextConverter converter;
+
+ converter.parseChunks(codeCompletionChunks);
+
+ return converter.text();
+}
+
+void CompletionChunksToTextConverter::parse(const CodeModelBackEnd::CodeCompletionChunk &codeCompletionChunk)
+{
+ using CodeModelBackEnd::CodeCompletionChunk;
+
+ switch (codeCompletionChunk.kind()) {
+ case CodeCompletionChunk::ResultType: parseResultType(codeCompletionChunk.text()); break;
+ case CodeCompletionChunk::Optional: parseOptional(codeCompletionChunk); break;
+ default: parseText(codeCompletionChunk.text()); break;
+ }
+}
+
+void CompletionChunksToTextConverter::parseResultType(const Utf8String &resultTypeText)
+{
+ m_text += resultTypeText.toString() + QChar(QChar::Space);
+}
+
+void CompletionChunksToTextConverter::parseText(const Utf8String &text)
+{
+ m_text += text.toString();
+}
+
+void CompletionChunksToTextConverter::parseOptional(const CodeModelBackEnd::CodeCompletionChunk &optionalCodeCompletionChunk)
+{
+ m_text += QStringLiteral("<i>");
+
+ m_text += convert(optionalCodeCompletionChunk.optionalChunks());
+
+ m_text += QStringLiteral("</i>");
+}
+
+} // namespace Internal
+} // namespace ClangCodeModel
+
diff --git a/src/plugins/clangcodemodel/completionchunkstotextconverter.h b/src/plugins/clangcodemodel/completionchunkstotextconverter.h
new file mode 100644
index 0000000000..80de43fa38
--- /dev/null
+++ b/src/plugins/clangcodemodel/completionchunkstotextconverter.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** 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 CLANGCODEMODEL_INTERNAL_COMPLETIONCHUNKSTOTEXTCONVERTER_H
+#define CLANGCODEMODEL_INTERNAL_COMPLETIONCHUNKSTOTEXTCONVERTER_H
+
+#include <codemodelbackendipc/codecompletionchunk.h>
+
+#include <QString>
+
+#include <sqlite/utf8string.h>
+
+namespace ClangCodeModel {
+namespace Internal {
+
+class CompletionChunksToTextConverter
+{
+public:
+ void parseChunks(const QVector<CodeModelBackEnd::CodeCompletionChunk> &codeCompletionChunks);
+
+ const QString &text() const;
+
+ static QString convert(const QVector<CodeModelBackEnd::CodeCompletionChunk> &codeCompletionChunks);
+
+private:
+ void parse(const CodeModelBackEnd::CodeCompletionChunk & codeCompletionChunk);
+ void parseResultType(const Utf8String &text);
+ void parseText(const Utf8String &text);
+ void parseOptional(const CodeModelBackEnd::CodeCompletionChunk & optionalCodeCompletionChunk);
+
+private:
+ QString m_text;
+};
+
+} // namespace Internal
+} // namespace ClangCodeModel
+
+#endif // CLANGCODEMODEL_INTERNAL_COMPLETIONCHUNKSTOTEXTCONVERTER_H
diff --git a/tests/unit/codemodelbackend/unittest/completionchunkstotextconvertertest.cpp b/tests/unit/codemodelbackend/unittest/completionchunkstotextconvertertest.cpp
new file mode 100644
index 0000000000..80189c808d
--- /dev/null
+++ b/tests/unit/codemodelbackend/unittest/completionchunkstotextconvertertest.cpp
@@ -0,0 +1,128 @@
+/****************************************************************************
+**
+** 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 "gtest/gtest.h"
+#include "gmock/gmock-matchers.h"
+#include "gmock/gmock-generated-matchers.h"
+#include "gtest-qt-printing.h"
+
+#include <codecompletionchunk.h>
+#include <completionchunkstotextconverter.h>
+
+namespace {
+
+using CodeModelBackEnd::CodeCompletionChunk;
+
+class CompletionChunksToTextConverter : public ::testing::Test
+{
+protected:
+ ClangCodeModel::Internal::CompletionChunksToTextConverter converter;
+ CodeCompletionChunk integerResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("int")};
+ CodeCompletionChunk enumerationResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("Enumeration")};
+ CodeCompletionChunk functionName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Function")};
+ CodeCompletionChunk variableName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Variable")};
+ CodeCompletionChunk enumeratorName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Enumerator")};
+ CodeCompletionChunk enumerationName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Enumeration")};
+ CodeCompletionChunk className{CodeCompletionChunk::TypedText, Utf8StringLiteral("Class")};
+ CodeCompletionChunk leftParen{CodeCompletionChunk::LeftParen, Utf8StringLiteral("(")};
+ CodeCompletionChunk rightParen{CodeCompletionChunk::LeftParen, Utf8StringLiteral(")")};
+ CodeCompletionChunk comma{CodeCompletionChunk::Comma, Utf8StringLiteral(", ")};
+ CodeCompletionChunk functionArgumentX{CodeCompletionChunk::Placeholder, Utf8StringLiteral("char x")};
+ CodeCompletionChunk functionArgumentY{CodeCompletionChunk::Placeholder, Utf8StringLiteral("int y")};
+ CodeCompletionChunk functionArgumentZ{CodeCompletionChunk::Placeholder, Utf8StringLiteral("int z")};
+ CodeCompletionChunk optional{CodeCompletionChunk::Optional, Utf8String(), {comma, functionArgumentY, comma, functionArgumentZ}};
+};
+
+TEST_F(CompletionChunksToTextConverter, ParseIsClearingText)
+{
+ QVector<CodeCompletionChunk> completionChunks({integerResultType, functionName, leftParen, rightParen});
+ converter.parseChunks(completionChunks);
+
+ converter.parseChunks(completionChunks);
+
+ ASSERT_THAT(converter.text(), QStringLiteral("int Function()"));
+}
+
+TEST_F(CompletionChunksToTextConverter, ConvertFunction)
+{
+ QVector<CodeCompletionChunk> completionChunks({integerResultType, functionName, leftParen, rightParen});
+
+ converter.parseChunks(completionChunks);
+
+ ASSERT_THAT(converter.text(), QStringLiteral("int Function()"));
+}
+
+TEST_F(CompletionChunksToTextConverter, ConvertFunctionWithParameters)
+{
+ QVector<CodeCompletionChunk> completionChunks({integerResultType, functionName, leftParen, functionArgumentX,rightParen});
+
+ converter.parseChunks(completionChunks);
+
+ ASSERT_THAT(converter.text(), QStringLiteral("int Function(char x)"));
+}
+
+TEST_F(CompletionChunksToTextConverter, ConvertFunctionWithOptionalParameter)
+{
+ QVector<CodeCompletionChunk> completionChunks({integerResultType, functionName, leftParen, functionArgumentX, optional,rightParen});
+
+ converter.parseChunks(completionChunks);
+
+ ASSERT_THAT(converter.text(), QStringLiteral("int Function(char x<i>, int y, int z</i>)"));
+}
+
+TEST_F(CompletionChunksToTextConverter, ConvertVariable)
+{
+ QVector<CodeCompletionChunk> completionChunks({integerResultType, variableName});
+
+ converter.parseChunks(completionChunks);
+
+ ASSERT_THAT(converter.text(), QStringLiteral("int Variable"));
+}
+
+TEST_F(CompletionChunksToTextConverter, Enumerator)
+{
+ QVector<CodeCompletionChunk> completionChunks({enumerationResultType, enumeratorName});
+
+ converter.parseChunks(completionChunks);
+
+ ASSERT_THAT(converter.text(), QStringLiteral("Enumeration Enumerator"));
+}
+
+TEST_F(CompletionChunksToTextConverter, Enumeration)
+{
+ QVector<CodeCompletionChunk> completionChunks({className});
+
+ converter.parseChunks(completionChunks);
+
+ ASSERT_THAT(converter.text(), QStringLiteral("Class"));
+}
+
+}
diff --git a/tests/unit/codemodelbackend/unittest/unittest.pro b/tests/unit/codemodelbackend/unittest/unittest.pro
index 9b7012957a..fef27d9469 100644
--- a/tests/unit/codemodelbackend/unittest/unittest.pro
+++ b/tests/unit/codemodelbackend/unittest/unittest.pro
@@ -19,6 +19,9 @@ include(../../../../src/libs/sqlite/sqlite-lib.pri)
include(../../../../src/libs/codemodelbackendipc/codemodelbackendipc-lib.pri)
include(../../../../src/tools/codemodelbackend/ipcsource/codemodelbackendclangipc-source.pri)
include(../../../../src/tools/codemodelbackend/clang_installation.pri)
+include(../../../../src/plugins/clangcodemodel/clangcodemodeltesting.pri)
+
+INCLUDEPATH += $$PWD/../../../../src/libs $$PWD/../../../../src/plugins
requires(!isEmpty(LLVM_LIBS))
@@ -53,7 +56,8 @@ SOURCES += main.cpp \
unsavedfilestest.cpp \
projecttest.cpp \
clangipcservertest.cpp \
- translationunitstest.cpp
+ translationunitstest.cpp \
+ completionchunkstotextconvertertest.cpp
HEADERS += \
gtest-qt-printing.h \