Merge commit 'origin/1.1'

This commit is contained in:
con
2009-04-08 11:02:52 +02:00
53 changed files with 698 additions and 410 deletions

View File

@@ -1,6 +1,6 @@
#!/bin/sh
bindir=$(dirname "$0")
bindir=$(dirname $(readlink -nf $0))
if test "$(uname -m)" = "x86_64" ; then
libdir=$(cd ${bindir}/../lib64 ; pwd)
else

4
dist/changes-1.1.0 vendored
View File

@@ -13,8 +13,8 @@ General
* Completely reworked editor split mechanism.
Editing
* Some support for Obj-C++ //TODO: what does that mean more concrete?
* Some support for doxygen style comments //TODO: what does that mean more concrete?
* Added support for JavaScript.
* Added syntax highlighting and code completion for qdoc and doxygen tags.
* Improved function argument hint.
* More checkpoints in editor history.
* Ctrl-click for jumping to a symbol definition.

View File

@@ -42,7 +42,8 @@
#include <QtDebug>
#ifdef Q_OS_LINUX
# define USE_UNPATCHED_QPLUGINLOADER 0
// Using the patched version breaks on Fedora 10, KDE4.2.2/Qt4.5.
# define USE_UNPATCHED_QPLUGINLOADER 1
#else
# define USE_UNPATCHED_QPLUGINLOADER 1
#endif

View File

@@ -24,3 +24,5 @@ unix {
LIBS += -lshell32
}
target.path = /bin
INSTALLS += target

View File

@@ -169,8 +169,8 @@ InSourceBuildPage::InSourceBuildPage(CMakeOpenProjectWizard *cmakeWizard)
QLabel *label = new QLabel(this);
label->setWordWrap(true);
label->setText(tr("Qt Creator has detected an in source build. "
"This prevents out of souce builds, Qt Creator won't allow you to change the build directory. "
"If you want a out of source build, clean your source directory and open the project again"));
"This prevents shadow builds, Qt Creator won't allow you to change the build directory. "
"If you want a shadow build, clean your source directory and open the project again."));
layout()->addWidget(label);
}
@@ -181,8 +181,8 @@ XmlFileUpToDatePage::XmlFileUpToDatePage(CMakeOpenProjectWizard *cmakeWizard)
setLayout(new QVBoxLayout);
QLabel *label = new QLabel(this);
label->setWordWrap(true);
label->setText(tr("Qt Creator has found a recent cbp file, which Qt Creator parses to gather information about the project. "
"You can change the command line arguments used to create this file, in the project mode. "
label->setText(tr("Qt Creator has found a recent cbp file, which Qt Creator will parse to gather information about the project. "
"You can change the command line arguments used to create this file in the project mode. "
"Click finish to load the project"));
layout()->addWidget(label);
}
@@ -239,13 +239,19 @@ void CMakeRunPage::initWidgets()
fl->addRow(m_descriptionLabel);
m_argumentsLineEdit = new QLineEdit(this);
fl->addRow(tr("Arguments:"), m_argumentsLineEdit);
//fl->addRow(tr("Arguments:"), m_argumentsLineEdit);
m_runCMake = new QPushButton(this);
m_runCMake->setText("Run CMake");
m_runCMake->setText(tr("Run CMake"));
connect(m_runCMake, SIGNAL(clicked()), this, SLOT(runCMake()));
fl->addWidget(m_runCMake);
//fl->addWidget(m_runCMake);
QHBoxLayout *hbox = new QHBoxLayout;
hbox->addWidget(m_argumentsLineEdit);
hbox->addWidget(m_runCMake);
fl->addRow(tr("Arguments"), hbox);
m_output = new QPlainTextEdit(this);
m_output->setReadOnly(true);
@@ -257,22 +263,23 @@ void CMakeRunPage::initializePage()
if (m_presetBuildDirectory.isEmpty()) {
m_buildDirectory = m_cmakeWizard->buildDirectory();
m_descriptionLabel->setText(
tr("The directory %1 does not contain a cbp file. Qt Creator needs to create this file, by running cmake. "
tr("The directory %1 does not contain a cbp file. Qt Creator needs to create this file by running cmake. "
"Some projects require command line arguments to the initial cmake call.").arg(m_buildDirectory));
} else {
m_buildDirectory = m_presetBuildDirectory;
// TODO tell the user more?
if (m_update)
m_descriptionLabel->setText(tr("The directory %1 contains an outdated .cbp file. Qt "
"Creator needs to update this file by running cmake. "
"If you want to add additional command line arguments, "
"add them in the below.").arg(m_buildDirectory));
"add them in the below. Note, that cmake remembers command "
"line arguments from the former runs.").arg(m_buildDirectory));
else
m_descriptionLabel->setText(tr("The directory %1, specified in a buildconfiguration, "
m_descriptionLabel->setText(tr("The directory %1 specified in a buildconfiguration, "
"does not contain a cbp file. Qt Creator needs to "
"recreate this file, by running cmake. "
"Some projects require command line arguments to "
"the initial cmake call.").arg(m_buildDirectory));
"the initial cmake call. Note, that cmake remembers command "
"line arguments from the former runs.").arg(m_buildDirectory));
}
}

View File

@@ -207,30 +207,30 @@ void CMakeProject::parseCMakeLists()
// Create run configurations for m_targets
//qDebug()<<"Create run configurations of m_targets";
QMap<QString, QSharedPointer<CMakeRunConfiguration> > existingRunConfigurations;
QMultiMap<QString, QSharedPointer<CMakeRunConfiguration> > existingRunConfigurations;
foreach(QSharedPointer<ProjectExplorer::RunConfiguration> cmakeRunConfiguration, runConfigurations()) {
if (QSharedPointer<CMakeRunConfiguration> rc = cmakeRunConfiguration.dynamicCast<CMakeRunConfiguration>()) {
existingRunConfigurations.insert(rc->title(), rc);
}
}
bool setActive = false;
bool setActive = existingRunConfigurations.isEmpty();
foreach(const CMakeTarget &ct, m_targets) {
if (ct.executable.isEmpty())
continue;
if (ct.title.endsWith("/fast"))
continue;
QMap<QString, QSharedPointer<CMakeRunConfiguration> >::iterator it =
existingRunConfigurations.find(ct.title);
if (it != existingRunConfigurations.end()) {
QList<QSharedPointer<CMakeRunConfiguration> > list = existingRunConfigurations.values(ct.title);
if (!list.isEmpty()) {
// Already exists, so override the settings...
QSharedPointer<CMakeRunConfiguration> rc = it.value();
//qDebug()<<"Updating Run Configuration with title"<<ct.title;
//qDebug()<<" Executable new:"<<ct.executable<< "old:"<<rc->executable();
//qDebug()<<" WD new:"<<ct.workingDirectory<<"old:"<<rc->workingDirectory();
rc->setExecutable(ct.executable);
rc->setWorkingDirectory(ct.workingDirectory);
existingRunConfigurations.erase(it);
foreach (QSharedPointer<CMakeRunConfiguration> rc, list) {
//qDebug()<<"Updating Run Configuration with title"<<ct.title;
//qDebug()<<" Executable new:"<<ct.executable<< "old:"<<rc->executable();
//qDebug()<<" WD new:"<<ct.workingDirectory<<"old:"<<rc->workingDirectory();
rc->setExecutable(ct.executable);
rc->setWorkingDirectory(ct.workingDirectory);
}
existingRunConfigurations.remove(ct.title);
} else {
// Does not exist yet
//qDebug()<<"Adding new run configuration with title"<<ct.title;
@@ -238,13 +238,13 @@ void CMakeProject::parseCMakeLists()
QSharedPointer<ProjectExplorer::RunConfiguration> rc(new CMakeRunConfiguration(this, ct.executable, ct.workingDirectory, ct.title));
addRunConfiguration(rc);
// The first one gets the honour of beeing the active one
if (!setActive) {
if (setActive) {
setActiveRunConfiguration(rc);
setActive = true;
setActive = false;
}
}
}
QMap<QString, QSharedPointer<CMakeRunConfiguration> >::const_iterator it =
QMultiMap<QString, QSharedPointer<CMakeRunConfiguration> >::const_iterator it =
existingRunConfigurations.constBegin();
for( ; it != existingRunConfigurations.constEnd(); ++it) {
QSharedPointer<CMakeRunConfiguration> rc = it.value();
@@ -282,8 +282,13 @@ QString CMakeProject::buildParser(const QString &buildConfiguration) const
QStringList CMakeProject::targets() const
{
QStringList results;
foreach (const CMakeTarget &ct, m_targets)
foreach (const CMakeTarget &ct, m_targets) {
if (ct.executable.isEmpty())
continue;
if (ct.title.endsWith("/fast"))
continue;
results << ct.title;
}
return results;
}
@@ -501,6 +506,10 @@ void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
if (!copw.buildDirectory().isEmpty())
setValue("all", "buildDirectory", copw.buildDirectory());
//TODO save arguments somewhere copw.arguments()
MakeStep *cleanMakeStep = new MakeStep(this);
insertCleanStep(0, cleanMakeStep);
cleanMakeStep->setValue("clean", true);
} else {
// We have a user file, but we could still be missing the cbp file
// TODO check that we have a cbp file and if not, open up a dialog ?
@@ -526,6 +535,14 @@ void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
parseCMakeLists(); // Gets the directory from the active buildconfiguration
}
CMakeTarget CMakeProject::targetForTitle(const QString &title)
{
foreach(const CMakeTarget &ct, m_targets)
if (ct.title == title)
return ct;
return CMakeTarget();
}
CMakeFile::CMakeFile(CMakeProject *parent, QString fileName)
: Core::IFile(parent), m_project(parent), m_fileName(fileName)
{

View File

@@ -101,6 +101,7 @@ public:
MakeStep *makeStep() const;
QStringList targets() const;
QString buildParser(const QString &buildConfiguration) const;
CMakeTarget targetForTitle(const QString &title);
protected:
virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer);

View File

@@ -168,8 +168,11 @@ QStringList CMakeRunConfigurationFactory::canCreate(ProjectExplorer::Project *pr
CMakeProject *pro = qobject_cast<CMakeProject *>(project);
if (!pro)
return QStringList();
// TODO gather all targets and return them here
return QStringList();
QStringList allTargets = pro->targets();
for (int i=0; i<allTargets.size(); ++i) {
allTargets[i] = Constants::CMAKERUNCONFIGURATION + allTargets[i];
}
return allTargets;
}
// used to translate the types to names to display to the user
@@ -193,9 +196,9 @@ QSharedPointer<ProjectExplorer::RunConfiguration> CMakeRunConfigurationFactory::
return rc;
} else {
// Adding new
// TODO extract target from type
QString file = type.mid(QString(Constants::CMAKERUNCONFIGURATION).length());
QSharedPointer<ProjectExplorer::RunConfiguration> rc(new CMakeRunConfiguration(pro, file, QString::null, QString::null));
const QString title = type.mid(QString(Constants::CMAKERUNCONFIGURATION).length());
const CMakeTarget &ct = pro->targetForTitle(title);
QSharedPointer<ProjectExplorer::RunConfiguration> rc(new CMakeRunConfiguration(pro, ct.executable, ct.workingDirectory, ct.title));
return rc;
}
}

View File

@@ -50,6 +50,7 @@ using namespace CMakeProjectManager::Internal;
MakeStep::MakeStep(CMakeProject *pro)
: AbstractProcessStep(pro), m_pro(pro), m_buildParser(0)
{
m_percentProgress = QRegExp("^\\[\\s*(\\d*)%\\]");
}
MakeStep::~MakeStep()
@@ -98,16 +99,23 @@ bool MakeStep::init(const QString &buildConfiguration)
setCommand(buildConfiguration, "make"); // TODO give full path here?
#endif // Q_OS_WIN
QStringList arguments = value(buildConfiguration, "buildTargets").toStringList();
arguments << additionalArguments(buildConfiguration);
setArguments(buildConfiguration, arguments); // TODO
setEnvironment(buildConfiguration, m_pro->environment(buildConfiguration));
if (value("clean").isValid() && value("clean").toBool()) {
setArguments(buildConfiguration, QStringList() << "clean");
} else {
QStringList arguments = value(buildConfiguration, "buildTargets").toStringList();
arguments << additionalArguments(buildConfiguration);
setArguments(buildConfiguration, arguments); // TODO
setEnvironment(buildConfiguration, m_pro->environment(buildConfiguration));
}
return AbstractProcessStep::init(buildConfiguration);
}
void MakeStep::run(QFutureInterface<bool> &fi)
{
m_futureInterface = &fi;
m_futureInterface->setProgressRange(0, 100);
AbstractProcessStep::run(fi);
m_futureInterface = 0;
}
QString MakeStep::name()
@@ -134,6 +142,12 @@ void MakeStep::stdOut(const QString &line)
{
if (m_buildParser)
m_buildParser->stdOutput(line);
if (m_percentProgress.indexIn(line) != -1) {
bool ok = false;
int percent = m_percentProgress.cap(1).toInt(&ok);;
if (ok)
m_futureInterface->setProgressValue(percent);
}
AbstractProcessStep::stdOut(line);
}

