diff options
Diffstat (limited to 'tests/auto/linguist/lupdate')
97 files changed, 3289 insertions, 400 deletions
diff --git a/tests/auto/linguist/lupdate/CMakeLists.txt b/tests/auto/linguist/lupdate/CMakeLists.txt index 874a08b30..abdd1aedd 100644 --- a/tests/auto/linguist/lupdate/CMakeLists.txt +++ b/tests/auto/linguist/lupdate/CMakeLists.txt @@ -14,4 +14,11 @@ endif() qt_internal_add_test(tst_lupdate SOURCES tst_lupdate.cpp + LIBRARIES + Qt::ToolsPrivate + Qt::CorePrivate ) + +# The recursive tests take a bit longer for the clang-based parser. +# Increase the test timeout. +set_property(TEST tst_lupdate APPEND PROPERTY ENVIRONMENT "QTEST_FUNCTION_TIMEOUT=900000") diff --git a/tests/auto/linguist/lupdate/testdata/good/codecforsrc/main.cpp b/tests/auto/linguist/lupdate/testdata/good/codecforsrc/main.cpp index 169c63cd1..71ff0cc5f 100644 --- a/tests/auto/linguist/lupdate/testdata/good/codecforsrc/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/codecforsrc/main.cpp @@ -26,11 +26,11 @@ ** ****************************************************************************/ -#include <QApplication> +#include <QtWidgets/QApplication> #include <QtGui> #include <QtCore> - - +#include <QtWidgets/QLabel> +#include <QtWidgets/QBoxLayout> int main(int argc, char **argv) { QApplication a(argc, argv); @@ -40,8 +40,8 @@ int main(int argc, char **argv) QLabel label1(QObject::tr("abc", "ascii"), &w); QLabel label2(QObject::tr("æøå", "utf-8"), &w); QLabel label2a(QObject::tr("\303\246\303\270\303\245", "utf-8 oct"), &w); - QLabel label3(QObject::trUtf8("Für Élise", "trUtf8"), &w); - QLabel label3a(QObject::trUtf8("F\303\274r \303\211lise", "trUtf8 oct"), &w); + QLabel label3(QObject::tr("Für Élise", "trUtf8"), &w); // trUtf8 is obsolete + QLabel label3a(QObject::tr("F\303\274r \303\211lise", "trUtf8 oct"), &w); // trUtf8 is obsolete QBoxLayout *ly = new QVBoxLayout(&w); ly->addWidget(&label1); diff --git a/tests/auto/linguist/lupdate/testdata/good/from_subdir/src/main.cpp b/tests/auto/linguist/lupdate/testdata/good/from_subdir/src/main.cpp index e96716d1f..ce02a9491 100644 --- a/tests/auto/linguist/lupdate/testdata/good/from_subdir/src/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/from_subdir/src/main.cpp @@ -28,10 +28,11 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> #include "main.h" int main(int argc, char **argv) { - return QApplication::tr("string in main.cpp"); + QString s1 = QApplication::tr("string in main.cpp"); + return 0; } diff --git a/tests/auto/linguist/lupdate/testdata/good/from_subdir/src/main.h b/tests/auto/linguist/lupdate/testdata/good/from_subdir/src/main.h index 86dac7e40..9fa813346 100644 --- a/tests/auto/linguist/lupdate/testdata/good/from_subdir/src/main.h +++ b/tests/auto/linguist/lupdate/testdata/good/from_subdir/src/main.h @@ -28,5 +28,5 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - -QT_TRANSLATE_NOOP("QApplication", "string in main.h") +#include <QtCore> +char dummy[] = QT_TRANSLATE_NOOP("QApplication", "string in main.h"); diff --git a/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/expectedoutput.txt b/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/expectedoutput.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/expectedoutput.txt diff --git a/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/main.cpp b/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/main.cpp new file mode 100644 index 000000000..d8e7db2a8 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/main.cpp @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// IMPORTANT!!!! If you want to add testdata to this file, +// always add it to the end in order to not change the linenumbers of translations!!! + +#define QTCORE <QtCore> +#include QTCORE // Hidden from lupdate, but compiles + +// +// Test 'lacks Q_OBJECT' reporting on namespace scopes +// + +class B : public QObject { + //Q_OBJECT + void foo(); +}; + +void B::foo() { + tr("Bla", "::B"); +} + + +class C : public QObject { + //Q_OBJECT + void foo() { + tr("Bla", "::C"); + } +}; + + +namespace nsB { + + class B : public QObject { + //Q_OBJECT + void foo(); + }; + + void B::foo() { + tr("Bla", "nsB::B"); + } + + class C : public QObject { + //Q_OBJECT + void foo() { + tr("Bla", "nsB::C"); + } + }; +} + diff --git a/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/project.pro b/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/project.pro new file mode 100644 index 000000000..759bea068 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/project.pro @@ -0,0 +1,3 @@ +SOURCES = main.cpp + +TRANSLATIONS = project.ts diff --git a/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/project.ts.result new file mode 100644 index 000000000..66a33a320 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/lacksqobject_clang_parser/project.ts.result @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1"> +<context> + <name>QObject</name> + <message> + <location filename="main.cpp" line="45"/> + <source>Bla</source> + <comment>::B</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="52"/> + <source>Bla</source> + <comment>::C</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="65"/> + <source>Bla</source> + <comment>nsB::B</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="71"/> + <source>Bla</source> + <comment>nsB::C</comment> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/tests/auto/linguist/lupdate/testdata/good/merge_ordering/foo.cpp b/tests/auto/linguist/lupdate/testdata/good/merge_ordering/foo.cpp index d03a1a009..5c66a142d 100644 --- a/tests/auto/linguist/lupdate/testdata/good/merge_ordering/foo.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/merge_ordering/foo.cpp @@ -26,7 +26,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include <QtCore> // The first line in this file should always be empty, its part of the test!! class Foo : public QObject { @@ -35,8 +35,8 @@ public: Foo(); }; -Foo::Foo(MainWindow *parent) - : QObject(parent) +Foo::Foo() + : QObject() { tr("This is the first entry."); tr("A second message."); tr("And a second one on the same line."); diff --git a/tests/auto/linguist/lupdate/testdata/good/merge_whitespace/main.cpp b/tests/auto/linguist/lupdate/testdata/good/merge_whitespace/main.cpp index dcf785bfe..4edd90061 100644 --- a/tests/auto/linguist/lupdate/testdata/good/merge_whitespace/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/merge_whitespace/main.cpp @@ -25,8 +25,8 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - -#include <QApplication> +#include <QtCore> +#include <QtWidgets/QApplication> #include <QDebug> int main(int argc, char **argv) diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp b/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp index 977445d23..e49f30efc 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp @@ -28,16 +28,18 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ +#include <QtCore> +#include <QtWidgets/QDialog> +#include <QtWidgets/QMainWindow> class FindDialog : public QDialog { Q_OBJECT public: - FindDialog(MainWindow *parent); + FindDialog(QMainWindow *parent); void reset(); }; - -FindDialog::FindDialog(MainWindow *parent) +FindDialog::FindDialog(QMainWindow *parent) : QDialog(parent) { QString trans = tr("Enter the text you want to find."); diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result index 7e23b16d6..427f9c710 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result @@ -4,19 +4,19 @@ <context> <name></name> <message id="xx_hello"> - <location filename="finddialog.cpp" line="57"/> + <location filename="finddialog.cpp" line="59"/> <source>Hello</source> <translation>Hallo</translation> <extra-meta>matter</extra-meta> </message> <message id="xx_world"> - <location filename="finddialog.cpp" line="60"/> + <location filename="finddialog.cpp" line="62"/> <source>New world</source> <oldsource>World</oldsource> <translation type="unfinished">Welt</translation> </message> <message id="qtn_virtual"> - <location filename="finddialog.cpp" line="68"/> + <location filename="finddialog.cpp" line="70"/> <source></source> <extracomment>A message without source string</extracomment> <translation></translation> @@ -31,27 +31,27 @@ <translation></translation> </message> <message> - <location filename="finddialog.cpp" line="43"/> + <location filename="finddialog.cpp" line="45"/> <source>Enter the text you want to find.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="finddialog.cpp" line="44"/> + <location filename="finddialog.cpp" line="46"/> <source>Search reached end of the document</source> <translation type="unfinished"></translation> </message> <message> - <location filename="finddialog.cpp" line="45"/> + <location filename="finddialog.cpp" line="47"/> <source>Search reached start of the document</source> <translation type="unfinished"></translation> </message> <message> - <location filename="finddialog.cpp" line="46"/> + <location filename="finddialog.cpp" line="48"/> <source>Text not found</source> <translation>text not found (in chinese)</translation> </message> <message numerus="yes"> - <location filename="finddialog.cpp" line="51"/> + <location filename="finddialog.cpp" line="53"/> <source>%n item(s)</source> <comment>merge from singular to plural form</comment> <translation type="unfinished"> @@ -59,7 +59,7 @@ </translation> </message> <message numerus="yes"> - <location filename="finddialog.cpp" line="52"/> + <location filename="finddialog.cpp" line="54"/> <source>%n item(s)</source> <comment>merge from a finished singular form to an unfinished plural form</comment> <translation type="unfinished"> @@ -67,7 +67,7 @@ </translation> </message> <message id="new_id"> - <location filename="finddialog.cpp" line="64"/> + <location filename="finddialog.cpp" line="66"/> <source>this is just some text</source> <translation type="unfinished">Unfertige Uebersetzung</translation> </message> diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/finddialog.cpp b/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/finddialog.cpp index 1e2de849e..8b5cd2dd2 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/finddialog.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/finddialog.cpp @@ -27,17 +27,17 @@ ****************************************************************************/ #include "finddialog.h" -#include "mainwindow.h" -#include "tabbedbrowser.h" -#include "helpwindow.h" -#include <QTextBrowser> + + + +#include <QtWidgets/QTextBrowser> #include <QTextCursor> -#include <QStatusBar> -#include <QLineEdit> +#include <QtWidgets/QStatusBar> +#include <QtWidgets/QLineEdit> #include <QDateTime> -#include <QGridLayout> - +#include <QtWidgets/QGridLayout> +//#include <QtWidgets/QDialog> CaseSensitiveModel::CaseSensitiveModel(int rows, int columns, QObject *parent) : QStandardItemModel(rows, columns, parent) {} @@ -50,56 +50,56 @@ QModelIndexList CaseSensitiveModel::match(const QModelIndex &start, int role, co return QStandardItemModel::match(start, role, value, hits, flags); } -FindDialog::FindDialog(MainWindow *parent) +FindDialog::FindDialog(QMainWindow *parent) : QDialog(parent) { - contentsWidget = new QWidget(this); - ui.setupUi(contentsWidget); - ui.comboFind->setModel(new CaseSensitiveModel(0, 1, ui.comboFind)); + auto contentsWidget = new QWidget(this); + //ui.setupUi(contentsWidget); + //ui.comboFind->setModel(new CaseSensitiveModel(0, 1, ui.comboFind)); QVBoxLayout *l = new QVBoxLayout(this); l->setContentsMargins(QMargins()); l->setSpacing(0); l->addWidget(contentsWidget); - lastBrowser = 0; - onceFound = false; - findExpr.clear(); + auto lastBrowser = 0; + auto onceFound = false; + //findExpr.clear(); - sb = new QStatusBar(this); + auto sb = new QStatusBar(this); l->addWidget(sb); sb->showMessage(tr("Enter the text you want to find.")); - connect(ui.findButton, SIGNAL(clicked()), this, SLOT(findButtonClicked())); - connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(reject())); + //connect(ui.findButton, SIGNAL(clicked()), this, SLOT(findButtonClicked())); + //connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(reject())); } -FindDialog::~FindDialog() -{ -} +//FindDialog::~FindDialog() +//{ +//} -void FindDialog::findButtonClicked() -{ - doFind(ui.radioForward->isChecked()); -} +//void FindDialog::findButtonClicked() +//{ +// doFind(ui.radioForward->isChecked()); +//} void FindDialog::doFind(bool forward) { - QTextBrowser *browser = static_cast<QTextBrowser*>(mainWindow()->browsers()->currentBrowser()); - sb->clearMessage(); + QTextBrowser *browser = NULL;// = static_cast<QTextBrowser*>(mainWindow()->browsers()->currentBrowser()); + //sb->clearMessage(); - if (ui.comboFind->currentText() != findExpr || lastBrowser != browser) - onceFound = false; - findExpr = ui.comboFind->currentText(); + //if (ui.comboFind->currentText() != findExpr || lastBrowser != browser) + // onceFound = false; + //findExpr = ui.comboFind->currentText(); - QTextDocument::FindFlags flags = 0; + QTextDocument::FindFlags flags;// = 0; - if (ui.checkCase->isChecked()) - flags |= QTextDocument::FindCaseSensitively; + //if (ui.checkCase->isChecked()) + // flags |= QTextDocument::FindCaseSensitively; - if (ui.checkWords->isChecked()) - flags |= QTextDocument::FindWholeWords; + //if (ui.checkWords->isChecked()) + // flags |= QTextDocument::FindWholeWords; QTextCursor c = browser->textCursor(); if (!c.hasSelection()) { @@ -114,28 +114,28 @@ void FindDialog::doFind(bool forward) QTextDocument::FindFlags options; if (forward == false) flags |= QTextDocument::FindBackward; - - QTextCursor found = browser->document()->find(findExpr, c, flags); + bool onceFound = true; + QTextCursor found;// = browser->document()->find(findExpr, c, flags); if (found.isNull()) { if (onceFound) { if (forward) - statusMessage(tr("Search reached end of the document")); + auto a = tr("Search reached end of the document");//statusMessage(tr("Search reached end of the document")); else - statusMessage(tr("Search reached start of the document")); + auto aa = tr("Search reached start of the document");//statusMessage(tr("Search reached start of the document")); } else { - statusMessage(tr( "Text not found" )); + auto aaa = tr( "Text not found" ); //statusMessage(tr( "Text not found" )); } } else { browser->setTextCursor(found); } onceFound |= !found.isNull(); - lastBrowser = browser; + auto lastBrowser = browser; } -bool FindDialog::hasFindExpression() const +void FindDialog::hasFindExpression() const { // statusMessage(tr( "Should be obsolete" )); //% "This is some random text" - qtTrId("keep_id") + qtTrId("keep_id"); } diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/finddialog.h b/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/finddialog.h new file mode 100644 index 000000000..5a1adf7eb --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/finddialog.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Linguist of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtWidgets/QTextBrowser> +#include <QTextCursor> +#include <QtWidgets/QStatusBar> +#include <QtWidgets/QLineEdit> +#include <QDateTime> +#include <QtWidgets/QGridLayout> +#include <QtWidgets/QDialog> +#include <QtGui> +#include <QtWidgets/QMainWindow> + +class FindDialog : public QDialog +{ + Q_OBJECT +public: + FindDialog(QWidget *parent = 0); + FindDialog(QMainWindow *parent = 0); + void doFind(bool forward); + void hasFindExpression() const; + +signals: + +public slots: + void find(); + +private slots: + void emitFindNext(); + void verify(); + +private: + bool m_redText = false; +}; + + +class CaseSensitiveModel: public QStandardItemModel +{ + CaseSensitiveModel(int rows, int columns, QObject *parent); + QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits, Qt::MatchFlags flags) const; +}; diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/finddialog.cpp b/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/finddialog.cpp index dd5888043..7727c9615 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/finddialog.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/finddialog.cpp @@ -27,16 +27,16 @@ ****************************************************************************/ #include "finddialog.h" -#include "mainwindow.h" -#include "tabbedbrowser.h" -#include "helpwindow.h" +//#include "mainwindow.h" +//#include "tabbedbrowser.h" +//#include "helpwindow.h" -#include <QTextBrowser> +#include <QtWidgets/QTextBrowser> #include <QTextCursor> -#include <QStatusBar> -#include <QLineEdit> +#include <QtWidgets/QStatusBar> +#include <QtWidgets/QLineEdit> #include <QDateTime> -#include <QGridLayout> +#include <QtWidgets/QGridLayout> CaseSensitiveModel::CaseSensitiveModel(int rows, int columns, QObject *parent) : QStandardItemModel(rows, columns, parent) @@ -50,23 +50,23 @@ QModelIndexList CaseSensitiveModel::match(const QModelIndex &start, int role, co return QStandardItemModel::match(start, role, value, hits, flags); } -FindDialog::FindDialog(MainWindow *parent) +FindDialog::FindDialog(QMainWindow *parent) : QDialog(parent) { - contentsWidget = new QWidget(this); - ui.setupUi(contentsWidget); - ui.comboFind->setModel(new CaseSensitiveModel(0, 1, ui.comboFind)); + auto contentsWidget = new QWidget(this); + //ui.setupUi(contentsWidget); + //ui.comboFind->setModel(new CaseSensitiveModel(0, 1, ui.comboFind)); QVBoxLayout *l = new QVBoxLayout(this); l->setContentsMargins(QMargins()); l->setSpacing(0); l->addWidget(contentsWidget); - lastBrowser = 0; - onceFound = false; - findExpr.clear(); + auto lastBrowser = 0; + auto onceFound = false; + //findExpr.clear(); - sb = new QStatusBar(this); + auto sb = new QStatusBar(this); l->addWidget(sb); @@ -74,35 +74,35 @@ FindDialog::FindDialog(MainWindow *parent) // then lupdate should add this one as a new one, and mark the old one as obsolete. sb->showMessage(tr("Enter the text you want to find.")); - connect(ui.findButton, SIGNAL(clicked()), this, SLOT(findButtonClicked())); - connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(reject())); + //connect(ui.findButton, SIGNAL(clicked()), this, SLOT(findButtonClicked())); + //connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(reject())); } -FindDialog::~FindDialog() -{ -} +//FindDialog::~FindDialog() +//{ +//} -void FindDialog::findButtonClicked() -{ - doFind(ui.radioForward->isChecked()); -} +//void FindDialog::findButtonClicked() +//{ + //doFind(ui.radioForward->isChecked()); +//} void FindDialog::doFind(bool forward) { - QTextBrowser *browser = static_cast<QTextBrowser*>(mainWindow()->browsers()->currentBrowser()); - sb->clearMessage(); + QTextBrowser *browser;// = static_cast<QTextBrowser*>(mainWindow()->browsers()->currentBrowser()); + //sb->clearMessage(); - if (ui.comboFind->currentText() != findExpr || lastBrowser != browser) - onceFound = false; - findExpr = ui.comboFind->currentText(); + //if (ui.comboFind->currentText() != findExpr || lastBrowser != browser) + // onceFound = false; + //findExpr = ui.comboFind->currentText(); - QTextDocument::FindFlags flags = 0; + //QTextDocument::FindFlags flags = 0; - if (ui.checkCase->isChecked()) - flags |= QTextDocument::FindCaseSensitively; + //if (ui.checkCase->isChecked()) + // flags |= QTextDocument::FindCaseSensitively; - if (ui.checkWords->isChecked()) - flags |= QTextDocument::FindWholeWords; + //if (ui.checkWords->isChecked()) + // flags |= QTextDocument::FindWholeWords; QTextCursor c = browser->textCursor(); if (!c.hasSelection()) { @@ -115,50 +115,31 @@ void FindDialog::doFind(bool forward) } QTextDocument::FindFlags options; - if (forward == false) - flags |= QTextDocument::FindBackward; - - QTextCursor found = browser->document()->find(findExpr, c, flags); + //if (forward == false) + // flags |= QTextDocument::FindBackward; + bool onceFound = true; + QTextCursor found;// = browser->document()->find(findExpr, c, flags); if (found.isNull()) { if (onceFound) { if (forward) - statusMessage(tr("Search reached end of the document")); + auto a = tr("Search reached end of the document");//statusMessage(tr("Search reached end of the document")); else - statusMessage(tr("Search reached start of the document")); + auto aa = tr("Search reached start of the document");//statusMessage(tr("Search reached start of the document")); } else { - statusMessage(tr( "Text not found" )); + auto aaa = tr( "Text not found" );//statusMessage(tr( "Text not found" )); } } else { browser->setTextCursor(found); } onceFound |= !found.isNull(); - lastBrowser = browser; + auto lastBrowser = browser; } -bool FindDialog::hasFindExpression() const +void FindDialog::hasFindExpression() const { //% "This is some random text" - qtTrId("keep_id") + qtTrId("keep_id"); - return !findExpr.isEmpty(); + //return !findExpr.isEmpty(); } -void FindDialog::statusMessage(const QString &message) -{ - if (isVisible()) - sb->showMessage(message); - else - static_cast<MainWindow*>(parent())->statusBar()->showMessage(message, 2000); -} - -MainWindow *FindDialog::mainWindow() const -{ - return static_cast<MainWindow*>(parentWidget()); -} - -void FindDialog::reset() -{ - ui.comboFind->setFocus(); - ui.comboFind->lineEdit()->setSelection( - 0, ui.comboFind->lineEdit()->text().length()); -} diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/finddialog.h b/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/finddialog.h new file mode 100644 index 000000000..5a1adf7eb --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/finddialog.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Linguist of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtWidgets/QTextBrowser> +#include <QTextCursor> +#include <QtWidgets/QStatusBar> +#include <QtWidgets/QLineEdit> +#include <QDateTime> +#include <QtWidgets/QGridLayout> +#include <QtWidgets/QDialog> +#include <QtGui> +#include <QtWidgets/QMainWindow> + +class FindDialog : public QDialog +{ + Q_OBJECT +public: + FindDialog(QWidget *parent = 0); + FindDialog(QMainWindow *parent = 0); + void doFind(bool forward); + void hasFindExpression() const; + +signals: + +public slots: + void find(); + +private slots: + void emitFindNext(); + void verify(); + +private: + bool m_redText = false; +}; + + +class CaseSensitiveModel: public QStandardItemModel +{ + CaseSensitiveModel(int rows, int columns, QObject *parent); + QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits, Qt::MatchFlags flags) const; +}; diff --git a/tests/auto/linguist/lupdate/testdata/good/multiple_locations/finddialog.cpp b/tests/auto/linguist/lupdate/testdata/good/multiple_locations/finddialog.cpp index 070b35617..cb85833fb 100644 --- a/tests/auto/linguist/lupdate/testdata/good/multiple_locations/finddialog.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/multiple_locations/finddialog.cpp @@ -26,9 +26,17 @@ ** ****************************************************************************/ -QT_TRANSLATE_NOOP("context", "just a message"); +#include <QtCore> + + +class AClass +{ + Q_OBJECT + + const char *c_noop_translate = QT_TRANSLATE_NOOP("context", "just a message"); //: This is one comment -QT_TRANSLATE_NOOP("context", "just a message"); + const char *c_noop_translate2 = QT_TRANSLATE_NOOP("context", "just a message"); +}; diff --git a/tests/auto/linguist/lupdate/testdata/good/multiple_locations/main.cpp b/tests/auto/linguist/lupdate/testdata/good/multiple_locations/main.cpp index 5d9634465..62a60ce91 100644 --- a/tests/auto/linguist/lupdate/testdata/good/multiple_locations/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/multiple_locations/main.cpp @@ -25,38 +25,39 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - - - +#include <QtCore> +class DClass +{ //: This is a comment, too. -QT_TRANSLATE_NOOP("context", "just a message"); - - - + const char *c_noop_translate = QT_TRANSLATE_NOOP("context", "just a message"); + void func(); +}; +void DClass::func() { //: commented -qtTrId("lollipop"); + qtTrId("lollipop"); //% "this is the source text" //~ meta so-meta //: even more commented -qtTrId("lollipop"); + qtTrId("lollipop"); //% "this is contradicting source text" -qtTrId("lollipop"); + qtTrId("lollipop"); //~ meta too-much-meta -qtTrId("lollipop"); + qtTrId("lollipop"); //~ meta so-meta -QObject::tr("another message", "here with a lot of noise in the comment so it is long enough"); + auto a = QObject::tr("another message", "here with a lot of noise in the comment so it is long enough"); //~ meta too-much-meta -QObject::tr("another message", "here with a lot of noise in the comment so it is long enough"); + auto aa = QObject::tr("another message", "here with a lot of noise in the comment so it is long enough"); // old parser: not picked up //: commented qtTrId("lollipop"); +} diff --git a/tests/auto/linguist/lupdate/testdata/good/multiple_locations/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/multiple_locations/project.ts.result index f10f9cced..03fa9b1bf 100644 --- a/tests/auto/linguist/lupdate/testdata/good/multiple_locations/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/multiple_locations/project.ts.result @@ -28,8 +28,8 @@ even more commented</extracomment> <context> <name>context</name> <message> - <location filename="finddialog.cpp" line="29"/> - <location filename="finddialog.cpp" line="34"/> + <location filename="finddialog.cpp" line="36"/> + <location filename="finddialog.cpp" line="41"/> <location filename="main.cpp" line="33"/> <source>just a message</source> <extracomment>This is one comment diff --git a/tests/auto/linguist/lupdate/testdata/good/namespaces/main.cpp b/tests/auto/linguist/lupdate/testdata/good/namespaces/main.cpp index 68e5da5ed..90889dd76 100644 --- a/tests/auto/linguist/lupdate/testdata/good/namespaces/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/namespaces/main.cpp @@ -130,7 +130,7 @@ void foo() using namespace A; } -void goo() +QString goo() { return QObject::tr("Bla"); } @@ -182,4 +182,4 @@ void foo() } -#include "main.moc" +//#include "main.moc" diff --git a/tests/auto/linguist/lupdate/testdata/good/notargetlanguage/main.cpp b/tests/auto/linguist/lupdate/testdata/good/notargetlanguage/main.cpp index 157979b70..c9eaffb7c 100644 --- a/tests/auto/linguist/lupdate/testdata/good/notargetlanguage/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/notargetlanguage/main.cpp @@ -25,8 +25,8 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#include <QApplication> -#include <QPushButton> +#include <QtWidgets/QApplication> +#include <QtWidgets/QPushButton> #include <QTranslator> int main(int argc, char *argv[]) diff --git a/tests/auto/linguist/lupdate/testdata/good/parse_special_chars/main.cpp b/tests/auto/linguist/lupdate/testdata/good/parse_special_chars/main.cpp index 791fbdcbd..2cc7499cf 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parse_special_chars/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/parse_special_chars/main.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QDialog> class Dialog2 : public QDialog { Q_OBJECT @@ -40,7 +40,7 @@ void Dialog2::func() { tr("cat\xc3\xa9gorie"); - tr("F\xc3\xbcr \xc3\x88lise") + tr("F\xc3\xbcr \xc3\x88lise"); } diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecontexts/main.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecontexts/main.cpp index f73bdcbc1..c814fc46f 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecontexts/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/parsecontexts/main.cpp @@ -30,7 +30,7 @@ // always add it to the end in order to not change the linenumbers of translations!!! #include <QtCore> #include <QtGui> - +#include <QtWidgets/QMainWindow> // // Test namespace scoping // @@ -247,13 +247,13 @@ QString C2::foo() { return tr("test TRANSLATOR comment (6)", "A1::B3::C2"); // 4.4 screws up } - - namespace Fooish { - Q_DECLARE_TR_FUNCTIONS(Bears::And::Spiders) + struct toto { + Q_DECLARE_TR_FUNCTIONS(Bears::And::Spiders) + QString bar(); }; } -void Fooish::bar() +QString Fooish::toto::bar() { return tr("whatever the context", "Bears::And::Spiders"); } @@ -263,4 +263,4 @@ int main(int /*argc*/, char ** /*argv*/) { return 0; } -#include "main.moc" +//#include "main.moc" diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecontexts_clang_parser/main.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecontexts_clang_parser/main.cpp new file mode 100644 index 000000000..c814fc46f --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecontexts_clang_parser/main.cpp @@ -0,0 +1,266 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// IMPORTANT!!!! If you want to add testdata to this file, +// always add it to the end in order to not change the linenumbers of translations!!! +#include <QtCore> +#include <QtGui> +#include <QtWidgets/QMainWindow> +// +// Test namespace scoping +// + +class D : public QObject { + Q_OBJECT + public: + QString foo() { + return tr("test", "D"); + } + +}; + +namespace A { + + class C : public QObject { + Q_OBJECT + public: + void foo(); + }; + + void C::foo() { + tr("Bla", "A::C"); + } + + void goo() { + C::tr("Bla", "A::C"); // Is identical to the previous tr(), (same context, sourcetext and comment, + // so it should not add another entry to the list of messages) + } + + void goo2() { + C::tr("Bla 2", "A::C"); //Should be in the same namespace as the previous tr() + } + +} + + +namespace X { + + class D : public QObject { + Q_OBJECT + public: + + }; + + class E : public QObject { + Q_OBJECT + public: + void foo() { D::tr("foo", "D"); } // Note that this is X::D from 440 on + }; + + + namespace Y { + class E : public QObject { + Q_OBJECT + + }; + + class C : public QObject { + Q_OBJECT + void foo(); + }; + + void C::foo() { + tr("Bla", "X::Y::C"); + } + + void goo() { + D::tr("Bla", "X::D"); //This should be assigned to the X::D context + } + + void goo2() { + E::tr("Bla", "X::Y::E"); //This should be assigned to the X::Y::E context + Y::E::tr("Bla", "X::Y::E"); //This should be assigned to the X::Y::E context + } + + }; // namespace Y + + class F : public QObject { + Q_OBJECT + inline void inlinefunc() { + tr("inline function", "X::F"); + } + }; +} // namespace X + +namespace ico { + namespace foo { + class A : public QObject { + A(); + }; + + A::A() { + tr("myfoo", "ico::foo::A"); + QObject::tr("task 161186", "QObject"); + } + } +} + +namespace AA { +class C {}; +} + +/** + * the context of a message should not be affected by any inherited classes + * + * Keep this disabled for now, but at a long-term range it should work. + */ +namespace Gui { + class MainWindow : public QMainWindow, + public AA::C + { + Q_OBJECT +public: + MainWindow() + { + tr("More bla", "Gui::MainWindow"); + } + + }; +} //namespace Gui + + +namespace A1 { + class AB : public QObject { + Q_OBJECT + public: + + friend class OtherClass; + + QString inlineFuncAfterFriendDeclaration() const { + return tr("inlineFuncAfterFriendDeclaration", "A1::AB"); + } + }; + class B : AB { + Q_OBJECT + public: + QString foo() const { return tr("foo", "A1::B"); } + }; + + // This is valid C++ too.... + class V : virtual AB { + Q_OBJECT + public: + QString bar() const { return tr("bar", "A1::V"); } + }; + + class W : virtual public AB { + Q_OBJECT + public: + QString baz() const { return tr("baz", "A1::W"); } + }; +} + +class ForwardDecl; + + +class B1 : public QObject { +}; + +class C1 : public QObject { +}; + +namespace A1 { + +class B2 : public QObject { +}; + +} + +void func1() +{ + B1::tr("test TRANSLATOR comment (1)", "B1"); + +} + +using namespace A1; +/* + TRANSLATOR A1::B2 +*/ +void func2() +{ + B2::tr("test TRANSLATOR comment (2)", "A1::B2"); + C1::tr("test TRANSLATOR comment (3)", "C1"); +} + +void func3() +{ + B2::tr("test TRANSLATOR comment (4)", "A1::B2"); +} + +/* + TRANSLATOR B2 + This is a comment to the translator. +*/ +void func4() +{ + B2::tr("test TRANSLATOR comment (5)", "A1::B2"); +} + +namespace A1 { +namespace B3 { +class C2 : public QObject { +QString foo(); +}; +} +} + +namespace D1 = A1::B3; +using namespace D1; + +// TRANSLATOR A1::B3::C2 +QString C2::foo() +{ + return tr("test TRANSLATOR comment (6)", "A1::B3::C2"); // 4.4 screws up +} +namespace Fooish { + struct toto { + Q_DECLARE_TR_FUNCTIONS(Bears::And::Spiders) + QString bar(); }; +} + +QString Fooish::toto::bar() +{ + return tr("whatever the context", "Bears::And::Spiders"); +} + + +int main(int /*argc*/, char ** /*argv*/) { + return 0; +} + +//#include "main.moc" diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecontexts_clang_parser/project.pro b/tests/auto/linguist/lupdate/testdata/good/parsecontexts_clang_parser/project.pro new file mode 100644 index 000000000..759bea068 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecontexts_clang_parser/project.pro @@ -0,0 +1,3 @@ +SOURCES = main.cpp + +TRANSLATIONS = project.ts diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecontexts_clang_parser/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/parsecontexts_clang_parser/project.ts.result new file mode 100644 index 000000000..6ff4df1b4 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecontexts_clang_parser/project.ts.result @@ -0,0 +1,177 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1"> +<context> + <name>A1::AB</name> + <message> + <location filename="main.cpp" line="165"/> + <source>inlineFuncAfterFriendDeclaration</source> + <comment>A1::AB</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>A1::B</name> + <message> + <location filename="main.cpp" line="171"/> + <source>foo</source> + <comment>A1::B</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>A1::V</name> + <message> + <location filename="main.cpp" line="178"/> + <source>bar</source> + <comment>A1::V</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>A1::W</name> + <message> + <location filename="main.cpp" line="184"/> + <source>baz</source> + <comment>A1::W</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>A::C</name> + <message> + <location filename="main.cpp" line="56"/> + <location filename="main.cpp" line="60"/> + <source>Bla</source> + <comment>A::C</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="65"/> + <source>Bla 2</source> + <comment>A::C</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Bears::And::Spiders</name> + <message> + <location filename="main.cpp" line="258"/> + <source>whatever the context</source> + <comment>Bears::And::Spiders</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>D</name> + <message> + <location filename="main.cpp" line="42"/> + <source>test</source> + <comment>D</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Gui::MainWindow</name> + <message> + <location filename="main.cpp" line="150"/> + <source>More bla</source> + <comment>Gui::MainWindow</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="main.cpp" line="127"/> + <source>myfoo</source> + <comment>ico::foo::A</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="128"/> + <source>task 161186</source> + <comment>QObject</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="206"/> + <source>test TRANSLATOR comment (1)</source> + <comment>B1</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="216"/> + <source>test TRANSLATOR comment (2)</source> + <comment>A1::B2</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="217"/> + <source>test TRANSLATOR comment (3)</source> + <comment>C1</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="222"/> + <source>test TRANSLATOR comment (4)</source> + <comment>A1::B2</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="231"/> + <source>test TRANSLATOR comment (5)</source> + <comment>A1::B2</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="248"/> + <source>test TRANSLATOR comment (6)</source> + <comment>A1::B3::C2</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>X::D</name> + <message> + <location filename="main.cpp" line="82"/> + <source>foo</source> + <comment>D</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="102"/> + <source>Bla</source> + <comment>X::D</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>X::F</name> + <message> + <location filename="main.cpp" line="115"/> + <source>inline function</source> + <comment>X::F</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>X::Y::C</name> + <message> + <location filename="main.cpp" line="98"/> + <source>Bla</source> + <comment>X::Y::C</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>X::Y::E</name> + <message> + <location filename="main.cpp" line="106"/> + <location filename="main.cpp" line="107"/> + <source>Bla</source> + <comment>X::Y::E</comment> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt b/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt index c4dbae544..03ad73aa6 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt @@ -1,7 +1,3 @@ -.*/lupdate/testdata/good/parsecpp/finddialog.cpp:72: Qualifying with unknown namespace/class ::FindDialog -.*/lupdate/testdata/good/parsecpp/finddialog.cpp:122: Qualifying with unknown namespace/class ::FindDialog -.*/lupdate/testdata/good/parsecpp/finddialog.cpp:162: Qualifying with unknown namespace/class ::FindDialog -.*/lupdate/testdata/good/parsecpp/finddialog.cpp:168: Unsupported encoding Latin1/DefaultCodec/CodecForTr .*/lupdate/testdata/good/parsecpp/main.cpp:620: tr\(\) cannot be called without context .*/lupdate/testdata/good/parsecpp/main.cpp:622: 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/finddialog.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp/finddialog.cpp index 47dda61d6..ec9d1e5a9 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/finddialog.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/finddialog.cpp @@ -26,75 +26,75 @@ ** ****************************************************************************/ -#include "finddialog.h" -#include "mainwindow.h" -#include "tabbedbrowser.h" -#include "helpwindow.h" - -#include <QTextBrowser> +//#include "finddialog.h" nothing is picked up from there +//#include "mainwindow.h" +//#include "tabbedbrowser.h" +//#include "helpwindow.h" +#include <QtCore> +#include <QtWidgets/QTextBrowser> #include <QTextCursor> -#include <QStatusBar> -#include <QLineEdit> +#include <QtWidgets/QStatusBar> +#include <QtWidgets/QLineEdit> #include <QDateTime> -#include <QGridLayout> +#include <QtWidgets/QGridLayout> +#include <QtWidgets/QMainWindow> +class FindDialog +{ Q_OBJECT + FindDialog(QMainWindow *parent); + void findButtonClicked(); + void doFind(bool forward); + void statusMessage(const QString &message); + //QMainWindow *mainWindow() const; + void reset(); -CaseSensitiveModel::CaseSensitiveModel(int rows, int columns, QObject *parent) - : QStandardItemModel(rows, columns, parent) -{} -QModelIndexList CaseSensitiveModel::match(const QModelIndex &start, int role, const QVariant &value, - int hits, Qt::MatchFlags flags) const -{ - if (flags == Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) - flags |= Qt::MatchCaseSensitive; - return QStandardItemModel::match(start, role, value, hits, flags); -} +}; -FindDialog::FindDialog(MainWindow *parent) - : QDialog(parent) + +FindDialog::FindDialog(QMainWindow *parent) { - contentsWidget = new QWidget(this); - ui.setupUi(contentsWidget); - ui.comboFind->setModel(new CaseSensitiveModel(0, 1, ui.comboFind)); + //auto contentsWidget = new QWidget(this); + //ui.setupUi(contentsWidget); + //ui.comboFind->setModel(new CaseSensitiveModel(0, 1, ui.comboFind)); - QVBoxLayout *l = new QVBoxLayout(this); - l->setContentsMargins(QMargins()); - l->setSpacing(0); - l->addWidget(contentsWidget); + //QVBoxLayout *l = new QVBoxLayout(this); + //l->setContentsMargins(QMargins()); + //l->setSpacing(0); + //l->addWidget(contentsWidget); - lastBrowser = 0; - onceFound = false; - findExpr.clear(); + auto lastBrowser = 0; + auto onceFound = false; + //findExpr.clear(); - sb = new QStatusBar(this); - l->addWidget(sb); + auto sb = new QStatusBar; + //l->addWidget(sb); sb->showMessage(tr("Enter the text you are looking for.")); - connect(ui.findButton, SIGNAL(clicked()), this, SLOT(findButtonClicked())); - connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(reject())); + //connect(ui.findButton, SIGNAL(clicked()), this, SLOT(findButtonClicked())); + //connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(reject())); } -FindDialog::~FindDialog() -{ -} +//FindDialog::~FindDialog() +//{ +//} -void FindDialog::findButtonClicked() -{ - doFind(ui.radioForward->isChecked()); -} +//void FindDialog::findButtonClicked() +//{ +// doFind(ui.radioForward->isChecked()); +//} void FindDialog::doFind(bool forward) { - QTextBrowser *browser = static_cast<QTextBrowser*>(mainWindow()->browsers()->currentBrowser()); - sb->clearMessage(); - - if (ui.comboFind->currentText() != findExpr || lastBrowser != browser) - onceFound = false; - findExpr = ui.comboFind->currentText(); - - QTextDocument::FindFlags flags = 0; - + //QTextBrowser *browser = static_cast<QTextBrowser*>(mainWindow()->browsers()->currentBrowser()); + //sb->clearMessage(); + + //if (ui.comboFind->currentText() != findExpr || lastBrowser != browser) + // onceFound = false; + //findExpr = ui.comboFind->currentText(); + bool onceFound = false; + //QTextDocument::FindFlags flags = 0; + /* if (ui.checkCase->isChecked()) flags |= QTextDocument::FindCaseSensitively; @@ -114,8 +114,8 @@ void FindDialog::doFind(bool forward) QTextDocument::FindFlags options; if (forward == false) flags |= QTextDocument::FindBackward; - - QTextCursor found = browser->document()->find(findExpr, c, flags); + */ + QTextCursor found;//browser->document()->find(findExpr, c, flags); if (found.isNull()) { if (onceFound) { if (forward) @@ -126,46 +126,46 @@ void FindDialog::doFind(bool forward) statusMessage(tr( "Text not found" )); } } else { - browser->setTextCursor(found); + //browser->setTextCursor(found); } onceFound |= !found.isNull(); - lastBrowser = browser; + //lastBrowser = browser; } -bool FindDialog::hasFindExpression() const -{ - return !findExpr.isEmpty(); -} +//bool FindDialog::hasFindExpression() const +//{ +// return !findExpr.isEmpty(); +//} void FindDialog::statusMessage(const QString &message) -{ +{ /* if (isVisible()) sb->showMessage(message); else - static_cast<MainWindow*>(parent())->statusBar()->showMessage(message, 2000); + static_cast<MainWindow*>(parent())->statusBar()->showMessage(message, 2000); */ } -MainWindow *FindDialog::mainWindow() const -{ - return static_cast<MainWindow*>(parentWidget()); -} +//QMainWindow *FindDialog::mainWindow() const +//{ +// return static_cast<MainWindow*>(parentWidget()); +//} void FindDialog::reset() { - ui.comboFind->setFocus(); - ui.comboFind->lineEdit()->setSelection( - 0, ui.comboFind->lineEdit()->text().length()); + //ui.comboFind->setFocus(); + //ui.comboFind->lineEdit()->setSelection( + // 0, ui.comboFind->lineEdit()->text().length()); - QString s = QApplication::translate("QCoreApplication", "with comment", "comment"); - QString s = QApplication::translate("QCoreApplication", "empty comment", ""); - QString s = QApplication::translate("QCoreApplication", "null comment", 0); - QString s = tr("null comment"); + QString s = QCoreApplication::translate("QCoreApplication", "with comment", "comment"); + QString s1 = QCoreApplication::translate("QCoreApplication", "empty comment", ""); + QString s2 = QCoreApplication::translate("QCoreApplication", "null comment", 0); + QString s3 = tr("null comment"); - QString s = QApplication::translate("QCoreApplication", "encoding, using QCoreApplication", 0, QCoreApplication::UnicodeUTF8); - QString s = QApplication::translate("QCoreApplication", "encoding, using QApplication", 0, QApplication::UnicodeUTF8); + QString s4 = QCoreApplication::translate("QCoreApplication", "encoding, using QCoreApplication", 0); + QString s5 = QCoreApplication::translate("QCoreApplication", "encoding, using QApplication", 0); - QString s = QApplication::translate("Kåntekst", "encoding, using QApplication", 0, QApplication::UnicodeUTF8); - QString s = QApplication::translate("QTranslator", "Key", "disambiguation", QCoreApplication::Latin1); + QString s6 = QCoreApplication::translate("Kåntekst", "encoding, using QApplication", 0); + QString s7 = QCoreApplication::translate("QTranslator", "Key", "disambiguation"); } diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/included.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp/included.cpp index e7bc50b42..88b820ae7 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/included.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/included.cpp @@ -25,5 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - -QObject::tr("message from #included .cpp file"); +#include <QtCore> +class MyClass2{ + QString toto = QObject::tr("message from #included .cpp file"); +}; diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp index d93f1bb1f..6d2dde8c8 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp @@ -30,19 +30,19 @@ // always add it to the end in order to not change the linenumbers of translations!!! int main(int argc, char **argv) { - Size size = QSize(1,1); + //Size size = QSize(1,1); } - +#include <QtCore> QString qt_detectRTLLanguage() { - return QApplication::tr("QT_LAYOUT_DIRECTION", + return QCoreApplication::tr("QT_LAYOUT_DIRECTION", "Translate this string to the string 'LTR' in left-to-right" " languages or to 'RTL' in right-to-left languages (such as Hebrew" - " and Arabic) to get proper widget layout.") == QLatin1String("RTL"); + " and Arabic) to get proper widget layout.");// == QLatin1String("RTL"); } -class Dialog2 : public QDialog +class Dialog2 { Q_OBJECT void func(); @@ -65,9 +65,9 @@ void Dialog2::func() - QCoreApplication::translate("Plurals, QCoreApplication", "%n house(s)", "Plurals and identifier", QCoreApplication::UnicodeUTF8, n); - QCoreApplication::translate("Plurals, QCoreApplication", "%n car(s)", "Plurals and literal number", QCoreApplication::UnicodeUTF8, 1); - QCoreApplication::translate("Plurals, QCoreApplication", "%n horse(s)", "Plurals and function call", QCoreApplication::UnicodeUTF8, getCount()); + QCoreApplication::translate("Plurals, QCoreApplication", "%n house(s)", "Plurals and identifier", n); + QCoreApplication::translate("Plurals, QCoreApplication", "%n car(s)", "Plurals and literal number", 1); + QCoreApplication::translate("Plurals, QCoreApplication", "%n horse(s)", "Plurals and function call", getCount()); @@ -171,25 +171,25 @@ class Testing : QObject { /*: another extra-comment */ return tr("another extra-commented string"); /*: blah! */ - return QApplication::translate("scope", "works in translate, too", "blabb", 0); + return QCoreApplication::translate("scope", "works in translate, too", "blabb", 0); } }; //: extra comment for NOOP //: which spans multiple lines -QT_TRANSLATE_NOOP("scope", "string") /*: complain & ignore */; // 4.4 says the line of this is at the next statement +const char *c_1 = QT_TRANSLATE_NOOP("scope", "string") /*: complain & ignore */; // 4.4 says the line of this is at the next statement //: extra comment for NOOP3 -QT_TRANSLATE_NOOP3_UTF8("scope", "string", "comment"); // 4.4 doesn't see this +const char *c_2[2] = QT_TRANSLATE_NOOP3_UTF8("scope", "string", "comment"); // 4.4 doesn't see this -QT_TRANSLATE_NOOP("scope", "string " // this is an interleaved comment +const char *c_3 = QT_TRANSLATE_NOOP("scope", "string " // this is an interleaved comment "continuation on next line"); class TestingTake17 : QObject { Q_OBJECT - int function(void) + void function(void) { //: random comment //= this_is_an_id @@ -210,18 +210,18 @@ class TestingTake17 : QObject { //: again an extra comment, this time for id-based NOOP //% "This is supposed\tto be quoted \" newline\n" //% "backslashed \\ stuff." -QT_TRID_NOOP("this_a_id"); +const char *c_4 = QT_TRID_NOOP("this_a_id"); //~ some thing //% "This needs to be here. Really." -QString test = qtTrId("this_another_id", n); +QString test = qtTrId("this_another_id", 2); class YetAnotherTest : QObject { Q_OBJECT - int function(void) + void function(void) { // //: @@ -238,14 +238,14 @@ class YetAnotherTest : QObject { //: This is a message without a source string -QString test = qtTrId("yet_another_id"); +QString test1 = qtTrId("yet_another_id"); // QTBUG-9276: context in static initializers class Bogus : QObject { Q_OBJECT - + static const char * const s_stringss[]; static const char * const s_strings[]; }; @@ -253,14 +253,14 @@ const char * const Bogus::s_strings[] = { QT_TR_NOOP("this should be in Bogus") }; -const char * const Bogus::s_strings[SIZE] = { +const char * const Bogus::s_stringss[] = { QT_TR_NOOP("this should be in Bogus") }; void bogosity() { // no spaces here. test collateral damage from ignoring equal sign - Class::member=QObject::tr("just QObject"); + QString toto=QObject::tr("just QObject"); } @@ -297,13 +297,13 @@ class LotsaFun : public QObject { Q_OBJECT public: - int operator<<(int left, int right); + LotsaFun *operator<<(int i); }; -int LotsaFun::operator<<(int left, int right) +LotsaFun *LotsaFun::operator<<(int i) { tr("this is inside operator<<"); - return left << right; + return this; } @@ -343,7 +343,7 @@ void blubb() // QTBUG-9276 part 2: QT_TR_NOOP in static member initializers -class TestClass +class TestClass2 { Q_DECLARE_TR_FUNCTIONS(TestClass); @@ -351,26 +351,26 @@ public: static const char TEST_STRING[]; }; -const char TestClass::TEST_STRING[] = QT_TR_NOOP("Test value"); +const char TestClass2::TEST_STRING[] = QT_TR_NOOP("Test value"); // derivation from namespaced class -class Class42 : public NameSchpase::YetMoreFun, Gui::BaseClass +class Class42 : public NameSchpace::YetMoreFun, Gui::BaseClass { Q_OBJECT - + void foo(); Class42() : - NameSchpase::YetMoreFun(), + NameSchpace::YetMoreFun(), Gui::BaseClass() { tr("does that make sense?"); } + void hello(int something, QString str); }; -Class42::Class42() : - NameSchpase::YetMoreFun(), - Gui::BaseClass() + +void Class42::foo() { tr("and does that?"); } @@ -378,7 +378,7 @@ Class42::Class42() : // QTBUG-11866: magic comment parsing is too greedy -Class42::hello(int something /*= 17 */, QString str = Class42::tr("eyo")) +void Class42::hello(int something /*= 17 */, QString str = Class42::tr("eyo")) { } @@ -393,7 +393,7 @@ Class42::hello(int something /*= 17 */, QString str = Class42::tr("eyo")) // failure to update index on insertion messes up subsequent de-duplication -int dupeFail() +void dupeFail() { // First just the Id. qtTrId("dupe_id"); @@ -450,13 +450,13 @@ class Abc::NamespacedFinalClass final : public QObject void ternary() { const auto aaa = - obj.condition ? + true ? //: comment, aaa, true QObject::tr("ternary, true, aaa") : QObject::tr("ternary, failure, aaa"); const auto bbb = - obj.condition ? + true ? //: comment, bbb, true QObject::tr("ternary, bbb, true") : //: comment, bbb, false @@ -470,13 +470,13 @@ class TernaryClass : public QObject void f() { const auto ccc = - obj.condition ? + true ? //: comment, ccc, true tr("ternary, ccc, true") : tr("ternary, ccc, false"); const auto ddd = - obj.condition ? + true ? //: comment, ddd, true tr("ternary, ddd, true") : //: comment, ddd, false @@ -490,7 +490,7 @@ class TernaryClass : public QObject void nullptrInPlural() { QObject::tr("%n nullptr(s)", nullptr, 3); - QCoreApplication::translate("Plurals, nullptr", "%n car(s)", nullptr, QCoreApplication::UnicodeUTF8, 1); + QCoreApplication::translate("Plurals, nullptr", "%n car(s)", nullptr, 1); } class nullptrClass : public QObject @@ -516,12 +516,12 @@ void nullMacroInPlural() // 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 +class ListInitializationClass : public NameSchpace::YetMoreFun, Gui::BaseClass { Q_OBJECT ListInitializationClass() : - NameSchpase::YetMoreFun(), + NameSchpace::YetMoreFun(), Gui::BaseClass{ }, a{ 0 }, b(1), @@ -539,14 +539,14 @@ class ListInitializationClass : public NameSchpase::YetMoreFun, Gui::BaseClass QString c; }; -ListInitializationClass::ListInitializationClass(int a) : - b{ { 2, 3 }[a] } +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{ }, + NameSchpace::YetMoreFun{ }, Gui::BaseClass(), a{ 2 + (a/3) }, b(b), @@ -564,8 +564,8 @@ class LambdaMemberClass : public Gui::BaseClass LambdaMemberClass() : Gui::BaseClass(), - a{ [](){ std::cout << QObject::tr("Hello"); } }, - b([](){ std::cout << "World\n"; }) + a{ [](){ /*std::cout << */QObject::tr("Hello"); } }, + b([](){ /*std::cout << "World\n";*/ }) { tr("LambdaMemberClass in-class constructor"); } @@ -578,8 +578,8 @@ class LambdaMemberClass : public Gui::BaseClass LambdaMemberClass::LambdaMemberClass(void *) : Gui::BaseClass{ }, - a([](){ std::cout << QObject::tr("Hallo "); }), - b{ [](){ std::cout << "Welt\n"; } } + a([](){ /*std::cout <<*/ QObject::tr("Hallo "); }), + b{ [](){ /*std::cout << "Welt\n";*/ } } { tr("LambdaMemberClass out-of-class constructor"); } @@ -641,19 +641,19 @@ class TranslatedAfterPrivate }; #include<QObject> - -QObject::tr("message after system include without space"); - +class AClass { + QString aa = QObject::tr("message after system include without space"); +}; #include"qobject.h" - -QObject::tr("message after local include without space"); - +class AAClass { + QString aa = QObject::tr("message after local include without space"); +}; // QTBUG-35164: handling of \uNNNN escapes QString unicodeEscape() { - return QApplication::tr("Context", "soft\u00ADhyphen"); + return QCoreApplication::tr("Context", "soft\u00ADhyphen"); } @@ -679,12 +679,12 @@ static const char * const test_string_n1[] = { QT_TRANSLATE_N_NOOP("scope", "string %n") }; -static const char * const test_string_n2[] = { - QT_TRANSLATE_N_NOOP3("scope", "string %n", "comment"); -}; -class testing { - Q_OBJECT - static const char * const test_string_n3[] = { - QT_TR_N_NOOP("%n test"); +static const char * const test_string_n2[] = + QT_TRANSLATE_N_NOOP3("scope", "string %n", "comment") +; +class testing { Q_OBJECT + void test(); }; +void testing::test() { static const char * const test_string_n3[] = { + QT_TR_N_NOOP("%n test") }; -}; +} diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/notincluded.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp/notincluded.cpp index 3cdbb3524..2e1fe3105 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/notincluded.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/notincluded.cpp @@ -25,5 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - -QObject::tr("message from not #included .cpp file"); +#include <QtCore> +class MyClass{ + QString toto = QObject::tr("message from #included .cpp file"); +}; 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 7c500f6a3..631d5cefd 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result @@ -296,21 +296,6 @@ backslashed \ stuff.</source> </message> </context> <context> - <name>QApplication</name> - <message> - <location filename="main.cpp" line="38"/> - <source>QT_LAYOUT_DIRECTION</source> - <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="main.cpp" line="656"/> - <source>Context</source> - <comment>softhyphen</comment> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>QCoreApplication</name> <message> <location filename="finddialog.cpp" line="159"/> @@ -338,6 +323,18 @@ backslashed \ stuff.</source> <source>encoding, using QApplication</source> <translation type="unfinished"></translation> </message> + <message> + <location filename="main.cpp" line="38"/> + <source>QT_LAYOUT_DIRECTION</source> + <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="656"/> + <source>Context</source> + <comment>softhyphen</comment> + <translation type="unfinished"></translation> + </message> </context> <context> <name>QObject</name> @@ -411,20 +408,18 @@ backslashed \ stuff.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="included.cpp" line="29"/> + <location filename="included.cpp" line="30"/> <source>message from #included .cpp file</source> <translation type="unfinished"></translation> </message> </context> <context> <name>QTranslator</name> - <message numerus="yes"> + <message> <location filename="finddialog.cpp" line="168"/> <source>Key</source> <comment>disambiguation</comment> - <translation type="unfinished"> - <numerusform></numerusform> - </translation> + <translation type="unfinished"></translation> </message> <message> <location filename="main.cpp" line="80"/> diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp2/main.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp2/main.cpp index dec5232fc..efaac791f 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp2/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp2/main.cpp @@ -50,7 +50,7 @@ line c++ comment } (with brace) #define This is another // comment in } define \ something } comment } // complain here - +#include <QtCore> // Nested class in same file @@ -64,7 +64,7 @@ class TopLevel::Nested { void foo(); }; -TopLevel::Nested::foo() +void TopLevel::Nested::foo() { TopLevel::tr("TopLevel"); } @@ -76,7 +76,7 @@ class TopLevel2::Nested { void foo(); }; -TopLevel2::Nested::foo() +void TopLevel2::Nested::foo() { TopLevel2::tr("TopLevel2"); } @@ -99,26 +99,26 @@ void ToBeUsed::caller() { tr("NameSpace::ToBeUsed"); } +#include <QtWidgets/QApplication> - - +bool me = false; // QTBUG-11818 //% "Foo" -QObject::tr("Hello World"); -QObject::tr("Hello World"); +QString s1 = QObject::tr("Hello World"); +QString s2 = QObject::tr("Hello World"); //% "Bar" -QApplication::translate("QObject", "Hello World"); -QApplication::translate("QObject", "Hello World"); +QString s3 = QApplication::translate("QObject", "Hello World"); +QString s4 = QApplication::translate("QObject", "Hello World"); //% "Baz" -clear = me; -QObject::tr("Hello World"); +bool clear = me; +QString s5 = QObject::tr("Hello World"); // QTBUG-11843: complain about missing source in id-based messages -qtTrId("no_source"); +QString s6 = qtTrId("no_source"); -QObject::tr(R"(simple one)" R"delim(enter +QString s7 = QObject::tr(R"(simple one)" R"delim(enter )delim" R"delim(with delimiter )delim inside)delim" u8R"(with quote " inside)"); QLatin1String not_translated(R"( @@ -136,6 +136,6 @@ And whether pigs have wings." const QString nodelimiter(QObject::tr(R"( This is a test string )")); -const Qstring withdelimiter = QObject::tr(R"delim( +const QString withdelimiter = QObject::tr(R"delim( This is a test string )delim"); diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp2/main.h b/tests/auto/linguist/lupdate/testdata/good/parsecpp2/main.h index 23aa03ab1..2caa9f1df 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp2/main.h +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp2/main.h @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtCore> class TopLevel2 { Q_OBJECT diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/expectedoutput.txt b/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/expectedoutput.txt new file mode 100644 index 000000000..5546bccc7 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/expectedoutput.txt @@ -0,0 +1,3 @@ +.*[/\\]lupdate[/\\]testdata[/\\]good[/\\]parsecpp2_clang_parser[/\\]main.cpp:107:0: //% cannot be used with tr\(\) / QT_TR_NOOP\(\)\. Ignoring +.*[/\\]lupdate[/\\]testdata[/\\]good[/\\]parsecpp2_clang_parser[/\\]main.cpp:110:0: //% cannot be used with translate\(\) / QT_TRANSLATE_NOOP\(\)\. Ignoring +lupdate warning: Message with id 'no_source' has no source\. diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/main.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/main.cpp new file mode 100644 index 000000000..53c7a1404 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/main.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// IMPORTANT!!!! If you want to add testdata to this file, +// always add it to the end in order to not change the linenumbers of translations!!! + +// nothing here + +// sickness: multi-\ +line c++ comment } (with brace) + +//#define This is a closing brace } which was ignored +//} // complain here + +//#define This is another \ +// closing brace } which was ignored +//} // complain here + +//#define This is another /* comment in } define */\ +// something /* comment ) +// spanning {multiple} lines */ \ +// closing brace } which was ignored +//} // complain here + +//#define This is another // comment in } define \ +// something } comment +//} // complain here +#include <QtCore> + + +// Nested class in same file +class TopLevel { + Q_OBJECT + + class Nested; +}; + +class TopLevel::Nested { + void foo(); +}; + +void TopLevel::Nested::foo() +{ + TopLevel::tr("TopLevel"); +} + +// Nested class in other file +#include "main.h" + +class TopLevel2::Nested { + void foo(); +}; + +void TopLevel2::Nested::foo() +{ + TopLevel2::tr("TopLevel2"); +} + + + +namespace NameSpace { +class ToBeUsed; +} + +// using statement before class definition +using NameSpace::ToBeUsed; + +class NameSpace::ToBeUsed { + Q_OBJECT + void caller(); +}; + +void ToBeUsed::caller() +{ + tr("NameSpace::ToBeUsed"); +} +#include <QtWidgets/QApplication> + +bool me = false; +// QTBUG-11818 +//% "Foo" +QString s1 = QObject::tr("Hello World"); +QString s2 = QObject::tr("Hello World"); +//% "Bar" +QString s3 = QApplication::translate("QObject", "Hello World"); +QString s4 = QApplication::translate("QObject", "Hello World"); +//% "Baz" +bool clear = me; +QString s5 = QObject::tr("Hello World"); + + + +// QTBUG-11843: complain about missing source in id-based messages +QString s6 = qtTrId("no_source"); + +QString s7 = QObject::tr(R"(simple one)" R"delim(enter +)delim" R"delim(with delimiter )delim inside)delim" u8R"(with quote " inside)"); + +QLatin1String not_translated(R"( + This is a test string +)"); +const char valid[] = QT_TRANSLATE_NOOP("global", R"( +"The time has come," the Walrus said, +"To talk of many things: +Of shoes - and ships - and sealing-wax - +Of cabbages - and kings - +And why the sea is boiling hot - +And whether pigs have wings." +)"); + +const QString nodelimiter(QObject::tr(R"( + This is a test string +)")); +const QString withdelimiter = QObject::tr(R"delim( +This is a test string +)delim"); diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/main.h b/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/main.h new file mode 100644 index 000000000..a6981a440 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/main.h @@ -0,0 +1,36 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// IMPORTANT!!!! If you want to add testdata to this file, +// always add it to the end in order to not change the linenumbers of translations!!! +#include <QtCore> +class TopLevel2 { + Q_OBJECT + + class Nested; +}; diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/project.pro b/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/project.pro new file mode 100644 index 000000000..759bea068 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/project.pro @@ -0,0 +1,3 @@ +SOURCES = main.cpp + +TRANSLATIONS = project.ts diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/project.ts.result new file mode 100644 index 000000000..0710915de --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp2_clang_parser/project.ts.result @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1"> +<context> + <name></name> + <message id="no_source"> + <location filename="main.cpp" line="119"/> + <source></source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>NameSpace::ToBeUsed</name> + <message> + <location filename="main.cpp" line="100"/> + <source>NameSpace::ToBeUsed</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="main.cpp" line="107"/> + <location filename="main.cpp" line="108"/> + <location filename="main.cpp" line="110"/> + <location filename="main.cpp" line="111"/> + <location filename="main.cpp" line="114"/> + <source>Hello World</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="121"/> + <source>simple oneenter +with delimiter )delim insidewith quote " inside</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="136"/> + <source> + This is a test string +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="139"/> + <source> +This is a test string +</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopLevel</name> + <message> + <location filename="main.cpp" line="69"/> + <source>TopLevel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopLevel2</name> + <message> + <location filename="main.cpp" line="81"/> + <source>TopLevel2</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>global</name> + <message> + <location filename="main.cpp" line="127"/> + <source> +"The time has come," the Walrus said, +"To talk of many things: +Of shoes - and ships - and sealing-wax - +Of cabbages - and kings - +And why the sea is boiling hot - +And whether pigs have wings." +</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/expectedoutput.txt b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/expectedoutput.txt new file mode 100644 index 000000000..65c6b1fec --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/expectedoutput.txt @@ -0,0 +1,2 @@ +.*[/\\]lupdate[/\\]testdata[/\\]good[/\\]parsecpp_clang_parser[/\\]main.cpp:406:0: 'translate' cannot be called without context or source. The call is ignored. +lupdate warning: Message with id 'yet_another_id' has no source. diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/finddialog.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/finddialog.cpp new file mode 100644 index 000000000..d58f9c235 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/finddialog.cpp @@ -0,0 +1,169 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the autotests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +//#include "finddialog.h" nothing is picked up from there +//#include "mainwindow.h" +//#include "tabbedbrowser.h" +//#include "helpwindow.h" +#include <QtCore> +#include <QtWidgets/QTextBrowser> +#include <QTextCursor> +#include <QtWidgets/QStatusBar> +#include <QtWidgets/QLineEdit> +#include <QDateTime> +#include <QtWidgets/QGridLayout> +#include <QtWidgets/QMainWindow> +class FindDialog +{ Q_OBJECT + FindDialog(QMainWindow *parent); + void findButtonClicked(); + void doFind(bool forward); + void statusMessage(const QString &message); + //QMainWindow *mainWindow() const; + void reset(); + + +}; + + +FindDialog::FindDialog(QMainWindow *parent) +{ + //auto contentsWidget = new QWidget(this); + //ui.setupUi(contentsWidget); + //ui.comboFind->setModel(new CaseSensitiveModel(0, 1, ui.comboFind)); + + //QVBoxLayout *l = new QVBoxLayout(this); + //l->setContentsMargins(QMargins()); + //l->setSpacing(0); + //l->addWidget(contentsWidget); + + auto lastBrowser = 0; + auto onceFound = false; + //findExpr.clear(); + + auto sb = new QStatusBar; + //l->addWidget(sb); + + sb->showMessage(tr("Enter the text you are looking for.")); + + //connect(ui.findButton, SIGNAL(clicked()), this, SLOT(findButtonClicked())); + //connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(reject())); +} + +//FindDialog::~FindDialog() +//{ +//} + +//void FindDialog::findButtonClicked() +//{ +// doFind(ui.radioForward->isChecked()); +//} + +void FindDialog::doFind(bool forward) +{ + //QTextBrowser *browser = static_cast<QTextBrowser*>(mainWindow()->browsers()->currentBrowser()); + //sb->clearMessage(); + + //if (ui.comboFind->currentText() != findExpr || lastBrowser != browser) + // onceFound = false; + //findExpr = ui.comboFind->currentText(); + bool onceFound = false; + //QTextDocument::FindFlags flags = 0; + /* + if (ui.checkCase->isChecked()) + flags |= QTextDocument::FindCaseSensitively; + + if (ui.checkWords->isChecked()) + flags |= QTextDocument::FindWholeWords; + + QTextCursor c = browser->textCursor(); + if (!c.hasSelection()) { + if (forward) + c.movePosition(QTextCursor::Start); + else + c.movePosition(QTextCursor::End); + + browser->setTextCursor(c); + } + + QTextDocument::FindFlags options; + if (forward == false) + flags |= QTextDocument::FindBackward; + */ + QTextCursor found;//browser->document()->find(findExpr, c, flags); + if (found.isNull()) { + if (onceFound) { + if (forward) + statusMessage(tr("Search reached end of the document")); + else + statusMessage(tr("Search reached start of the document")); + } else { + statusMessage(tr( "Text not found" )); + } + } else { + //browser->setTextCursor(found); + } + onceFound |= !found.isNull(); + //lastBrowser = browser; +} + +//bool FindDialog::hasFindExpression() const +//{ +// return !findExpr.isEmpty(); +//} + +void FindDialog::statusMessage(const QString &message) +{ /* + if (isVisible()) + sb->showMessage(message); + else + static_cast<MainWindow*>(parent())->statusBar()->showMessage(message, 2000); */ +} + +//QMainWindow *FindDialog::mainWindow() const +//{ +// return static_cast<MainWindow*>(parentWidget()); +//} + +void FindDialog::reset() +{ + //ui.comboFind->setFocus(); + //ui.comboFind->lineEdit()->setSelection( + // 0, ui.comboFind->lineEdit()->text().length()); + + QString s = QCoreApplication::translate("QCoreApplication", "with comment", "comment"); + QString s1 = QCoreApplication::translate("QCoreApplication", "empty comment", ""); + QString s2 = QCoreApplication::translate("QCoreApplication", "null comment", 0); + QString s3 = tr("null comment"); + + QString s4 = QCoreApplication::translate("QCoreApplication", "encoding, using QCoreApplication", 0); + QString s5 = QCoreApplication::translate("QCoreApplication", "encoding, using QApplication", 0); + + QString s6 = QCoreApplication::translate("Kåntekst", "encoding, using QApplication", 0); + QString s7 = QCoreApplication::translate("QTranslator", "Key", "disambiguation"); +} diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/included.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/included.cpp new file mode 100644 index 000000000..88b820ae7 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/included.cpp @@ -0,0 +1,31 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QtCore> +class MyClass2{ + QString toto = QObject::tr("message from #included .cpp file"); +}; diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/main.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/main.cpp new file mode 100644 index 000000000..df015bd22 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/main.cpp @@ -0,0 +1,690 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// IMPORTANT!!!! If you want to add testdata to this file, +// always add it to the end in order to not change the linenumbers of translations!!! +int main(int argc, char **argv) +{ + //Size size = QSize(1,1); +} +#include <QtCore> +QString qt_detectRTLLanguage() +{ + return QCoreApplication::tr("QT_LAYOUT_DIRECTION", + "Translate this string to the string 'LTR' in left-to-right" + " languages or to 'RTL' in right-to-left languages (such as Hebrew" + " and Arabic) to get proper widget layout.");// == QLatin1String("RTL"); +} + + +class Dialog2 +{ + Q_OBJECT + void func(); + void func3(); + int getCount() const { return 2; } + +}; + +void Dialog2::func() +{ + int n = getCount(); + tr("%n files", "plural form", n); + tr("%n cars", 0, n); + tr("&Find %n cars", 0, n); + tr("Search in %n items?", 0, n); + tr("%1. Search in %n items?", 0, n); + tr("Age: %1"); + tr("There are %n house(s)", "Plurals and function call", getCount()); + + + + + QCoreApplication::translate("Plurals, QCoreApplication", "%n house(s)", "Plurals and identifier", n); + QCoreApplication::translate("Plurals, QCoreApplication", "%n car(s)", "Plurals and literal number", 1); + QCoreApplication::translate("Plurals, QCoreApplication", "%n horse(s)", "Plurals and function call", getCount()); + + + + + + + + + QTranslator trans; + trans.translate("QTranslator", "Simple"); + trans.translate("QTranslator", "Simple", 0); + trans.translate("QTranslator", "Simple with comment", "with comment"); + trans.translate("QTranslator", "Plural without comment", 0, 1); + trans.translate("QTranslator", "Plural with comment", "comment 1", n); + trans.translate("QTranslator", "Plural with comment", "comment 2", getCount()); + + + + + + + + + + + + +} + + + + +/* This is actually a test of how many alternative ways a struct/class can be found in a source file. + * Due to the simple parser in lupdate, it will actually not treat the remaining lines in the define + * as a macro, which is a case the 'Tok_Class' parser block might not consider, and it might loop infinite + * if it just tries to fetch the next token until it gets a '{' or a ';'. Another pitfall is that the + * context of tr("func3") might not be parsed, it won't resume normal evaluation until the '{' after the function + * signature. + * + */ +typedef struct S_ +{ +int a; +} S, *SPtr; +class ForwardDecl; + + +#define FT_DEFINE_SERVICE( name ) \ + typedef struct FT_Service_ ## name ## Rec_ \ + FT_Service_ ## name ## Rec ; \ + typedef struct FT_Service_ ## name ## Rec_ \ + const * FT_Service_ ## name ; \ + struct FT_Service_ ## name ## Rec_ + + + + +void Dialog2::func3() +{ + tr("func3"); +} + + + + +namespace Gui { class BaseClass {}; } + + +class TestClass : QObject { + Q_OBJECT + + + inline QString inlineFunc1() { + return tr("inline function", "TestClass"); + } + + QString inlineFunc2() { + return tr("inline function 2", "TestClass"); + } + + static inline QString staticInlineFunc() { + return tr("static inline function", "TestClass"); + } + + class NoQObject : public Gui::BaseClass { + public: + inline QString hello() { return QString("hello"); } + + }; + +}; + + +class Testing : QObject { + Q_OBJECT + + inline QString f1() { + //: this is an extra comment for the translator + return tr("extra-commented string"); + return tr("not extra-commented string"); + /*: another extra-comment */ + return tr("another extra-commented string"); + /*: blah! */ + return QCoreApplication::translate("scope", "works in translate, too", "blabb", 0); + } + +}; + +//: extra comment for NOOP +//: which spans multiple lines +const char *c_1 = QT_TRANSLATE_NOOP("scope", "string") /*: complain & ignore */; // 4.4 says the line of this is at the next statement +//: extra comment for NOOP3 +const char *c_2[2] = QT_TRANSLATE_NOOP3_UTF8("scope", "string", "comment"); // 4.4 doesn't see this + +const char *c_3 = QT_TRANSLATE_NOOP("scope", "string " // this is an interleaved comment + "continuation on next line"); + + +class TestingTake17 : QObject { + Q_OBJECT + + void function(void) + { + //: random comment + //= this_is_an_id + //~ loc-layout_id fooish_bar + //~ po-ignore_me totally foo-barred nonsense + tr("something cool"); + + tr("less cool"); + + //= another_id + tr("even more cool"); + } +}; + + + + +//: again an extra comment, this time for id-based NOOP +//% "This is supposed\tto be quoted \" newline\n" +//% "backslashed \\ stuff." +const char *c_4 = QT_TRID_NOOP("this_a_id"); + +//~ some thing +//% "This needs to be here. Really." +QString test = qtTrId("this_another_id", 2); + + + +class YetAnotherTest : QObject { + Q_OBJECT + + void function(void) + { + // + //: + //= + //~ + //# + //============= + //~~~~~~~~~~~~~ + //::::::::::::: + tr("nothing"); + } +}; + + + +//: This is a message without a source string +QString test1 = qtTrId("yet_another_id"); + + + +// QTBUG-9276: context in static initializers +class Bogus : QObject { + Q_OBJECT + static const char * const s_stringss[]; + static const char * const s_strings[]; + +}; +const char * const Bogus::s_strings[] = { + QT_TR_NOOP("this should be in Bogus") +}; + +const char * const Bogus::s_stringss[] = { + QT_TR_NOOP("this should be in Bogus") +}; + +void bogosity() +{ + // no spaces here. test collateral damage from ignoring equal sign + QString toto=QObject::tr("just QObject"); +} + + + +namespace Internal { + +class Message : public QObject +{ + Q_OBJECT +public: + Message(QObject *parent = 0); +}; + +} // The temporary closing of the namespace triggers the problem + +namespace Internal { + +static inline QString message1() +{ + return Message::tr("message1"); // Had no namespace +} + +static inline QString message2() +{ + return Message::tr("message2"); // Already had namespace +} + +} + + + +// QTBUG-11426: operator overloads +class LotsaFun : public QObject +{ + Q_OBJECT +public: + LotsaFun *operator<<(int i); +}; + +LotsaFun *LotsaFun::operator<<(int i) +{ + tr("this is inside operator<<"); + return this; +} + + + +// QTBUG-12683: define in re-opened namespace +namespace NameSchpace { + +class YetMoreFun : public QObject +{ + Q_OBJECT +public: + void funStuff(); +}; + +} + +namespace NameSchpace { + +#define somevar 1 + +void YetMoreFun::funStuff() +{ + tr("funStuff!"); +} + +} + + + +// QTBUG-29998: tr() macro inside square brackets +void blubb() +{ + QMap<QString, QString> d; + d[LotsaFun::tr("bracketed")] = "plain"; +} + + + +// QTBUG-9276 part 2: QT_TR_NOOP in static member initializers +class TestClass2 +{ + Q_DECLARE_TR_FUNCTIONS(TestClass); + +public: + static const char TEST_STRING[]; +}; + +const char TestClass2::TEST_STRING[] = QT_TR_NOOP("Test value"); + + + +// derivation from namespaced class +class Class42 : public NameSchpace::YetMoreFun, Gui::BaseClass +{ + Q_OBJECT + void foo(); + Class42() : + NameSchpace::YetMoreFun(), + Gui::BaseClass() + { + tr("does that make sense?"); + } + void hello(int something, QString str); +}; + + +void Class42::foo() +{ + tr("and does that?"); +} + + + +// QTBUG-11866: magic comment parsing is too greedy +void Class42::hello(int something /*= 17 */, QString str = Class42::tr("eyo")) +{ +} + + + +// QTBUG-27974: strings from included sources are not collected +#include "included.cpp" + +// test TR_EXCLUDE +#include "notincluded.cpp" + + + +// failure to update index on insertion messes up subsequent de-duplication +void dupeFail() +{ + // First just the Id. + qtTrId("dupe_id"); + + // Then with source + //% "This is the source" + qtTrId("dupe_id"); + + // Finally, same source, but without ID. + QCoreApplication::translate("", "This is the source"); +} + + + +// QTBUG-42735: lupdate confused by `final` specifier (C++11) +namespace Abc { + +class NamespacedFinalClass; + +} + +class FinalClass final : public QObject +{ + Q_OBJECT + + class SubClass final + { + void f() + { + tr("nested class context with final"); + } + }; + + void f() + { + tr("class context with final"); + } +}; + +class Abc::NamespacedFinalClass final : public QObject +{ + Q_OBJECT + + void f() + { + tr("namespaced class with final"); + } +}; + + + +// QTBUG-48776: lupdate fails to recognize translator comment in ternary +// operator construct +void ternary() +{ + const auto aaa = + true ? + //: comment, aaa, true + QObject::tr("ternary, true, aaa") : + QObject::tr("ternary, failure, aaa"); + + const auto bbb = + true ? + //: comment, bbb, true + QObject::tr("ternary, bbb, true") : + //: comment, bbb, false + QObject::tr("ternary, bbb, false"); +} + +class TernaryClass : public QObject +{ + Q_OBJECT + + void f() + { + const auto ccc = + true ? + //: comment, ccc, true + tr("ternary, ccc, true") : + tr("ternary, ccc, false"); + + const auto ddd = + true ? + //: comment, ddd, true + tr("ternary, ddd, true") : + //: comment, ddd, false + tr("ternary, ddd, false"); + } +}; + + + +// QTBUG-47467: lupdate confused by nullptr in case of plural forms +void nullptrInPlural() +{ + QObject::tr("%n nullptr(s)", nullptr, 3); + QCoreApplication::translate("Plurals, nullptr", "%n car(s)", nullptr, 1); +} + +class nullptrClass : public QObject +{ + Q_OBJECT + + void f() + { + tr("%n car(s)", nullptr, 2); + } +}; + + + +// QTBUG-34265: lupdate does not detect NULL and Q_NULLPTR as 0 when being passed as context +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 NameSchpace::YetMoreFun, Gui::BaseClass +{ + Q_OBJECT + + ListInitializationClass() : + NameSchpace::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) : + NameSchpace::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"); +} + + + +// Related to QTBUG-53644, adapted from qglobal.h. +// Namespace Private must be parsed correctly for TranslatedAfterPrivate to work. +namespace Private { + template <class T> struct Class1 { T t; }; + template <class T> struct Class1<T &> : Class1<T> {}; + template <class T> struct Class2 { enum { Value = sizeof(T) }; }; +} // namespace Private +class TranslatedAfterPrivate +{ + Q_OBJECT + TranslatedAfterPrivate() + { + tr("Must be in context TranslatedAfterPrivate"); + } +}; + +#include<QObject> +class AClass { + QString aa = QObject::tr("message after system include without space"); +}; +#include"qobject.h" +class AAClass { + QString aa = QObject::tr("message after local include without space"); +}; + + +// QTBUG-35164: handling of \uNNNN escapes +QString unicodeEscape() +{ + return QCoreApplication::tr("Context", "soft\u00ADhyphen"); +} + + + +// QTBUG-63364: C++17 nested namespaces +namespace Outer::Inner { + +class Class +{ + Q_OBJECT + void function() + { + tr("MoreFunStuff!"); + } +}; + +} + + + +// test of translation for _N_ family +static const char * const test_string_n1[] = { + QT_TRANSLATE_N_NOOP("scope", "string %n") +}; + +static const char * const test_string_n2[] = + QT_TRANSLATE_N_NOOP3("scope", "string %n", "comment") +; +class testing { Q_OBJECT + void test(); }; +void testing::test() { static const char * const test_string_n3[] = { + QT_TR_N_NOOP("%n test") + }; +} diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/my_include.h b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/my_include.h new file mode 100644 index 000000000..1c609d1e3 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/my_include.h @@ -0,0 +1,6 @@ +#include <QtCore> + +class Foo +{ + Q_OBJECT +}; diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/notincluded.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/notincluded.cpp new file mode 100644 index 000000000..2e1fe3105 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/notincluded.cpp @@ -0,0 +1,31 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QtCore> +class MyClass{ + QString toto = QObject::tr("message from #included .cpp file"); +}; diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/project.pro b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/project.pro new file mode 100644 index 000000000..0fd8a9627 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/project.pro @@ -0,0 +1,7 @@ +SOURCES += main.cpp +SOURCES += finddialog.cpp +SOURCES += excluded.cpp + +TR_EXCLUDE = $$PWD/excluded.* $$PWD/notincluded.cpp + +TRANSLATIONS = project.ts diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/project.ts.result new file mode 100644 index 000000000..9e823755f --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp_clang_parser/project.ts.result @@ -0,0 +1,661 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1"> +<context> + <name></name> + <message id="this_a_id"> + <location filename="main.cpp" line="213"/> + <source>This is supposed to be quoted " newline +backslashed \ stuff.</source> + <extracomment>again an extra comment, this time for id-based NOOP</extracomment> + <translation type="unfinished"></translation> + </message> + <message id="this_another_id" numerus="yes"> + <location filename="main.cpp" line="217"/> + <source>This needs to be here. Really.</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + <extra-some>thing</extra-some> + </message> + <message id="yet_another_id"> + <location filename="main.cpp" line="241"/> + <source></source> + <extracomment>This is a message without a source string</extracomment> + <translation type="unfinished"></translation> + </message> + <message id="dupe_id"> + <location filename="main.cpp" line="399"/> + <location filename="main.cpp" line="403"/> + <source>This is the source</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Abc::NamespacedFinalClass</name> + <message> + <location filename="main.cpp" line="442"/> + <source>namespaced class with final</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Bogus</name> + <message> + <location filename="main.cpp" line="253"/> + <location filename="main.cpp" line="257"/> + <source>this should be in Bogus</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Class42</name> + <message> + <location filename="main.cpp" line="367"/> + <source>does that make sense?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="375"/> + <source>and does that?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="381"/> + <source>eyo</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Dialog2</name> + <message numerus="yes"> + <location filename="main.cpp" line="57"/> + <source>%n files</source> + <comment>plural form</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="58"/> + <source>%n cars</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="59"/> + <source>&Find %n cars</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="60"/> + <source>Search in %n items?</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="61"/> + <source>%1. Search in %n items?</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message> + <location filename="main.cpp" line="62"/> + <source>Age: %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="63"/> + <source>There are %n house(s)</source> + <comment>Plurals and function call</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message> + <location filename="main.cpp" line="130"/> + <source>func3</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FinalClass</name> + <message> + <location filename="main.cpp" line="426"/> + <source>nested class context with final</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="432"/> + <source>class context with final</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FindDialog</name> + <message> + <location filename="finddialog.cpp" line="72"/> + <source>Enter the text you are looking for.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="finddialog.cpp" line="122"/> + <source>Search reached end of the document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="finddialog.cpp" line="124"/> + <source>Search reached start of the document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="finddialog.cpp" line="126"/> + <source>Text not found</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="finddialog.cpp" line="162"/> + <source>null comment</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Internal::Message</name> + <message> + <location filename="main.cpp" line="283"/> + <source>message1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="288"/> + <source>message2</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Kåntekst</name> + <message> + <location filename="finddialog.cpp" line="167"/> + <source>encoding, using QApplication</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LambdaMemberClass</name> + <message> + <location filename="main.cpp" line="570"/> + <source>LambdaMemberClass in-class constructor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="584"/> + <source>LambdaMemberClass out-of-class constructor</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ListInitializationClass</name> + <message> + <location filename="main.cpp" line="528"/> + <source>Hello World</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="530"/> + <source>ListInitializationClass in-class constructor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="545"/> + <source>ListInitializationClass out-of-class single member initializer</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="553"/> + <source>%n item(s)</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message> + <location filename="main.cpp" line="555"/> + <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="305"/> + <source>this is inside operator<<</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="340"/> + <source>bracketed</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>NameSchpace::YetMoreFun</name> + <message> + <location filename="main.cpp" line="329"/> + <source>funStuff!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Outer::Inner::Class</name> + <message> + <location filename="main.cpp" line="669"/> + <source>MoreFunStuff!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Plurals, QCoreApplication</name> + <message numerus="yes"> + <location filename="main.cpp" line="68"/> + <source>%n house(s)</source> + <comment>Plurals and identifier</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="69"/> + <source>%n car(s)</source> + <comment>Plurals and literal number</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="70"/> + <source>%n horse(s)</source> + <comment>Plurals and function call</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> +</context> +<context> + <name>Plurals, nullptr</name> + <message numerus="yes"> + <location filename="main.cpp" line="493"/> + <source>%n car(s)</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> +</context> +<context> + <name>QCoreApplication</name> + <message> + <location filename="finddialog.cpp" line="159"/> + <source>with comment</source> + <comment>comment</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="finddialog.cpp" line="160"/> + <source>empty comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="finddialog.cpp" line="161"/> + <source>null comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="finddialog.cpp" line="164"/> + <source>encoding, using QCoreApplication</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="finddialog.cpp" line="165"/> + <source>encoding, using QApplication</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="38"/> + <source>QT_LAYOUT_DIRECTION</source> + <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="656"/> + <source>Context</source> + <comment>softhyphen</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="main.cpp" line="263"/> + <source>just QObject</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="455"/> + <source>ternary, true, aaa</source> + <extracomment>comment, aaa, true</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="456"/> + <source>ternary, failure, aaa</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="461"/> + <source>ternary, bbb, true</source> + <extracomment>comment, bbb, true</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="463"/> + <source>ternary, bbb, false</source> + <extracomment>comment, bbb, false</extracomment> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="492"/> + <source>%n nullptr(s)</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="511"/> + <source>%n NULL(s)</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="512"/> + <source>%n Q_NULLPTR(s)</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message> + <location filename="main.cpp" line="567"/> + <source>Hello</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="581"/> + <source>Hallo </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="645"/> + <source>message after system include without space</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="649"/> + <source>message after local include without space</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QTranslator</name> + <message> + <location filename="finddialog.cpp" line="168"/> + <source>Key</source> + <comment>disambiguation</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="80"/> + <location filename="main.cpp" line="81"/> + <source>Simple</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="82"/> + <source>Simple with comment</source> + <comment>with comment</comment> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="83"/> + <source>Plural without comment</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="84"/> + <source>Plural with comment</source> + <comment>comment 1</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="85"/> + <source>Plural with comment</source> + <comment>comment 2</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> +</context> +<context> + <name>TemplateClass</name> + <message> + <location filename="main.cpp" line="599"/> + <source>TemplateClass() in-class member initialization</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="601"/> + <source>TemplateClass() in-class body</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="612"/> + <source>TemplateClass(void *) out-of-class member initialization</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="614"/> + <source>TemplateClass(void *) out-of-class body</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="620"/> + <source>[unsupported] TemplateClass(int) out-of-class member initialization</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="622"/> + <source>[unsupported] TemplateClass(int) out-of-class body</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TernaryClass</name> + <message> + <location filename="main.cpp" line="475"/> + <source>ternary, ccc, true</source> + <extracomment>comment, ccc, true</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="476"/> + <source>ternary, ccc, false</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="481"/> + <source>ternary, ddd, true</source> + <extracomment>comment, ddd, true</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="483"/> + <source>ternary, ddd, false</source> + <extracomment>comment, ddd, false</extracomment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TestClass</name> + <message> + <location filename="main.cpp" line="144"/> + <source>inline function</source> + <comment>TestClass</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="148"/> + <source>inline function 2</source> + <comment>TestClass</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="152"/> + <source>static inline function</source> + <comment>TestClass</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="354"/> + <source>Test value</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Testing</name> + <message> + <location filename="main.cpp" line="169"/> + <source>extra-commented string</source> + <extracomment>this is an extra comment for the translator</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="170"/> + <source>not extra-commented string</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="172"/> + <source>another extra-commented string</source> + <extracomment>another extra-comment</extracomment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TestingTake17</name> + <message id="this_is_an_id"> + <location filename="main.cpp" line="198"/> + <source>something cool</source> + <extracomment>random comment</extracomment> + <translation type="unfinished"></translation> + <extra-loc-layout_id>fooish_bar</extra-loc-layout_id> + <extra-po-ignore_me>totally foo-barred nonsense</extra-po-ignore_me> + </message> + <message> + <location filename="main.cpp" line="200"/> + <source>less cool</source> + <translation type="unfinished"></translation> + </message> + <message id="another_id"> + <location filename="main.cpp" line="203"/> + <source>even more cool</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TranslatedAfterPrivate</name> + <message> + <location filename="main.cpp" line="639"/> + <source>Must be in context TranslatedAfterPrivate</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>YetAnotherTest</name> + <message> + <location filename="main.cpp" line="234"/> + <source>nothing</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>nullptrClass</name> + <message numerus="yes"> + <location filename="main.cpp" line="502"/> + <source>%n car(s)</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> +</context> +<context> + <name>scope</name> + <message numerus="yes"> + <location filename="main.cpp" line="174"/> + <source>works in translate, too</source> + <comment>blabb</comment> + <extracomment>blah!</extracomment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message> + <location filename="main.cpp" line="181"/> + <source>string</source> + <extracomment>extra comment for NOOP which spans multiple lines</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="183"/> + <source>string</source> + <comment>comment</comment> + <extracomment>extra comment for NOOP3</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="185"/> + <source>string continuation on next line</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="679"/> + <source>string %n</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="main.cpp" line="683"/> + <source>string %n</source> + <comment>comment</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> +</context> +<context> + <name>testing</name> + <message numerus="yes"> + <location filename="main.cpp" line="688"/> + <source>%n test</source> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> +</context> +</TS> diff --git a/tests/auto/linguist/lupdate/testdata/good/parseqrc/main.cpp b/tests/auto/linguist/lupdate/testdata/good/parseqrc/main.cpp index a7052dada..bfd5cf774 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parseqrc/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/parseqrc/main.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello world"); diff --git a/tests/auto/linguist/lupdate/testdata/good/prefix/main.cpp b/tests/auto/linguist/lupdate/testdata/good/prefix/main.cpp index 6cef7a28c..dcb3d1a69 100644 --- a/tests/auto/linguist/lupdate/testdata/good/prefix/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/prefix/main.cpp @@ -25,11 +25,11 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "main.h" QString foo() { - QCoreApplication::translate("Foo","XXX","YYY"); + return QCoreApplication::translate("Foo","XXX","YYY"); } Foo::Foo() @@ -50,7 +50,7 @@ class BitFields : public QObject Bibi::Bibi() { - int bits : 32; + //int bits : 32; tr("text Bibi"); Babebi::tr("text Babebi"); } diff --git a/tests/auto/linguist/lupdate/testdata/good/prefix/main.h b/tests/auto/linguist/lupdate/testdata/good/prefix/main.h new file mode 100644 index 000000000..52848b043 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/prefix/main.h @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QtCore> + +class Foo +{ + Q_OBJECT + Foo(); + void bar(); +}; + +class Bibi +{ + Q_OBJECT + Bibi(); + +}; + +class Babebi +{ +Q_OBJECT +}; + diff --git a/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/main.cpp b/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/main.cpp new file mode 100644 index 000000000..dcb3d1a69 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/main.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "main.h" + +QString foo() +{ + return QCoreApplication::translate("Foo","XXX","YYY"); +} + +Foo::Foo() +{ + tr("CTOR"); +} + +void Foo::bar() +{ + tr("BAR"); +} + +class BitFields : public QObject +{ + int bits : 20; + QString str = tr("text BitFields"); +}; + +Bibi::Bibi() +{ + //int bits : 32; + tr("text Bibi"); + Babebi::tr("text Babebi"); +} diff --git a/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/main.h b/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/main.h new file mode 100644 index 000000000..52848b043 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/main.h @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QtCore> + +class Foo +{ + Q_OBJECT + Foo(); + void bar(); +}; + +class Bibi +{ + Q_OBJECT + Bibi(); + +}; + +class Babebi +{ +Q_OBJECT +}; + diff --git a/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/project.pro b/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/project.pro new file mode 100644 index 000000000..759bea068 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/project.pro @@ -0,0 +1,3 @@ +SOURCES = main.cpp + +TRANSLATIONS = project.ts diff --git a/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/project.ts.result new file mode 100644 index 000000000..5af02f702 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/prefix_clang_parser/project.ts.result @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1"> +<context> + <name>Babebi</name> + <message> + <location filename="main.cpp" line="55"/> + <source>text Babebi</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Bibi</name> + <message> + <location filename="main.cpp" line="54"/> + <source>text Bibi</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Foo</name> + <message> + <location filename="main.cpp" line="32"/> + <source>XXX</source> + <comment>YYY</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="37"/> + <source>CTOR</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="42"/> + <source>BAR</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="main.cpp" line="48"/> + <source>text BitFields</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/tests/auto/linguist/lupdate/testdata/good/preprocess/main.cpp b/tests/auto/linguist/lupdate/testdata/good/preprocess/main.cpp index 70a100b6f..6bcac29e6 100644 --- a/tests/auto/linguist/lupdate/testdata/good/preprocess/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/preprocess/main.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello world", "Platform-independent file"); diff --git a/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/expectedoutput.txt b/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/expectedoutput.txt new file mode 100644 index 000000000..22bb31a24 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/expectedoutput.txt @@ -0,0 +1 @@ +Code with translation information has been skipped in file .* diff --git a/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/main.cpp b/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/main.cpp new file mode 100644 index 000000000..cfc4c1039 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/main.cpp @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// IMPORTANT!!!! If you want to add testdata to this file, +// always add it to the end in order to not change the linenumbers of translations!!! +#include <QtWidgets/QApplication> + +void func1() { + QApplication::tr("Hello world", "Platform-independent file"); +} + + + + +void func2() { +#ifdef Q_OS_WIN + QApplication::tr("KindType", "The other option has been skipped"); +#else + QApplication::tr("KindType", "The other option has been skipped"); +#endif + +} + + + +void stringconcatenation() +{ + QApplication::tr("One string," + " three" + " lines"); + + QApplication::tr("a backslash followed by newline \ +should be ignored \ +and the next line should be syntactically considered to be \ +on the same line"); + +} diff --git a/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/project.pro b/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/project.pro new file mode 100644 index 000000000..c96859bdb --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/project.pro @@ -0,0 +1,3 @@ +SOURCES += main.cpp + +TRANSLATIONS = project.ts diff --git a/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/project.ts.result new file mode 100644 index 000000000..666dc0ff1 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/preprocess_clang_parser/project.ts.result @@ -0,0 +1,29 @@ +.* +<!DOCTYPE TS> +<TS version="2.1"> +<context> + <name>QApplication</name> + <message> + <location filename="main.cpp" line="34"/> + <source>Hello world</source> + <comment>Platform-independent file</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line=.*/> + <source>KindType</source> + <comment>The other option has been skipped</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="53"/> + <source>One string, three lines</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="main.cpp" line="57"/> + <source>a backslash followed by newline should be ignored and the next line should be syntactically considered to be on the same line</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/a b/tests/auto/linguist/lupdate/testdata/good/proparsing2/a index cc56055fb..786f09cb0 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsing2/a +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/a @@ -25,7 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "include.h" QString func() { return QLineEdit::tr("a"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/a.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsing2/a.cpp index a4b323ecb..ad2aab7f4 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsing2/a.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/a.cpp @@ -25,7 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "include.h" QString func() { return QLineEdit::tr("a.cpp"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/b b/tests/auto/linguist/lupdate/testdata/good/proparsing2/b index 448d7433a..e3d1dade6 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsing2/b +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/b @@ -25,7 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "include.h" QString func() { return QLineEdit::tr("b"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/b.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsing2/b.cpp index 60107a1c8..41af8eee1 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsing2/b.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/b.cpp @@ -25,7 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "include.h" QString func() { return QLineEdit::tr("b.cpp"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/e b/tests/auto/linguist/lupdate/testdata/good/proparsing2/e index c847576d3..3a5ed1c08 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsing2/e +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/e @@ -25,7 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "include.h" QString func() { return QLineEdit::tr("e"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/f/g.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsing2/f/g.cpp index 466fb26b7..c8e776afa 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsing2/f/g.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/f/g.cpp @@ -25,7 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "../include.h" QString func() { return QLineEdit::tr("f/g.cpp"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/include.h b/tests/auto/linguist/lupdate/testdata/good/proparsing2/include.h new file mode 100644 index 000000000..94e95433b --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/include.h @@ -0,0 +1,2 @@ +#include <QtCore> +#include <QtWidgets/QLineEdit> diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/spaces/z b/tests/auto/linguist/lupdate/testdata/good/proparsing2/spaces/z index 68ad77a38..ff35f5197 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsing2/spaces/z +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/spaces/z @@ -25,7 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "../include.h" QString func() { return QLineEdit::tr("spaces/z"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/variable_with_spaces b/tests/auto/linguist/lupdate/testdata/good/proparsing2/variable_with_spaces index e9c2b3a51..7e58fe3de 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsing2/variable_with_spaces +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/variable_with_spaces @@ -25,7 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "include.h" QString func() { return QLineEdit::tr("variable with spaces"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/with b/tests/auto/linguist/lupdate/testdata/good/proparsing2/with index 7ebc8e228..c5cd36018 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsing2/with +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/with @@ -25,7 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "include.h" QString func() { return QLineEdit::tr("with"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/x/d b/tests/auto/linguist/lupdate/testdata/good/proparsing2/x/d index 8e211a902..1efa9eaa8 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsing2/x/d +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/x/d @@ -25,7 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "../include.h" QString func() { return QLineEdit::tr("x/d"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsing2/x/variable b/tests/auto/linguist/lupdate/testdata/good/proparsing2/x/variable index a934e515f..1779b94d6 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsing2/x/variable +++ b/tests/auto/linguist/lupdate/testdata/good/proparsing2/x/variable @@ -25,7 +25,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include "../include.h" QString func() { return QLineEdit::tr("x/variable"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/file1.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/file1.cpp index 589674fc3..3c89c3420 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/file1.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/file1.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello world", "top-level wildcard"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/filter.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/filter.cpp index 4414d75ab..8b8d1d3e3 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/filter.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/filter.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello world", "top-level direct"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/sub/subfile1.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/sub/subfile1.cpp index c2033d4bb..41e5a0602 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/sub/subfile1.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/sub/subfile1.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello world", "nested wildcard"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/sub/subfilter.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/sub/subfilter.cpp index 26172f074..59ca732ce 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/sub/subfilter.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingpaths/sub/subfilter.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello world", "nested direct"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingpri/common/main.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingpri/common/main.cpp index e7400ce28..d5822aa76 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingpri/common/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingpri/common/main.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello world", "Platform-independent file"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingpri/mac/main_mac.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingpri/mac/main_mac.cpp index 7c00a19a7..95dd93ab4 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingpri/mac/main_mac.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingpri/mac/main_mac.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello macworld", "mac-only file"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingpri/relativity/relativity.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingpri/relativity/relativity.cpp index dae68096b..85eefef46 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingpri/relativity/relativity.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingpri/relativity/relativity.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("relativity.pri", "Platform-independent file"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingpri/unix/main_unix.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingpri/unix/main_unix.cpp index 4274c6f72..c5ddbee64 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingpri/unix/main_unix.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingpri/unix/main_unix.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello unixworld", "unix-only file"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingpri/win/main_win.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingpri/win/main_win.cpp index a963f3eeb..fe514ac4e 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingpri/win/main_win.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingpri/win/main_win.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello windowsworld", "Windows-only file"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingsubdirs/sub1/main.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingsubdirs/sub1/main.cpp index e7400ce28..d5822aa76 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingsubdirs/sub1/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingsubdirs/sub1/main.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello world", "Platform-independent file"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/common/main.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/common/main.cpp index e7400ce28..d5822aa76 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/common/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/common/main.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello world", "Platform-independent file"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/excluded/main.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/excluded/main.cpp index 423dce4ef..95f63b256 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/excluded/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/excluded/main.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QString fake = QApplication::tr("fake", "This message will not be collected"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/mac/main_mac.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/mac/main_mac.cpp index 7c00a19a7..95dd93ab4 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/mac/main_mac.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/mac/main_mac.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello macworld", "mac-only file"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/sub/include/test.h b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/sub/include/test.h index f1e58eca4..a49902d57 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/sub/include/test.h +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/sub/include/test.h @@ -29,7 +29,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! -#include <QObject> +#include <QtCore> namespace nm { diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/sub/src/test.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/sub/src/test.cpp index 71af0a205..617c51e3f 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/sub/src/test.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/sub/src/test.cpp @@ -29,7 +29,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! -#include <test.h> +#include "../include/test.h" using namespace nm; diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/unix/main_unix.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/unix/main_unix.cpp index 4274c6f72..c5ddbee64 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/unix/main_unix.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/unix/main_unix.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello unixworld", "unix-only file"); diff --git a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/win/main_win.cpp b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/win/main_win.cpp index a963f3eeb..fe514ac4e 100644 --- a/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/win/main_win.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/proparsingsubs/win/main_win.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello windowsworld", "Windows-only file"); diff --git a/tests/auto/linguist/lupdate/testdata/good/reloutput/main.cpp b/tests/auto/linguist/lupdate/testdata/good/reloutput/main.cpp index 9a3880031..f03f68209 100644 --- a/tests/auto/linguist/lupdate/testdata/good/reloutput/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/reloutput/main.cpp @@ -28,7 +28,7 @@ // IMPORTANT!!!! If you want to add testdata to this file, // always add it to the end in order to not change the linenumbers of translations!!! - +#include <QtWidgets/QApplication> void func1() { QApplication::tr("Hello world"); diff --git a/tests/auto/linguist/lupdate/testdata/good_testing_all_fixed/parseqrc b/tests/auto/linguist/lupdate/testdata/good_testing_all_fixed/parseqrc new file mode 120000 index 000000000..edd835110 --- /dev/null +++ b/tests/auto/linguist/lupdate/testdata/good_testing_all_fixed/parseqrc @@ -0,0 +1 @@ +../good/parseqrc
\ No newline at end of file diff --git a/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir1/main.cpp b/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir1/main.cpp index b06785a80..cd40b434e 100644 --- a/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir1/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir1/main.cpp @@ -25,9 +25,9 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include <QtCore> QString foo() { - QCoreApplication::translate("subdir1","minimal test"); + return QCoreApplication::translate("subdir1","minimal test"); } diff --git a/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir2/subsub1/main.cpp b/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir2/subsub1/main.cpp index 766d615cb..96a6afe5b 100644 --- a/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir2/subsub1/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir2/subsub1/main.cpp @@ -25,9 +25,9 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include <QtCore> QString foo() { - QCoreApplication::translate("subsub1","minimal test"); + return QCoreApplication::translate("subsub1","minimal test"); } diff --git a/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir2/subsub2/main.cpp b/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir2/subsub2/main.cpp index 5617fd1ce..bbf1f8018 100644 --- a/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir2/subsub2/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/subdirs_full/subdir2/subsub2/main.cpp @@ -25,9 +25,9 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include <QtCore> QString foo() { - QCoreApplication::translate("subsub2","minimal test"); + return QCoreApplication::translate("subsub2","minimal test"); } diff --git a/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir1/main.cpp b/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir1/main.cpp index b06785a80..cd40b434e 100644 --- a/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir1/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir1/main.cpp @@ -25,9 +25,9 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include <QtCore> QString foo() { - QCoreApplication::translate("subdir1","minimal test"); + return QCoreApplication::translate("subdir1","minimal test"); } diff --git a/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir2/subsub1/main.cpp b/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir2/subsub1/main.cpp index 766d615cb..96a6afe5b 100644 --- a/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir2/subsub1/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir2/subsub1/main.cpp @@ -25,9 +25,9 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include <QtCore> QString foo() { - QCoreApplication::translate("subsub1","minimal test"); + return QCoreApplication::translate("subsub1","minimal test"); } diff --git a/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir2/subsub2/main.cpp b/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir2/subsub2/main.cpp index 5617fd1ce..bbf1f8018 100644 --- a/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir2/subsub2/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/subdirs_part/subdir2/subsub2/main.cpp @@ -25,9 +25,9 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#include <QtCore> QString foo() { - QCoreApplication::translate("subsub2","minimal test"); + return QCoreApplication::translate("subsub2","minimal test"); } diff --git a/tests/auto/linguist/lupdate/tst_lupdate.cpp b/tests/auto/linguist/lupdate/tst_lupdate.cpp index 2e3b1ff30..10d640482 100644 --- a/tests/auto/linguist/lupdate/tst_lupdate.cpp +++ b/tests/auto/linguist/lupdate/tst_lupdate.cpp @@ -30,12 +30,17 @@ #include "../shared/simtexth.h" #endif -#include <QtCore/QDir> +#include <QtCore/QByteArray> #include <QtCore/QDebug> +#include <QtCore/QDir> #include <QtCore/QFile> -#include <QtCore/QByteArray> +#include <QtCore/private/qconfig_p.h> +#include <QtCore/QSet> #include <QtTest/QtTest> +#include <QtTools/private/qttools-config_p.h> + +#include <iostream> class tst_lupdate : public QObject { @@ -200,8 +205,9 @@ void tst_lupdate::doCompare(QStringList actual, const QString &expectedFn, bool diff += ">>>>>>> expected\n"; for (int j = oam; j < qMin(oam + 3, actual.size()); j++) diff += actual.at(j) + '\n'; - QFAIL(qPrintable((err ? "Output for " : "Result for ") + expectedFn + " does not meet expectations:\n" + diff)); -} + QFAIL(qPrintable((err ? "Output for " : "Result for ") + + expectedFn + " does not meet expectations:\n" + diff)); + } void tst_lupdate::doCompare(const QString &actualFn, const QString &expectedFn, bool err) { @@ -215,6 +221,7 @@ void tst_lupdate::doCompare(const QString &actualFn, const QString &expectedFn, void tst_lupdate::good_data() { QTest::addColumn<QString>("directory"); + QTest::addColumn<bool>("useClangCpp"); QDir parsingDir(m_basePath + "good"); QStringList dirs = parsingDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); @@ -225,19 +232,48 @@ void tst_lupdate::good_data() #ifndef Q_OS_MACOS dirs.removeAll(QLatin1String("parseobjc")); #endif + QSet<QString> ignoredTests = { + "lacksqobject_clang_parser", "parsecontexts_clang_parser", "parsecpp2_clang_parser", + "parsecpp_clang_parser", "prefix_clang_parser", "preprocess_clang_parser", + }; + + // Add test rows for the "classic" lupdate + for (const QString &dir : dirs) { + if (ignoredTests.contains(dir)) + continue; + QTest::newRow(dir.toLocal8Bit()) << dir << false; + } - for (const QString &dir : qAsConst(dirs)) - QTest::newRow(dir.toLocal8Bit()) << dir; +#if QT_CONFIG(clangcpp) && QT_CONFIG(widgets) + // Add test rows for the clang-based lupdate + ignoredTests = { + "lacksqobject", + "parsecontexts", + "parsecpp", + "parsecpp2", + "prefix", + "preprocess", + "proparsing2", // llvm8 cannot handle file name without extension + "respfile", //@lst not supported with the new parser yet (include not properly set in the compile_command.json) + "tr_function_alias", //alias defined in command line not supported with the new parser yet. (and need project file) + "cmdline_deeppath", //no project file, new parser does not support (yet) this way of launching lupdate + "cmdline_order", // no project, new parser do not pickup on macro defined but not used. Test not needed for new parser. + "cmdline_recurse", // recursive scan without project file not supported (yet) with the new parser + }; + for (const QString &dir : dirs) { + if (ignoredTests.contains(dir)) + continue; + QTest::newRow("clang-" + dir.toLocal8Bit()) << dir << true; + } +#endif } void tst_lupdate::good() { QFETCH(QString, directory); + QFETCH(bool, useClangCpp); QString dir = m_basePath + "good/" + directory; - - qDebug() << "Running test in" << dir; - QString workDir = dir; QStringList generatedtsfiles(QLatin1String("project.ts")); QStringList lupdateArguments; @@ -283,6 +319,8 @@ void tst_lupdate::good() if (lupdateArguments.isEmpty()) lupdateArguments.append(QLatin1String("project.pro")); lupdateArguments.prepend("-silent"); + if (useClangCpp) + lupdateArguments.append("-clang-parser"); QProcess proc; proc.setWorkingDirectory(workDir); @@ -308,9 +346,15 @@ void tst_lupdate::good() return; } - for (const QString &ts : qAsConst(generatedtsfiles)) + for (const QString &ts : qAsConst(generatedtsfiles)) { + if (dir.endsWith("preprocess_clang_parser")) { + doCompare(workDir + QLatin1Char('/') + ts, + dir + QLatin1Char('/') + ts + QLatin1String(".result"), true); + } else { doCompare(workDir + QLatin1Char('/') + ts, dir + QLatin1Char('/') + ts + QLatin1String(".result"), false); + } + } } #if CHECK_SIMTEXTH |