diff --git a/src/plugins/qmljsinspector/qmljsinspector.cpp b/src/plugins/qmljsinspector/qmljsinspector.cpp index ca637d3856c117b6d51b159022deaf096fccdc29..144c0c0024f0208ad087168ae4e79566c12c7ca4 100644 --- a/src/plugins/qmljsinspector/qmljsinspector.cpp +++ b/src/plugins/qmljsinspector/qmljsinspector.cpp @@ -26,19 +26,581 @@ ** contact the sales department at http://qt.nokia.com/contact. ** **************************************************************************/ - -#include "qmljsinspector.h" #include "qmljsinspectorconstants.h" -#include "qmljsinspectorplugin.h" +#include "qmljsinspector.h" +#include "qmljsclientproxy.h" +#include "qmljsinspectorcontext.h" + +#include <debugger/debuggerrunner.h> +#include <debugger/debuggerconstants.h> +#include <debugger/debuggerengine.h> +#include <debugger/debuggermainwindow.h> +#include <debugger/debuggerplugin.h> +#include <debugger/debuggerrunner.h> +#include <debugger/debuggeruiswitcher.h> +#include <debugger/debuggerconstants.h> + +#include <utils/qtcassert.h> +#include <utils/styledbar.h> +#include <utils/fancymainwindow.h> + +#include <coreplugin/icontext.h> +#include <coreplugin/basemode.h> +#include <coreplugin/findplaceholder.h> +#include <coreplugin/minisplitter.h> +#include <coreplugin/outputpane.h> +#include <coreplugin/rightpane.h> +#include <coreplugin/navigationwidget.h> +#include <coreplugin/icore.h> +#include <coreplugin/coreconstants.h> +#include <coreplugin/uniqueidmanager.h> +#include <coreplugin/actionmanager/actioncontainer.h> +#include <coreplugin/actionmanager/actionmanager.h> +#include <coreplugin/actionmanager/command.h> +#include <coreplugin/editormanager/editormanager.h> + +#include <texteditor/itexteditor.h> +#include <texteditor/basetexteditor.h> + +#include <projectexplorer/runconfiguration.h> +#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/project.h> +#include <projectexplorer/target.h> +#include <projectexplorer/applicationrunconfiguration.h> +#include <qmlprojectmanager/qmlprojectconstants.h> +#include <qmlprojectmanager/qmlprojectrunconfiguration.h> + +#include <extensionsystem/pluginmanager.h> + +#include <private/qdeclarativedebug_p.h> +#include <private/qdeclarativedebugclient_p.h> + +#include <QtCore/QDebug> +#include <QtCore/QStringList> +#include <QtCore/QTimer> +#include <QtCore/QtPlugin> +#include <QtCore/QDateTime> + +#include <QtGui/QToolButton> +#include <QtGui/QToolBar> +#include <QtGui/QBoxLayout> +#include <QtGui/QLabel> +#include <QtGui/QDockWidget> +#include <QtGui/QAction> +#include <QtGui/QLineEdit> +#include <QtGui/QLabel> +#include <QtGui/QSpinBox> +#include <QtGui/QMessageBox> +#include <QtGui/QTextBlock> + +#include <QtNetwork/QHostAddress> + +using namespace QmlJS::AST; using namespace QmlJSInspector::Internal; -using namespace QmlJSInspector::Constants; +using namespace Debugger::Internal; Inspector::Inspector(QObject *parent) - : QObject(parent) + : QObject(parent), + m_connectionTimer(new QTimer(this)), + m_connectionAttempts(0), + m_cppDebuggerState(0), + m_simultaneousCppAndQmlDebugMode(false), + m_debugMode(StandaloneMode) { + m_clientProxy = ClientProxy::instance(); + +#warning set up the context widget + QWidget *contextWidget = 0; + m_context = new Internal::InspectorContext(contextWidget); + + connect(m_clientProxy, SIGNAL(selectedItemsChanged(QList<QDeclarativeDebugObjectReference>)), + SLOT(setSelectedItemsByObjectReference(QList<QDeclarativeDebugObjectReference>))); + + connect(m_clientProxy, SIGNAL(connectionStatusMessage(QString)), SIGNAL(statusMessage(QString))); + connect(m_clientProxy, SIGNAL(connected(QDeclarativeEngineDebug*)), SLOT(connected(QDeclarativeEngineDebug*))); + connect(m_clientProxy, SIGNAL(disconnected()), SLOT(disconnected())); + connect(m_clientProxy, SIGNAL(aboutToReloadEngines()), SLOT(aboutToReloadEngines())); + connect(m_clientProxy, SIGNAL(enginesChanged()), SLOT(updateEngineList())); + connect(m_clientProxy, SIGNAL(aboutToDisconnect()), SLOT(disconnectWidgets())); + + connect(Debugger::DebuggerPlugin::instance(), + SIGNAL(stateChanged(int)), this, SLOT(debuggerStateChanged(int))); + + connect(m_connectionTimer, SIGNAL(timeout()), SLOT(pollInspector())); } Inspector::~Inspector() { + qDebug() << Q_FUNC_INFO; } + +void Inspector::disconnectWidgets() +{ + qDebug() << Q_FUNC_INFO; +} + +void Inspector::disconnected() +{ + qDebug() << Q_FUNC_INFO; + resetViews(); + updateMenuActions(); +} + +void Inspector::aboutToReloadEngines() +{ + qDebug() << Q_FUNC_INFO; +} + +void Inspector::updateEngineList() +{ + qDebug() << Q_FUNC_INFO; + + QList<QDeclarativeDebugEngineReference> engines = m_clientProxy->engines(); + + if (engines.isEmpty()) + qWarning("qmldebugger: no engines found!"); + +#warning update the QML engines combo + if (engines.count() > 0) { + m_clientProxy->queryEngineContext(engines.at(0).debugId()); + } +} + +void Inspector::changeSelectedItem(int engineId, const QDeclarativeDebugObjectReference &objectRef) +{ + Q_UNUSED(engineId); + Q_UNUSED(objectRef); + + qDebug() << "TODO:" << Q_FUNC_INFO; + +#warning implement setSelectedItemByObjectId +} + +void Inspector::shutdown() +{ + qDebug() << Q_FUNC_INFO; +#warning save the inspector settings here +} + +void Inspector::pollInspector() +{ + qDebug() << Q_FUNC_INFO; + ++m_connectionAttempts; + + const QString host = m_runConfigurationDebugData.serverAddress; + const quint16 port = quint16(m_runConfigurationDebugData.serverPort); + + if (m_clientProxy->connectToViewer(host, port)) { +#warning get the QML/JS documents from the snapshot here + m_connectionTimer->stop(); + m_connectionAttempts = 0; + } else if (m_connectionAttempts == MaxConnectionAttempts) { + m_connectionTimer->stop(); + m_connectionAttempts = 0; + + QMessageBox::critical(0, + tr("Failed to connect to debugger"), + tr("Could not connect to debugger server.") ); + } + updateMenuActions(); +} + +bool Inspector::setDebugConfigurationDataFromProject(ProjectExplorer::Project *projectToDebug) +{ + qDebug() << Q_FUNC_INFO; + if (!projectToDebug) { + emit statusMessage(tr("Invalid project, debugging canceled.")); + return false; + } + + QmlProjectManager::QmlProjectRunConfiguration* config = + qobject_cast<QmlProjectManager::QmlProjectRunConfiguration*>(projectToDebug->activeTarget()->activeRunConfiguration()); + if (!config) { + emit statusMessage(tr("Cannot find project run configuration, debugging canceled.")); + return false; + } + m_runConfigurationDebugData.serverAddress = config->debugServerAddress(); + m_runConfigurationDebugData.serverPort = config->debugServerPort(); + m_connectionTimer->setInterval(ConnectionAttemptDefaultInterval); + + return true; +} + +void Inspector::startQmlProjectDebugger() +{ + qDebug() << Q_FUNC_INFO; + m_simultaneousCppAndQmlDebugMode = false; + m_connectionTimer->start(); +} + +void Inspector::resetViews() +{ + qDebug() << Q_FUNC_INFO; +#warning reset the views here +} + +void Inspector::simultaneouslyDebugQmlCppApplication() +{ + qDebug() << Q_FUNC_INFO; + QString errorMessage; + ProjectExplorer::ProjectExplorerPlugin *pex = ProjectExplorer::ProjectExplorerPlugin::instance(); + ProjectExplorer::Project *project = pex->startupProject(); + + if (!project) + errorMessage = tr("No project was found."); + else if (project->id() == QLatin1String("QmlProjectManager.QmlProject")) + errorMessage = attachToQmlViewerAsExternalApp(project); + else + errorMessage = attachToExternalCppAppWithQml(project); + + if (!errorMessage.isEmpty()) + QMessageBox::warning(Core::ICore::instance()->mainWindow(), tr("Failed to debug C++ and QML"), errorMessage); +} + +QString Inspector::attachToQmlViewerAsExternalApp(ProjectExplorer::Project *project) +{ + Q_UNUSED(project); + + qDebug() << "TODO:" << Q_FUNC_INFO; + +#warning implement attachToQmlViewerAsExternalApp + return QString(); + + +#if 0 + m_debugMode = QmlProjectWithCppPlugins; + + QmlProjectManager::QmlProjectRunConfiguration* runConfig = + qobject_cast<QmlProjectManager::QmlProjectRunConfiguration*>(project->activeTarget()->activeRunConfiguration()); + + if (!runConfig) + return tr("No run configurations were found for the project '%1'.").arg(project->displayName()); + + Internal::StartExternalQmlDialog dlg(Debugger::DebuggerUISwitcher::instance()->mainWindow()); + + QString importPathArgument = "-I"; + QString execArgs; + if (runConfig->viewerArguments().contains(importPathArgument)) + execArgs = runConfig->viewerArguments().join(" "); + else { + QFileInfo qmlFileInfo(runConfig->viewerArguments().last()); + importPathArgument.append(" " + qmlFileInfo.absolutePath() + " "); + execArgs = importPathArgument + runConfig->viewerArguments().join(" "); + } + + + dlg.setPort(runConfig->debugServerPort()); + dlg.setDebuggerUrl(runConfig->debugServerAddress()); + dlg.setProjectDisplayName(project->displayName()); + dlg.setDebugMode(Internal::StartExternalQmlDialog::QmlProjectWithCppPlugins); + dlg.setQmlViewerArguments(execArgs); + dlg.setQmlViewerPath(runConfig->viewerPath()); + + if (dlg.exec() != QDialog::Accepted) + return QString(); + + m_runConfigurationDebugData.serverAddress = dlg.debuggerUrl(); + m_runConfigurationDebugData.serverPort = dlg.port(); + m_settings.setExternalPort(dlg.port()); + m_settings.setExternalUrl(dlg.debuggerUrl()); + + ProjectExplorer::Environment customEnv = ProjectExplorer::Environment::systemEnvironment(); // empty env by default + customEnv.set(QmlProjectManager::Constants::E_QML_DEBUG_SERVER_PORT, QString::number(m_settings.externalPort())); + + Debugger::DebuggerRunControl *debuggableRunControl = + createDebuggerRunControl(runConfig, dlg.qmlViewerPath(), dlg.qmlViewerArguments()); + + return executeDebuggerRunControl(debuggableRunControl, &customEnv); +#endif +} + +QString Inspector::attachToExternalCppAppWithQml(ProjectExplorer::Project *project) +{ + Q_UNUSED(project); + qDebug() << Q_FUNC_INFO; + +#warning implement attachToExternalCppAppWithQml + + return QString(); + +#if 0 + m_debugMode = CppProjectWithQmlEngines; + + ProjectExplorer::LocalApplicationRunConfiguration* runConfig = + qobject_cast<ProjectExplorer::LocalApplicationRunConfiguration*>(project->activeTarget()->activeRunConfiguration()); + + if (!project->activeTarget() || !project->activeTarget()->activeRunConfiguration()) + return tr("No run configurations were found for the project '%1'.").arg(project->displayName()); + else if (!runConfig) + return tr("No valid run configuration was found for the project %1. " + "Only locally runnable configurations are supported.\n" + "Please check your project settings.").arg(project->displayName()); + + Internal::StartExternalQmlDialog dlg(Debugger::DebuggerUISwitcher::instance()->mainWindow()); + + dlg.setPort(m_settings.externalPort()); + dlg.setDebuggerUrl(m_settings.externalUrl()); + dlg.setProjectDisplayName(project->displayName()); + dlg.setDebugMode(Internal::StartExternalQmlDialog::CppProjectWithQmlEngine); + if (dlg.exec() != QDialog::Accepted) + return QString(); + + m_runConfigurationDebugData.serverAddress = dlg.debuggerUrl(); + m_runConfigurationDebugData.serverPort = dlg.port(); + m_settings.setExternalPort(dlg.port()); + m_settings.setExternalUrl(dlg.debuggerUrl()); + + ProjectExplorer::Environment customEnv = runConfig->environment(); + customEnv.set(QmlProjectManager::Constants::E_QML_DEBUG_SERVER_PORT, QString::number(m_settings.externalPort())); + Debugger::DebuggerRunControl *debuggableRunControl = createDebuggerRunControl(runConfig); + return executeDebuggerRunControl(debuggableRunControl, &customEnv); +#endif +} + +QString Inspector::executeDebuggerRunControl(Debugger::DebuggerRunControl *debuggableRunControl, + ProjectExplorer::Environment *environment) +{ + Q_UNUSED(debuggableRunControl); + Q_UNUSED(environment); + + qDebug() << Q_FUNC_INFO; + + ProjectExplorer::ProjectExplorerPlugin *pex = ProjectExplorer::ProjectExplorerPlugin::instance(); + + // to make sure we have a valid, debuggable run control, find the correct factory for it + if (debuggableRunControl) { + + // modify the env + debuggableRunControl->setCustomEnvironment(*environment); + + pex->startRunControl(debuggableRunControl, ProjectExplorer::Constants::DEBUGMODE); + m_simultaneousCppAndQmlDebugMode = true; + + return QString(); + } + return tr("A valid run control was not registered in Qt Creator for this project run configuration."); +} + +Debugger::DebuggerRunControl *Inspector::createDebuggerRunControl(ProjectExplorer::RunConfiguration *runConfig, + const QString &executableFile, + const QString &executableArguments) +{ + qDebug() << Q_FUNC_INFO; + + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + const QList<Debugger::DebuggerRunControlFactory *> factories = pm->getObjects<Debugger::DebuggerRunControlFactory>(); + ProjectExplorer::RunControl *runControl = 0; + + if (m_debugMode == QmlProjectWithCppPlugins) { + Debugger::DebuggerStartParameters sp; + sp.startMode = Debugger::StartExternal; + sp.executable = executableFile; + sp.processArgs = executableArguments.split(QLatin1Char(' ')); + runControl = factories.first()->create(sp); + return qobject_cast<Debugger::DebuggerRunControl *>(runControl); + } + + if (m_debugMode == CppProjectWithQmlEngines) { + if (factories.length() && factories.first()->canRun(runConfig, ProjectExplorer::Constants::DEBUGMODE)) { + runControl = factories.first()->create(runConfig, ProjectExplorer::Constants::DEBUGMODE); + return qobject_cast<Debugger::DebuggerRunControl *>(runControl); + } + } + + return 0; +} + +void Inspector::connected(QDeclarativeEngineDebug *client) +{ + qDebug() << Q_FUNC_INFO; + m_client = client; + resetViews(); +} + +void Inspector::updateMenuActions() +{ + qDebug() << Q_FUNC_INFO; + + bool enabled = true; + if (m_simultaneousCppAndQmlDebugMode) + enabled = (m_cppDebuggerState == Debugger::DebuggerNotReady && m_clientProxy->isUnconnected()); + else + enabled = m_clientProxy->isUnconnected(); +} + +void Inspector::debuggerStateChanged(int newState) +{ + qDebug() << Q_FUNC_INFO; + + if (m_simultaneousCppAndQmlDebugMode) { + switch(newState) { + case Debugger::EngineStarting: + { + m_connectionInitialized = false; + break; + } + case Debugger::AdapterStartFailed: + case Debugger::InferiorStartFailed: + emit statusMessage(tr("Debugging failed: could not start C++ debugger.")); + break; + case Debugger::InferiorRunningRequested: + { + if (m_cppDebuggerState == Debugger::InferiorStopped) { + // re-enable UI again +#warning enable the UI here + } + break; + } + case Debugger::InferiorRunning: + { + if (!m_connectionInitialized) { + m_connectionInitialized = true; + m_connectionTimer->setInterval(ConnectionAttemptSimultaneousInterval); + m_connectionTimer->start(); + } + break; + } + case Debugger::InferiorStopped: + { +#warning disable the UI here + break; + } + case Debugger::EngineShuttingDown: + { + m_connectionInitialized = false; + // here it's safe to enable the debugger windows again - + // disabled ones look ugly. +#warning enable the UI here + m_simultaneousCppAndQmlDebugMode = false; + break; + } + default: + break; + } + } + + m_cppDebuggerState = newState; + updateMenuActions(); +} + + +void Inspector::reloadQmlViewer() +{ + qDebug() << "TODO:" << Q_FUNC_INFO; + int currentEngineId = 0; +#warning set up the current engine id + m_clientProxy->reloadQmlViewer(currentEngineId); +} + +void Inspector::setSimpleDockWidgetArrangement() +{ + qDebug() << Q_FUNC_INFO; + +#if 0 + Utils::FancyMainWindow *mainWindow = Debugger::DebuggerUISwitcher::instance()->mainWindow(); + + mainWindow->setTrackingEnabled(false); + QList<QDockWidget *> dockWidgets = mainWindow->dockWidgets(); + foreach (QDockWidget *dockWidget, dockWidgets) { + if (m_dockWidgets.contains(dockWidget)) { + dockWidget->setFloating(false); + mainWindow->removeDockWidget(dockWidget); + } + } + + foreach (QDockWidget *dockWidget, dockWidgets) { + if (m_dockWidgets.contains(dockWidget)) { + mainWindow->addDockWidget(Qt::BottomDockWidgetArea, dockWidget); + dockWidget->show(); + } + } + //mainWindow->tabifyDockWidget(m_frameRateDock, m_propertyWatcherDock); + mainWindow->tabifyDockWidget(m_propertyWatcherDock, m_expressionQueryDock); + mainWindow->tabifyDockWidget(m_propertyWatcherDock, m_inspectorOutputDock); + m_propertyWatcherDock->raise(); + + m_inspectorOutputDock->setVisible(false); + + mainWindow->setTrackingEnabled(true); +#endif +} + +void Inspector::setSelectedItemsByObjectReference(QList<QDeclarativeDebugObjectReference> objectReferences) +{ + qDebug() << Q_FUNC_INFO; + + if (objectReferences.length()) + gotoObjectReferenceDefinition(objectReferences.first()); +} + +#if 0 +void QmlInspector::handlePropertyDump(const QDeclarativeDebugPropertyDump &dump) +{ + qDebug() << Q_FUNC_INFO; + m_rewriter->mapObjectToQml(dump.object()); +} +#endif + +void Inspector::gotoObjectReferenceDefinition(const QDeclarativeDebugObjectReference &obj) +{ + Q_UNUSED(obj); + + qDebug() << "TODO:" << Q_FUNC_INFO; + + QDeclarativeDebugFileReference source = obj.source(); + const QString fileName = source.url().toLocalFile(); + + if (source.lineNumber() < 0 || !QFile::exists(fileName)) + return; + + qDebug() << Q_FUNC_INFO << "selecting" << obj.className() << obj.debugId() << obj.source().url(); +#warning update the rewriter +#if 0 + m_rewriter->setActiveObject(obj); +#endif + + Core::EditorManager *editorManager = Core::EditorManager::instance(); + Core::IEditor *editor = editorManager->openEditor(fileName, QString(), Core::EditorManager::NoModeSwitch); + TextEditor::ITextEditor *textEditor = qobject_cast<TextEditor::ITextEditor*>(editor); + + if (textEditor) { + editorManager->addCurrentPositionToNavigationHistory(); + textEditor->gotoLine(source.lineNumber()); + textEditor->widget()->setFocus(); + } +} + +QDeclarativeDebugExpressionQuery *Inspector::executeExpression(int objectDebugId, const QString &objectId, + const QString &propertyName, const QVariant &value) +{ + qDebug() << Q_FUNC_INFO; + if (objectId.length()) { + QString quoteWrappedValue = value.toString(); + if (addQuotesForData(value)) + quoteWrappedValue = QString("'%1'").arg(quoteWrappedValue); + + QString constructedExpression = objectId + "." + propertyName + "=" + quoteWrappedValue; + return m_client.data()->queryExpressionResult(objectDebugId, constructedExpression, this); + } + + return 0; +} + +bool Inspector::addQuotesForData(const QVariant &value) const +{ + qDebug() << Q_FUNC_INFO; + + switch (value.type()) { + case QVariant::String: + case QVariant::Color: + case QVariant::Date: + return true; + default: + break; + } + + return false; +} + diff --git a/src/plugins/qmljsinspector/qmljsinspector.h b/src/plugins/qmljsinspector/qmljsinspector.h index c90163fec563a4b1c1f2b1bc3519574974608a07..29d1a580e0deb5fe36a7ee52b0d58bcdcc7a74a6 100644 --- a/src/plugins/qmljsinspector/qmljsinspector.h +++ b/src/plugins/qmljsinspector/qmljsinspector.h @@ -30,21 +30,127 @@ #ifndef QMLJSINSPECTOR_H #define QMLJSINSPECTOR_H -#include <QObject> +#include "qmljsprivateapi.h" + +#include <coreplugin/basemode.h> +#include <qmlprojectmanager/qmlprojectrunconfiguration.h> + +#include <qmljs/qmljsdocument.h> +#include <qmljs/parser/qmljsastfwd_p.h> + +#include <QtGui/QAction> +#include <QtCore/QObject> + +namespace ProjectExplorer { + class Project; + class Environment; +} + +namespace Core { + class IContext; +} + +namespace Debugger { + class DebuggerRunControl; +} namespace QmlJSInspector { namespace Internal { +class ClientProxy; +class InspectorContext; + +const int MaxConnectionAttempts = 50; +const int ConnectionAttemptDefaultInterval = 75; +// used when debugging with c++ - connection can take a lot of time +const int ConnectionAttemptSimultaneousInterval = 500; + class Inspector : public QObject { Q_OBJECT public: + enum DebugMode { + StandaloneMode, + CppProjectWithQmlEngines, + QmlProjectWithCppPlugins + }; + Inspector(QObject *parent = 0); - virtual ~Inspector(); + ~Inspector(); + + void shutdown(); + + bool connectToViewer(); // using host, port from widgets + + // returns false if project is not debuggable. + bool setDebugConfigurationDataFromProject(ProjectExplorer::Project *projectToDebug); + void startQmlProjectDebugger(); + + QDeclarativeDebugExpressionQuery *executeExpression(int objectDebugId, const QString &objectId, + const QString &propertyName, const QVariant &value); + + QDeclarativeDebugExpressionQuery *setBindingForObject(int objectDebugId, const QString &objectId, + const QString &propertyName, const QVariant &value, + bool isLiteralValue); + +signals: + void statusMessage(const QString &text); + +public slots: + void setSimpleDockWidgetArrangement(); + void reloadQmlViewer(); + +private slots: + void gotoObjectReferenceDefinition(const QDeclarativeDebugObjectReference &obj); + void simultaneouslyDebugQmlCppApplication(); + + void debuggerStateChanged(int newState); + void pollInspector(); + + void setSelectedItemsByObjectReference(QList<QDeclarativeDebugObjectReference> objectReferences); + void changeSelectedItem(int engineId, const QDeclarativeDebugObjectReference &object); + + void updateMenuActions(); + void connected(QDeclarativeEngineDebug *client); + void aboutToReloadEngines(); + void updateEngineList(); + + void disconnectWidgets(); + void disconnected(); + +private: + Debugger::DebuggerRunControl *createDebuggerRunControl(ProjectExplorer::RunConfiguration *runConfig, + const QString &executableFile = QString(), + const QString &executableArguments = QString()); + + QString executeDebuggerRunControl(Debugger::DebuggerRunControl *debuggableRunControl, + ProjectExplorer::Environment *environment); + + QString attachToQmlViewerAsExternalApp(ProjectExplorer::Project *project); + QString attachToExternalCppAppWithQml(ProjectExplorer::Project *project); + + bool addQuotesForData(const QVariant &value) const; + void resetViews(); + +private: + QWeakPointer<QDeclarativeEngineDebug> m_client; + InspectorContext *m_context; + + QTimer *m_connectionTimer; + int m_connectionAttempts; + + QmlProjectManager::QmlProjectRunConfigurationDebugData m_runConfigurationDebugData; + + // simultaneous debug mode stuff + int m_cppDebuggerState; + bool m_connectionInitialized; + bool m_simultaneousCppAndQmlDebugMode; + DebugMode m_debugMode; + ClientProxy *m_clientProxy; }; -} // namespace Internal -} // namespace QmlJSInspector +} // Internal +} // QmlJSInspector -#endif // QMLJSINSPECTOR_H +#endif