From 31ce303ee71214d40fdd714fdc287f3772e8474e Mon Sep 17 00:00:00 2001 From: Przemyslaw Gorszkowski Date: Wed, 5 Dec 2012 09:20:52 +0100 Subject: [PATCH] C++: fix code completion: casting inside parentheses Included unit tests. Task-number: QTCREATORBUG-8368 Change-Id: I1b04124bc2c9eac050cfb2e6d3a5c1aca5311f4b Reviewed-by: Nikolai Kosjar Reviewed-by: Erik Verbruggen --- src/libs/cplusplus/ExpressionUnderCursor.cpp | 2 + src/plugins/cpptools/cppcompletion_test.cpp | 81 ++++++++++++++++++++ src/plugins/cpptools/cpptoolsplugin.h | 2 + 3 files changed, 85 insertions(+) diff --git a/src/libs/cplusplus/ExpressionUnderCursor.cpp b/src/libs/cplusplus/ExpressionUnderCursor.cpp index b3e0694db0a..0c8af020ba6 100644 --- a/src/libs/cplusplus/ExpressionUnderCursor.cpp +++ b/src/libs/cplusplus/ExpressionUnderCursor.cpp @@ -157,6 +157,8 @@ int ExpressionUnderCursor::startOfExpression_helper(BackwardsScanner &tk, int in return index - 1; } else if (tk[index - 1].is(T_RPAREN)) { int matchingBraceIndex = tk.startOfMatchingBrace(index); + if (! matchingBraceIndex) + return matchingBraceIndex; if (matchingBraceIndex != index) { if (tk[matchingBraceIndex - 1].is(T_GREATER)) { int lessIndex = tk.startOfMatchingBrace(matchingBraceIndex); diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index 4df7400978c..9eb28dca97e 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -152,6 +152,87 @@ void CppToolsPlugin::test_completion_forward_declarations_present() QCOMPARE(completions, expected); } +void CppToolsPlugin::test_completion_inside_parentheses_c_style_conversion() +{ + TestData data; + data.srcText = "\n" + "class Base\n" + "{\n" + " int i_base;\n" + "};\n" + "\n" + "class Derived : public Base\n" + "{\n" + " int i_derived;\n" + "};\n" + "\n" + "void fun()\n" + "{\n" + " Base *b = new Derived;\n" + " if (1)\n" + " @\n" + "}\n" + ; + + setup(&data); + + Utils::ChangeSet change; + QString txt = QLatin1String("((Derived *)b)->"); + change.insert(data.pos, txt); + QTextCursor cursor(data.doc); + change.apply(&cursor); + data.pos += txt.length(); + + QStringList completions = getCompletions(data); + + QCOMPARE(completions.size(), 4); + QVERIFY(completions.contains(QLatin1String("Derived"))); + QVERIFY(completions.contains(QLatin1String("Base"))); + QVERIFY(completions.contains(QLatin1String("i_derived"))); + QVERIFY(completions.contains(QLatin1String("i_base"))); + +} + +void CppToolsPlugin::test_completion_inside_parentheses_cast_operator_conversion() +{ + TestData data; + data.srcText = "\n" + "class Base\n" + "{\n" + " int i_base;\n" + "};\n" + "\n" + "class Derived : public Base\n" + "{\n" + " int i_derived;\n" + "};\n" + "\n" + "void fun()\n" + "{\n" + " Base *b = new Derived;\n" + " if (1)\n" + " @\n" + "}\n" + ; + + setup(&data); + + Utils::ChangeSet change; + QString txt = QLatin1String("(static_cast(b))->"); + change.insert(data.pos, txt); + QTextCursor cursor(data.doc); + change.apply(&cursor); + data.pos += txt.length(); + + QStringList completions = getCompletions(data); + + QCOMPARE(completions.size(), 4); + QVERIFY(completions.contains(QLatin1String("Derived"))); + QVERIFY(completions.contains(QLatin1String("Base"))); + QVERIFY(completions.contains(QLatin1String("i_derived"))); + QVERIFY(completions.contains(QLatin1String("i_base"))); +} + void CppToolsPlugin::test_completion_basic_1() { TestData data; diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index c338a24dfeb..b56ee4aa0d6 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -90,6 +90,8 @@ private slots: void test_codegen_definition_middle_member(); void test_completion_forward_declarations_present(); + void test_completion_inside_parentheses_c_style_conversion(); + void test_completion_inside_parentheses_cast_operator_conversion(); void test_completion_basic_1(); void test_completion_template_1(); void test_completion_template_2();