Merge remote-tracking branch 'origin/2.8' into HEAD

Conflicts:
	src/libs/cplusplus/FindUsages.cpp
	tests/auto/cplusplus/findusages/tst_findusages.cpp
	tests/auto/debugger/tst_dumpers.cpp

Change-Id: I20e2002c7b25cc25d8120922fa9b52e59db498e3
This commit is contained in:
Eike Ziller
2013-07-09 11:04:59 +02:00
14 changed files with 173 additions and 44 deletions

View File

@@ -1,4 +1,5 @@
import qbs.base 1.0 import qbs.base 1.0
import qbs.TextFile
import qbs.fileinfo as FileInfo import qbs.fileinfo as FileInfo
Module { Module {

View File

@@ -1102,7 +1102,6 @@ class Dumper:
# Normal value # Normal value
#numchild = 1 if value.MightHaveChildren() else 0 #numchild = 1 if value.MightHaveChildren() else 0
numchild = value.GetNumChildren() numchild = value.GetNumChildren()
self.put('iname="%s",' % self.currentIName)
self.putType(typeName) self.putType(typeName)
if typeClass == lldb.eTypeClassStruct or typeClass == lldb.eTypeClassClass: if typeClass == lldb.eTypeClassStruct or typeClass == lldb.eTypeClassClass:
if self.isQObject(value): if self.isQObject(value):
@@ -1129,7 +1128,7 @@ class Dumper:
if value.GetType().GetTypeClass() == lldb.eTypeClassArray: if value.GetType().GetTypeClass() == lldb.eTypeClassArray:
for i in xrange(value.GetNumChildren()): for i in xrange(value.GetNumChildren()):
child = value.GetChildAtIndex(i) child = value.GetChildAtIndex(i)
with UnnamedSubItem(self, "%d" % (i + 1)): with UnnamedSubItem(self, str(i)):
self.putItem(child) self.putItem(child)
return return
@@ -1156,7 +1155,7 @@ class Dumper:
frame = self.currentThread().GetSelectedFrame() frame = self.currentThread().GetSelectedFrame()
self.currentIName = 'local' self.currentIName = 'local'
self.put('data=[') self.put('data=[')
self.anonNumber = -1 self.anonNumber = 0
for value in frame.GetVariables(True, True, False, False): for value in frame.GetVariables(True, True, False, False):
if self.dummyValue is None: if self.dummyValue is None:
self.dummyValue = value self.dummyValue = value

View File

@@ -2452,6 +2452,24 @@ def qdump__std__shared_ptr(d, value):
d.putIntItem("usecount", refcount["_M_use_count"]) d.putIntItem("usecount", refcount["_M_use_count"])
d.putIntItem("weakcount", refcount["_M_weak_count"]) d.putIntItem("weakcount", refcount["_M_weak_count"])
def qdump__std____1__shared_ptr(d, value):
i = value["__ptr_"]
if isNull(i):
d.putValue("(null)")
d.putNumChild(0)
return
if isSimpleType(d.templateArgument(value.type, 0)):
d.putValue("%s @0x%x" % (i.dereference().value, pointerValue(i)))
else:
d.putValue("@0x%x" % pointerValue(i))
d.putNumChild(3)
with Children(d, 3):
d.putSubItem("data", i.dereference())
d.putFields(value["__cntrl_"].dereference())
#d.putIntItem("usecount", refcount["_M_use_count"])
#d.putIntItem("weakcount", refcount["_M_weak_count"])
def qdump__std__unique_ptr(d, value): def qdump__std__unique_ptr(d, value):
i = value["_M_t"]["_M_head_impl"] i = value["_M_t"]["_M_head_impl"]
@@ -2470,6 +2488,23 @@ def qdump__std__unique_ptr(d, value):
with Children(d, 1): with Children(d, 1):
d.putSubItem("data", i) d.putSubItem("data", i)
def qdump__std____1__unique_ptr(d, value):
i = childAt(childAt(value["__ptr_"], 0), 0)
if isNull(i):
d.putValue("(null)")
d.putNumChild(0)
return
if isSimpleType(d.templateArgument(value.type, 0)):
d.putValue("%s @0x%x" % (i.dereference().value, pointerValue(i)))
else:
d.putValue("@0x%x" % pointerValue(i))
d.putNumChild(1)
with Children(d, 1):
d.putSubItem("data", i.dereference())
def qedit__std__vector(expr, value): def qedit__std__vector(expr, value):
values = value.split(',') values = value.split(',')

View File

@@ -1,4 +1,5 @@
import qbs import qbs
import qbs.TextFile
Product { Product {
name: "app_version_header" name: "app_version_header"

View File

@@ -233,8 +233,16 @@ bool FindUsages::checkCandidates(const QList<LookupItem> &candidates) const
if (scopeOfTemplEnclosingCandidateSymbol != scopeOfTemplEnclosingDeclSymbol) if (scopeOfTemplEnclosingCandidateSymbol != scopeOfTemplEnclosingDeclSymbol)
return false; return false;
} else if (s->enclosingScope()->isTemplate() && ! _declSymbol->isTypenameArgument()) { } else if (s->enclosingScope()->isTemplate() && ! _declSymbol->isTypenameArgument()) {
if (_declSymbol->enclosingScope()->isTemplate()) {
if (s->enclosingScope()->enclosingScope() != _declSymbol->enclosingScope()->enclosingScope())
return false;
} else {
if (s->enclosingScope()->enclosingScope() != _declSymbol->enclosingScope()) if (s->enclosingScope()->enclosingScope() != _declSymbol->enclosingScope())
return false; return false;
}
} else if (_declSymbol->enclosingScope()->isTemplate() && s->isTemplate()) {
if (_declSymbol->enclosingScope()->enclosingScope() != s->enclosingScope())
return false;
} else if (! s->isUsingDeclaration() } else if (! s->isUsingDeclaration()
&& s->enclosingScope() != _declSymbol->enclosingScope()) { && s->enclosingScope() != _declSymbol->enclosingScope()) {
return false; return false;

View File

@@ -485,7 +485,7 @@ void QbsProductNode::setQbsProductData(const qbs::ProductData prd)
if (m_qbsProductData == prd) if (m_qbsProductData == prd)
return; return;
bool productWasEnabled = m_qbsProductData.isEnabled(); bool productWasEnabled = m_qbsProductData.isValid() && m_qbsProductData.isEnabled();
bool productIsEnabled = prd.isEnabled(); bool productIsEnabled = prd.isEnabled();
bool updateExisting = productWasEnabled != productIsEnabled; bool updateExisting = productWasEnabled != productIsEnabled;

View File

@@ -39,7 +39,7 @@
namespace QbsProjectManager { namespace QbsProjectManager {
namespace Internal { namespace Internal {
class QBSPROJECTMANAGER_EXPORT QbsParser : public ProjectExplorer::IOutputParser class QbsParser : public ProjectExplorer::IOutputParser
{ {
Q_OBJECT Q_OBJECT

View File

@@ -52,7 +52,7 @@ class QbsProject;
class QbsProjectManagerPlugin; class QbsProjectManagerPlugin;
} // namespace Internal } // namespace Internal
class QBSPROJECTMANAGER_EXPORT QbsManager : public ProjectExplorer::IProjectManager class QbsManager : public ProjectExplorer::IProjectManager
{ {
Q_OBJECT Q_OBJECT

View File

@@ -196,7 +196,7 @@ QString QbsRunConfiguration::executable() const
QbsProject *pro = static_cast<QbsProject *>(target()->project()); QbsProject *pro = static_cast<QbsProject *>(target()->project());
const qbs::ProductData product = findProduct(pro->qbsProjectData(), m_qbsProduct); const qbs::ProductData product = findProduct(pro->qbsProjectData(), m_qbsProduct);
if (product.isValid() || !pro->qbsProject()) if (!product.isValid() || !pro->qbsProject())
return QString(); return QString();
return pro->qbsProject()->targetExecutable(product, installOptions()); return pro->qbsProject()->targetExecutable(product, installOptions());
@@ -518,7 +518,7 @@ bool QbsRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, cons
return false; return false;
QbsProject *project = static_cast<QbsProject *>(parent->project()); QbsProject *project = static_cast<QbsProject *>(parent->project());
return !findProduct(project->qbsProjectData(), productFromId(id)).isValid(); return findProduct(project->qbsProjectData(), productFromId(id)).isValid();
} }
ProjectExplorer::RunConfiguration *QbsRunConfigurationFactory::doCreate(ProjectExplorer::Target *parent, const Core::Id id) ProjectExplorer::RunConfiguration *QbsRunConfigurationFactory::doCreate(ProjectExplorer::Target *parent, const Core::Id id)

View File

@@ -104,6 +104,7 @@ private Q_SLOTS:
void using_insideGlobalNamespace(); void using_insideGlobalNamespace();
void using_insideNamespace(); void using_insideNamespace();
void using_insideFunction(); void using_insideFunction();
void templatedFunction_QTCREATORBUG9749();
}; };
void tst_FindUsages::inlineMethod() void tst_FindUsages::inlineMethod()
@@ -818,5 +819,35 @@ void tst_FindUsages::templateFunctionParameters()
QCOMPARE(findUsages.usages().size(), 4); QCOMPARE(findUsages.usages().size(), 4);
} }
void tst_FindUsages::templatedFunction_QTCREATORBUG9749()
{
const QByteArray src = "\n"
"template <class IntType> char *reformatInteger(IntType value, int format) {}\n"
"void func(int code, int format) {\n"
" reformatInteger(code, format);"
"}\n"
;
Document::Ptr doc = Document::create("templatedFunction_QTCREATORBUG9749");
doc->setUtf8Source(src);
doc->parse();
doc->check();
QVERIFY(doc->diagnosticMessages().isEmpty());
QCOMPARE(doc->globalSymbolCount(), 2U);
Snapshot snapshot;
snapshot.insert(doc);
Template *funcTempl = doc->globalSymbolAt(0)->asTemplate();
QVERIFY(funcTempl);
QCOMPARE(funcTempl->memberCount(), 2U);
Function *func = funcTempl->memberAt(1)->asFunction();
FindUsages findUsages(src, doc, snapshot);
findUsages(func);
QCOMPARE(findUsages.usages().size(), 2);
}
QTEST_APPLESS_MAIN(tst_FindUsages) QTEST_APPLESS_MAIN(tst_FindUsages)
#include "tst_findusages.moc" #include "tst_findusages.moc"

View File

@@ -40,6 +40,7 @@
#include "temporarydir.h" #include "temporarydir.h"
#include <QtTest> #include <QtTest>
#include <math.h>
#if QT_VERSION >= 0x050000 #if QT_VERSION >= 0x050000
#define MSKIP_SINGLE(x) QSKIP(x) #define MSKIP_SINGLE(x) QSKIP(x)
@@ -195,9 +196,10 @@ static QByteArray parentIName(const QByteArray &iname)
struct ValueBase struct ValueBase
{ {
ValueBase() : hasPtrSuffix(false), version(0) {} ValueBase() : hasPtrSuffix(false), isFloatValue(false), version(0) {}
bool hasPtrSuffix; bool hasPtrSuffix;
bool isFloatValue;
int version; int version;
}; };
@@ -235,6 +237,18 @@ struct Value : public ValueBase
if (hasPtrSuffix) if (hasPtrSuffix)
return actualValue.startsWith(expectedValue + QLatin1String(" @0x")) return actualValue.startsWith(expectedValue + QLatin1String(" @0x"))
|| actualValue.startsWith(expectedValue + QLatin1String("@0x")); || actualValue.startsWith(expectedValue + QLatin1String("@0x"));
if (isFloatValue) {
double f1 = fabs(expectedValue.toDouble());
double f2 = fabs(actualValue.toDouble());
//qDebug() << "expected float: " << qPrintable(expectedValue) << f1;
//qDebug() << "actual float: " << qPrintable(actualValue) << f2;
if (f1 < f2)
std::swap(f1, f2);
return f1 - f2 <= 0.01 * f2;
}
return actualValue == expectedValue; return actualValue == expectedValue;
} }
@@ -247,6 +261,12 @@ struct Pointer : Value
Pointer(const QByteArray &value) : Value(value) { hasPtrSuffix = true; } Pointer(const QByteArray &value) : Value(value) { hasPtrSuffix = true; }
}; };
struct FloatValue : Value
{
FloatValue() { isFloatValue = true; }
FloatValue(const QByteArray &value) : Value(value) { isFloatValue = true; }
};
struct Value4 : Value struct Value4 : Value
{ {
Value4(const QByteArray &value) : Value(value) { version = 4; } Value4(const QByteArray &value) : Value(value) { version = 4; }
@@ -311,15 +331,6 @@ struct CheckType : public Check
{} {}
}; };
struct CheckPlain : public Check
{
CheckPlain(const QByteArray &iname, const Name &name,
const Type &type)
: Check(iname, name, noValue, type)
{}
};
struct Profile struct Profile
{ {
Profile(const QByteArray &contents) : contents(contents) {} Profile(const QByteArray &contents) : contents(contents) {}
@@ -336,9 +347,9 @@ struct Cxx11Profile : public Profile
{} {}
}; };
struct MacLibStdCppProfile : public Profile struct MacLibCppProfile : public Profile
{ {
MacLibStdCppProfile() MacLibCppProfile()
: Profile("macx {\n" : Profile("macx {\n"
"QMAKE_CXXFLAGS += -stdlib=libc++\n" "QMAKE_CXXFLAGS += -stdlib=libc++\n"
"LIBS += -stdlib=libc++\n" "LIBS += -stdlib=libc++\n"
@@ -401,9 +412,13 @@ struct GuiProfile {};
struct DataBase struct DataBase
{ {
DataBase() : useQt(false), forceC(false), gdbOnly(false), lldbOnly(false) {} DataBase()
: useQt(false), useQHash(false),
forceC(false), gdbOnly(false), lldbOnly(false)
{}
mutable bool useQt; mutable bool useQt;
mutable bool useQHash;
mutable bool forceC; mutable bool forceC;
mutable bool gdbOnly; mutable bool gdbOnly;
mutable bool lldbOnly; mutable bool lldbOnly;
@@ -461,34 +476,33 @@ public:
{ {
profileExtra += profileExtra +=
"CONFIG += QT\n" "CONFIG += QT\n"
"QT += gui\n" "QT += core\n";
"greaterThan(QT_MAJOR_VERSION, 4):QT *= widgets\n";
useQt = true; useQt = true;
useQHash = true;
return *this; return *this;
} }
const Data &operator%(const GuiProfile &) const const Data &operator%(const GuiProfile &) const
{ {
this->operator%(CoreProfile());
profileExtra += profileExtra +=
"CONFIG += QT\n"
"QT += gui\n" "QT += gui\n"
"greaterThan(QT_MAJOR_VERSION, 4):QT *= widgets\n"; "greaterThan(QT_MAJOR_VERSION, 4):QT *= widgets\n";
useQt = true;
return *this; return *this;
} }
const Data &operator%(const CorePrivateProfile &) const const Data &operator%(const CorePrivateProfile &) const
{ {
this->operator%(CoreProfile());
profileExtra += profileExtra +=
"CONFIG += QT\n"
"greaterThan(QT_MAJOR_VERSION, 4) {\n" "greaterThan(QT_MAJOR_VERSION, 4) {\n"
" QT += core core-private\n" " QT += core-private\n"
" CONFIG += no_private_qt_headers_warning\n" " CONFIG += no_private_qt_headers_warning\n"
"}"; "}";
useQt = true;
return *this; return *this;
} }
@@ -500,8 +514,8 @@ public:
public: public:
mutable QByteArray profileExtra; mutable QByteArray profileExtra;
QByteArray includes; mutable QByteArray includes;
QByteArray code; mutable QByteArray code;
mutable QMap<QByteArray, Check> checks; // IName -> Action mutable QMap<QByteArray, Check> checks; // IName -> Action
}; };
@@ -586,7 +600,6 @@ void tst_Dumpers::initTestCase()
qDebug() << "QMake : " << m_qmakeBinary.constData(); qDebug() << "QMake : " << m_qmakeBinary.constData();
Environment utilsEnv = Environment::systemEnvironment(); Environment utilsEnv = Environment::systemEnvironment();
utilsEnv.appendOrSet(QLatin1String("QT_HASH_SEED"), QLatin1String("0"));
if (m_debuggerEngine == DumpTestGdbEngine) { if (m_debuggerEngine == DumpTestGdbEngine) {
QProcess debugger; QProcess debugger;
@@ -717,9 +730,20 @@ void tst_Dumpers::dumper()
"\n\nvoid unused(const void *first,...) { (void) first; }" "\n\nvoid unused(const void *first,...) { (void) first; }"
"\n\nvoid breakHere() {}" "\n\nvoid breakHere() {}"
"\n\n" + data.includes + "\n\n" + data.includes +
"\n\n" + (data.useQHash ?
"\n#include <QByteArray>"
"\n#if QT_VERSION >= 0x050000"
"\nQT_BEGIN_NAMESPACE"
"\nQ_CORE_EXPORT extern QBasicAtomicInt qt_qhash_seed; // from qhash.cpp"
"\nQT_END_NAMESPACE"
"\n#endif" : "") +
"\n\nint main(int argc, char *argv[])" "\n\nint main(int argc, char *argv[])"
"\n{" "\n{"
"\n int qtversion = " + (data.useQt ? "QT_VERSION" : "0") + ";\n" "\n int qtversion = " + (data.useQt ? "QT_VERSION" : "0") + ";"
"\n" + (data.useQHash ?
"\n#if QT_VERSION >= 0x050000"
"\nqt_qhash_seed.testAndSetRelaxed(-1, 0);"
"\n#endif\n" : "") +
"\n unused(&argc, &argv, &qtversion);\n" "\n unused(&argc, &argv, &qtversion);\n"
"\n" + data.code + "\n" + data.code +
"\n breakHere();" "\n breakHere();"
@@ -1033,16 +1057,17 @@ void tst_Dumpers::dumper_data()
" } // namespace nsB\n" " } // namespace nsB\n"
" } // namespace nsA\n"; " } // namespace nsA\n";
QTest::newRow("AnonymousStruct") QTest::newRow("AnonymousStructGdb")
<< Data("union {\n" << Data("union {\n"
" struct { int i; int b; };\n" " struct { int i; int b; };\n"
" struct { float f; };\n" " struct { float f; };\n"
" double d;\n" " double d;\n"
" } a = { { 42, 43 } };\n (void)a;") " } a = { { 42, 43 } };\n (void)a;")
% GdbOnly()
% CheckType("a", "a", "union {...}") % CheckType("a", "a", "union {...}")
% Check("a.b", "43", "int") % Check("a.b", "43", "int")
% Check("a.d", "9.1245819032257467e-313", "double") % Check("a.d", FloatValue("9.1245819032257467e-313"), "double")
% Check("a.f", "5.88545355e-44", "float") % Check("a.f", FloatValue("5.88545355e-44"), "float")
% Check("a.i", "42", "int"); % Check("a.i", "42", "int");
QTest::newRow("QByteArrayData") QTest::newRow("QByteArrayData")
@@ -1052,6 +1077,20 @@ void tst_Dumpers::dumper_data()
% Check("ba", Value4(""), "@QByteArrayData") % Check("ba", Value4(""), "@QByteArrayData")
% Check("ba", Value5(""), "@QByteArrayData"); % Check("ba", Value5(""), "@QByteArrayData");
// FIXME: Merge with GDB case
QTest::newRow("AnonymousStructLldb")
<< Data("union {\n"
" struct { int i; int b; };\n"
" struct { float f; };\n"
" double d;\n"
" } a = { { 42, 43 } };\n (void)a;")
//% CheckType("a", "a", "union {...}")
% LldbOnly()
% Check("a.#1.b", "43", "int")
% Check("a.d", FloatValue("9.1245819032257467e-313"), "double")
% Check("a.#2.f", FloatValue("5.88545355e-44"), "float")
% Check("a.#1.i", "42", "int");
QTest::newRow("QByteArray0") QTest::newRow("QByteArray0")
<< Data("#include <QByteArray>\n", << Data("#include <QByteArray>\n",
"QByteArray ba;") "QByteArray ba;")
@@ -2347,7 +2386,7 @@ void tst_Dumpers::dumper_data()
"unused(&a, &b);\n") "unused(&a, &b);\n")
% CoreProfile() % CoreProfile()
% Cxx11Profile() % Cxx11Profile()
% MacLibStdCppProfile() % MacLibCppProfile()
% Check("a", "<4 items>", "std::array<int, 4u>") % Check("a", "<4 items>", "std::array<int, 4u>")
% Check("b", "<4 items>", "std::array<@QString, 4u>"); % Check("b", "<4 items>", "std::array<@QString, 4u>");
@@ -2356,16 +2395,28 @@ void tst_Dumpers::dumper_data()
"std::complex<double> c(1, 2);\n") "std::complex<double> c(1, 2);\n")
% Check("c", "(1.000000, 2.000000)", "std::complex<double>"); % Check("c", "(1.000000, 2.000000)", "std::complex<double>");
QTest::newRow("CComplex") QTest::newRow("CComplexGdb")
<< Data("#include <complex.h>\n", << Data("#include <complex.h>\n",
"// Doesn't work when compiled as C++.\n" "// Doesn't work when compiled as C++.\n"
"double complex a = 0;\n" "double complex a = 0;\n"
"double _Complex b = 0;\n" "double _Complex b = 0;\n"
"unused(&a, &b);\n") "unused(&a, &b);\n")
% ForceC() % ForceC()
% GdbOnly()
% Check("a", "0 + 0 * I", "complex double") % Check("a", "0 + 0 * I", "complex double")
% Check("b", "0 + 0 * I", "complex double"); % Check("b", "0 + 0 * I", "complex double");
QTest::newRow("CComplexLldb")
<< Data("#include <complex.h>\n",
"// Doesn't work when compiled as C++.\n"
"double complex a = 0;\n"
"double _Complex b = 0;\n"
"unused(&a, &b);\n")
% ForceC()
% LldbOnly()
% Check("a", "0 + 0i", "_Complex double")
% Check("b", "0 + 0i", "_Complex double");
QTest::newRow("StdDequeInt") QTest::newRow("StdDequeInt")
<< Data("#include <deque>\n", << Data("#include <deque>\n",
"std::deque<int> deque;\n" "std::deque<int> deque;\n"
@@ -2638,6 +2689,7 @@ void tst_Dumpers::dumper_data()
"std::unique_ptr<int> pi(new int(32));\n" "std::unique_ptr<int> pi(new int(32));\n"
"std::unique_ptr<Foo> pf(new Foo);\n") "std::unique_ptr<Foo> pf(new Foo);\n")
% Cxx11Profile() % Cxx11Profile()
% MacLibCppProfile()
% Check("pi", Pointer("32"), "std::unique_ptr<int, std::default_delete<int> >") % Check("pi", Pointer("32"), "std::unique_ptr<int, std::default_delete<int> >")
% Check("pf", Pointer(), "std::unique_ptr<Foo, std::default_delete<Foo> >"); % Check("pf", Pointer(), "std::unique_ptr<Foo, std::default_delete<Foo> >");
@@ -2646,6 +2698,7 @@ void tst_Dumpers::dumper_data()
"std::shared_ptr<int> pi(new int(32));\n" "std::shared_ptr<int> pi(new int(32));\n"
"std::shared_ptr<Foo> pf(new Foo);\n") "std::shared_ptr<Foo> pf(new Foo);\n")
% Cxx11Profile() % Cxx11Profile()
% MacLibCppProfile()
% Check("pi", Pointer("32"), "std::shared_ptr<int>") % Check("pi", Pointer("32"), "std::shared_ptr<int>")
% Check("pf", Pointer(), "std::shared_ptr<Foo>"); % Check("pf", Pointer(), "std::shared_ptr<Foo>");

View File

@@ -642,8 +642,9 @@ def checkIfObjectExists(name, shouldExist = True, timeout = 3000, verboseOnFail
return result return result
# wait for progress bar(s) to appear and disappear # wait for progress bar(s) to appear and disappear
def progressBarWait(timeout=60000): def progressBarWait(timeout=60000, warn=True):
if not checkIfObjectExists(":Qt Creator_Core::Internal::ProgressBar", True, 6000): if not checkIfObjectExists(":Qt Creator_Core::Internal::ProgressBar", True, 6000):
if warn:
test.warning("progressBarWait() timed out when waiting for ProgressBar.", test.warning("progressBarWait() timed out when waiting for ProgressBar.",
"This may lead to unforeseen behavior. Consider increasing the timeout.") "This may lead to unforeseen behavior. Consider increasing the timeout.")
checkIfObjectExists(":Qt Creator_Core::Internal::ProgressBar", False, timeout) checkIfObjectExists(":Qt Creator_Core::Internal::ProgressBar", False, timeout)

View File

@@ -93,7 +93,7 @@ def main():
mouseClick(waitForObject(":Qt Creator.Help_Search for:_QLineEdit")) mouseClick(waitForObject(":Qt Creator.Help_Search for:_QLineEdit"))
replaceEditorContent(":Qt Creator.Help_Search for:_QLineEdit", searchKeyword) replaceEditorContent(":Qt Creator.Help_Search for:_QLineEdit", searchKeyword)
type(waitForObject(":Qt Creator.Help_Search for:_QLineEdit"), "<Return>") type(waitForObject(":Qt Creator.Help_Search for:_QLineEdit"), "<Return>")
progressBarWait() progressBarWait(warn=False)
if shouldFind: if shouldFind:
test.verify(waitFor("re.match('[1-9]\d* - [1-9]\d* of [1-9]\d* Hits'," test.verify(waitFor("re.match('[1-9]\d* - [1-9]\d* of [1-9]\d* Hits',"
"str(findObject(':Hits_QLabel').text))", 2000), "str(findObject(':Hits_QLabel').text))", 2000),
@@ -129,7 +129,7 @@ def main():
# advanced search - do search # advanced search - do search
clickButton(waitForObject("{text='Search' type='QPushButton' unnamed='1' visible='1' " clickButton(waitForObject("{text='Search' type='QPushButton' unnamed='1' visible='1' "
"window=':Qt Creator_Core::Internal::MainWindow'}")) "window=':Qt Creator_Core::Internal::MainWindow'}"))
progressBarWait() progressBarWait(warn=False)
# verify that advanced search results found # verify that advanced search results found
test.verify(waitFor("re.search('1 - 2 of 2 Hits'," test.verify(waitFor("re.search('1 - 2 of 2 Hits',"
"str(findObject(':Hits_QLabel').text))", 3000), "str(findObject(':Hits_QLabel').text))", 3000),