View File

@@ -73,6 +73,8 @@ private:
CMakeProject *m_pro;
ProjectExplorer::BuildParserInterface *m_buildParser;
QSet<QString> m_openDirectories;
QRegExp m_percentProgress;
QFutureInterface<bool> *m_futureInterface;
};
class MakeStepConfigWidget :public ProjectExplorer::BuildStepConfigWidget

View File

@@ -1814,7 +1814,10 @@ void EditorManager::removeCurrentSplit()
void EditorManager::removeAllSplits()
{
if (!m_d->m_splitter->isSplitter())
return;
IEditor *editor = m_d->m_currentEditor;
m_d->m_currentEditor = 0; // trigger update below
if (editor && m_d->m_editorModel->isDuplicate(editor))
editor = m_d->m_editorModel->originalForDuplicate(editor);
m_d->m_splitter->unsplitAll();

View File

@@ -63,6 +63,7 @@
#include "editormanager/ieditorfactory.h"
#include "baseview.h"
#include "basefilewizard.h"
#include "ioutputpane.h"
#include <coreplugin/findplaceholder.h>
#include <utils/pathchooser.h>
@@ -302,6 +303,9 @@ bool MainWindow::init(QString *errorMessage)
outputModeWidget->layout()->addWidget(new Core::FindToolBarPlaceHolder(m_outputMode));
outputModeWidget->setFocusProxy(oph);
connect(m_modeManager, SIGNAL(currentModeChanged(Core::IMode*)),
this, SLOT(modeChanged(Core::IMode*)), Qt::QueuedConnection);
m_outputMode->setContext(m_globalContext);
pm->addObject(m_outputMode);
pm->addObject(m_generalSettings);
@@ -317,6 +321,16 @@ bool MainWindow::init(QString *errorMessage)
return true;
}
void MainWindow::modeChanged(Core::IMode *mode)
{
if (mode == m_outputMode) {
int idx = OutputPaneManager::instance()->m_widgetComboBox->itemData(OutputPaneManager::instance()->m_widgetComboBox->currentIndex()).toInt();
IOutputPane *out = OutputPaneManager::instance()->m_pageMap.value(idx);
if (out && out->canFocus())
out->setFocus();
}
}
void MainWindow::extensionsInitialized()
{
m_editorManager->init();

View File

@@ -64,6 +64,7 @@ class UniqueIDManager;
class VariableManager;
class VCSManager;
class ViewManagerInterface;
class IMode;
namespace Internal {
@@ -153,6 +154,7 @@ private slots:
void updateFocusWidget(QWidget *old, QWidget *now);
void setSidebarVisible(bool visible);
void destroyVersionDialog();
void modeChanged(Core::IMode *mode);
private:
void updateContextObject(IContext *context);

View File

@@ -233,10 +233,13 @@ void WelcomeMode::updateWelcomePage(const WelcomePageData &welcomePageData)
{
QString projects;
QTextStream str(&projects);
foreach (const QString &s, welcomePageData.projectList) {
const QFileInfo fi(s);
str << "<li><p><a href=\"gh-project:" << s << "\" title=\""
<< fi.absolutePath() << "\">" << fi.fileName() << "</a></p></li>\n";
QList<QPair<QString, QString> >::const_iterator it, end;
end = welcomePageData.projectList.constEnd();
for( it = welcomePageData.projectList.constBegin(); it != end; ++it) {
const QFileInfo fi((*it).first);
str << "<li><p><a href=\"gh-project:" << (*it).first << "\" title=\""
<< fi.absolutePath() << "\">" << (*it).second << "</a></p></li>\n";
}
projectHtml.replace(QLatin1String("<!-- RECENT PROJECTS LIST -->"), projects);
}

View File

@@ -33,6 +33,7 @@
#include <coreplugin/imode.h>
#include <QtCore/QObject>
#include <QtCore/QPair>
QT_BEGIN_NAMESPACE
class QWidget;
@@ -59,7 +60,7 @@ public:
QString previousSession;
QString activeSession;
QStringList sessionList;
QStringList projectList;
QList<QPair<QString, QString> > projectList; // pair of filename, displayname
};
void updateWelcomePage(const WelcomePageData &welcomePageData);

View File

@@ -632,10 +632,10 @@ CPPEditor::Link CPPEditor::findLinkAt(const QTextCursor &cursor,
const int nameStart = tk.position();
const int nameLength = tk.length();
const int endOfName = nameStart + nameLength;
const int endOfName = block.position() + nameStart + nameLength;
const QString name = block.text().mid(nameStart, nameLength);
tc.setPosition(block.position() + endOfName);
tc.setPosition(endOfName);
// Evaluate the type of the expression under the cursor
ExpressionUnderCursor expressionUnderCursor;

View File

@@ -99,6 +99,7 @@ private:
int m_startpos;
int m_currentarg;
int m_current;
bool m_escapePressed;
TextEditor::ITextEditor *m_editor;
@@ -197,7 +198,8 @@ using namespace CppTools::Internal;
FunctionArgumentWidget::FunctionArgumentWidget():
m_startpos(-1),
m_current(0)
m_current(0),
m_escapePressed(false)
{
QObject *editorObject = Core::EditorManager::instance()->currentEditor();
m_editor = qobject_cast<TextEditor::ITextEditor *>(editorObject);
@@ -267,6 +269,7 @@ void FunctionArgumentWidget::showFunctionHint(QList<Function *> functionSymbols,
m_context = context;
m_startpos = startPosition;
m_current = 0;
m_escapePressed = false;
// update the text
m_currentarg = -1;
@@ -326,7 +329,15 @@ void FunctionArgumentWidget::updateArgumentHighlight()
bool FunctionArgumentWidget::eventFilter(QObject *obj, QEvent *e)
{
switch (e->type()) {
case QEvent::ShortcutOverride:
if (static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape) {
m_escapePressed = true;
}
break;
case QEvent::KeyPress:
if (static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape) {
m_escapePressed = true;
}
if (m_items.size() > 1) {
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
if (ke->key() == Qt::Key_Up) {
@@ -340,7 +351,7 @@ bool FunctionArgumentWidget::eventFilter(QObject *obj, QEvent *e)
}
break;
case QEvent::KeyRelease:
if (static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape) {
if (static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape && m_escapePressed) {
m_popupFrame->close();
return false;
}
@@ -508,14 +519,11 @@ static int startOfOperator(TextEditor::ITextEditable *editor,
return start;
}
bool CppCodeCompletion::isValid(TextEditor::ITextEditable *editor)
bool CppCodeCompletion::supportsEditor(TextEditor::ITextEditable *editor)
{ return m_manager->isCppEditor(editor); }
bool CppCodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor)
{
if (! m_manager->isCppEditor(editor)) // ### remove me
return false;
const int pos = editor->position();
if (startOfOperator(editor, pos, /*token =*/ 0,
/*want function call=*/ true) != pos)

View File

@@ -58,7 +58,7 @@ class CppCodeCompletion : public TextEditor::ICompletionCollector
public:
explicit CppCodeCompletion(CppModelManager *manager);
bool isValid(TextEditor::ITextEditable *editor);
bool supportsEditor(TextEditor::ITextEditable *editor);
bool triggersCompletion(TextEditor::ITextEditable *editor);
int startCompletion(TextEditor::ITextEditable *editor);
void completions(QList<TextEditor::CompletionItem> *completions);

View File

@@ -161,35 +161,35 @@ DebuggerSettings *theDebuggerSettings()
item->setText(QObject::tr("Collapse item"));
//
// Dumpers
// DebuggingHelper
//
item = new SavedAction(instance);
instance->insertItem(UseDumpers, item);
instance->insertItem(UseDebuggingHelpers, item);
item->setDefaultValue(true);
item->setSettingsKey("DebugMode", "UseDumpers");
item->setText(QObject::tr("Use data dumpers"));
item->setSettingsKey("DebugMode", "UseDebuggingHelper");
item->setText(QObject::tr("Use Debugging Helper"));
item->setCheckable(true);
item->setDefaultValue(true);
item = new SavedAction(instance);
instance->insertItem(UseCustomDumperLocation, item);
item->setSettingsKey("DebugMode", "CustomDumperLocation");
instance->insertItem(UseCustomDebuggingHelperLocation, item);
item->setSettingsKey("DebugMode", "CustomDebuggingHelperLocation");
item->setCheckable(true);
item = new SavedAction(instance);
instance->insertItem(CustomDumperLocation, item);
item->setSettingsKey("DebugMode", "CustomDumperLocation");
instance->insertItem(CustomDebuggingHelperLocation, item);
item->setSettingsKey("DebugMode", "CustomDebuggingHelperLocation");
item = new SavedAction(instance);
instance->insertItem(DebugDumpers, item);
item->setSettingsKey("DebugMode", "DebugDumpers");
item->setText(QObject::tr("Debug data dumpers"));
instance->insertItem(DebugDebuggingHelpers, item);
item->setSettingsKey("DebugMode", "DebugDebuggingHelpers");
item->setText(QObject::tr("Debug debugging helper"));
item->setCheckable(true);
item = new SavedAction(instance);
item->setText(QObject::tr("Recheck custom dumper availability"));
instance->insertItem(RecheckDumpers, item);
item->setText(QObject::tr("Recheck debugging helper availability"));
instance->insertItem(RecheckDebuggingHelpers, item);
//
// Breakpoints

View File

@@ -92,11 +92,11 @@ enum DebuggerActionCode
ExpandItem,
CollapseItem,
RecheckDumpers,
UseDumpers,
UseCustomDumperLocation,
CustomDumperLocation,
DebugDumpers,
RecheckDebuggingHelpers,
UseDebuggingHelpers,
UseCustomDebuggingHelperLocation,
CustomDebuggingHelperLocation,
DebugDebuggingHelpers,
// Source List
ListSourceFiles,

View File

@@ -278,7 +278,7 @@ void DebuggerManager::init()
connect(m_watchHandler, SIGNAL(setSessionValueRequested(QString,QVariant)),
this, SIGNAL(setSessionValueRequested(QString,QVariant)));
connect(theDebuggerAction(AssignValue), SIGNAL(triggered()),
this, SLOT(assignValueInDebugger()));
this, SLOT(assignValueInDebugger()), Qt::QueuedConnection);
// Tooltip
QTreeView *tooltipView = qobject_cast<QTreeView *>(m_tooltipWindow);

View File

@@ -321,23 +321,23 @@ QWidget *GdbOptionPage::createPage(QWidget *parent)
///////////////////////////////////////////////////////////////////////
//
// DumperOptionPage
// DebuggingHelperOptionPage
//
///////////////////////////////////////////////////////////////////////
namespace Debugger {
namespace Internal {
class DumperOptionPage : public Core::IOptionsPage
class DebuggingHelperOptionPage : public Core::IOptionsPage
{
Q_OBJECT
public:
DumperOptionPage() {}
DebuggingHelperOptionPage() {}
// IOptionsPage
QString id() const { return QLatin1String("DataDumper"); }
QString trName() const { return tr("Data Dumper"); }
QString id() const { return QLatin1String("DebuggingHelper"); }
QString trName() const { return tr("Debugging Helper"); }
QString category() const { return QLatin1String("Debugger"); }
QString trCategory() const { return tr("Debugger"); }
@@ -349,39 +349,39 @@ private:
Q_SLOT void updateState();
friend class DebuggerPlugin;
Ui::DumperOptionPage m_ui;
Ui::DebuggingHelperOptionPage m_ui;
Core::Utils::SavedActionSet m_group;
};
QWidget *DumperOptionPage::createPage(QWidget *parent)
QWidget *DebuggingHelperOptionPage::createPage(QWidget *parent)
{
QWidget *w = new QWidget(parent);
m_ui.setupUi(w);
m_ui.dumperLocationChooser->setExpectedKind(Core::Utils::PathChooser::Command);
m_ui.dumperLocationChooser->setPromptDialogTitle(tr("Choose Dumper Location"));
m_ui.dumperLocationChooser->setPromptDialogTitle(tr("Choose DebuggingHelper Location"));
m_ui.dumperLocationChooser->setInitialBrowsePathBackup(
Core::ICore::instance()->resourcePath() + "../../lib");
connect(m_ui.checkBoxUseDumpers, SIGNAL(toggled(bool)),
connect(m_ui.checkBoxUseDebuggingHelpers, SIGNAL(toggled(bool)),
this, SLOT(updateState()));
connect(m_ui.checkBoxUseCustomDumperLocation, SIGNAL(toggled(bool)),
connect(m_ui.checkBoxUseCustomDebuggingHelperLocation, SIGNAL(toggled(bool)),
this, SLOT(updateState()));
m_group.clear();
m_group.insert(theDebuggerAction(UseDumpers),
m_ui.checkBoxUseDumpers);
m_group.insert(theDebuggerAction(UseCustomDumperLocation),
m_ui.checkBoxUseCustomDumperLocation);
m_group.insert(theDebuggerAction(CustomDumperLocation),
m_group.insert(theDebuggerAction(UseDebuggingHelpers),
m_ui.checkBoxUseDebuggingHelpers);
m_group.insert(theDebuggerAction(UseCustomDebuggingHelperLocation),
m_ui.checkBoxUseCustomDebuggingHelperLocation);
m_group.insert(theDebuggerAction(CustomDebuggingHelperLocation),
m_ui.dumperLocationChooser);
m_group.insert(theDebuggerAction(DebugDumpers),
m_ui.checkBoxDebugDumpers);
m_group.insert(theDebuggerAction(DebugDebuggingHelpers),
m_ui.checkBoxDebugDebuggingHelpers);
m_ui.dumperLocationChooser->
setEnabled(theDebuggerAction(UseCustomDumperLocation)->value().toBool());
setEnabled(theDebuggerAction(UseCustomDebuggingHelperLocation)->value().toBool());
#ifndef QT_DEBUG
#if 0
@@ -396,13 +396,13 @@ QWidget *DumperOptionPage::createPage(QWidget *parent)
return w;
}
void DumperOptionPage::updateState()
void DebuggingHelperOptionPage::updateState()
{
m_ui.checkBoxUseCustomDumperLocation->setEnabled(
m_ui.checkBoxUseDumpers->isChecked());
m_ui.checkBoxUseCustomDebuggingHelperLocation->setEnabled(
m_ui.checkBoxUseDebuggingHelpers->isChecked());
m_ui.dumperLocationChooser->setEnabled(
m_ui.checkBoxUseDumpers->isChecked()
&& m_ui.checkBoxUseCustomDumperLocation->isChecked());
m_ui.checkBoxUseDebuggingHelpers->isChecked()
&& m_ui.checkBoxUseCustomDebuggingHelperLocation->isChecked());
}
} // namespace Internal
@@ -652,7 +652,7 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
// FIXME:
m_generalOptionPage = new GdbOptionPage;
addObject(m_generalOptionPage);
m_dumperOptionPage = new DumperOptionPage;
m_dumperOptionPage = new DebuggingHelperOptionPage;
addObject(m_dumperOptionPage);
m_locationMark = 0;

View File

@@ -57,7 +57,7 @@ namespace Internal {
class DebuggerManager;
class DebugMode;
class GdbOptionPage;
class DumperOptionPage;
class DebuggingHelperOptionPage;
class LocationMark;
class DebuggerPlugin : public ExtensionSystem::IPlugin
@@ -102,14 +102,14 @@ private:
friend class DebuggerManager;
friend class GdbOptionPage;
friend class DumperOptionPage;
friend class DebuggingHelperOptionPage;
friend class DebugMode; // FIXME: Just a hack now so that it can access the views
DebuggerManager *m_manager;
DebugMode *m_debugMode;
GdbOptionPage *m_generalOptionPage;
DumperOptionPage *m_dumperOptionPage;
DebuggingHelperOptionPage *m_dumperOptionPage;
QString m_previousMode;
LocationMark *m_locationMark;

View File

@@ -1,6 +1,6 @@
TEMPLATE = lib
TARGET = Dumper
TARGET = DebuggingHelper
CONFIG += shared
DESTDIR = ../../../bin
include(../../qworkbenchlibrary.pri)

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DumperOptionPage</class>
<widget class="QWidget" name="DumperOptionPage">
<class>DebuggingHelperOptionPage</class>
<widget class="QWidget" name="DebuggingHelperOptionPage">
<property name="geometry">
<rect>
<x>0</x>
@@ -15,12 +15,12 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="checkBoxUseDumpers">
<widget class="QCheckBox" name="checkBoxUseDebuggingHelpers">
<property name="toolTip">
<string>This will enable nice display of Qt and Standard Library objects in the Locals&amp;Watchers view</string>
</property>
<property name="text">
<string>Use data dumpers</string>
<string>Use debugging helper</string>
</property>
</widget>
</item>
@@ -43,12 +43,12 @@
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkBoxUseCustomDumperLocation">
<widget class="QCheckBox" name="checkBoxUseCustomDebuggingHelperLocation">
<property name="toolTip">
<string>This will load a dumper library</string>
</property>
<property name="text">
<string>Use dumpers from custom location</string>
<string>Use debugging helper from custom location</string>
</property>
</widget>
</item>
@@ -73,7 +73,7 @@
</spacer>
</item>
<item>
<widget class="QLabel" name="labelDumperLocation">
<widget class="QLabel" name="labelDebuggingHelperLocation">
<property name="text">
<string>Location: </string>
</property>
@@ -85,12 +85,12 @@
</layout>
</item>
<item>
<widget class="QCheckBox" name="checkBoxDebugDumpers">
<widget class="QCheckBox" name="checkBoxDebugDebuggingHelpers">
<property name="toolTip">
<string notr="true">This is an internal tool to make debugging the Custom Data Dumper code easier. Using this action is in general not needed unless you want do debug Qt Creator itself.</string>
<string notr="true">This is an internal tool to make debugging the debugging helper code easier. Using this action is in general not needed unless you want do debug Qt Creator itself.</string>
</property>
<property name="text">
<string>Debug custom dumpers</string>
<string>Debug debugging helper</string>
</property>
</widget>
</item>
@@ -108,13 +108,8 @@
</spacer>
</item>
</layout>
<zorder>checkBoxDebugDumpers</zorder>
<zorder>checkBoxUseDumpers</zorder>
<zorder>checkBoxUseDefaultDumperLocation</zorder>
<zorder>horizontalSpacer</zorder>
<zorder>labelDumperLocation</zorder>
<zorder>horizontalSpacer_2</zorder>
<zorder>labelDumperLocation</zorder>
<zorder>checkBoxDebugDebuggingHelpers</zorder>
<zorder>checkBoxUseDebuggingHelpers</zorder>
</widget>
<customwidgets>
<customwidget>

View File

@@ -115,7 +115,7 @@ enum GdbCommandType
GdbInfoShared,
GdbInfoProc,
GdbInfoThreads,
GdbQueryDataDumper,
GdbQueryDebuggingHelper,
GdbTemporaryContinue,
GdbTargetCore,
@@ -147,11 +147,11 @@ enum GdbCommandType
WatchVarCreate,
WatchEvaluateExpression,
WatchToolTip,
WatchDumpCustomSetup,
WatchDumpCustomValue1, // waiting for gdb ack
WatchDumpCustomValue2, // waiting for actual data
WatchDumpCustomValue3, // macro based
WatchDumpCustomEditValue,
WatchDebuggingHelperSetup,
WatchDebuggingHelperValue1, // waiting for gdb ack
WatchDebuggingHelperValue2, // waiting for actual data
WatchDebuggingHelperValue3, // macro based
WatchDebuggingHelperEditValue,
};
static int &currentToken()
@@ -211,12 +211,12 @@ void GdbEngine::initializeConnections()
q, SLOT(showApplicationOutput(QString)),
Qt::QueuedConnection);
connect(theDebuggerAction(UseDumpers), SIGNAL(valueChanged(QVariant)),
this, SLOT(setUseDumpers(QVariant)));
connect(theDebuggerAction(DebugDumpers), SIGNAL(valueChanged(QVariant)),
this, SLOT(setDebugDumpers(QVariant)));
connect(theDebuggerAction(RecheckDumpers), SIGNAL(triggered()),
this, SLOT(recheckCustomDumperAvailability()));
connect(theDebuggerAction(UseDebuggingHelpers), SIGNAL(valueChanged(QVariant)),
this, SLOT(setUseDebuggingHelpers(QVariant)));
connect(theDebuggerAction(DebugDebuggingHelpers), SIGNAL(valueChanged(QVariant)),
this, SLOT(setDebugDebuggingHelpers(QVariant)));
connect(theDebuggerAction(RecheckDebuggingHelpers), SIGNAL(triggered()),
this, SLOT(recheckDebuggingHelperAvailability()));
connect(theDebuggerAction(FormatHexadecimal), SIGNAL(triggered()),
this, SLOT(reloadRegisters()));
@@ -237,7 +237,7 @@ void GdbEngine::initializeConnections()
void GdbEngine::initializeVariables()
{
m_dataDumperState = DataDumperUninitialized;
m_debuggingHelperState = DebuggingHelperUninitialized;
m_gdbVersion = 100;
m_gdbBuildVersion = -1;
@@ -377,18 +377,18 @@ void GdbEngine::handleResponse(const QByteArray &buff)
GdbMi record;
while (from != to) {
GdbMi data;
if (*from == ',') {
++from; // skip ','
data.parseResultOrValue(from, to);
if (data.isValid()) {
//qDebug() << "parsed response: " << data.toString();
record.m_children += data;
record.m_type = GdbMi::Tuple;
}
} else {
if (*from != ',') {
// happens on archer where we get
// 23^running <NL> *running,thread-id="all" <NL> (gdb)
record.m_type = GdbMi::Tuple;
break;
}
++from; // skip ','
data.parseResultOrValue(from, to);
if (data.isValid()) {
//qDebug() << "parsed response: " << data.toString();
record.m_children += data;
record.m_type = GdbMi::Tuple;
}
}
if (asyncClass == "stopped") {
@@ -766,8 +766,8 @@ void GdbEngine::handleResult(const GdbResultRecord & record, int type,
case GdbInfoShared:
handleInfoShared(record);
break;
case GdbQueryDataDumper:
handleQueryDataDumper(record);
case GdbQueryDebuggingHelper:
handleQueryDebuggingHelper(record);
break;
case GdbTemporaryContinue:
continueInferior();
@@ -846,19 +846,19 @@ void GdbEngine::handleResult(const GdbResultRecord & record, int type,
case WatchToolTip:
handleToolTip(record, cookie.toString());
break;
case WatchDumpCustomValue1:
handleDumpCustomValue1(record, cookie.value<WatchData>());
case WatchDebuggingHelperValue1:
handleDebuggingHelperValue1(record, cookie.value<WatchData>());
break;
case WatchDumpCustomValue2:
handleDumpCustomValue2(record, cookie.value<WatchData>());
case WatchDebuggingHelperValue2:
handleDebuggingHelperValue2(record, cookie.value<WatchData>());
break;
case WatchDumpCustomValue3:
handleDumpCustomValue3(record, cookie.value<WatchData>());
case WatchDebuggingHelperValue3:
handleDebuggingHelperValue3(record, cookie.value<WatchData>());
break;
case WatchDumpCustomSetup:
handleDumpCustomSetup(record);
case WatchDebuggingHelperSetup:
handleDebuggingHelperSetup(record);
break;
default:
@@ -913,7 +913,7 @@ void GdbEngine::handleTargetCore(const GdbResultRecord &record)
//
qq->reloadRegisters();
// Gdb-Macro based Dumpers
// Gdb-Macro based DebuggingHelpers
sendCommand(
"define qdumpqstring\n"
"set $i = 0\n"
@@ -1104,10 +1104,10 @@ void GdbEngine::handleAqcuiredInferior()
#endif
if (theDebuggerBoolSetting(ListSourceFiles))
reloadSourceFiles();
tryLoadCustomDumpers();
tryLoadDebuggingHelpers();
#ifndef Q_OS_MAC
// intentionally after tryLoadCustomDumpers(),
// intentionally after tryLoadDebuggingHelpers(),
// otherwise we'd interupt solib loading.
if (theDebuggerBoolSetting(AllPluginBreakpoints)) {
sendCommand("set auto-solib-add on");
@@ -1216,7 +1216,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
return;
}
//tryLoadCustomDumpers();
//tryLoadDebuggingHelpers();
// jump over well-known frames
static int stepCounter = 0;
@@ -1523,7 +1523,7 @@ void GdbEngine::exitDebugger()
m_outputCollector.shutdown();
initializeVariables();
//q->settings()->m_debugDumpers = false;
//q->settings()->m_debugDebuggingHelpers = false;
}
@@ -1631,7 +1631,7 @@ bool GdbEngine::startDebugger()
// otherwise program doesn't know.
// Pass and Stop may be combined.
// We need "print" as otherwise we would get no feedback whatsoever
// Custom Dumper crashs which happen regularily for when accessing
// Custom DebuggingHelper crashs which happen regularily for when accessing
// uninitialized variables.
sendCommand("handle SIGSEGV nopass stop print");
@@ -1755,7 +1755,7 @@ void GdbEngine::handleAttach()
handleAqcuiredInferior();
q->resetLocation();
recheckCustomDumperAvailability();
recheckDebuggingHelperAvailability();
//
// Stack
@@ -1872,7 +1872,7 @@ void GdbEngine::setTokenBarrier()
m_oldestAcceptableToken = currentToken();
}
void GdbEngine::setDebugDumpers(const QVariant &on)
void GdbEngine::setDebugDebuggingHelpers(const QVariant &on)
{
if (on.toBool()) {
debugMessage("SWITCHING ON DUMPER DEBUGGING");
@@ -2698,7 +2698,7 @@ void GdbEngine::setToolTipExpression(const QPoint &pos, const QString &exp0)
return;
}
if (theDebuggerBoolSetting(DebugDumpers)) {
if (theDebuggerBoolSetting(DebugDebuggingHelpers)) {
// minimize interference
return;
}
@@ -2812,40 +2812,35 @@ static QString quoteUnprintableLatin1(const QByteArray &ba)
return res;
}
static QString decodeData(QByteArray ba, int encoding)
{
switch (encoding) {
case 0: // unencoded 8 bit data
return quoteUnprintableLatin1(ba);
case 1: // base64 encoded 8 bit data, used for QByteArray
ba = QByteArray::fromBase64(ba);
return '"' + quoteUnprintableLatin1(ba) + '"';
case 2: // base64 encoded 16 bit data, used for QString
ba = QByteArray::fromBase64(ba);
return '"' + QString::fromUtf16((ushort *)ba.data(), ba.size() / 2) + '"';
case 3: // base64 encoded 32 bit data
ba = QByteArray::fromBase64(ba);
return '"' + QString::fromUcs4((uint *)ba.data(), ba.size() / 4) + '"';
break;
case 4: // base64 encoded 16 bit data, without quotes (see 2)
ba = QByteArray::fromBase64(ba);
return QString::fromUtf16((ushort *)ba.data(), ba.size() / 2);
}
return "<Encoding error>";
}
static void setWatchDataValue(WatchData &data, const GdbMi &mi,
int encoding = 0)
{
if (mi.isValid()) {
QByteArray ba;
QString str;
switch (encoding) {
case 0: // unencoded 8 bit data
ba = mi.data();
str = quoteUnprintableLatin1(ba);
break;
case 1: // base64 encoded 8 bit data, used for QByteArray
ba = QByteArray::fromBase64(mi.data());
str = '"' + quoteUnprintableLatin1(ba) + '"';
break;
case 2: // base64 encoded 16 bit data, used for QString
ba = QByteArray::fromBase64(mi.data());
str = QString::fromUtf16((ushort *)ba.data(), ba.size() / 2);
str = '"' + str + '"';
break;
case 3: // base64 encoded 32 bit data
ba = QByteArray::fromBase64(mi.data());
str = QString::fromUcs4((uint *)ba.data(), ba.size() / 4);
str = '"' + str + '"';
break;
case 4: // base64 encoded 16 bit data, without quotes (see 2)
ba = QByteArray::fromBase64(mi.data());
str = QString::fromUtf16((ushort *)ba.data(), ba.size() / 2);
break;
}
data.setValue(str);
} else {
if (mi.isValid())
data.setValue(decodeData(mi.data(), encoding));
else
data.setValueNeeded();
}
}
static void setWatchDataEditValue(WatchData &data, const GdbMi &mi)
@@ -2901,7 +2896,7 @@ static void setWatchDataSAddress(WatchData &data, const GdbMi &mi)
data.saddr = mi.data();
}
void GdbEngine::setUseDumpers(const QVariant &on)
void GdbEngine::setUseDebuggingHelpers(const QVariant &on)
{
qDebug() << "SWITCHING ON/OFF DUMPER DEBUGGING:" << on;
// FIXME: a bit too harsh, but otherwise the treeview sometimes look funny
@@ -2910,9 +2905,9 @@ void GdbEngine::setUseDumpers(const QVariant &on)
updateLocals();
}
bool GdbEngine::isCustomValueDumperAvailable(const QString &type) const
bool GdbEngine::hasDebuggingHelperForType(const QString &type) const
{
if (!theDebuggerBoolSetting(UseDumpers))
if (!theDebuggerBoolSetting(UseDebuggingHelpers))
return false;
if (q->startMode() == AttachCore) {
@@ -2921,15 +2916,15 @@ bool GdbEngine::isCustomValueDumperAvailable(const QString &type) const
|| type == "QStringList" || type.endsWith("::QStringList");
}
if (theDebuggerBoolSetting(DebugDumpers)
&& qq->stackHandler()->isDebuggingDumpers())
if (theDebuggerBoolSetting(DebugDebuggingHelpers)
&& qq->stackHandler()->isDebuggingDebuggingHelpers())
return false;
if (m_dataDumperState != DataDumperAvailable)
if (m_debuggingHelperState != DebuggingHelperAvailable)
return false;
// simple types
if (m_availableSimpleDumpers.contains(type))
if (m_availableSimpleDebuggingHelpers.contains(type))
return true;
// templates
@@ -2937,10 +2932,10 @@ bool GdbEngine::isCustomValueDumperAvailable(const QString &type) const
QString inner;
if (!extractTemplate(type, &tmplate, &inner))
return false;
return m_availableSimpleDumpers.contains(tmplate);
return m_availableSimpleDebuggingHelpers.contains(tmplate);
}
void GdbEngine::runDirectDumper(const WatchData &data, bool dumpChildren)
void GdbEngine::runDirectDebuggingHelper(const WatchData &data, bool dumpChildren)
{
Q_UNUSED(dumpChildren);
QString type = data.type;
@@ -2953,17 +2948,17 @@ void GdbEngine::runDirectDumper(const WatchData &data, bool dumpChildren)
QVariant var;
var.setValue(data);
sendSynchronizedCommand(cmd, WatchDumpCustomValue3, var);
sendSynchronizedCommand(cmd, WatchDebuggingHelperValue3, var);
q->showStatusMessage(
tr("Retrieving data for watch view (%1 requests pending)...")
.arg(m_pendingRequests + 1), 10000);
}
void GdbEngine::runCustomDumper(const WatchData &data0, bool dumpChildren)
void GdbEngine::runDebuggingHelper(const WatchData &data0, bool dumpChildren)
{
if (q->startMode() == AttachCore) {
runDirectDumper(data0, dumpChildren);
runDirectDebuggingHelper(data0, dumpChildren);
return;
}
WatchData data = data0;
@@ -3112,14 +3107,14 @@ void GdbEngine::runCustomDumper(const WatchData &data0, bool dumpChildren)
QVariant var;
var.setValue(data);
sendSynchronizedCommand(cmd, WatchDumpCustomValue1, var);
sendSynchronizedCommand(cmd, WatchDebuggingHelperValue1, var);
q->showStatusMessage(
tr("Retrieving data for watch view (%1 requests pending)...")
.arg(m_pendingRequests + 1), 10000);
// retrieve response
sendSynchronizedCommand("p (char*)qDumpOutBuffer", WatchDumpCustomValue2, var);
sendSynchronizedCommand("p (char*)qDumpOutBuffer", WatchDebuggingHelperValue2, var);
}
void GdbEngine::createGdbVariable(const WatchData &data)
@@ -3171,7 +3166,7 @@ void GdbEngine::updateSubItem(const WatchData &data0)
// a common case that can be easily solved
if (data.isChildrenNeeded() && isPointerType(data.type)
&& !isCustomValueDumperAvailable(data.type)) {
&& !hasDebuggingHelperForType(data.type)) {
// We sometimes know what kind of children pointers have
#if DEBUG_SUBITEM
qDebug() << "IT'S A POINTER";
@@ -3189,11 +3184,11 @@ void GdbEngine::updateSubItem(const WatchData &data0)
return;
}
if (data.isValueNeeded() && isCustomValueDumperAvailable(data.type)) {
if (data.isValueNeeded() && hasDebuggingHelperForType(data.type)) {
#if DEBUG_SUBITEM
qDebug() << "UPDATE SUBITEM: CUSTOMVALUE";
#endif
runCustomDumper(data, qq->watchHandler()->isExpandedIName(data.iname));
runDebuggingHelper(data, qq->watchHandler()->isExpandedIName(data.iname));
return;
}
@@ -3229,11 +3224,11 @@ void GdbEngine::updateSubItem(const WatchData &data0)
return;
}
if (data.isChildrenNeeded() && isCustomValueDumperAvailable(data.type)) {
if (data.isChildrenNeeded() && hasDebuggingHelperForType(data.type)) {
#if DEBUG_SUBITEM
qDebug() << "UPDATE SUBITEM: CUSTOMVALUE WITH CHILDREN";
#endif
runCustomDumper(data, true);
runDebuggingHelper(data, true);
return;
}
@@ -3254,11 +3249,11 @@ void GdbEngine::updateSubItem(const WatchData &data0)
return;
}
if (data.isChildCountNeeded() && isCustomValueDumperAvailable(data.type)) {
if (data.isChildCountNeeded() && hasDebuggingHelperForType(data.type)) {
#if DEBUG_SUBITEM
qDebug() << "UPDATE SUBITEM: CUSTOMVALUE WITH CHILDREN";
#endif
runCustomDumper(data, qq->watchHandler()->isExpandedIName(data.iname));
runDebuggingHelper(data, qq->watchHandler()->isExpandedIName(data.iname));
return;
}
@@ -3339,7 +3334,7 @@ void GdbEngine::updateWatchModel2()
}
}
void GdbEngine::handleQueryDataDumper(const GdbResultRecord &record)
void GdbEngine::handleQueryDebuggingHelper(const GdbResultRecord &record)
{
//qDebug() << "DATA DUMPER TRIAL:" << record.toString();
GdbMi output = record.data.findChild("consolestreamoutput");
@@ -3367,11 +3362,11 @@ void GdbEngine::handleQueryDataDumper(const GdbResultRecord &record)
//qDebug() << "CONTENTS: " << contents.toString();
//qDebug() << "SIMPLE DUMPERS: " << simple.toString();
m_availableSimpleDumpers.clear();
m_availableSimpleDebuggingHelpers.clear();
foreach (const GdbMi &item, simple.children())
m_availableSimpleDumpers.append(item.data());
if (m_availableSimpleDumpers.isEmpty()) {
m_dataDumperState = DataDumperUnavailable;
m_availableSimpleDebuggingHelpers.append(item.data());
if (m_availableSimpleDebuggingHelpers.isEmpty()) {
m_debuggingHelperState = DebuggingHelperUnavailable;
QMessageBox::warning(q->mainWindow(),
tr("Cannot find special data dumpers"),
tr("The debugged binary does not contain information needed for "
@@ -3381,11 +3376,11 @@ void GdbEngine::handleQueryDataDumper(const GdbResultRecord &record)
"into your project directly.")
);
} else {
m_dataDumperState = DataDumperAvailable;
m_debuggingHelperState = DebuggingHelperAvailable;
q->showStatusMessage(tr("%1 custom dumpers found.")
.arg(m_availableSimpleDumpers.size()));
.arg(m_availableSimpleDebuggingHelpers.size()));
}
//qDebug() << "DATA DUMPERS AVAILABLE" << m_availableSimpleDumpers;
//qDebug() << "DATA DUMPERS AVAILABLE" << m_availableSimpleDebuggingHelpers;
}
void GdbEngine::sendWatchParameters(const QByteArray &params0)
@@ -3436,7 +3431,7 @@ void GdbEngine::handleVarCreate(const GdbResultRecord &record,
if (record.resultClass == GdbResultDone) {
data.variable = data.iname;
setWatchDataType(data, record.data.findChild("type"));
if (isCustomValueDumperAvailable(data.type)) {
if (hasDebuggingHelperForType(data.type)) {
// we do not trust gdb if we have a custom dumper
if (record.data.findChild("children").isValid())
data.setChildrenUnneeded();
@@ -3484,7 +3479,7 @@ void GdbEngine::handleEvaluateExpression(const GdbResultRecord &record,
//updateWatchModel2();
}
void GdbEngine::handleDumpCustomSetup(const GdbResultRecord &record)
void GdbEngine::handleDebuggingHelperSetup(const GdbResultRecord &record)
{
//qDebug() << "CUSTOM SETUP RESULT: " << record.toString();
if (record.resultClass == GdbResultDone) {
@@ -3495,7 +3490,7 @@ void GdbEngine::handleDumpCustomSetup(const GdbResultRecord &record)
}
}
void GdbEngine::handleDumpCustomValue1(const GdbResultRecord &record,
void GdbEngine::handleDebuggingHelperValue1(const GdbResultRecord &record,
const WatchData &data0)
{
WatchData data = data0;
@@ -3510,7 +3505,7 @@ void GdbEngine::handleDumpCustomValue1(const GdbResultRecord &record,
//qDebug() << "CUSTOM DUMPER ERROR MESSAGE: " << msg;
#ifdef QT_DEBUG
// Make debugging of dumpers easier
if (theDebuggerBoolSetting(DebugDumpers)
if (theDebuggerBoolSetting(DebugDebuggingHelpers)
&& msg.startsWith("The program being debugged stopped while")
&& msg.contains("qDumpObjectData440")) {
// Fake full stop
@@ -3527,7 +3522,7 @@ void GdbEngine::handleDumpCustomValue1(const GdbResultRecord &record,
}
}
void GdbEngine::handleDumpCustomValue2(const GdbResultRecord &record,
void GdbEngine::handleDebuggingHelperValue2(const GdbResultRecord &record,
const WatchData &data0)
{
WatchData data = data0;
@@ -3599,17 +3594,16 @@ void GdbEngine::handleDumpCustomValue2(const GdbResultRecord &record,
data1.iname = data.iname + "." + data1.name;
if (!data1.name.isEmpty() && data1.name.at(0).isDigit())
data1.name = '[' + data1.name + ']';
QString key = item.findChild("key").data();
QByteArray key = item.findChild("key").data();
if (!key.isEmpty()) {
if (item.findChild("keyencoded").data()[0] == '1') {
key = '"' + QByteArray::fromBase64(key.toUtf8()) + '"';
if (key.size() > 13) {
key = key.left(12);
key += "...";
}
int encoding = item.findChild("keyencoded").data().toInt();
QString skey = decodeData(key, encoding);
if (skey.size() > 13) {
skey = skey.left(12);
skey += "...";
}
//data1.name += " (" + key + ")";
data1.name = key;
//data1.name += " (" + skey + ")";
data1.name = skey;
}
setWatchDataType(data1, item.findChild("type"));
setWatchDataExpression(data1, item.findChild("exp"));
@@ -3627,7 +3621,7 @@ void GdbEngine::handleDumpCustomValue2(const GdbResultRecord &record,
}
}
void GdbEngine::handleDumpCustomValue3(const GdbResultRecord &record,
void GdbEngine::handleDebuggingHelperValue3(const GdbResultRecord &record,
const WatchData &data0)
{
WatchData data = data0;
@@ -3668,7 +3662,7 @@ void GdbEngine::handleDumpCustomValue3(const GdbResultRecord &record,
QString cmd = "qdumpqstring (" + data1.exp + ")";
QVariant var;
var.setValue(data1);
sendSynchronizedCommand(cmd, WatchDumpCustomValue3, var);
sendSynchronizedCommand(cmd, WatchDebuggingHelperValue3, var);
}
} else {
data.setValue("<unavailable>");
@@ -3932,7 +3926,7 @@ void GdbEngine::handleVarListChildrenHelper(const GdbMi &item,
data.exp = parent.exp + '.' + exp;
}
if (isCustomValueDumperAvailable(data.type)) {
if (hasDebuggingHelperForType(data.type)) {
// we do not trust gdb if we have a custom dumper
data.setValueNeeded();
data.setChildCountNeeded();
@@ -3990,8 +3984,8 @@ void GdbEngine::handleToolTip(const GdbResultRecord &record,
if (what == "create") {
setWatchDataType(m_toolTip, record.data.findChild("type"));
setWatchDataChildCount(m_toolTip, record.data.findChild("numchild"));
if (isCustomValueDumperAvailable(m_toolTip.type))
runCustomDumper(m_toolTip, false);
if (hasDebuggingHelperForType(m_toolTip.type))
runDebuggingHelper(m_toolTip, false);
else
q->showStatusMessage(tr("Retrieving data for tooltip..."), 10000);
sendCommand("-data-evaluate-expression " + m_toolTip.exp,
@@ -4041,18 +4035,18 @@ void GdbEngine::assignValueInDebugger(const QString &expression, const QString &
QString GdbEngine::dumperLibraryName() const
{
if (theDebuggerAction(UseCustomDumperLocation)->value().toBool())
return theDebuggerAction(CustomDumperLocation)->value().toString();
if (theDebuggerAction(UseCustomDebuggingHelperLocation)->value().toBool())
return theDebuggerAction(CustomDebuggingHelperLocation)->value().toString();
return q->m_dumperLib;
}
void GdbEngine::tryLoadCustomDumpers()
void GdbEngine::tryLoadDebuggingHelpers()
{
if (m_dataDumperState != DataDumperUninitialized)
if (m_debuggingHelperState != DebuggingHelperUninitialized)
return;
PENDING_DEBUG("TRY LOAD CUSTOM DUMPERS");
m_dataDumperState = DataDumperUnavailable;
m_debuggingHelperState = DebuggingHelperUnavailable;
QString lib = dumperLibraryName();
//qDebug() << "DUMPERLIB: " << lib;
@@ -4064,44 +4058,44 @@ void GdbEngine::tryLoadCustomDumpers()
return;
}
m_dataDumperState = DataDumperLoadTried;
m_debuggingHelperState = DebuggingHelperLoadTried;
#if defined(Q_OS_WIN)
sendCommand("sharedlibrary .*"); // for LoadLibraryA
//sendCommand("handle SIGSEGV pass stop print");
//sendCommand("set unwindonsignal off");
sendCommand("call LoadLibraryA(\"" + lib + "\")",
WatchDumpCustomSetup);
WatchDebuggingHelperSetup);
sendCommand("sharedlibrary " + dotEscape(lib));
#elif defined(Q_OS_MAC)
//sendCommand("sharedlibrary libc"); // for malloc
//sendCommand("sharedlibrary libdl"); // for dlopen
QString flag = QString::number(RTLD_NOW);
sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")",
WatchDumpCustomSetup);
WatchDebuggingHelperSetup);
//sendCommand("sharedlibrary " + dotEscape(lib));
m_dataDumperState = DataDumperLoadTried;
m_debuggingHelperState = DebuggingHelperLoadTried;
#else
//sendCommand("p dlopen");
QString flag = QString::number(RTLD_NOW);
sendCommand("sharedlibrary libc"); // for malloc
sendCommand("sharedlibrary libdl"); // for dlopen
sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")",
WatchDumpCustomSetup);
WatchDebuggingHelperSetup);
// some older systems like CentOS 4.6 prefer this:
sendCommand("call (void)__dlopen(\"" + lib + "\", " + flag + ")",
WatchDumpCustomSetup);
WatchDebuggingHelperSetup);
sendCommand("sharedlibrary " + dotEscape(lib));
#endif
// retreive list of dumpable classes
sendCommand("call qDumpObjectData440(1,%1+1,0,0,0,0,0,0)");
sendCommand("p (char*)qDumpOutBuffer", GdbQueryDataDumper);
sendCommand("p (char*)qDumpOutBuffer", GdbQueryDebuggingHelper);
}
void GdbEngine::recheckCustomDumperAvailability()
void GdbEngine::recheckDebuggingHelperAvailability()
{
// retreive list of dumpable classes
sendCommand("call qDumpObjectData440(1,%1+1,0,0,0,0,0,0)");
sendCommand("p (char*)qDumpOutBuffer", GdbQueryDataDumper);
sendCommand("p (char*)qDumpOutBuffer", GdbQueryDebuggingHelper);
}
IDebuggerEngine *createGdbEngine(DebuggerManager *parent)

View File

@@ -72,12 +72,12 @@ struct GdbCookie
QVariant cookie;
};
enum DataDumperState
enum DebuggingHelperState
{
DataDumperUninitialized,
DataDumperLoadTried,
DataDumperAvailable,
DataDumperUnavailable,
DebuggingHelperUninitialized,
DebuggingHelperLoadTried,
DebuggingHelperAvailable,
DebuggingHelperUnavailable,
};
@@ -130,8 +130,8 @@ private:
void loadSymbols(const QString &moduleName);
void loadAllSymbols();
Q_SLOT void setDebugDumpers(const QVariant &on);
Q_SLOT void setUseDumpers(const QVariant &on);
Q_SLOT void setDebugDebuggingHelpers(const QVariant &on);
Q_SLOT void setUseDebuggingHelpers(const QVariant &on);
//
// Own stuff
@@ -306,11 +306,11 @@ private:
void handleTypeContents(const QString &output);
void maybeHandleInferiorPidChanged(const QString &pid);
void tryLoadCustomDumpers();
Q_SLOT void recheckCustomDumperAvailability();
void runCustomDumper(const WatchData &data, bool dumpChildren);
void runDirectDumper(const WatchData &data, bool dumpChildren);
bool isCustomValueDumperAvailable(const QString &type) const;
void tryLoadDebuggingHelpers();
Q_SLOT void recheckDebuggingHelperAvailability();
void runDebuggingHelper(const WatchData &data, bool dumpChildren);
void runDirectDebuggingHelper(const WatchData &data, bool dumpChildren);
bool hasDebuggingHelperForType(const QString &type) const;
void handleVarListChildren(const GdbResultRecord &record,
const WatchData &cookie);
@@ -321,15 +321,15 @@ private:
const WatchData &cookie);
void handleToolTip(const GdbResultRecord &record,
const QString &cookie);
void handleQueryDataDumper(const GdbResultRecord &record);
void handleDumpCustomValue1(const GdbResultRecord &record,
void handleQueryDebuggingHelper(const GdbResultRecord &record);
void handleDebuggingHelperValue1(const GdbResultRecord &record,
const WatchData &cookie);
void handleDumpCustomValue2(const GdbResultRecord &record,
void handleDebuggingHelperValue2(const GdbResultRecord &record,
const WatchData &cookie);
void handleDumpCustomValue3(const GdbResultRecord &record,
void handleDebuggingHelperValue3(const GdbResultRecord &record,
const WatchData &cookie);
void handleDumpCustomEditValue(const GdbResultRecord &record);
void handleDumpCustomSetup(const GdbResultRecord &record);
void handleDebuggingHelperEditValue(const GdbResultRecord &record);
void handleDebuggingHelperSetup(const GdbResultRecord &record);
void handleStackListLocals(const GdbResultRecord &record);
void handleStackListArguments(const GdbResultRecord &record);
void handleVarListChildrenHelper(const GdbMi &child,
@@ -340,11 +340,11 @@ private:
QString m_editedData;
int m_pendingRequests;
QStringList m_availableSimpleDumpers;
QStringList m_availableSimpleDebuggingHelpers;
QString m_namespace; // namespace used in "namespaced Qt";
int m_qtVersion; // Qt version used in the debugged program
DataDumperState m_dataDumperState; // state of qt creator dumpers
DebuggingHelperState m_debuggingHelperState;
QList<GdbMi> m_currentFunctionArgs;
QString m_currentFrame;
QMap<QString, QString> m_varToType;

View File

@@ -63,6 +63,13 @@ using namespace Debugger;
using namespace Debugger::Internal;
using namespace Debugger::Constants;
//#define DEBUG_SCRIPT 1
#if DEBUG_SCRIPT
# define SDEBUG(s) qDebug() << s
#else
# define SDEBUG(s)
#endif
# define XSDEBUG(s) qDebug() << s
///////////////////////////////////////////////////////////////////////
//
@@ -100,24 +107,29 @@ ScriptAgent::ScriptAgent(ScriptEngine *debugger, QScriptEngine *script)
void ScriptAgent::contextPop()
{
qDebug() << "ScriptAgent::contextPop: ";
SDEBUG("ScriptAgent::contextPop: ");
}
void ScriptAgent::contextPush()
{
qDebug() << "ScriptAgent::contextPush: ";
SDEBUG("ScriptAgent::contextPush: ");
}
void ScriptAgent::exceptionCatch(qint64 scriptId, const QScriptValue & exception)
{
qDebug() << "ScriptAgent::exceptionCatch: " << scriptId << &exception;
Q_UNUSED(scriptId);
Q_UNUSED(exception);
SDEBUG("ScriptAgent::exceptionCatch: " << scriptId << &exception);
}
void ScriptAgent::exceptionThrow(qint64 scriptId, const QScriptValue &exception,
bool hasHandler)
{
qDebug() << "ScriptAgent::exceptionThrow: " << scriptId << &exception
<< hasHandler;
Q_UNUSED(scriptId);
Q_UNUSED(exception);
Q_UNUSED(hasHandler);
SDEBUG("ScriptAgent::exceptionThrow: " << scriptId << &exception
<< hasHandler);
}
void ScriptAgent::functionEntry(qint64 scriptId)
@@ -128,12 +140,14 @@ void ScriptAgent::functionEntry(qint64 scriptId)
void ScriptAgent::functionExit(qint64 scriptId, const QScriptValue &returnValue)
{
qDebug() << "ScriptAgent::functionExit: " << scriptId << &returnValue;
Q_UNUSED(scriptId);
Q_UNUSED(returnValue);
SDEBUG("ScriptAgent::functionExit: " << scriptId << &returnValue);
}
void ScriptAgent::positionChange(qint64 scriptId, int lineNumber, int columnNumber)
{
//qDebug() << "ScriptAgent::position: " << lineNumber;
SDEBUG("ScriptAgent::position: " << lineNumber);
Q_UNUSED(scriptId);
Q_UNUSED(lineNumber);
Q_UNUSED(columnNumber);
@@ -147,14 +161,14 @@ void ScriptAgent::scriptLoad(qint64 scriptId, const QString &program,
Q_UNUSED(program);
Q_UNUSED(fileName);
Q_UNUSED(baseLineNumber);
//qDebug() << "ScriptAgent::scriptLoad: " << program << fileName
// << baseLineNumber;
SDEBUG("ScriptAgent::scriptLoad: " << program << fileName
<< baseLineNumber);
}
void ScriptAgent::scriptUnload(qint64 scriptId)
{
Q_UNUSED(scriptId);
//qDebug() << "ScriptAgent::scriptUnload: " << scriptId;
SDEBUG("ScriptAgent::scriptUnload: " << scriptId);
}
@@ -181,7 +195,7 @@ ScriptEngine::~ScriptEngine()
void ScriptEngine::executeDebuggerCommand(const QString &command)
{
Q_UNUSED(command);
qDebug() << "FIXME: ScriptEngine::executeDebuggerCommand()";
XSDEBUG("FIXME: ScriptEngine::executeDebuggerCommand()");
}
void ScriptEngine::shutdown()
@@ -191,7 +205,7 @@ void ScriptEngine::shutdown()
void ScriptEngine::exitDebugger()
{
//qDebug() << " ScriptEngine::exitDebugger()";
SDEBUG("ScriptEngine::exitDebugger()");
m_stopped = false;
m_stopOnNextLine = false;
m_scriptEngine->abortEvaluation();
@@ -212,19 +226,69 @@ bool ScriptEngine::startDebugger()
m_scriptContents = stream.readAll();
scriptFile.close();
attemptBreakpointSynchronization();
qq->notifyInferiorRunningRequested();
QTimer::singleShot(0, this, SLOT(runInferior()));
return true;
}
void ScriptEngine::continueInferior()
{
//qDebug() << "ScriptEngine::continueInferior()";
SDEBUG("ScriptEngine::continueInferior()");
m_stopped = false;
m_stopOnNextLine = false;
}
void ScriptEngine::runInferior()
{
//qDebug() << "ScriptEngine::runInferior()";
//QDir dir(QApplication::applicationDirPath());
//if (dir.dirName() == QLatin1String("debug") || dir.dirName() == QLatin1String("release"))
// dir.cdUp();
//dir.cdUp();
//dir.cdUp();
QDir dir("/home/apoenitz/dev/qtscriptgenerator");
if (!dir.cd("plugins")) {
fprintf(stderr, "plugins folder does not exist -- did you build the bindings?\n");
return;
}
QStringList paths = qApp->libraryPaths();
paths << dir.absolutePath();
qApp->setLibraryPaths(paths);
SDEBUG("ScriptEngine::runInferior()");
QStringList extensions;
extensions << "qt.core"
<< "qt.gui"
<< "qt.xml"
<< "qt.svg"
<< "qt.network"
<< "qt.sql"
<< "qt.opengl"
<< "qt.webkit"
<< "qt.xmlpatterns"
<< "qt.uitools";
QStringList failExtensions;
foreach (const QString &ext, extensions) {
QScriptValue ret = m_scriptEngine->importExtension(ext);
if (ret.isError())
failExtensions.append(ext);
}
if (!failExtensions.isEmpty()) {
if (failExtensions.size() == extensions.size()) {
qWarning("Failed to import Qt bindings!\n"
"Plugins directory searched: %s/script\n"
"Make sure that the bindings have been built, "
"and that this executable and the plugins are "
"using compatible Qt libraries.", qPrintable(dir.absolutePath()));
} else {
qWarning("Failed to import some Qt bindings: %s\n"
"Plugins directory searched: %s/script\n"
"Make sure that the bindings have been built, "
"and that this executable and the plugins are "
"using compatible Qt libraries.",
qPrintable(failExtensions.join(", ")), qPrintable(dir.absolutePath()));
}
}
QScriptValue result = m_scriptEngine->evaluate(m_scriptContents, m_scriptFileName);
}
@@ -232,40 +296,40 @@ void ScriptEngine::interruptInferior()
{
m_stopped = false;
m_stopOnNextLine = true;
qDebug() << "FIXME: ScriptEngine::interruptInferior()";
XSDEBUG("ScriptEngine::interruptInferior()");
}
void ScriptEngine::stepExec()
{
//qDebug() << "FIXME: ScriptEngine::stepExec()";
//SDEBUG("ScriptEngine::stepExec()");
m_stopped = false;
m_stopOnNextLine = true;
}
void ScriptEngine::stepIExec()
{
//qDebug() << "FIXME: ScriptEngine::stepIExec()";
//SDEBUG("ScriptEngine::stepIExec()");
m_stopped = false;
m_stopOnNextLine = true;
}
void ScriptEngine::stepOutExec()
{
//qDebug() << "FIXME: ScriptEngine::stepOutExec()";
//SDEBUG("ScriptEngine::stepOutExec()");
m_stopped = false;
m_stopOnNextLine = true;
}
void ScriptEngine::nextExec()
{
//qDebug() << "FIXME: ScriptEngine::nextExec()";
//SDEBUG("ScriptEngine::nextExec()");
m_stopped = false;
m_stopOnNextLine = true;
}
void ScriptEngine::nextIExec()
{
//qDebug() << "FIXME: ScriptEngine::nextIExec()";
//SDEBUG("ScriptEngine::nextIExec()");
m_stopped = false;
m_stopOnNextLine = true;
}
@@ -274,20 +338,20 @@ void ScriptEngine::runToLineExec(const QString &fileName, int lineNumber)
{
Q_UNUSED(fileName);
Q_UNUSED(lineNumber);
qDebug() << "FIXME: ScriptEngine::runToLineExec()";
SDEBUG("FIXME: ScriptEngine::runToLineExec()");
}
void ScriptEngine::runToFunctionExec(const QString &functionName)
{
Q_UNUSED(functionName);
qDebug() << "FIXME: ScriptEngine::runToFunctionExec()";
XSDEBUG("FIXME: ScriptEngine::runToFunctionExec()");
}
void ScriptEngine::jumpToLineExec(const QString &fileName, int lineNumber)
{
Q_UNUSED(fileName);
Q_UNUSED(lineNumber);
qDebug() << "FIXME: ScriptEngine::jumpToLineExec()";
XSDEBUG("FIXME: ScriptEngine::jumpToLineExec()");
}
void ScriptEngine::activateFrame(int index)
@@ -381,7 +445,7 @@ void ScriptEngine::setToolTipExpression(const QPoint &pos, const QString &exp0)
Q_UNUSED(exp0);
if (q->status() != DebuggerInferiorStopped) {
//qDebug() << "SUPPRESSING DEBUGGER TOOLTIP, INFERIOR NOT STOPPED";
//SDEBUG("SUPPRESSING DEBUGGER TOOLTIP, INFERIOR NOT STOPPED");
return;
}
@@ -453,8 +517,9 @@ void ScriptEngine::setToolTipExpression(const QPoint &pos, const QString &exp0)
void ScriptEngine::assignValueInDebugger(const QString &expression,
const QString &value)
{
Q_UNUSED(expression);
Q_UNUSED(value);
XSDEBUG("ASSIGNING: " << expression + '=' + value);
m_scriptEngine->evaluate(expression + '=' + value);
updateLocals();
}
void ScriptEngine::maybeBreakNow(bool byFunction)
@@ -493,7 +558,7 @@ void ScriptEngine::maybeBreakNow(bool byFunction)
return;
// we just run into a breakpoint
//qDebug() << "RESOLVING BREAKPOINT AT " << fileName << lineNumber;
//SDEBUG("RESOLVING BREAKPOINT AT " << fileName << lineNumber);
BreakpointData *data = handler->at(index);
data->bpLineNumber = QString::number(lineNumber);
data->bpFileName = fileName;
@@ -506,9 +571,14 @@ void ScriptEngine::maybeBreakNow(bool byFunction)
qq->notifyInferiorStopped();
q->gotoLocation(fileName, lineNumber, true);
updateLocals();
}
void ScriptEngine::updateLocals()
{
QScriptContext *context = m_scriptEngine->currentContext();
qq->watchHandler()->reinitializeWatchers();
//qDebug() << "UPDATE LOCALS";
//SDEBUG("UPDATE LOCALS");
//
// Build stack
@@ -545,10 +615,10 @@ void ScriptEngine::maybeBreakNow(bool byFunction)
// FIXME: Use an extra thread. This here is evil
m_stopped = true;
while (m_stopped) {
//qDebug() << "LOOPING";
//SDEBUG("LOOPING");
QApplication::processEvents();
}
//qDebug() << "RUNNING AGAIN";
//SDEBUG("RUNNING AGAIN");
}
void ScriptEngine::updateWatchModel()
@@ -567,7 +637,7 @@ void ScriptEngine::updateWatchModel()
void ScriptEngine::updateSubItem(const WatchData &data0)
{
WatchData data = data0;
//qDebug() << "\nUPDATE SUBITEM: " << data.toString();
//SDEBUG("\nUPDATE SUBITEM: " << data.toString());
QTC_ASSERT(data.isValid(), return);
if (data.isTypeNeeded() || data.isValueNeeded()) {
@@ -632,6 +702,7 @@ void ScriptEngine::updateSubItem(const WatchData &data0)
it.next();
WatchData data1;
data1.iname = data.iname + "." + it.name();
data1.exp = it.name();
data1.name = it.name();
data1.scriptValue = it.value();
if (qq->watchHandler()->isExpandedIName(data1.iname))
@@ -641,7 +712,7 @@ void ScriptEngine::updateSubItem(const WatchData &data0)
qq->watchHandler()->insertData(data1);
++numChild;
}
//qDebug() << " ... CHILDREN: " << numChild;
//SDEBUG(" ... CHILDREN: " << numChild);
data.setChildCount(numChild);
data.setChildrenUnneeded();
qq->watchHandler()->insertData(data);
@@ -656,7 +727,7 @@ void ScriptEngine::updateSubItem(const WatchData &data0)
++numChild;
}
data.setChildCount(numChild);
//qDebug() << " ... CHILDCOUNT: " << numChild;
//SDEBUG(" ... CHILDCOUNT: " << numChild);
qq->watchHandler()->insertData(data);
return;
}

View File

@@ -82,7 +82,7 @@ private:
void exitDebugger();
void continueInferior();
void runInferior();
Q_SLOT void runInferior();
void interruptInferior();
void runToLineExec(const QString &fileName, int lineNumber);
@@ -110,6 +110,7 @@ private:
bool supportsThreads() const { return true; }
void maybeBreakNow(bool byFunction);
void updateWatchModel();
void updateLocals();
void updateSubItem(const WatchData &data0);
private:

View File

@@ -183,7 +183,7 @@ QList<StackFrame> StackHandler::frames() const
return m_stackFrames;
}
bool StackHandler::isDebuggingDumpers() const
bool StackHandler::isDebuggingDebuggingHelpers() const
{
for (int i = m_stackFrames.size(); --i >= 0; )
if (m_stackFrames.at(i).function.startsWith("qDumpObjectData"))

View File

@@ -74,7 +74,7 @@ public:
// Called from StackHandler after a new stack list has been received
void removeAll();
QAbstractItemModel *stackModel() { return this; }
bool isDebuggingDumpers() const;
bool isDebuggingDebuggingHelpers() const;
private:
// QAbstractTableModel

View File

@@ -493,6 +493,14 @@ QVariant WatchHandler::data(const QModelIndex &idx, int role) const
return QVariant();
}
bool WatchHandler::setData(const QModelIndex &index, const QVariant &value, int role)
{
Q_UNUSED(role);
Q_UNUSED(value);
emit dataChanged(index, index);
return true;
}
Qt::ItemFlags WatchHandler::flags(const QModelIndex &idx) const
{
using namespace Qt;

View File

@@ -149,6 +149,7 @@ public:
// QAbstractItemModel
//
QVariant data(const QModelIndex &index, int role) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
QModelIndex index(int, int, const QModelIndex &idx) const;
QModelIndex parent(const QModelIndex &idx) const;
int rowCount(const QModelIndex &idx) const;

View File

@@ -64,6 +64,7 @@ public:
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &,
const QModelIndex &) const
{
qDebug() << "CREATE EDITOR";
return new QLineEdit(parent);
}
@@ -77,13 +78,15 @@ public:
lineEdit->setText(index.model()->data(index, ExpressionRole).toString());
}
void setModelData(QWidget *editor, QAbstractItemModel *,
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
//qDebug() << "SET MODEL DATA";
QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
QTC_ASSERT(lineEdit, return);
QString value = lineEdit->text();
QString exp = index.model()->data(index, ExpressionRole).toString();
QString exp = model->data(index, ExpressionRole).toString();
model->setData(index, value, Qt::EditRole);
if (index.column() == 1) {
// the value column
theDebuggerAction(AssignValue)->trigger(exp + '=' + value);
@@ -147,7 +150,9 @@ void WatchWindow::keyPressEvent(QKeyEvent *ev)
QModelIndex idx1 = idx.sibling(idx.row(), 0);
QString exp = model()->data(idx1).toString();
theDebuggerAction(RemoveWatchExpression)->trigger(exp);
} else if (ev->key() == Qt::Key_Return && m_type == LocalsType) {
} else if (ev->key() == Qt::Key_Return
&& ev->modifiers() == Qt::ControlModifier
&& m_type == LocalsType) {
QModelIndex idx = currentIndex();
QModelIndex idx1 = idx.sibling(idx.row(), 0);
QString exp = model()->data(idx1).toString();
@@ -184,8 +189,8 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
menu.addAction(act3);
menu.addSeparator();
menu.addAction(theDebuggerAction(RecheckDumpers));
menu.addAction(theDebuggerAction(UseDumpers));
menu.addAction(theDebuggerAction(RecheckDebuggingHelpers));
menu.addAction(theDebuggerAction(UseDebuggingHelpers));
menu.addSeparator();
menu.addAction(theDebuggerAction(SettingsDialog));
@@ -264,4 +269,3 @@ void WatchWindow::resetHelper(const QModelIndex &idx)
collapse(idx);
}
}

View File

@@ -605,7 +605,7 @@ EventResult FakeVimHandler::Private::handleKey(int key, int unmodified,
void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
{
//qDebug() << "ANCHOR: " << m_anchor;
//qDebug() << "ANCHOR: " << position() << anchor();
if (m_submode == FilterSubMode) {
int beginLine = lineForPosition(anchor());
int endLine = lineForPosition(position());
@@ -921,6 +921,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
} else if (key >= '0' && key <= '9') {
if (key == '0' && m_mvcount.isEmpty()) {
moveToStartOfLine();
setTargetColumn();
finishMovement();
} else {
m_mvcount.append(QChar(key));
@@ -971,9 +972,9 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
} else if (key == '\'') {
m_subsubmode = TickSubSubMode;
} else if (key == '|') {
setAnchor();
moveToStartOfLine();
moveRight(qMin(count(), rightDist()) - 1);
setTargetColumn();
finishMovement();
} else if (key == '!' && m_visualMode == NoVisualMode) {
m_submode = FilterSubMode;
@@ -992,14 +993,16 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
finishMovement();
} else if (key == Key_Home) {
moveToStartOfLine();
setTargetColumn();
finishMovement();
} else if (key == '$' || key == Key_End) {
int submode = m_submode;
moveToEndOfLine();
m_moveType = MoveExclusive;
finishMovement("$");
setTargetColumn();
if (submode == NoSubMode)
m_targetColumn = -1;
finishMovement("$");
} else if (key == ',') {
// FIXME: use some other mechanism
//m_passing = true;

View File

@@ -84,7 +84,7 @@ public slots:
private slots:
void handleExpandCollapseToolButton(bool checked);
void handleJumpToSearchResult(int index, const QString &fileName, int lineNumber,
int searchTermStart, int searchTermLength);
int searchTermStart, int searchTermLength);
private:
void readSettings();

View File

@@ -544,9 +544,11 @@ bool GitClient::synchronousGit(const QString &workingDirectory,
process.setEnvironment(environment.toStringList());
process.start(m_binaryPath, arguments);
if (!process.waitForFinished()) {
if (errorText)
*errorText = "Error: Git timed out";
process.kill();
return false;
}

View File

@@ -65,6 +65,11 @@ BuildManager::BuildManager(ProjectExplorerPlugin *parent)
connect(&m_watcher, SIGNAL(finished()),
this, SLOT(nextBuildQueue()));
connect(&m_watcher, SIGNAL(progressValueChanged(int)),
this, SLOT(progressChanged()));
connect(&m_watcher, SIGNAL(progressRangeChanged(int, int)),
this, SLOT(progressChanged()));
m_outputWindow = new CompileOutputWindow(this);
pm->addObject(m_outputWindow);
@@ -115,7 +120,7 @@ void BuildManager::cancel()
this, SLOT(addToOutputWindow(QString)));
decrementActiveBuildSteps(m_currentBuildStep->project());
m_progressFutureInterface->setProgressValueAndText(m_progress, "Build canceled"); //TODO NBS fix in qtconcurrent
m_progressFutureInterface->setProgressValueAndText(m_progress*100, "Build canceled"); //TODO NBS fix in qtconcurrent
clearBuildQueue();
}
return;
@@ -184,7 +189,7 @@ void BuildManager::startBuildQueue()
connect(progress, SIGNAL(clicked()), this, SLOT(showBuildResults()));
progress->setWidget(new BuildProgress(m_taskWindow));
m_progress = 0;
m_progressFutureInterface->setProgressRange(0, m_maxProgress);
m_progressFutureInterface->setProgressRange(0, m_maxProgress * 100);
m_running = true;
m_canceling = false;
@@ -194,9 +199,9 @@ void BuildManager::startBuildQueue()
nextStep();
} else {
// Already running
m_progressFutureInterface->setProgressRange(0, m_maxProgress);
m_progressFutureInterface->setProgressRange(0, m_maxProgress * 100);
const QString &progressText = tr("Finished %1 of %2 build steps").arg(m_progress).arg(m_maxProgress);
m_progressFutureInterface->setProgressValueAndText(m_progress, progressText);
m_progressFutureInterface->setProgressValueAndText(m_progress*100, progressText);
}
}
@@ -231,7 +236,7 @@ void BuildManager::nextBuildQueue()
++m_progress;
const QString &progressText = tr("Finished %1 of %2 build steps").arg(m_progress).arg(m_maxProgress);
m_progressFutureInterface->setProgressValueAndText(m_progress, progressText);
m_progressFutureInterface->setProgressValueAndText(m_progress*100, progressText);
bool result = m_watcher.result();
if (!result) {
@@ -239,7 +244,7 @@ void BuildManager::nextBuildQueue()
addToOutputWindow(tr("<font color=\"#ff0000\">Error while building project %1</font>").arg(m_currentBuildStep->project()->name()));
addToOutputWindow(tr("<font color=\"#ff0000\">When executing build step '%1'</font>").arg(m_currentBuildStep->displayName()));
// NBS TODO fix in qtconcurrent
m_progressFutureInterface->setProgressValueAndText(m_progress, tr("Error while building project %1").arg(m_currentBuildStep->project()->name()));
m_progressFutureInterface->setProgressValueAndText(m_progress*100, tr("Error while building project %1").arg(m_currentBuildStep->project()->name()));
}
decrementActiveBuildSteps(m_currentBuildStep->project());
@@ -249,6 +254,17 @@ void BuildManager::nextBuildQueue()
clearBuildQueue();
}
void BuildManager::progressChanged()
{
if (!m_progressFutureInterface)
return;
int range = m_watcher.progressMaximum() - m_watcher.progressMinimum();
if (range != 0) {
int percent = (m_watcher.progressValue() - m_watcher.progressMinimum()) * 100 / range;
m_progressFutureInterface->setProgressValue(m_progress * 100 + percent);
}
}
void BuildManager::nextStep()
{
if (!m_buildQueue.empty()) {
@@ -279,8 +295,9 @@ void BuildManager::nextStep()
m_watcher.setFuture(QtConcurrent::run(&BuildStep::run, m_currentBuildStep));
} else {
m_running = false;
m_previousBuildStepProject = 0;
m_previousBuildStepProject = 0;
m_progressFutureInterface->reportFinished();
m_progressWatcher.setFuture(QFuture<void>());
delete m_progressFutureInterface;
m_progressFutureInterface = 0;
m_maxProgress = 0;

View File

@@ -97,6 +97,7 @@ private slots:
void addToOutputWindow(const QString &string);
void nextBuildQueue();
void progressChanged();
void emitCancelMessage();
void showBuildResults();

View File

@@ -602,16 +602,34 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
addAutoReleasedObject(new ProjectTreeWidgetFactory);
addAutoReleasedObject(new FolderNavigationWidgetFactory);
QStringList oldRecentProjects;
if (QSettings *s = core->settings())
m_recentProjects = s->value("ProjectExplorer/RecentProjects/Files", QStringList()).toStringList();
for (QStringList::iterator it = m_recentProjects.begin(); it != m_recentProjects.end(); ) {
oldRecentProjects = s->value("ProjectExplorer/RecentProjects/Files", QStringList()).toStringList();
for (QStringList::iterator it = oldRecentProjects.begin(); it != oldRecentProjects.end(); ) {
if (QFileInfo(*it).isFile()) {
++it;
} else {
it = m_recentProjects.erase(it);
it = oldRecentProjects.erase(it);
}
}
foreach(const QString &s, oldRecentProjects) {
m_recentProjects.append(qMakePair(s, QFileInfo(s).fileName()));
}
// TODO restore recentProjects
if (QSettings *s = core->settings()) {
const QStringList fileNames = s->value("ProjectExplorer/RecentProjects/FileNames").toStringList();
const QStringList displayNames = s->value("ProjectExplorer/RecentProjects/DisplayNames").toStringList();
if (fileNames.size() == displayNames.size()) {
for (int i = 0; i < fileNames.size(); ++i) {
m_recentProjects.append(qMakePair(fileNames.at(i), displayNames.at(i)));
}
}
}
connect(m_sessionManagerAction, SIGNAL(triggered()), this, SLOT(showSessionManager()));
connect(m_newAction, SIGNAL(triggered()), this, SLOT(newProject()));
#if 0
@@ -726,7 +744,7 @@ void ProjectExplorerPlugin::unloadProject()
if (!success)
return;
addToRecentProjects(fi->fileName());
addToRecentProjects(fi->fileName(), m_currentProject->name());
m_session->removeProject(m_currentProject);
updateActions();
}
@@ -822,7 +840,19 @@ void ProjectExplorerPlugin::savePersistentSettings()
QSettings *s = Core::ICore::instance()->settings();
if (s) {
s->setValue("ProjectExplorer/StartupSession", m_session->file()->fileName());
s->setValue("ProjectExplorer/RecentProjects/Files", m_recentProjects);
s->remove("ProjectExplorer/RecentProjects/Files");
QStringList fileNames;
QStringList displayNames;
QList<QPair<QString, QString> >::const_iterator it, end;
end = m_recentProjects.constEnd();
for (it = m_recentProjects.constBegin(); it != end; ++it) {
fileNames << (*it).first;
displayNames << (*it).second;
}
s->setValue("ProjectExplorer/RecentProjects/FileNames", fileNames);
s->setValue("ProjectExplorer/RecentProjects/DisplayNames", displayNames);
}
}
@@ -831,14 +861,15 @@ bool ProjectExplorerPlugin::openProject(const QString &fileName)
if (debug)
qDebug() << "ProjectExplorerPlugin::openProject";
if (openProjects(QStringList() << fileName)) {
addToRecentProjects(fileName);
QList<Project *> list = openProjects(QStringList() << fileName);
if (!list.isEmpty()) {
addToRecentProjects(fileName, list.first()->name());
return true;
}
return false;
}
bool ProjectExplorerPlugin::openProjects(const QStringList &fileNames)
QList<Project *> ProjectExplorerPlugin::openProjects(const QStringList &fileNames)
{
if (debug)
qDebug() << "ProjectExplorerPlugin - opening projects " << fileNames;
@@ -866,7 +897,7 @@ bool ProjectExplorerPlugin::openProjects(const QStringList &fileNames)
if (debug)
qDebug() << "ProjectExplorerPlugin - Could not open any projects!";
QApplication::restoreOverrideCursor();
return false;
return QList<Project *>();
}
foreach (Project *pro, openedPro) {
@@ -886,7 +917,7 @@ bool ProjectExplorerPlugin::openProjects(const QStringList &fileNames)
Core::ModeManager::instance()->activateMode(Core::Constants::MODE_EDIT);
QApplication::restoreOverrideCursor();
return true;
return openedPro;
}
Project *ProjectExplorerPlugin::currentProject() const
@@ -1477,7 +1508,7 @@ void ProjectExplorerPlugin::cancelBuild()
m_buildManager->cancel();
}
void ProjectExplorerPlugin::addToRecentProjects(const QString &fileName)
void ProjectExplorerPlugin::addToRecentProjects(const QString &fileName, const QString &displayName)
{
if (debug)
qDebug() << "ProjectExplorerPlugin::addToRecentProjects(" << fileName << ")";
@@ -1485,10 +1516,17 @@ void ProjectExplorerPlugin::addToRecentProjects(const QString &fileName)
if (fileName.isEmpty())
return;
QString prettyFileName(QDir::toNativeSeparators(fileName));
m_recentProjects.removeAll(prettyFileName);
QList<QPair<QString, QString> >::iterator it;
for(it = m_recentProjects.begin(); it != m_recentProjects.end();)
if ((*it).first == prettyFileName)
it = m_recentProjects.erase(it);
else
++it;
if (m_recentProjects.count() > m_maxRecentProjects)
m_recentProjects.removeLast();
m_recentProjects.prepend(prettyFileName);
m_recentProjects.prepend(qMakePair(prettyFileName, displayName));
QFileInfo fi(prettyFileName);
m_lastOpenDirectory = fi.absolutePath();
}
@@ -1506,11 +1544,15 @@ void ProjectExplorerPlugin::updateRecentProjectMenu()
menu->setEnabled(!m_recentProjects.isEmpty());
//projects (ignore sessions, they used to be in this list)
foreach (const QString &s, m_recentProjects) {
if (s.endsWith(".qws"))
QList<QPair<QString, QString> >::const_iterator it, end;
end = m_recentProjects.constEnd();
for (it = m_recentProjects.constBegin(); it != end; ++it) {
const QPair<QString, QString> &s = *it;
if (s.first.endsWith(".qws"))
continue;
QAction *action = menu->addAction(s);
action->setData(s);
QAction *action = menu->addAction(s.second);
action->setData(s.first);
connect(action, SIGNAL(triggered()), this, SLOT(openRecentProject()));
}
}

View File

@@ -85,7 +85,7 @@ public:
static ProjectExplorerPlugin *instance();
bool openProject(const QString &fileName);
bool openProjects(const QStringList &fileNames);
QList<Project *> openProjects(const QStringList &fileNames);
SessionManager *session() const;
@@ -192,7 +192,7 @@ private:
IRunConfigurationRunner *findRunner(QSharedPointer<RunConfiguration> config, const QString &mode);
void updateActions();
void addToRecentProjects(const QString &fileName);
void addToRecentProjects(const QString &fileName, const QString &displayName);
void updateWelcomePage(Core::Internal::WelcomeMode *welcomeMode);
Internal::ProjectFileFactory *findProjectFileFactory(const QString &filename) const;
@@ -251,7 +251,7 @@ private:
QStringList m_profileMimeTypes;
Internal::OutputPane *m_outputPane;
QStringList m_recentProjects;
QList<QPair<QString, QString> > m_recentProjects; // pair of filename, displayname
static const int m_maxRecentProjects = 7;
QString m_lastOpenDirectory;

View File

@@ -36,7 +36,7 @@
using namespace Qt4ProjectManager::Internal;
#define MAX_VARIABLES 48
#define MAX_VARIABLES 49
const char *const variables[MAX_VARIABLES] = {
"CONFIG",
"DEFINES",
@@ -56,6 +56,7 @@ const char *const variables[MAX_VARIABLES] = {
"OBJECTS",
"OBJECTS_DIR",
"OBJMOC",
"PKGCONFIG",
"POST_TARGETDEPS",
"PRECOMPILED_HEADER",
"PRE_TARGETDEPS",

View File

@@ -37,6 +37,7 @@
#include <coreplugin/icore.h>
#include <coreplugin/messagemanager.h>
#include <coreplugin/variablemanager.h>
#include <coreplugin/ifile.h>
#include <projectexplorer/buildstep.h>
#include <utils/qtcassert.h>
@@ -225,8 +226,9 @@ QWidget *Qt4RunConfiguration::configurationWidget()
void Qt4RunConfiguration::save(PersistentSettingsWriter &writer) const
{
QDir projectDir(QFileInfo(project()->file()->fileName()).absoluteDir());
writer.saveValue("CommandLineArguments", m_commandLineArguments);
writer.saveValue("ProFile", m_proFilePath);
writer.saveValue("ProFile", projectDir.relativeFilePath(m_proFilePath));
writer.saveValue("UserSetName", m_userSetName);
writer.saveValue("UseTerminal", m_runMode == Console);
writer.saveValue("UseDyldImageSuffix", m_isUsingDyldImageSuffix);
@@ -234,10 +236,11 @@ void Qt4RunConfiguration::save(PersistentSettingsWriter &writer) const
}
void Qt4RunConfiguration::restore(const PersistentSettingsReader &reader)
{
{
ApplicationRunConfiguration::restore(reader);
QDir projectDir(QFileInfo(project()->file()->fileName()).absoluteDir());
m_commandLineArguments = reader.restoreValue("CommandLineArguments").toStringList();
m_proFilePath = reader.restoreValue("ProFile").toString();
m_proFilePath = projectDir.filePath(reader.restoreValue("ProFile").toString());
m_userSetName = reader.restoreValue("UserSetName").toBool();
m_runMode = reader.restoreValue("UseTerminal").toBool() ? Console : Gui;
m_isUsingDyldImageSuffix = reader.restoreValue("UseDyldImageSuffix").toBool();

View File

@@ -1424,7 +1424,7 @@ QString QtVersion::buildDebuggingHelperLibrary()
qmake.setWorkingDirectory(directory);
qmake.setProcessChannelMode(QProcess::MergedChannels);
qmake.start(qmakeCommand(), QStringList()<<"-spec"<<"default"<<"gdbmacros.pro");
qmake.start(qmakeCommand(), QStringList()<<"-spec"<< mkspec() <<"gdbmacros.pro");
qmake.waitForFinished();
output += qmake.readAll();

View File

@@ -1,3 +1,32 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at qt-sales@nokia.com.
**
**************************************************************************/
#include "javascriptengine_p.h"
#include "javascriptnodepool_p.h"
#include "javascriptvalue.h"
@@ -10,17 +39,17 @@ namespace JavaScript {
int Ecma::RegExp::flagFromChar(const QChar &ch)
{
static QHash<QChar, int> flagsHash;
if (flagsHash.isEmpty()) {
flagsHash[QLatin1Char('g')] = Global;
flagsHash[QLatin1Char('i')] = IgnoreCase;
flagsHash[QLatin1Char('m')] = Multiline;
}
QHash<QChar, int>::const_iterator it;
it = flagsHash.constFind(ch);
if (it == flagsHash.constEnd())
return 0;
return it.value();
static QHash<QChar, int> flagsHash;
if (flagsHash.isEmpty()) {
flagsHash[QLatin1Char('g')] = Global;
flagsHash[QLatin1Char('i')] = IgnoreCase;
flagsHash[QLatin1Char('m')] = Multiline;
}
QHash<QChar, int>::const_iterator it;
it = flagsHash.constFind(ch);
if (it == flagsHash.constEnd())
return 0;
return it.value();
}
@@ -35,8 +64,8 @@ NodePool::~NodePool()
Code *NodePool::createCompiledCode(AST::Node *, CompilationUnit &)
{
Q_ASSERT(0);
return 0;
Q_ASSERT(0);
return 0;
}
static int toDigit(char c)

View File

@@ -1,3 +1,32 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at qt-sales@nokia.com.
**
**************************************************************************/
#ifndef JAVASCRIPTENGINE_P_H
#define JAVASCRIPTENGINE_P_H
@@ -42,24 +71,24 @@ public:
class JavaScriptNameIdImpl
{
QString _text;
QString _text;
public:
JavaScriptNameIdImpl(const QChar *u, int s)
: _text(u, s)
{ }
JavaScriptNameIdImpl(const QChar *u, int s)
: _text(u, s)
{ }
const QString asString() const
{ return _text; }
const QString asString() const
{ return _text; }
bool operator == (const JavaScriptNameIdImpl &other) const
{ return _text == other._text; }
bool operator == (const JavaScriptNameIdImpl &other) const
{ return _text == other._text; }
bool operator != (const JavaScriptNameIdImpl &other) const
{ return _text != other._text; }
bool operator != (const JavaScriptNameIdImpl &other) const
{ return _text != other._text; }
bool operator < (const JavaScriptNameIdImpl &other) const
{ return _text < other._text; }
bool operator < (const JavaScriptNameIdImpl &other) const
{ return _text < other._text; }
};
inline uint qHash(const JavaScriptNameIdImpl &id)
@@ -67,43 +96,43 @@ inline uint qHash(const JavaScriptNameIdImpl &id)
class JavaScriptEnginePrivate
{
JavaScript::Lexer *_lexer;
JavaScript::NodePool *_nodePool;
JavaScript::AST::Node *_ast;
QSet<JavaScriptNameIdImpl> _literals;
JavaScript::Lexer *_lexer;
JavaScript::NodePool *_nodePool;
JavaScript::AST::Node *_ast;
QSet<JavaScriptNameIdImpl> _literals;
public:
JavaScriptEnginePrivate()
: _lexer(0), _nodePool(0), _ast(0)
{ }
JavaScriptEnginePrivate()
: _lexer(0), _nodePool(0), _ast(0)
{ }
QSet<JavaScriptNameIdImpl> literals() const
{ return _literals; }
QSet<JavaScriptNameIdImpl> literals() const
{ return _literals; }
JavaScriptNameIdImpl *intern(const QChar *u, int s)
{ return const_cast<JavaScriptNameIdImpl *>(&*_literals.insert(JavaScriptNameIdImpl(u, s))); }
JavaScriptNameIdImpl *intern(const QChar *u, int s)
{ return const_cast<JavaScriptNameIdImpl *>(&*_literals.insert(JavaScriptNameIdImpl(u, s))); }
JavaScript::Lexer *lexer() const
{ return _lexer; }
JavaScript::Lexer *lexer() const
{ return _lexer; }
void setLexer(JavaScript::Lexer *lexer)
{ _lexer = lexer; }
void setLexer(JavaScript::Lexer *lexer)
{ _lexer = lexer; }
JavaScript::NodePool *nodePool() const
{ return _nodePool; }
JavaScript::NodePool *nodePool() const
{ return _nodePool; }
void setNodePool(JavaScript::NodePool *nodePool)
{ _nodePool = nodePool; }
void setNodePool(JavaScript::NodePool *nodePool)
{ _nodePool = nodePool; }
JavaScript::AST::Node *ast() const
{ return _ast; }
JavaScript::AST::Node *ast() const
{ return _ast; }
JavaScript::AST::Node *changeAbstractSyntaxTree(JavaScript::AST::Node *node)
{
JavaScript::AST::Node *previousAST = _ast;
_ast = node;
return previousAST;
}
JavaScript::AST::Node *changeAbstractSyntaxTree(JavaScript::AST::Node *node)
{
JavaScript::AST::Node *previousAST = _ast;
_ast = node;
return previousAST;
}
};
QT_END_NAMESPACE

View File

@@ -22,7 +22,7 @@ Qt::CaseSensitivity QtScriptCodeCompletion::caseSensitivity() const
void QtScriptCodeCompletion::setCaseSensitivity(Qt::CaseSensitivity caseSensitivity)
{ m_caseSensitivity = caseSensitivity; }
bool QtScriptCodeCompletion::isValid(TextEditor::ITextEditable *editor)
bool QtScriptCodeCompletion::supportsEditor(TextEditor::ITextEditable *editor)
{
if (qobject_cast<ScriptEditor *>(editor->widget()))
return true;

View File

@@ -21,7 +21,7 @@ public:
Qt::CaseSensitivity caseSensitivity() const;
void setCaseSensitivity(Qt::CaseSensitivity caseSensitivity);
virtual bool isValid(TextEditor::ITextEditable *editor);
virtual bool supportsEditor(TextEditor::ITextEditable *editor);
virtual bool triggersCompletion(TextEditor::ITextEditable *editor);
virtual int startCompletion(TextEditor::ITextEditable *editor);
virtual void completions(QList<TextEditor::CompletionItem> *completions);

View File

@@ -74,14 +74,14 @@ QList<FilterEntry> FileSystemFilter::matchesFor(const QString &entry)
QDir::Name|QDir::IgnoreCase|QDir::LocaleAware);
foreach (const QString &dir, dirs) {
if (dir != "." && (name.isEmpty() || dir.startsWith(name, Qt::CaseInsensitive))) {
FilterEntry entry(this, dir, directory + "/" + dir);
FilterEntry entry(this, dir, dirInfo.filePath(dir));
entry.resolveFileIcon = true;
value.append(entry);
}
}
foreach (const QString &file, files) {
if (name.isEmpty() || file.startsWith(name, Qt::CaseInsensitive)) {
const QString fullPath = directory + "/" + file;
const QString fullPath = dirInfo.filePath(file);
FilterEntry entry(this, file, fullPath);
entry.resolveFileIcon = true;
value.append(entry);

View File

@@ -94,7 +94,7 @@ void CompletionSupport::autoComplete(ITextEditable *editor, bool forced)
m_completionCollector = 0;
foreach (ICompletionCollector *collector, m_completionCollectors) {
if (collector->isValid(editor)) {
if (collector->supportsEditor(editor)) {
m_completionCollector = collector;
break;
}

View File

@@ -80,7 +80,7 @@ public:
/*
* Returns true if this completion collector can be used with the given editor.
*/
virtual bool isValid(ITextEditable *editor) = 0;
virtual bool supportsEditor(ITextEditable *editor) = 0;
/* This method should return whether the cursor is at a position which could
* trigger an autocomplete. It will be called each time a character is typed in

View File

@@ -29,7 +29,10 @@
function cube(a)
{
return a * a * a;
var x = a * a * a;
x = x + 1;
x = x - 1;
return x;
}
var a = cube(3);

View File

@@ -39,6 +39,7 @@
#include <QtCore/QThread>
#include <QtCore/QVariant>
#include <QtCore/QVector>
#include <QtCore/QSharedPointer>
#include <QtGui/QApplication>
#include <QtGui/QAction>
@@ -493,6 +494,11 @@ void testQSet()
//hash.insert(ptr);
}
void testQSharedPointer()
{
}
void stringRefTest(const QString &refstring)
{
Q_UNUSED(refstring);