src/scripttools/debugging/qscriptdebuggerconsole.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
    42 #include "qscriptdebuggerconsole_p.h"
    42 #include "qscriptdebuggerconsole_p.h"
    43 #include "qscriptdebuggerconsolecommandjob_p.h"
    43 #include "qscriptdebuggerconsolecommandjob_p.h"
    44 #include "qscriptdebuggerconsolecommandmanager_p.h"
    44 #include "qscriptdebuggerconsolecommandmanager_p.h"
    45 #include "qscriptdebuggerscriptedconsolecommand_p.h"
    45 #include "qscriptdebuggerscriptedconsolecommand_p.h"
    46 #include "qscriptmessagehandlerinterface_p.h"
    46 #include "qscriptmessagehandlerinterface_p.h"
       
    47 #include "qscriptbreakpointdata_p.h"
       
    48 #include "qscriptdebuggerresponse_p.h"
       
    49 #include "qscriptdebuggervalueproperty_p.h"
       
    50 #include "qscriptscriptdata_p.h"
    47 
    51 
    48 #include <QtCore/qdir.h>
    52 #include <QtCore/qdir.h>
    49 #include <QtCore/qfileinfo.h>
    53 #include <QtCore/qfileinfo.h>
    50 #include <QtCore/qstring.h>
    54 #include <QtCore/qstring.h>
    51 #include <QtCore/qstringlist.h>
    55 #include <QtCore/qstringlist.h>
    52 #include <QtCore/qdebug.h>
    56 #include <QtCore/qdebug.h>
       
    57 #include <QtScript/qscriptcontextinfo.h>
    53 #include <QtScript/qscriptengine.h>
    58 #include <QtScript/qscriptengine.h>
    54 
    59 
       
    60 Q_DECLARE_METATYPE(QScriptDebuggerResponse)
       
    61 Q_DECLARE_METATYPE(QScriptBreakpointData)
       
    62 Q_DECLARE_METATYPE(QScriptBreakpointMap)
       
    63 Q_DECLARE_METATYPE(QScriptScriptData)
       
    64 Q_DECLARE_METATYPE(QScriptScriptMap)
       
    65 Q_DECLARE_METATYPE(QScriptContextInfo)
       
    66 Q_DECLARE_METATYPE(QScriptDebuggerValue)
       
    67 Q_DECLARE_METATYPE(QScriptDebuggerValueProperty)
       
    68 Q_DECLARE_METATYPE(QScriptDebuggerValuePropertyList)
       
    69 Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommand*)
       
    70 Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandList)
       
    71 Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandGroupData)
       
    72 Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandGroupMap)
       
    73 
    55 QT_BEGIN_NAMESPACE
    74 QT_BEGIN_NAMESPACE
       
    75 
       
    76 static QScriptValue debuggerResponseToScriptValue(QScriptEngine *eng, const QScriptDebuggerResponse &in)
       
    77 {
       
    78     QScriptValue out = eng->newObject();
       
    79     out.setProperty(QString::fromLatin1("result"), qScriptValueFromValue(eng, in.result()));
       
    80     out.setProperty(QString::fromLatin1("error"), QScriptValue(eng, in.error()));
       
    81     out.setProperty(QString::fromLatin1("async"), QScriptValue(eng, in.async()));
       
    82     return out;
       
    83 }
       
    84 
       
    85 static void debuggerResponseFromScriptValue(const QScriptValue &, QScriptDebuggerResponse &)
       
    86 {
       
    87     Q_ASSERT(0);
       
    88 }
       
    89 
       
    90 static QScriptValue breakpointDataToScriptValue(QScriptEngine *eng, const QScriptBreakpointData &in)
       
    91 {
       
    92     QScriptValue out = eng->newObject();
       
    93     out.setProperty(QString::fromLatin1("scriptId"), QScriptValue(eng, qsreal(in.scriptId())));
       
    94     out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
       
    95     out.setProperty(QString::fromLatin1("lineNumber"), QScriptValue(eng, in.lineNumber()));
       
    96     out.setProperty(QString::fromLatin1("enabled"), QScriptValue(eng, in.isEnabled()));
       
    97     out.setProperty(QString::fromLatin1("singleShot"), QScriptValue(eng, in.isSingleShot()));
       
    98     out.setProperty(QString::fromLatin1("ignoreCount"), QScriptValue(eng, in.ignoreCount()));
       
    99     out.setProperty(QString::fromLatin1("condition"), QScriptValue(eng, in.condition()));
       
   100     return out;
       
   101 }
       
   102 
       
   103 static void breakpointDataFromScriptValue(const QScriptValue &in, QScriptBreakpointData &out)
       
   104 {
       
   105     QScriptValue scriptId = in.property(QString::fromLatin1("scriptId"));
       
   106     if (scriptId.isValid())
       
   107         out.setScriptId((qint64)scriptId.toNumber());
       
   108     out.setFileName(in.property(QString::fromLatin1("fileName")).toString());
       
   109     out.setLineNumber(in.property(QString::fromLatin1("lineNumber")).toInt32());
       
   110     QScriptValue enabled = in.property(QString::fromLatin1("enabled"));
       
   111     if (enabled.isValid())
       
   112         out.setEnabled(enabled.toBoolean());
       
   113     QScriptValue singleShot = in.property(QString::fromLatin1("singleShot"));
       
   114     if (singleShot.isValid())
       
   115         out.setSingleShot(singleShot.toBoolean());
       
   116     out.setIgnoreCount(in.property(QString::fromLatin1("ignoreCount")).toInt32());
       
   117     out.setCondition(in.property(QString::fromLatin1("condition")).toString());
       
   118 }
       
   119 
       
   120 static QScriptValue breakpointMapToScriptValue(QScriptEngine *eng, const QScriptBreakpointMap &in)
       
   121 {
       
   122     QScriptValue out = eng->newObject();
       
   123     QScriptBreakpointMap::const_iterator it;
       
   124     for (it = in.constBegin(); it != in.constEnd(); ++it) {
       
   125         out.setProperty(QString::number(it.key()), qScriptValueFromValue(eng, it.value()));
       
   126     }
       
   127     return out;
       
   128 }
       
   129 
       
   130 static void breakpointMapFromScriptValue(const QScriptValue &, QScriptBreakpointMap &)
       
   131 {
       
   132     Q_ASSERT(0);
       
   133 }
       
   134 
       
   135 static QScriptValue scriptDataToScriptValue(QScriptEngine *eng, const QScriptScriptData &in)
       
   136 {
       
   137     QScriptValue out = eng->newObject();
       
   138     out.setProperty(QString::fromLatin1("contents"), QScriptValue(eng, in.contents()));
       
   139     out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
       
   140     out.setProperty(QString::fromLatin1("baseLineNumber"), QScriptValue(eng, in.baseLineNumber()));
       
   141     return out;
       
   142 }
       
   143 
       
   144 static void scriptDataFromScriptValue(const QScriptValue &in, QScriptScriptData &out)
       
   145 {
       
   146     QString contents = in.property(QString::fromLatin1("contents")).toString();
       
   147     QString fileName = in.property(QString::fromLatin1("fileName")).toString();
       
   148     int baseLineNumber = in.property(QString::fromLatin1("baseLineNumber")).toInt32();
       
   149     QScriptScriptData tmp(contents, fileName, baseLineNumber);
       
   150     out = tmp;
       
   151 }
       
   152 
       
   153 static QScriptValue scriptMapToScriptValue(QScriptEngine *eng, const QScriptScriptMap &in)
       
   154 {
       
   155     QScriptValue out = eng->newObject();
       
   156     QScriptScriptMap::const_iterator it;
       
   157     for (it = in.constBegin(); it != in.constEnd(); ++it) {
       
   158         out.setProperty(QString::number(it.key()), qScriptValueFromValue(eng, it.value()));
       
   159     }
       
   160     return out;
       
   161 }
       
   162 
       
   163 static void scriptMapFromScriptValue(const QScriptValue &, QScriptScriptMap &)
       
   164 {
       
   165     Q_ASSERT(0);
       
   166 }
       
   167 
       
   168 static QScriptValue consoleCommandToScriptValue(
       
   169     QScriptEngine *eng, QScriptDebuggerConsoleCommand* const &in)
       
   170 {
       
   171     if (!in)
       
   172         return eng->undefinedValue();
       
   173     QScriptValue out = eng->newObject();
       
   174     out.setProperty(QString::fromLatin1("name"), QScriptValue(eng, in->name()));
       
   175     out.setProperty(QString::fromLatin1("group"), QScriptValue(eng, in->group()));
       
   176     out.setProperty(QString::fromLatin1("shortDescription"), QScriptValue(eng, in->shortDescription()));
       
   177     out.setProperty(QString::fromLatin1("longDescription"), QScriptValue(eng, in->longDescription()));
       
   178     out.setProperty(QString::fromLatin1("aliases"), qScriptValueFromValue(eng, in->aliases()));
       
   179     out.setProperty(QString::fromLatin1("seeAlso"), qScriptValueFromValue(eng, in->seeAlso()));
       
   180     return out;
       
   181 }
       
   182 
       
   183 static void consoleCommandFromScriptValue(
       
   184     const QScriptValue &, QScriptDebuggerConsoleCommand* &)
       
   185 {
       
   186     Q_ASSERT(0);
       
   187 }
       
   188 
       
   189 static QScriptValue consoleCommandGroupDataToScriptValue(
       
   190     QScriptEngine *eng, const QScriptDebuggerConsoleCommandGroupData &in)
       
   191 {
       
   192     QScriptValue out = eng->newObject();
       
   193     out.setProperty(QString::fromLatin1("longDescription"), QScriptValue(eng, in.longDescription()));
       
   194     out.setProperty(QString::fromLatin1("shortDescription"), QScriptValue(eng, in.shortDescription()));
       
   195     return out;
       
   196 }
       
   197 
       
   198 static void consoleCommandGroupDataFromScriptValue(
       
   199     const QScriptValue &, QScriptDebuggerConsoleCommandGroupData &)
       
   200 {
       
   201     Q_ASSERT(0);
       
   202 }
       
   203 
       
   204 static QScriptValue consoleCommandGroupMapToScriptValue(
       
   205     QScriptEngine *eng, const QScriptDebuggerConsoleCommandGroupMap &in)
       
   206 {
       
   207     QScriptValue out = eng->newObject();
       
   208     QScriptDebuggerConsoleCommandGroupMap::const_iterator it;
       
   209     for (it = in.constBegin(); it != in.constEnd(); ++it) {
       
   210         out.setProperty(it.key(), qScriptValueFromValue(eng, it.value()));
       
   211     }
       
   212     return out;
       
   213 }
       
   214 
       
   215 static void consoleCommandGroupMapFromScriptValue(
       
   216     const QScriptValue &, QScriptDebuggerConsoleCommandGroupMap &)
       
   217 {
       
   218     Q_ASSERT(0);
       
   219 }
       
   220 
       
   221 static QScriptValue contextInfoToScriptValue(QScriptEngine *eng, const QScriptContextInfo &in)
       
   222 {
       
   223     QScriptValue out = eng->newObject();
       
   224     out.setProperty(QString::fromLatin1("scriptId"), QScriptValue(eng, qsreal(in.scriptId())));
       
   225     out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
       
   226     out.setProperty(QString::fromLatin1("lineNumber"), QScriptValue(eng, in.lineNumber()));
       
   227     out.setProperty(QString::fromLatin1("columnNumber"), QScriptValue(eng, in.columnNumber()));
       
   228     out.setProperty(QString::fromLatin1("functionName"), QScriptValue(eng, in.functionName()));
       
   229     return out;
       
   230 }
       
   231 
       
   232 static void contextInfoFromScriptValue(const QScriptValue &, QScriptContextInfo &)
       
   233 {
       
   234     Q_ASSERT(0);
       
   235 }
       
   236 
       
   237 static QScriptValue debuggerScriptValuePropertyToScriptValue(QScriptEngine *eng, const QScriptDebuggerValueProperty &in)
       
   238 {
       
   239     QScriptValue out = eng->newObject();
       
   240     out.setProperty(QString::fromLatin1("name"), QScriptValue(eng, in.name()));
       
   241     out.setProperty(QString::fromLatin1("value"), qScriptValueFromValue(eng, in.value()));
       
   242     out.setProperty(QString::fromLatin1("valueAsString"), QScriptValue(eng, in.valueAsString()));
       
   243     out.setProperty(QString::fromLatin1("flags"), QScriptValue(eng, static_cast<int>(in.flags())));
       
   244     return out;
       
   245 }
       
   246 
       
   247 static void debuggerScriptValuePropertyFromScriptValue(const QScriptValue &in, QScriptDebuggerValueProperty &out)
       
   248 {
       
   249     QString name = in.property(QString::fromLatin1("name")).toString();
       
   250     QScriptDebuggerValue value = qscriptvalue_cast<QScriptDebuggerValue>(in.property(QString::fromLatin1("value")));
       
   251     QString valueAsString = in.property(QString::fromLatin1("valueAsString")).toString();
       
   252     int flags = in.property(QString::fromLatin1("flags")).toInt32();
       
   253     QScriptDebuggerValueProperty tmp(name, value, valueAsString, QScriptValue::PropertyFlags(flags));
       
   254     out = tmp;
       
   255 }
    56 
   256 
    57 /*!
   257 /*!
    58   \since 4.5
   258   \since 4.5
    59   \class QScriptDebuggerConsole
   259   \class QScriptDebuggerConsole
    60   \internal
   260   \internal
    74     QScriptDebuggerConsoleCommandJob *createJob(
   274     QScriptDebuggerConsoleCommandJob *createJob(
    75         const QString &command,
   275         const QString &command,
    76         QScriptMessageHandlerInterface *messageHandler,
   276         QScriptMessageHandlerInterface *messageHandler,
    77         QScriptDebuggerCommandSchedulerInterface *commandScheduler);
   277         QScriptDebuggerCommandSchedulerInterface *commandScheduler);
    78 
   278 
       
   279     QScriptEngine *commandEngine;
    79     QScriptDebuggerConsoleCommandManager *commandManager;
   280     QScriptDebuggerConsoleCommandManager *commandManager;
    80     QString commandPrefix;
   281     QString commandPrefix;
    81     QString input;
   282     QString input;
    82     QStringList commandHistory;
   283     QStringList commandHistory;
    83     int currentFrameIndex;
   284     int currentFrameIndex;
    97     currentScriptId = -1;
   298     currentScriptId = -1;
    98     currentLineNumber = -1;
   299     currentLineNumber = -1;
    99     evaluateAction = 0;
   300     evaluateAction = 0;
   100     commandPrefix = QLatin1String(".");
   301     commandPrefix = QLatin1String(".");
   101     commandManager = new QScriptDebuggerConsoleCommandManager();
   302     commandManager = new QScriptDebuggerConsoleCommandManager();
       
   303 
       
   304     commandEngine = new QScriptEngine;
       
   305     qScriptRegisterMetaType<QScriptBreakpointData>(commandEngine, breakpointDataToScriptValue, breakpointDataFromScriptValue);
       
   306     qScriptRegisterMetaType<QScriptBreakpointMap>(commandEngine, breakpointMapToScriptValue, breakpointMapFromScriptValue);
       
   307     qScriptRegisterMetaType<QScriptScriptData>(commandEngine, scriptDataToScriptValue, scriptDataFromScriptValue);
       
   308     qScriptRegisterMetaType<QScriptScriptMap>(commandEngine, scriptMapToScriptValue, scriptMapFromScriptValue);
       
   309     qScriptRegisterMetaType<QScriptContextInfo>(commandEngine, contextInfoToScriptValue, contextInfoFromScriptValue);
       
   310     qScriptRegisterMetaType<QScriptDebuggerValueProperty>(commandEngine, debuggerScriptValuePropertyToScriptValue, debuggerScriptValuePropertyFromScriptValue);
       
   311     qScriptRegisterSequenceMetaType<QScriptDebuggerValuePropertyList>(commandEngine);
       
   312     qScriptRegisterMetaType<QScriptDebuggerResponse>(commandEngine, debuggerResponseToScriptValue, debuggerResponseFromScriptValue);
       
   313     qScriptRegisterMetaType<QScriptDebuggerConsoleCommand*>(commandEngine, consoleCommandToScriptValue, consoleCommandFromScriptValue);
       
   314     qScriptRegisterSequenceMetaType<QScriptDebuggerConsoleCommandList>(commandEngine);
       
   315     qScriptRegisterMetaType<QScriptDebuggerConsoleCommandGroupData>(commandEngine, consoleCommandGroupDataToScriptValue, consoleCommandGroupDataFromScriptValue);
       
   316     qScriptRegisterMetaType<QScriptDebuggerConsoleCommandGroupMap>(commandEngine, consoleCommandGroupMapToScriptValue, consoleCommandGroupMapFromScriptValue);
       
   317 // ### can't do this, if it's an object ID the conversion will be incorrect since
       
   318 // ### the object ID refers to an object in a different engine!
       
   319 //    qScriptRegisterMetaType(commandEngine, debuggerScriptValueToScriptValue, debuggerScriptValueFromScriptValue);
   102 }
   320 }
   103 
   321 
   104 QScriptDebuggerConsolePrivate::~QScriptDebuggerConsolePrivate()
   322 QScriptDebuggerConsolePrivate::~QScriptDebuggerConsolePrivate()
   105 {
   323 {
   106     delete commandManager;
   324     delete commandManager;
       
   325     delete commandEngine;
   107 }
   326 }
   108 
   327 
   109 /*!
   328 /*!
   110   Loads command definitions from scripts located in the given \a scriptsPath.
   329   Loads command definitions from scripts located in the given \a scriptsPath.
   111 */
   330 */
   124             continue;
   343             continue;
   125         QTextStream stream(&file);
   344         QTextStream stream(&file);
   126         QString program = stream.readAll();
   345         QString program = stream.readAll();
   127         QScriptDebuggerScriptedConsoleCommand *command;
   346         QScriptDebuggerScriptedConsoleCommand *command;
   128         command = QScriptDebuggerScriptedConsoleCommand::parse(
   347         command = QScriptDebuggerScriptedConsoleCommand::parse(
   129             program, fileName, messageHandler);
   348             program, fileName, commandEngine, messageHandler);
   130         if (!command)
   349         if (!command)
   131             continue;
   350             continue;
   132         commandManager->addCommand(command);
   351         commandManager->addCommand(command);
   133     }
   352     }
   134 }
   353 }