Details
-
Bug
-
Resolution: Done
-
P2: Important
-
Qt Creator 4.14.0
-
e124ca962d20670d2f588352a129e73e72da099f (qt-creator/qt-creator/master)
Description
*.mjs files cannot be debugged. More accurately, you won’t hit a breakpoint set in one but you can step into a *.mjs.
Here are the 2 most relevant methods from our scripting implementation. In RunScriptSlot, you can see how it runs *.js and *.mjs scripts differently. Generally speaking, we want to use *.mjs for everything, but I can only get breakpoints to work if I change the top level *.mjs script to a *.js and remove the “export” key words and the “function main() {…}” wrapper around the body of the script. We want to use *.mjs because we need scripts to import functions from lower level scripts and this is the only way I have been able to achieve that.
void ScriptingWorker::SetupEngine() { myEngine_ = new QJSEngine(this); api_obj_->SetEngine(myEngine_); myEngine_->installExtensions(QJSEngine::AllExtensions); auto api_js_obj = myEngine_->newQObject(api_obj_); myEngine_->globalObject().setProperty("api", api_js_obj); //allow scripts to use this object's signals QString command_file = /*temp.join("/") +*/ ":/array_cmd/ArrayCommandApiTB34A.mjs"; command_file.remove("file://"); QJSValue module = myEngine_->importModule(command_file); myEngine_->globalObject().setProperty("ArrayCommand", module); if (module.isError()) { qDebug() << "ScriptingApi::import Uncaught exception at line" << module.property("lineNumber").toInt() << ":" << module.toString(); } } void ScriptingWorker::RunScriptSlot(QUrl path) { script_running_ = true; QString script_file_name = path.toString(); //We want to create a folder to hold the recordings created by the script being run. //These help direct everything to the right paces GetApi()->script_file_basename_ = path.fileName().remove(".mjs") + QDateTime::currentDateTime().toString("_MM_dd_yyyy__hh_mm_ss"); QString folder_name = GetApi()->recording_uut_path_ + "/" + GetApi()->script_file_basename_; // Want to create a directory named after the script thats being run emit QDir temp; temp.mkpath(folder_name.remove("file://")); //start table recording current_table_record_ = GetApi()->recording_uut_path_ + "/" + GetApi()->script_file_basename_ + "/" + QDateTime::currentDateTime().toString("'table'_MM_dd_yyyy__hh_mm_ss") + ".cts"; emit StartTableRecording(current_table_record_); QVariant qvar; QVariantMap qmap; qmap["id"] = "single_cycle"; qmap["arg"] = "true"; QVariantMap qmap_wrapper; qmap_wrapper["cmd"] = QVariant::fromValue(qmap); qvar = QVariant::fromValue(qmap_wrapper); CommandSlot(QVariant::fromValue(qvar)); script_file_name.remove("file://"); GetApi()->preTestUserInput(); if (script_file_name.contains(".mjs")) { QJSValue top = api_obj_->import("top", script_file_name); top.property("main").call(); } else //script must be *.js { QFile scriptFile(script_file_name); if (!scriptFile.open(QIODevice::ReadOnly)) qDebug()<< "Could not open " << path << "\n"; QTextStream stream(&scriptFile); QString contents = stream.readAll(); scriptFile.close(); QJSValue result = myEngine_->evaluate(contents, script_file_name); } if(this->GetApi()->getTestStatus()) { GetApi()->setTestStatus(false); //If the script was aborted during the course of the script running, reset the flag for the next script QVariant qvar = "script aborted"; emit progress(qvar); QVariantList qlist; QVariantMap qmap; qmap["Test Description"] = "Aborted"; qmap["Test Result"] = "Aborted"; qlist.push_back(qmap); emit UserInputComplete(QVariant::fromValue(qlist)); } GetApi()->postTestUserInput(); api_obj_->dropimport("top"); emit StopTableRecording(); script_running_ = false; emit exportSignal("file://" + folder_name, ""); }
Attachments
For Gerrit Dashboard: QTCREATORBUG-25328 | ||||||
---|---|---|---|---|---|---|
# | Subject | Branch | Project | Status | CR | V |
333350,2 | Fix breakpoints not getting hit for .mjs files | master | qt-creator/qt-creator | Status: MERGED | +2 | 0 |