diff options
author | David Schulz <david.schulz@qt.io> | 2020-01-02 11:31:14 +0100 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2020-01-06 13:29:44 +0000 |
commit | a7dd0e50a28595eb976d77b1b23b8120b0a9395a (patch) | |
tree | c40150044b4b57f7e1feae0502fcd73b8e2ffacb /src/plugins/debugger | |
parent | 1291755288ca11ba548cd3467dbe5b81496c541d (diff) |
Debugger: make BreakpointParameters::fileName a Utils::FilePath
Task-number: QTCREATORBUG-23339
Change-Id: Ifc497c14589cd6df10d8219533e100f1919213b3
Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'src/plugins/debugger')
-rw-r--r-- | src/plugins/debugger/breakhandler.cpp | 113 | ||||
-rw-r--r-- | src/plugins/debugger/breakhandler.h | 10 | ||||
-rw-r--r-- | src/plugins/debugger/breakpoint.cpp | 8 | ||||
-rw-r--r-- | src/plugins/debugger/breakpoint.h | 6 | ||||
-rw-r--r-- | src/plugins/debugger/cdb/cdbengine.cpp | 8 | ||||
-rw-r--r-- | src/plugins/debugger/cdb/cdbparsehelpers.cpp | 9 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerplugin.cpp | 6 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerprotocol.cpp | 5 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerprotocol.h | 4 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/gdbengine.cpp | 17 | ||||
-rw-r--r-- | src/plugins/debugger/lldb/lldbengine.cpp | 4 | ||||
-rw-r--r-- | src/plugins/debugger/pdb/pdbengine.cpp | 10 | ||||
-rw-r--r-- | src/plugins/debugger/qml/qmlengine.cpp | 13 | ||||
-rw-r--r-- | src/plugins/debugger/sourceutils.cpp | 4 |
14 files changed, 105 insertions, 112 deletions
diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index dece318182b..78c8c6cbb0a 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -110,9 +110,9 @@ public: { TextMark::updateFileName(fileName); QTC_ASSERT(m_bp, return); - m_bp->setFileName(fileName.toString()); + m_bp->setFileName(fileName); if (GlobalBreakpoint gbp = m_bp->globalBreakpoint()) - gbp->m_params.fileName = fileName.toString(); + gbp->m_params.fileName = fileName; } bool isDraggable() const final { return true; } @@ -666,7 +666,7 @@ void BreakpointDialog::getParts(unsigned partsMask, BreakpointParameters *data) if (partsMask & FileAndLinePart) { data->lineNumber = m_lineEditLineNumber->text().toInt(); data->pathUsage = static_cast<BreakpointPathUsage>(m_comboBoxPathUsage->currentIndex()); - data->fileName = m_pathChooserFileName->path(); + data->fileName = FilePath::fromUserInput(m_pathChooserFileName->path()); } if (partsMask & FunctionPart) data->functionName = m_lineEditFunction->text(); @@ -703,7 +703,7 @@ void BreakpointDialog::setParts(unsigned mask, const BreakpointParameters &data) m_lineEditMessage->setText(data.message); if (mask & FileAndLinePart) { - m_pathChooserFileName->setPath(data.fileName); + m_pathChooserFileName->setFileName(data.fileName); m_lineEditLineNumber->setText(QString::number(data.lineNumber)); } @@ -911,17 +911,9 @@ BreakHandler::BreakHandler(DebuggerEngine *engine) tr("Condition"), tr("Ignore"), tr("Threads")}); } -static inline bool fileNameMatch(const QString &f1, const QString &f2) +bool BreakpointParameters::isLocatedAt(const FilePath &file, int line, const FilePath &markerFile) const { - if (HostOsInfo::fileNameCaseSensitivity() == Qt::CaseInsensitive) - return f1.compare(f2, Qt::CaseInsensitive) == 0; - return f1 == f2; -} - -bool BreakpointParameters::isLocatedAt(const QString &file, int line, const QString &markerFile) const -{ - return lineNumber == line - && (fileNameMatch(fileName, file) || fileNameMatch(fileName, markerFile)); + return lineNumber == line && (fileName == file || fileName == markerFile); } static bool isSimilarTo(const BreakpointParameters ¶ms, const BreakpointParameters &needle) @@ -942,7 +934,7 @@ static bool isSimilarTo(const BreakpointParameters ¶ms, const BreakpointPara // At least at a position we were looking for. // FIXME: breaks multiple breakpoints at the same location if (!params.fileName.isEmpty() - && fileNameMatch(params.fileName, needle.fileName) + && params.fileName == needle.fileName && params.lineNumber == needle.lineNumber) return true; @@ -1085,12 +1077,8 @@ QVariant BreakpointItem::data(int column, int role) const } break; case BreakpointFileColumn: - if (role == Qt::DisplayRole) { - const QString str = markerFileName(); - if (!str.isEmpty()) - return QDir::toNativeSeparators(str); - return empty; - } + if (role == Qt::DisplayRole) + return markerFileName().toUserOutput(); break; case BreakpointLineColumn: if (role == Qt::DisplayRole) { @@ -1223,7 +1211,7 @@ void BreakHandler::requestSubBreakpointEnabling(const SubBreakpoint &sbp, bool e } } -void BreakpointItem::setMarkerFileAndLine(const QString &fileName, int lineNumber) +void BreakpointItem::setMarkerFileAndLine(const FilePath &fileName, int lineNumber) { if (m_parameters.fileName == fileName && m_parameters.lineNumber == lineNumber) return; @@ -1471,8 +1459,7 @@ void BreakHandler::gotoLocation(const Breakpoint &bp) const // Don't use gotoLocation unconditionally as this ends up in // disassembly if OperateByInstruction is on. But fallback // to disassembly if we can't open the file. - const QString file = QDir::cleanPath(bp->markerFileName()); - if (IEditor *editor = EditorManager::openEditor(file)) + if (IEditor *editor = EditorManager::openEditor(bp->markerFileName().toString())) editor->gotoLine(bp->markerLineNumber(), 0); else m_engine->openDisassemblerView(Location(bp->m_parameters.address)); @@ -1805,20 +1792,21 @@ void BreakpointItem::destroyMarker() } } -QString BreakpointItem::markerFileName() const +FilePath BreakpointItem::markerFileName() const { // Some heuristics to find a "good" file name. - if (!m_parameters.fileName.isEmpty()) { - QFileInfo fi(m_parameters.fileName); - if (fi.exists()) - return fi.absoluteFilePath(); - } - const QString origFileName = requestedParameters().fileName; - if (m_parameters.fileName.endsWith(origFileName)) + if (!m_parameters.fileName.exists()) + return FilePath::fromString(m_parameters.fileName.toFileInfo().absolutePath()); + + const FilePath origFileName = requestedParameters().fileName; + if (m_parameters.fileName.endsWith(origFileName.fileName())) return m_parameters.fileName; - if (origFileName.endsWith(m_parameters.fileName)) + if (origFileName.endsWith(m_parameters.fileName.fileName())) return origFileName; - return m_parameters.fileName.size() > origFileName ? m_parameters.fileName : origFileName; + + return m_parameters.fileName.toString().size() > origFileName.toString().size() + ? m_parameters.fileName + : origFileName; } int BreakpointItem::markerLineNumber() const @@ -1876,7 +1864,7 @@ void BreakpointItem::updateMarkerIcon() void BreakpointItem::updateMarker() { - FilePath file = FilePath::fromString(markerFileName()); + const FilePath &file = markerFileName(); int line = markerLineNumber(); if (m_marker && (file != m_marker->fileName() || line != m_marker->lineNumber())) destroyMarker(); @@ -1922,7 +1910,7 @@ QString BreakpointItem::toolTip() const str << "<tr><td>" << tr("Breakpoint Type:") << "</td><td>" << typeToString(requested.type) << "</td></tr>" << "<tr><td>" << tr("Marker File:") - << "</td><td>" << QDir::toNativeSeparators(markerFileName()) << "</td></tr>" + << "</td><td>" << markerFileName().toUserOutput() << "</td></tr>" << "<tr><td>" << tr("Marker Line:") << "</td><td>" << markerLineNumber() << "</td></tr>" << "<tr><td>" << tr("Hit Count:") @@ -1943,8 +1931,8 @@ QString BreakpointItem::toolTip() const } if (m_parameters.type == BreakpointByFileAndLine) { str << "<tr><td>" << tr("File Name:") - << "</td><td>" << QDir::toNativeSeparators(requested.fileName) - << "</td><td>" << QDir::toNativeSeparators(m_parameters.fileName) + << "</td><td>" << requested.fileName.toUserOutput() + << "</td><td>" << m_parameters.fileName.toUserOutput() << "</td></tr>" << "<tr><td>" << tr("Line Number:") << "</td><td>" << requested.lineNumber @@ -2153,12 +2141,8 @@ QVariant GlobalBreakpointItem::data(int column, int role) const } break; case BreakpointFileColumn: - if (role == Qt::DisplayRole) { - QString str = m_params.fileName; - if (!str.isEmpty()) - return QDir::toNativeSeparators(str); - return empty; - } + if (role == Qt::DisplayRole) + return m_params.fileName.toUserOutput(); break; case BreakpointLineColumn: if (role == Qt::DisplayRole) { @@ -2277,21 +2261,17 @@ void GlobalBreakpointItem::updateLineNumber(int lineNumber) void GlobalBreakpointItem::updateFileName(const FilePath &fileName) { - const QString &file = fileName.toString(); - if (m_params.fileName == file) + if (m_params.fileName == fileName) return; - m_params.fileName = file; + m_params.fileName = fileName; update(); } -QString GlobalBreakpointItem::markerFileName() const +FilePath GlobalBreakpointItem::markerFileName() const { // Some heuristics to find a "good" file name. - if (!m_params.fileName.isEmpty()) { - QFileInfo fi(m_params.fileName); - if (fi.exists()) - return fi.absoluteFilePath(); - } + if (!m_params.fileName.exists()) + return FilePath::fromString(m_params.fileName.toFileInfo().absoluteFilePath()); return m_params.fileName; } @@ -2317,15 +2297,14 @@ void GlobalBreakpointItem::updateMarker() return; } - const FilePath file = FilePath::fromString(m_params.fileName); const int line = m_params.lineNumber; if (m_marker) { - if (file != m_marker->fileName()) - m_marker->updateFileName(file); + if (m_params.fileName != m_marker->fileName()) + m_marker->updateFileName(m_params.fileName); if (line != m_marker->lineNumber()) m_marker->move(line); - } else if (!file.isEmpty() && line > 0) { - m_marker = new GlobalBreakpointMarker(this, file, line); + } else if (!m_params.fileName.isEmpty() && line > 0) { + m_marker = new GlobalBreakpointMarker(this, m_params.fileName, line); } if (m_marker) @@ -2375,7 +2354,7 @@ QString GlobalBreakpointItem::toolTip() const } if (m_params.type == BreakpointByFileAndLine) { str << "<tr><td>" << BreakpointItem::tr("File Name:") - << "</td><td>" << QDir::toNativeSeparators(m_params.fileName) + << "</td><td>" << m_params.fileName.toUserOutput() << "</td></tr>" << "<tr><td>" << BreakpointItem::tr("Line Number:") << "</td><td>" << m_params.lineNumber; @@ -2509,7 +2488,7 @@ GlobalBreakpoint BreakpointManager::findBreakpointFromContext(const ContextData GlobalBreakpoint bestMatch; theBreakpointManager->forItemsAtLevel<1>([&](const GlobalBreakpoint &gbp) { if (location.type == LocationByFile) { - if (gbp->m_params.isLocatedAt(location.fileName, location.lineNumber, QString())) { + if (gbp->m_params.isLocatedAt(location.fileName, location.lineNumber, FilePath())) { matchLevel = 2; bestMatch = gbp; } else if (matchLevel < 2) { @@ -2517,7 +2496,7 @@ GlobalBreakpoint BreakpointManager::findBreakpointFromContext(const ContextData BreakHandler *handler = engine->breakHandler(); for (Breakpoint bp : handler->breakpoints()) { if (bp->globalBreakpoint() == gbp) { - if (fileNameMatch(bp->fileName(), location.fileName) + if (bp->fileName() == location.fileName && bp->lineNumber() == location.lineNumber) { matchLevel = 1; bestMatch = gbp; @@ -2649,15 +2628,16 @@ bool BreakpointManager::contextMenuEvent(const ItemViewEvent &ev) // Delete by file: Find indices of breakpoints of the same file. GlobalBreakpoints breakpointsInFile; - QString file; + FilePath file; if (GlobalBreakpoint gbp = itemForIndexAtLevel<1>(ev.sourceModelIndex())) { + file = gbp->markerFileName(); if (!file.isEmpty()) { for (int i = 0; i != rowCount(); ++i) if (gbp->markerFileName() == file) breakpointsInFile.append(gbp); } } - addAction(menu, tr("Delete Breakpoints of \"%1\"").arg(file), + addAction(menu, tr("Delete Breakpoints of \"%1\"").arg(file.toUserOutput()), tr("Delete Breakpoints of File"), breakpointsInFile.size() > 1, [breakpointsInFile] { @@ -2679,8 +2659,7 @@ bool BreakpointManager::contextMenuEvent(const ItemViewEvent &ev) void BreakpointManager::gotoLocation(const GlobalBreakpoint &gbp) const { QTC_ASSERT(gbp, return); - const QString file = QDir::cleanPath(gbp->markerFileName()); - if (IEditor *editor = EditorManager::openEditor(file)) + if (IEditor *editor = EditorManager::openEditor(gbp->markerFileName().toString())) editor->gotoLine(gbp->markerLineNumber(), 0); } @@ -2762,7 +2741,7 @@ void BreakpointManager::saveSessionData() if (params.type != BreakpointByFileAndLine) map.insert("type", params.type); if (!params.fileName.isEmpty()) - map.insert("filename", params.fileName); + map.insert("filename", params.fileName.toVariant()); if (params.lineNumber) map.insert("linenumber", params.lineNumber); if (!params.functionName.isEmpty()) @@ -2807,7 +2786,7 @@ void BreakpointManager::loadSessionData() BreakpointParameters params(BreakpointByFileAndLine); QVariant v = map.value("filename"); if (v.isValid()) - params.fileName = v.toString(); + params.fileName = FilePath::fromVariant(v); v = map.value("linenumber"); if (v.isValid()) params.lineNumber = v.toString().toInt(); diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index a848433e8bc..d924bd6fed2 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -79,7 +79,7 @@ public: void updateFileName(const Utils::FilePath &fileName); QString displayName() const; - QString markerFileName() const; + Utils::FilePath markerFileName() const; QString toolTip() const; int markerLineNumber() const; int modelId() const; @@ -122,11 +122,11 @@ public: QIcon icon() const; - void setMarkerFileAndLine(const QString &fileName, int lineNumber); + void setMarkerFileAndLine(const Utils::FilePath &fileName, int lineNumber); bool needsChange() const; SubBreakpoint findOrCreateSubBreakpoint(const QString &responseId); - QString markerFileName() const; + Utils::FilePath markerFileName() const; int markerLineNumber() const; const BreakpointParameters &requestedParameters() const; @@ -146,7 +146,7 @@ public: QString condition() const { return m_parameters.condition; } int ignoreCount() const { return m_parameters.ignoreCount; } int threadSpec() const { return m_parameters.threadSpec; } - QString fileName() const { return m_parameters.fileName; } + Utils::FilePath fileName() const { return m_parameters.fileName; } QString functionName() const { return m_parameters.functionName; } QString expression() const { return m_parameters.expression; } QString message() const { return m_parameters.message; } @@ -160,7 +160,7 @@ public: bool isPending() const { return m_parameters.pending; } void setLineNumber(int lineNumber) { m_parameters.lineNumber = lineNumber; } - void setFileName(const QString &fileName) { m_parameters.fileName = fileName; } + void setFileName(const Utils::FilePath &fileName) { m_parameters.fileName = fileName; } void setFunctionName(const QString &functionName) { m_parameters.functionName = functionName; } void setPending(bool pending); void setResponseId(const QString &str) { m_responseId = str; } diff --git a/src/plugins/debugger/breakpoint.cpp b/src/plugins/debugger/breakpoint.cpp index d6a05fafc02..673052bcd7d 100644 --- a/src/plugins/debugger/breakpoint.cpp +++ b/src/plugins/debugger/breakpoint.cpp @@ -142,7 +142,7 @@ void BreakpointParameters::updateLocation(const QString &location) file = file.mid(1, file.size() - 2); QFileInfo fi(file); if (fi.isReadable()) - fileName = fi.absoluteFilePath(); + fileName = Utils::FilePath::fromFileInfo(fi); } } @@ -156,8 +156,9 @@ bool BreakpointParameters::isQmlFileAndLineBreakpoint() const qmlExtensionString = ".qml;.js"; const auto qmlFileExtensions = qmlExtensionString.splitRef(';', QString::SkipEmptyParts); + const QString file = fileName.toString(); for (const QStringRef &extension : qmlFileExtensions) { - if (fileName.endsWith(extension, Qt::CaseInsensitive)) + if (file.endsWith(extension, Qt::CaseInsensitive)) return true; } return false; @@ -377,7 +378,6 @@ void BreakpointParameters::updateFromGdbOutput(const GdbMi &bkpt) QString name; if (!fullName.isEmpty()) { name = cleanupFullName(fullName); - fileName = name; //if (data->markerFileName().isEmpty()) // data->setMarkerFileName(name); } else { @@ -386,7 +386,7 @@ void BreakpointParameters::updateFromGdbOutput(const GdbMi &bkpt) // gdb's own. No point in assigning markerFileName for now. } if (!name.isEmpty()) - fileName = name; + fileName = Utils::FilePath::fromString(name); if (fileName.isEmpty()) updateLocation(originalLocation); diff --git a/src/plugins/debugger/breakpoint.h b/src/plugins/debugger/breakpoint.h index 26e118b8bbb..d4afbef62d8 100644 --- a/src/plugins/debugger/breakpoint.h +++ b/src/plugins/debugger/breakpoint.h @@ -28,6 +28,8 @@ #include <QMetaType> #include <QString> +#include <utils/fileutils.h> + namespace Debugger { namespace Internal { @@ -140,7 +142,7 @@ public: bool conditionsMatch(const QString &other) const; bool isWatchpoint() const { return type == WatchpointAtAddress || type == WatchpointAtExpression; } - bool isLocatedAt(const QString &fileName, int lineNumber, const QString &markerFileName) const; + bool isLocatedAt(const Utils::FilePath &file, int line, const Utils::FilePath &markerFile) const; // Enough for now. bool isBreakpoint() const { return !isWatchpoint() && !isTracepoint(); } bool isTracepoint() const { return tracepoint; } @@ -156,7 +158,7 @@ public: BreakpointType type; //!< Type of breakpoint. bool enabled; //!< Should we talk to the debugger engine? BreakpointPathUsage pathUsage; //!< Should we use the full path when setting the bp? - QString fileName; //!< Short name of source file. + Utils::FilePath fileName;//!< Short name of source file. QString condition; //!< Condition associated with breakpoint. int ignoreCount; //!< Ignore count associated with breakpoint. int lineNumber; //!< Line in source file. diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 798013ed42f..c561e367c1f 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -879,7 +879,7 @@ void CdbEngine::executeJumpToLine(const ContextData &data) // Jump to source line: Resolve source line address and go to that location QString cmd; StringInputStream str(cmd); - str << "? `" << QDir::toNativeSeparators(data.fileName) << ':' << data.lineNumber << '`'; + str << "? `" << data.fileName.toUserOutput() << ':' << data.lineNumber << '`'; runCommand({cmd, BuiltinCommand, [this, data](const DebuggerResponse &r) { handleJumpToLineAddressResolution(r, data); }}); } @@ -916,7 +916,7 @@ void CdbEngine::handleJumpToLineAddressResolution(const DebuggerResponse &respon const quint64 address = answer.toULongLong(&ok, 16); if (ok && address) { jumpToAddress(address); - gotoLocation(Location(context.fileName, context.lineNumber)); + gotoLocation(Location(context.fileName.toString(), context.lineNumber)); } } @@ -2449,8 +2449,8 @@ void CdbEngine::insertBreakpoint(const Breakpoint &bp) if (!m_autoBreakPointCorrection && parameters.type == BreakpointByFileAndLine && boolSetting(CdbBreakPointCorrection)) { - response.lineNumber = int(lineCorrection->fixLineNumber( - parameters.fileName, unsigned(parameters.lineNumber))); + response.lineNumber = int(lineCorrection->fixLineNumber(parameters.fileName.toString(), + unsigned(parameters.lineNumber))); QString cmd = cdbAddBreakpointCommand(response, m_sourcePathMappings, responseId); runCommand({cmd, BuiltinCommand, handleBreakInsertCB}); } else { diff --git a/src/plugins/debugger/cdb/cdbparsehelpers.cpp b/src/plugins/debugger/cdb/cdbparsehelpers.cpp index 158edd99119..81fb226d59c 100644 --- a/src/plugins/debugger/cdb/cdbparsehelpers.cpp +++ b/src/plugins/debugger/cdb/cdbparsehelpers.cpp @@ -82,10 +82,10 @@ static inline QString cdbBreakPointFileName(const BreakpointParameters ¶ms, const QList<QPair<QString, QString> > &sourcePathMapping) { if (params.fileName.isEmpty()) - return params.fileName; + return {}; if (params.pathUsage == BreakpointUseShortPath) - return Utils::FilePath::fromString(params.fileName).fileName(); - return cdbSourcePathMapping(QDir::toNativeSeparators(params.fileName), sourcePathMapping, SourceToDebugger); + return params.fileName.fileName(); + return cdbSourcePathMapping(params.fileName.toUserOutput(), sourcePathMapping, SourceToDebugger); } static BreakpointParameters fixWinMSVCBreakpoint(const BreakpointParameters &p) @@ -250,7 +250,8 @@ void parseBreakPoint(const GdbMi &gdbmi, BreakpointParameters *r, r->module = moduleG.data(); const GdbMi sourceFileName = gdbmi["srcfile"]; if (sourceFileName.isValid()) { - r->fileName = Utils::FileUtils::normalizePathName(sourceFileName.data()); + r->fileName = Utils::FilePath::fromUserInput( + Utils::FileUtils::normalizePathName(sourceFileName.data())); const GdbMi lineNumber = gdbmi["srcline"]; if (lineNumber.isValid()) r->lineNumber = lineNumber.data().toULongLong(nullptr, 0); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index eda8a9c8f04..6de9fb1134e 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -672,9 +672,9 @@ public: message = tr("0x%1 hit").arg(data.address, 0, 16); } else { //: Message tracepoint: %1 file, %2 line %3 function hit. - message = tr("%1:%2 %3() hit").arg(FilePath::fromString(data.fileName).fileName()). + message = tr("%1:%2 %3() hit").arg(data.fileName.fileName()). arg(data.lineNumber). - arg(cppFunctionAt(data.fileName, data.lineNumber)); + arg(cppFunctionAt(data.fileName.toString(), data.lineNumber)); } QInputDialog dialog; // Create wide input dialog. dialog.setWindowFlags(dialog.windowFlags() @@ -1927,7 +1927,7 @@ void DebuggerPluginPrivate::requestContextMenu(TextEditorWidget *widget, // Disassemble current function in stopped state. if (engine->hasCapability(DisassemblerCapability)) { StackFrame frame; - frame.function = cppFunctionAt(args.fileName, lineNumber, 1); + frame.function = cppFunctionAt(args.fileName.toString(), lineNumber, 1); frame.line = 42; // trick gdb into mixed mode. if (!frame.function.isEmpty()) { const QString text = tr("Disassemble Function \"%1\"") diff --git a/src/plugins/debugger/debuggerprotocol.cpp b/src/plugins/debugger/debuggerprotocol.cpp index cb9302211ba..e7f90806fe2 100644 --- a/src/plugins/debugger/debuggerprotocol.cpp +++ b/src/plugins/debugger/debuggerprotocol.cpp @@ -811,6 +811,11 @@ void DebuggerCommand::arg(const char *name, const QJsonValue &value) args = addToJsonObject(args, name, value); } +void DebuggerCommand::arg(const char *name, const Utils::FilePath &filePath) +{ + args = addToJsonObject(args, name, filePath.toString()); +} + static QJsonValue translateJsonToPython(const QJsonValue &value) { // TODO: Verify that this covers all incompatibilities between python and json, diff --git a/src/plugins/debugger/debuggerprotocol.h b/src/plugins/debugger/debuggerprotocol.h index e4ba79bcde1..0d9589f5702 100644 --- a/src/plugins/debugger/debuggerprotocol.h +++ b/src/plugins/debugger/debuggerprotocol.h @@ -33,6 +33,7 @@ #include <QVector> #include <functional> +#include <utils/fileutils.h> namespace Utils { class ProcessHandle; } @@ -64,6 +65,7 @@ public: void arg(const char *name, const QList<int> &list); void arg(const char *name, const QStringList &list); // Note: Hex-encodes. void arg(const char *name, const QJsonValue &value); + void arg(const char *name, const Utils::FilePath &filePath); QString argsToPython() const; QString argsToString() const; @@ -313,7 +315,7 @@ public: public: LocationType type = UnknownLocation; - QString fileName; + Utils::FilePath fileName; int lineNumber = 0; quint64 address = 0; }; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index b9e462c9a57..716cc2aa214 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -1213,9 +1213,9 @@ void GdbEngine::handleStopResponse(const GdbMi &data) if (!nr.isEmpty() && frame.isValid()) { // Use opportunity to update the breakpoint marker position. if (Breakpoint bp = breakHandler()->findBreakpointByResponseId(nr)) { - QString fileName = bp->fileName(); + FilePath fileName = bp->fileName(); if (fileName.isEmpty()) - fileName = fullName; + fileName = FilePath::fromString(fullName); if (!fileName.isEmpty()) bp->setMarkerFileAndLine(fileName, lineNumber); } @@ -1980,7 +1980,7 @@ void GdbEngine::executeRunToLine(const ContextData &data) if (data.address) loc = addressSpec(data.address); else - loc = '"' + breakLocation(data.fileName) + '"' + ':' + QString::number(data.lineNumber); + loc = '"' + breakLocation(data.fileName.toString()) + '"' + ':' + QString::number(data.lineNumber); runCommand({"tbreak " + loc}); runCommand({"continue", NativeCommand|RunRequest, CB(handleExecuteRunToLine)}); @@ -2008,7 +2008,7 @@ void GdbEngine::executeJumpToLine(const ContextData &data) if (data.address) loc = addressSpec(data.address); else - loc = '"' + breakLocation(data.fileName) + '"' + ':' + QString::number(data.lineNumber); + loc = '"' + breakLocation(data.fileName.toString()) + '"' + ':' + QString::number(data.lineNumber); runCommand({"tbreak " + loc}); notifyInferiorRunRequested(); @@ -2110,7 +2110,7 @@ QString GdbEngine::breakpointLocation(const BreakpointParameters &data) usage = BreakpointUseShortPath; const QString fileName = usage == BreakpointUseFullPath - ? data.fileName : breakLocation(data.fileName); + ? data.fileName.toString() : breakLocation(data.fileName.toString()); // The argument is simply a C-quoted version of the argument to the // non-MI "break" command, including the "original" quoting it wants. return "\"\\\"" + GdbMi::escapeCString(fileName) + "\\\":" @@ -2124,7 +2124,7 @@ QString GdbEngine::breakpointLocation2(const BreakpointParameters &data) usage = BreakpointUseShortPath; const QString fileName = usage == BreakpointUseFullPath - ? data.fileName : breakLocation(data.fileName); + ? data.fileName.toString() : breakLocation(data.fileName.toString()); return GdbMi::escapeCString(fileName) + ':' + QString::number(data.lineNumber); } @@ -2252,7 +2252,7 @@ void GdbEngine::handleBreakInsert1(const DebuggerResponse &response, const Break } else if (response.data["msg"].data().contains("Unknown option")) { // Older version of gdb don't know the -a option to set tracepoints // ^error,msg="mi_cmd_break_insert: Unknown option ``a''" - const QString fileName = bp->fileName(); + const QString fileName = bp->fileName().toString(); const int lineNumber = bp->lineNumber(); DebuggerCommand cmd("trace \"" + GdbMi::escapeCString(fileName) + "\":" + QString::number(lineNumber), @@ -2539,7 +2539,8 @@ void GdbEngine::removeBreakpoint(const Breakpoint &bp) if (!bp->responseId().isEmpty()) { // We already have a fully inserted breakpoint. notifyBreakpointRemoveProceeding(bp); - showMessage(QString("DELETING BP %1 IN %2").arg(bp->responseId()).arg(bp->fileName())); + showMessage( + QString("DELETING BP %1 IN %2").arg(bp->responseId()).arg(bp->fileName().toString())); DebuggerCommand cmd("-break-delete " + bp->responseId(), NeedsTemporaryStop); runCommand(cmd); diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index f75c491d5de..7ce44621a08 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -564,7 +564,7 @@ void LldbEngine::updateBreakpointData(const Breakpoint &bp, const GdbMi &bkpt, b bp->setIgnoreCount(bkpt["ignorecount"].toInt()); bp->setCondition(fromHex(bkpt["condition"].data())); bp->setHitCount(bkpt["hitcount"].toInt()); - bp->setFileName(bkpt["file"].data()); + bp->setFileName(FilePath::fromUserInput(bkpt["file"].data())); bp->setLineNumber(bkpt["line"].toInt()); GdbMi locations = bkpt["locations"]; @@ -577,7 +577,7 @@ void LldbEngine::updateBreakpointData(const Breakpoint &bp, const GdbMi &bkpt, b loc->params.type = bp->type(); loc->params.address = location["addr"].toAddress(); loc->params.functionName = location["function"].data(); - loc->params.fileName = location["file"].data(); + loc->params.fileName = FilePath::fromUserInput(location["file"].data()); loc->params.lineNumber = location["line"].toInt(); loc->displayName = QString("%1.%2").arg(bp->responseId()).arg(locid); } diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp index 8d86407a4db..0970ffcebab 100644 --- a/src/plugins/debugger/pdb/pdbengine.cpp +++ b/src/plugins/debugger/pdb/pdbengine.cpp @@ -233,8 +233,7 @@ void PdbEngine::selectThread(const Thread &thread) bool PdbEngine::acceptsBreakpoint(const BreakpointParameters &bp) const { - const QString fileName = bp.fileName; - return fileName.endsWith(".py"); + return bp.fileName.endsWith(".py"); } void PdbEngine::insertBreakpoint(const Breakpoint &bp) @@ -248,7 +247,7 @@ void PdbEngine::insertBreakpoint(const Breakpoint &bp) if (params.type == BreakpointByFunction) loc = params.functionName; else - loc = params.fileName + ':' + QString::number(params.lineNumber); + loc = params.fileName.toString() + ':' + QString::number(params.lineNumber); postDirectCommand("break " + loc); } @@ -285,7 +284,7 @@ void PdbEngine::removeBreakpoint(const Breakpoint &bp) return; } showMessage(QString("DELETING BP %1 IN %2") - .arg(bp->responseId()).arg(bp->fileName())); + .arg(bp->responseId()).arg(bp->fileName().toUserOutput())); postDirectCommand("clear " + bp->responseId()); // Pretend it succeeds without waiting for response. notifyBreakpointRemoveOk(bp); @@ -498,7 +497,8 @@ void PdbEngine::handleOutput2(const QString &data) const QString bpnr = line.mid(11, pos1 - 11); const int pos2 = line.lastIndexOf(':'); QTC_ASSERT(pos2 != -1, continue); - const QString fileName = line.mid(pos1 + 4, pos2 - pos1 - 4); + const Utils::FilePath fileName = Utils::FilePath::fromString( + line.mid(pos1 + 4, pos2 - pos1 - 4)); const int lineNumber = line.midRef(pos2 + 1).toInt(); const Breakpoint bp = Utils::findOrDefault(breakHandler()->breakpoints(), [&](const Breakpoint &bp) { return bp->parameters().isLocatedAt(fileName, lineNumber, bp->markerFileName()) diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 29149984212..16dd00134d7 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -625,8 +625,11 @@ void QmlEngine::executeStepOver(bool) void QmlEngine::executeRunToLine(const ContextData &data) { QTC_ASSERT(state() == InferiorStopOk, qDebug() << state()); - showStatusMessage(tr("Run to line %1 (%2) requested...").arg(data.lineNumber).arg(data.fileName), 5000); - d->setBreakpoint(SCRIPTREGEXP, data.fileName, true, data.lineNumber); + showStatusMessage(tr("Run to line %1 (%2) requested...") + .arg(data.lineNumber) + .arg(data.fileName.toString()), + 5000); + d->setBreakpoint(SCRIPTREGEXP, data.fileName.toString(), true, data.lineNumber); clearExceptionSelection(); d->continueDebugging(Continue); @@ -677,7 +680,7 @@ void QmlEngine::insertBreakpoint(const Breakpoint &bp) d->setExceptionBreak(AllExceptions, requested.enabled); } else if (requested.type == BreakpointByFileAndLine) { - d->setBreakpoint(SCRIPTREGEXP, requested.fileName, + d->setBreakpoint(SCRIPTREGEXP, requested.fileName.toString(), requested.enabled, requested.lineNumber, 0, requested.condition, requested.ignoreCount); @@ -735,7 +738,7 @@ void QmlEngine::updateBreakpoint(const Breakpoint &bp) d->changeBreakpoint(bp, requested.enabled); } else { d->clearBreakpoint(bp); - d->setBreakpoint(SCRIPTREGEXP, requested.fileName, + d->setBreakpoint(SCRIPTREGEXP, requested.fileName.toString(), requested.enabled, requested.lineNumber, 0, requested.condition, requested.ignoreCount); d->breakpointsSync.insert(d->sequence, bp); @@ -1855,7 +1858,7 @@ void QmlEnginePrivate::messageReceived(const QByteArray &data) clearBreakpoint(bp); setBreakpoint(SCRIPTREGEXP, - params.fileName, + params.fileName.toString(), params.enabled, params.lineNumber, newColumn, diff --git a/src/plugins/debugger/sourceutils.cpp b/src/plugins/debugger/sourceutils.cpp index ea50eca8bd6..155068a3dcc 100644 --- a/src/plugins/debugger/sourceutils.cpp +++ b/src/plugins/debugger/sourceutils.cpp @@ -328,14 +328,14 @@ ContextData getLocationContext(TextDocument *document, int lineNumber) int ln = line.leftRef(pos - 1).toInt(); if (ln > 0) { data.type = LocationByFile; - data.fileName = fileName; + data.fileName = Utils::FilePath::fromString(fileName); data.lineNumber = ln; } } } } else { data.type = LocationByFile; - data.fileName = document->filePath().toString(); + data.fileName = document->filePath(); data.lineNumber = lineNumber; } return data; |