diff options
author | Kai Pastor <dg0yt@darc.de> | 2016-04-03 09:44:36 +0200 |
---|---|---|
committer | Kai Pastor <dg0yt@darc.de> | 2016-04-28 16:07:59 +0000 |
commit | 4ea581c95ae9704b250591c5d4d9b0517f5b62f2 (patch) | |
tree | 113919959a4296387d87b301ed93ceca1d494d46 /tests | |
parent | e1520db966debc5ad2d5dd26ec297073367697c1 (diff) |
lupdate: Explicitly handle C++ member initializer lists
This change makes the cpp parser explicitly deal with parens and
braces in member initializer lists of constructors. It fixes
problems with C++11 syntax like list-initialization and lambdas.
It adds auto tests for tr() calls in initialization expressions.
The combination of parens in base class template parameters with
list initialization (braces) remains unsupported.
Task-number: QTBUG-34128
Task-number: QTBUG-42166
Change-Id: Id4ac0a011fcda8d2b72a15348a1b96fdd492ab32
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Diffstat (limited to 'tests')
3 files changed, 189 insertions, 0 deletions
diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt b/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt index c35c086c8..28f115561 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt @@ -2,4 +2,6 @@ .*/lupdate/testdata/good/parsecpp/finddialog.cpp:127: Qualifying with unknown namespace/class ::FindDialog .*/lupdate/testdata/good/parsecpp/finddialog.cpp:167: Qualifying with unknown namespace/class ::FindDialog .*/lupdate/testdata/good/parsecpp/finddialog.cpp:173: Unsupported encoding Latin1 +.*/lupdate/testdata/good/parsecpp/main.cpp:625: tr\(\) cannot be called without context +.*/lupdate/testdata/good/parsecpp/main.cpp:627: tr\(\) cannot be called without context lupdate warning: Message with id 'yet_another_id' has no source. diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp index 31783fd6a..5b6645689 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp @@ -516,3 +516,114 @@ void nullMacroInPlural() QObject::tr("%n NULL(s)", NULL, 3); QObject::tr("%n Q_NULLPTR(s)", Q_NULLPTR, 3); } + + + +// QTBUG-34128: lupdate ignores tr() calls in constructor if a member is +// initialized with C++11 initializer list +class ListInitializationClass : public NameSchpase::YetMoreFun, Gui::BaseClass +{ + Q_OBJECT + + ListInitializationClass() : + NameSchpase::YetMoreFun(), + Gui::BaseClass{ }, + a{ 0 }, + b(1), + c(tr("Hello World")) + { + tr("ListInitializationClass in-class constructor"); + } + + ListInitializationClass(int a); + + ListInitializationClass(int a, int b, int c); + + int a; + int b; + QString c; +}; + +ListInitializationClass::ListInitializationClass(int a) : + b{ { 2, 3 }[a] } +{ + tr("ListInitializationClass out-of-class single member initializer"); +} + +ListInitializationClass::ListInitializationClass(int a, int b, int c) : + NameSchpase::YetMoreFun{ }, + Gui::BaseClass(), + a{ 2 + (a/3) }, + b(b), + c{ tr("%n item(s)", Q_NULLPTR, c) } +{ + tr("ListInitializationClass out-of-class multi member initializer"); +} + + + +// QTBUG-42166: lupdate is confused by C++11 lambdas in constructor initializer lists +class LambdaMemberClass : public Gui::BaseClass +{ + Q_OBJECT + + LambdaMemberClass() : + Gui::BaseClass(), + a{ [](){ std::cout << QObject::tr("Hello"); } }, + b([](){ std::cout << "World\n"; }) + { + tr("LambdaMemberClass in-class constructor"); + } + + LambdaMemberClass(void *); + + std::function<void()> a; + std::function<void()> b; +}; + +LambdaMemberClass::LambdaMemberClass(void *) : + Gui::BaseClass{ }, + a([](){ std::cout << QObject::tr("Hallo "); }), + b{ [](){ std::cout << "Welt\n"; } } +{ + tr("LambdaMemberClass out-of-class constructor"); +} + + + +// Template parameters in base class initialization +class TemplateClass : QVarLengthArray<char, sizeof(std::size_t)>, std::vector<int> +{ + Q_DECLARE_TR_FUNCTIONS(TemplateClass) + QString member; + +public: + TemplateClass() : + QVarLengthArray<char, sizeof(std::size_t)>(), + std::vector<int>(3), + member(tr("TemplateClass() in-class member initialization")) + { + tr("TemplateClass() in-class body"); + } + + TemplateClass(void *); + TemplateClass(int); +}; + +// supported: combination of parens in base class template parameter with direct initialization (parens) +TemplateClass::TemplateClass(void *) : + QVarLengthArray<char, sizeof(std::size_t)>(), + std::vector<int>{ 1, 2 }, + member{ tr("TemplateClass(void *) out-of-class member initialization") } +{ + tr("TemplateClass(void *) out-of-class body"); +} + +// not supported: combination of parens in base class template parameter with list initialization (braces) +TemplateClass::TemplateClass(int) : + QVarLengthArray<char, sizeof(std::size_t)>{ 3, 4, 5 }, + member(tr("[unsupported] TemplateClass(int) out-of-class member initialization")) +{ + tr("[unsupported] TemplateClass(int) out-of-class body"); +} + diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result index 4f301b2db..d72026b1c 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result @@ -187,6 +187,49 @@ backslashed \ stuff.</source> </message> </context> <context> + <name>LambdaMemberClass</name> + <message> + <location filename="main.cpp" line="575"/> + <source>LambdaMemberClass in-class constructor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="589"/> + <source>LambdaMemberClass out-of-class constructor</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ListInitializationClass</name> + <message> + <location filename="main.cpp" line="533"/> + <source>Hello World</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="535"/> + <source>ListInitializationClass in-class constructor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="550"/> + <source>ListInitializationClass out-of-class single member initializer</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="558"/> + <source>%n item(s)</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message> + <location filename="main.cpp" line="560"/> + <source>ListInitializationClass out-of-class multi member initializer</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>LotsaFun</name> <message> <location filename="main.cpp" line="310"/> @@ -334,6 +377,16 @@ backslashed \ stuff.</source> </translation> </message> <message> + <location filename="main.cpp" line="572"/> + <source>Hello</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="586"/> + <source>Hallo </source> + <translation type="unfinished"></translation> + </message> + <message> <location filename="included.cpp" line="34"/> <source>message from #included .cpp file</source> <translation type="unfinished"></translation> @@ -386,6 +439,29 @@ backslashed \ stuff.</source> </message> </context> <context> + <name>TemplateClass</name> + <message> + <location filename="main.cpp" line="604"/> + <source>TemplateClass() in-class member initialization</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="606"/> + <source>TemplateClass() in-class body</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="617"/> + <source>TemplateClass(void *) out-of-class member initialization</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="619"/> + <source>TemplateClass(void *) out-of-class body</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>TernaryClass</name> <message> <location filename="main.cpp" line="480"/> |