diff --git a/libraries/script-engine/src/ConsoleScriptingInterface.cpp b/libraries/script-engine/src/ConsoleScriptingInterface.cpp index c319bc6d31..f3ceee63f7 100644 --- a/libraries/script-engine/src/ConsoleScriptingInterface.cpp +++ b/libraries/script-engine/src/ConsoleScriptingInterface.cpp @@ -18,124 +18,165 @@ #include "ConsoleScriptingInterface.h" #include "ScriptEngine.h" -#define INDENTATION 4 +#define INDENTATION 4 // 1 Tab - 4 spaces const QString LINE_SEPARATOR = "\n "; +const QString SPACE_SEPARATOR = " "; const QString STACK_TRACE_FORMAT = "\n[Stacktrace]%1%2"; +QList ConsoleScriptingInterface::_groupDetails = QList(); -void ConsoleScriptingInterface::info(QString message) { - if (ScriptEngine* scriptEngine = qobject_cast(engine())) { - scriptEngine->scriptInfoMessage(message); +QScriptValue ConsoleScriptingInterface::info(QScriptContext* context, QScriptEngine* engine) { + if (ScriptEngine* scriptEngine = qobject_cast(engine)) { + scriptEngine->scriptInfoMessage(appendArguments(context)); } + return QScriptValue::NullValue; } -void ConsoleScriptingInterface::log(QString message) { +QScriptValue ConsoleScriptingInterface::log(QScriptContext* context, QScriptEngine* engine) { + QString message = appendArguments(context); if (_groupDetails.count() == 0) { - if (ScriptEngine* scriptEngine = qobject_cast(engine())) { + if (ScriptEngine* scriptEngine = qobject_cast(engine)) { scriptEngine->scriptPrintedMessage(message); } } else { - this->logGroupMessage(message); + logGroupMessage(message, engine); } + return QScriptValue::NullValue; } -void ConsoleScriptingInterface::debug(QString message) { +QScriptValue ConsoleScriptingInterface::debug(QScriptContext* context, QScriptEngine* engine) { + if (ScriptEngine* scriptEngine = qobject_cast(engine)) { + scriptEngine->scriptPrintedMessage(appendArguments(context)); + } + return QScriptValue::NullValue; +} + +QScriptValue ConsoleScriptingInterface::warn(QScriptContext* context, QScriptEngine* engine) { + if (ScriptEngine* scriptEngine = qobject_cast(engine)) { + scriptEngine->scriptWarningMessage(appendArguments(context)); + } + return QScriptValue::NullValue; +} + +QScriptValue ConsoleScriptingInterface::error(QScriptContext* context, QScriptEngine* engine) { + if (ScriptEngine* scriptEngine = qobject_cast(engine)) { + scriptEngine->scriptErrorMessage(appendArguments(context)); + } + return QScriptValue::NullValue; +} + +QScriptValue ConsoleScriptingInterface::exception(QScriptContext* context, QScriptEngine* engine) { + if (ScriptEngine* scriptEngine = qobject_cast(engine)) { + scriptEngine->scriptErrorMessage(appendArguments(context)); + } + return QScriptValue::NullValue; +} + +void ConsoleScriptingInterface::time(QString labelName) { + _timerDetails.insert(labelName, QDateTime::currentDateTime().toUTC()); + QString message = QString("%1: Timer started").arg(labelName); if (ScriptEngine* scriptEngine = qobject_cast(engine())) { scriptEngine->scriptPrintedMessage(message); } } -void ConsoleScriptingInterface::warn(QString message) { - if (ScriptEngine* scriptEngine = qobject_cast(engine())) { - scriptEngine->scriptWarningMessage(message); - } -} - -void ConsoleScriptingInterface::error(QString message) { - if (ScriptEngine* scriptEngine = qobject_cast(engine())) { - scriptEngine->scriptErrorMessage(message); - } -} - -void ConsoleScriptingInterface::exception(QString message) { - if (ScriptEngine* scriptEngine = qobject_cast(engine())) { - scriptEngine->scriptErrorMessage(message); - } -} - -void ConsoleScriptingInterface::time(QString labelName) { - _timerDetails.insert(labelName, QDateTime::currentDateTime().toUTC()); - QString message = QString("%1: timer started").arg(labelName); - this->log(message); -} - void ConsoleScriptingInterface::timeEnd(QString labelName) { - if (!_timerDetails.contains(labelName)) { - this->error("No such label found " + labelName); - return; - } + if (ScriptEngine* scriptEngine = qobject_cast(engine())) { + if (!_timerDetails.contains(labelName)) { + scriptEngine->scriptErrorMessage("No such label found " + labelName); + return; + } - if (_timerDetails.value(labelName).isNull()) { + if (_timerDetails.value(labelName).isNull()) { + _timerDetails.remove(labelName); + scriptEngine->scriptErrorMessage("Invalid start time for " + labelName); + return; + } + QDateTime _startTime = _timerDetails.value(labelName); + QDateTime _endTime = QDateTime::currentDateTime().toUTC(); + qint64 diffInMS = _startTime.msecsTo(_endTime); + + QString message = QString("%1: %2ms").arg(labelName).arg(QString::number(diffInMS)); _timerDetails.remove(labelName); - this->error("Invalid start time for " + labelName); - return; - } - - QDateTime _startTime = _timerDetails.value(labelName); - QDateTime _endTime = QDateTime::currentDateTime().toUTC(); - qint64 diffInMS = _startTime.msecsTo(_endTime); - - QString message = QString("%1: %2ms").arg(labelName).arg(QString::number(diffInMS)); - _timerDetails.remove(labelName); - this->log(message); + scriptEngine->scriptPrintedMessage(message); + } } -void ConsoleScriptingInterface::asserts(bool condition, QString message) { +QScriptValue ConsoleScriptingInterface::assertion(QScriptContext* context, QScriptEngine* engine) { + QString message; + bool condition = false; + for (int i = 0; i < context->argumentCount(); i++) { + if (i == 0) { + condition = context->argument(i).toBool(); // accept first value as condition + } else { + message += SPACE_SEPARATOR + context->argument(i).toString(); // accept other parameters as message + } + } + + QString assertionResult; if (!condition) { - QString assertionResult; if (message.isEmpty()) { assertionResult = "Assertion failed"; } else { assertionResult = QString("Assertion failed : %1").arg(message); } - this->error(assertionResult); + if (ScriptEngine* scriptEngine = qobject_cast(engine)) { + scriptEngine->scriptErrorMessage(assertionResult); + } } + return QScriptValue::NullValue; } -void ConsoleScriptingInterface::trace() { - if (ScriptEngine* scriptEngine = qobject_cast(engine())) { +void ConsoleScriptingInterface::trace() { + if (ScriptEngine* scriptEngine = qobject_cast(engine())) { scriptEngine->scriptPrintedMessage (QString(STACK_TRACE_FORMAT).arg(LINE_SEPARATOR, scriptEngine->currentContext()->backtrace().join(LINE_SEPARATOR))); } } -void ConsoleScriptingInterface::clear() { +void ConsoleScriptingInterface::clear() { if (ScriptEngine* scriptEngine = qobject_cast(engine())) { scriptEngine->clearDebugLogWindow(); } } -void ConsoleScriptingInterface::group(QString groupName) { - this->logGroupMessage(groupName); - _groupDetails.push_back(groupName); +QScriptValue ConsoleScriptingInterface::group(QScriptContext* context, QScriptEngine* engine) { + logGroupMessage(context->argument(0).toString(), engine); // accept first parameter as label + _groupDetails.push_back(context->argument(0).toString()); + return QScriptValue::NullValue; } -void ConsoleScriptingInterface::groupCollapsed(QString groupName) { - this->logGroupMessage(groupName); - _groupDetails.push_back(groupName); +QScriptValue ConsoleScriptingInterface::groupCollapsed(QScriptContext* context, QScriptEngine* engine) { + logGroupMessage(context->argument(0).toString(), engine); // accept first parameter as label + _groupDetails.push_back(context->argument(0).toString()); + return QScriptValue::NullValue; } -void ConsoleScriptingInterface::groupEnd() { - _groupDetails.removeLast(); +QScriptValue ConsoleScriptingInterface::groupEnd(QScriptContext* context, QScriptEngine* engine) { + ConsoleScriptingInterface::_groupDetails.removeLast(); + return QScriptValue::NullValue; } -void ConsoleScriptingInterface::logGroupMessage(QString message) { - int _appendIndentation = _groupDetails.count() * INDENTATION; +QString ConsoleScriptingInterface::appendArguments(QScriptContext* context) { + QString message; + for (int i = 0; i < context->argumentCount(); i++) { + if (i > 0) { + message += SPACE_SEPARATOR; + } + message += context->argument(i).toString(); + } + return message; +} + +void ConsoleScriptingInterface::logGroupMessage(QString message, QScriptEngine* engine) { + int _addSpaces = _groupDetails.count() * INDENTATION; QString logMessage; - for (int count = 0; count < _appendIndentation; count++) { - logMessage.append(" "); + for (int i = 0; i < _addSpaces; i++) { + logMessage.append(SPACE_SEPARATOR); } logMessage.append(message); - this->debug(logMessage); + if (ScriptEngine* scriptEngine = qobject_cast(engine)) { + scriptEngine->scriptPrintedMessage(logMessage); + } } diff --git a/libraries/script-engine/src/ConsoleScriptingInterface.h b/libraries/script-engine/src/ConsoleScriptingInterface.h index 03fdabe888..444ea93504 100644 --- a/libraries/script-engine/src/ConsoleScriptingInterface.h +++ b/libraries/script-engine/src/ConsoleScriptingInterface.h @@ -28,25 +28,29 @@ // Scriptable interface of "console" object. Used exclusively in the JavaScript API class ConsoleScriptingInterface : public QObject, protected QScriptable { Q_OBJECT +public: + static QScriptValue info(QScriptContext* context, QScriptEngine* engine); + static QScriptValue log(QScriptContext* context, QScriptEngine* engine); + static QScriptValue debug(QScriptContext* context, QScriptEngine* engine); + static QScriptValue warn(QScriptContext* context, QScriptEngine* engine); + static QScriptValue error(QScriptContext* context, QScriptEngine* engine); + static QScriptValue exception(QScriptContext* context, QScriptEngine* engine); + static QScriptValue assertion(QScriptContext* context, QScriptEngine* engine); + static QScriptValue group(QScriptContext* context, QScriptEngine* engine); + static QScriptValue groupCollapsed(QScriptContext* context, QScriptEngine* engine); + static QScriptValue groupEnd(QScriptContext* context, QScriptEngine* engine); + public slots: - void info(QString message); - void log(QString message); - void debug(QString message); - void warn(QString message); - void error(QString message); - void exception(QString message); void time(QString labelName); void timeEnd(QString labelName); - void asserts(bool condition, QString message = ""); void trace(); void clear(); - void group(QString groupName); - void groupCollapsed(QString groupName); - void groupEnd(); -private: + +private: QHash _timerDetails; - QList _groupDetails; - void logGroupMessage(QString msg); + static QList _groupDetails; + static void logGroupMessage(QString message, QScriptEngine* engine); + static QString appendArguments(QScriptContext* context); }; #endif // hifi_ConsoleScriptingInterface_h diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 96d3ec95e7..8c64589c3d 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -672,8 +672,18 @@ void ScriptEngine::init() { registerGlobalObject("Mat4", &_mat4Library); registerGlobalObject("Uuid", &_uuidLibrary); registerGlobalObject("Messages", DependencyManager::get().data()); - registerGlobalObject("console", &_consoleScriptingInterface); registerGlobalObject("File", new FileScriptingInterface(this)); + registerGlobalObject("console", &_consoleScriptingInterface); + registerFunction("console", "info", ConsoleScriptingInterface::info, currentContext()->argumentCount()); + registerFunction("console", "log", ConsoleScriptingInterface::log, currentContext()->argumentCount()); + registerFunction("console", "debug", ConsoleScriptingInterface::debug, currentContext()->argumentCount()); + registerFunction("console", "warn", ConsoleScriptingInterface::warn, currentContext()->argumentCount()); + registerFunction("console", "error", ConsoleScriptingInterface::error, currentContext()->argumentCount()); + registerFunction("console", "exception", ConsoleScriptingInterface::exception, currentContext()->argumentCount()); + registerFunction("console", "assert", ConsoleScriptingInterface::assertion, currentContext()->argumentCount()); + registerFunction("console", "group", ConsoleScriptingInterface::group, 1); + registerFunction("console", "groupCollapsed", ConsoleScriptingInterface::groupCollapsed, 1); + registerFunction("console", "groupEnd", ConsoleScriptingInterface::groupEnd, 0); qScriptRegisterMetaType(this, animVarMapToScriptValue, animVarMapFromScriptValue); qScriptRegisterMetaType(this, resultHandlerToScriptValue, resultHandlerFromScriptValue); diff --git a/scripts/developer/tests/consoleObjectTest.js b/scripts/developer/tests/consoleObjectTest.js index 7e2416833f..a59652dc09 100644 --- a/scripts/developer/tests/consoleObjectTest.js +++ b/scripts/developer/tests/consoleObjectTest.js @@ -17,6 +17,7 @@ function main() { console.info(a = 2 * 6); console.info(someValue); console.info('someObject id ' + someObject.id); + console.info('Hello World ', 'someObject.id = ', someObject.id, "a = 2 * 6 = ", a = 2 * 6); // console.log examples console.log("[console.log] Hello World"); @@ -25,6 +26,7 @@ function main() { console.log(a = 2 * 6); console.log(someValue); console.log('someObject id ' + someObject.id); + console.log('Hello World ', 'someObject.id = ', someObject.id, "a = 2 * 6 = ", a = 2 * 6); // console.debug examples console.debug("[console.debug] Hello World."); @@ -33,6 +35,7 @@ function main() { console.debug(a = 2 * 6); console.debug(someValue); console.debug('someObject id ' + someObject.id); + console.debug('Hello World ', 'someObject.id = ', someObject.id, "a = 2 * 6 = ", a = 2 * 6); // console.warn examples console.warn("[console.warn] This is warning message."); @@ -41,6 +44,7 @@ function main() { console.warn(a = 2 * 6); console.warn(someValue); console.warn('someObject id ' + someObject.id); + console.warn('Hello World ', 'someObject.id = ', someObject.id, "a = 2 * 6 = ", a = 2 * 6); // console.error examples console.error('An error occurred!'); @@ -64,15 +68,16 @@ function main() { } fooA(); - //console.asserts() examples + // console.assert() examples var valA = 1, valB = "1"; - console.asserts(valA === valB, "Value A doesn't equal to B"); - console.asserts(valA === valB); - console.asserts(5 === 5, "5 equals to 5"); - console.asserts(5 === 5); - console.asserts(5 > 6, "5 is not greater than 6"); + console.assert(valA === valB, "Value A doesn't equal to B"); + console.assert(valA === valB); + console.assert(5 === 5, "5 equals to 5"); + console.assert(5 === 5); + console.assert(5 > 6, "5 is not greater than 6"); + console.assert(5 > 6, "5 is not greater than 6", "This assertion will fail"); - //console.group() examples. + // console.group() examples. console.group("Group 1"); console.log("Sentence 1"); console.log("Sentence 2"); @@ -89,11 +94,11 @@ function main() { console.groupEnd(); console.log("Sentence 9"); - //console.time(),console.timeEnd() examples - console.time('Timer1'); + // console.time(),console.timeEnd() examples + console.time('MyTimer'); // Do some process sleep(1000); - console.timeEnd('Timer1'); + console.timeEnd('MyTimer'); // use console.clear() to clean Debug Window logs // console.clear();