drop now unused scripttools component
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
|
@ -97,7 +97,7 @@ endif()
|
||||||
set(KATIE_TYPE SHARED CACHE STRING "Build type")
|
set(KATIE_TYPE SHARED CACHE STRING "Build type")
|
||||||
|
|
||||||
# components and tools that will be build, changed depending on the requirements availability
|
# components and tools that will be build, changed depending on the requirements availability
|
||||||
set(KATIE_COMPONENTS "Core Gui Declarative Network Svg Xml Script ScriptTools Test UiTools")
|
set(KATIE_COMPONENTS "Core Gui Declarative Network Svg Xml Script Test UiTools")
|
||||||
set(KATIE_TOOLS "moc uic qscript qtconfig")
|
set(KATIE_TOOLS "moc uic qscript qtconfig")
|
||||||
|
|
||||||
set(KATIE_HEADERS_PATH "${CMAKE_INSTALL_FULL_INCLUDEDIR}/katie" CACHE PATH "Headers installation path")
|
set(KATIE_HEADERS_PATH "${CMAKE_INSTALL_FULL_INCLUDEDIR}/katie" CACHE PATH "Headers installation path")
|
||||||
|
@ -445,7 +445,6 @@ add_subdirectory(src/imports)
|
||||||
add_subdirectory(src/network)
|
add_subdirectory(src/network)
|
||||||
add_subdirectory(src/plugins)
|
add_subdirectory(src/plugins)
|
||||||
add_subdirectory(src/script)
|
add_subdirectory(src/script)
|
||||||
add_subdirectory(src/scripttools)
|
|
||||||
add_subdirectory(src/svg)
|
add_subdirectory(src/svg)
|
||||||
add_subdirectory(src/test)
|
add_subdirectory(src/test)
|
||||||
add_subdirectory(src/uitools)
|
add_subdirectory(src/uitools)
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
name = "advance";
|
|
||||||
|
|
||||||
group = "running";
|
|
||||||
|
|
||||||
shortDescription = "Continue the program up to the given location";
|
|
||||||
|
|
||||||
longDescription = "This command has the same syntax as the \"break\" command.";
|
|
||||||
|
|
||||||
seeAlso = [ "break", "tbreak" ];
|
|
||||||
|
|
||||||
argumentTypes = [ "script-filename" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
message("Missing argument(s).");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var arg = arguments[0];
|
|
||||||
var colonIndex = arg.lastIndexOf(':');
|
|
||||||
if (colonIndex == -1) {
|
|
||||||
lineNumber = parseInt(arg);
|
|
||||||
if (isNaN(lineNumber)) {
|
|
||||||
message("Location must be of the form <file>:<line> or <line>.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var sid = getCurrentScriptId();
|
|
||||||
if (sid == -1) {
|
|
||||||
message("No script.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scheduleRunToLocation(sid, lineNumber);
|
|
||||||
} else {
|
|
||||||
fileName = arg.slice(0, colonIndex);
|
|
||||||
lineNumber = parseInt(arg.slice(colonIndex+1));
|
|
||||||
// ### resolve the script to see if it's loaded or not? (e.g. so we can issue a warning)
|
|
||||||
scheduleRunToLocation(fileName, lineNumber);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
name = "backtrace";
|
|
||||||
|
|
||||||
group = "stack";
|
|
||||||
|
|
||||||
shortDescription = "Print backtrace of stack frames";
|
|
||||||
|
|
||||||
longDescription = "";
|
|
||||||
|
|
||||||
aliases = [ "bt" ];
|
|
||||||
|
|
||||||
seeAlso = [ "frame", "info" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
scheduleGetBacktrace();
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
var strings = resp.result;
|
|
||||||
var msg = "";
|
|
||||||
for (var i = 0; i < strings.length; ++i) {
|
|
||||||
if (i > 0)
|
|
||||||
msg += "\n";
|
|
||||||
msg += "#" + i + " " + strings[i];
|
|
||||||
}
|
|
||||||
message(msg);
|
|
||||||
}
|
|
|
@ -1,59 +0,0 @@
|
||||||
name = "break";
|
|
||||||
|
|
||||||
group = "breakpoints";
|
|
||||||
|
|
||||||
shortDescription = "Set a breakpoint at specified location";
|
|
||||||
|
|
||||||
longDescription = "break <file>:<line> : Sets a breakpoint at the given location.";
|
|
||||||
longDescription += "\nbreak <line> : Sets a breakpoint at the given line of the current file.";
|
|
||||||
|
|
||||||
argumentTypes = [ "script-filename" ];
|
|
||||||
|
|
||||||
aliases = [ "b" ];
|
|
||||||
|
|
||||||
seeAlso = [ "condition", "delete", "disable", "tbreak" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
message("Missing argument.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var arg = arguments[0];
|
|
||||||
var colonIndex = arg.lastIndexOf(':');
|
|
||||||
if (colonIndex == -1) {
|
|
||||||
lineNumber = parseInt(arg);
|
|
||||||
if (isNaN(lineNumber)) {
|
|
||||||
message("Breakpoint location must be of the form <file>:<line> or <line>.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var sid = getCurrentScriptId();
|
|
||||||
if (sid == -1) {
|
|
||||||
message("No script.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scheduleGetScriptData(sid);
|
|
||||||
scriptId = sid;
|
|
||||||
state = 1;
|
|
||||||
} else {
|
|
||||||
fileName = arg.slice(0, colonIndex);
|
|
||||||
lineNumber = parseInt(arg.slice(colonIndex+1));
|
|
||||||
// ### resolve the script to see if it's loaded or not? (e.g. so we can issue a warning)
|
|
||||||
scheduleSetBreakpoint({ fileName: fileName, lineNumber: lineNumber});
|
|
||||||
state = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (state == 1) {
|
|
||||||
fileName = resp.result.fileName;
|
|
||||||
if (fileName.length == 0)
|
|
||||||
fileName = "<anonymous script, id=" + scriptId + ">";
|
|
||||||
scheduleSetBreakpoint({ scriptId: scriptId, lineNumber: lineNumber});
|
|
||||||
state = 2;
|
|
||||||
} else if (state == 2) {
|
|
||||||
if (resp.error == 0) {
|
|
||||||
var id = resp.result;
|
|
||||||
message("Breakpoint " + id + ": " + fileName + ", line " + lineNumber + ".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,59 +0,0 @@
|
||||||
name = "clear";
|
|
||||||
|
|
||||||
group = "breakpoints";
|
|
||||||
|
|
||||||
shortDescription = "Clear breakpoint at specified location";
|
|
||||||
|
|
||||||
longDescription = "clear <file>:<line> : Clear breakpoints at the given location.";
|
|
||||||
longDescription += "\nclear <line> : Clear breakpoints at the given line of the current script.";
|
|
||||||
|
|
||||||
seeAlso = [ "delete" ];
|
|
||||||
|
|
||||||
argumentTypes = [ "script-filename" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
message("Missing argument.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var arg = arguments[0];
|
|
||||||
var colonIndex = arg.lastIndexOf(':');
|
|
||||||
if (colonIndex == -1) {
|
|
||||||
lineNumber = parseInt(arg);
|
|
||||||
if (isNaN(lineNumber)) {
|
|
||||||
message("Breakpoint location must be of the form <file>:<line> or <line>.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var sid = getCurrentScriptId();
|
|
||||||
if (sid == -1) {
|
|
||||||
message("No script.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scriptId = sid;
|
|
||||||
} else {
|
|
||||||
fileName = arg.slice(0, colonIndex);
|
|
||||||
lineNumber = parseInt(arg.slice(colonIndex+1));
|
|
||||||
}
|
|
||||||
scheduleGetBreakpoints();
|
|
||||||
state = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (state == 1) {
|
|
||||||
var breakpoints = resp.result;
|
|
||||||
if (breakpoints == undefined)
|
|
||||||
return;
|
|
||||||
for (var id in breakpoints) {
|
|
||||||
var data = breakpoints[id];
|
|
||||||
if ((data.lineNumber == lineNumber)
|
|
||||||
&& (data.fileName == fileName)
|
|
||||||
|| ((data.scriptId != -1) && (data.scriptId = scriptId))) {
|
|
||||||
scheduleDeleteBreakpoint(id);
|
|
||||||
message("Deleted breakpoint " + id + ".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state = 2;
|
|
||||||
} else if (state == 2) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
name = "complete";
|
|
||||||
|
|
||||||
group = "void";
|
|
||||||
|
|
||||||
shortDescription = "List the completions for the rest of the line as a command";
|
|
||||||
|
|
||||||
longDescription = "";
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
var prefix = (arguments.length > 0) ? arguments[0] : "";
|
|
||||||
var completions = getCommandCompletions(prefix);
|
|
||||||
for (var i = 0; i < completions.length; ++i)
|
|
||||||
message(completions[i]);
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
name = "condition";
|
|
||||||
|
|
||||||
group = "breakpoints";
|
|
||||||
|
|
||||||
shortDescription = "Specify breakpoint condition";
|
|
||||||
|
|
||||||
longDescription = "condition <breakpoint-id> <expression> : Specify that the breakpoint with the given id should only be triggered if the given expression evaluates to true.";
|
|
||||||
|
|
||||||
argumentTypes = [ "breakpoint-id", "script" ];
|
|
||||||
|
|
||||||
seeAlso = [ "ignore" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
message("Missing arguments (breakpoint number and condition).");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var arg = arguments[0];
|
|
||||||
var spaceIndex = arg.indexOf(' ');
|
|
||||||
if (spaceIndex == -1)
|
|
||||||
spaceIndex = arg.length;
|
|
||||||
var id = parseInt(arg.slice(0, spaceIndex));
|
|
||||||
if (isNaN(id)) {
|
|
||||||
message("First argument must be a number (breakpoint id).");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var cond = arg.slice(spaceIndex+1);
|
|
||||||
if ((cond.length != 0) && !checkSyntax(cond)) {
|
|
||||||
message("The condition has a syntax error.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scheduleGetBreakpointData(id);
|
|
||||||
breakpointId = id;
|
|
||||||
condition = cond;
|
|
||||||
state = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (state == 1) {
|
|
||||||
var data = resp.result;
|
|
||||||
if (data == undefined) {
|
|
||||||
message("No breakpoint number " + breakpointId + ".");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
data.condition = condition;
|
|
||||||
scheduleSetBreakpointData(breakpointId, data);
|
|
||||||
state = 2;
|
|
||||||
} else if (state == 2) {
|
|
||||||
if (condition.length == 0)
|
|
||||||
message("Breakpoint " + breakpointId + " now unconditional.");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
name = "continue";
|
|
||||||
|
|
||||||
group = "running";
|
|
||||||
|
|
||||||
shortDescription = "Continue evaluation";
|
|
||||||
|
|
||||||
longDescription = "Evaluation will continue until an uncaught exception occurs, "
|
|
||||||
longDescription += "a breakpoint is hit or evaluation is explicitly interrupted.";
|
|
||||||
|
|
||||||
aliases = [ "c", "fg" ];
|
|
||||||
|
|
||||||
seeAlso = [ "step", "interrupt" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
scheduleContinue();
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (!resp.async) {
|
|
||||||
message("The target is not evaluating code.");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,36 +0,0 @@
|
||||||
name = "delete";
|
|
||||||
|
|
||||||
group = "breakpoints";
|
|
||||||
|
|
||||||
shortDescription = "Delete breakpoint(s)";
|
|
||||||
|
|
||||||
longDescription = "delete <breakpoint-id> : Deletes the breakpoint with the given id.";
|
|
||||||
|
|
||||||
seeAlso = [ "clear", "disable" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
// delete all breakpoints
|
|
||||||
scheduleClearBreakpoints();
|
|
||||||
state = 1;
|
|
||||||
} else {
|
|
||||||
var id = parseInt(arguments[0]);
|
|
||||||
if (isNaN(id)) {
|
|
||||||
message("Breakpoint id expected.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scheduleDeleteBreakpoint(id);
|
|
||||||
breakpointId = id;
|
|
||||||
state = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (state == 1) {
|
|
||||||
} else if (state == 2) {
|
|
||||||
if (resp.error != 0) {
|
|
||||||
message("No breakpoint number " + breakpointId + ".");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
name = "disable";
|
|
||||||
|
|
||||||
group = "breakpoints";
|
|
||||||
|
|
||||||
shortDescription = "Disable breakpoint(s)";
|
|
||||||
|
|
||||||
longDescription = "disable <breakpoint-id> : Disables the breakpoint with the given id.";
|
|
||||||
|
|
||||||
seeAlso = [ "enable", "delete", "ignore" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
// disable all breakpoints
|
|
||||||
state = 1;
|
|
||||||
scheduleGetBreakpoints();
|
|
||||||
} else {
|
|
||||||
var id = parseInt(arguments[0]);
|
|
||||||
if (isNaN(id)) {
|
|
||||||
message("Breakpoint id expected.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scheduleGetBreakpointData(id);
|
|
||||||
breakpointId = id;
|
|
||||||
state = 3;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (state == 1) {
|
|
||||||
var breakpoints = resp.result;
|
|
||||||
if (breakpoints == undefined)
|
|
||||||
return;
|
|
||||||
for (var id in breakpoints) {
|
|
||||||
var data = breakpoints[id];
|
|
||||||
if (data.enabled) {
|
|
||||||
data.enabled = false;
|
|
||||||
scheduleSetBreakpointData(id, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state = 2;
|
|
||||||
} else if (state == 2) {
|
|
||||||
state = 0;
|
|
||||||
} else if (state == 3) {
|
|
||||||
var data = resp.result;
|
|
||||||
if (data == undefined) {
|
|
||||||
message("No breakpoint number " + breakpointId + ".");
|
|
||||||
return;
|
|
||||||
} else if (data.enabled) {
|
|
||||||
data.enabled = false;
|
|
||||||
scheduleSetBreakpointData(breakpointId, data);
|
|
||||||
state = 4;
|
|
||||||
}
|
|
||||||
} else if (state == 4) {
|
|
||||||
state = 0;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
name = "down";
|
|
||||||
|
|
||||||
group = "stack";
|
|
||||||
|
|
||||||
shortDescription = "Select and print the stack frame below the current one";
|
|
||||||
|
|
||||||
longDescription = "";
|
|
||||||
|
|
||||||
seeAlso = [ "up", "frame" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
var idx = getCurrentFrameIndex();
|
|
||||||
if (idx == 0) {
|
|
||||||
warning("Already at bottom (innermost) frame.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setCurrentFrameIndex(idx - 1);
|
|
||||||
scheduleGetContextInfo(idx - 1);
|
|
||||||
state = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleResponse(resp, id) {
|
|
||||||
if (state == 1) {
|
|
||||||
var info = resp.result;
|
|
||||||
setCurrentScriptId(info.scriptId);
|
|
||||||
setCurrentLineNumber(info.lineNumber);
|
|
||||||
scheduleGetBacktrace();
|
|
||||||
state = 2;
|
|
||||||
} else if (state == 2) {
|
|
||||||
var backtrace = resp.result;
|
|
||||||
message("#" + getCurrentFrameIndex() + " " + backtrace[getCurrentFrameIndex()]);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
name = "enable";
|
|
||||||
|
|
||||||
group = "breakpoints";
|
|
||||||
|
|
||||||
shortDescription = "Enable breakpoint(s)";
|
|
||||||
|
|
||||||
longDescription = "enable <breakpoint-id> : Enable the breakpoint with the given id.";
|
|
||||||
|
|
||||||
seeAlso = [ "disable" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
// enable all breakpoints
|
|
||||||
state = 1;
|
|
||||||
scheduleGetBreakpoints();
|
|
||||||
} else {
|
|
||||||
var id = parseInt(arguments[0]);
|
|
||||||
if (isNaN(id)) {
|
|
||||||
message("Breakpoint id expected.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scheduleGetBreakpointData(id);
|
|
||||||
breakpointId = id;
|
|
||||||
state = 3;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (state == 1) {
|
|
||||||
var breakpoints = resp.result;
|
|
||||||
if (breakpoints == undefined)
|
|
||||||
return;
|
|
||||||
for (var id in breakpoints) {
|
|
||||||
var data = breakpoints[id];
|
|
||||||
if (!data.enabled) {
|
|
||||||
data.enabled = true;
|
|
||||||
scheduleSetBreakpointData(id, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state = 2;
|
|
||||||
} else if (state == 2) {
|
|
||||||
state = 0;
|
|
||||||
} else if (state == 3) {
|
|
||||||
var data = resp.result;
|
|
||||||
if (data == undefined) {
|
|
||||||
message("No breakpoint number " + breakpointId + ".");
|
|
||||||
return;
|
|
||||||
} else if (!data.enabled) {
|
|
||||||
data.enabled = true;
|
|
||||||
scheduleSetBreakpointData(breakpointId, data);
|
|
||||||
state = 4;
|
|
||||||
}
|
|
||||||
} else if (state == 4) {
|
|
||||||
state = 0;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
name = "eval";
|
|
||||||
|
|
||||||
group = "running";
|
|
||||||
|
|
||||||
shortDescription = "Evaluate program";
|
|
||||||
|
|
||||||
longDescription = "";
|
|
||||||
|
|
||||||
argumentTypes = [ "script" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
message("Missing argument (program).");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setEvaluateAction(0);
|
|
||||||
scheduleEvaluate(getCurrentFrameIndex(), arguments[0], "console input (" + Date() + ")");
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleResponse(resp, id) {
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
name = "finish";
|
|
||||||
|
|
||||||
group = "running";
|
|
||||||
|
|
||||||
shortDescription = "Execute until the current stack frame returns";
|
|
||||||
|
|
||||||
longDescription = "Upon return, the value returned is printed.";
|
|
||||||
|
|
||||||
seeAlso = [ "next", "continue" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
scheduleStepOut();
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
}
|
|
|
@ -1,36 +0,0 @@
|
||||||
name = "frame";
|
|
||||||
|
|
||||||
group = "stack";
|
|
||||||
|
|
||||||
shortDescription = "Select and print a stack frame";
|
|
||||||
|
|
||||||
longDescription = "";
|
|
||||||
|
|
||||||
aliases = [ "f" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0)
|
|
||||||
requestedFrameIndex = getCurrentFrameIndex();
|
|
||||||
else
|
|
||||||
requestedFrameIndex = parseInt(arguments[0]);
|
|
||||||
scheduleGetContextInfo(requestedFrameIndex);
|
|
||||||
state = 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleResponse(resp, id) {
|
|
||||||
if (state == 1) {
|
|
||||||
var info = resp.result;
|
|
||||||
if (info == undefined) {
|
|
||||||
message("Frame index out of range.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setCurrentFrameIndex(requestedFrameIndex);
|
|
||||||
setCurrentScriptId(info.scriptId);
|
|
||||||
setCurrentLineNumber(info.lineNumber);
|
|
||||||
scheduleGetBacktrace();
|
|
||||||
state = 2;
|
|
||||||
} else if (state == 2) {
|
|
||||||
var backtrace = resp.result;
|
|
||||||
message("#" + getCurrentFrameIndex() + " " + backtrace[getCurrentFrameIndex()]);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,71 +0,0 @@
|
||||||
name = "help";
|
|
||||||
|
|
||||||
group = "void";
|
|
||||||
|
|
||||||
shortDescription = "Print list of commands";
|
|
||||||
|
|
||||||
longDescription = "";
|
|
||||||
|
|
||||||
argumentTypes = [ "command-or-group-name" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
var groups = getCommandGroups();
|
|
||||||
message("List of command categories:");
|
|
||||||
message("");
|
|
||||||
for (var name in groups) {
|
|
||||||
if (name == "void")
|
|
||||||
continue;
|
|
||||||
var data = groups[name];
|
|
||||||
message(name + " :: " + data.shortDescription);
|
|
||||||
}
|
|
||||||
message("");
|
|
||||||
message("Type \"help\" followed by a category name for a list of commands in that category.");
|
|
||||||
message("Type \"help all\" for the list of all commands.");
|
|
||||||
message("Type \"help\" followed by a command name for full documentation.");
|
|
||||||
message("Command name abbreviations are allowed if they are unambiguous.");
|
|
||||||
} else {
|
|
||||||
var arg = arguments[0];
|
|
||||||
if (arg == "all") {
|
|
||||||
var groups = getCommandGroups();
|
|
||||||
for (var name in groups) {
|
|
||||||
if (name == "void")
|
|
||||||
continue;
|
|
||||||
message("Command category: " + name);
|
|
||||||
message("");
|
|
||||||
var commands = getCommandsInGroup(name);
|
|
||||||
for (var i = 0; i < commands.length; ++i) {
|
|
||||||
var data = commands[i];
|
|
||||||
message(data.name + " :: " + data.shortDescription);
|
|
||||||
}
|
|
||||||
message("");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var data = findCommand(arg);
|
|
||||||
if (data != undefined) {
|
|
||||||
message(data.shortDescription + ".");
|
|
||||||
if (data.longDescription.length != 0)
|
|
||||||
message(data.longDescription);
|
|
||||||
if (data.aliases.length != 0)
|
|
||||||
message("Aliases: " + data.aliases.join(", "));
|
|
||||||
if (data.seeAlso.length != 0)
|
|
||||||
message("See also: " + data.seeAlso.join(", "));
|
|
||||||
} else {
|
|
||||||
data = getCommandGroups()[arg];
|
|
||||||
if (data != undefined) {
|
|
||||||
message(data.shortDescription + ".");
|
|
||||||
message("");
|
|
||||||
message("List of commands:");
|
|
||||||
message("");
|
|
||||||
var commands = getCommandsInGroup(arg);
|
|
||||||
for (var i = 0; i < commands.length; ++i) {
|
|
||||||
var data = commands[i];
|
|
||||||
message(data.name + " :: " + data.shortDescription);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
message("Undefined command \"" + arg + "\". Try \"help\".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,51 +0,0 @@
|
||||||
name = "ignore";
|
|
||||||
|
|
||||||
group = "breakpoints";
|
|
||||||
|
|
||||||
shortDescription = "Set ignore-count of a breakpoint";
|
|
||||||
|
|
||||||
longDescription = "ignore <breakpoint-id> <count> : Ignores the breakpoint with the given id the next count times it is hit.";
|
|
||||||
|
|
||||||
seeAlso = [ "condition" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length < 1) {
|
|
||||||
message("Missing arguments (breakpoing number and ignore-count).");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (arguments.length < 2) {
|
|
||||||
message("Missing argument (ignore-count).");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var id = parseInt(arguments[0]);
|
|
||||||
if (isNaN(id)) {
|
|
||||||
message("First argument (breakpoint id) must be a number.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var count = parseInt(arguments[1]);
|
|
||||||
if (isNaN(count)) {
|
|
||||||
message("Second argument (ignore-count) must be a number.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scheduleGetBreakpointData(id);
|
|
||||||
breakpointId = id;
|
|
||||||
if (count < 0)
|
|
||||||
count = 0;
|
|
||||||
ignoreCount = count;
|
|
||||||
state = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (state == 1) {
|
|
||||||
var data = resp.result;
|
|
||||||
if (data == undefined) {
|
|
||||||
message("No breakpoint number " + breakpointId + ".");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
data.ignoreCount = ignoreCount;
|
|
||||||
scheduleSetBreakpointData(breakpointId, data);
|
|
||||||
state = 2;
|
|
||||||
} else if (state == 2) {
|
|
||||||
message("Breakpoint " + breakpointId + " will be ignored the next " + ignoreCount + " time(s).");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,128 +0,0 @@
|
||||||
name = "info";
|
|
||||||
|
|
||||||
group = "status";
|
|
||||||
|
|
||||||
shortDescription = "Display information about something";
|
|
||||||
|
|
||||||
longDescription = "info scripts : Names of scripts being debugged";
|
|
||||||
longDescription += "\ninfo breakpoints : Status of breakpoints currently set";
|
|
||||||
longDescription += "\ninfo locals : Local variables of current stack frame";
|
|
||||||
|
|
||||||
argumentTypes = [ "subcommand-name" ];
|
|
||||||
|
|
||||||
subCommands = [ "breakpoints", "locals", "scripts" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
var arg = arguments[0];
|
|
||||||
if (arg == undefined) {
|
|
||||||
message("\"info\" must be followed by the name of an info command.");
|
|
||||||
return;
|
|
||||||
} else if (arg == "scripts") {
|
|
||||||
scheduleGetScripts();
|
|
||||||
state = 1;
|
|
||||||
} else if (arg == "breakpoints") {
|
|
||||||
if (arguments.length > 1) {
|
|
||||||
var id = parseInt(arguments[1]);
|
|
||||||
if (isNaN(id)) {
|
|
||||||
message("Breakpoint id expected.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scheduleGetBreakpointData(id);
|
|
||||||
breakpointId = id;
|
|
||||||
state = 3;
|
|
||||||
} else {
|
|
||||||
scheduleGetBreakpoints();
|
|
||||||
state = 2;
|
|
||||||
}
|
|
||||||
} else if (arg == "locals") {
|
|
||||||
scheduleGetActivationObject(getCurrentFrameIndex());
|
|
||||||
state = 4;
|
|
||||||
} else {
|
|
||||||
warning("Undefined info command \"" + arg + "\". Try \"help info\".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function breakpointString(id, data) {
|
|
||||||
var fn = data.fileName;
|
|
||||||
if (fn.length == 0)
|
|
||||||
fn = "<anonymous script, id=" + data.scriptId + ">";
|
|
||||||
var ret = id + "\t" + (data.enabled ? "yes" : "no")
|
|
||||||
+ "\t" + fn + ":" + data.lineNumber;
|
|
||||||
if (data.condition.length != 0) {
|
|
||||||
ret += "\n\tstop only if " + data.condition;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (state == 1) {
|
|
||||||
// info scripts
|
|
||||||
var scripts = resp.result;
|
|
||||||
if (scripts == undefined) {
|
|
||||||
message("No scripts loaded.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (var id in scripts) {
|
|
||||||
var fn = scripts[id].fileName;
|
|
||||||
if (fn.length == 0)
|
|
||||||
fn = "<anonymous script, id=" + id + ">";
|
|
||||||
message("\t" + fn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (state == 2) {
|
|
||||||
// info breakpoints
|
|
||||||
var breakpoints = resp.result;
|
|
||||||
if (breakpoints == undefined) {
|
|
||||||
message("No breakpoints set.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
message("Id\tEnabled\tWhere");
|
|
||||||
for (var id in breakpoints) {
|
|
||||||
var data = breakpoints[id];
|
|
||||||
message(breakpointString(id, data));
|
|
||||||
}
|
|
||||||
} else if (state == 3) {
|
|
||||||
// info breakpoints N
|
|
||||||
var data = resp.result;
|
|
||||||
if (data == undefined) {
|
|
||||||
message("No breakpoint number " + breakpointId + ".");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
message("Id\tEnabled\tWhere");
|
|
||||||
message(breakpointString(breakpointId, data));
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (state == 4) {
|
|
||||||
// info locals
|
|
||||||
var act = resp.result;
|
|
||||||
scheduleNewScriptValueIterator(act);
|
|
||||||
state = 5;
|
|
||||||
} else if (state == 5) {
|
|
||||||
var id = resp.result;
|
|
||||||
scheduleGetPropertiesByIterator(id, 100);
|
|
||||||
iteratorId = id;
|
|
||||||
state = 6;
|
|
||||||
} else if (state == 6) {
|
|
||||||
var props = resp.result;
|
|
||||||
if (props.length == 0) {
|
|
||||||
scheduleDeleteScriptValueIterator(iteratorId);
|
|
||||||
state = 7;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var maxLength = 0;
|
|
||||||
for (var i = 0; i < props.length; ++i)
|
|
||||||
maxLength = Math.max(props[i].name.length, maxLength);
|
|
||||||
for (var i = 0; i < props.length; ++i) {
|
|
||||||
var prop = props[i];
|
|
||||||
var msg = prop.name;
|
|
||||||
var pad = maxLength - prop.name.length;
|
|
||||||
for (var j = 0; j < pad; ++j)
|
|
||||||
msg += ' ';
|
|
||||||
message(msg + " : " + prop.valueAsString);
|
|
||||||
}
|
|
||||||
scheduleGetPropertiesByIterator(iteratorId, 100);
|
|
||||||
} else if (state == 7) {
|
|
||||||
// done
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
name = "interrupt";
|
|
||||||
|
|
||||||
group = "running";
|
|
||||||
|
|
||||||
shortDescription = "Interrupt evaluation";
|
|
||||||
|
|
||||||
longDescription = "Interruption will occur as soon as a new script statement is reached.";
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
scheduleInterrupt();
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
}
|
|
|
@ -1,90 +0,0 @@
|
||||||
name = "list";
|
|
||||||
|
|
||||||
group = "files";
|
|
||||||
|
|
||||||
shortDescription = "List lines of a script";
|
|
||||||
|
|
||||||
longDescription = "list <file>:<line> : Lists lines around the given location.";
|
|
||||||
longDescription += "\nlist <line> : Lists lines in the current file.";
|
|
||||||
|
|
||||||
argumentTypes = [ "script-filename" ];
|
|
||||||
|
|
||||||
listLineNumber = 1;
|
|
||||||
listScriptId = -1;
|
|
||||||
lastSessionId = -1;
|
|
||||||
lastFrameIndex = -1;
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
state = 0;
|
|
||||||
if (arguments.length > 0) {
|
|
||||||
var arg = arguments[0];
|
|
||||||
var colonIndex = arg.lastIndexOf(':');
|
|
||||||
var fileName;
|
|
||||||
var lineNumber;
|
|
||||||
if (colonIndex == -1) {
|
|
||||||
lineNumber = parseInt(arg);
|
|
||||||
if (isNaN(lineNumber)) {
|
|
||||||
fileName = arg;
|
|
||||||
lineNumber = 1;
|
|
||||||
}
|
|
||||||
} else if (colonIndex == 0) {
|
|
||||||
fileName = arg;
|
|
||||||
lineNumber = 1;
|
|
||||||
} else {
|
|
||||||
fileName = arg.slice(0, colonIndex);
|
|
||||||
lineNumber = parseInt(arg.slice(colonIndex+1));
|
|
||||||
}
|
|
||||||
listLineNumber = Math.max(lineNumber, 1);
|
|
||||||
if (fileName != undefined) {
|
|
||||||
scheduleResolveScript(fileName);
|
|
||||||
state = 1;
|
|
||||||
} else {
|
|
||||||
setCurrentLineNumber(listLineNumber);
|
|
||||||
execute();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((getSessionId() != lastSessionId)
|
|
||||||
|| (getCurrentFrameIndex() != lastFrameIndex)
|
|
||||||
|| (listScriptId == -1)) {
|
|
||||||
listScriptId = getCurrentScriptId();
|
|
||||||
listLineNumber = getCurrentLineNumber();
|
|
||||||
lastSessionId = getSessionId();
|
|
||||||
lastFrameIndex = getCurrentFrameIndex();
|
|
||||||
}
|
|
||||||
scheduleGetScriptData(listScriptId);
|
|
||||||
state = 2;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (state == 1) {
|
|
||||||
var id = resp.result;
|
|
||||||
if (id == -1) {
|
|
||||||
message("That script isn't loaded.");
|
|
||||||
state = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
listScriptId = id;
|
|
||||||
scheduleGetScriptData(listScriptId);
|
|
||||||
state = 2;
|
|
||||||
} else if (state == 2) {
|
|
||||||
var data = resp.result;
|
|
||||||
if (data == undefined) {
|
|
||||||
message("No script.");
|
|
||||||
state = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var base = data.baseLineNumber;
|
|
||||||
var lines = data.contents.split('\n');
|
|
||||||
var start = Math.max(listLineNumber - 5, base);
|
|
||||||
for (var i = start; i < start + 10; ++i) {
|
|
||||||
var ln = lines[i - base];
|
|
||||||
var msg = String(i);
|
|
||||||
if (ln != undefined)
|
|
||||||
msg += "\t" + ln;
|
|
||||||
message(msg);
|
|
||||||
}
|
|
||||||
listLineNumber += 10;
|
|
||||||
state = 0;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
name = "next";
|
|
||||||
|
|
||||||
group = "running";
|
|
||||||
|
|
||||||
shortDescription = "Step program, proceeding through subroutine calls";
|
|
||||||
|
|
||||||
longDescription = "Like the \"step\" command as long as subroutine calls do not happen;";
|
|
||||||
longDescription += "\nwhen they do, the call is treated as one instruction.";
|
|
||||||
longDescription += "\nIf a number N is given as argument, this will be done N times before execution is stopped.";
|
|
||||||
aliases = [ "n" ];
|
|
||||||
|
|
||||||
seeAlso = [ "step", "continue", "finish", "advance" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
var count = 1;
|
|
||||||
if (arguments.length != 0) {
|
|
||||||
var arg = arguments[0];
|
|
||||||
// ### evaluate the expression in the current frame?
|
|
||||||
var num = parseInt(arg);
|
|
||||||
if (!isNaN(num) && (num >= 1))
|
|
||||||
count = num;
|
|
||||||
}
|
|
||||||
scheduleStepOver(count);
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
// ### exactly the same as eval, but provided for convenience
|
|
||||||
|
|
||||||
name = "print";
|
|
||||||
|
|
||||||
group = "status";
|
|
||||||
|
|
||||||
shortDescription = "Print value of an expression";
|
|
||||||
|
|
||||||
longDescription = "";
|
|
||||||
|
|
||||||
argumentTypes = [ "script" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
message("Missing argument (expression).");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setEvaluateAction(0);
|
|
||||||
scheduleEvaluate(getCurrentFrameIndex(), arguments[0], "console input (" + Date() + ")");
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleResponse(resp, id) {
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
name = "return";
|
|
||||||
|
|
||||||
group = "running";
|
|
||||||
|
|
||||||
shortDescription = "Make selected stack frame return to its caller";
|
|
||||||
|
|
||||||
longDescription = "";
|
|
||||||
|
|
||||||
argumentTypes = [ "script" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
// TODO:
|
|
||||||
// 1. schedule evaluate of the expression.
|
|
||||||
// 2. install event handler/filter, so that we're notified when the evaluate is done.
|
|
||||||
// - what if another event occurs while we evaluate? (e.g. an exception or breakpoint)
|
|
||||||
// - the event filter needs to uninstall itself, or the event needs to be consumed internally
|
|
||||||
// 3. in the event handler, schedule forced return with the result as argument.
|
|
||||||
setEvaluateAction(1);
|
|
||||||
scheduleEvaluate(getCurrentFrameIndex(), arguments[0], "console input (" + Date() + ")");
|
|
||||||
};
|
|
|
@ -1,26 +0,0 @@
|
||||||
name = "step";
|
|
||||||
|
|
||||||
group = "running";
|
|
||||||
|
|
||||||
shortDescription = "Step program until a new statement is reached";
|
|
||||||
|
|
||||||
longDescription = "If a number N is given as argument, this will be done N times before execution is stopped.";
|
|
||||||
|
|
||||||
aliases = [ "s" ];
|
|
||||||
|
|
||||||
seeAlso = [ "next" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
var count = 1;
|
|
||||||
if (arguments.length != 0) {
|
|
||||||
var arg = arguments[0];
|
|
||||||
// ### evaluate the expression in the current frame?
|
|
||||||
var num = parseInt(arg);
|
|
||||||
if (!isNaN(num) && (num >= 1))
|
|
||||||
count = num;
|
|
||||||
}
|
|
||||||
scheduleStepInto(count);
|
|
||||||
};
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
}
|
|
|
@ -1,59 +0,0 @@
|
||||||
name = "tbreak";
|
|
||||||
|
|
||||||
group = "breakpoints";
|
|
||||||
|
|
||||||
shortDescription = "Set a temporary breakpoint";
|
|
||||||
|
|
||||||
longDescription = "The same as the \"break\" command, except that the breakpoint is automatically deleted as soon as it is triggered.";
|
|
||||||
|
|
||||||
seeAlso = [ "break", "ignore" ];
|
|
||||||
|
|
||||||
argumentTypes = [ "script-filename" ];
|
|
||||||
|
|
||||||
// ### merge with break.qs: only difference is the "singleShot: true" in call to scheduleSetBreakpoint()
|
|
||||||
// ### maybe an include() function so commands can share code?
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
message("Missing argument.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var arg = arguments[0];
|
|
||||||
var colonIndex = arg.lastIndexOf(':');
|
|
||||||
if (colonIndex == -1) {
|
|
||||||
lineNumber = parseInt(arg);
|
|
||||||
if (isNaN(lineNumber)) {
|
|
||||||
message("Breakpoint location must be of the form <file>:<line> or <line>.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var sid = getCurrentScriptId();
|
|
||||||
if (sid == -1) {
|
|
||||||
message("No script.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scheduleGetScriptData(sid);
|
|
||||||
scriptId = sid;
|
|
||||||
state = 1;
|
|
||||||
} else {
|
|
||||||
fileName = arg.slice(0, colonIndex);
|
|
||||||
lineNumber = parseInt(arg.slice(colonIndex+1));
|
|
||||||
// ### resolve the script to see if it's loaded or not? (e.g. so we can issue a warning)
|
|
||||||
scheduleSetBreakpoint({ fileName: fileName, lineNumber: lineNumber, singleShot: true });
|
|
||||||
state = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (state == 1) {
|
|
||||||
fileName = resp.result.fileName;
|
|
||||||
if (fileName.length == 0)
|
|
||||||
fileName = "<anonymous script, id=" + scriptId + ">";
|
|
||||||
scheduleSetBreakpoint({ scriptId: scriptId, lineNumber: lineNumber, singleShot: true });
|
|
||||||
state = 2;
|
|
||||||
} else if (state == 2) {
|
|
||||||
if (resp.error == 0) {
|
|
||||||
var id = resp.result;
|
|
||||||
message("Breakpoint " + id + ": " + fileName + ", line " + lineNumber + ".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
name = "up";
|
|
||||||
|
|
||||||
group = "stack";
|
|
||||||
|
|
||||||
shortDescription = "Select and print the stack frame above the current one";
|
|
||||||
|
|
||||||
longDescription = "";
|
|
||||||
|
|
||||||
seeAlso = [ "down", "frame" ];
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
scheduleGetContextCount();
|
|
||||||
state = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleResponse(resp) {
|
|
||||||
if (state == 1) {
|
|
||||||
var count = resp.result;
|
|
||||||
var idx = getCurrentFrameIndex() + 1;
|
|
||||||
if (idx == count) {
|
|
||||||
warning("Already at top (outermost) frame.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setCurrentFrameIndex(idx);
|
|
||||||
scheduleGetContextInfo(idx);
|
|
||||||
state = 2;
|
|
||||||
} else if (state == 2) {
|
|
||||||
var info = resp.result;
|
|
||||||
setCurrentScriptId(info.scriptId);
|
|
||||||
setCurrentLineNumber(info.lineNumber);
|
|
||||||
scheduleGetBacktrace();
|
|
||||||
state = 3;
|
|
||||||
} else if (state == 3) {
|
|
||||||
var backtrace = resp.result;
|
|
||||||
message("#" + getCurrentFrameIndex() + " " + backtrace[getCurrentFrameIndex()]);
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 1 KiB |
|
@ -1,154 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://web.resource.org/cc/"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="14"
|
|
||||||
height="14"
|
|
||||||
id="svg2270"
|
|
||||||
sodipodi:version="0.32"
|
|
||||||
inkscape:version="0.45.1"
|
|
||||||
version="1.0"
|
|
||||||
sodipodi:docbase="D:\depot\research\main\editor\images"
|
|
||||||
sodipodi:docname="breakpoint.svg"
|
|
||||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
|
||||||
<defs
|
|
||||||
id="defs2272">
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient7029">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#ffffff;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop7031" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#ffffff;stop-opacity:0;"
|
|
||||||
offset="1"
|
|
||||||
id="stop7033" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient17794">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#f18383;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop17798" />
|
|
||||||
<stop
|
|
||||||
id="stop8006"
|
|
||||||
offset="0.3807947"
|
|
||||||
style="stop-color:#ed6767;stop-opacity:1;" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#e62323;stop-opacity:1;"
|
|
||||||
offset="1"
|
|
||||||
id="stop17796" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient17794"
|
|
||||||
id="linearGradient24732"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="472.42236"
|
|
||||||
y1="436.79602"
|
|
||||||
x2="461.39169"
|
|
||||||
y2="424.95065" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient17794"
|
|
||||||
id="linearGradient2438"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="472.42236"
|
|
||||||
y1="436.79602"
|
|
||||||
x2="461.39169"
|
|
||||||
y2="424.95065" />
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient17794"
|
|
||||||
id="radialGradient6052"
|
|
||||||
cx="466.73566"
|
|
||||||
cy="431.19708"
|
|
||||||
fx="466.73566"
|
|
||||||
fy="431.19708"
|
|
||||||
r="9.3095722"
|
|
||||||
gradientTransform="matrix(1,0,0,1.0057859,0,-2.4948735)"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient7029"
|
|
||||||
id="linearGradient7035"
|
|
||||||
x1="6.75"
|
|
||||||
y1="0.5"
|
|
||||||
x2="6.75"
|
|
||||||
y2="12.5"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
gridtolerance="10000"
|
|
||||||
guidetolerance="10"
|
|
||||||
objecttolerance="10"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="32"
|
|
||||||
inkscape:cx="8.6877264"
|
|
||||||
inkscape:cy="6.3888789"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="g25843"
|
|
||||||
width="14px"
|
|
||||||
height="14px"
|
|
||||||
inkscape:window-width="1280"
|
|
||||||
inkscape:window-height="998"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="0"
|
|
||||||
showgrid="true"
|
|
||||||
gridspacingx="0.5px"
|
|
||||||
gridspacingy="0.5px"
|
|
||||||
gridempspacing="2"
|
|
||||||
inkscape:grid-points="true" />
|
|
||||||
<metadata
|
|
||||||
id="metadata2275">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1">
|
|
||||||
<g
|
|
||||||
id="g25843"
|
|
||||||
transform="matrix(0.7931251,0,0,0.7931251,-372.13374,-408.22195)">
|
|
||||||
<path
|
|
||||||
sodipodi:type="arc"
|
|
||||||
style="fill:url(#radialGradient6052);fill-opacity:1.0;stroke:#c80000;stroke-width:1.43637741;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="path22737"
|
|
||||||
sodipodi:cx="466.73566"
|
|
||||||
sodipodi:cy="431.19708"
|
|
||||||
sodipodi:rx="8.5913839"
|
|
||||||
sodipodi:ry="8.6452484"
|
|
||||||
d="M 475.32704 431.19708 A 8.5913839 8.6452484 0 1 1 458.14427,431.19708 A 8.5913839 8.6452484 0 1 1 475.32704 431.19708 z"
|
|
||||||
transform="matrix(0.8805346,0,0,0.8750503,66.41784,145.57686)" />
|
|
||||||
<path
|
|
||||||
sodipodi:type="arc"
|
|
||||||
style="opacity:1;fill:url(#linearGradient7035);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="path6058"
|
|
||||||
sodipodi:cx="6.75"
|
|
||||||
sodipodi:cy="6.5"
|
|
||||||
sodipodi:rx="5.75"
|
|
||||||
sodipodi:ry="6"
|
|
||||||
d="M 12.5 6.5 A 5.75 6 0 1 1 1,6.5 A 5.75 6 0 1 1 12.5 6.5 z"
|
|
||||||
transform="matrix(0.9867408,0,0,0.6304178,470.73423,515.01579)" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 375 B |
Before Width: | Height: | Size: 1 KiB |
|
@ -1,154 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://web.resource.org/cc/"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="14"
|
|
||||||
height="14"
|
|
||||||
id="svg2270"
|
|
||||||
sodipodi:version="0.32"
|
|
||||||
inkscape:version="0.45.1"
|
|
||||||
version="1.0"
|
|
||||||
sodipodi:docbase="D:\depot\research\main\editor\images"
|
|
||||||
sodipodi:docname="breakpoint.svg"
|
|
||||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
|
||||||
<defs
|
|
||||||
id="defs2272">
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient7029">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#cfcfcf;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop7031" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#cfcfcf;stop-opacity:0;"
|
|
||||||
offset="1"
|
|
||||||
id="stop7033" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient17794">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#917373;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop17798" />
|
|
||||||
<stop
|
|
||||||
id="stop8006"
|
|
||||||
offset="0.3807947"
|
|
||||||
style="stop-color:#8d5757;stop-opacity:1;" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#862323;stop-opacity:1;"
|
|
||||||
offset="1"
|
|
||||||
id="stop17796" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient17794"
|
|
||||||
id="linearGradient24732"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="472.42236"
|
|
||||||
y1="436.79602"
|
|
||||||
x2="461.39169"
|
|
||||||
y2="424.95065" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient17794"
|
|
||||||
id="linearGradient2438"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="472.42236"
|
|
||||||
y1="436.79602"
|
|
||||||
x2="461.39169"
|
|
||||||
y2="424.95065" />
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient17794"
|
|
||||||
id="radialGradient6052"
|
|
||||||
cx="466.73566"
|
|
||||||
cy="431.19708"
|
|
||||||
fx="466.73566"
|
|
||||||
fy="431.19708"
|
|
||||||
r="9.3095722"
|
|
||||||
gradientTransform="matrix(1,0,0,1.0057859,0,-2.4948735)"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient7029"
|
|
||||||
id="linearGradient7035"
|
|
||||||
x1="6.75"
|
|
||||||
y1="0.5"
|
|
||||||
x2="6.75"
|
|
||||||
y2="12.5"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
gridtolerance="10000"
|
|
||||||
guidetolerance="10"
|
|
||||||
objecttolerance="10"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="32"
|
|
||||||
inkscape:cx="8.6877264"
|
|
||||||
inkscape:cy="6.3888789"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="g25843"
|
|
||||||
width="14px"
|
|
||||||
height="14px"
|
|
||||||
inkscape:window-width="1280"
|
|
||||||
inkscape:window-height="998"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="0"
|
|
||||||
showgrid="true"
|
|
||||||
gridspacingx="0.5px"
|
|
||||||
gridspacingy="0.5px"
|
|
||||||
gridempspacing="2"
|
|
||||||
inkscape:grid-points="true" />
|
|
||||||
<metadata
|
|
||||||
id="metadata2275">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1">
|
|
||||||
<g
|
|
||||||
id="g25843"
|
|
||||||
transform="matrix(0.7931251,0,0,0.7931251,-372.13374,-408.22195)">
|
|
||||||
<path
|
|
||||||
sodipodi:type="arc"
|
|
||||||
style="fill:url(#radialGradient6052);fill-opacity:1.0;stroke:#872727;stroke-width:1.43637741;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="path22737"
|
|
||||||
sodipodi:cx="466.73566"
|
|
||||||
sodipodi:cy="431.19708"
|
|
||||||
sodipodi:rx="8.5913839"
|
|
||||||
sodipodi:ry="8.6452484"
|
|
||||||
d="M 475.32704 431.19708 A 8.5913839 8.6452484 0 1 1 458.14427,431.19708 A 8.5913839 8.6452484 0 1 1 475.32704 431.19708 z"
|
|
||||||
transform="matrix(0.8805346,0,0,0.8750503,66.41784,145.57686)" />
|
|
||||||
<path
|
|
||||||
sodipodi:type="arc"
|
|
||||||
style="opacity:1;fill:url(#linearGradient7035);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="path6058"
|
|
||||||
sodipodi:cx="6.75"
|
|
||||||
sodipodi:cy="6.5"
|
|
||||||
sodipodi:rx="5.75"
|
|
||||||
sodipodi:ry="6"
|
|
||||||
d="M 12.5 6.5 A 5.75 6 0 1 1 1,6.5 A 5.75 6 0 1 1 12.5 6.5 z"
|
|
||||||
transform="matrix(0.9867408,0,0,0.6304178,470.73423,515.01579)" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 712 B |
|
@ -1,121 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://web.resource.org/cc/"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="14"
|
|
||||||
height="14"
|
|
||||||
id="svg2243"
|
|
||||||
sodipodi:version="0.32"
|
|
||||||
inkscape:version="0.45.1"
|
|
||||||
version="1.0"
|
|
||||||
sodipodi:docbase="c:\depot\research\main\editor\images"
|
|
||||||
sodipodi:docname="location.svg"
|
|
||||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
|
||||||
<defs
|
|
||||||
id="defs2245">
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient3134">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#dcdc23;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3136" />
|
|
||||||
<stop
|
|
||||||
id="stop5080"
|
|
||||||
offset="0.64285713"
|
|
||||||
style="stop-color:#e5d044;stop-opacity:1;" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#b89354;stop-opacity:1;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3138" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient3137">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#ffffff;stop-opacity:0.86274511;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3139" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#ffffff;stop-opacity:0;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3141" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3137"
|
|
||||||
id="linearGradient3143"
|
|
||||||
x1="6.5"
|
|
||||||
y1="3"
|
|
||||||
x2="6.515625"
|
|
||||||
y2="12.180227"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3134"
|
|
||||||
id="linearGradient3140"
|
|
||||||
x1="6.5"
|
|
||||||
y1="3.015625"
|
|
||||||
x2="6.484375"
|
|
||||||
y2="11.984375"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
gridtolerance="10000"
|
|
||||||
guidetolerance="10"
|
|
||||||
objecttolerance="10"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="64"
|
|
||||||
inkscape:cx="8.3920091"
|
|
||||||
inkscape:cy="7.4257237"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
width="14px"
|
|
||||||
height="14px"
|
|
||||||
showborder="true"
|
|
||||||
inkscape:window-width="1600"
|
|
||||||
inkscape:window-height="1174"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="0"
|
|
||||||
gridempspacing="2"
|
|
||||||
showgrid="true"
|
|
||||||
inkscape:grid-points="true"
|
|
||||||
gridspacingx="0.5px"
|
|
||||||
gridspacingy="0.5px" />
|
|
||||||
<metadata
|
|
||||||
id="metadata2248">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1">
|
|
||||||
<path
|
|
||||||
style="fill:url(#linearGradient3140);fill-opacity:1.0;fill-rule:evenodd;stroke:#b18b1b;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="M 6.5,3 L 6.5,5.5 L 0.5,5.5 L 0.5,9.5 L 6.5,9.5 L 6.5,12 L 13.125,7.5 L 6.5,3 z "
|
|
||||||
id="path2216"
|
|
||||||
sodipodi:nodetypes="cccccccc" />
|
|
||||||
<path
|
|
||||||
style="fill:url(#linearGradient3143);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:1"
|
|
||||||
d="M 6.5,3 L 6.5,5.5 L 0.5,5.5 L 0.5,7.5 C 7,6.5 7.5,9.5 13,7.5 L 6.5,3 z "
|
|
||||||
id="path5066"
|
|
||||||
sodipodi:nodetypes="cccccc" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 243 B |
Before Width: | Height: | Size: 534 B |
Before Width: | Height: | Size: 278 B |
Before Width: | Height: | Size: 273 B |
Before Width: | Height: | Size: 275 B |
|
@ -943,9 +943,6 @@ include/katie/QtScript/qscriptprogram.h
|
||||||
include/katie/QtScript/qscriptstring.h
|
include/katie/QtScript/qscriptstring.h
|
||||||
include/katie/QtScript/qscriptvalue.h
|
include/katie/QtScript/qscriptvalue.h
|
||||||
include/katie/QtScript/qscriptvalueiterator.h
|
include/katie/QtScript/qscriptvalueiterator.h
|
||||||
include/katie/QtScriptTools/QScriptEngineDebugger
|
|
||||||
include/katie/QtScriptTools/QtScriptTools
|
|
||||||
include/katie/QtScriptTools/qscriptenginedebugger.h
|
|
||||||
include/katie/QtSvg/QSvgRenderer
|
include/katie/QtSvg/QSvgRenderer
|
||||||
include/katie/QtSvg/QtSvg
|
include/katie/QtSvg/QtSvg
|
||||||
include/katie/QtSvg/qsvgrenderer.h
|
include/katie/QtSvg/qsvgrenderer.h
|
||||||
|
|
|
@ -393,7 +393,6 @@ classlist = [
|
||||||
"QScriptContextInfoList",
|
"QScriptContextInfoList",
|
||||||
"QScriptEngine",
|
"QScriptEngine",
|
||||||
"QScriptEngineAgent",
|
"QScriptEngineAgent",
|
||||||
"QScriptEngineDebugger",
|
|
||||||
"QScriptExtensionInterface",
|
"QScriptExtensionInterface",
|
||||||
"QScriptExtensionPlugin",
|
"QScriptExtensionPlugin",
|
||||||
"QScriptProgram",
|
"QScriptProgram",
|
||||||
|
@ -666,7 +665,6 @@ classlist = [
|
||||||
"QtPlugin",
|
"QtPlugin",
|
||||||
"QtPluginInstanceFunction",
|
"QtPluginInstanceFunction",
|
||||||
"QtScript",
|
"QtScript",
|
||||||
"QtScriptTools",
|
|
||||||
"QtSvg",
|
"QtSvg",
|
||||||
"QtTest",
|
"QtTest",
|
||||||
"QtTestGui",
|
"QtTestGui",
|
||||||
|
|
|
@ -1621,28 +1621,6 @@ int qrand()
|
||||||
with meaningful parameter names in their signatures.
|
with meaningful parameter names in their signatures.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Q_GLOBAL_STATIC(QStdVector<qInternalCallback>, qGlobalCallbacks)
|
|
||||||
|
|
||||||
void QInternal::registerCallback(qInternalCallback callback)
|
|
||||||
{
|
|
||||||
qGlobalCallbacks()->append(callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QInternal::unregisterCallback(qInternalCallback callback)
|
|
||||||
{
|
|
||||||
qGlobalCallbacks()->removeAll(callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QInternal::activateCallbacks(void **parameters)
|
|
||||||
{
|
|
||||||
QStdVector<qInternalCallback> *callbacks = qGlobalCallbacks();
|
|
||||||
bool ret = false;
|
|
||||||
for (int i = 0; i < callbacks->size(); i++) {
|
|
||||||
ret |= (callbacks->at(i))(parameters);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\macro Q_BYTE_ORDER
|
\macro Q_BYTE_ORDER
|
||||||
\relates <QtGlobal>
|
\relates <QtGlobal>
|
||||||
|
|
|
@ -1106,8 +1106,6 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::ItemFlags)
|
||||||
Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::MatchFlags)
|
Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::MatchFlags)
|
||||||
Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::TextInteractionFlags)
|
Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::TextInteractionFlags)
|
||||||
|
|
||||||
typedef bool (*qInternalCallback)(void **);
|
|
||||||
|
|
||||||
class Q_CORE_EXPORT QInternal {
|
class Q_CORE_EXPORT QInternal {
|
||||||
public:
|
public:
|
||||||
enum PaintDeviceFlags {
|
enum PaintDeviceFlags {
|
||||||
|
@ -1125,11 +1123,6 @@ public:
|
||||||
BottomDock,
|
BottomDock,
|
||||||
DockCount
|
DockCount
|
||||||
};
|
};
|
||||||
|
|
||||||
static void registerCallback(qInternalCallback);
|
|
||||||
static void unregisterCallback(qInternalCallback);
|
|
||||||
|
|
||||||
static bool activateCallbacks(void **);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
|
@ -419,13 +419,6 @@ bool QCoreApplication::testAttribute(Qt::ApplicationAttribute attribute)
|
||||||
*/
|
*/
|
||||||
bool QCoreApplication::notifyInternal(QObject *receiver, QEvent *event)
|
bool QCoreApplication::notifyInternal(QObject *receiver, QEvent *event)
|
||||||
{
|
{
|
||||||
// only script debugger uses the callbacks
|
|
||||||
bool result = false;
|
|
||||||
void *cbdata[] = { receiver, event, &result };
|
|
||||||
if (Q_UNLIKELY(QInternal::activateCallbacks(cbdata))) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Qt enforces the rule that events can only be sent to objects in
|
// Qt enforces the rule that events can only be sent to objects in
|
||||||
// the current thread, so receiver->d_func()->threadData is
|
// the current thread, so receiver->d_func()->threadData is
|
||||||
// equivalent to QThreadData::current(), just without the function
|
// equivalent to QThreadData::current(), just without the function
|
||||||
|
|
|
@ -1,197 +0,0 @@
|
||||||
# add_definitions()
|
|
||||||
set(EXTRA_SCRIPTTOOLS_LIBS
|
|
||||||
KtCore KtXml KtGui KtScript
|
|
||||||
)
|
|
||||||
|
|
||||||
set(SCRIPTTOOLS_PUBLIC_HEADERS
|
|
||||||
QScriptEngineDebugger
|
|
||||||
)
|
|
||||||
|
|
||||||
include_directories(
|
|
||||||
${CMAKE_BINARY_DIR}/include
|
|
||||||
${CMAKE_BINARY_DIR}/privateinclude
|
|
||||||
${CMAKE_BINARY_DIR}/include/QtCore
|
|
||||||
${CMAKE_BINARY_DIR}/include/QtGui
|
|
||||||
${CMAKE_BINARY_DIR}/include/QtScript
|
|
||||||
${CMAKE_BINARY_DIR}/include/QtScriptTools
|
|
||||||
)
|
|
||||||
|
|
||||||
set(SCRIPTTOOLS_HEADERS
|
|
||||||
${SCRIPTTOOLS_HEADERS}
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggervalue_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggervalueproperty_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerobjectsnapshotdelta_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercommand_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercommandschedulerinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercommandschedulerfrontend_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerresponse_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerresponsehandlerinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerevent_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercommandexecutor_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerbackend_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerbackend_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggeragent_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggeragent_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerfrontend_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerfrontend_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptmessagehandlerinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptstdmessagehandler_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptenginedebuggerfrontend_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerjob_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerjob_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercommandschedulerjob_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercommandschedulerjob_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerjobschedulerinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggereventhandlerinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptvalueproperty_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptobjectsnapshot_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptscriptdata_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptxmlparser_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptbreakpointdata_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebugger_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsole_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolecommand_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolecommand_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolecommandjob_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolecommandjob_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolecommandgroupdata_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolecommandmanager_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolehistorianinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptcompletionproviderinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptcompletiontaskinterface_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptcompletiontaskinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptcompletiontask_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscripttooltipproviderinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsoleglobalobject_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerscriptedconsolecommand_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolewidgetinterface_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolewidgetinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolewidget_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerstackwidgetinterface_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerstackwidgetinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerstackwidget_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerstackmodel_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerscriptswidgetinterface_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerscriptswidgetinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerscriptswidget_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerscriptsmodel_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerlocalswidgetinterface_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerlocalswidgetinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerlocalswidget_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerlocalsmodel_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodewidgetinterface_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodewidgetinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodewidget_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodeviewinterface_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodeviewinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodeview_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodefinderwidgetinterface_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodefinderwidgetinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodefinderwidget_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebugoutputwidgetinterface_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebugoutputwidgetinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebugoutputwidget_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptbreakpointswidgetinterface_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptbreakpointswidgetinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptbreakpointswidget_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptbreakpointsmodel_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscripterrorlogwidgetinterface_p_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscripterrorlogwidgetinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscripterrorlogwidget_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerwidgetfactoryinterface_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerstandardwidgetfactory_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptedit_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptsyntaxhighlighter_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptenginedebugger.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/qscripttoolscommon_p.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/qscripttoolsresources_p.h
|
|
||||||
)
|
|
||||||
|
|
||||||
set(SCRIPTTOOLS_SOURCES
|
|
||||||
${SCRIPTTOOLS_SOURCES}
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggervalue.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggervalueproperty.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercommand.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerresponse.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerevent.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercommandexecutor.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercommandschedulerfrontend.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerbackend.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggeragent.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerfrontend.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptstdmessagehandler.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptenginedebuggerfrontend.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerjob.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercommandschedulerjob.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptvalueproperty.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptobjectsnapshot.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptscriptdata.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptxmlparser.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptbreakpointdata.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebugger.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsole.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolecommand.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolecommandjob.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolecommandgroupdata.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolecommandmanager.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptcompletiontaskinterface.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptcompletiontask.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsoleglobalobject.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerscriptedconsolecommand.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolewidgetinterface.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerconsolewidget.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerstackwidgetinterface.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerstackwidget.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerstackmodel.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerscriptswidgetinterface.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerscriptswidget.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerscriptsmodel.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerlocalswidgetinterface.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerlocalswidget.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerlocalsmodel.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodewidgetinterface.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodewidget.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodeviewinterface.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodeview.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodefinderwidgetinterface.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggercodefinderwidget.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebugoutputwidgetinterface.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebugoutputwidget.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptbreakpointswidgetinterface.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptbreakpointswidget.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptbreakpointsmodel.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscripterrorlogwidgetinterface.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscripterrorlogwidget.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptdebuggerstandardwidgetfactory.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptedit.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptsyntaxhighlighter.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/debugging/qscriptenginedebugger.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
katie_generate_misc("${SCRIPTTOOLS_HEADERS}" QtScriptTools)
|
|
||||||
katie_generate_public("${SCRIPTTOOLS_PUBLIC_HEADERS}" QtScriptTools)
|
|
||||||
katie_generate_package(KtScriptTools "KtCore KtXml KtGui KtScript")
|
|
||||||
katie_setup_target(KtScriptTools ${SCRIPTTOOLS_SOURCES} ${SCRIPTTOOLS_HEADERS})
|
|
||||||
|
|
||||||
add_library(KtScriptTools ${KATIE_TYPE} ${KtScriptTools_SOURCES})
|
|
||||||
target_link_libraries(KtScriptTools PRIVATE ${EXTRA_SCRIPTTOOLS_LIBS})
|
|
||||||
set_target_properties(KtScriptTools PROPERTIES
|
|
||||||
VERSION ${KATIE_MAJOR}.${KATIE_MINOR}
|
|
||||||
SOVERSION ${KATIE_VERSION}
|
|
||||||
EXPORT_NAME ScriptTools
|
|
||||||
)
|
|
||||||
|
|
||||||
install(
|
|
||||||
TARGETS KtScriptTools
|
|
||||||
EXPORT KatieTargets
|
|
||||||
DESTINATION ${KATIE_LIBRARIES_PATH}
|
|
||||||
COMPONENT Runtime
|
|
||||||
)
|
|
||||||
|
|
||||||
install(
|
|
||||||
DIRECTORY ${CMAKE_BINARY_DIR}/include/QtScriptTools
|
|
||||||
DESTINATION ${KATIE_HEADERS_PATH}
|
|
||||||
COMPONENT Devel
|
|
||||||
)
|
|
||||||
|
|
||||||
katie_optimize_headers(${KATIE_HEADERS_PATH}/QtScriptTools)
|
|
|
@ -1,372 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptbreakpointdata_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qdatastream.h>
|
|
||||||
#include <QtCore/qstring.h>
|
|
||||||
#include <QtCore/qvariant.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\since 4.5
|
|
||||||
\class QScriptBreakpointData
|
|
||||||
\internal
|
|
||||||
|
|
||||||
\brief The QScriptBreakpointData class contains data associated with a breakpoint.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class QScriptBreakpointDataPrivate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptBreakpointDataPrivate();
|
|
||||||
~QScriptBreakpointDataPrivate();
|
|
||||||
|
|
||||||
void init(int ln);
|
|
||||||
|
|
||||||
qint64 scriptId;
|
|
||||||
QString fileName;
|
|
||||||
int lineNumber;
|
|
||||||
bool enabled;
|
|
||||||
bool singleShot;
|
|
||||||
int ignoreCount;
|
|
||||||
QString condition;
|
|
||||||
QVariant data;
|
|
||||||
int hitCount;
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptBreakpointDataPrivate::QScriptBreakpointDataPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointDataPrivate::~QScriptBreakpointDataPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptBreakpointDataPrivate::init(int ln)
|
|
||||||
{
|
|
||||||
scriptId = -1;
|
|
||||||
lineNumber = ln;
|
|
||||||
enabled = true;
|
|
||||||
singleShot = false;
|
|
||||||
ignoreCount = 0;
|
|
||||||
hitCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs an empty QScriptBreakpointData.
|
|
||||||
*/
|
|
||||||
QScriptBreakpointData::QScriptBreakpointData()
|
|
||||||
: d_ptr(new QScriptBreakpointDataPrivate)
|
|
||||||
{
|
|
||||||
d_ptr->init(/*lineNumber=*/-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs a QScriptBreakpointData with the given \a lineNumber.
|
|
||||||
*/
|
|
||||||
QScriptBreakpointData::QScriptBreakpointData(qint64 scriptId, int lineNumber)
|
|
||||||
: d_ptr(new QScriptBreakpointDataPrivate)
|
|
||||||
{
|
|
||||||
d_ptr->init(lineNumber);
|
|
||||||
d_ptr->scriptId = scriptId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs a QScriptBreakpointData with the given \a lineNumber.
|
|
||||||
*/
|
|
||||||
QScriptBreakpointData::QScriptBreakpointData(const QString &fileName, int lineNumber)
|
|
||||||
: d_ptr(new QScriptBreakpointDataPrivate)
|
|
||||||
{
|
|
||||||
d_ptr->init(lineNumber);
|
|
||||||
d_ptr->fileName = fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs a QScriptBreakpointData that is a copy of \a other.
|
|
||||||
*/
|
|
||||||
QScriptBreakpointData::QScriptBreakpointData(const QScriptBreakpointData &other)
|
|
||||||
: d_ptr(new QScriptBreakpointDataPrivate)
|
|
||||||
{
|
|
||||||
Q_ASSERT(other.d_ptr != 0);
|
|
||||||
*d_ptr = *other.d_ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Destroys this QScriptBreakpointData.
|
|
||||||
*/
|
|
||||||
QScriptBreakpointData::~QScriptBreakpointData()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Assigns \a other to this QScriptBreakpointData.
|
|
||||||
*/
|
|
||||||
QScriptBreakpointData &QScriptBreakpointData::operator=(const QScriptBreakpointData &other)
|
|
||||||
{
|
|
||||||
Q_ASSERT(d_ptr != 0);
|
|
||||||
Q_ASSERT(other.d_ptr != 0);
|
|
||||||
*d_ptr = *other.d_ptr;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
qint64 QScriptBreakpointData::scriptId() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointData);
|
|
||||||
return d->scriptId;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptBreakpointData::setScriptId(qint64 id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointData);
|
|
||||||
d->scriptId = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScriptBreakpointData::fileName() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointData);
|
|
||||||
return d->fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptBreakpointData::setFileName(const QString &fileName)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointData);
|
|
||||||
d->fileName = fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the breakpoint line number.
|
|
||||||
*/
|
|
||||||
int QScriptBreakpointData::lineNumber() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointData);
|
|
||||||
return d->lineNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the breakpoint line number to \a lineNumber.
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointData::setLineNumber(int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointData);
|
|
||||||
d->lineNumber = lineNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns true if the breakpoint is enabled, false otherwise.
|
|
||||||
*/
|
|
||||||
bool QScriptBreakpointData::isEnabled() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointData);
|
|
||||||
return d->enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the \a enabled state of the breakpoint.
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointData::setEnabled(bool enabled)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointData);
|
|
||||||
d->enabled = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns true if the breakpoint is single-shot, false otherwise.
|
|
||||||
*/
|
|
||||||
bool QScriptBreakpointData::isSingleShot() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointData);
|
|
||||||
return d->singleShot;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the \a singleShot state of the breakpoint.
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointData::setSingleShot(bool singleShot)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointData);
|
|
||||||
d->singleShot = singleShot;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the ignore count of the breakpoint.
|
|
||||||
*/
|
|
||||||
int QScriptBreakpointData::ignoreCount() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointData);
|
|
||||||
return d->ignoreCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the ignore \a count of the breakpoint.
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointData::setIgnoreCount(int count)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointData);
|
|
||||||
d->ignoreCount = count;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
If the ignore count is 0, this function increments the hit count and
|
|
||||||
returns true. Otherwise, it decrements the ignore count and returns
|
|
||||||
false.
|
|
||||||
*/
|
|
||||||
bool QScriptBreakpointData::hit()
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointData);
|
|
||||||
if (d->ignoreCount == 0) {
|
|
||||||
++d->hitCount;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
--d->ignoreCount;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the hit count of the breakpoint (the number of times the
|
|
||||||
breakpoint has been triggered).
|
|
||||||
*/
|
|
||||||
int QScriptBreakpointData::hitCount() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointData);
|
|
||||||
return d->hitCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the condition of the breakpoint.
|
|
||||||
*/
|
|
||||||
QString QScriptBreakpointData::condition() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointData);
|
|
||||||
return d->condition;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the \a condition of the breakpoint.
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointData::setCondition(const QString &condition)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointData);
|
|
||||||
d->condition = condition;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns custom data associated with the breakpoint.
|
|
||||||
*/
|
|
||||||
QVariant QScriptBreakpointData::data() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointData);
|
|
||||||
return d->data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets custom \a data associated with the breakpoint.
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointData::setData(const QVariant &data)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointData);
|
|
||||||
d->data = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QScriptBreakpointData::isValid() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointData);
|
|
||||||
return (((d->scriptId != -1) || !d->fileName.isEmpty())
|
|
||||||
&& (d->lineNumber != -1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns true if this QScriptBreakpointData is equal to the \a other
|
|
||||||
data, otherwise returns false.
|
|
||||||
*/
|
|
||||||
bool QScriptBreakpointData::operator==(const QScriptBreakpointData &other) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointData);
|
|
||||||
const QScriptBreakpointDataPrivate *od = other.d_func();
|
|
||||||
if (d == od)
|
|
||||||
return true;
|
|
||||||
if (!d || !od)
|
|
||||||
return false;
|
|
||||||
return ((d->scriptId == od->scriptId)
|
|
||||||
&& (d->fileName == od->fileName)
|
|
||||||
&& (d->lineNumber == od->lineNumber)
|
|
||||||
&& (d->enabled == od->enabled)
|
|
||||||
&& (d->singleShot == od->singleShot)
|
|
||||||
&& (d->condition == od->condition)
|
|
||||||
&& (d->ignoreCount == od->ignoreCount)
|
|
||||||
&& (d->data == od->data)
|
|
||||||
&& (d->hitCount == od->hitCount));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns true if this QScriptBreakpointData is not equal to the \a
|
|
||||||
other data, otherwise returns false.
|
|
||||||
*/
|
|
||||||
bool QScriptBreakpointData::operator!=(const QScriptBreakpointData &other) const
|
|
||||||
{
|
|
||||||
return !(*this == other);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn QDataStream &operator<<(QDataStream &stream, const QScriptBreakpointData &data)
|
|
||||||
\relates QScriptBreakpointData
|
|
||||||
|
|
||||||
Writes the given \a data to the specified \a stream.
|
|
||||||
*/
|
|
||||||
QDataStream &operator<<(QDataStream &out, const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
const QScriptBreakpointDataPrivate *d = data.d_ptr.data();
|
|
||||||
out << d->scriptId;
|
|
||||||
out << d->fileName;
|
|
||||||
out << d->lineNumber;
|
|
||||||
out << d->enabled;
|
|
||||||
out << d->singleShot;
|
|
||||||
out << d->ignoreCount;
|
|
||||||
out << d->condition;
|
|
||||||
out << d->data;
|
|
||||||
out << d->hitCount;
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn QDataStream &operator>>(QDataStream &stream, QScriptBreakpointData &data)
|
|
||||||
\relates QScriptBreakpointData
|
|
||||||
|
|
||||||
Reads a QScriptBreakpointData from the specified \a stream into the
|
|
||||||
given \a data.
|
|
||||||
*/
|
|
||||||
QDataStream &operator>>(QDataStream &in, QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
QScriptBreakpointDataPrivate *d = data.d_ptr.data();
|
|
||||||
in >> d->scriptId;
|
|
||||||
in >> d->fileName;
|
|
||||||
in >> d->lineNumber;
|
|
||||||
in >> d->enabled;
|
|
||||||
in >> d->singleShot;
|
|
||||||
in >> d->ignoreCount;
|
|
||||||
in >> d->condition;
|
|
||||||
in >> d->data;
|
|
||||||
in >> d->hitCount;
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
|
@ -1,109 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTBREAKPOINTDATA_P_H
|
|
||||||
#define QSCRIPTBREAKPOINTDATA_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobjectdefs.h>
|
|
||||||
#include <QtCore/qscopedpointer.h>
|
|
||||||
#include <QtCore/qmap.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QDataStream;
|
|
||||||
class QVariant;
|
|
||||||
|
|
||||||
class QScriptBreakpointDataPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptBreakpointData
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
friend Q_AUTOTEST_EXPORT QDataStream &operator<<(QDataStream &, const QScriptBreakpointData &);
|
|
||||||
friend Q_AUTOTEST_EXPORT QDataStream &operator>>(QDataStream &, QScriptBreakpointData &);
|
|
||||||
|
|
||||||
QScriptBreakpointData();
|
|
||||||
QScriptBreakpointData(qint64 scriptId, int lineNumber);
|
|
||||||
QScriptBreakpointData(const QString &fileName, int lineNumber);
|
|
||||||
QScriptBreakpointData(const QScriptBreakpointData &other);
|
|
||||||
~QScriptBreakpointData();
|
|
||||||
QScriptBreakpointData &operator=(const QScriptBreakpointData &other);
|
|
||||||
|
|
||||||
bool isValid() const;
|
|
||||||
|
|
||||||
// location
|
|
||||||
qint64 scriptId() const;
|
|
||||||
void setScriptId(qint64 id);
|
|
||||||
|
|
||||||
QString fileName() const;
|
|
||||||
void setFileName(const QString &fileName);
|
|
||||||
|
|
||||||
int lineNumber() const;
|
|
||||||
void setLineNumber(int lineNumber);
|
|
||||||
|
|
||||||
// data
|
|
||||||
bool isEnabled() const;
|
|
||||||
void setEnabled(bool enabled);
|
|
||||||
|
|
||||||
bool isSingleShot() const;
|
|
||||||
void setSingleShot(bool singleShot);
|
|
||||||
|
|
||||||
int ignoreCount() const;
|
|
||||||
void setIgnoreCount(int count);
|
|
||||||
|
|
||||||
QString condition() const;
|
|
||||||
void setCondition(const QString &condition);
|
|
||||||
|
|
||||||
QVariant data() const;
|
|
||||||
void setData(const QVariant &data);
|
|
||||||
|
|
||||||
bool hit();
|
|
||||||
|
|
||||||
// statistics
|
|
||||||
int hitCount() const;
|
|
||||||
|
|
||||||
|
|
||||||
bool operator==(const QScriptBreakpointData &other) const;
|
|
||||||
bool operator!=(const QScriptBreakpointData &other) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
QScopedPointer<QScriptBreakpointDataPrivate> d_ptr;
|
|
||||||
|
|
||||||
Q_DECLARE_PRIVATE(QScriptBreakpointData)
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef QMap<int, QScriptBreakpointData> QScriptBreakpointMap;
|
|
||||||
|
|
||||||
Q_AUTOTEST_EXPORT QDataStream &operator<<(QDataStream &, const QScriptBreakpointData &);
|
|
||||||
Q_AUTOTEST_EXPORT QDataStream &operator>>(QDataStream &, QScriptBreakpointData &);
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,478 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptbreakpointsmodel_p.h"
|
|
||||||
#include "qscriptdebuggerjobschedulerinterface_p.h"
|
|
||||||
#include "qscriptdebuggercommandschedulerjob_p.h"
|
|
||||||
#include "qscriptdebuggercommandschedulerfrontend_p.h"
|
|
||||||
|
|
||||||
#include "qabstractitemmodel_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qpair.h>
|
|
||||||
#include <QtCore/qcoreapplication.h>
|
|
||||||
#include <QtCore/qdebug.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\since 4.5
|
|
||||||
\class QScriptBreakpointsModel
|
|
||||||
\internal
|
|
||||||
*/
|
|
||||||
|
|
||||||
class QScriptBreakpointsModelPrivate
|
|
||||||
: public QAbstractItemModelPrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptBreakpointsModel)
|
|
||||||
public:
|
|
||||||
QScriptBreakpointsModelPrivate();
|
|
||||||
~QScriptBreakpointsModelPrivate();
|
|
||||||
|
|
||||||
QScriptDebuggerJobSchedulerInterface *jobScheduler;
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler;
|
|
||||||
QList<QPair<int, QScriptBreakpointData> > breakpoints;
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptBreakpointsModelPrivate::QScriptBreakpointsModelPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointsModelPrivate::~QScriptBreakpointsModelPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointsModel::QScriptBreakpointsModel(
|
|
||||||
QScriptDebuggerJobSchedulerInterface *jobScheduler,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler,
|
|
||||||
QObject *parent)
|
|
||||||
: QAbstractItemModel(*new QScriptBreakpointsModelPrivate, parent)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsModel);
|
|
||||||
d->jobScheduler = jobScheduler;
|
|
||||||
d->commandScheduler = commandScheduler;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointsModel::~QScriptBreakpointsModel()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
|
|
||||||
class SetBreakpointJob : public QScriptDebuggerCommandSchedulerJob
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SetBreakpointJob(const QScriptBreakpointData &data,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *scheduler)
|
|
||||||
: QScriptDebuggerCommandSchedulerJob(scheduler),
|
|
||||||
m_data(data)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void start()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommandSchedulerFrontend frontend(commandScheduler(), this);
|
|
||||||
frontend.scheduleSetBreakpoint(m_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleResponse(const QScriptDebuggerResponse &, int)
|
|
||||||
{
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
QScriptBreakpointData m_data;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets a breakpoint defined by the given \a data.
|
|
||||||
A new row will be inserted into the model if the breakpoint could be
|
|
||||||
successfully set.
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointsModel::setBreakpoint(const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsModel);
|
|
||||||
QScriptDebuggerJob *job = new SetBreakpointJob(data, d->commandScheduler);
|
|
||||||
d->jobScheduler->scheduleJob(job);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
|
|
||||||
class SetBreakpointDataJob : public QScriptDebuggerCommandSchedulerJob
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SetBreakpointDataJob(int id, const QScriptBreakpointData &data,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *scheduler)
|
|
||||||
: QScriptDebuggerCommandSchedulerJob(scheduler),
|
|
||||||
m_id(id), m_data(data)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void start()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommandSchedulerFrontend frontend(commandScheduler(), this);
|
|
||||||
frontend.scheduleSetBreakpointData(m_id, m_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleResponse(const QScriptDebuggerResponse &, int)
|
|
||||||
{
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_id;
|
|
||||||
QScriptBreakpointData m_data;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the \a data associated with the breakpoint identified by \a id.
|
|
||||||
A dataChanged() signal will be emitted if the breakpoint data could
|
|
||||||
be successfully changed.
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointsModel::setBreakpointData(int id, const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsModel);
|
|
||||||
QScriptDebuggerJob *job = new SetBreakpointDataJob(id, data, d->commandScheduler);
|
|
||||||
d->jobScheduler->scheduleJob(job);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
|
|
||||||
class DeleteBreakpointJob : public QScriptDebuggerCommandSchedulerJob
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DeleteBreakpointJob(int id, QScriptDebuggerCommandSchedulerInterface *scheduler)
|
|
||||||
: QScriptDebuggerCommandSchedulerJob(scheduler),
|
|
||||||
m_id(id)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void start()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommandSchedulerFrontend frontend(commandScheduler(), this);
|
|
||||||
frontend.scheduleDeleteBreakpoint(m_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleResponse(const QScriptDebuggerResponse &, int)
|
|
||||||
{
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_id;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Deletes the breakpoint with the given \a id.
|
|
||||||
The corresponding row in the model will be removed if the breakpoint
|
|
||||||
was successfully deleted.
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointsModel::deleteBreakpoint(int id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsModel);
|
|
||||||
QScriptDebuggerJob *job = new DeleteBreakpointJob(id, d->commandScheduler);
|
|
||||||
d->jobScheduler->scheduleJob(job);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Adds a breakpoint to the model. This function does not actually set
|
|
||||||
a breakpoint (i.e. it doesn't communicate with the debugger).
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointsModel::addBreakpoint(int id, const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsModel);
|
|
||||||
int rowIndex = d->breakpoints.size();
|
|
||||||
beginInsertRows(QModelIndex(), rowIndex, rowIndex);
|
|
||||||
d->breakpoints.append(qMakePair(id, data));
|
|
||||||
endInsertRows();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Modify the \a data of breakpoint \a id.
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointsModel::modifyBreakpoint(int id, const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsModel);
|
|
||||||
for (int i = 0; i < d->breakpoints.size(); ++i) {
|
|
||||||
if (d->breakpoints.at(i).first == id) {
|
|
||||||
d->breakpoints[i] = qMakePair(id, data);
|
|
||||||
emit dataChanged(createIndex(i, 0), createIndex(i, columnCount()-1));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Remove the breakpoint identified by \a id from the model. This
|
|
||||||
function does not delete the breakpoint (i.e. it doesn't communicate
|
|
||||||
with the debugger).
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointsModel::removeBreakpoint(int id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsModel);
|
|
||||||
for (int i = 0; i < d->breakpoints.size(); ++i) {
|
|
||||||
if (d->breakpoints.at(i).first == id) {
|
|
||||||
beginRemoveRows(QModelIndex(), i, i);
|
|
||||||
d->breakpoints.removeAt(i);
|
|
||||||
endRemoveRows();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the id of the breakpoint at the given \a row.
|
|
||||||
*/
|
|
||||||
int QScriptBreakpointsModel::breakpointIdAt(int row) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointsModel);
|
|
||||||
return d->breakpoints.at(row).first;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the data for the breakpoint at the given \a row.
|
|
||||||
*/
|
|
||||||
QScriptBreakpointData QScriptBreakpointsModel::breakpointDataAt(int row) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointsModel);
|
|
||||||
return d->breakpoints.at(row).second;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointData QScriptBreakpointsModel::breakpointData(int id) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointsModel);
|
|
||||||
for (int i = 0; i < d->breakpoints.size(); ++i) {
|
|
||||||
if (d->breakpoints.at(i).first == id)
|
|
||||||
return d->breakpoints.at(i).second;
|
|
||||||
}
|
|
||||||
return QScriptBreakpointData();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Tries to find a breakpoint with the given \a scriptId and \a
|
|
||||||
lineNumber. Returns the id of the first breakpoint that matches, or
|
|
||||||
-1 if no such breakpoint is found.
|
|
||||||
*/
|
|
||||||
int QScriptBreakpointsModel::resolveBreakpoint(qint64 scriptId, int lineNumber) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointsModel);
|
|
||||||
for (int i = 0; i < d->breakpoints.size(); ++i) {
|
|
||||||
if ((d->breakpoints.at(i).second.scriptId() == scriptId)
|
|
||||||
&& (d->breakpoints.at(i).second.lineNumber() == lineNumber)) {
|
|
||||||
return d->breakpoints.at(i).first;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptBreakpointsModel::resolveBreakpoint(const QString &fileName, int lineNumber) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointsModel);
|
|
||||||
for (int i = 0; i < d->breakpoints.size(); ++i) {
|
|
||||||
if ((d->breakpoints.at(i).second.fileName() == fileName)
|
|
||||||
&& (d->breakpoints.at(i).second.lineNumber() == lineNumber)) {
|
|
||||||
return d->breakpoints.at(i).first;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
QModelIndex QScriptBreakpointsModel::index(int row, int column, const QModelIndex &parent) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointsModel);
|
|
||||||
if (parent.isValid())
|
|
||||||
return QModelIndex();
|
|
||||||
if ((row < 0) || (row >= d->breakpoints.size()))
|
|
||||||
return QModelIndex();
|
|
||||||
if ((column < 0) || (column >= columnCount()))
|
|
||||||
return QModelIndex();
|
|
||||||
return createIndex(row, column);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
QModelIndex QScriptBreakpointsModel::parent(const QModelIndex &) const
|
|
||||||
{
|
|
||||||
return QModelIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
int QScriptBreakpointsModel::columnCount(const QModelIndex &parent) const
|
|
||||||
{
|
|
||||||
if (!parent.isValid())
|
|
||||||
return 6;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
int QScriptBreakpointsModel::rowCount(const QModelIndex &parent) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointsModel);
|
|
||||||
if (!parent.isValid())
|
|
||||||
return d->breakpoints.size();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
QVariant QScriptBreakpointsModel::data(const QModelIndex &index, int role) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointsModel);
|
|
||||||
if (!index.isValid() || (index.row() >= d->breakpoints.size()))
|
|
||||||
return QVariant();
|
|
||||||
const QPair<int, QScriptBreakpointData> &item = d->breakpoints.at(index.row());
|
|
||||||
if (role == Qt::DisplayRole) {
|
|
||||||
if (index.column() == 0)
|
|
||||||
return item.first;
|
|
||||||
else if (index.column() == 1) {
|
|
||||||
QString loc = item.second.fileName();
|
|
||||||
if (loc.isEmpty())
|
|
||||||
loc = QString::fromLatin1("<anonymous script, id=%0>").arg(item.second.scriptId());
|
|
||||||
loc.append(QString::fromLatin1(":%0").arg(item.second.lineNumber()));
|
|
||||||
return loc;
|
|
||||||
} else if (index.column() == 2) {
|
|
||||||
if (!item.second.condition().isEmpty())
|
|
||||||
return item.second.condition();
|
|
||||||
} else if (index.column() == 3) {
|
|
||||||
if (item.second.ignoreCount() != 0)
|
|
||||||
return item.second.ignoreCount();
|
|
||||||
} else if (index.column() == 5) {
|
|
||||||
return item.second.hitCount();
|
|
||||||
}
|
|
||||||
} else if (role == Qt::CheckStateRole) {
|
|
||||||
if (index.column() == 0) {
|
|
||||||
return item.second.isEnabled() ? Qt::Checked : Qt::Unchecked;
|
|
||||||
} else if (index.column() == 4) {
|
|
||||||
return item.second.isSingleShot() ? Qt::Checked : Qt::Unchecked;
|
|
||||||
}
|
|
||||||
} else if (role == Qt::EditRole) {
|
|
||||||
if (index.column() == 2)
|
|
||||||
return item.second.condition();
|
|
||||||
else if (index.column() == 3)
|
|
||||||
return item.second.ignoreCount();
|
|
||||||
}
|
|
||||||
return QVariant();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
bool QScriptBreakpointsModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsModel);
|
|
||||||
if (!index.isValid() || (index.row() >= d->breakpoints.size()))
|
|
||||||
return false;
|
|
||||||
const QPair<int, QScriptBreakpointData> &item = d->breakpoints.at(index.row());
|
|
||||||
QScriptBreakpointData modifiedData;
|
|
||||||
int col = index.column();
|
|
||||||
if ((col == 0) || (col == 4)) {
|
|
||||||
if (role == Qt::CheckStateRole) {
|
|
||||||
modifiedData = item.second;
|
|
||||||
if (col == 0)
|
|
||||||
modifiedData.setEnabled(value.toInt() == Qt::Checked);
|
|
||||||
else
|
|
||||||
modifiedData.setSingleShot(value.toInt() == Qt::Checked);
|
|
||||||
}
|
|
||||||
} else if (col == 2) {
|
|
||||||
if (role == Qt::EditRole) {
|
|
||||||
modifiedData = item.second;
|
|
||||||
modifiedData.setCondition(value.toString());
|
|
||||||
}
|
|
||||||
} else if (col == 3) {
|
|
||||||
if (role == Qt::EditRole) {
|
|
||||||
modifiedData = item.second;
|
|
||||||
modifiedData.setIgnoreCount(value.toInt());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!modifiedData.isValid())
|
|
||||||
return false;
|
|
||||||
QScriptDebuggerJob *job = new SetBreakpointDataJob(item.first, modifiedData, d->commandScheduler);
|
|
||||||
d->jobScheduler->scheduleJob(job);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
QVariant QScriptBreakpointsModel::headerData(int section, Qt::Orientation orient, int role) const
|
|
||||||
{
|
|
||||||
if (orient == Qt::Horizontal) {
|
|
||||||
if (role == Qt::DisplayRole) {
|
|
||||||
if (section == 0)
|
|
||||||
return QCoreApplication::translate("QScriptBreakpointsModel", "ID");
|
|
||||||
else if (section == 1)
|
|
||||||
return QCoreApplication::translate("QScriptBreakpointsModel", "Location");
|
|
||||||
else if (section == 2)
|
|
||||||
return QCoreApplication::translate("QScriptBreakpointsModel", "Condition");
|
|
||||||
else if (section == 3)
|
|
||||||
return QCoreApplication::translate("QScriptBreakpointsModel", "Ignore-count");
|
|
||||||
else if (section == 4)
|
|
||||||
return QCoreApplication::translate("QScriptBreakpointsModel", "Single-shot");
|
|
||||||
else if (section == 5)
|
|
||||||
return QCoreApplication::translate("QScriptBreakpointsModel", "Hit-count");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return QVariant();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
Qt::ItemFlags QScriptBreakpointsModel::flags(const QModelIndex &index) const
|
|
||||||
{
|
|
||||||
if (!index.isValid())
|
|
||||||
return 0;
|
|
||||||
Qt::ItemFlags ret = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
|
||||||
switch (index.column()) {
|
|
||||||
case 0:
|
|
||||||
ret |= Qt::ItemIsUserCheckable;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
ret |= Qt::ItemIsEditable;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
ret |= Qt::ItemIsEditable;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
ret |= Qt::ItemIsUserCheckable;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
#include "moc_qscriptbreakpointsmodel_p.h"
|
|
|
@ -1,87 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTBREAKPOINTSMODEL_P_H
|
|
||||||
#define QSCRIPTBREAKPOINTSMODEL_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qabstractitemmodel.h>
|
|
||||||
|
|
||||||
#include "qscriptbreakpointdata_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerJobSchedulerInterface;
|
|
||||||
class QScriptDebuggerCommandSchedulerInterface;
|
|
||||||
|
|
||||||
class QScriptBreakpointsModelPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptBreakpointsModel
|
|
||||||
: public QAbstractItemModel
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
QScriptBreakpointsModel(QScriptDebuggerJobSchedulerInterface *jobScheduler,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler,
|
|
||||||
QObject *parent = nullptr);
|
|
||||||
~QScriptBreakpointsModel();
|
|
||||||
|
|
||||||
void setBreakpoint(const QScriptBreakpointData &data);
|
|
||||||
void setBreakpointData(int id, const QScriptBreakpointData &data);
|
|
||||||
void deleteBreakpoint(int id);
|
|
||||||
|
|
||||||
void addBreakpoint(int id, const QScriptBreakpointData &data);
|
|
||||||
void modifyBreakpoint(int id, const QScriptBreakpointData &data);
|
|
||||||
void removeBreakpoint(int id);
|
|
||||||
|
|
||||||
int breakpointIdAt(int row) const;
|
|
||||||
QScriptBreakpointData breakpointDataAt(int row) const;
|
|
||||||
QScriptBreakpointData breakpointData(int id) const;
|
|
||||||
|
|
||||||
int resolveBreakpoint(qint64 scriptId, int lineNumber) const;
|
|
||||||
int resolveBreakpoint(const QString &fileName, int lineNumber) const;
|
|
||||||
|
|
||||||
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
|
|
||||||
QModelIndex parent(const QModelIndex &child) const;
|
|
||||||
int columnCount(const QModelIndex &parent = QModelIndex()) const;
|
|
||||||
int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
|
||||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
|
|
||||||
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
|
|
||||||
QVariant headerData(int section, Qt::Orientation, int role = Qt::DisplayRole) const;
|
|
||||||
Qt::ItemFlags flags(const QModelIndex &index) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptBreakpointsModel)
|
|
||||||
Q_DISABLE_COPY(QScriptBreakpointsModel)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,359 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptbreakpointswidget_p.h"
|
|
||||||
#include "qscriptbreakpointswidgetinterface_p_p.h"
|
|
||||||
#include "qscriptbreakpointsmodel_p.h"
|
|
||||||
#include "qscriptdebuggerscriptsmodel_p.h"
|
|
||||||
#include "qscripttoolsresources_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qdebug.h>
|
|
||||||
#include <QtGui/qaction.h>
|
|
||||||
#include <QtGui/qcompleter.h>
|
|
||||||
#include <QtGui/qheaderview.h>
|
|
||||||
#include <QtGui/qlineedit.h>
|
|
||||||
#include <QtGui/qmessagebox.h>
|
|
||||||
#include <QtGui/qtoolbar.h>
|
|
||||||
#include <QtGui/qtoolbutton.h>
|
|
||||||
#include <QtGui/qtreeview.h>
|
|
||||||
#include <QtGui/qboxlayout.h>
|
|
||||||
#include <QtGui/qstyleditemdelegate.h>
|
|
||||||
#include <QtGui/qevent.h>
|
|
||||||
#include <QtScript/qscriptengine.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptNewBreakpointWidget : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
QScriptNewBreakpointWidget(QWidget *parent = nullptr)
|
|
||||||
: QWidget(parent) {
|
|
||||||
QHBoxLayout *hboxLayout = new QHBoxLayout(this);
|
|
||||||
hboxLayout->setSpacing(6);
|
|
||||||
hboxLayout->setMargin(0);
|
|
||||||
|
|
||||||
toolClose = new QToolButton(this);
|
|
||||||
QPixmap pix;
|
|
||||||
pix.loadFromData(
|
|
||||||
scripttools_closetab_png, scripttools_closetab_png_len,
|
|
||||||
qt_images_format
|
|
||||||
);
|
|
||||||
toolClose->setIcon(QIcon(pix));
|
|
||||||
toolClose->setAutoRaise(true);
|
|
||||||
toolClose->setText(tr("Close"));
|
|
||||||
hboxLayout->addWidget(toolClose);
|
|
||||||
|
|
||||||
fileNameEdit = new QLineEdit();
|
|
||||||
setFocusProxy(fileNameEdit);
|
|
||||||
QRegExp locationRegExp(QLatin1String(".+:[0-9]+"));
|
|
||||||
QRegExpValidator *validator = new QRegExpValidator(locationRegExp, fileNameEdit);
|
|
||||||
fileNameEdit->setValidator(validator);
|
|
||||||
hboxLayout->addWidget(fileNameEdit);
|
|
||||||
|
|
||||||
toolOk = new QToolButton(this);
|
|
||||||
toolOk->setIcon(QIcon::fromTheme("list-add"));
|
|
||||||
toolOk->setAutoRaise(true);
|
|
||||||
toolOk->setEnabled(false);
|
|
||||||
hboxLayout->addWidget(toolOk);
|
|
||||||
|
|
||||||
QObject::connect(toolClose, SIGNAL(clicked()), this, SLOT(hide()));
|
|
||||||
QObject::connect(toolOk, SIGNAL(clicked()), this, SLOT(onOkClicked()));
|
|
||||||
QObject::connect(fileNameEdit, SIGNAL(textChanged(QString)),
|
|
||||||
this, SLOT(onTextChanged()));
|
|
||||||
QObject::connect(fileNameEdit, SIGNAL(returnPressed()),
|
|
||||||
this, SLOT(onOkClicked()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void setCompleter(QCompleter *comp)
|
|
||||||
{ fileNameEdit->setCompleter(comp); }
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void newBreakpointRequest(const QString &fileName, int lineNumber);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void keyPressEvent(QKeyEvent *e)
|
|
||||||
{
|
|
||||||
if (e->key() == Qt::Key_Escape)
|
|
||||||
hide();
|
|
||||||
else
|
|
||||||
QWidget::keyPressEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onOkClicked()
|
|
||||||
{
|
|
||||||
QString location = fileNameEdit->text();
|
|
||||||
fileNameEdit->clear();
|
|
||||||
QString fileName = location.left(location.lastIndexOf(QLatin1Char(':')));
|
|
||||||
int lineNumber = location.mid(fileName.length()+1).toInt();
|
|
||||||
emit newBreakpointRequest(fileName, lineNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
void onTextChanged()
|
|
||||||
{
|
|
||||||
toolOk->setEnabled(fileNameEdit->hasAcceptableInput());
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
QLineEdit *fileNameEdit;
|
|
||||||
QToolButton *toolClose;
|
|
||||||
QToolButton *toolOk;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class QScriptBreakpointsWidgetPrivate
|
|
||||||
: public QScriptBreakpointsWidgetInterfacePrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptBreakpointsWidget)
|
|
||||||
public:
|
|
||||||
QScriptBreakpointsWidgetPrivate();
|
|
||||||
~QScriptBreakpointsWidgetPrivate();
|
|
||||||
|
|
||||||
void _q_newBreakpoint();
|
|
||||||
void _q_deleteBreakpoint();
|
|
||||||
void _q_onCurrentChanged(const QModelIndex &index);
|
|
||||||
void _q_onNewBreakpointRequest(const QString &fileName, int lineNumber);
|
|
||||||
|
|
||||||
QTreeView *view;
|
|
||||||
QScriptNewBreakpointWidget *newBreakpointWidget;
|
|
||||||
QAction *deleteBreakpointAction;
|
|
||||||
QScriptDebuggerScriptsModel *scriptsModel;
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptBreakpointsWidgetPrivate::QScriptBreakpointsWidgetPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointsWidgetPrivate::~QScriptBreakpointsWidgetPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptBreakpointsWidgetPrivate::_q_newBreakpoint()
|
|
||||||
{
|
|
||||||
newBreakpointWidget->show();
|
|
||||||
newBreakpointWidget->setFocus(Qt::OtherFocusReason);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptBreakpointsWidgetPrivate::_q_deleteBreakpoint()
|
|
||||||
{
|
|
||||||
Q_Q(QScriptBreakpointsWidget);
|
|
||||||
QModelIndex index = view->currentIndex();
|
|
||||||
if (index.isValid()) {
|
|
||||||
int id = q->breakpointsModel()->breakpointIdAt(index.row());
|
|
||||||
q->breakpointsModel()->deleteBreakpoint(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptBreakpointsWidgetPrivate::_q_onCurrentChanged(const QModelIndex &index)
|
|
||||||
{
|
|
||||||
deleteBreakpointAction->setEnabled(index.isValid());
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptBreakpointsWidgetPrivate::_q_onNewBreakpointRequest(const QString &fileName, int lineNumber)
|
|
||||||
{
|
|
||||||
QScriptBreakpointData data(fileName, lineNumber);
|
|
||||||
q_func()->breakpointsModel()->setBreakpoint(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
class QScriptBreakpointsItemDelegate : public QStyledItemDelegate
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
QScriptBreakpointsItemDelegate(QObject *parent = nullptr)
|
|
||||||
: QStyledItemDelegate(parent) {}
|
|
||||||
|
|
||||||
QWidget *createEditor(QWidget *parent,
|
|
||||||
const QStyleOptionViewItem &option,
|
|
||||||
const QModelIndex &index) const
|
|
||||||
{
|
|
||||||
QWidget *editor = QStyledItemDelegate::createEditor(parent, option, index);
|
|
||||||
if (index.column() == 2) {
|
|
||||||
// condition
|
|
||||||
QLineEdit *le = qobject_cast<QLineEdit*>(editor);
|
|
||||||
if (le) {
|
|
||||||
QObject::connect(le, SIGNAL(textEdited(QString)),
|
|
||||||
this, SLOT(validateInput(QString)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return editor;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool eventFilter(QObject *editor, QEvent *event)
|
|
||||||
{
|
|
||||||
if (QLineEdit *le = qobject_cast<QLineEdit*>(editor)) {
|
|
||||||
if (event->type() == QEvent::KeyPress) {
|
|
||||||
int key = static_cast<QKeyEvent*>(event)->key();
|
|
||||||
if ((key == Qt::Key_Enter) || (key == Qt::Key_Return)) {
|
|
||||||
if (QScriptEngine::checkSyntax(le->text()).state() != QScriptSyntaxCheckResult::Valid) {
|
|
||||||
// ignore when script contains syntax error
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return QStyledItemDelegate::eventFilter(editor, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setModelData(QWidget *editor, QAbstractItemModel *model,
|
|
||||||
const QModelIndex &index) const
|
|
||||||
{
|
|
||||||
if (index.column() == 2) {
|
|
||||||
// check that the syntax is OK
|
|
||||||
QString condition = qobject_cast<QLineEdit*>(editor)->text();
|
|
||||||
if (QScriptEngine::checkSyntax(condition).state() != QScriptSyntaxCheckResult::Valid)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QStyledItemDelegate::setModelData(editor, model, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void validateInput(const QString &text)
|
|
||||||
{
|
|
||||||
QWidget *editor = qobject_cast<QWidget*>(sender());
|
|
||||||
QPalette pal = editor->palette();
|
|
||||||
QColor col;
|
|
||||||
bool ok = (QScriptEngine::checkSyntax(text).state() == QScriptSyntaxCheckResult::Valid);
|
|
||||||
if (ok) {
|
|
||||||
col = Qt::white;
|
|
||||||
} else {
|
|
||||||
QScriptSyntaxCheckResult result = QScriptEngine::checkSyntax(
|
|
||||||
text + QLatin1Char('\n'));
|
|
||||||
if (result.state() == QScriptSyntaxCheckResult::Intermediate)
|
|
||||||
col = QColor(255, 240, 192);
|
|
||||||
else
|
|
||||||
col = QColor(255, 102, 102);
|
|
||||||
}
|
|
||||||
pal.setColor(QPalette::Active, QPalette::Base, col);
|
|
||||||
editor->setPalette(pal);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptBreakpointsWidget::QScriptBreakpointsWidget(QWidget *parent)
|
|
||||||
: QScriptBreakpointsWidgetInterface(*new QScriptBreakpointsWidgetPrivate, parent, 0)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsWidget);
|
|
||||||
d->view = new QTreeView();
|
|
||||||
// d->view->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
|
||||||
d->view->setEditTriggers(QAbstractItemView::AllEditTriggers);
|
|
||||||
// d->view->setAlternatingRowColors(true);
|
|
||||||
d->view->setRootIsDecorated(false);
|
|
||||||
d->view->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
||||||
// d->view->header()->hide();
|
|
||||||
// d->view->header()->setDefaultAlignment(Qt::AlignLeft);
|
|
||||||
// d->view->header()->setResizeMode(QHeaderView::ResizeToContents);
|
|
||||||
d->view->setItemDelegate(new QScriptBreakpointsItemDelegate(this));
|
|
||||||
|
|
||||||
d->newBreakpointWidget = new QScriptNewBreakpointWidget();
|
|
||||||
d->newBreakpointWidget->hide();
|
|
||||||
QObject::connect(d->newBreakpointWidget, SIGNAL(newBreakpointRequest(QString,int)),
|
|
||||||
this, SLOT(_q_onNewBreakpointRequest(QString,int)));
|
|
||||||
|
|
||||||
QAction *newBreakpointAction = new QAction(QIcon::fromTheme("document-new"), tr("New"), this);
|
|
||||||
QObject::connect(newBreakpointAction, SIGNAL(triggered()),
|
|
||||||
this, SLOT(_q_newBreakpoint()));
|
|
||||||
|
|
||||||
d->deleteBreakpointAction = new QAction(QIcon::fromTheme("edit-delete"), tr("Delete"), this);
|
|
||||||
d->deleteBreakpointAction->setEnabled(false);
|
|
||||||
QObject::connect(d->deleteBreakpointAction, SIGNAL(triggered()),
|
|
||||||
this, SLOT(_q_deleteBreakpoint()));
|
|
||||||
|
|
||||||
#ifndef QT_NO_TOOLBAR
|
|
||||||
QToolBar *toolBar = new QToolBar();
|
|
||||||
toolBar->addAction(newBreakpointAction);
|
|
||||||
toolBar->addAction(d->deleteBreakpointAction);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
QVBoxLayout *vbox = new QVBoxLayout(this);
|
|
||||||
vbox->setMargin(0);
|
|
||||||
#ifndef QT_NO_TOOLBAR
|
|
||||||
vbox->addWidget(toolBar);
|
|
||||||
#endif
|
|
||||||
vbox->addWidget(d->newBreakpointWidget);
|
|
||||||
vbox->addWidget(d->view);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointsWidget::~QScriptBreakpointsWidget()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
QScriptBreakpointsModel *QScriptBreakpointsWidget::breakpointsModel() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointsWidget);
|
|
||||||
return qobject_cast<QScriptBreakpointsModel*>(d->view->model());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointsWidget::setBreakpointsModel(QScriptBreakpointsModel *model)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsWidget);
|
|
||||||
d->view->setModel(model);
|
|
||||||
d->view->header()->resizeSection(0, 50);
|
|
||||||
QObject::connect(d->view->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
|
|
||||||
this, SLOT(_q_onCurrentChanged(QModelIndex)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
QScriptDebuggerScriptsModel *QScriptBreakpointsWidget::scriptsModel() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptBreakpointsWidget);
|
|
||||||
return d->scriptsModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointsWidget::setScriptsModel(QScriptDebuggerScriptsModel *model)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsWidget);
|
|
||||||
d->scriptsModel = model;
|
|
||||||
QCompleter *completer = new QCompleter(model, this);
|
|
||||||
completer->setCompletionRole(Qt::DisplayRole);
|
|
||||||
d->newBreakpointWidget->setCompleter(completer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptBreakpointsWidget::keyPressEvent(QKeyEvent *e)
|
|
||||||
{
|
|
||||||
Q_D(QScriptBreakpointsWidget);
|
|
||||||
if (e->key() == Qt::Key_Delete) {
|
|
||||||
QModelIndex index = d->view->currentIndex();
|
|
||||||
if (!index.isValid())
|
|
||||||
return;
|
|
||||||
int id = breakpointsModel()->breakpointIdAt(index.row());
|
|
||||||
breakpointsModel()->deleteBreakpoint(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#include "moc_qscriptbreakpointswidget.cpp"
|
|
||||||
#include "moc_qscriptbreakpointswidget_p.h"
|
|
|
@ -1,70 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTBREAKPOINTSWIDGET_P_H
|
|
||||||
#define QSCRIPTBREAKPOINTSWIDGET_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qscriptbreakpointswidgetinterface_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptBreakpointsWidgetPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptBreakpointsWidget:
|
|
||||||
public QScriptBreakpointsWidgetInterface
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
QScriptBreakpointsWidget(QWidget *parent = nullptr);
|
|
||||||
~QScriptBreakpointsWidget();
|
|
||||||
|
|
||||||
QScriptBreakpointsModel *breakpointsModel() const;
|
|
||||||
void setBreakpointsModel(QScriptBreakpointsModel *model);
|
|
||||||
|
|
||||||
QScriptDebuggerScriptsModel *scriptsModel() const;
|
|
||||||
void setScriptsModel(QScriptDebuggerScriptsModel *model);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void keyPressEvent(QKeyEvent *e);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_newBreakpoint())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_deleteBreakpoint())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onCurrentChanged(const QModelIndex &))
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onNewBreakpointRequest(const QString &, int))
|
|
||||||
|
|
||||||
Q_DECLARE_PRIVATE(QScriptBreakpointsWidget)
|
|
||||||
Q_DISABLE_COPY(QScriptBreakpointsWidget)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,47 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptbreakpointswidgetinterface_p.h"
|
|
||||||
#include "qscriptbreakpointswidgetinterface_p_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
QScriptBreakpointsWidgetInterfacePrivate::QScriptBreakpointsWidgetInterfacePrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointsWidgetInterfacePrivate::~QScriptBreakpointsWidgetInterfacePrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointsWidgetInterface::~QScriptBreakpointsWidgetInterface()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointsWidgetInterface::QScriptBreakpointsWidgetInterface(
|
|
||||||
QScriptBreakpointsWidgetInterfacePrivate &dd,
|
|
||||||
QWidget *parent, Qt::WindowFlags flags)
|
|
||||||
: QWidget(dd, parent, flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
#include "moc_qscriptbreakpointswidgetinterface_p.h"
|
|
|
@ -1,72 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTBREAKPOINTSWIDGETINTERFACE_P_H
|
|
||||||
#define QSCRIPTBREAKPOINTSWIDGETINTERFACE_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtGui/qwidget.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptBreakpointsModel;
|
|
||||||
class QScriptDebuggerScriptsModel;
|
|
||||||
|
|
||||||
class QScriptBreakpointsWidgetInterfacePrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptBreakpointsWidgetInterface:
|
|
||||||
public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
~QScriptBreakpointsWidgetInterface();
|
|
||||||
|
|
||||||
virtual QScriptBreakpointsModel *breakpointsModel() const = 0;
|
|
||||||
virtual void setBreakpointsModel(QScriptBreakpointsModel *model) = 0;
|
|
||||||
|
|
||||||
virtual QScriptDebuggerScriptsModel *scriptsModel() const = 0;
|
|
||||||
virtual void setScriptsModel(QScriptDebuggerScriptsModel *model) = 0;
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void currentScriptChanged(qint64 scriptId);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QScriptBreakpointsWidgetInterface(
|
|
||||||
QScriptBreakpointsWidgetInterfacePrivate &dd,
|
|
||||||
QWidget *parent, Qt::WindowFlags flags);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptBreakpointsWidgetInterface)
|
|
||||||
Q_DISABLE_COPY(QScriptBreakpointsWidgetInterface)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,52 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTBREAKPOINTSWIDGETINTERFACE_P_P_H
|
|
||||||
#define QSCRIPTBREAKPOINTSWIDGETINTERFACE_P_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qwidget_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptBreakpointsWidgetInterface;
|
|
||||||
class QScriptBreakpointsWidgetInterfacePrivate
|
|
||||||
: public QWidgetPrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptBreakpointsWidgetInterface)
|
|
||||||
public:
|
|
||||||
QScriptBreakpointsWidgetInterfacePrivate();
|
|
||||||
~QScriptBreakpointsWidgetInterfacePrivate();
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,58 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTCOMPLETIONPROVIDERINTERFACE_P_H
|
|
||||||
#define QSCRIPTCOMPLETIONPROVIDERINTERFACE_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobjectdefs.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptCompletionTaskInterface;
|
|
||||||
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptCompletionProviderInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum Option {
|
|
||||||
ConsoleCommandCompletion = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual ~QScriptCompletionProviderInterface() {}
|
|
||||||
|
|
||||||
virtual QScriptCompletionTaskInterface *createCompletionTask(
|
|
||||||
const QString &contents, int cursorPosition,
|
|
||||||
int frameIndex, int options) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,273 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptcompletiontask_p.h"
|
|
||||||
#include "qscriptcompletiontaskinterface_p_p.h"
|
|
||||||
#include "qscriptdebuggerconsole_p.h"
|
|
||||||
#include "qscriptdebuggerconsolecommand_p.h"
|
|
||||||
#include "qscriptdebuggerconsolecommandmanager_p.h"
|
|
||||||
#include "qscriptdebuggercommandschedulerjob_p.h"
|
|
||||||
#include "qscriptdebuggercommandschedulerfrontend_p.h"
|
|
||||||
#include "qscriptdebuggerjobschedulerinterface_p.h"
|
|
||||||
#include "qscriptdebuggerresponse_p.h"
|
|
||||||
#include "qscripttoolscommon_p.h"
|
|
||||||
|
|
||||||
#include "qobject_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qset.h>
|
|
||||||
#include <QtCore/qdebug.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptCompletionTaskPrivate
|
|
||||||
: public QScriptCompletionTaskInterfacePrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptCompletionTask)
|
|
||||||
public:
|
|
||||||
QScriptCompletionTaskPrivate();
|
|
||||||
~QScriptCompletionTaskPrivate();
|
|
||||||
|
|
||||||
void completeScriptExpression();
|
|
||||||
void emitFinished();
|
|
||||||
|
|
||||||
QString contents;
|
|
||||||
int cursorPosition;
|
|
||||||
int frameIndex;
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler;
|
|
||||||
QScriptDebuggerJobSchedulerInterface *jobScheduler;
|
|
||||||
QScriptDebuggerConsole *console;
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptCompletionTaskPrivate::QScriptCompletionTaskPrivate()
|
|
||||||
: cursorPosition(0), frameIndex(0), commandScheduler(0),
|
|
||||||
jobScheduler(0), console(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptCompletionTaskPrivate::~QScriptCompletionTaskPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
class QScriptCompleteExpressionJob : public QScriptDebuggerCommandSchedulerJob
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptCompleteExpressionJob(int frameIndex, const QStringList &path,
|
|
||||||
QScriptCompletionTaskPrivate *task,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *scheduler)
|
|
||||||
: QScriptDebuggerCommandSchedulerJob(scheduler),
|
|
||||||
m_frameIndex(frameIndex), m_path(path), m_task(task)
|
|
||||||
{}
|
|
||||||
|
|
||||||
void start()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommandSchedulerFrontend frontend(commandScheduler(), this);
|
|
||||||
frontend.scheduleGetCompletions(m_frameIndex, m_path);
|
|
||||||
}
|
|
||||||
void handleResponse(const QScriptDebuggerResponse &response, int /*commandId*/)
|
|
||||||
{
|
|
||||||
m_task->results = response.result().toStringList();
|
|
||||||
m_task->emitFinished();
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_frameIndex;
|
|
||||||
QStringList m_path;
|
|
||||||
QScriptCompletionTaskPrivate *m_task;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QScriptCompleteScriptsJob : public QScriptDebuggerCommandSchedulerJob
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptCompleteScriptsJob(const QString &prefix, QScriptCompletionTaskPrivate *task,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *scheduler)
|
|
||||||
: QScriptDebuggerCommandSchedulerJob(scheduler),
|
|
||||||
m_prefix(prefix), m_task(task)
|
|
||||||
{}
|
|
||||||
|
|
||||||
void start()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommandSchedulerFrontend frontend(commandScheduler(), this);
|
|
||||||
frontend.scheduleGetScripts();
|
|
||||||
}
|
|
||||||
void handleResponse(const QScriptDebuggerResponse &response, int /*commandId*/)
|
|
||||||
{
|
|
||||||
QScriptScriptMap scripts = response.resultAsScripts();
|
|
||||||
QScriptScriptMap::const_iterator it;
|
|
||||||
for (it = scripts.constBegin(); it != scripts.constEnd(); ++it) {
|
|
||||||
QString fileName = it.value().fileName();
|
|
||||||
if (isPrefixOf(m_prefix, fileName))
|
|
||||||
m_task->results.append(fileName);
|
|
||||||
}
|
|
||||||
m_task->emitFinished();
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
QString m_prefix;
|
|
||||||
QScriptCompletionTaskPrivate *m_task;
|
|
||||||
};
|
|
||||||
|
|
||||||
void QScriptCompletionTaskPrivate::completeScriptExpression()
|
|
||||||
{
|
|
||||||
int pos = cursorPosition;
|
|
||||||
if ((pos > 0) && contents.at(pos-1).isNumber()) {
|
|
||||||
// completion of numbers is pointless
|
|
||||||
emitFinished();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((pos > 0) && isAlmostIdentChar(contents.at(pos-1)))
|
|
||||||
--pos;
|
|
||||||
int pos2 = cursorPosition - 1;
|
|
||||||
while ((pos2+1 < contents.size()) && isAlmostIdentChar(contents.at(pos2+1)))
|
|
||||||
++pos2;
|
|
||||||
QString ident = contents.mid(pos, pos2 - pos + 1);
|
|
||||||
position = pos;
|
|
||||||
|
|
||||||
QStringList path;
|
|
||||||
path.append(ident);
|
|
||||||
while ((pos > 0) && (contents.at(pos-1) == QLatin1Char('.'))) {
|
|
||||||
--pos;
|
|
||||||
pos2 = pos;
|
|
||||||
while ((pos > 0) && isAlmostIdentChar(contents.at(pos-1)))
|
|
||||||
--pos;
|
|
||||||
path.prepend(contents.mid(pos, pos2 - pos));
|
|
||||||
}
|
|
||||||
|
|
||||||
length = path.last().length();
|
|
||||||
type = QScriptCompletionTask::ScriptIdentifierCompletion;
|
|
||||||
|
|
||||||
QScriptDebuggerJob *job = new QScriptCompleteExpressionJob(frameIndex, path, this, commandScheduler);
|
|
||||||
jobScheduler->scheduleJob(job);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptCompletionTaskPrivate::emitFinished()
|
|
||||||
{
|
|
||||||
emit q_func()->finished();
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptCompletionTask::QScriptCompletionTask(
|
|
||||||
const QString &contents, int cursorPosition, int frameIndex,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler,
|
|
||||||
QScriptDebuggerJobSchedulerInterface *jobScheduler,
|
|
||||||
QScriptDebuggerConsole *console,
|
|
||||||
QObject *parent)
|
|
||||||
: QScriptCompletionTaskInterface(
|
|
||||||
*new QScriptCompletionTaskPrivate, parent)
|
|
||||||
{
|
|
||||||
Q_D(QScriptCompletionTask);
|
|
||||||
d->contents = contents;
|
|
||||||
d->cursorPosition = cursorPosition;
|
|
||||||
if ((frameIndex == -1) && console)
|
|
||||||
d->frameIndex = console->currentFrameIndex();
|
|
||||||
else
|
|
||||||
d->frameIndex = frameIndex;
|
|
||||||
d->commandScheduler = commandScheduler;
|
|
||||||
d->jobScheduler = jobScheduler;
|
|
||||||
d->console = console;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptCompletionTask::~QScriptCompletionTask()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptCompletionTask::start()
|
|
||||||
{
|
|
||||||
Q_D(QScriptCompletionTask);
|
|
||||||
d->type = NoCompletion;
|
|
||||||
// see if we're typing a command
|
|
||||||
// ### don't hardcode the command prefix
|
|
||||||
QRegExp cmdRx(QString::fromLatin1("^\\s*\\.([a-zA-Z]*)"));
|
|
||||||
int cmdIndex = cmdRx.indexIn(d->contents);
|
|
||||||
if ((cmdIndex != -1) && d->console) {
|
|
||||||
int len = cmdRx.matchedLength();
|
|
||||||
QString prefix = cmdRx.capturedTexts().at(1);
|
|
||||||
if ((d->cursorPosition >= cmdIndex) && (d->cursorPosition <= (cmdIndex+len))) {
|
|
||||||
// editing command --> get command completions
|
|
||||||
d->results = d->console->commandManager()->completions(prefix);
|
|
||||||
d->position = cmdRx.pos(1);
|
|
||||||
d->length = prefix.length();
|
|
||||||
d->type = CommandNameCompletion;
|
|
||||||
d->appendix = QString::fromLatin1(" ");
|
|
||||||
emit finished();
|
|
||||||
} else {
|
|
||||||
QScriptDebuggerConsoleCommand *cmd = d->console->commandManager()->findCommand(prefix);
|
|
||||||
if (!cmd) {
|
|
||||||
emit finished();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// editing an argument
|
|
||||||
int argNum = 0;
|
|
||||||
QString arg;
|
|
||||||
int pos = cmdIndex + len;
|
|
||||||
while (pos < d->contents.size()) {
|
|
||||||
while ((pos < d->contents.size()) && d->contents.at(pos).isSpace())
|
|
||||||
++pos;
|
|
||||||
if (pos < d->contents.size()) {
|
|
||||||
int pos2 = pos + 1;
|
|
||||||
while ((pos2 < d->contents.size()) && !d->contents.at(pos2).isSpace())
|
|
||||||
++pos2;
|
|
||||||
if ((d->cursorPosition >= pos) && (d->cursorPosition <= pos2)) {
|
|
||||||
arg = d->contents.mid(pos, pos2 - pos);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pos = pos2;
|
|
||||||
++argNum;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QString argType = cmd->argumentTypes().value(argNum);
|
|
||||||
if (!argType.isEmpty()) {
|
|
||||||
if (argType == QLatin1String("command-or-group-name")) {
|
|
||||||
d->results = d->console->commandManager()->completions(arg);
|
|
||||||
} else if (argType == QLatin1String("script-filename")) {
|
|
||||||
d->position = pos;
|
|
||||||
d->length = arg.length();
|
|
||||||
d->type = CommandArgumentCompletion;
|
|
||||||
QScriptDebuggerJob *job = new QScriptCompleteScriptsJob(arg, d, d->commandScheduler);
|
|
||||||
d->jobScheduler->scheduleJob(job);
|
|
||||||
} else if (argType == QLatin1String("subcommand-name")) {
|
|
||||||
for (int i = 0; i < cmd->subCommands().size(); ++i) {
|
|
||||||
QString name = cmd->subCommands().at(i);
|
|
||||||
if (isPrefixOf(arg, name))
|
|
||||||
d->results.append(name);
|
|
||||||
}
|
|
||||||
qStableSort(d->results);
|
|
||||||
} else if (argType == QLatin1String("script")) {
|
|
||||||
d->completeScriptExpression();
|
|
||||||
} else {
|
|
||||||
emit finished();
|
|
||||||
}
|
|
||||||
if ((d->type == NoCompletion) && !d->results.isEmpty()) {
|
|
||||||
d->position = pos;
|
|
||||||
d->length = arg.length();
|
|
||||||
d->type = CommandArgumentCompletion;
|
|
||||||
emit finished();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// assume it's an eval expression
|
|
||||||
d->completeScriptExpression();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
#include "moc_qscriptcompletiontask_p.h"
|
|
|
@ -1,70 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTCOMPLETIONTASK_P_H
|
|
||||||
#define QSCRIPTCOMPLETIONTASK_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qscriptcompletiontaskinterface_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qlist.h>
|
|
||||||
#include <QtCore/qmap.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCommandSchedulerInterface;
|
|
||||||
class QScriptDebuggerJobSchedulerInterface;
|
|
||||||
class QScriptDebuggerConsole;
|
|
||||||
|
|
||||||
class QScriptCompletionTaskPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptCompletionTask
|
|
||||||
: public QScriptCompletionTaskInterface
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
QScriptCompletionTask(
|
|
||||||
const QString &contents, int cursorPosition, int frameIndex,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler,
|
|
||||||
QScriptDebuggerJobSchedulerInterface *jobScheduler,
|
|
||||||
QScriptDebuggerConsole *console,
|
|
||||||
QObject *parent = nullptr);
|
|
||||||
~QScriptCompletionTask();
|
|
||||||
|
|
||||||
void start();
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptCompletionTask)
|
|
||||||
Q_DISABLE_COPY(QScriptCompletionTask)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,91 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptcompletiontaskinterface_p.h"
|
|
||||||
#include "qscriptcompletiontaskinterface_p_p.h"
|
|
||||||
|
|
||||||
#include "qobject_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
QScriptCompletionTaskInterfacePrivate::QScriptCompletionTaskInterfacePrivate()
|
|
||||||
{
|
|
||||||
type = QScriptCompletionTaskInterface::NoCompletion;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptCompletionTaskInterfacePrivate::~QScriptCompletionTaskInterfacePrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptCompletionTaskInterface::~QScriptCompletionTaskInterface()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptCompletionTaskInterface::QScriptCompletionTaskInterface(
|
|
||||||
QScriptCompletionTaskInterfacePrivate &dd, QObject *parent)
|
|
||||||
: QObject(dd, parent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptCompletionTaskInterface::CompletionType QScriptCompletionTaskInterface::completionType() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptCompletionTaskInterface);
|
|
||||||
return static_cast<QScriptCompletionTaskInterface::CompletionType>(d->type);
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptCompletionTaskInterface::resultCount() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptCompletionTaskInterface);
|
|
||||||
return d->results.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScriptCompletionTaskInterface::resultAt(int index) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptCompletionTaskInterface);
|
|
||||||
return d->results.value(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptCompletionTaskInterface::addResult(const QString &result)
|
|
||||||
{
|
|
||||||
Q_D(QScriptCompletionTaskInterface);
|
|
||||||
d->results.append(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptCompletionTaskInterface::position() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptCompletionTaskInterface);
|
|
||||||
return d->position;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptCompletionTaskInterface::length() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptCompletionTaskInterface);
|
|
||||||
return d->length;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScriptCompletionTaskInterface::appendix() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptCompletionTaskInterface);
|
|
||||||
return d->appendix;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
#include "moc_qscriptcompletiontaskinterface_p.h"
|
|
|
@ -1,86 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTCOMPLETIONTASKINTERFACE_P_H
|
|
||||||
#define QSCRIPTCOMPLETIONTASKINTERFACE_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobject.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QString;
|
|
||||||
|
|
||||||
class QScriptCompletionTaskInterfacePrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptCompletionTaskInterface
|
|
||||||
: public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
enum CompletionType {
|
|
||||||
NoCompletion,
|
|
||||||
CommandNameCompletion,
|
|
||||||
CommandArgumentCompletion,
|
|
||||||
ScriptIdentifierCompletion
|
|
||||||
};
|
|
||||||
|
|
||||||
~QScriptCompletionTaskInterface();
|
|
||||||
|
|
||||||
virtual void start() = 0;
|
|
||||||
|
|
||||||
CompletionType completionType() const;
|
|
||||||
|
|
||||||
int resultCount() const;
|
|
||||||
QString resultAt(int index) const;
|
|
||||||
|
|
||||||
int position() const;
|
|
||||||
int length() const;
|
|
||||||
|
|
||||||
QString appendix() const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void addResult(const QString &result);
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void finished();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QScriptCompletionTaskInterface(
|
|
||||||
QScriptCompletionTaskInterfacePrivate &dd, QObject *parent);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptCompletionTaskInterface)
|
|
||||||
Q_DISABLE_COPY(QScriptCompletionTaskInterface)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,61 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTCOMPLETIONTASKINTERFACE_P_P_H
|
|
||||||
#define QSCRIPTCOMPLETIONTASKINTERFACE_P_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qobject_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qstring.h>
|
|
||||||
#include <QtCore/qstringlist.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptCompletionTaskInterface;
|
|
||||||
class QScriptCompletionTaskInterfacePrivate
|
|
||||||
: public QObjectPrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptCompletionTaskInterface)
|
|
||||||
public:
|
|
||||||
QScriptCompletionTaskInterfacePrivate();
|
|
||||||
virtual ~QScriptCompletionTaskInterfacePrivate();
|
|
||||||
|
|
||||||
int type;
|
|
||||||
QStringList results;
|
|
||||||
int position;
|
|
||||||
int length;
|
|
||||||
QString appendix;
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,202 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGER_P_H
|
|
||||||
#define QSCRIPTDEBUGGER_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobject.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerFrontend;
|
|
||||||
class QScriptDebuggerConsoleWidgetInterface;
|
|
||||||
class QScriptDebuggerScriptsWidgetInterface;
|
|
||||||
class QScriptDebuggerCodeWidgetInterface;
|
|
||||||
class QScriptDebuggerCodeFinderWidgetInterface;
|
|
||||||
class QScriptBreakpointsWidgetInterface;
|
|
||||||
class QScriptDebuggerStackWidgetInterface;
|
|
||||||
class QScriptDebuggerLocalsWidgetInterface;
|
|
||||||
class QScriptDebugOutputWidgetInterface;
|
|
||||||
class QScriptErrorLogWidgetInterface;
|
|
||||||
class QScriptDebuggerWidgetFactoryInterface;
|
|
||||||
class QAction;
|
|
||||||
class QEvent;
|
|
||||||
class QMenu;
|
|
||||||
#ifndef QT_NO_TOOLBAR
|
|
||||||
class QToolBar;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class QScriptDebuggerPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebugger : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
// mirrors QScriptEngineDebugger::DebuggerWidget
|
|
||||||
enum DebuggerWidget {
|
|
||||||
ConsoleWidget,
|
|
||||||
StackWidget,
|
|
||||||
ScriptsWidget,
|
|
||||||
LocalsWidget,
|
|
||||||
CodeWidget,
|
|
||||||
CodeFinderWidget,
|
|
||||||
BreakpointsWidget,
|
|
||||||
DebugOutputWidget,
|
|
||||||
ErrorLogWidget
|
|
||||||
};
|
|
||||||
// mirrors QScriptEngineDebugger::DebuggerAction
|
|
||||||
enum DebuggerAction {
|
|
||||||
InterruptAction,
|
|
||||||
ContinueAction,
|
|
||||||
StepIntoAction,
|
|
||||||
StepOverAction,
|
|
||||||
StepOutAction,
|
|
||||||
RunToCursorAction,
|
|
||||||
RunToNewScriptAction,
|
|
||||||
ToggleBreakpointAction,
|
|
||||||
ClearDebugOutputAction,
|
|
||||||
ClearErrorLogAction,
|
|
||||||
ClearConsoleAction,
|
|
||||||
FindInScriptAction,
|
|
||||||
FindNextInScriptAction,
|
|
||||||
FindPreviousInScriptAction,
|
|
||||||
GoToLineAction
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptDebugger(QObject *parent = nullptr);
|
|
||||||
~QScriptDebugger();
|
|
||||||
|
|
||||||
QScriptDebuggerFrontend *frontend() const;
|
|
||||||
void setFrontend(QScriptDebuggerFrontend *frontend);
|
|
||||||
|
|
||||||
QWidget *widget(DebuggerWidget widget);
|
|
||||||
QAction *action(DebuggerAction action, QObject *parent);
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleWidgetInterface *consoleWidget() const;
|
|
||||||
void setConsoleWidget(QScriptDebuggerConsoleWidgetInterface *consoleWidget);
|
|
||||||
|
|
||||||
QScriptDebuggerScriptsWidgetInterface *scriptsWidget() const;
|
|
||||||
void setScriptsWidget(QScriptDebuggerScriptsWidgetInterface *scriptsWidget);
|
|
||||||
|
|
||||||
QScriptDebuggerCodeWidgetInterface *codeWidget() const;
|
|
||||||
void setCodeWidget(QScriptDebuggerCodeWidgetInterface *codeWidget);
|
|
||||||
|
|
||||||
QScriptDebuggerCodeFinderWidgetInterface *codeFinderWidget() const;
|
|
||||||
void setCodeFinderWidget(QScriptDebuggerCodeFinderWidgetInterface *codeFinderWidget);
|
|
||||||
|
|
||||||
QScriptDebuggerStackWidgetInterface *stackWidget() const;
|
|
||||||
void setStackWidget(QScriptDebuggerStackWidgetInterface *stackWidget);
|
|
||||||
|
|
||||||
QScriptDebuggerLocalsWidgetInterface *localsWidget() const;
|
|
||||||
void setLocalsWidget(QScriptDebuggerLocalsWidgetInterface *localsWidget);
|
|
||||||
|
|
||||||
QScriptBreakpointsWidgetInterface *breakpointsWidget() const;
|
|
||||||
void setBreakpointsWidget(QScriptBreakpointsWidgetInterface *breakpointsWidget);
|
|
||||||
|
|
||||||
QScriptDebugOutputWidgetInterface *debugOutputWidget() const;
|
|
||||||
void setDebugOutputWidget(QScriptDebugOutputWidgetInterface *debugOutputWidget);
|
|
||||||
|
|
||||||
QScriptErrorLogWidgetInterface *errorLogWidget() const;
|
|
||||||
void setErrorLogWidget(QScriptErrorLogWidgetInterface *errorLogWidget);
|
|
||||||
|
|
||||||
QScriptDebuggerWidgetFactoryInterface *widgetFactory() const;
|
|
||||||
void setWidgetFactory(QScriptDebuggerWidgetFactoryInterface *factory);
|
|
||||||
|
|
||||||
QAction *interruptAction(QObject *parent) const;
|
|
||||||
QAction *continueAction(QObject *parent) const;
|
|
||||||
QAction *stepIntoAction(QObject *parent) const;
|
|
||||||
QAction *stepOverAction(QObject *parent) const;
|
|
||||||
QAction *stepOutAction(QObject *parent) const;
|
|
||||||
QAction *runToCursorAction(QObject *parent) const;
|
|
||||||
QAction *runToNewScriptAction(QObject *parent) const;
|
|
||||||
|
|
||||||
QAction *toggleBreakpointAction(QObject *parent) const;
|
|
||||||
|
|
||||||
QAction *findInScriptAction(QObject *parent) const;
|
|
||||||
QAction *findNextInScriptAction(QObject *parent) const;
|
|
||||||
QAction *findPreviousInScriptAction(QObject *parent) const;
|
|
||||||
QAction *goToLineAction(QObject *parent) const;
|
|
||||||
|
|
||||||
QAction *clearDebugOutputAction(QObject *parent) const;
|
|
||||||
QAction *clearConsoleAction(QObject *parent) const;
|
|
||||||
QAction *clearErrorLogAction(QObject *parent) const;
|
|
||||||
|
|
||||||
QMenu *createStandardMenu(QWidget *widgetParent, QObject *actionParent);
|
|
||||||
#ifndef QT_NO_TOOLBAR
|
|
||||||
QToolBar *createStandardToolBar(QWidget *widgetParent, QObject *actionParent);
|
|
||||||
#endif
|
|
||||||
bool eventFilter(QObject *, QEvent *e);
|
|
||||||
|
|
||||||
bool isInteractive() const;
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void stopped() const;
|
|
||||||
void started() const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void timerEvent(QTimerEvent *e);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QScriptDebugger(QScriptDebuggerPrivate &dd, QObject *parent);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebugger)
|
|
||||||
Q_DISABLE_COPY(QScriptDebugger)
|
|
||||||
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onLineEntered(const QString &))
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onCurrentFrameChanged(int))
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onCurrentScriptChanged(qint64))
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onScriptLocationSelected(int))
|
|
||||||
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_interrupt())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_continue())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_stepInto())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_stepOver())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_stepOut())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_runToCursor())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_runToNewScript())
|
|
||||||
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_toggleBreakpoint())
|
|
||||||
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_clearDebugOutput())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_clearErrorLog())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_clearConsole())
|
|
||||||
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_findInScript())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_findNextInScript())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_findPreviousInScript())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onFindCodeRequest(const QString &, int))
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_goToLine())
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,710 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggeragent_p.h"
|
|
||||||
#include "qscriptdebuggeragent_p_p.h"
|
|
||||||
#include "qscriptdebuggerbackend_p_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qcoreapplication.h>
|
|
||||||
#include <QtCore/qset.h>
|
|
||||||
#include <QtScript/qscriptengine.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\since 4.5
|
|
||||||
\class QScriptDebuggerAgent
|
|
||||||
\internal
|
|
||||||
|
|
||||||
This class implements a state machine that uses the low-level events
|
|
||||||
reported by the QScriptEngineAgent interface to implement debugging-
|
|
||||||
specific functionality such as stepping and breakpoints. It is used
|
|
||||||
internally by the QScriptDebuggerBackend class.
|
|
||||||
*/
|
|
||||||
|
|
||||||
QScriptDebuggerAgentPrivate::QScriptDebuggerAgentPrivate()
|
|
||||||
: state(NoState), stepDepth(0), stepCount(0),
|
|
||||||
targetScriptId(-1), targetLineNumber(-1), returnCounter(0),
|
|
||||||
nextBreakpointId(1), hitBreakpointId(0),
|
|
||||||
nextContextId(0), statementCounter(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerAgentPrivate::~QScriptDebuggerAgentPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerAgentPrivate *QScriptDebuggerAgentPrivate::get(
|
|
||||||
QScriptDebuggerAgent *q)
|
|
||||||
{
|
|
||||||
if (!q)
|
|
||||||
return 0;
|
|
||||||
return q->d_func();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs a new agent for the given \a engine. The agent will
|
|
||||||
report debugging-related events (e.g. step completion) to the given
|
|
||||||
\a backend.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerAgent::QScriptDebuggerAgent(
|
|
||||||
QScriptDebuggerBackendPrivate *backend, QScriptEngine *engine)
|
|
||||||
: QScriptEngineAgent(engine), d_ptr(new QScriptDebuggerAgentPrivate())
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->backend = backend;
|
|
||||||
|
|
||||||
QScriptContext *ctx = engine->currentContext();
|
|
||||||
while (ctx) {
|
|
||||||
d->scriptIdStack.append(QList<qint64>());
|
|
||||||
d->contextIdStack.append(d->nextContextId);
|
|
||||||
++d->nextContextId;
|
|
||||||
ctx = ctx->parentContext();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Destroys this QScriptDebuggerAgent.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerAgent::~QScriptDebuggerAgent()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
if (d->backend)
|
|
||||||
d->backend->agentDestroyed(this);
|
|
||||||
delete d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the agent to perform a "step into" operation. This
|
|
||||||
function returns immediately. The agent will report step completion
|
|
||||||
at a later time, i.e. when script statements are evaluated.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::enterStepIntoMode(int count)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::SteppingIntoState;
|
|
||||||
d->stepCount = count;
|
|
||||||
d->stepResult = QScriptValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the agent to perform a "step over" operation. This
|
|
||||||
function returns immediately. The agent will report step completion
|
|
||||||
at a later time, i.e. when script statements are evaluated.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::enterStepOverMode(int count)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::SteppingOverState;
|
|
||||||
if (engine()->isEvaluating())
|
|
||||||
d->stepDepth = 0;
|
|
||||||
else
|
|
||||||
d->stepDepth = -1;
|
|
||||||
d->stepCount = count;
|
|
||||||
d->stepResult = QScriptValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the agent to perform a "step out" operation. This
|
|
||||||
function returns immediately. The agent will report step completion
|
|
||||||
at a later time, i.e. when script statements are evaluated.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::enterStepOutMode()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::SteppingOutState;
|
|
||||||
if (engine()->isEvaluating())
|
|
||||||
d->stepDepth = 0;
|
|
||||||
else
|
|
||||||
d->stepDepth = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the agent to continue evaluation.
|
|
||||||
This function returns immediately.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::enterContinueMode()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::NoState;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the agent to interrupt evaluation.
|
|
||||||
This function returns immediately.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::enterInterruptMode()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::InterruptingState;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the agent to continue evaluation until the location
|
|
||||||
described by \a fileName and \a lineNumber is reached. This
|
|
||||||
function returns immediately.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::enterRunToLocationMode(const QString &fileName, int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->targetFileName = fileName;
|
|
||||||
d->targetLineNumber = lineNumber;
|
|
||||||
d->targetScriptId = resolveScript(fileName);
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::RunningToLocationState;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the agent to continue evaluation until the location
|
|
||||||
described by \a scriptId and \a lineNumber is reached. This
|
|
||||||
function returns immediately.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::enterRunToLocationMode(qint64 scriptId, int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->targetScriptId = scriptId;
|
|
||||||
d->targetFileName = QString();
|
|
||||||
d->targetLineNumber = lineNumber;
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::RunningToLocationState;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerAgent::enterReturnByForceMode(int contextIndex, const QScriptValue &value)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->returnCounter = contextIndex + 1;
|
|
||||||
d->returnValue = QScriptValue();
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::ReturningByForceState;
|
|
||||||
// throw an exception; we will catch it when the proper frame is popped
|
|
||||||
engine()->currentContext()->throwValue(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets a breakpoint defined by the given \a data.
|
|
||||||
Returns an integer that uniquely identifies the new breakpoint,
|
|
||||||
or -1 if setting the breakpoint failed.
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerAgent::setBreakpoint(const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
qint64 scriptId = data.scriptId();
|
|
||||||
if (scriptId != -1) {
|
|
||||||
if (!d->scripts.contains(scriptId)) {
|
|
||||||
// that script has been unloaded, so invalidate the ID
|
|
||||||
scriptId = -1;
|
|
||||||
const_cast<QScriptBreakpointData&>(data).setScriptId(-1);
|
|
||||||
} else if (data.fileName().isEmpty()) {
|
|
||||||
QString fileName = d->scripts[scriptId].fileName();
|
|
||||||
const_cast<QScriptBreakpointData&>(data).setFileName(fileName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = d->nextBreakpointId;
|
|
||||||
++d->nextBreakpointId;
|
|
||||||
|
|
||||||
if (scriptId != -1) {
|
|
||||||
d->resolvedBreakpoints[scriptId].append(id);
|
|
||||||
} else {
|
|
||||||
QString fileName = data.fileName();
|
|
||||||
bool resolved = false;
|
|
||||||
QScriptScriptMap::const_iterator it;
|
|
||||||
for (it = d->scripts.constBegin(); it != d->scripts.constEnd(); ++it) {
|
|
||||||
if (it.value().fileName() == fileName) {
|
|
||||||
d->resolvedBreakpoints[it.key()].append(id);
|
|
||||||
resolved = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!resolved)
|
|
||||||
d->unresolvedBreakpoints[fileName].append(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
d->breakpoints.insert(id, data);
|
|
||||||
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Deletes the breakpoint with the given \a id.
|
|
||||||
Returns true if the breakpoint was deleted, false if
|
|
||||||
no such breakpoint exists.
|
|
||||||
*/
|
|
||||||
bool QScriptDebuggerAgent::deleteBreakpoint(int id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
if (!d->breakpoints.contains(id))
|
|
||||||
return false;
|
|
||||||
d->breakpoints.remove(id);
|
|
||||||
bool found = false;
|
|
||||||
{
|
|
||||||
QHash<qint64, QList<int> >::iterator it;
|
|
||||||
it = d->resolvedBreakpoints.begin();
|
|
||||||
for ( ; !found && (it != d->resolvedBreakpoints.end()); ) {
|
|
||||||
QList<int> &lst = it.value();
|
|
||||||
Q_ASSERT(!lst.isEmpty());
|
|
||||||
for (int i = 0; i < lst.size(); ++i) {
|
|
||||||
if (lst.at(i) == id) {
|
|
||||||
lst.removeAt(i);
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (lst.isEmpty())
|
|
||||||
it = d->resolvedBreakpoints.erase(it);
|
|
||||||
else
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
QHash<QString, QList<int> >::iterator it;
|
|
||||||
it = d->unresolvedBreakpoints.begin();
|
|
||||||
for ( ; !found && (it != d->unresolvedBreakpoints.end()); ) {
|
|
||||||
QList<int> &lst = it.value();
|
|
||||||
Q_ASSERT(!lst.isEmpty());
|
|
||||||
for (int i = 0; i < lst.size(); ++i) {
|
|
||||||
if (lst.at(i) == id) {
|
|
||||||
lst.removeAt(i);
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (lst.isEmpty())
|
|
||||||
it = d->unresolvedBreakpoints.erase(it);
|
|
||||||
else
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Deletes all breakpoints.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::deleteAllBreakpoints()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->breakpoints.clear();
|
|
||||||
d->resolvedBreakpoints.clear();
|
|
||||||
d->unresolvedBreakpoints.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the data associated with the breakpoint with the given \a
|
|
||||||
id.
|
|
||||||
*/
|
|
||||||
QScriptBreakpointData QScriptDebuggerAgent::breakpointData(int id) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerAgent);
|
|
||||||
return d->breakpoints.value(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the data associated with the breakpoint with the given \a
|
|
||||||
id.
|
|
||||||
*/
|
|
||||||
bool QScriptDebuggerAgent::setBreakpointData(int id,
|
|
||||||
const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
if (!d->breakpoints.contains(id))
|
|
||||||
return false;
|
|
||||||
d->breakpoints[id] = data;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns all breakpoints.
|
|
||||||
*/
|
|
||||||
QScriptBreakpointMap QScriptDebuggerAgent::breakpoints() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerAgent);
|
|
||||||
return d->breakpoints;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns all scripts.
|
|
||||||
*/
|
|
||||||
QScriptScriptMap QScriptDebuggerAgent::scripts() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerAgent);
|
|
||||||
return d->scripts;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the data associated with the script with the given \a id.
|
|
||||||
*/
|
|
||||||
QScriptScriptData QScriptDebuggerAgent::scriptData(qint64 id) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerAgent);
|
|
||||||
return d->scripts.value(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Checkpoints the current scripts.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::scriptsCheckpoint()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->previousCheckpointScripts = d->checkpointScripts;
|
|
||||||
d->checkpointScripts = d->scripts;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the difference between the current checkpoint and the
|
|
||||||
previous checkpoint. The first item in the pair is a list containing
|
|
||||||
the identifiers of the scripts that were added. The second item in
|
|
||||||
the pair is a list containing the identifiers of the scripts that
|
|
||||||
were removed.
|
|
||||||
*/
|
|
||||||
QPair<QList<qint64>, QList<qint64> > QScriptDebuggerAgent::scriptsDelta() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerAgent);
|
|
||||||
QSet<qint64> prevSet = d->previousCheckpointScripts.keys().toSet();
|
|
||||||
QSet<qint64> currSet = d->checkpointScripts.keys().toSet();
|
|
||||||
QSet<qint64> addedScriptIds = currSet - prevSet;
|
|
||||||
QSet<qint64> removedScriptIds = prevSet - currSet;
|
|
||||||
return qMakePair(addedScriptIds.toList(), removedScriptIds.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the identifier of the script that has the given \a fileName,
|
|
||||||
or -1 if there is no such script.
|
|
||||||
*/
|
|
||||||
qint64 QScriptDebuggerAgent::resolveScript(const QString &fileName) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerAgent);
|
|
||||||
QScriptScriptMap::const_iterator it;
|
|
||||||
for (it = d->scripts.constBegin(); it != d->scripts.constEnd(); ++it) {
|
|
||||||
if (it.value().fileName() == fileName)
|
|
||||||
return it.key();
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<qint64> QScriptDebuggerAgent::contextIds() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerAgent);
|
|
||||||
return d->contextIdStack;
|
|
||||||
}
|
|
||||||
|
|
||||||
QPair<QList<qint64>, QList<qint64> > QScriptDebuggerAgent::contextsCheckpoint()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
int i = d->checkpointContextIdStack.size() - 1;
|
|
||||||
int j = d->contextIdStack.size() - 1;
|
|
||||||
for ( ; (i >= 0) && (j >= 0); --i, --j) {
|
|
||||||
if (d->checkpointContextIdStack.at(i) != d->contextIdStack.at(j))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
QList<qint64> removed = d->checkpointContextIdStack.mid(0, i+1);
|
|
||||||
QList<qint64> added = d->contextIdStack.mid(0, j+1);
|
|
||||||
d->checkpointContextIdStack = d->contextIdStack;
|
|
||||||
return qMakePair(removed, added);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerAgent::nullifyBackendPointer()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->backend = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::scriptLoad(qint64 id, const QString &program,
|
|
||||||
const QString &fileName, int baseLineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
QScriptScriptData data = QScriptScriptData(program, fileName, baseLineNumber);
|
|
||||||
d->scripts.insert(id, data);
|
|
||||||
|
|
||||||
if ((d->state == QScriptDebuggerAgentPrivate::RunningToLocationState)
|
|
||||||
&& (d->targetScriptId == -1)
|
|
||||||
&& ((d->targetFileName == fileName) || d->targetFileName.isEmpty())) {
|
|
||||||
d->targetScriptId = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fileName.isEmpty()) {
|
|
||||||
QList<int> lst = d->unresolvedBreakpoints.take(fileName);
|
|
||||||
if (!lst.isEmpty())
|
|
||||||
d->resolvedBreakpoints.insert(id, lst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::scriptUnload(qint64 id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
QScriptScriptData data = d->scripts.take(id);
|
|
||||||
QString fileName = data.fileName();
|
|
||||||
|
|
||||||
if ((d->state == QScriptDebuggerAgentPrivate::RunningToLocationState)
|
|
||||||
&& (d->targetScriptId == id)) {
|
|
||||||
d->targetScriptId = -1;
|
|
||||||
d->targetFileName = fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fileName.isEmpty()) {
|
|
||||||
QList<int> lst = d->resolvedBreakpoints.take(id);
|
|
||||||
if (!lst.isEmpty())
|
|
||||||
d->unresolvedBreakpoints.insert(fileName, lst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::contextPush()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->scriptIdStack.append(QList<qint64>());
|
|
||||||
d->contextIdStack.prepend(d->nextContextId);
|
|
||||||
++d->nextContextId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::contextPop()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
d->scriptIdStack.removeLast();
|
|
||||||
d->contextIdStack.removeFirst();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::functionEntry(qint64 scriptId)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
QList<qint64> &ids = d->scriptIdStack.last();
|
|
||||||
ids.append(scriptId);
|
|
||||||
if ((d->state == QScriptDebuggerAgentPrivate::SteppingOverState)
|
|
||||||
|| (d->state == QScriptDebuggerAgentPrivate::SteppingOutState)) {
|
|
||||||
++d->stepDepth;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::functionExit(qint64 scriptId,
|
|
||||||
const QScriptValue &returnValue)
|
|
||||||
{
|
|
||||||
Q_UNUSED(scriptId);
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
QList<qint64> &ids = d->scriptIdStack.last();
|
|
||||||
ids.removeLast();
|
|
||||||
if (d->state == QScriptDebuggerAgentPrivate::SteppingOverState) {
|
|
||||||
--d->stepDepth;
|
|
||||||
} else if (d->state == QScriptDebuggerAgentPrivate::SteppingOutState) {
|
|
||||||
if (--d->stepDepth < 0) {
|
|
||||||
d->stepResult = returnValue;
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::SteppedOutState;
|
|
||||||
}
|
|
||||||
} else if (d->state == QScriptDebuggerAgentPrivate::ReturningByForceState) {
|
|
||||||
if (--d->returnCounter == 0) {
|
|
||||||
d->returnValue = returnValue;
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::ReturnedByForceState;
|
|
||||||
engine()->clearExceptions();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::positionChange(qint64 scriptId,
|
|
||||||
int lineNumber, int columnNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
if (engine()->processEventsInterval() == -1) {
|
|
||||||
// see if it's time to call processEvents()
|
|
||||||
if ((++d->statementCounter % 25000) == 0) {
|
|
||||||
if (!d->processEventsTimer.isNull()) {
|
|
||||||
if (d->processEventsTimer.elapsed() > 30) {
|
|
||||||
QCoreApplication::processEvents();
|
|
||||||
d->processEventsTimer.restart();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
d->processEventsTimer.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check breakpoints
|
|
||||||
{
|
|
||||||
QList<int> lst = d->resolvedBreakpoints.value(scriptId);
|
|
||||||
for (int i = 0; i < lst.size(); ++i) {
|
|
||||||
int id = lst.at(i);
|
|
||||||
QScriptBreakpointData &data = d->breakpoints[id];
|
|
||||||
if (!data.isEnabled())
|
|
||||||
continue;
|
|
||||||
if (data.lineNumber() != lineNumber)
|
|
||||||
continue;
|
|
||||||
if (!data.condition().isEmpty()) {
|
|
||||||
// ### careful, evaluate() can cause an exception
|
|
||||||
// ### disable callbacks in nested evaluate?
|
|
||||||
QScriptDebuggerAgentPrivate::State was = d->state;
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::NoState;
|
|
||||||
QScriptValue ret = engine()->evaluate(
|
|
||||||
data.condition(),
|
|
||||||
QString::fromLatin1("Breakpoint %0 condition checker").arg(id));
|
|
||||||
if (!ret.isError())
|
|
||||||
d->state = was;
|
|
||||||
if (!ret.toBoolean())
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!data.hit())
|
|
||||||
continue;
|
|
||||||
d->hitBreakpointId = id;
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::BreakpointState;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (d->state) {
|
|
||||||
case QScriptDebuggerAgentPrivate::NoState:
|
|
||||||
case QScriptDebuggerAgentPrivate::SteppingOutState:
|
|
||||||
case QScriptDebuggerAgentPrivate::ReturningByForceState:
|
|
||||||
// Do nothing
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerAgentPrivate::SteppingIntoState:
|
|
||||||
if (--d->stepCount == 0) {
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::NoState;
|
|
||||||
if (d->backend)
|
|
||||||
d->backend->stepped(scriptId, lineNumber, columnNumber, QScriptValue());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerAgentPrivate::SteppingOverState:
|
|
||||||
if ((d->stepDepth > 0) || (--d->stepCount != 0))
|
|
||||||
break;
|
|
||||||
// fallthrough
|
|
||||||
case QScriptDebuggerAgentPrivate::SteppedOverState:
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::NoState;
|
|
||||||
if (d->backend)
|
|
||||||
d->backend->stepped(scriptId, lineNumber, columnNumber, d->stepResult);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerAgentPrivate::SteppedOutState:
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::NoState;
|
|
||||||
if (d->backend)
|
|
||||||
d->backend->stepped(scriptId, lineNumber, columnNumber, d->stepResult);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerAgentPrivate::RunningToLocationState:
|
|
||||||
if (((lineNumber == d->targetLineNumber) || (d->targetLineNumber == -1))
|
|
||||||
&& (scriptId == d->targetScriptId)) {
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::NoState;
|
|
||||||
if (d->backend)
|
|
||||||
d->backend->locationReached(scriptId, lineNumber, columnNumber);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerAgentPrivate::InterruptingState:
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::NoState;
|
|
||||||
if (d->backend)
|
|
||||||
d->backend->interrupted(scriptId, lineNumber, columnNumber);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerAgentPrivate::BreakpointState:
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::NoState;
|
|
||||||
if (d->backend)
|
|
||||||
d->backend->breakpoint(scriptId, lineNumber, columnNumber, d->hitBreakpointId);
|
|
||||||
if (d->breakpoints.value(d->hitBreakpointId).isSingleShot())
|
|
||||||
deleteBreakpoint(d->hitBreakpointId);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerAgentPrivate::ReturnedByForceState:
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::NoState;
|
|
||||||
if (d->backend)
|
|
||||||
d->backend->forcedReturn(scriptId, lineNumber, columnNumber, d->returnValue);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerAgentPrivate::SteppedIntoState:
|
|
||||||
case QScriptDebuggerAgentPrivate::ReachedLocationState:
|
|
||||||
case QScriptDebuggerAgentPrivate::InterruptedState:
|
|
||||||
// ### deal with the case when code is evaluated while we're already paused
|
|
||||||
// Q_ASSERT(false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::exceptionThrow(qint64 scriptId,
|
|
||||||
const QScriptValue &exception,
|
|
||||||
bool hasHandler)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
if (d->state == QScriptDebuggerAgentPrivate::ReturningByForceState) {
|
|
||||||
// we threw this exception ourselves, so ignore it for now
|
|
||||||
// (see functionExit()).
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (d->backend)
|
|
||||||
d->backend->exception(scriptId, exception, hasHandler);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerAgent::exceptionCatch(qint64 scriptId,
|
|
||||||
const QScriptValue &exception)
|
|
||||||
{
|
|
||||||
Q_UNUSED(scriptId);
|
|
||||||
Q_UNUSED(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
bool QScriptDebuggerAgent::supportsExtension(Extension extension) const
|
|
||||||
{
|
|
||||||
return (extension == DebuggerInvocationRequest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
QVariant QScriptDebuggerAgent::extension(Extension extension,
|
|
||||||
const QVariant &argument)
|
|
||||||
{
|
|
||||||
Q_UNUSED(extension);
|
|
||||||
Q_D(QScriptDebuggerAgent);
|
|
||||||
Q_ASSERT(extension == DebuggerInvocationRequest);
|
|
||||||
QVariantList lst = argument.toList();
|
|
||||||
qint64 scriptId = lst.at(0).toLongLong();
|
|
||||||
int lineNumber = lst.at(1).toInt();
|
|
||||||
int columnNumber = lst.at(2).toInt();
|
|
||||||
d->state = QScriptDebuggerAgentPrivate::NoState;
|
|
||||||
if (d->backend) {
|
|
||||||
d->backend->debuggerInvocationRequest(
|
|
||||||
scriptId, lineNumber, columnNumber);
|
|
||||||
}
|
|
||||||
return QVariant();
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
|
@ -1,115 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERAGENT_P_H
|
|
||||||
#define QSCRIPTDEBUGGERAGENT_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtScript/qscriptengineagent.h>
|
|
||||||
|
|
||||||
#include <QtCore/qpair.h>
|
|
||||||
|
|
||||||
#include "qscriptbreakpointdata_p.h"
|
|
||||||
#include "qscriptscriptdata_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerBackendPrivate;
|
|
||||||
|
|
||||||
class QScriptDebuggerAgentPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerAgent : public QScriptEngineAgent
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerAgent(QScriptDebuggerBackendPrivate *backend,
|
|
||||||
QScriptEngine *engine);
|
|
||||||
~QScriptDebuggerAgent();
|
|
||||||
|
|
||||||
void enterStepIntoMode(int count = 1);
|
|
||||||
void enterStepOverMode(int count = 1);
|
|
||||||
void enterStepOutMode();
|
|
||||||
void enterContinueMode();
|
|
||||||
void enterInterruptMode();
|
|
||||||
void enterRunToLocationMode(const QString &fileName, int lineNumber);
|
|
||||||
void enterRunToLocationMode(qint64 scriptId, int lineNumber);
|
|
||||||
void enterReturnByForceMode(int contextIndex, const QScriptValue &value);
|
|
||||||
|
|
||||||
int setBreakpoint(const QScriptBreakpointData &data);
|
|
||||||
bool deleteBreakpoint(int id);
|
|
||||||
void deleteAllBreakpoints();
|
|
||||||
QScriptBreakpointData breakpointData(int id) const;
|
|
||||||
bool setBreakpointData(int id, const QScriptBreakpointData &data);
|
|
||||||
QScriptBreakpointMap breakpoints() const;
|
|
||||||
|
|
||||||
QScriptScriptMap scripts() const;
|
|
||||||
QScriptScriptData scriptData(qint64 id) const;
|
|
||||||
void scriptsCheckpoint();
|
|
||||||
QPair<QList<qint64>, QList<qint64> > scriptsDelta() const;
|
|
||||||
qint64 resolveScript(const QString &fileName) const;
|
|
||||||
|
|
||||||
QList<qint64> contextIds() const;
|
|
||||||
QPair<QList<qint64>, QList<qint64> > contextsCheckpoint();
|
|
||||||
|
|
||||||
void nullifyBackendPointer();
|
|
||||||
|
|
||||||
// reimplemented
|
|
||||||
void scriptLoad(qint64 id, const QString &program,
|
|
||||||
const QString &fileName, int baseLineNumber);
|
|
||||||
void scriptUnload(qint64 id);
|
|
||||||
|
|
||||||
void contextPush();
|
|
||||||
void contextPop();
|
|
||||||
|
|
||||||
void functionEntry(qint64 scriptId);
|
|
||||||
void functionExit(qint64 scriptId,
|
|
||||||
const QScriptValue &returnValue);
|
|
||||||
|
|
||||||
void positionChange(qint64 scriptId,
|
|
||||||
int lineNumber, int columnNumber);
|
|
||||||
|
|
||||||
void exceptionThrow(qint64 scriptId,
|
|
||||||
const QScriptValue &exception,
|
|
||||||
bool hasHandler);
|
|
||||||
void exceptionCatch(qint64 scriptId,
|
|
||||||
const QScriptValue &exception);
|
|
||||||
|
|
||||||
bool supportsExtension(Extension extension) const;
|
|
||||||
QVariant extension(Extension extension,
|
|
||||||
const QVariant &argument = QVariant());
|
|
||||||
|
|
||||||
private:
|
|
||||||
QScriptDebuggerAgentPrivate *d_ptr;
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerAgent)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerAgent)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,106 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERAGENT_P_P_H
|
|
||||||
#define QSCRIPTDEBUGGERAGENT_P_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtScript/qscriptvalue.h>
|
|
||||||
#include <QtCore/qdatetime.h>
|
|
||||||
#include <QtCore/qhash.h>
|
|
||||||
#include <QtCore/qmap.h>
|
|
||||||
#include <QtCore/qlist.h>
|
|
||||||
|
|
||||||
#include "qscriptscriptdata_p.h"
|
|
||||||
#include "qscriptbreakpointdata_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerAgent;
|
|
||||||
class QScriptDebuggerAgentPrivate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum State {
|
|
||||||
NoState,
|
|
||||||
SteppingIntoState,
|
|
||||||
SteppedIntoState,
|
|
||||||
SteppingOverState,
|
|
||||||
SteppedOverState,
|
|
||||||
SteppingOutState,
|
|
||||||
SteppedOutState,
|
|
||||||
RunningToLocationState,
|
|
||||||
ReachedLocationState,
|
|
||||||
InterruptingState,
|
|
||||||
InterruptedState,
|
|
||||||
BreakpointState,
|
|
||||||
ReturningByForceState,
|
|
||||||
ReturnedByForceState
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptDebuggerAgentPrivate();
|
|
||||||
~QScriptDebuggerAgentPrivate();
|
|
||||||
|
|
||||||
static QScriptDebuggerAgentPrivate *get(QScriptDebuggerAgent *);
|
|
||||||
|
|
||||||
State state;
|
|
||||||
int stepDepth;
|
|
||||||
int stepCount;
|
|
||||||
int targetScriptId;
|
|
||||||
QString targetFileName;
|
|
||||||
int targetLineNumber;
|
|
||||||
QScriptValue stepResult;
|
|
||||||
int returnCounter;
|
|
||||||
QScriptValue returnValue;
|
|
||||||
|
|
||||||
int nextBreakpointId;
|
|
||||||
QHash<qint64, QList<int> > resolvedBreakpoints;
|
|
||||||
QHash<QString, QList<int> > unresolvedBreakpoints;
|
|
||||||
QScriptBreakpointMap breakpoints;
|
|
||||||
int hitBreakpointId;
|
|
||||||
|
|
||||||
QScriptScriptMap scripts;
|
|
||||||
QScriptScriptMap checkpointScripts;
|
|
||||||
QScriptScriptMap previousCheckpointScripts;
|
|
||||||
QList<QList<qint64> > scriptIdStack;
|
|
||||||
|
|
||||||
QList<qint64> contextIdStack;
|
|
||||||
QList<qint64> checkpointContextIdStack;
|
|
||||||
qint64 nextContextId;
|
|
||||||
|
|
||||||
QTime processEventsTimer;
|
|
||||||
int statementCounter;
|
|
||||||
|
|
||||||
QScriptDebuggerBackendPrivate *backend;
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,972 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggerbackend_p.h"
|
|
||||||
#include "qscriptdebuggerbackend_p_p.h"
|
|
||||||
#include "qscriptdebuggeragent_p.h"
|
|
||||||
#include "qscriptdebuggercommandexecutor_p.h"
|
|
||||||
#include "qscriptdebuggerevent_p.h"
|
|
||||||
#include "qscriptdebuggervalue_p.h"
|
|
||||||
#include "qscriptscriptdata_p.h"
|
|
||||||
#include "qscriptbreakpointdata_p.h"
|
|
||||||
#include "qscriptobjectsnapshot_p.h"
|
|
||||||
#include "qscripttoolscommon_p.h"
|
|
||||||
|
|
||||||
#include <QtScript/qscriptengine.h>
|
|
||||||
#include <QtScript/qscriptcontextinfo.h>
|
|
||||||
#include <QtScript/qscriptvalueiterator.h>
|
|
||||||
|
|
||||||
#include <QtCore/qcoreapplication.h>
|
|
||||||
#include <QtCore/qdebug.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\since 4.5
|
|
||||||
\class QScriptDebuggerBackend
|
|
||||||
\internal
|
|
||||||
|
|
||||||
\brief The QScriptDebuggerBackend class is the base class of debugger back-ends.
|
|
||||||
|
|
||||||
QScriptDebuggerBackend builds on the QScriptDebuggerAgent class.
|
|
||||||
|
|
||||||
This class is usually used together with the QScriptDebuggerFrontend
|
|
||||||
class, in order to form a (front-end, back-end) pair.
|
|
||||||
|
|
||||||
Call attachTo() to attach to a QScriptEngine object. Call detach()
|
|
||||||
to detach from the current engine.
|
|
||||||
|
|
||||||
Call stepInto() to step into the next script statement; call stepOver()
|
|
||||||
to step over the next script statement; and call stepOut() to step out
|
|
||||||
of the currently executing script function. An event() will be generated
|
|
||||||
when the stepping is completed.
|
|
||||||
|
|
||||||
Call runToLocation() to execute script statements until a certain
|
|
||||||
location has been reached. An event() will be generated when the location
|
|
||||||
has been reached.
|
|
||||||
|
|
||||||
Call interruptEvaluation() to request that evaluation should be
|
|
||||||
interrupted. An event() will be generated upon the next script
|
|
||||||
statement that is reached.
|
|
||||||
|
|
||||||
Call continueEvalution() to allow script evaluation to continue.
|
|
||||||
|
|
||||||
Call setBreakpoint() to set a breakpoint. A breakpoint event() will
|
|
||||||
be generated when a breakpoint is hit. Call deleteBreakpoint() to
|
|
||||||
delete a breakpoint. Call modifyBreakpoint() to change the state of
|
|
||||||
an existing breakpoint.
|
|
||||||
|
|
||||||
Call contextCount() to obtain the number of active contexts
|
|
||||||
(frames). Call context() to obtain a pointer to a QScriptContext.
|
|
||||||
|
|
||||||
\section1 Subclassing
|
|
||||||
|
|
||||||
When subclassing QScriptDebuggerBackend, you must implement the pure
|
|
||||||
virtual event() function. This function typically forwards the event
|
|
||||||
to a QScriptDebuggerFrontend object. For most type of events,
|
|
||||||
event() should block until the back-end is instructed to resume
|
|
||||||
execution (e.g. until continueEvalution() is called). You must
|
|
||||||
implement resume(), which is responsible for making event() return.
|
|
||||||
|
|
||||||
\sa QScriptDebuggerFrontend, QScriptDebuggerEvent
|
|
||||||
*/
|
|
||||||
|
|
||||||
// helper class that's used to handle our custom Qt events
|
|
||||||
class QScriptDebuggerBackendEventReceiver : public QObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerBackendEventReceiver(QScriptDebuggerBackendPrivate *backend,
|
|
||||||
QObject *parent = nullptr)
|
|
||||||
: QObject(parent), m_backend(backend) {}
|
|
||||||
~QScriptDebuggerBackendEventReceiver() {}
|
|
||||||
|
|
||||||
bool event(QEvent *e)
|
|
||||||
{
|
|
||||||
return m_backend->event(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
QScriptDebuggerBackendPrivate *m_backend;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
QScriptDebuggerBackendPrivate::QScriptDebuggerBackendPrivate()
|
|
||||||
: agent(0), commandExecutor(0),
|
|
||||||
pendingEvaluateContextIndex(-1), pendingEvaluateLineNumber(-1),
|
|
||||||
ignoreExceptions(false),
|
|
||||||
nextScriptValueIteratorId(0), nextScriptObjectSnapshotId(0),
|
|
||||||
eventReceiver(0),
|
|
||||||
q_ptr(0) // q_ptr will be set later by QScriptDebuggerBackend constructor
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerBackendPrivate::~QScriptDebuggerBackendPrivate()
|
|
||||||
{
|
|
||||||
if (agent)
|
|
||||||
agent->nullifyBackendPointer();
|
|
||||||
delete commandExecutor;
|
|
||||||
delete eventReceiver;
|
|
||||||
qDeleteAll(scriptValueIterators);
|
|
||||||
qDeleteAll(scriptObjectSnapshots);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerBackendPrivate::postEvent(QEvent *e)
|
|
||||||
{
|
|
||||||
if (!eventReceiver) {
|
|
||||||
eventReceiver = new QScriptDebuggerBackendEventReceiver(this);
|
|
||||||
Q_ASSERT(agent != 0);
|
|
||||||
eventReceiver->moveToThread(agent->engine()->thread());
|
|
||||||
}
|
|
||||||
QCoreApplication::postEvent(eventReceiver, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QScriptDebuggerBackendPrivate::event(QEvent *e)
|
|
||||||
{
|
|
||||||
if (e->type() == QEvent::User+1) {
|
|
||||||
QScriptDebuggerEventEvent *de = static_cast<QScriptDebuggerEventEvent*>(e);
|
|
||||||
q_func()->event(de->event());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerBackendPrivate::agentDestroyed(QScriptDebuggerAgent *ag)
|
|
||||||
{
|
|
||||||
// Since agents are owned by the script engine, this in practice means
|
|
||||||
// that the engine has been destroyed. Invalidate our pointer so we
|
|
||||||
// don't crash later.
|
|
||||||
if (agent == ag)
|
|
||||||
agent = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
The agent calls this function when it has completed a step
|
|
||||||
operation.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackendPrivate::stepped(qint64 scriptId,
|
|
||||||
int lineNumber,
|
|
||||||
int columnNumber,
|
|
||||||
const QScriptValue &result)
|
|
||||||
{
|
|
||||||
Q_Q(QScriptDebuggerBackend);
|
|
||||||
QScriptDebuggerEvent e(QScriptDebuggerEvent::SteppingFinished,
|
|
||||||
scriptId, lineNumber, columnNumber);
|
|
||||||
e.setFileName(agent->scriptData(scriptId).fileName());
|
|
||||||
QScriptDebuggerValue value(result);
|
|
||||||
e.setScriptValue(value);
|
|
||||||
if (!result.isUndefined())
|
|
||||||
e.setMessage(result.toString()); // for convenience -- we always need it
|
|
||||||
q->event(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
The agent calls this function when it has run to a particular
|
|
||||||
location.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackendPrivate::locationReached(qint64 scriptId,
|
|
||||||
int lineNumber,
|
|
||||||
int columnNumber)
|
|
||||||
{
|
|
||||||
Q_Q(QScriptDebuggerBackend);
|
|
||||||
QScriptDebuggerEvent e(QScriptDebuggerEvent::LocationReached,
|
|
||||||
scriptId, lineNumber, columnNumber);
|
|
||||||
e.setFileName(agent->scriptData(scriptId).fileName());
|
|
||||||
q->event(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
The agent calls this function when evaluation has been interrupted.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackendPrivate::interrupted(qint64 scriptId,
|
|
||||||
int lineNumber,
|
|
||||||
int columnNumber)
|
|
||||||
{
|
|
||||||
Q_Q(QScriptDebuggerBackend);
|
|
||||||
QScriptDebuggerEvent e(QScriptDebuggerEvent::Interrupted,
|
|
||||||
scriptId, lineNumber, columnNumber);
|
|
||||||
e.setFileName(agent->scriptData(scriptId).fileName());
|
|
||||||
q->event(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
The agent calls this function when a breakpoint has been triggered.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackendPrivate::breakpoint(qint64 scriptId,
|
|
||||||
int lineNumber,
|
|
||||||
int columnNumber,
|
|
||||||
int breakpointId)
|
|
||||||
{
|
|
||||||
Q_Q(QScriptDebuggerBackend);
|
|
||||||
QScriptDebuggerEvent e(QScriptDebuggerEvent::Breakpoint,
|
|
||||||
scriptId, lineNumber, columnNumber);
|
|
||||||
e.setFileName(agent->scriptData(scriptId).fileName());
|
|
||||||
e.setBreakpointId(breakpointId);
|
|
||||||
q->event(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
The agent calls this function when an uncaught exception has
|
|
||||||
occurred.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackendPrivate::exception(qint64 scriptId,
|
|
||||||
const QScriptValue &exception,
|
|
||||||
bool hasHandler)
|
|
||||||
{
|
|
||||||
Q_Q(QScriptDebuggerBackend);
|
|
||||||
if (ignoreExceptions) {
|
|
||||||
// don't care (it's caught by us)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QScriptDebuggerEvent e(QScriptDebuggerEvent::Exception);
|
|
||||||
e.setScriptId(scriptId);
|
|
||||||
e.setFileName(agent->scriptData(scriptId).fileName());
|
|
||||||
e.setMessage(exception.toString());
|
|
||||||
e.setHasExceptionHandler(hasHandler);
|
|
||||||
int lineNumber = -1;
|
|
||||||
QString fileName;
|
|
||||||
if (exception.property(QLatin1String("lineNumber")).isNumber())
|
|
||||||
lineNumber = exception.property(QLatin1String("lineNumber")).toInt32();
|
|
||||||
if (exception.property(QLatin1String("fileName")).isString())
|
|
||||||
fileName = exception.property(QLatin1String("fileName")).toString();
|
|
||||||
if (lineNumber == -1) {
|
|
||||||
QScriptContextInfo info(q->engine()->currentContext());
|
|
||||||
lineNumber = info.lineNumber();
|
|
||||||
fileName = info.fileName();
|
|
||||||
}
|
|
||||||
if (lineNumber != -1)
|
|
||||||
e.setLineNumber(lineNumber);
|
|
||||||
if (!fileName.isEmpty())
|
|
||||||
e.setFileName(fileName);
|
|
||||||
QScriptDebuggerValue value(exception);
|
|
||||||
e.setScriptValue(value);
|
|
||||||
q->event(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptValue QScriptDebuggerBackendPrivate::trace(QScriptContext *context,
|
|
||||||
QScriptEngine *engine)
|
|
||||||
{
|
|
||||||
QScriptValue data = context->callee().data();
|
|
||||||
QScriptDebuggerBackendPrivate *self = qscriptvalue_cast<QScriptDebuggerBackendPrivate*>(data);
|
|
||||||
if (!self)
|
|
||||||
return engine->undefinedValue();
|
|
||||||
QString str;
|
|
||||||
for (int i = 0; i < context->argumentCount(); ++i) {
|
|
||||||
if (i > 0)
|
|
||||||
str.append(QLatin1Char(' '));
|
|
||||||
str.append(context->argument(i).toString());
|
|
||||||
}
|
|
||||||
QScriptDebuggerEvent e(QScriptDebuggerEvent::Trace);
|
|
||||||
e.setMessage(str);
|
|
||||||
self->q_func()->event(e);
|
|
||||||
return engine->undefinedValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptValue QScriptDebuggerBackendPrivate::qsassert(QScriptContext *context,
|
|
||||||
QScriptEngine *engine)
|
|
||||||
{
|
|
||||||
QScriptValue arg = context->argument(0);
|
|
||||||
if (arg.toBoolean())
|
|
||||||
return arg;
|
|
||||||
QScriptContextInfo info(context->parentContext());
|
|
||||||
QString msg;
|
|
||||||
QString fileName = info.fileName();
|
|
||||||
if (fileName.isEmpty())
|
|
||||||
fileName = QString::fromLatin1("<anonymous script, id=%0>").arg(info.scriptId());
|
|
||||||
msg.append(fileName);
|
|
||||||
msg.append(QLatin1Char(':'));
|
|
||||||
msg.append(QString::number(info.lineNumber()));
|
|
||||||
msg.append(QString::fromLatin1(": Assertion failed"));
|
|
||||||
for (int i = 1; i < context->argumentCount(); ++i) {
|
|
||||||
if (i == 1)
|
|
||||||
msg.append(QLatin1Char(':'));
|
|
||||||
msg.append(QLatin1Char(' '));
|
|
||||||
msg.append(context->argument(i).toString());
|
|
||||||
}
|
|
||||||
QScriptValue err = context->throwError(msg);
|
|
||||||
err.setProperty(QString::fromLatin1("name"), QScriptValue(engine, QString::fromLatin1("AssertionError")));
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptValue QScriptDebuggerBackendPrivate::fileName(QScriptContext *context,
|
|
||||||
QScriptEngine *engine)
|
|
||||||
{
|
|
||||||
QScriptContextInfo info(context->parentContext());
|
|
||||||
QString fn = info.fileName();
|
|
||||||
if (fn.isEmpty())
|
|
||||||
return engine->undefinedValue();
|
|
||||||
return QScriptValue(engine, fn);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptValue QScriptDebuggerBackendPrivate::lineNumber(QScriptContext *context,
|
|
||||||
QScriptEngine *engine)
|
|
||||||
{
|
|
||||||
QScriptContextInfo info(context->parentContext());
|
|
||||||
return QScriptValue(engine, info.lineNumber());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
The agent calls this function when the engine has reached a
|
|
||||||
"debugger" statement.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackendPrivate::debuggerInvocationRequest(
|
|
||||||
qint64 scriptId, int lineNumber, int columnNumber)
|
|
||||||
{
|
|
||||||
Q_Q(QScriptDebuggerBackend);
|
|
||||||
QScriptDebuggerEvent e(QScriptDebuggerEvent::DebuggerInvocationRequest,
|
|
||||||
scriptId, lineNumber, columnNumber);
|
|
||||||
e.setFileName(agent->scriptData(scriptId).fileName());
|
|
||||||
q->event(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerBackendPrivate::forcedReturn(
|
|
||||||
qint64 scriptId, int lineNumber, int columnNumber,
|
|
||||||
const QScriptValue &value)
|
|
||||||
{
|
|
||||||
Q_Q(QScriptDebuggerBackend);
|
|
||||||
QScriptDebuggerEvent e(QScriptDebuggerEvent::ForcedReturn,
|
|
||||||
scriptId, lineNumber, columnNumber);
|
|
||||||
e.setFileName(agent->scriptData(scriptId).fileName());
|
|
||||||
e.setScriptValue(QScriptDebuggerValue(value));
|
|
||||||
q->event(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Creates a QScriptDebuggerBackend object.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerBackend::QScriptDebuggerBackend()
|
|
||||||
: d_ptr(new QScriptDebuggerBackendPrivate)
|
|
||||||
{
|
|
||||||
d_ptr->q_ptr = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Destroys this QScriptDebuggerBackend.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerBackend::~QScriptDebuggerBackend()
|
|
||||||
{
|
|
||||||
detach();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\internal
|
|
||||||
*/
|
|
||||||
QScriptDebuggerBackend::QScriptDebuggerBackend(QScriptDebuggerBackendPrivate &dd)
|
|
||||||
: d_ptr(&dd)
|
|
||||||
{
|
|
||||||
d_ptr->q_ptr = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Attaches this backend to the given \a engine.
|
|
||||||
The backend automatically detaches from the old engine, if any.
|
|
||||||
|
|
||||||
This function installs its own agent on the \a engine using
|
|
||||||
QScriptEngine::setAgent(); any existing agent will be replaced.
|
|
||||||
|
|
||||||
\sa detach(). engine()
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::attachTo(QScriptEngine *engine)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
detach();
|
|
||||||
d->agent = new QScriptDebuggerAgent(d, engine);
|
|
||||||
QScriptValue global = engine->globalObject();
|
|
||||||
d->origTraceFunction = global.property(QString::fromLatin1("print"));
|
|
||||||
global.setProperty(QString::fromLatin1("print"), traceFunction());
|
|
||||||
// global.setProperty(QString::fromLatin1("qAssert"), assertFunction());
|
|
||||||
d->origFileNameFunction = global.property(QString::fromLatin1("__FILE__"));
|
|
||||||
global.setProperty(QString::fromLatin1("__FILE__"), fileNameFunction(),
|
|
||||||
QScriptValue::PropertyGetter | QScriptValue::ReadOnly);
|
|
||||||
d->origLineNumberFunction = global.property(QString::fromLatin1("__LINE__"));
|
|
||||||
global.setProperty(QString::fromLatin1("__LINE__"), lineNumberFunction(),
|
|
||||||
QScriptValue::PropertyGetter | QScriptValue::ReadOnly);
|
|
||||||
engine->setAgent(d->agent);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Detaches this backend from the current script engine.
|
|
||||||
The backend's state (including breakpoints and information on loaded
|
|
||||||
scripts) will be invalidated.
|
|
||||||
|
|
||||||
\sa attach()
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::detach()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent) {
|
|
||||||
QScriptEngine *eng = d->agent->engine();
|
|
||||||
if (eng && eng->agent() == d->agent) {
|
|
||||||
eng->setAgent(0);
|
|
||||||
QScriptValue global = eng->globalObject();
|
|
||||||
global.setProperty(QString::fromLatin1("print"), d->origTraceFunction);
|
|
||||||
d->origTraceFunction = QScriptValue();
|
|
||||||
// global.setProperty(QString::fromLatin1("qAssert"), QScriptValue());
|
|
||||||
global.setProperty(QString::fromLatin1("__FILE__"), QScriptValue(),
|
|
||||||
QScriptValue::PropertyGetter);
|
|
||||||
global.setProperty(QString::fromLatin1("__FILE__"), d->origFileNameFunction);
|
|
||||||
d->origFileNameFunction = QScriptValue();
|
|
||||||
global.setProperty(QString::fromLatin1("__LINE__"), QScriptValue(),
|
|
||||||
QScriptValue::PropertyGetter);
|
|
||||||
global.setProperty(QString::fromLatin1("__LINE__"), d->origLineNumberFunction);
|
|
||||||
d->origLineNumberFunction = QScriptValue();
|
|
||||||
d->agent->nullifyBackendPointer();
|
|
||||||
d->agent = 0; // agent is owned by engine
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
d->pendingEvaluateLineNumber = -1;
|
|
||||||
d->ignoreExceptions = false;
|
|
||||||
d->nextScriptValueIteratorId = 0;
|
|
||||||
qDeleteAll(d->scriptValueIterators);
|
|
||||||
d->scriptValueIterators.clear();
|
|
||||||
qDeleteAll(d->scriptObjectSnapshots);
|
|
||||||
d->scriptObjectSnapshots.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the script engine that this backend is attached to, or 0 if
|
|
||||||
the backend is not attached to an engine.
|
|
||||||
|
|
||||||
\sa attachTo()
|
|
||||||
*/
|
|
||||||
QScriptEngine *QScriptDebuggerBackend::engine() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
if (!d->agent)
|
|
||||||
return 0;
|
|
||||||
return d->agent->engine();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Steps into the next script statement.
|
|
||||||
When stepping is complete, an event() will be generated.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::stepInto(int count)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent) {
|
|
||||||
d->agent->enterStepIntoMode(count);
|
|
||||||
resume();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Steps over the next script statement.
|
|
||||||
When stepping is complete, an event() will be generated.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::stepOver(int count)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent) {
|
|
||||||
d->agent->enterStepOverMode(count);
|
|
||||||
resume();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Steps out of the current script function.
|
|
||||||
When stepping is complete, an event() will be generated.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::stepOut()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent) {
|
|
||||||
d->agent->enterStepOutMode();
|
|
||||||
resume();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Continues script evaluation. Evaluation will proceed without
|
|
||||||
interruption until either 1) an uncaught exception occurs, 2) a
|
|
||||||
breakpoint is triggered, or 3) interruptEvaluation() is called.
|
|
||||||
In each case, a proper event() will be generated.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::continueEvalution()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent) {
|
|
||||||
d->agent->enterContinueMode();
|
|
||||||
resume();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Interrupts script evaluation. When the next script statement is
|
|
||||||
reached, an event() will be generated.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::interruptEvaluation()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent)
|
|
||||||
d->agent->enterInterruptMode();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Continues evaluation until the location defined by the given \a
|
|
||||||
fileName and \a lineNumber is reached. When the location is reached,
|
|
||||||
an event() will be generated.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::runToLocation(const QString &fileName, int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent) {
|
|
||||||
d->agent->enterRunToLocationMode(fileName, lineNumber);
|
|
||||||
resume();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Continues evaluation until the location defined by the given \a
|
|
||||||
scriptId and \a lineNumber is reached. When the location is reached,
|
|
||||||
an event() will be generated.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::runToLocation(qint64 scriptId, int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent) {
|
|
||||||
d->agent->enterRunToLocationMode(scriptId, lineNumber);
|
|
||||||
resume();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerBackend::returnToCaller(int contextIndex, const QScriptValue &value)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent) {
|
|
||||||
d->agent->enterReturnByForceMode(contextIndex, value);
|
|
||||||
resume();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Evaluates the given \a program. When evaluation is complete, an
|
|
||||||
event() is generated.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::evaluate(int contextIndex, const QString &program,
|
|
||||||
const QString &fileName, int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
d->pendingEvaluateContextIndex = contextIndex;
|
|
||||||
d->pendingEvaluateProgram = program;
|
|
||||||
d->pendingEvaluateFileName = fileName;
|
|
||||||
d->pendingEvaluateLineNumber = lineNumber;
|
|
||||||
if (!engine()->isEvaluating())
|
|
||||||
doPendingEvaluate(/*postEvent=*/true);
|
|
||||||
else
|
|
||||||
resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Executes the pending evaluate, if any.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::doPendingEvaluate(bool postEvent)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
QString program = d->pendingEvaluateProgram;
|
|
||||||
if (program.isEmpty())
|
|
||||||
return;
|
|
||||||
int contextIndex = d->pendingEvaluateContextIndex;
|
|
||||||
QScriptContext *ctx = context(contextIndex);
|
|
||||||
Q_ASSERT(ctx != 0);
|
|
||||||
QString fileName = d->pendingEvaluateFileName;
|
|
||||||
int lineNumber = d->pendingEvaluateLineNumber;
|
|
||||||
d->pendingEvaluateProgram = QString();
|
|
||||||
d->pendingEvaluateFileName = QString();
|
|
||||||
d->pendingEvaluateLineNumber = -1;
|
|
||||||
d->pendingEvaluateContextIndex = -1;
|
|
||||||
|
|
||||||
// push a new context and initialize its scope chain etc.
|
|
||||||
{
|
|
||||||
QScriptContext *evalContext = engine()->pushContext();
|
|
||||||
QScriptValueList scopeChain = ctx->scopeChain();
|
|
||||||
if (scopeChain.isEmpty())
|
|
||||||
scopeChain.append(engine()->globalObject());
|
|
||||||
while (!scopeChain.isEmpty())
|
|
||||||
evalContext->pushScope(scopeChain.takeLast());
|
|
||||||
evalContext->setActivationObject(ctx->activationObject());
|
|
||||||
evalContext->setThisObject(ctx->thisObject());
|
|
||||||
}
|
|
||||||
|
|
||||||
d->agent->enterContinueMode();
|
|
||||||
// set a flag so that any exception that happens in
|
|
||||||
// the evaluate() is not sent to the debugger
|
|
||||||
d->ignoreExceptions = true;
|
|
||||||
bool hadException = engine()->hasUncaughtException();
|
|
||||||
QScriptValue ret = engine()->evaluate(program, fileName, lineNumber);
|
|
||||||
d->ignoreExceptions = false;
|
|
||||||
if (!hadException && engine()->hasUncaughtException())
|
|
||||||
engine()->clearExceptions();
|
|
||||||
engine()->popContext();
|
|
||||||
|
|
||||||
QScriptDebuggerValue retret(ret);
|
|
||||||
QScriptDebuggerEvent e(QScriptDebuggerEvent::InlineEvalFinished);
|
|
||||||
e.setScriptValue(retret);
|
|
||||||
if (!ret.isUndefined())
|
|
||||||
e.setMessage(ret.toString()); // for convenience -- we always need it
|
|
||||||
|
|
||||||
e.setNestedEvaluate(engine()->isEvaluating());
|
|
||||||
|
|
||||||
if (postEvent) {
|
|
||||||
QScriptDebuggerEventEvent *de = new QScriptDebuggerEventEvent(e);
|
|
||||||
d->postEvent(de);
|
|
||||||
} else {
|
|
||||||
event(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets a breakpoint defined by the given \a data, and returns a unique
|
|
||||||
identifier for the new breakpoint.
|
|
||||||
|
|
||||||
If the conditions of the breakpoint is satisfied at some point
|
|
||||||
during script evaluation, a breakpoint event() will be generated.
|
|
||||||
|
|
||||||
\sa deleteBreakpoint(), breakpoints()
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerBackend::setBreakpoint(const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (!d->agent)
|
|
||||||
return -1;
|
|
||||||
if (!data.isValid())
|
|
||||||
return -1;
|
|
||||||
return d->agent->setBreakpoint(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Deletes the breakpoint identified by the given \a id. Returns true
|
|
||||||
if the breakpoint was deleted (i.e. the \a id was valid), otherwise
|
|
||||||
returns false.
|
|
||||||
|
|
||||||
\sa setBreakpoint()
|
|
||||||
*/
|
|
||||||
bool QScriptDebuggerBackend::deleteBreakpoint(int id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (!d->agent)
|
|
||||||
return false;
|
|
||||||
return d->agent->deleteBreakpoint(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Deletes all breakpoints.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::deleteAllBreakpoints()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent)
|
|
||||||
d->agent->deleteAllBreakpoints();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the data associated with the breakpoint identified by the
|
|
||||||
given \a id.
|
|
||||||
*/
|
|
||||||
QScriptBreakpointData QScriptDebuggerBackend::breakpointData(int id) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
if (!d->agent)
|
|
||||||
return QScriptBreakpointData();
|
|
||||||
return d->agent->breakpointData(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the \a data associated with the breakpoint identified by the
|
|
||||||
given \a id.
|
|
||||||
*/
|
|
||||||
bool QScriptDebuggerBackend::setBreakpointData(int id, const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent)
|
|
||||||
return d->agent->setBreakpointData(id, data);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns this backend's breakpoints.
|
|
||||||
|
|
||||||
\sa setBreakpoint()
|
|
||||||
*/
|
|
||||||
QScriptBreakpointMap QScriptDebuggerBackend::breakpoints() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
if (!d->agent)
|
|
||||||
return QScriptBreakpointMap();
|
|
||||||
return d->agent->breakpoints();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the scripts that this backend knows about.
|
|
||||||
|
|
||||||
\sa scriptData()
|
|
||||||
*/
|
|
||||||
QScriptScriptMap QScriptDebuggerBackend::scripts() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
if (!d->agent)
|
|
||||||
return QScriptScriptMap();
|
|
||||||
return d->agent->scripts();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the data for the script identified by the given \a id.
|
|
||||||
|
|
||||||
\sa scripts()
|
|
||||||
*/
|
|
||||||
QScriptScriptData QScriptDebuggerBackend::scriptData(qint64 id) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
if (!d->agent)
|
|
||||||
return QScriptScriptData();
|
|
||||||
return d->agent->scriptData(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Makes a checkpoint of the currently loaded scripts.
|
|
||||||
|
|
||||||
\sa scriptsDelta()
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerBackend::scriptsCheckpoint()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (d->agent)
|
|
||||||
d->agent->scriptsCheckpoint();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the difference between the latest scripts checkpoint and the
|
|
||||||
previous checkpoint. The first item in the pair is a list
|
|
||||||
containing the identifiers of the scripts that were added. The
|
|
||||||
second item in the pair is a list containing the identifiers of the
|
|
||||||
scripts that were removed.
|
|
||||||
|
|
||||||
\sa scriptsCheckpoint()
|
|
||||||
*/
|
|
||||||
QScriptScriptsDelta QScriptDebuggerBackend::scriptsDelta() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
if (!d->agent)
|
|
||||||
return QPair<QList<qint64>, QList<qint64> >();
|
|
||||||
return d->agent->scriptsDelta();
|
|
||||||
}
|
|
||||||
|
|
||||||
qint64 QScriptDebuggerBackend::resolveScript(const QString &fileName) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
if (!d->agent)
|
|
||||||
return -1;
|
|
||||||
return d->agent->resolveScript(fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the number of contexts (frames).
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerBackend::contextCount() const
|
|
||||||
{
|
|
||||||
if (!engine())
|
|
||||||
return 0;
|
|
||||||
return contextIds().count();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the context for the frame with the given \a index.
|
|
||||||
*/
|
|
||||||
QScriptContext *QScriptDebuggerBackend::context(int index) const
|
|
||||||
{
|
|
||||||
if (index < 0)
|
|
||||||
return 0;
|
|
||||||
QScriptContext *ctx = engine()->currentContext();
|
|
||||||
while (ctx) {
|
|
||||||
if (index == 0)
|
|
||||||
return ctx;
|
|
||||||
ctx = ctx->parentContext();
|
|
||||||
--index;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns a backtrace of the current execution.
|
|
||||||
*/
|
|
||||||
QStringList QScriptDebuggerBackend::backtrace() const
|
|
||||||
{
|
|
||||||
if (!engine())
|
|
||||||
return QStringList();
|
|
||||||
return engine()->currentContext()->backtrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<qint64> QScriptDebuggerBackend::contextIds() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
if (!d->agent)
|
|
||||||
return QList<qint64>();
|
|
||||||
return d->agent->contextIds();
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptContextsDelta QScriptDebuggerBackend::contextsCheckpoint()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
if (!d->agent)
|
|
||||||
return QScriptContextsDelta();
|
|
||||||
return d->agent->contextsCheckpoint();
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerBackend::newScriptObjectSnapshot()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
int id = d->nextScriptObjectSnapshotId;
|
|
||||||
++d->nextScriptObjectSnapshotId;
|
|
||||||
d->scriptObjectSnapshots[id] = new QScriptObjectSnapshot();
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptObjectSnapshot *QScriptDebuggerBackend::scriptObjectSnapshot(int id) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
return d->scriptObjectSnapshots.value(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerBackend::deleteScriptObjectSnapshot(int id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
QScriptObjectSnapshot *snap = d->scriptObjectSnapshots.take(id);
|
|
||||||
delete snap;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerBackend::newScriptValueIterator(const QScriptValue &object)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
int id = d->nextScriptValueIteratorId;
|
|
||||||
++d->nextScriptValueIteratorId;
|
|
||||||
d->scriptValueIterators[id] = new QScriptValueIterator(object);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptValueIterator *QScriptDebuggerBackend::scriptValueIterator(int id) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
return d->scriptValueIterators.value(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerBackend::deleteScriptValueIterator(int id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
QScriptValueIterator *it = d->scriptValueIterators.take(id);
|
|
||||||
delete it;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QScriptDebuggerBackend::ignoreExceptions() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
return d->ignoreExceptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerBackend::setIgnoreExceptions(bool ignore)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
d->ignoreExceptions = ignore;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns a trace function. The trace function has similar semantics
|
|
||||||
to the built-in print() function; however, instead of writing text
|
|
||||||
to standard output, it generates a trace event containing the text.
|
|
||||||
*/
|
|
||||||
QScriptValue QScriptDebuggerBackend::traceFunction() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
if (!engine())
|
|
||||||
return QScriptValue();
|
|
||||||
QScriptValue fun = engine()->newFunction(QScriptDebuggerBackendPrivate::trace);
|
|
||||||
fun.setData(qScriptValueFromValue(engine(), const_cast<QScriptDebuggerBackendPrivate*>(d)));
|
|
||||||
return fun;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptValue QScriptDebuggerBackend::assertFunction() const
|
|
||||||
{
|
|
||||||
if (!engine())
|
|
||||||
return QScriptValue();
|
|
||||||
QScriptValue fun = engine()->newFunction(QScriptDebuggerBackendPrivate::qsassert);
|
|
||||||
return fun;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptValue QScriptDebuggerBackend::fileNameFunction() const
|
|
||||||
{
|
|
||||||
if (!engine())
|
|
||||||
return QScriptValue();
|
|
||||||
QScriptValue fun = engine()->newFunction(QScriptDebuggerBackendPrivate::fileName);
|
|
||||||
return fun;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptValue QScriptDebuggerBackend::lineNumberFunction() const
|
|
||||||
{
|
|
||||||
if (!engine())
|
|
||||||
return QScriptValue();
|
|
||||||
QScriptValue fun = engine()->newFunction(QScriptDebuggerBackendPrivate::lineNumber);
|
|
||||||
return fun;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommandExecutor *QScriptDebuggerBackend::commandExecutor() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerBackend);
|
|
||||||
if (d->commandExecutor)
|
|
||||||
return d->commandExecutor;
|
|
||||||
QScriptDebuggerBackendPrivate *dd = const_cast<QScriptDebuggerBackendPrivate*>(d);
|
|
||||||
dd->commandExecutor = new QScriptDebuggerCommandExecutor();
|
|
||||||
return dd->commandExecutor;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerBackend::setCommandExecutor(QScriptDebuggerCommandExecutor *executor)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerBackend);
|
|
||||||
d->commandExecutor = executor;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn void QScriptDebuggerBackend::resume()
|
|
||||||
|
|
||||||
This function is called when control should be returned back to the
|
|
||||||
back-end, i.e. when script evaluation should be resumed after an
|
|
||||||
event has been delivered.
|
|
||||||
|
|
||||||
Subclasses must reimplement this function to make event() return.
|
|
||||||
|
|
||||||
\sa event()
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn void QScriptDebuggerBackend::event(const QScriptDebuggerEvent &event)
|
|
||||||
|
|
||||||
This function is called when the back-end has generated the given \a event.
|
|
||||||
|
|
||||||
Subclasses must reimplement this function to handle the
|
|
||||||
event. Typically the event is forwarded to a
|
|
||||||
QScriptDebuggerFrontend, which will in turn forward it to its
|
|
||||||
QScriptDebuggerClient. The client may then query the front-end for
|
|
||||||
information about the execution state, and call e.g.
|
|
||||||
continueEvalution() to resume execution. This function should block
|
|
||||||
until resume() is called.
|
|
||||||
|
|
||||||
\sa resume()
|
|
||||||
*/
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
|
@ -1,136 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERBACKEND_P_H
|
|
||||||
#define QSCRIPTDEBUGGERBACKEND_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobjectdefs.h>
|
|
||||||
|
|
||||||
#include <QtCore/qpair.h>
|
|
||||||
|
|
||||||
#include "qscriptbreakpointdata_p.h"
|
|
||||||
#include "qscriptscriptdata_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptContext;
|
|
||||||
class QScriptEngine;
|
|
||||||
class QScriptDebuggerCommandExecutor;
|
|
||||||
class QScriptDebuggerEvent;
|
|
||||||
class QScriptValue;
|
|
||||||
class QScriptValueIterator;
|
|
||||||
class QScriptObjectSnapshot;
|
|
||||||
class QStringList;
|
|
||||||
|
|
||||||
typedef QPair<QList<qint64>, QList<qint64> > QScriptScriptsDelta;
|
|
||||||
typedef QPair<QList<qint64>, QList<qint64> > QScriptContextsDelta;
|
|
||||||
|
|
||||||
class QScriptDebuggerBackendPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerBackend
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerBackend();
|
|
||||||
virtual ~QScriptDebuggerBackend();
|
|
||||||
|
|
||||||
void attachTo(QScriptEngine *engine);
|
|
||||||
void detach();
|
|
||||||
|
|
||||||
QScriptEngine *engine() const;
|
|
||||||
|
|
||||||
void stepInto(int count = 1);
|
|
||||||
void stepOver(int count = 1);
|
|
||||||
void stepOut();
|
|
||||||
void continueEvalution();
|
|
||||||
void interruptEvaluation();
|
|
||||||
void runToLocation(const QString &fileName, int lineNumber);
|
|
||||||
void runToLocation(qint64 scriptId, int lineNumber);
|
|
||||||
void returnToCaller(int contextIndex, const QScriptValue &value);
|
|
||||||
void evaluate(int contextIndex, const QString &program,
|
|
||||||
const QString &fileName, int lineNumber);
|
|
||||||
|
|
||||||
int setBreakpoint(const QScriptBreakpointData &data);
|
|
||||||
bool deleteBreakpoint(int id);
|
|
||||||
void deleteAllBreakpoints();
|
|
||||||
QScriptBreakpointData breakpointData(int id) const;
|
|
||||||
bool setBreakpointData(int id, const QScriptBreakpointData &data);
|
|
||||||
QScriptBreakpointMap breakpoints() const;
|
|
||||||
|
|
||||||
QScriptScriptMap scripts() const;
|
|
||||||
QScriptScriptData scriptData(qint64 id) const;
|
|
||||||
void scriptsCheckpoint();
|
|
||||||
QScriptScriptsDelta scriptsDelta() const;
|
|
||||||
qint64 resolveScript(const QString &fileName) const;
|
|
||||||
|
|
||||||
int contextCount() const;
|
|
||||||
QScriptContext *context(int index) const;
|
|
||||||
QStringList backtrace() const;
|
|
||||||
QList<qint64> contextIds() const;
|
|
||||||
QScriptContextsDelta contextsCheckpoint();
|
|
||||||
|
|
||||||
int newScriptObjectSnapshot();
|
|
||||||
QScriptObjectSnapshot *scriptObjectSnapshot(int id) const;
|
|
||||||
void deleteScriptObjectSnapshot(int id);
|
|
||||||
|
|
||||||
int newScriptValueIterator(const QScriptValue &object);
|
|
||||||
QScriptValueIterator *scriptValueIterator(int id) const;
|
|
||||||
void deleteScriptValueIterator(int id);
|
|
||||||
|
|
||||||
QScriptValue traceFunction() const;
|
|
||||||
QScriptValue assertFunction() const;
|
|
||||||
QScriptValue fileNameFunction() const;
|
|
||||||
QScriptValue lineNumberFunction() const;
|
|
||||||
|
|
||||||
void doPendingEvaluate(bool postEvent);
|
|
||||||
|
|
||||||
bool ignoreExceptions() const;
|
|
||||||
void setIgnoreExceptions(bool ignore);
|
|
||||||
|
|
||||||
QScriptDebuggerCommandExecutor *commandExecutor() const;
|
|
||||||
void setCommandExecutor(QScriptDebuggerCommandExecutor *executor);
|
|
||||||
|
|
||||||
virtual void resume() = 0;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void event(const QScriptDebuggerEvent &event) = 0;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QScriptDebuggerBackend(QScriptDebuggerBackendPrivate &dd);
|
|
||||||
QScopedPointer<QScriptDebuggerBackendPrivate> d_ptr;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerBackend)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerBackend)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,117 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERBACKEND_P_P_H
|
|
||||||
#define QSCRIPTDEBUGGERBACKEND_P_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobjectdefs.h>
|
|
||||||
|
|
||||||
#include <QtCore/qhash.h>
|
|
||||||
#include <QtCore/qlist.h>
|
|
||||||
#include <QtScript/qscriptvalue.h>
|
|
||||||
|
|
||||||
#include "qscriptdebuggerbackend_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QEvent;
|
|
||||||
class QString;
|
|
||||||
class QScriptContext;
|
|
||||||
class QScriptEngine;
|
|
||||||
class QScriptValueIterator;
|
|
||||||
class QScriptObjectSnapshot;
|
|
||||||
class QScriptDebuggerAgent;
|
|
||||||
class QScriptDebuggerCommandExecutor;
|
|
||||||
|
|
||||||
class QScriptDebuggerBackend;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerBackendPrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptDebuggerBackend)
|
|
||||||
public:
|
|
||||||
QScriptDebuggerBackendPrivate();
|
|
||||||
virtual ~QScriptDebuggerBackendPrivate();
|
|
||||||
|
|
||||||
void postEvent(QEvent *e);
|
|
||||||
virtual bool event(QEvent *e);
|
|
||||||
|
|
||||||
// events reported by agent
|
|
||||||
virtual void stepped(qint64 scriptId, int lineNumber, int columnNumber,
|
|
||||||
const QScriptValue &result);
|
|
||||||
virtual void locationReached(qint64 scriptId, int lineNumber, int columnNumber);
|
|
||||||
virtual void interrupted(qint64 scriptId, int lineNumber, int columnNumber);
|
|
||||||
virtual void breakpoint(qint64 scriptId, int lineNumber, int columnNumber,
|
|
||||||
int breakpointId);
|
|
||||||
virtual void exception(qint64 scriptId, const QScriptValue &exception,
|
|
||||||
bool hasHandler);
|
|
||||||
virtual void debuggerInvocationRequest(qint64 scriptId, int lineNumber,
|
|
||||||
int columnNumber);
|
|
||||||
virtual void forcedReturn(qint64 scriptId, int lineNumber, int columnNumber,
|
|
||||||
const QScriptValue &value);
|
|
||||||
|
|
||||||
static QScriptValue trace(QScriptContext *context,
|
|
||||||
QScriptEngine *engine);
|
|
||||||
static QScriptValue qsassert(QScriptContext *context,
|
|
||||||
QScriptEngine *engine);
|
|
||||||
static QScriptValue fileName(QScriptContext *context,
|
|
||||||
QScriptEngine *engine);
|
|
||||||
static QScriptValue lineNumber(QScriptContext *context,
|
|
||||||
QScriptEngine *engine);
|
|
||||||
|
|
||||||
void agentDestroyed(QScriptDebuggerAgent *);
|
|
||||||
|
|
||||||
QScriptDebuggerAgent *agent;
|
|
||||||
QScriptDebuggerCommandExecutor *commandExecutor;
|
|
||||||
|
|
||||||
int pendingEvaluateContextIndex;
|
|
||||||
QString pendingEvaluateProgram;
|
|
||||||
QString pendingEvaluateFileName;
|
|
||||||
int pendingEvaluateLineNumber;
|
|
||||||
bool ignoreExceptions;
|
|
||||||
|
|
||||||
int nextScriptValueIteratorId;
|
|
||||||
QMap<int, QScriptValueIterator*> scriptValueIterators;
|
|
||||||
|
|
||||||
int nextScriptObjectSnapshotId;
|
|
||||||
QMap<int, QScriptObjectSnapshot*> scriptObjectSnapshots;
|
|
||||||
|
|
||||||
QObject *eventReceiver;
|
|
||||||
|
|
||||||
QScriptDebuggerBackend *q_ptr;
|
|
||||||
|
|
||||||
QScriptValue origTraceFunction;
|
|
||||||
QScriptValue origFileNameFunction;
|
|
||||||
QScriptValue origLineNumberFunction;
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,230 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggercodefinderwidget_p.h"
|
|
||||||
#include "qscriptdebuggercodefinderwidgetinterface_p_p.h"
|
|
||||||
#include "qscripttoolsresources_p.h"
|
|
||||||
|
|
||||||
#include <QtGui/qboxlayout.h>
|
|
||||||
#include <QtGui/qlineedit.h>
|
|
||||||
#include <QtGui/qcheckbox.h>
|
|
||||||
#include <QtGui/qlabel.h>
|
|
||||||
#include <QtGui/qtoolbutton.h>
|
|
||||||
#include <QtGui/qevent.h>
|
|
||||||
#include <QtCore/qdebug.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeFinderWidgetPrivate
|
|
||||||
: public QScriptDebuggerCodeFinderWidgetInterfacePrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptDebuggerCodeFinderWidget)
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCodeFinderWidgetPrivate();
|
|
||||||
~QScriptDebuggerCodeFinderWidgetPrivate();
|
|
||||||
|
|
||||||
// private slots
|
|
||||||
void _q_updateButtons();
|
|
||||||
void _q_onTextChanged(const QString &);
|
|
||||||
void _q_next();
|
|
||||||
void _q_previous();
|
|
||||||
|
|
||||||
int findOptions() const;
|
|
||||||
|
|
||||||
QLineEdit *editFind;
|
|
||||||
QCheckBox *checkCase;
|
|
||||||
QLabel *labelWrapped;
|
|
||||||
QToolButton *toolNext;
|
|
||||||
QToolButton *toolClose;
|
|
||||||
QToolButton *toolPrevious;
|
|
||||||
QCheckBox *checkWholeWords;
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptDebuggerCodeFinderWidgetPrivate::QScriptDebuggerCodeFinderWidgetPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeFinderWidgetPrivate::~QScriptDebuggerCodeFinderWidgetPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeFinderWidgetPrivate::_q_updateButtons()
|
|
||||||
{
|
|
||||||
if (editFind->text().isEmpty()) {
|
|
||||||
toolPrevious->setEnabled(false);
|
|
||||||
toolNext->setEnabled(false);
|
|
||||||
} else {
|
|
||||||
toolPrevious->setEnabled(true);
|
|
||||||
toolNext->setEnabled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCodeFinderWidgetPrivate::findOptions() const
|
|
||||||
{
|
|
||||||
int flags = 0;
|
|
||||||
if (checkCase->isChecked())
|
|
||||||
flags |= QTextDocument::FindCaseSensitively;
|
|
||||||
if (checkWholeWords->isChecked())
|
|
||||||
flags |= QTextDocument::FindWholeWords;
|
|
||||||
return flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeFinderWidgetPrivate::_q_onTextChanged(const QString &text)
|
|
||||||
{
|
|
||||||
emit q_func()->findRequest(text, findOptions() | 0x100);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeFinderWidgetPrivate::_q_next()
|
|
||||||
{
|
|
||||||
emit q_func()->findRequest(editFind->text(), findOptions());
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeFinderWidgetPrivate::_q_previous()
|
|
||||||
{
|
|
||||||
emit q_func()->findRequest(editFind->text(), findOptions() | QTextDocument::FindBackward);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeFinderWidget::QScriptDebuggerCodeFinderWidget(QWidget *parent)
|
|
||||||
: QScriptDebuggerCodeFinderWidgetInterface(
|
|
||||||
*new QScriptDebuggerCodeFinderWidgetPrivate, parent, 0)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeFinderWidget);
|
|
||||||
QHBoxLayout *hboxLayout = new QHBoxLayout(this);
|
|
||||||
hboxLayout->setSpacing(6);
|
|
||||||
hboxLayout->setMargin(0);
|
|
||||||
|
|
||||||
d->toolClose = new QToolButton(this);
|
|
||||||
QPixmap pix;
|
|
||||||
pix.loadFromData(
|
|
||||||
scripttools_closetab_png, scripttools_closetab_png_len,
|
|
||||||
qt_images_format
|
|
||||||
);
|
|
||||||
d->toolClose->setIcon(QIcon(pix));
|
|
||||||
d->toolClose->setAutoRaise(true);
|
|
||||||
d->toolClose->setText(tr("Close"));
|
|
||||||
hboxLayout->addWidget(d->toolClose);
|
|
||||||
|
|
||||||
d->editFind = new QLineEdit(this);
|
|
||||||
d->editFind->setMinimumSize(QSize(150, 0));
|
|
||||||
connect(d->editFind, SIGNAL(textChanged(QString)),
|
|
||||||
this, SLOT(_q_updateButtons()));
|
|
||||||
connect(d->editFind, SIGNAL(returnPressed()),
|
|
||||||
this, SLOT(_q_next()));
|
|
||||||
hboxLayout->addWidget(d->editFind);
|
|
||||||
|
|
||||||
d->toolPrevious = new QToolButton(this);
|
|
||||||
d->toolPrevious->setAutoRaise(true);
|
|
||||||
d->toolPrevious->setText(tr("Previous"));
|
|
||||||
d->toolPrevious->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
|
|
||||||
d->toolPrevious->setIcon(QIcon::fromTheme("go-previous"));
|
|
||||||
hboxLayout->addWidget(d->toolPrevious);
|
|
||||||
|
|
||||||
d->toolNext = new QToolButton(this);
|
|
||||||
d->toolNext->setAutoRaise(true);
|
|
||||||
d->toolNext->setText(tr("Next"));
|
|
||||||
d->toolNext->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
|
|
||||||
d->toolNext->setIcon(QIcon::fromTheme("go-next"));
|
|
||||||
hboxLayout->addWidget(d->toolNext);
|
|
||||||
|
|
||||||
d->checkCase = new QCheckBox(tr("Case Sensitive"), this);
|
|
||||||
hboxLayout->addWidget(d->checkCase);
|
|
||||||
|
|
||||||
d->checkWholeWords = new QCheckBox(tr("Whole words"), this);
|
|
||||||
hboxLayout->addWidget(d->checkWholeWords);
|
|
||||||
|
|
||||||
d->labelWrapped = new QLabel(this);
|
|
||||||
d->labelWrapped->setMinimumSize(QSize(0, 20));
|
|
||||||
d->labelWrapped->setMaximumSize(QSize(115, 20));
|
|
||||||
d->labelWrapped->setTextFormat(Qt::RichText);
|
|
||||||
d->labelWrapped->setScaledContents(true);
|
|
||||||
d->labelWrapped->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
|
|
||||||
d->labelWrapped->setText(tr("Search wrapped"));
|
|
||||||
hboxLayout->addWidget(d->labelWrapped);
|
|
||||||
|
|
||||||
QSpacerItem *spacerItem = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
|
|
||||||
hboxLayout->addItem(spacerItem);
|
|
||||||
setMinimumWidth(minimumSizeHint().width());
|
|
||||||
d->labelWrapped->hide();
|
|
||||||
|
|
||||||
d->_q_updateButtons();
|
|
||||||
|
|
||||||
setFocusProxy(d->editFind);
|
|
||||||
QObject::connect(d->toolClose, SIGNAL(clicked()), this, SLOT(hide()));
|
|
||||||
QObject::connect(d->editFind, SIGNAL(textChanged(QString)),
|
|
||||||
this, SLOT(_q_onTextChanged(QString)));
|
|
||||||
QObject::connect(d->toolNext, SIGNAL(clicked()), this, SLOT(_q_next()));
|
|
||||||
QObject::connect(d->toolPrevious, SIGNAL(clicked()), this, SLOT(_q_previous()));
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeFinderWidget::~QScriptDebuggerCodeFinderWidget()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCodeFinderWidget::findOptions() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCodeFinderWidget);
|
|
||||||
return d->findOptions();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScriptDebuggerCodeFinderWidget::text() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCodeFinderWidget);
|
|
||||||
return d->editFind->text();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeFinderWidget::setText(const QString &text)
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCodeFinderWidget);
|
|
||||||
d->editFind->setText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeFinderWidget::setOK(bool ok)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeFinderWidget);
|
|
||||||
QPalette p = d->editFind->palette();
|
|
||||||
QColor c;
|
|
||||||
if (ok)
|
|
||||||
c = Qt::white;
|
|
||||||
else
|
|
||||||
c = QColor(255, 102, 102);
|
|
||||||
p.setColor(QPalette::Active, QPalette::Base, c);
|
|
||||||
d->editFind->setPalette(p);
|
|
||||||
if (!ok)
|
|
||||||
d->labelWrapped->hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeFinderWidget::setWrapped(bool wrapped)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeFinderWidget);
|
|
||||||
d->labelWrapped->setVisible(wrapped);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeFinderWidget::keyPressEvent(QKeyEvent *e)
|
|
||||||
{
|
|
||||||
if (e->key() == Qt::Key_Escape)
|
|
||||||
hide();
|
|
||||||
else
|
|
||||||
QScriptDebuggerCodeFinderWidgetInterface::keyPressEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#include "moc_qscriptdebuggercodefinderwidget_p.h"
|
|
|
@ -1,72 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCODEFINDERWIDGET_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCODEFINDERWIDGET_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qscriptdebuggercodefinderwidgetinterface_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeFinderWidgetPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerCodeFinderWidget:
|
|
||||||
public QScriptDebuggerCodeFinderWidgetInterface
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCodeFinderWidget(QWidget *parent = nullptr);
|
|
||||||
~QScriptDebuggerCodeFinderWidget();
|
|
||||||
|
|
||||||
int findOptions() const;
|
|
||||||
|
|
||||||
QString text() const;
|
|
||||||
void setText(const QString &text);
|
|
||||||
|
|
||||||
void setOK(bool ok);
|
|
||||||
void setWrapped(bool wrapped);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void keyPressEvent(QKeyEvent *e);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerCodeFinderWidget)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerCodeFinderWidget)
|
|
||||||
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_updateButtons())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onTextChanged(const QString &))
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_next())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_previous())
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,47 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggercodefinderwidgetinterface_p.h"
|
|
||||||
#include "qscriptdebuggercodefinderwidgetinterface_p_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
QScriptDebuggerCodeFinderWidgetInterfacePrivate::QScriptDebuggerCodeFinderWidgetInterfacePrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeFinderWidgetInterfacePrivate::~QScriptDebuggerCodeFinderWidgetInterfacePrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeFinderWidgetInterface::~QScriptDebuggerCodeFinderWidgetInterface()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeFinderWidgetInterface::QScriptDebuggerCodeFinderWidgetInterface(
|
|
||||||
QScriptDebuggerCodeFinderWidgetInterfacePrivate &dd,
|
|
||||||
QWidget *parent, Qt::WindowFlags flags)
|
|
||||||
: QWidget(dd, parent, flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
#include "moc_qscriptdebuggercodefinderwidgetinterface_p.h"
|
|
|
@ -1,73 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCODEFINDERWIDGETINTERFACE_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCODEFINDERWIDGETINTERFACE_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtGui/qwidget.h>
|
|
||||||
|
|
||||||
#include <QtGui/qtextdocument.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeFinderWidgetInterfacePrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerCodeFinderWidgetInterface:
|
|
||||||
public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
~QScriptDebuggerCodeFinderWidgetInterface();
|
|
||||||
|
|
||||||
virtual int findOptions() const = 0;
|
|
||||||
|
|
||||||
virtual QString text() const = 0;
|
|
||||||
virtual void setText(const QString &text) = 0;
|
|
||||||
|
|
||||||
virtual void setOK(bool ok) = 0;
|
|
||||||
virtual void setWrapped(bool wrapped) = 0;
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void findRequest(const QString &exp, int options);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QScriptDebuggerCodeFinderWidgetInterface(
|
|
||||||
QScriptDebuggerCodeFinderWidgetInterfacePrivate &dd,
|
|
||||||
QWidget *parent, Qt::WindowFlags flags);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerCodeFinderWidgetInterface)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerCodeFinderWidgetInterface)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,52 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCODEFINDERWIDGETINTERFACE_P_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCODEFINDERWIDGETINTERFACE_P_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qwidget_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeFinderWidgetInterface;
|
|
||||||
class QScriptDebuggerCodeFinderWidgetInterfacePrivate
|
|
||||||
: public QWidgetPrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptDebuggerCodeFinderWidgetInterface)
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCodeFinderWidgetInterfacePrivate();
|
|
||||||
~QScriptDebuggerCodeFinderWidgetInterfacePrivate();
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,231 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggercodeview_p.h"
|
|
||||||
#include "qscriptdebuggercodeviewinterface_p_p.h"
|
|
||||||
#include "qscripttoolscommon_p.h"
|
|
||||||
|
|
||||||
#include "qscriptedit_p.h"
|
|
||||||
|
|
||||||
#include <QtGui/qboxlayout.h>
|
|
||||||
#include <QtGui/qtextobject.h>
|
|
||||||
#include <QtCore/qdebug.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeViewPrivate
|
|
||||||
: public QScriptDebuggerCodeViewInterfacePrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptDebuggerCodeView)
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCodeViewPrivate();
|
|
||||||
~QScriptDebuggerCodeViewPrivate();
|
|
||||||
|
|
||||||
QScriptEdit *editor;
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptDebuggerCodeViewPrivate::QScriptDebuggerCodeViewPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeViewPrivate::~QScriptDebuggerCodeViewPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeView::QScriptDebuggerCodeView(QWidget *parent)
|
|
||||||
: QScriptDebuggerCodeViewInterface(*new QScriptDebuggerCodeViewPrivate, parent, 0)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeView);
|
|
||||||
d->editor = new QScriptEdit();
|
|
||||||
d->editor->setReadOnly(true);
|
|
||||||
d->editor->setBackgroundVisible(false);
|
|
||||||
QObject::connect(d->editor, SIGNAL(breakpointToggleRequest(int,bool)),
|
|
||||||
this, SIGNAL(breakpointToggleRequest(int,bool)));
|
|
||||||
QObject::connect(d->editor, SIGNAL(breakpointEnableRequest(int,bool)),
|
|
||||||
this, SIGNAL(breakpointEnableRequest(int,bool)));
|
|
||||||
QVBoxLayout *vbox = new QVBoxLayout(this);
|
|
||||||
vbox->setMargin(0);
|
|
||||||
vbox->addWidget(d->editor);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeView::~QScriptDebuggerCodeView()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScriptDebuggerCodeView::text() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCodeView);
|
|
||||||
return d->editor->toPlainText();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeView::setText(const QString &text)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeView);
|
|
||||||
d->editor->setPlainText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCodeView::cursorLineNumber() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCodeView);
|
|
||||||
return d->editor->currentLineNumber();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeView::gotoLine(int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeView);
|
|
||||||
d->editor->gotoLine(lineNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCodeView::find(const QString &exp, int options)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeView);
|
|
||||||
QPlainTextEdit *ed = (QPlainTextEdit*)d->editor;
|
|
||||||
QTextCursor cursor = ed->textCursor();
|
|
||||||
if (options & 0x100) {
|
|
||||||
// start searching from the beginning of selection
|
|
||||||
if (cursor.hasSelection()) {
|
|
||||||
int len = cursor.selectedText().length();
|
|
||||||
cursor.clearSelection();
|
|
||||||
cursor.setPosition(cursor.position() - len);
|
|
||||||
ed->setTextCursor(cursor);
|
|
||||||
}
|
|
||||||
options &= ~0x100;
|
|
||||||
}
|
|
||||||
int ret = 0;
|
|
||||||
if (ed->find(exp, QTextDocument::FindFlags(options))) {
|
|
||||||
ret |= 0x1;
|
|
||||||
} else {
|
|
||||||
QTextCursor curse = cursor;
|
|
||||||
curse.movePosition(QTextCursor::Start);
|
|
||||||
ed->setTextCursor(curse);
|
|
||||||
if (ed->find(exp, QTextDocument::FindFlags(options)))
|
|
||||||
ret |= 0x1 | 0x2;
|
|
||||||
else
|
|
||||||
ed->setTextCursor(cursor);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeView::setExecutionLineNumber(int lineNumber, bool error)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeView);
|
|
||||||
d->editor->setExecutionLineNumber(lineNumber, error);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeView::setExecutableLineNumbers(const QSet<int> &lineNumbers)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeView);
|
|
||||||
d->editor->setExecutableLineNumbers(lineNumbers);
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCodeView::baseLineNumber() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCodeView);
|
|
||||||
return d->editor->baseLineNumber();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeView::setBaseLineNumber(int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeView);
|
|
||||||
d->editor->setBaseLineNumber(lineNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeView::setBreakpoint(int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeView);
|
|
||||||
d->editor->setBreakpoint(lineNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeView::deleteBreakpoint(int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeView);
|
|
||||||
d->editor->deleteBreakpoint(lineNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeView::setBreakpointEnabled(int lineNumber, bool enable)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeView);
|
|
||||||
d->editor->setBreakpointEnabled(lineNumber, enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
bool QScriptDebuggerCodeView::event(QEvent *e)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeView);
|
|
||||||
if (e->type() == QEvent::ToolTip) {
|
|
||||||
if (d->editor->executionLineNumber() == -1)
|
|
||||||
return false;
|
|
||||||
QHelpEvent *he = static_cast<QHelpEvent*>(e);
|
|
||||||
QPoint pt = he->pos();
|
|
||||||
pt.rx() -= d->editor->extraAreaWidth();
|
|
||||||
pt.ry() -= 8;
|
|
||||||
QTextCursor cursor = d->editor->cursorForPosition(pt);
|
|
||||||
QTextBlock block = cursor.block();
|
|
||||||
QString contents = block.text();
|
|
||||||
if (contents.isEmpty())
|
|
||||||
return false;
|
|
||||||
int linePosition = cursor.position() - block.position();
|
|
||||||
if (linePosition < 0)
|
|
||||||
linePosition = 0;
|
|
||||||
|
|
||||||
// ### generalize -- same as in completiontask
|
|
||||||
|
|
||||||
int pos = linePosition;
|
|
||||||
if ((pos > 0) && contents.at(pos-1).isNumber()) {
|
|
||||||
// tooltips for numbers is pointless
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((pos > 0) && isIdentChar(contents.at(pos-1)))
|
|
||||||
--pos;
|
|
||||||
if ((pos > 0) && ((contents.at(pos-1) == QLatin1Char('\''))
|
|
||||||
|| (contents.at(pos-1) == QLatin1Char('\"')))) {
|
|
||||||
// ignore string literals
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int pos2 = linePosition - 1;
|
|
||||||
while ((pos2+1 < contents.size()) && isIdentChar(contents.at(pos2+1)))
|
|
||||||
++pos2;
|
|
||||||
QString ident = contents.mid(pos, pos2 - pos + 1);
|
|
||||||
|
|
||||||
QStringList path;
|
|
||||||
path.append(ident);
|
|
||||||
while ((pos > 0) && (contents.at(pos-1) == QLatin1Char('.'))) {
|
|
||||||
--pos;
|
|
||||||
pos2 = pos;
|
|
||||||
while ((pos > 0) && isIdentChar(contents.at(pos-1)))
|
|
||||||
--pos;
|
|
||||||
path.prepend(contents.mid(pos, pos2 - pos));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!path.isEmpty()) {
|
|
||||||
int lineNumber = cursor.blockNumber() + d->editor->baseLineNumber();
|
|
||||||
emit toolTipRequest(he->globalPos(), lineNumber, path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#include "moc_qscriptdebuggercodeview_p.h"
|
|
|
@ -1,76 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCODEVIEW_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCODEVIEW_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qscriptdebuggercodeviewinterface_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeViewPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerCodeView:
|
|
||||||
public QScriptDebuggerCodeViewInterface
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCodeView(QWidget *parent = nullptr);
|
|
||||||
~QScriptDebuggerCodeView();
|
|
||||||
|
|
||||||
QString text() const;
|
|
||||||
void setText(const QString &text);
|
|
||||||
|
|
||||||
int cursorLineNumber() const;
|
|
||||||
void gotoLine(int lineNumber);
|
|
||||||
|
|
||||||
int find(const QString &exp, int options = 0);
|
|
||||||
|
|
||||||
void setExecutionLineNumber(int lineNumber, bool error);
|
|
||||||
void setExecutableLineNumbers(const QSet<int> &lineNumbers);
|
|
||||||
|
|
||||||
int baseLineNumber() const;
|
|
||||||
void setBaseLineNumber(int lineNumber);
|
|
||||||
|
|
||||||
void setBreakpoint(int lineNumber);
|
|
||||||
void deleteBreakpoint(int lineNumber);
|
|
||||||
void setBreakpointEnabled(int lineNumber, bool enable);
|
|
||||||
|
|
||||||
bool event(QEvent *e);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerCodeView)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerCodeView)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,47 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggercodeviewinterface_p.h"
|
|
||||||
#include "qscriptdebuggercodeviewinterface_p_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
QScriptDebuggerCodeViewInterfacePrivate::QScriptDebuggerCodeViewInterfacePrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeViewInterfacePrivate::~QScriptDebuggerCodeViewInterfacePrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeViewInterface::~QScriptDebuggerCodeViewInterface()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeViewInterface::QScriptDebuggerCodeViewInterface(
|
|
||||||
QScriptDebuggerCodeViewInterfacePrivate &dd,
|
|
||||||
QWidget *parent, Qt::WindowFlags flags)
|
|
||||||
: QWidget(dd, parent, flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
#include "moc_qscriptdebuggercodeviewinterface_p.h"
|
|
|
@ -1,86 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCODEVIEWINTERFACE_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCODEVIEWINTERFACE_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtGui/qwidget.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QPoint;
|
|
||||||
class QStringList;
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeViewInterfacePrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerCodeViewInterface:
|
|
||||||
public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
~QScriptDebuggerCodeViewInterface();
|
|
||||||
|
|
||||||
virtual QString text() const = 0;
|
|
||||||
virtual void setText(const QString &text) = 0;
|
|
||||||
|
|
||||||
virtual int cursorLineNumber() const = 0;
|
|
||||||
virtual void gotoLine(int lineNumber) = 0;
|
|
||||||
|
|
||||||
virtual int find(const QString &exp, int options = 0) = 0;
|
|
||||||
|
|
||||||
virtual void setExecutionLineNumber(int lineNumber, bool error) = 0;
|
|
||||||
virtual void setExecutableLineNumbers(const QSet<int> &lineNumbers) = 0;
|
|
||||||
|
|
||||||
virtual int baseLineNumber() const = 0;
|
|
||||||
virtual void setBaseLineNumber(int lineNumber) = 0;
|
|
||||||
|
|
||||||
virtual void setBreakpoint(int lineNumber) = 0;
|
|
||||||
virtual void deleteBreakpoint(int lineNumber) = 0;
|
|
||||||
virtual void setBreakpointEnabled(int lineNumber, bool enable) = 0;
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void breakpointToggleRequest(int lineNumber, bool on);
|
|
||||||
void breakpointEnableRequest(int lineNumber, bool enable);
|
|
||||||
void toolTipRequest(const QPoint &pos, int lineNumber, const QStringList &path);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QScriptDebuggerCodeViewInterface(
|
|
||||||
QScriptDebuggerCodeViewInterfacePrivate &dd,
|
|
||||||
QWidget *parent, Qt::WindowFlags flags);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerCodeViewInterface)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerCodeViewInterface)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,52 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCODEVIEWINTERFACE_P_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCODEVIEWINTERFACE_P_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qwidget_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeViewInterface;
|
|
||||||
class QScriptDebuggerCodeViewInterfacePrivate
|
|
||||||
: public QWidgetPrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptDebuggerCodeViewInterface)
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCodeViewInterfacePrivate();
|
|
||||||
~QScriptDebuggerCodeViewInterfacePrivate();
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,285 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggercodewidget_p.h"
|
|
||||||
#include "qscriptdebuggercodewidgetinterface_p_p.h"
|
|
||||||
#include "qscriptdebuggercodeview_p.h"
|
|
||||||
#include "qscriptdebuggerscriptsmodel_p.h"
|
|
||||||
#include "qscriptbreakpointsmodel_p.h"
|
|
||||||
#include "qscripttooltipproviderinterface_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qdebug.h>
|
|
||||||
#include <QtGui/qboxlayout.h>
|
|
||||||
#include <QtGui/qstackedwidget.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeWidgetPrivate
|
|
||||||
: public QScriptDebuggerCodeWidgetInterfacePrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptDebuggerCodeWidget)
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCodeWidgetPrivate();
|
|
||||||
~QScriptDebuggerCodeWidgetPrivate();
|
|
||||||
|
|
||||||
qint64 scriptId(QScriptDebuggerCodeViewInterface *view) const;
|
|
||||||
|
|
||||||
// private slots
|
|
||||||
void _q_onBreakpointToggleRequest(int lineNumber, bool on);
|
|
||||||
void _q_onBreakpointEnableRequest(int lineNumber, bool enable);
|
|
||||||
void _q_onBreakpointsAboutToBeRemoved(const QModelIndex&, int, int);
|
|
||||||
void _q_onBreakpointsInserted(const QModelIndex&, int, int);
|
|
||||||
void _q_onBreakpointsDataChanged(const QModelIndex &, const QModelIndex &);
|
|
||||||
void _q_onScriptsChanged();
|
|
||||||
void _q_onToolTipRequest(const QPoint &pos, int lineNumber, const QStringList &path);
|
|
||||||
|
|
||||||
QScriptDebuggerScriptsModel *scriptsModel;
|
|
||||||
QStackedWidget *viewStack;
|
|
||||||
QHash<qint64, QScriptDebuggerCodeViewInterface*> viewHash;
|
|
||||||
QScriptBreakpointsModel *breakpointsModel;
|
|
||||||
QScriptToolTipProviderInterface *toolTipProvider;
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptDebuggerCodeWidgetPrivate::QScriptDebuggerCodeWidgetPrivate()
|
|
||||||
{
|
|
||||||
scriptsModel = 0;
|
|
||||||
breakpointsModel = 0;
|
|
||||||
toolTipProvider = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeWidgetPrivate::~QScriptDebuggerCodeWidgetPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
qint64 QScriptDebuggerCodeWidgetPrivate::scriptId(QScriptDebuggerCodeViewInterface *view) const
|
|
||||||
{
|
|
||||||
if (!view)
|
|
||||||
return -1;
|
|
||||||
return viewHash.key(view);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidgetPrivate::_q_onBreakpointToggleRequest(int lineNumber, bool on)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCodeViewInterface *view = qobject_cast<QScriptDebuggerCodeViewInterface*>(q_func()->sender());
|
|
||||||
qint64 sid = scriptId(view);
|
|
||||||
Q_ASSERT(sid != -1);
|
|
||||||
if (on) {
|
|
||||||
QScriptBreakpointData data(sid, lineNumber);
|
|
||||||
data.setFileName(scriptsModel->scriptData(sid).fileName());
|
|
||||||
breakpointsModel->setBreakpoint(data);
|
|
||||||
} else {
|
|
||||||
int bpid = breakpointsModel->resolveBreakpoint(sid, lineNumber);
|
|
||||||
if (bpid == -1)
|
|
||||||
bpid = breakpointsModel->resolveBreakpoint(scriptsModel->scriptData(sid).fileName(), lineNumber);
|
|
||||||
Q_ASSERT(bpid != -1);
|
|
||||||
breakpointsModel->deleteBreakpoint(bpid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidgetPrivate::_q_onBreakpointEnableRequest(int lineNumber, bool enable)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCodeViewInterface *view = qobject_cast<QScriptDebuggerCodeViewInterface*>(q_func()->sender());
|
|
||||||
qint64 sid = scriptId(view);
|
|
||||||
int bpid = breakpointsModel->resolveBreakpoint(sid, lineNumber);
|
|
||||||
if (bpid == -1)
|
|
||||||
bpid = breakpointsModel->resolveBreakpoint(scriptsModel->scriptData(sid).fileName(), lineNumber);
|
|
||||||
Q_ASSERT(bpid != -1);
|
|
||||||
QScriptBreakpointData data = breakpointsModel->breakpointData(bpid);
|
|
||||||
data.setEnabled(enable);
|
|
||||||
breakpointsModel->setBreakpointData(bpid, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidgetPrivate::_q_onBreakpointsAboutToBeRemoved(
|
|
||||||
const QModelIndex &, int first, int last)
|
|
||||||
{
|
|
||||||
for (int i = first; i <= last; ++i) {
|
|
||||||
QScriptBreakpointData data = breakpointsModel->breakpointDataAt(i);
|
|
||||||
qint64 scriptId = data.scriptId();
|
|
||||||
if (scriptId == -1) {
|
|
||||||
scriptId = scriptsModel->resolveScript(data.fileName());
|
|
||||||
if (scriptId == -1)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
QScriptDebuggerCodeViewInterface *view = viewHash.value(scriptId);
|
|
||||||
if (!view)
|
|
||||||
continue;
|
|
||||||
view->deleteBreakpoint(data.lineNumber());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidgetPrivate::_q_onBreakpointsInserted(
|
|
||||||
const QModelIndex &, int first, int last)
|
|
||||||
{
|
|
||||||
for (int i = first; i <= last; ++i) {
|
|
||||||
QScriptBreakpointData data = breakpointsModel->breakpointDataAt(i);
|
|
||||||
qint64 scriptId = data.scriptId();
|
|
||||||
if (scriptId == -1) {
|
|
||||||
scriptId = scriptsModel->resolveScript(data.fileName());
|
|
||||||
if (scriptId == -1)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
QScriptDebuggerCodeViewInterface *view = viewHash.value(scriptId);
|
|
||||||
if (!view)
|
|
||||||
continue;
|
|
||||||
view->setBreakpoint(data.lineNumber());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidgetPrivate::_q_onBreakpointsDataChanged(
|
|
||||||
const QModelIndex &tl, const QModelIndex &br)
|
|
||||||
{
|
|
||||||
for (int i = tl.row(); i <= br.row(); ++i) {
|
|
||||||
QScriptBreakpointData data = breakpointsModel->breakpointDataAt(i);
|
|
||||||
qint64 scriptId = data.scriptId();
|
|
||||||
if (scriptId == -1) {
|
|
||||||
scriptId = scriptsModel->resolveScript(data.fileName());
|
|
||||||
if (scriptId == -1)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
QScriptDebuggerCodeViewInterface *view = viewHash.value(scriptId);
|
|
||||||
if (!view)
|
|
||||||
continue;
|
|
||||||
view->setBreakpointEnabled(data.lineNumber(), data.isEnabled());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidgetPrivate::_q_onScriptsChanged()
|
|
||||||
{
|
|
||||||
// kill editors for scripts that have been removed
|
|
||||||
QHash<qint64, QScriptDebuggerCodeViewInterface*>::iterator it;
|
|
||||||
for (it = viewHash.begin(); it != viewHash.end(); ) {
|
|
||||||
if (!scriptsModel->scriptData(it.key()).isValid()) {
|
|
||||||
it = viewHash.erase(it);
|
|
||||||
} else
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidgetPrivate::_q_onToolTipRequest(
|
|
||||||
const QPoint &pos, int lineNumber, const QStringList &path)
|
|
||||||
{
|
|
||||||
toolTipProvider->showToolTip(pos, /*frameIndex=*/-1, lineNumber, path);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeWidget::QScriptDebuggerCodeWidget(QWidget *parent)
|
|
||||||
: QScriptDebuggerCodeWidgetInterface(*new QScriptDebuggerCodeWidgetPrivate, parent, 0)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeWidget);
|
|
||||||
QVBoxLayout *vbox = new QVBoxLayout(this);
|
|
||||||
vbox->setMargin(0);
|
|
||||||
d->viewStack = new QStackedWidget();
|
|
||||||
vbox->addWidget(d->viewStack);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeWidget::~QScriptDebuggerCodeWidget()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerScriptsModel *QScriptDebuggerCodeWidget::scriptsModel() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCodeWidget);
|
|
||||||
return d->scriptsModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidget::setScriptsModel(QScriptDebuggerScriptsModel *model)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeWidget);
|
|
||||||
d->scriptsModel = model;
|
|
||||||
QObject::connect(model, SIGNAL(layoutChanged()),
|
|
||||||
this, SLOT(_q_onScriptsChanged()));
|
|
||||||
}
|
|
||||||
|
|
||||||
qint64 QScriptDebuggerCodeWidget::currentScriptId() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCodeWidget);
|
|
||||||
return d->scriptId(currentView());
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidget::setCurrentScript(qint64 scriptId)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeWidget);
|
|
||||||
if (scriptId == -1) {
|
|
||||||
// ### show "native script"
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QScriptDebuggerCodeViewInterface *view = d->viewHash.value(scriptId);
|
|
||||||
if (!view) {
|
|
||||||
Q_ASSERT(d->scriptsModel != 0);
|
|
||||||
QScriptScriptData data = d->scriptsModel->scriptData(scriptId);
|
|
||||||
if (!data.isValid())
|
|
||||||
return;
|
|
||||||
view = new QScriptDebuggerCodeView(); // ### use factory, so user can provide his own view
|
|
||||||
view->setBaseLineNumber(data.baseLineNumber());
|
|
||||||
view->setText(data.contents());
|
|
||||||
view->setExecutableLineNumbers(d->scriptsModel->executableLineNumbers(scriptId));
|
|
||||||
QObject::connect(view, SIGNAL(breakpointToggleRequest(int,bool)),
|
|
||||||
this, SLOT(_q_onBreakpointToggleRequest(int,bool)));
|
|
||||||
QObject::connect(view, SIGNAL(breakpointEnableRequest(int,bool)),
|
|
||||||
this, SLOT(_q_onBreakpointEnableRequest(int,bool)));
|
|
||||||
QObject::connect(view, SIGNAL(toolTipRequest(QPoint,int,QStringList)),
|
|
||||||
this, SLOT(_q_onToolTipRequest(QPoint,int,QStringList)));
|
|
||||||
d->viewStack->addWidget(view);
|
|
||||||
d->viewHash.insert(scriptId, view);
|
|
||||||
}
|
|
||||||
d->viewStack->setCurrentWidget(view);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidget::invalidateExecutionLineNumbers()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeWidget);
|
|
||||||
QHash<qint64, QScriptDebuggerCodeViewInterface*>::const_iterator it;
|
|
||||||
for (it = d->viewHash.constBegin(); it != d->viewHash.constEnd(); ++it)
|
|
||||||
it.value()->setExecutionLineNumber(-1, /*error=*/false);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointsModel *QScriptDebuggerCodeWidget::breakpointsModel() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCodeWidget);
|
|
||||||
return d->breakpointsModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidget::setBreakpointsModel(QScriptBreakpointsModel *model)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeWidget);
|
|
||||||
d->breakpointsModel = model;
|
|
||||||
QObject::connect(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
|
|
||||||
this, SLOT(_q_onBreakpointsAboutToBeRemoved(QModelIndex,int,int)));
|
|
||||||
QObject::connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
|
|
||||||
this, SLOT(_q_onBreakpointsInserted(QModelIndex,int,int)));
|
|
||||||
QObject::connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
|
|
||||||
this, SLOT(_q_onBreakpointsDataChanged(QModelIndex,QModelIndex)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCodeWidget::setToolTipProvider(QScriptToolTipProviderInterface *toolTipProvider)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCodeWidget);
|
|
||||||
d->toolTipProvider = toolTipProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeViewInterface *QScriptDebuggerCodeWidget::currentView() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCodeWidget);
|
|
||||||
return qobject_cast<QScriptDebuggerCodeViewInterface*>(d->viewStack->currentWidget());
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#include "moc_qscriptdebuggercodewidget_p.h"
|
|
|
@ -1,79 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCODEWIDGET_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCODEWIDGET_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qscriptdebuggercodewidgetinterface_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeWidgetPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerCodeWidget:
|
|
||||||
public QScriptDebuggerCodeWidgetInterface
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCodeWidget(QWidget *parent = nullptr);
|
|
||||||
~QScriptDebuggerCodeWidget();
|
|
||||||
|
|
||||||
QScriptDebuggerScriptsModel *scriptsModel() const;
|
|
||||||
void setScriptsModel(QScriptDebuggerScriptsModel *model);
|
|
||||||
|
|
||||||
void setToolTipProvider(QScriptToolTipProviderInterface *toolTipProvider);
|
|
||||||
|
|
||||||
qint64 currentScriptId() const;
|
|
||||||
void setCurrentScript(qint64 scriptId);
|
|
||||||
|
|
||||||
void invalidateExecutionLineNumbers();
|
|
||||||
|
|
||||||
QScriptBreakpointsModel *breakpointsModel() const;
|
|
||||||
void setBreakpointsModel(QScriptBreakpointsModel *model);
|
|
||||||
|
|
||||||
QScriptDebuggerCodeViewInterface *currentView() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerCodeWidget)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerCodeWidget)
|
|
||||||
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onBreakpointToggleRequest(int,bool))
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onBreakpointEnableRequest(int,bool))
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onBreakpointsAboutToBeRemoved(const QModelIndex &,int,int))
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onBreakpointsInserted(const QModelIndex &,int,int))
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onBreakpointsDataChanged(const QModelIndex &, const QModelIndex &))
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onScriptsChanged())
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_onToolTipRequest(const QPoint &, int, const QStringList &))
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,47 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggercodewidgetinterface_p.h"
|
|
||||||
#include "qscriptdebuggercodewidgetinterface_p_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
QScriptDebuggerCodeWidgetInterfacePrivate::QScriptDebuggerCodeWidgetInterfacePrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeWidgetInterfacePrivate::~QScriptDebuggerCodeWidgetInterfacePrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeWidgetInterface::~QScriptDebuggerCodeWidgetInterface()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCodeWidgetInterface::QScriptDebuggerCodeWidgetInterface(
|
|
||||||
QScriptDebuggerCodeWidgetInterfacePrivate &dd,
|
|
||||||
QWidget *parent, Qt::WindowFlags flags)
|
|
||||||
: QWidget(dd, parent, flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
#include "moc_qscriptdebuggercodewidgetinterface_p.h"
|
|
|
@ -1,81 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCODEWIDGETINTERFACE_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCODEWIDGETINTERFACE_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtGui/qwidget.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerScriptsModel;
|
|
||||||
class QScriptBreakpointsModel;
|
|
||||||
class QScriptToolTipProviderInterface;
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeViewInterface;
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeWidgetInterfacePrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerCodeWidgetInterface:
|
|
||||||
public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
~QScriptDebuggerCodeWidgetInterface();
|
|
||||||
|
|
||||||
virtual QScriptDebuggerScriptsModel *scriptsModel() const = 0;
|
|
||||||
virtual void setScriptsModel(QScriptDebuggerScriptsModel *model) = 0;
|
|
||||||
|
|
||||||
virtual QScriptBreakpointsModel *breakpointsModel() const = 0;
|
|
||||||
virtual void setBreakpointsModel(QScriptBreakpointsModel *model) = 0;
|
|
||||||
|
|
||||||
virtual void setToolTipProvider(QScriptToolTipProviderInterface *toolTipProvider) = 0;
|
|
||||||
|
|
||||||
virtual qint64 currentScriptId() const = 0;
|
|
||||||
virtual void setCurrentScript(qint64 scriptId) = 0;
|
|
||||||
|
|
||||||
virtual void invalidateExecutionLineNumbers() = 0;
|
|
||||||
|
|
||||||
virtual QScriptDebuggerCodeViewInterface *currentView() const = 0;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QScriptDebuggerCodeWidgetInterface(
|
|
||||||
QScriptDebuggerCodeWidgetInterfacePrivate &dd,
|
|
||||||
QWidget *parent, Qt::WindowFlags flags);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerCodeWidgetInterface)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerCodeWidgetInterface)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,52 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCODEWIDGETINTERFACE_P_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCODEWIDGETINTERFACE_P_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qwidget_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCodeWidgetInterface;
|
|
||||||
class QScriptDebuggerCodeWidgetInterfacePrivate
|
|
||||||
: public QWidgetPrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptDebuggerCodeWidgetInterface)
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCodeWidgetInterfacePrivate();
|
|
||||||
~QScriptDebuggerCodeWidgetInterfacePrivate();
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,687 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggercommand_p.h"
|
|
||||||
#include "qscriptbreakpointdata_p.h"
|
|
||||||
#include "qscriptdebuggervalue_p.h"
|
|
||||||
#include "qscripttoolscommon_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qhash.h>
|
|
||||||
#include <QtCore/qdatastream.h>
|
|
||||||
#include <QtCore/qstringlist.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\since 4.5
|
|
||||||
\class QScriptDebuggerCommand
|
|
||||||
\internal
|
|
||||||
|
|
||||||
\brief The QScriptDebuggerCommand class represents a command issued to a QScriptDebuggerFrontend.
|
|
||||||
|
|
||||||
A debugger command is described by a command type and zero or more
|
|
||||||
attributes. Such commands are generated internally by the
|
|
||||||
QScriptDebuggerFrontend class (through the scheduleXXX commands). A
|
|
||||||
command is typically passed on to a QScriptDebuggerCommandExecutor
|
|
||||||
that applies the command to a QScriptDebuggerBackend.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class QScriptDebuggerCommandPrivate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCommandPrivate();
|
|
||||||
~QScriptDebuggerCommandPrivate();
|
|
||||||
|
|
||||||
QScriptDebuggerCommand::Type type;
|
|
||||||
QHash<QScriptDebuggerCommand::Attribute, QVariant> attributes;
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptDebuggerCommandPrivate::QScriptDebuggerCommandPrivate()
|
|
||||||
: type(QScriptDebuggerCommand::None)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommandPrivate::~QScriptDebuggerCommandPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs a QScriptDebuggerCommand of type None.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerCommand::QScriptDebuggerCommand()
|
|
||||||
: d_ptr(new QScriptDebuggerCommandPrivate)
|
|
||||||
{
|
|
||||||
d_ptr->type = None;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs a QScriptDebuggerCommand of the given \a type, with no
|
|
||||||
attributes defined.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerCommand::QScriptDebuggerCommand(Type type)
|
|
||||||
: d_ptr(new QScriptDebuggerCommandPrivate)
|
|
||||||
{
|
|
||||||
d_ptr->type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs a QScriptDebuggerCommand that is a copy of the \a other
|
|
||||||
command.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerCommand::QScriptDebuggerCommand(const QScriptDebuggerCommand &other)
|
|
||||||
: d_ptr(new QScriptDebuggerCommandPrivate)
|
|
||||||
{
|
|
||||||
*d_ptr = *other.d_ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Destroys this QScriptDebuggerCommand.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerCommand::~QScriptDebuggerCommand()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Assigns the \a other value to this QScriptDebuggerCommand.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerCommand &QScriptDebuggerCommand::operator=(const QScriptDebuggerCommand &other)
|
|
||||||
{
|
|
||||||
*d_ptr = *other.d_ptr;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the type of this command.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerCommand::Type QScriptDebuggerCommand::type() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the value of the given \a attribute, or \a defaultValue
|
|
||||||
if the attribute is not defined.
|
|
||||||
*/
|
|
||||||
QVariant QScriptDebuggerCommand::attribute(Attribute attribute,
|
|
||||||
const QVariant &defaultValue) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->attributes.value(attribute, defaultValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the \a value of the given \a attribute.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerCommand::setAttribute(Attribute attribute,
|
|
||||||
const QVariant &value)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
if (!value.isValid())
|
|
||||||
d->attributes.remove(attribute);
|
|
||||||
else
|
|
||||||
d->attributes[attribute] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
QHash<QScriptDebuggerCommand::Attribute, QVariant> QScriptDebuggerCommand::attributes() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->attributes;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the FileName attribute of this command converted to a string.
|
|
||||||
This function is provided for convenience.
|
|
||||||
|
|
||||||
\sa attribute()
|
|
||||||
*/
|
|
||||||
QString QScriptDebuggerCommand::fileName() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->attributes.value(FileName).toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setFileName(const QString &fileName)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[FileName] = fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the LineNumber attribute of this command converted to an int.
|
|
||||||
This function is provided for convenience.
|
|
||||||
|
|
||||||
\sa attribute()
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerCommand::lineNumber() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->attributes.value(LineNumber, -1).toInt();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setLineNumber(int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[LineNumber] = lineNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the ScriptID attribute of this command converted to a qint64.
|
|
||||||
This function is provided for convenience.
|
|
||||||
|
|
||||||
\sa attribute()
|
|
||||||
*/
|
|
||||||
qint64 QScriptDebuggerCommand::scriptId() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->attributes.value(ScriptID, -1).toLongLong();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setScriptId(qint64 id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[ScriptID] = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScriptDebuggerCommand::program() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->attributes.value(Program).toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setProgram(const QString &program)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[Program] = program;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommand::breakpointId() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->attributes.value(BreakpointID, -1).toInt();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setBreakpointId(int id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[BreakpointID] = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptBreakpointData QScriptDebuggerCommand::breakpointData() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return qvariant_cast<QScriptBreakpointData>(d->attributes.value(BreakpointData));
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setBreakpointData(const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[BreakpointData] = QVariant::fromValue(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerValue QScriptDebuggerCommand::scriptValue() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return qvariant_cast<QScriptDebuggerValue>(d->attributes.value(ScriptValue));
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setScriptValue(const QScriptDebuggerValue &value)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[ScriptValue] = QVariant::fromValue(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommand::contextIndex() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->attributes.value(ContextIndex, -1).toInt();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setContextIndex(int index)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[ContextIndex] = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommand::iteratorId() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->attributes.value(IteratorID, -1).toInt();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setIteratorId(int id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[IteratorID] = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScriptDebuggerCommand::name() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->attributes.value(Name).toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setName(const QString &name)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[Name] = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerValue QScriptDebuggerCommand::subordinateScriptValue() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return qvariant_cast<QScriptDebuggerValue>(d->attributes.value(SubordinateScriptValue));
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setSubordinateScriptValue(const QScriptDebuggerValue &value)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[SubordinateScriptValue] = QVariant::fromValue(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommand::snapshotId() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
return d->attributes.value(SnapshotID, -1).toInt();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerCommand::setSnapshotId(int id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommand);
|
|
||||||
d->attributes[SnapshotID] = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns true if this QScriptDebuggerCommand is equal to the \a other
|
|
||||||
command, otherwise returns false.
|
|
||||||
*/
|
|
||||||
bool QScriptDebuggerCommand::operator==(const QScriptDebuggerCommand &other) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommand);
|
|
||||||
const QScriptDebuggerCommandPrivate *od = other.d_func();
|
|
||||||
if (d == od)
|
|
||||||
return true;
|
|
||||||
if (!d || !od)
|
|
||||||
return false;
|
|
||||||
return ((d->type == od->type)
|
|
||||||
&& (d->attributes == od->attributes));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns true if this QScriptDebuggerCommand is not equal to the \a
|
|
||||||
other command, otherwise returns false.
|
|
||||||
*/
|
|
||||||
bool QScriptDebuggerCommand::operator!=(const QScriptDebuggerCommand &other) const
|
|
||||||
{
|
|
||||||
return !(*this == other);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::interruptCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(Interrupt);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::continueCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(Continue);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::stepIntoCommand(int count)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(StepInto);
|
|
||||||
cmd.setAttribute(StepCount, count);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::stepOverCommand(int count)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(StepOver);
|
|
||||||
cmd.setAttribute(StepCount, count);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::stepOutCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(StepOut);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::runToLocationCommand(const QString &fileName, int lineNumber)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(RunToLocation);
|
|
||||||
cmd.setFileName(fileName);
|
|
||||||
cmd.setLineNumber(lineNumber);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::runToLocationCommand(qint64 scriptId, int lineNumber)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(RunToLocationByID);
|
|
||||||
cmd.setScriptId(scriptId);
|
|
||||||
cmd.setLineNumber(lineNumber);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::forceReturnCommand(int contextIndex, const QScriptDebuggerValue &value)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(ForceReturn);
|
|
||||||
cmd.setContextIndex(contextIndex);
|
|
||||||
cmd.setScriptValue(value);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::resumeCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(Resume);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::setBreakpointCommand(const QString &fileName, int lineNumber)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(SetBreakpoint);
|
|
||||||
cmd.setBreakpointData(QScriptBreakpointData(fileName, lineNumber));
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::setBreakpointCommand(const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(SetBreakpoint);
|
|
||||||
cmd.setBreakpointData(data);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::deleteBreakpointCommand(int id)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(DeleteBreakpoint);
|
|
||||||
cmd.setBreakpointId(id);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::deleteAllBreakpointsCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(DeleteAllBreakpoints);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getBreakpointsCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetBreakpoints);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getBreakpointDataCommand(int id)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetBreakpointData);
|
|
||||||
cmd.setBreakpointId(id);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::setBreakpointDataCommand(int id, const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(SetBreakpointData);
|
|
||||||
cmd.setBreakpointId(id);
|
|
||||||
cmd.setBreakpointData(data);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getScriptsCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetScripts);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getScriptDataCommand(qint64 id)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetScriptData);
|
|
||||||
cmd.setScriptId(id);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::scriptsCheckpointCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(ScriptsCheckpoint);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getScriptsDeltaCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetScriptsDelta);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::resolveScriptCommand(const QString &fileName)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(ResolveScript);
|
|
||||||
cmd.setFileName(fileName);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getBacktraceCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetBacktrace);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getContextCountCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetContextCount);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getContextStateCommand(int contextIndex)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetContextState);
|
|
||||||
cmd.setContextIndex(contextIndex);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getContextInfoCommand(int contextIndex)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetContextInfo);
|
|
||||||
cmd.setContextIndex(contextIndex);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getContextIdCommand(int contextIndex)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetContextID);
|
|
||||||
cmd.setContextIndex(contextIndex);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getThisObjectCommand(int contextIndex)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetThisObject);
|
|
||||||
cmd.setContextIndex(contextIndex);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getActivationObjectCommand(int contextIndex)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetActivationObject);
|
|
||||||
cmd.setContextIndex(contextIndex);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getScopeChainCommand(int contextIndex)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetScopeChain);
|
|
||||||
cmd.setContextIndex(contextIndex);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::contextsCheckpoint()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(ContextsCheckpoint);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getPropertyExpressionValue(
|
|
||||||
int contextIndex, int lineNumber, const QStringList &path)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetPropertyExpressionValue);
|
|
||||||
cmd.setContextIndex(contextIndex);
|
|
||||||
cmd.setLineNumber(lineNumber);
|
|
||||||
cmd.setAttribute(UserAttribute, path);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getCompletions(
|
|
||||||
int contextIndex, const QStringList &path)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(GetCompletions);
|
|
||||||
cmd.setContextIndex(contextIndex);
|
|
||||||
cmd.setAttribute(UserAttribute, path);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::newScriptObjectSnapshotCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(NewScriptObjectSnapshot);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::scriptObjectSnapshotCaptureCommand(int id, const QScriptDebuggerValue &object)
|
|
||||||
{
|
|
||||||
Q_ASSERT(object.type() == QScriptDebuggerValue::ObjectValue);
|
|
||||||
QScriptDebuggerCommand cmd(ScriptObjectSnapshotCapture);
|
|
||||||
cmd.setSnapshotId(id);
|
|
||||||
cmd.setScriptValue(object);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::deleteScriptObjectSnapshotCommand(int id)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(DeleteScriptObjectSnapshot);
|
|
||||||
cmd.setSnapshotId(id);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::newScriptValueIteratorCommand(const QScriptDebuggerValue &object)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(NewScriptValueIterator);
|
|
||||||
Q_ASSERT(object.type() == QScriptDebuggerValue::ObjectValue);
|
|
||||||
cmd.setScriptValue(object);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::getPropertiesByIteratorCommand(int id, int count)
|
|
||||||
{
|
|
||||||
Q_UNUSED(count);
|
|
||||||
QScriptDebuggerCommand cmd(GetPropertiesByIterator);
|
|
||||||
cmd.setIteratorId(id);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::deleteScriptValueIteratorCommand(int id)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(DeleteScriptValueIterator);
|
|
||||||
cmd.setIteratorId(id);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::evaluateCommand(
|
|
||||||
int contextIndex, const QString &program, const QString &fileName, int lineNumber)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(Evaluate);
|
|
||||||
cmd.setContextIndex(contextIndex);
|
|
||||||
cmd.setProgram(program);
|
|
||||||
cmd.setFileName(fileName);
|
|
||||||
cmd.setLineNumber(lineNumber);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::scriptValueToStringCommand(const QScriptDebuggerValue &value)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(ScriptValueToString);
|
|
||||||
cmd.setScriptValue(value);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::setScriptValuePropertyCommand(
|
|
||||||
const QScriptDebuggerValue &object, const QString &name,
|
|
||||||
const QScriptDebuggerValue &value)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(SetScriptValueProperty);
|
|
||||||
cmd.setScriptValue(object);
|
|
||||||
cmd.setName(name);
|
|
||||||
cmd.setSubordinateScriptValue(value);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommand QScriptDebuggerCommand::clearExceptionsCommand()
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommand cmd(ClearExceptions);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn QDataStream &operator<<(QDataStream &stream, const QScriptDebuggerCommand &command)
|
|
||||||
\relates QScriptDebuggerCommand
|
|
||||||
|
|
||||||
Writes the given \a command to the specified \a stream.
|
|
||||||
*/
|
|
||||||
QDataStream &operator<<(QDataStream &out, const QScriptDebuggerCommand &command)
|
|
||||||
{
|
|
||||||
const QScriptDebuggerCommandPrivate *d = command.d_ptr.data();
|
|
||||||
out << (quint32)d->type;
|
|
||||||
out << (qint32)d->attributes.size();
|
|
||||||
QHash<QScriptDebuggerCommand::Attribute, QVariant>::const_iterator it;
|
|
||||||
for (it = d->attributes.constBegin(); it != d->attributes.constEnd(); ++it) {
|
|
||||||
out << (quint32)it.key();
|
|
||||||
out << it.value();
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn QDataStream &operator>>(QDataStream &stream, QScriptDebuggerCommand &command)
|
|
||||||
\relates QScriptDebuggerCommand
|
|
||||||
|
|
||||||
Reads a QScriptDebuggerCommand from the specified \a stream into the
|
|
||||||
given \a command.
|
|
||||||
*/
|
|
||||||
QDataStream &operator>>(QDataStream &in, QScriptDebuggerCommand &command)
|
|
||||||
{
|
|
||||||
QScriptDebuggerCommandPrivate *d = command.d_ptr.data();
|
|
||||||
|
|
||||||
quint32 type;
|
|
||||||
in >> type;
|
|
||||||
d->type = QScriptDebuggerCommand::Type(type);
|
|
||||||
|
|
||||||
qint32 attribCount;
|
|
||||||
in >> attribCount;
|
|
||||||
QHash<QScriptDebuggerCommand::Attribute, QVariant> attribs;
|
|
||||||
for (qint32 i = 0; i < attribCount; ++i) {
|
|
||||||
quint32 key;
|
|
||||||
in >> key;
|
|
||||||
QVariant value;
|
|
||||||
in >> value;
|
|
||||||
attribs[QScriptDebuggerCommand::Attribute(key)] = value;
|
|
||||||
}
|
|
||||||
d->attributes = attribs;
|
|
||||||
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
|
@ -1,248 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCOMMAND_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCOMMAND_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobjectdefs.h>
|
|
||||||
#include <QtCore/qscopedpointer.h>
|
|
||||||
#include <QtCore/qhash.h>
|
|
||||||
#include <QtCore/qvariant.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QDataStream;
|
|
||||||
class QScriptBreakpointData;
|
|
||||||
class QScriptDebuggerValue;
|
|
||||||
|
|
||||||
class QScriptDebuggerCommandPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerCommand
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
friend Q_AUTOTEST_EXPORT QDataStream &operator<<(QDataStream &, const QScriptDebuggerCommand &);
|
|
||||||
friend Q_AUTOTEST_EXPORT QDataStream &operator>>(QDataStream &, QScriptDebuggerCommand &);
|
|
||||||
|
|
||||||
enum Type {
|
|
||||||
None,
|
|
||||||
|
|
||||||
Interrupt,
|
|
||||||
Continue,
|
|
||||||
StepInto,
|
|
||||||
StepOver,
|
|
||||||
StepOut,
|
|
||||||
RunToLocation,
|
|
||||||
RunToLocationByID,
|
|
||||||
ForceReturn,
|
|
||||||
Resume,
|
|
||||||
|
|
||||||
SetBreakpoint,
|
|
||||||
DeleteBreakpoint,
|
|
||||||
DeleteAllBreakpoints,
|
|
||||||
GetBreakpoints,
|
|
||||||
GetBreakpointData,
|
|
||||||
SetBreakpointData,
|
|
||||||
|
|
||||||
GetScripts,
|
|
||||||
GetScriptData,
|
|
||||||
ScriptsCheckpoint,
|
|
||||||
GetScriptsDelta,
|
|
||||||
ResolveScript,
|
|
||||||
|
|
||||||
GetBacktrace,
|
|
||||||
GetContextCount,
|
|
||||||
GetContextInfo,
|
|
||||||
GetContextState,
|
|
||||||
GetContextID,
|
|
||||||
GetThisObject,
|
|
||||||
GetActivationObject,
|
|
||||||
GetScopeChain,
|
|
||||||
ContextsCheckpoint,
|
|
||||||
GetPropertyExpressionValue,
|
|
||||||
GetCompletions,
|
|
||||||
|
|
||||||
NewScriptObjectSnapshot,
|
|
||||||
ScriptObjectSnapshotCapture,
|
|
||||||
DeleteScriptObjectSnapshot,
|
|
||||||
|
|
||||||
NewScriptValueIterator,
|
|
||||||
GetPropertiesByIterator,
|
|
||||||
DeleteScriptValueIterator,
|
|
||||||
|
|
||||||
Evaluate,
|
|
||||||
|
|
||||||
SetScriptValueProperty,
|
|
||||||
ScriptValueToString,
|
|
||||||
|
|
||||||
ClearExceptions,
|
|
||||||
|
|
||||||
UserCommand = 1000,
|
|
||||||
MaxUserCommand = 32767
|
|
||||||
};
|
|
||||||
|
|
||||||
enum Attribute {
|
|
||||||
ScriptID,
|
|
||||||
FileName,
|
|
||||||
LineNumber,
|
|
||||||
Program,
|
|
||||||
BreakpointID,
|
|
||||||
BreakpointData,
|
|
||||||
ContextIndex,
|
|
||||||
ScriptValue,
|
|
||||||
StepCount,
|
|
||||||
IteratorID,
|
|
||||||
Name,
|
|
||||||
SubordinateScriptValue,
|
|
||||||
SnapshotID,
|
|
||||||
UserAttribute = 1000,
|
|
||||||
MaxUserAttribute = 32767
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptDebuggerCommand();
|
|
||||||
QScriptDebuggerCommand(Type type);
|
|
||||||
QScriptDebuggerCommand(const QScriptDebuggerCommand &other);
|
|
||||||
~QScriptDebuggerCommand();
|
|
||||||
|
|
||||||
Type type() const;
|
|
||||||
|
|
||||||
QVariant attribute(Attribute attribute, const QVariant &defaultValue = QVariant()) const;
|
|
||||||
void setAttribute(Attribute attribute, const QVariant &value);
|
|
||||||
QHash<Attribute, QVariant> attributes() const;
|
|
||||||
|
|
||||||
QString fileName() const;
|
|
||||||
void setFileName(const QString &fileName);
|
|
||||||
|
|
||||||
int lineNumber() const;
|
|
||||||
void setLineNumber(int lineNumber);
|
|
||||||
|
|
||||||
qint64 scriptId() const;
|
|
||||||
void setScriptId(qint64 id);
|
|
||||||
|
|
||||||
QString program() const;
|
|
||||||
void setProgram(const QString &program);
|
|
||||||
|
|
||||||
int breakpointId() const;
|
|
||||||
void setBreakpointId(int id);
|
|
||||||
|
|
||||||
QScriptBreakpointData breakpointData() const;
|
|
||||||
void setBreakpointData(const QScriptBreakpointData &data);
|
|
||||||
|
|
||||||
QScriptDebuggerValue scriptValue() const;
|
|
||||||
void setScriptValue(const QScriptDebuggerValue &value);
|
|
||||||
|
|
||||||
int contextIndex() const;
|
|
||||||
void setContextIndex(int index);
|
|
||||||
|
|
||||||
int iteratorId() const;
|
|
||||||
void setIteratorId(int id);
|
|
||||||
|
|
||||||
QString name() const;
|
|
||||||
void setName(const QString &name);
|
|
||||||
|
|
||||||
QScriptDebuggerValue subordinateScriptValue() const;
|
|
||||||
void setSubordinateScriptValue(const QScriptDebuggerValue &value);
|
|
||||||
|
|
||||||
int snapshotId() const;
|
|
||||||
void setSnapshotId(int id);
|
|
||||||
|
|
||||||
QScriptDebuggerCommand &operator=(const QScriptDebuggerCommand &other);
|
|
||||||
|
|
||||||
bool operator==(const QScriptDebuggerCommand &other) const;
|
|
||||||
bool operator!=(const QScriptDebuggerCommand &other) const;
|
|
||||||
|
|
||||||
static QScriptDebuggerCommand interruptCommand();
|
|
||||||
static QScriptDebuggerCommand continueCommand();
|
|
||||||
static QScriptDebuggerCommand stepIntoCommand(int count = 1);
|
|
||||||
static QScriptDebuggerCommand stepOverCommand(int count = 1);
|
|
||||||
static QScriptDebuggerCommand stepOutCommand();
|
|
||||||
static QScriptDebuggerCommand runToLocationCommand(const QString &fileName, int lineNumber);
|
|
||||||
static QScriptDebuggerCommand runToLocationCommand(qint64 scriptId, int lineNumber);
|
|
||||||
static QScriptDebuggerCommand forceReturnCommand(int contextIndex, const QScriptDebuggerValue &value);
|
|
||||||
static QScriptDebuggerCommand resumeCommand();
|
|
||||||
|
|
||||||
static QScriptDebuggerCommand setBreakpointCommand(const QString &fileName, int lineNumber);
|
|
||||||
static QScriptDebuggerCommand setBreakpointCommand(const QScriptBreakpointData &data);
|
|
||||||
static QScriptDebuggerCommand deleteBreakpointCommand(int id);
|
|
||||||
static QScriptDebuggerCommand deleteAllBreakpointsCommand();
|
|
||||||
static QScriptDebuggerCommand getBreakpointsCommand();
|
|
||||||
static QScriptDebuggerCommand getBreakpointDataCommand(int id);
|
|
||||||
static QScriptDebuggerCommand setBreakpointDataCommand(int id, const QScriptBreakpointData &data);
|
|
||||||
|
|
||||||
static QScriptDebuggerCommand getScriptsCommand();
|
|
||||||
static QScriptDebuggerCommand getScriptDataCommand(qint64 id);
|
|
||||||
static QScriptDebuggerCommand scriptsCheckpointCommand();
|
|
||||||
static QScriptDebuggerCommand getScriptsDeltaCommand();
|
|
||||||
static QScriptDebuggerCommand resolveScriptCommand(const QString &fileName);
|
|
||||||
|
|
||||||
static QScriptDebuggerCommand getBacktraceCommand();
|
|
||||||
static QScriptDebuggerCommand getContextCountCommand();
|
|
||||||
static QScriptDebuggerCommand getContextStateCommand(int contextIndex);
|
|
||||||
static QScriptDebuggerCommand getContextInfoCommand(int contextIndex);
|
|
||||||
static QScriptDebuggerCommand getContextIdCommand(int contextIndex);
|
|
||||||
static QScriptDebuggerCommand getThisObjectCommand(int contextIndex);
|
|
||||||
static QScriptDebuggerCommand getActivationObjectCommand(int contextIndex);
|
|
||||||
static QScriptDebuggerCommand getScopeChainCommand(int contextIndex);
|
|
||||||
static QScriptDebuggerCommand contextsCheckpoint();
|
|
||||||
static QScriptDebuggerCommand getPropertyExpressionValue(int contextIndex, int lineNumber,
|
|
||||||
const QStringList &path);
|
|
||||||
static QScriptDebuggerCommand getCompletions(int contextIndex, const QStringList &path);
|
|
||||||
|
|
||||||
static QScriptDebuggerCommand newScriptObjectSnapshotCommand();
|
|
||||||
static QScriptDebuggerCommand scriptObjectSnapshotCaptureCommand(int id, const QScriptDebuggerValue &object);
|
|
||||||
static QScriptDebuggerCommand deleteScriptObjectSnapshotCommand(int id);
|
|
||||||
|
|
||||||
static QScriptDebuggerCommand newScriptValueIteratorCommand(const QScriptDebuggerValue &object);
|
|
||||||
static QScriptDebuggerCommand getPropertiesByIteratorCommand(int id, int count);
|
|
||||||
static QScriptDebuggerCommand deleteScriptValueIteratorCommand(int id);
|
|
||||||
|
|
||||||
static QScriptDebuggerCommand evaluateCommand(int contextIndex, const QString &program,
|
|
||||||
const QString &fileName = QString(),
|
|
||||||
int lineNumber = 1);
|
|
||||||
|
|
||||||
static QScriptDebuggerCommand setScriptValuePropertyCommand(const QScriptDebuggerValue &object,
|
|
||||||
const QString &name,
|
|
||||||
const QScriptDebuggerValue &value);
|
|
||||||
static QScriptDebuggerCommand scriptValueToStringCommand(const QScriptDebuggerValue &value);
|
|
||||||
|
|
||||||
static QScriptDebuggerCommand clearExceptionsCommand();
|
|
||||||
|
|
||||||
private:
|
|
||||||
QScopedPointer<QScriptDebuggerCommandPrivate> d_ptr;
|
|
||||||
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerCommand)
|
|
||||||
};
|
|
||||||
|
|
||||||
Q_AUTOTEST_EXPORT QDataStream &operator<<(QDataStream &, const QScriptDebuggerCommand &);
|
|
||||||
Q_AUTOTEST_EXPORT QDataStream &operator>>(QDataStream &, QScriptDebuggerCommand &);
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,492 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggercommandexecutor_p.h"
|
|
||||||
|
|
||||||
#include "qscriptdebuggerbackend_p.h"
|
|
||||||
#include "qscriptdebuggercommand_p.h"
|
|
||||||
#include "qscriptdebuggerresponse_p.h"
|
|
||||||
#include "qscriptdebuggervalue_p.h"
|
|
||||||
#include "qscriptdebuggervalueproperty_p.h"
|
|
||||||
#include "qscriptbreakpointdata_p.h"
|
|
||||||
#include "qscriptobjectsnapshot_p.h"
|
|
||||||
#include "qscriptdebuggerobjectsnapshotdelta_p.h"
|
|
||||||
#include "qscripttoolscommon_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qstringlist.h>
|
|
||||||
#include <QtScript/qscriptengine.h>
|
|
||||||
#include <QtScript/qscriptcontextinfo.h>
|
|
||||||
#include <QtScript/qscriptvalueiterator.h>
|
|
||||||
#include <QtCore/qdebug.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\since 4.5
|
|
||||||
\class QScriptDebuggerCommandExecutor
|
|
||||||
\internal
|
|
||||||
|
|
||||||
\brief The QScriptDebuggerCommandExecutor applies debugger commands to a back-end.
|
|
||||||
|
|
||||||
The execute() function takes a command (typically produced by a
|
|
||||||
QScriptDebuggerFrontend) and applies it to a QScriptDebuggerBackend.
|
|
||||||
|
|
||||||
\sa QScriptDebuggerCommmand
|
|
||||||
*/
|
|
||||||
|
|
||||||
class QScriptDebuggerCommandExecutorPrivate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCommandExecutorPrivate();
|
|
||||||
~QScriptDebuggerCommandExecutorPrivate();
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptDebuggerCommandExecutorPrivate::QScriptDebuggerCommandExecutorPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommandExecutorPrivate::~QScriptDebuggerCommandExecutorPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommandExecutor::QScriptDebuggerCommandExecutor()
|
|
||||||
: d_ptr(new QScriptDebuggerCommandExecutorPrivate())
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommandExecutor::~QScriptDebuggerCommandExecutor()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Applies the given \a command to the given \a backend.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerResponse QScriptDebuggerCommandExecutor::execute(
|
|
||||||
QScriptDebuggerBackend *backend,
|
|
||||||
const QScriptDebuggerCommand &command)
|
|
||||||
{
|
|
||||||
QScriptDebuggerResponse response;
|
|
||||||
switch (command.type()) {
|
|
||||||
case QScriptDebuggerCommand::None:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::Interrupt:
|
|
||||||
backend->interruptEvaluation();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::Continue:
|
|
||||||
if (backend->engine()->isEvaluating()) {
|
|
||||||
backend->continueEvalution();
|
|
||||||
response.setAsync(true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::StepInto: {
|
|
||||||
QVariant attr = command.attribute(QScriptDebuggerCommand::StepCount);
|
|
||||||
int count = attr.isValid() ? attr.toInt() : 1;
|
|
||||||
backend->stepInto(count);
|
|
||||||
response.setAsync(true);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::StepOver: {
|
|
||||||
QVariant attr = command.attribute(QScriptDebuggerCommand::StepCount);
|
|
||||||
int count = attr.isValid() ? attr.toInt() : 1;
|
|
||||||
backend->stepOver(count);
|
|
||||||
response.setAsync(true);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::StepOut:
|
|
||||||
backend->stepOut();
|
|
||||||
response.setAsync(true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::RunToLocation:
|
|
||||||
backend->runToLocation(command.fileName(), command.lineNumber());
|
|
||||||
response.setAsync(true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::RunToLocationByID:
|
|
||||||
backend->runToLocation(command.scriptId(), command.lineNumber());
|
|
||||||
response.setAsync(true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::ForceReturn: {
|
|
||||||
int contextIndex = command.contextIndex();
|
|
||||||
QScriptDebuggerValue value = command.scriptValue();
|
|
||||||
QScriptEngine *engine = backend->engine();
|
|
||||||
QScriptValue realValue = value.toScriptValue(engine);
|
|
||||||
backend->returnToCaller(contextIndex, realValue);
|
|
||||||
response.setAsync(true);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::Resume:
|
|
||||||
backend->resume();
|
|
||||||
response.setAsync(true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::SetBreakpoint: {
|
|
||||||
QScriptBreakpointData data = command.breakpointData();
|
|
||||||
if (!data.isValid())
|
|
||||||
data = QScriptBreakpointData(command.fileName(), command.lineNumber());
|
|
||||||
int id = backend->setBreakpoint(data);
|
|
||||||
response.setResult(id);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::DeleteBreakpoint: {
|
|
||||||
int id = command.breakpointId();
|
|
||||||
if (!backend->deleteBreakpoint(id))
|
|
||||||
response.setError(QScriptDebuggerResponse::InvalidBreakpointID);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::DeleteAllBreakpoints:
|
|
||||||
backend->deleteAllBreakpoints();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetBreakpoints: {
|
|
||||||
QScriptBreakpointMap bps = backend->breakpoints();
|
|
||||||
if (!bps.isEmpty())
|
|
||||||
response.setResult(bps);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetBreakpointData: {
|
|
||||||
int id = command.breakpointId();
|
|
||||||
QScriptBreakpointData data = backend->breakpointData(id);
|
|
||||||
if (data.isValid())
|
|
||||||
response.setResult(data);
|
|
||||||
else
|
|
||||||
response.setError(QScriptDebuggerResponse::InvalidBreakpointID);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::SetBreakpointData: {
|
|
||||||
int id = command.breakpointId();
|
|
||||||
QScriptBreakpointData data = command.breakpointData();
|
|
||||||
if (!backend->setBreakpointData(id, data))
|
|
||||||
response.setError(QScriptDebuggerResponse::InvalidBreakpointID);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetScripts: {
|
|
||||||
QScriptScriptMap scripts = backend->scripts();
|
|
||||||
if (!scripts.isEmpty())
|
|
||||||
response.setResult(scripts);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetScriptData: {
|
|
||||||
qint64 id = command.scriptId();
|
|
||||||
QScriptScriptData data = backend->scriptData(id);
|
|
||||||
if (data.isValid())
|
|
||||||
response.setResult(data);
|
|
||||||
else
|
|
||||||
response.setError(QScriptDebuggerResponse::InvalidScriptID);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::ScriptsCheckpoint:
|
|
||||||
backend->scriptsCheckpoint();
|
|
||||||
response.setResult(QVariant::fromValue(backend->scriptsDelta()));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetScriptsDelta:
|
|
||||||
response.setResult(QVariant::fromValue(backend->scriptsDelta()));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::ResolveScript:
|
|
||||||
response.setResult(backend->resolveScript(command.fileName()));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetBacktrace:
|
|
||||||
response.setResult(backend->backtrace());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetContextCount:
|
|
||||||
response.setResult(backend->contextCount());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetContextState: {
|
|
||||||
QScriptContext *ctx = backend->context(command.contextIndex());
|
|
||||||
if (ctx)
|
|
||||||
response.setResult(static_cast<int>(ctx->state()));
|
|
||||||
else
|
|
||||||
response.setError(QScriptDebuggerResponse::InvalidContextIndex);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetContextID: {
|
|
||||||
int idx = command.contextIndex();
|
|
||||||
if ((idx >= 0) && (idx < backend->contextCount()))
|
|
||||||
response.setResult(backend->contextIds()[idx]);
|
|
||||||
else
|
|
||||||
response.setError(QScriptDebuggerResponse::InvalidContextIndex);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetContextInfo: {
|
|
||||||
QScriptContext *ctx = backend->context(command.contextIndex());
|
|
||||||
if (ctx)
|
|
||||||
response.setResult(QScriptContextInfo(ctx));
|
|
||||||
else
|
|
||||||
response.setError(QScriptDebuggerResponse::InvalidContextIndex);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetThisObject: {
|
|
||||||
QScriptContext *ctx = backend->context(command.contextIndex());
|
|
||||||
if (ctx)
|
|
||||||
response.setResult(ctx->thisObject());
|
|
||||||
else
|
|
||||||
response.setError(QScriptDebuggerResponse::InvalidContextIndex);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetActivationObject: {
|
|
||||||
QScriptContext *ctx = backend->context(command.contextIndex());
|
|
||||||
if (ctx)
|
|
||||||
response.setResult(ctx->activationObject());
|
|
||||||
else
|
|
||||||
response.setError(QScriptDebuggerResponse::InvalidContextIndex);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetScopeChain: {
|
|
||||||
QScriptContext *ctx = backend->context(command.contextIndex());
|
|
||||||
if (ctx) {
|
|
||||||
QScriptDebuggerValueList dest;
|
|
||||||
QScriptValueList src = ctx->scopeChain();
|
|
||||||
for (int i = 0; i < src.size(); ++i)
|
|
||||||
dest.append(src.at(i));
|
|
||||||
response.setResult(dest);
|
|
||||||
} else {
|
|
||||||
response.setError(QScriptDebuggerResponse::InvalidContextIndex);
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::ContextsCheckpoint: {
|
|
||||||
response.setResult(QVariant::fromValue(backend->contextsCheckpoint()));
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetPropertyExpressionValue: {
|
|
||||||
QScriptContext *ctx = backend->context(command.contextIndex());
|
|
||||||
int lineNumber = command.lineNumber();
|
|
||||||
QVariant attr = command.attribute(QScriptDebuggerCommand::UserAttribute);
|
|
||||||
QStringList path = attr.toStringList();
|
|
||||||
if (!ctx || path.isEmpty())
|
|
||||||
break;
|
|
||||||
QScriptContextInfo ctxInfo(ctx);
|
|
||||||
if (ctx->callee().isValid()
|
|
||||||
&& ((lineNumber < ctxInfo.functionStartLineNumber())
|
|
||||||
|| (lineNumber > ctxInfo.functionEndLineNumber()))) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
QScriptValueList objects;
|
|
||||||
int pathIndex = 0;
|
|
||||||
if (path.at(0) == QLatin1String("this")) {
|
|
||||||
objects.append(ctx->thisObject());
|
|
||||||
++pathIndex;
|
|
||||||
} else {
|
|
||||||
objects << ctx->scopeChain();
|
|
||||||
}
|
|
||||||
for (int i = 0; i < objects.size(); ++i) {
|
|
||||||
QScriptValue val = objects.at(i);
|
|
||||||
for (int j = pathIndex; val.isValid() && (j < path.size()); ++j) {
|
|
||||||
val = val.property(path.at(j));
|
|
||||||
}
|
|
||||||
if (val.isValid()) {
|
|
||||||
bool hadException = (ctx->state() == QScriptContext::ExceptionState);
|
|
||||||
QString str = val.toString();
|
|
||||||
if (!hadException && backend->engine()->hasUncaughtException())
|
|
||||||
backend->engine()->clearExceptions();
|
|
||||||
response.setResult(str);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetCompletions: {
|
|
||||||
QScriptContext *ctx = backend->context(command.contextIndex());
|
|
||||||
QVariant attr = command.attribute(QScriptDebuggerCommand::UserAttribute);
|
|
||||||
QStringList path = attr.toStringList();
|
|
||||||
if (!ctx || path.isEmpty())
|
|
||||||
break;
|
|
||||||
QScriptValueList objects;
|
|
||||||
QString prefix = path.last();
|
|
||||||
QSet<QString> matches;
|
|
||||||
if (path.size() > 1) {
|
|
||||||
const QString &topLevelIdent = path.at(0);
|
|
||||||
QScriptValue obj;
|
|
||||||
if (topLevelIdent == QLatin1String("this")) {
|
|
||||||
obj = ctx->thisObject();
|
|
||||||
} else {
|
|
||||||
QScriptValueList scopeChain;
|
|
||||||
scopeChain = ctx->scopeChain();
|
|
||||||
for (int i = 0; i < scopeChain.size(); ++i) {
|
|
||||||
QScriptValue oo = scopeChain.at(i).property(topLevelIdent);
|
|
||||||
if (oo.isObject()) {
|
|
||||||
obj = oo;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (int i = 1; obj.isObject() && (i < path.size()-1); ++i)
|
|
||||||
obj = obj.property(path.at(i));
|
|
||||||
if (obj.isValid())
|
|
||||||
objects.append(obj);
|
|
||||||
} else {
|
|
||||||
objects << ctx->scopeChain();
|
|
||||||
QStringList keywords;
|
|
||||||
keywords.append(QString::fromLatin1("this"));
|
|
||||||
keywords.append(QString::fromLatin1("true"));
|
|
||||||
keywords.append(QString::fromLatin1("false"));
|
|
||||||
keywords.append(QString::fromLatin1("null"));
|
|
||||||
for (int i = 0; i < keywords.size(); ++i) {
|
|
||||||
const QString &kwd = keywords.at(i);
|
|
||||||
if (isPrefixOf(prefix, kwd))
|
|
||||||
matches.insert(kwd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < objects.size(); ++i) {
|
|
||||||
QScriptValue obj = objects.at(i);
|
|
||||||
while (obj.isObject()) {
|
|
||||||
QScriptValueIterator it(obj);
|
|
||||||
while (it.hasNext()) {
|
|
||||||
it.next();
|
|
||||||
QString propertyName = it.name();
|
|
||||||
if (isPrefixOf(prefix, propertyName))
|
|
||||||
matches.insert(propertyName);
|
|
||||||
}
|
|
||||||
obj = obj.prototype();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QStringList matchesList = matches.toList();
|
|
||||||
qStableSort(matchesList);
|
|
||||||
response.setResult(matchesList);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::NewScriptObjectSnapshot: {
|
|
||||||
int id = backend->newScriptObjectSnapshot();
|
|
||||||
response.setResult(id);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::ScriptObjectSnapshotCapture: {
|
|
||||||
int id = command.snapshotId();
|
|
||||||
QScriptObjectSnapshot *snap = backend->scriptObjectSnapshot(id);
|
|
||||||
Q_ASSERT(snap != 0);
|
|
||||||
QScriptDebuggerValue object = command.scriptValue();
|
|
||||||
Q_ASSERT(object.type() == QScriptDebuggerValue::ObjectValue);
|
|
||||||
QScriptEngine *engine = backend->engine();
|
|
||||||
QScriptValue realObject = object.toScriptValue(engine);
|
|
||||||
Q_ASSERT(realObject.isObject());
|
|
||||||
QScriptObjectSnapshot::Delta delta = snap->capture(realObject);
|
|
||||||
QScriptDebuggerObjectSnapshotDelta result;
|
|
||||||
result.removedProperties = delta.removedProperties;
|
|
||||||
bool didIgnoreExceptions = backend->ignoreExceptions();
|
|
||||||
backend->setIgnoreExceptions(true);
|
|
||||||
for (int i = 0; i < delta.changedProperties.size(); ++i) {
|
|
||||||
const QScriptValueProperty &src = delta.changedProperties.at(i);
|
|
||||||
bool hadException = engine->hasUncaughtException();
|
|
||||||
QString str = src.value().toString();
|
|
||||||
if (!hadException && engine->hasUncaughtException())
|
|
||||||
engine->clearExceptions();
|
|
||||||
QScriptDebuggerValueProperty dest(src.name(), src.value(), str, src.flags());
|
|
||||||
result.changedProperties.append(dest);
|
|
||||||
}
|
|
||||||
for (int j = 0; j < delta.addedProperties.size(); ++j) {
|
|
||||||
const QScriptValueProperty &src = delta.addedProperties.at(j);
|
|
||||||
bool hadException = engine->hasUncaughtException();
|
|
||||||
QString str = src.value().toString();
|
|
||||||
if (!hadException && engine->hasUncaughtException())
|
|
||||||
engine->clearExceptions();
|
|
||||||
QScriptDebuggerValueProperty dest(src.name(), src.value(), str, src.flags());
|
|
||||||
result.addedProperties.append(dest);
|
|
||||||
}
|
|
||||||
backend->setIgnoreExceptions(didIgnoreExceptions);
|
|
||||||
response.setResult(QVariant::fromValue(result));
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::DeleteScriptObjectSnapshot: {
|
|
||||||
int id = command.snapshotId();
|
|
||||||
backend->deleteScriptObjectSnapshot(id);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::NewScriptValueIterator: {
|
|
||||||
QScriptDebuggerValue object = command.scriptValue();
|
|
||||||
Q_ASSERT(object.type() == QScriptDebuggerValue::ObjectValue);
|
|
||||||
QScriptEngine *engine = backend->engine();
|
|
||||||
QScriptValue realObject = object.toScriptValue(engine);
|
|
||||||
Q_ASSERT(realObject.isObject());
|
|
||||||
int id = backend->newScriptValueIterator(realObject);
|
|
||||||
response.setResult(id);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::GetPropertiesByIterator: {
|
|
||||||
int id = command.iteratorId();
|
|
||||||
int count = 1000;
|
|
||||||
QScriptValueIterator *it = backend->scriptValueIterator(id);
|
|
||||||
Q_ASSERT(it != 0);
|
|
||||||
QScriptDebuggerValuePropertyList props;
|
|
||||||
for (int i = 0; (i < count) && it->hasNext(); ++i) {
|
|
||||||
it->next();
|
|
||||||
QString name = it->name();
|
|
||||||
QScriptValue value = it->value();
|
|
||||||
QString valueAsString = value.toString();
|
|
||||||
QScriptValue::PropertyFlags flags = it->flags();
|
|
||||||
QScriptDebuggerValueProperty prp(name, value, valueAsString, flags);
|
|
||||||
props.append(prp);
|
|
||||||
}
|
|
||||||
response.setResult(props);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::DeleteScriptValueIterator: {
|
|
||||||
int id = command.iteratorId();
|
|
||||||
backend->deleteScriptValueIterator(id);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::Evaluate: {
|
|
||||||
int contextIndex = command.contextIndex();
|
|
||||||
QString program = command.program();
|
|
||||||
QString fileName = command.fileName();
|
|
||||||
int lineNumber = command.lineNumber();
|
|
||||||
backend->evaluate(contextIndex, program, fileName, lineNumber);
|
|
||||||
response.setAsync(true);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::ScriptValueToString: {
|
|
||||||
QScriptDebuggerValue value = command.scriptValue();
|
|
||||||
QScriptEngine *engine = backend->engine();
|
|
||||||
QScriptValue realValue = value.toScriptValue(engine);
|
|
||||||
response.setResult(realValue.toString());
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::SetScriptValueProperty: {
|
|
||||||
QScriptDebuggerValue object = command.scriptValue();
|
|
||||||
QScriptEngine *engine = backend->engine();
|
|
||||||
QScriptValue realObject = object.toScriptValue(engine);
|
|
||||||
QScriptDebuggerValue value = command.subordinateScriptValue();
|
|
||||||
QScriptValue realValue = value.toScriptValue(engine);
|
|
||||||
QString name = command.name();
|
|
||||||
realObject.setProperty(name, realValue);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::ClearExceptions:
|
|
||||||
backend->engine()->clearExceptions();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QScriptDebuggerCommand::UserCommand:
|
|
||||||
case QScriptDebuggerCommand::MaxUserCommand:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
|
@ -1,67 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCOMMANDEXECUTOR_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCOMMANDEXECUTOR_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobjectdefs.h>
|
|
||||||
#include <QtCore/qscopedpointer.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerBackend;
|
|
||||||
class QScriptDebuggerCommand;
|
|
||||||
class QScriptDebuggerResponse;
|
|
||||||
|
|
||||||
class QScriptDebuggerCommandExecutorPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerCommandExecutor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCommandExecutor();
|
|
||||||
virtual ~QScriptDebuggerCommandExecutor();
|
|
||||||
|
|
||||||
virtual QScriptDebuggerResponse execute(
|
|
||||||
QScriptDebuggerBackend *backend,
|
|
||||||
const QScriptDebuggerCommand &command);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QScriptDebuggerCommandExecutor(QScriptDebuggerCommandExecutorPrivate &dd);
|
|
||||||
QScopedPointer<QScriptDebuggerCommandExecutorPrivate> d_ptr;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerCommandExecutor)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerCommandExecutor)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,300 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggercommandschedulerfrontend_p.h"
|
|
||||||
#include "qscriptdebuggercommandschedulerinterface_p.h"
|
|
||||||
#include "qscriptdebuggercommand_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
QScriptDebuggerCommandSchedulerFrontend::QScriptDebuggerCommandSchedulerFrontend(
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *scheduler,
|
|
||||||
QScriptDebuggerResponseHandlerInterface *responseHandler)
|
|
||||||
: m_scheduler(scheduler), m_responseHandler(responseHandler)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommandSchedulerFrontend::~QScriptDebuggerCommandSchedulerFrontend()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleCommand(const QScriptDebuggerCommand &command)
|
|
||||||
{
|
|
||||||
return m_scheduler->scheduleCommand(command, m_responseHandler);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the front-end to break at the next script statement, and
|
|
||||||
returns a unique identifier associated with this command.
|
|
||||||
|
|
||||||
When the next script statement is encountered, the client will be
|
|
||||||
notified, and the front-end will be ready to accept commands.
|
|
||||||
|
|
||||||
\sa scheduleContinue()
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleInterrupt()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::interruptCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the front-end to continue evaluation, and returns a unique
|
|
||||||
identifier associated with this command.
|
|
||||||
|
|
||||||
\sa scheduleBreak()
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleContinue()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::continueCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the front-end to step into the next script statement, and
|
|
||||||
returns a unique identifier associated with this command.
|
|
||||||
|
|
||||||
Evaluation will automatically be continued, and the client()'s event()
|
|
||||||
function will be called when the statement has been stepped into.
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleStepInto(int count)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::stepIntoCommand(count));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the front-end to step over the next script statement, and
|
|
||||||
returns a unique identifier associated with this command.
|
|
||||||
|
|
||||||
Evaluation will automatically be continued, and the client()'s event()
|
|
||||||
function will be called when the statement has been stepped over.
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleStepOver(int count)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::stepOverCommand(count));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the front-end to step out of the current script function, and
|
|
||||||
returns a unique identifier associated with this command.
|
|
||||||
|
|
||||||
Evaluation will automatically be continued, and the client()'s
|
|
||||||
event() function will be called when the script function has been
|
|
||||||
stepped out of.
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleStepOut()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::stepOutCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the front-end to continue evaluation until the location
|
|
||||||
specified by the given \a fileName and \a lineNumber is reached.
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleRunToLocation(const QString &fileName, int lineNumber)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::runToLocationCommand(fileName, lineNumber));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Instructs the front-end to continue evaluation until the location
|
|
||||||
specified by the given \a scriptId and \a lineNumber is reached.
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleRunToLocation(qint64 scriptId, int lineNumber)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::runToLocationCommand(scriptId, lineNumber));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleForceReturn(int contextIndex, const QScriptDebuggerValue &value)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::forceReturnCommand(contextIndex, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleSetBreakpoint(const QString &fileName, int lineNumber)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::setBreakpointCommand(fileName, lineNumber));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleSetBreakpoint(const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::setBreakpointCommand(data));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleDeleteBreakpoint(int id)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::deleteBreakpointCommand(id));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleDeleteAllBreakpoints()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::deleteAllBreakpointsCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetBreakpoints()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getBreakpointsCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetBreakpointData(int id)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getBreakpointDataCommand(id));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleSetBreakpointData(int id, const QScriptBreakpointData &data)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::setBreakpointDataCommand(id, data));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetScripts()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getScriptsCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetScriptData(qint64 id)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getScriptDataCommand(id));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleScriptsCheckpoint()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::scriptsCheckpointCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetScriptsDelta()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getScriptsDeltaCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleResolveScript(const QString &fileName)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::resolveScriptCommand(fileName));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetBacktrace()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getBacktraceCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetContextCount()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getContextCountCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetContextState(int contextIndex)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getContextStateCommand(contextIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetContextInfo(int contextIndex)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getContextInfoCommand(contextIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetContextId(int contextIndex)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getContextIdCommand(contextIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetThisObject(int contextIndex)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getThisObjectCommand(contextIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetActivationObject(int contextIndex)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getActivationObjectCommand(contextIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetScopeChain(int contextIndex)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getScopeChainCommand(contextIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleContextsCheckpoint()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::contextsCheckpoint());
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetPropertyExpressionValue(
|
|
||||||
int contextIndex, int lineNumber, const QStringList &path)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getPropertyExpressionValue(contextIndex, lineNumber, path));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetCompletions(int contextIndex, const QStringList &path)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getCompletions(contextIndex, path));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleEvaluate(int contextIndex,
|
|
||||||
const QString &program,
|
|
||||||
const QString &fileName,
|
|
||||||
int lineNumber)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::evaluateCommand(contextIndex, program, fileName, lineNumber));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleNewScriptValueIterator(const QScriptDebuggerValue &object)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::newScriptValueIteratorCommand(object));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleGetPropertiesByIterator(int id, int count)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::getPropertiesByIteratorCommand(id, count));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleDeleteScriptValueIterator(int id)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::deleteScriptValueIteratorCommand(id));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleScriptValueToString(const QScriptDebuggerValue &value)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::scriptValueToStringCommand(value));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleSetScriptValueProperty(const QScriptDebuggerValue &object,
|
|
||||||
const QString &name,
|
|
||||||
const QScriptDebuggerValue &value)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::setScriptValuePropertyCommand(object, name, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleClearExceptions()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::clearExceptionsCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleNewScriptObjectSnapshot()
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::newScriptObjectSnapshotCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleScriptObjectSnapshotCapture(int id, const QScriptDebuggerValue &object)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::scriptObjectSnapshotCaptureCommand(id, object));
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerCommandSchedulerFrontend::scheduleDeleteScriptObjectSnapshot(int id)
|
|
||||||
{
|
|
||||||
return scheduleCommand(QScriptDebuggerCommand::deleteScriptObjectSnapshotCommand(id));
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
|
@ -1,128 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCOMMANDSCHEDULERFRONTEND_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCOMMANDSCHEDULERFRONTEND_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobjectdefs.h>
|
|
||||||
|
|
||||||
#include <QtCore/qstring.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCommandSchedulerInterface;
|
|
||||||
class QScriptDebuggerResponseHandlerInterface;
|
|
||||||
class QScriptDebuggerCommand;
|
|
||||||
class QScriptDebuggerValue;
|
|
||||||
class QScriptBreakpointData;
|
|
||||||
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerCommandSchedulerFrontend
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCommandSchedulerFrontend(
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *scheduler,
|
|
||||||
QScriptDebuggerResponseHandlerInterface *responseHandler);
|
|
||||||
~QScriptDebuggerCommandSchedulerFrontend();
|
|
||||||
|
|
||||||
// execution control
|
|
||||||
int scheduleInterrupt();
|
|
||||||
int scheduleContinue();
|
|
||||||
int scheduleStepInto(int count = 1);
|
|
||||||
int scheduleStepOver(int count = 1);
|
|
||||||
int scheduleStepOut();
|
|
||||||
int scheduleRunToLocation(const QString &fileName, int lineNumber);
|
|
||||||
int scheduleRunToLocation(qint64 scriptId, int lineNumber);
|
|
||||||
int scheduleForceReturn(int contextIndex, const QScriptDebuggerValue &value);
|
|
||||||
|
|
||||||
// breakpoints
|
|
||||||
int scheduleSetBreakpoint(const QString &fileName, int lineNumber);
|
|
||||||
int scheduleSetBreakpoint(const QScriptBreakpointData &data);
|
|
||||||
int scheduleDeleteBreakpoint(int id);
|
|
||||||
int scheduleDeleteAllBreakpoints();
|
|
||||||
int scheduleGetBreakpoints();
|
|
||||||
int scheduleGetBreakpointData(int id);
|
|
||||||
int scheduleSetBreakpointData(int id, const QScriptBreakpointData &data);
|
|
||||||
|
|
||||||
// scripts
|
|
||||||
int scheduleGetScripts();
|
|
||||||
int scheduleGetScriptData(qint64 id);
|
|
||||||
int scheduleScriptsCheckpoint();
|
|
||||||
int scheduleGetScriptsDelta();
|
|
||||||
int scheduleResolveScript(const QString &fileName);
|
|
||||||
|
|
||||||
// stack
|
|
||||||
int scheduleGetBacktrace();
|
|
||||||
int scheduleGetContextCount();
|
|
||||||
int scheduleGetContextState(int contextIndex);
|
|
||||||
int scheduleGetContextInfo(int contextIndex);
|
|
||||||
int scheduleGetContextId(int contextIndex);
|
|
||||||
int scheduleGetThisObject(int contextIndex);
|
|
||||||
int scheduleGetActivationObject(int contextIndex);
|
|
||||||
int scheduleGetScopeChain(int contextIndex);
|
|
||||||
int scheduleContextsCheckpoint();
|
|
||||||
int scheduleGetPropertyExpressionValue(int contextIndex, int lineNumber,
|
|
||||||
const QStringList &path);
|
|
||||||
int scheduleGetCompletions(int contextIndex, const QStringList &path);
|
|
||||||
|
|
||||||
// iteration
|
|
||||||
int scheduleNewScriptValueIterator(const QScriptDebuggerValue &object);
|
|
||||||
int scheduleGetPropertiesByIterator(int id, int count);
|
|
||||||
int scheduleDeleteScriptValueIterator(int id);
|
|
||||||
|
|
||||||
// evaluation
|
|
||||||
int scheduleEvaluate(int contextIndex, const QString &program,
|
|
||||||
const QString &fileName = QString(),
|
|
||||||
int lineNumber = 1);
|
|
||||||
|
|
||||||
int scheduleScriptValueToString(const QScriptDebuggerValue &value);
|
|
||||||
int scheduleSetScriptValueProperty(const QScriptDebuggerValue &object,
|
|
||||||
const QString &name,
|
|
||||||
const QScriptDebuggerValue &value);
|
|
||||||
|
|
||||||
int scheduleClearExceptions();
|
|
||||||
|
|
||||||
int scheduleNewScriptObjectSnapshot();
|
|
||||||
int scheduleScriptObjectSnapshotCapture(int id, const QScriptDebuggerValue &object);
|
|
||||||
int scheduleDeleteScriptObjectSnapshot(int id);
|
|
||||||
|
|
||||||
private:
|
|
||||||
int scheduleCommand(const QScriptDebuggerCommand &command);
|
|
||||||
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *m_scheduler;
|
|
||||||
QScriptDebuggerResponseHandlerInterface *m_responseHandler;
|
|
||||||
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerCommandSchedulerFrontend)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,55 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCOMMANDSCHEDULERINTERFACE_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCOMMANDSCHEDULERINTERFACE_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobjectdefs.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCommand;
|
|
||||||
class QScriptDebuggerResponseHandlerInterface;
|
|
||||||
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerCommandSchedulerInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~QScriptDebuggerCommandSchedulerInterface() {}
|
|
||||||
|
|
||||||
virtual int scheduleCommand(
|
|
||||||
const QScriptDebuggerCommand &command,
|
|
||||||
QScriptDebuggerResponseHandlerInterface *responseHandler) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,62 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggercommandschedulerjob_p.h"
|
|
||||||
#include "qscriptdebuggercommandschedulerjob_p_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
QScriptDebuggerCommandSchedulerJobPrivate::QScriptDebuggerCommandSchedulerJobPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommandSchedulerJobPrivate::~QScriptDebuggerCommandSchedulerJobPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommandSchedulerJob::QScriptDebuggerCommandSchedulerJob(
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler)
|
|
||||||
: QScriptDebuggerJob(*new QScriptDebuggerCommandSchedulerJobPrivate)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommandSchedulerJob);
|
|
||||||
d->commandScheduler = commandScheduler;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommandSchedulerJob::~QScriptDebuggerCommandSchedulerJob()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommandSchedulerJob::QScriptDebuggerCommandSchedulerJob(
|
|
||||||
QScriptDebuggerCommandSchedulerJobPrivate &dd,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler)
|
|
||||||
: QScriptDebuggerJob(dd)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerCommandSchedulerJob);
|
|
||||||
d->commandScheduler = commandScheduler;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *QScriptDebuggerCommandSchedulerJob::commandScheduler() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerCommandSchedulerJob);
|
|
||||||
return d->commandScheduler;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
|
@ -1,67 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCOMMANDSCHEDULERJOB_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCOMMANDSCHEDULERJOB_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qscriptdebuggerjob_p.h"
|
|
||||||
|
|
||||||
#include "qscriptdebuggerresponsehandlerinterface_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCommandSchedulerInterface;
|
|
||||||
|
|
||||||
class QScriptDebuggerCommandSchedulerJobPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerCommandSchedulerJob
|
|
||||||
: public QScriptDebuggerJob,
|
|
||||||
public QScriptDebuggerResponseHandlerInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCommandSchedulerJob(QScriptDebuggerCommandSchedulerInterface *commandScheduler);
|
|
||||||
~QScriptDebuggerCommandSchedulerJob();
|
|
||||||
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler() const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QScriptDebuggerCommandSchedulerJob(
|
|
||||||
QScriptDebuggerCommandSchedulerJobPrivate &dd,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerCommandSchedulerJob)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerCommandSchedulerJob)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,56 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCOMMANDSCHEDULERJOB_P_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCOMMANDSCHEDULERJOB_P_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qscriptdebuggerjob_p_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerCommandSchedulerInterface;
|
|
||||||
|
|
||||||
class QScriptDebuggerCommandSchedulerJob;
|
|
||||||
class QScriptDebuggerCommandSchedulerJobPrivate
|
|
||||||
: public QScriptDebuggerJobPrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptDebuggerCommandSchedulerJob)
|
|
||||||
public:
|
|
||||||
QScriptDebuggerCommandSchedulerJobPrivate();
|
|
||||||
~QScriptDebuggerCommandSchedulerJobPrivate();
|
|
||||||
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler;
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,598 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggerconsole_p.h"
|
|
||||||
#include "qscriptdebuggerconsolecommandjob_p.h"
|
|
||||||
#include "qscriptdebuggerconsolecommandmanager_p.h"
|
|
||||||
#include "qscriptdebuggerscriptedconsolecommand_p.h"
|
|
||||||
#include "qscriptmessagehandlerinterface_p.h"
|
|
||||||
#include "qscriptbreakpointdata_p.h"
|
|
||||||
#include "qscriptdebuggerresponse_p.h"
|
|
||||||
#include "qscriptdebuggervalueproperty_p.h"
|
|
||||||
#include "qscriptscriptdata_p.h"
|
|
||||||
#include "qscripttoolscommon_p.h"
|
|
||||||
#include "qscripttoolsresources_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qdir.h>
|
|
||||||
#include <QtCore/qfileinfo.h>
|
|
||||||
#include <QtCore/qstring.h>
|
|
||||||
#include <QtCore/qstringlist.h>
|
|
||||||
#include <QtCore/qdebug.h>
|
|
||||||
#include <QtScript/qscriptcontextinfo.h>
|
|
||||||
#include <QtScript/qscriptengine.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
static QScriptValue debuggerResponseToScriptValue(QScriptEngine *eng, const QScriptDebuggerResponse &in)
|
|
||||||
{
|
|
||||||
QScriptValue out = eng->newObject();
|
|
||||||
out.setProperty(QString::fromLatin1("result"), eng->toScriptValue(in.result()));
|
|
||||||
out.setProperty(QString::fromLatin1("error"), QScriptValue(eng, in.error()));
|
|
||||||
out.setProperty(QString::fromLatin1("async"), QScriptValue(eng, in.async()));
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void debuggerResponseFromScriptValue(const QScriptValue &, QScriptDebuggerResponse &)
|
|
||||||
{
|
|
||||||
Q_ASSERT(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static QScriptValue breakpointDataToScriptValue(QScriptEngine *eng, const QScriptBreakpointData &in)
|
|
||||||
{
|
|
||||||
QScriptValue out = eng->newObject();
|
|
||||||
out.setProperty(QString::fromLatin1("scriptId"), QScriptValue(eng, qsreal(in.scriptId())));
|
|
||||||
out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
|
|
||||||
out.setProperty(QString::fromLatin1("lineNumber"), QScriptValue(eng, in.lineNumber()));
|
|
||||||
out.setProperty(QString::fromLatin1("enabled"), QScriptValue(eng, in.isEnabled()));
|
|
||||||
out.setProperty(QString::fromLatin1("singleShot"), QScriptValue(eng, in.isSingleShot()));
|
|
||||||
out.setProperty(QString::fromLatin1("ignoreCount"), QScriptValue(eng, in.ignoreCount()));
|
|
||||||
out.setProperty(QString::fromLatin1("condition"), QScriptValue(eng, in.condition()));
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void breakpointDataFromScriptValue(const QScriptValue &in, QScriptBreakpointData &out)
|
|
||||||
{
|
|
||||||
QScriptValue scriptId = in.property(QString::fromLatin1("scriptId"));
|
|
||||||
if (scriptId.isValid())
|
|
||||||
out.setScriptId((qint64)scriptId.toNumber());
|
|
||||||
out.setFileName(in.property(QString::fromLatin1("fileName")).toString());
|
|
||||||
out.setLineNumber(in.property(QString::fromLatin1("lineNumber")).toInt32());
|
|
||||||
QScriptValue enabled = in.property(QString::fromLatin1("enabled"));
|
|
||||||
if (enabled.isValid())
|
|
||||||
out.setEnabled(enabled.toBoolean());
|
|
||||||
QScriptValue singleShot = in.property(QString::fromLatin1("singleShot"));
|
|
||||||
if (singleShot.isValid())
|
|
||||||
out.setSingleShot(singleShot.toBoolean());
|
|
||||||
out.setIgnoreCount(in.property(QString::fromLatin1("ignoreCount")).toInt32());
|
|
||||||
out.setCondition(in.property(QString::fromLatin1("condition")).toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
static QScriptValue breakpointMapToScriptValue(QScriptEngine *eng, const QScriptBreakpointMap &in)
|
|
||||||
{
|
|
||||||
QScriptValue out = eng->newObject();
|
|
||||||
QScriptBreakpointMap::const_iterator it;
|
|
||||||
for (it = in.constBegin(); it != in.constEnd(); ++it) {
|
|
||||||
out.setProperty(QString::number(it.key()), eng->toScriptValue(it.value()));
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void breakpointMapFromScriptValue(const QScriptValue &, QScriptBreakpointMap &)
|
|
||||||
{
|
|
||||||
Q_ASSERT(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static QScriptValue scriptDataToScriptValue(QScriptEngine *eng, const QScriptScriptData &in)
|
|
||||||
{
|
|
||||||
QScriptValue out = eng->newObject();
|
|
||||||
out.setProperty(QString::fromLatin1("contents"), QScriptValue(eng, in.contents()));
|
|
||||||
out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
|
|
||||||
out.setProperty(QString::fromLatin1("baseLineNumber"), QScriptValue(eng, in.baseLineNumber()));
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void scriptDataFromScriptValue(const QScriptValue &in, QScriptScriptData &out)
|
|
||||||
{
|
|
||||||
QString contents = in.property(QString::fromLatin1("contents")).toString();
|
|
||||||
QString fileName = in.property(QString::fromLatin1("fileName")).toString();
|
|
||||||
int baseLineNumber = in.property(QString::fromLatin1("baseLineNumber")).toInt32();
|
|
||||||
QScriptScriptData tmp(contents, fileName, baseLineNumber);
|
|
||||||
out = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QScriptValue scriptMapToScriptValue(QScriptEngine *eng, const QScriptScriptMap &in)
|
|
||||||
{
|
|
||||||
QScriptValue out = eng->newObject();
|
|
||||||
QScriptScriptMap::const_iterator it;
|
|
||||||
for (it = in.constBegin(); it != in.constEnd(); ++it) {
|
|
||||||
out.setProperty(QString::number(it.key()), eng->toScriptValue(it.value()));
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void scriptMapFromScriptValue(const QScriptValue &, QScriptScriptMap &)
|
|
||||||
{
|
|
||||||
Q_ASSERT(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static QScriptValue consoleCommandToScriptValue(
|
|
||||||
QScriptEngine *eng, QScriptDebuggerConsoleCommand* const &in)
|
|
||||||
{
|
|
||||||
if (!in)
|
|
||||||
return eng->undefinedValue();
|
|
||||||
QScriptValue out = eng->newObject();
|
|
||||||
out.setProperty(QString::fromLatin1("name"), QScriptValue(eng, in->name()));
|
|
||||||
out.setProperty(QString::fromLatin1("group"), QScriptValue(eng, in->group()));
|
|
||||||
out.setProperty(QString::fromLatin1("shortDescription"), QScriptValue(eng, in->shortDescription()));
|
|
||||||
out.setProperty(QString::fromLatin1("longDescription"), QScriptValue(eng, in->longDescription()));
|
|
||||||
out.setProperty(QString::fromLatin1("aliases"), eng->toScriptValue(in->aliases()));
|
|
||||||
out.setProperty(QString::fromLatin1("seeAlso"), eng->toScriptValue(in->seeAlso()));
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void consoleCommandFromScriptValue(
|
|
||||||
const QScriptValue &, QScriptDebuggerConsoleCommand* &)
|
|
||||||
{
|
|
||||||
Q_ASSERT(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static QScriptValue consoleCommandGroupDataToScriptValue(
|
|
||||||
QScriptEngine *eng, const QScriptDebuggerConsoleCommandGroupData &in)
|
|
||||||
{
|
|
||||||
QScriptValue out = eng->newObject();
|
|
||||||
out.setProperty(QString::fromLatin1("longDescription"), QScriptValue(eng, in.longDescription()));
|
|
||||||
out.setProperty(QString::fromLatin1("shortDescription"), QScriptValue(eng, in.shortDescription()));
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void consoleCommandGroupDataFromScriptValue(
|
|
||||||
const QScriptValue &, QScriptDebuggerConsoleCommandGroupData &)
|
|
||||||
{
|
|
||||||
Q_ASSERT(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static QScriptValue consoleCommandGroupMapToScriptValue(
|
|
||||||
QScriptEngine *eng, const QScriptDebuggerConsoleCommandGroupMap &in)
|
|
||||||
{
|
|
||||||
QScriptValue out = eng->newObject();
|
|
||||||
QScriptDebuggerConsoleCommandGroupMap::const_iterator it;
|
|
||||||
for (it = in.constBegin(); it != in.constEnd(); ++it) {
|
|
||||||
out.setProperty(it.key(), eng->toScriptValue(it.value()));
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void consoleCommandGroupMapFromScriptValue(
|
|
||||||
const QScriptValue &, QScriptDebuggerConsoleCommandGroupMap &)
|
|
||||||
{
|
|
||||||
Q_ASSERT(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static QScriptValue contextInfoToScriptValue(QScriptEngine *eng, const QScriptContextInfo &in)
|
|
||||||
{
|
|
||||||
QScriptValue out = eng->newObject();
|
|
||||||
out.setProperty(QString::fromLatin1("scriptId"), QScriptValue(eng, qsreal(in.scriptId())));
|
|
||||||
out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
|
|
||||||
out.setProperty(QString::fromLatin1("lineNumber"), QScriptValue(eng, in.lineNumber()));
|
|
||||||
out.setProperty(QString::fromLatin1("functionName"), QScriptValue(eng, in.functionName()));
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void contextInfoFromScriptValue(const QScriptValue &, QScriptContextInfo &)
|
|
||||||
{
|
|
||||||
Q_ASSERT(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static QScriptValue debuggerScriptValuePropertyToScriptValue(QScriptEngine *eng, const QScriptDebuggerValueProperty &in)
|
|
||||||
{
|
|
||||||
QScriptValue out = eng->newObject();
|
|
||||||
out.setProperty(QString::fromLatin1("name"), QScriptValue(eng, in.name()));
|
|
||||||
out.setProperty(QString::fromLatin1("value"), eng->toScriptValue(in.value()));
|
|
||||||
out.setProperty(QString::fromLatin1("valueAsString"), QScriptValue(eng, in.valueAsString()));
|
|
||||||
out.setProperty(QString::fromLatin1("flags"), QScriptValue(eng, static_cast<int>(in.flags())));
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void debuggerScriptValuePropertyFromScriptValue(const QScriptValue &in, QScriptDebuggerValueProperty &out)
|
|
||||||
{
|
|
||||||
QString name = in.property(QString::fromLatin1("name")).toString();
|
|
||||||
QScriptDebuggerValue value = qscriptvalue_cast<QScriptDebuggerValue>(in.property(QString::fromLatin1("value")));
|
|
||||||
QString valueAsString = in.property(QString::fromLatin1("valueAsString")).toString();
|
|
||||||
int flags = in.property(QString::fromLatin1("flags")).toInt32();
|
|
||||||
QScriptDebuggerValueProperty tmp(name, value, valueAsString, QScriptValue::PropertyFlags(flags));
|
|
||||||
out = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\since 4.5
|
|
||||||
\class QScriptDebuggerConsole
|
|
||||||
\internal
|
|
||||||
|
|
||||||
\brief The QScriptDebuggerConsole class provides the core functionality of a debugger console.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class QScriptDebuggerConsolePrivate
|
|
||||||
{
|
|
||||||
Q_DECLARE_PUBLIC(QScriptDebuggerConsole)
|
|
||||||
public:
|
|
||||||
QScriptDebuggerConsolePrivate(QScriptDebuggerConsole*);
|
|
||||||
~QScriptDebuggerConsolePrivate();
|
|
||||||
|
|
||||||
void loadScriptedCommands(QScriptMessageHandlerInterface *messageHandler);
|
|
||||||
QScriptDebuggerConsoleCommandJob *createJob(
|
|
||||||
const QString &command,
|
|
||||||
QScriptMessageHandlerInterface *messageHandler,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler);
|
|
||||||
|
|
||||||
QScriptEngine *commandEngine;
|
|
||||||
QScriptDebuggerConsoleCommandManager *commandManager;
|
|
||||||
QString commandPrefix;
|
|
||||||
QString input;
|
|
||||||
QStringList commandHistory;
|
|
||||||
int currentFrameIndex;
|
|
||||||
qint64 currentScriptId;
|
|
||||||
int currentLineNumber;
|
|
||||||
int evaluateAction;
|
|
||||||
qint64 sessionId;
|
|
||||||
|
|
||||||
QScriptDebuggerConsole *q_ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptDebuggerConsolePrivate::QScriptDebuggerConsolePrivate(QScriptDebuggerConsole* parent)
|
|
||||||
: q_ptr(parent)
|
|
||||||
{
|
|
||||||
sessionId = 0;
|
|
||||||
currentFrameIndex = 0;
|
|
||||||
currentScriptId = -1;
|
|
||||||
currentLineNumber = -1;
|
|
||||||
evaluateAction = 0;
|
|
||||||
commandPrefix = QLatin1String(".");
|
|
||||||
commandManager = new QScriptDebuggerConsoleCommandManager();
|
|
||||||
|
|
||||||
commandEngine = new QScriptEngine;
|
|
||||||
qScriptRegisterMetaType<QScriptBreakpointData>(commandEngine, breakpointDataToScriptValue, breakpointDataFromScriptValue);
|
|
||||||
qScriptRegisterMetaType<QScriptBreakpointMap>(commandEngine, breakpointMapToScriptValue, breakpointMapFromScriptValue);
|
|
||||||
qScriptRegisterMetaType<QScriptScriptData>(commandEngine, scriptDataToScriptValue, scriptDataFromScriptValue);
|
|
||||||
qScriptRegisterMetaType<QScriptScriptMap>(commandEngine, scriptMapToScriptValue, scriptMapFromScriptValue);
|
|
||||||
qScriptRegisterMetaType<QScriptContextInfo>(commandEngine, contextInfoToScriptValue, contextInfoFromScriptValue);
|
|
||||||
qScriptRegisterMetaType<QScriptDebuggerValueProperty>(commandEngine, debuggerScriptValuePropertyToScriptValue, debuggerScriptValuePropertyFromScriptValue);
|
|
||||||
qScriptRegisterSequenceMetaType<QScriptDebuggerValuePropertyList>(commandEngine);
|
|
||||||
qScriptRegisterMetaType<QScriptDebuggerResponse>(commandEngine, debuggerResponseToScriptValue, debuggerResponseFromScriptValue);
|
|
||||||
qScriptRegisterMetaType<QScriptDebuggerConsoleCommand*>(commandEngine, consoleCommandToScriptValue, consoleCommandFromScriptValue);
|
|
||||||
qScriptRegisterSequenceMetaType<QScriptDebuggerConsoleCommandList>(commandEngine);
|
|
||||||
qScriptRegisterMetaType<QScriptDebuggerConsoleCommandGroupData>(commandEngine, consoleCommandGroupDataToScriptValue, consoleCommandGroupDataFromScriptValue);
|
|
||||||
qScriptRegisterMetaType<QScriptDebuggerConsoleCommandGroupMap>(commandEngine, consoleCommandGroupMapToScriptValue, consoleCommandGroupMapFromScriptValue);
|
|
||||||
// ### can't do this, if it's an object ID the conversion will be incorrect since
|
|
||||||
// ### the object ID refers to an object in a different engine!
|
|
||||||
// qScriptRegisterMetaType(commandEngine, debuggerScriptValueToScriptValue, debuggerScriptValueFromScriptValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsolePrivate::~QScriptDebuggerConsolePrivate()
|
|
||||||
{
|
|
||||||
delete commandManager;
|
|
||||||
delete commandEngine;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Loads command definitions from scripts.
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerConsolePrivate::loadScriptedCommands(
|
|
||||||
QScriptMessageHandlerInterface *messageHandler)
|
|
||||||
{
|
|
||||||
static const struct ScriptsTblData {
|
|
||||||
const unsigned char* script;
|
|
||||||
const unsigned int scriptlen;
|
|
||||||
const char* scriptname;
|
|
||||||
} ScriptsTbl[] = {
|
|
||||||
{ scripts_advance_qs, scripts_advance_qs_len, "advance.qs" },
|
|
||||||
{ scripts_backtrace_qs, scripts_backtrace_qs_len, "backtrace.qs" },
|
|
||||||
{ scripts_break_qs, scripts_break_qs_len, "break.qs" },
|
|
||||||
{ scripts_clear_qs, scripts_clear_qs_len, "clear.qs" },
|
|
||||||
{ scripts_complete_qs, scripts_complete_qs_len, "complete.qs" },
|
|
||||||
{ scripts_condition_qs, scripts_condition_qs_len, "condition.qs" },
|
|
||||||
{ scripts_continue_qs, scripts_continue_qs_len, "continue.qs" },
|
|
||||||
{ scripts_delete_qs, scripts_delete_qs_len, "delete.qs" },
|
|
||||||
{ scripts_disable_qs, scripts_disable_qs_len, "disable.qs" },
|
|
||||||
{ scripts_down_qs, scripts_down_qs_len, "down.qs" },
|
|
||||||
{ scripts_enable_qs, scripts_enable_qs_len, "enable.qs" },
|
|
||||||
{ scripts_eval_qs, scripts_eval_qs_len, "eval.qs" },
|
|
||||||
{ scripts_finish_qs, scripts_finish_qs_len, "finish.qs" },
|
|
||||||
{ scripts_frame_qs, scripts_frame_qs_len, "frame.qs" },
|
|
||||||
{ scripts_help_qs, scripts_help_qs_len, "help.qs" },
|
|
||||||
{ scripts_ignore_qs, scripts_ignore_qs_len, "ignore.qs" },
|
|
||||||
{ scripts_info_qs, scripts_info_qs_len, "info.qs" },
|
|
||||||
{ scripts_interrupt_qs, scripts_interrupt_qs_len, "interrupt.qs" },
|
|
||||||
{ scripts_list_qs, scripts_list_qs_len, "list.qs" },
|
|
||||||
{ scripts_next_qs, scripts_next_qs_len, "next.qs" },
|
|
||||||
{ scripts_print_qs, scripts_print_qs_len, "print.qs" },
|
|
||||||
{ scripts_return_qs, scripts_return_qs_len, "return.qs" },
|
|
||||||
{ scripts_step_qs, scripts_step_qs_len, "step.qs" },
|
|
||||||
{ scripts_tbreak_qs, scripts_tbreak_qs_len, "tbreak.qs" },
|
|
||||||
{ scripts_up_qs, scripts_up_qs_len, "up.qs" }
|
|
||||||
};
|
|
||||||
static const qint16 ScriptsTblSize = sizeof(ScriptsTbl) / sizeof(ScriptsTblData);
|
|
||||||
|
|
||||||
for (int i = 0; i < ScriptsTblSize; ++i) {
|
|
||||||
|
|
||||||
QString program = QString::fromLocal8Bit(
|
|
||||||
reinterpret_cast<const char*>(ScriptsTbl[i].script),
|
|
||||||
ScriptsTbl[i].scriptlen
|
|
||||||
);
|
|
||||||
QString fileName = QString::fromLocal8Bit(ScriptsTbl[i].scriptname);
|
|
||||||
QScriptDebuggerScriptedConsoleCommand *command;
|
|
||||||
command = QScriptDebuggerScriptedConsoleCommand::parse(
|
|
||||||
program, fileName, commandEngine, messageHandler);
|
|
||||||
if (!command)
|
|
||||||
continue;
|
|
||||||
commandManager->addCommand(command);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Creates a job that will execute the given debugger \a command.
|
|
||||||
Returns the new job, or 0 if the command is undefined.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerConsoleCommandJob *QScriptDebuggerConsolePrivate::createJob(
|
|
||||||
const QString &command, QScriptMessageHandlerInterface *messageHandler,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler)
|
|
||||||
{
|
|
||||||
QString name;
|
|
||||||
int i = command.indexOf(QLatin1Char(' '));
|
|
||||||
if (i == -1) {
|
|
||||||
name = command;
|
|
||||||
i = name.size();
|
|
||||||
} else {
|
|
||||||
name = command.left(i);
|
|
||||||
}
|
|
||||||
if (name.isEmpty())
|
|
||||||
return 0;
|
|
||||||
QScriptDebuggerConsoleCommand *cmd = commandManager->findCommand(name);
|
|
||||||
if (!cmd) {
|
|
||||||
// try to auto-complete
|
|
||||||
QStringList completions = commandManager->completions(name);
|
|
||||||
if (!completions.isEmpty()) {
|
|
||||||
if (completions.size() > 1) {
|
|
||||||
QString msg;
|
|
||||||
msg.append(QString::fromLatin1("Ambiguous command \"%0\": ")
|
|
||||||
.arg(name));
|
|
||||||
for (int j = 0; j < completions.size(); ++j) {
|
|
||||||
if (j > 0)
|
|
||||||
msg.append(QLatin1String(", "));
|
|
||||||
msg.append(completions.at(j));
|
|
||||||
}
|
|
||||||
msg.append(QLatin1Char('.'));
|
|
||||||
messageHandler->message(QtWarningMsg, msg);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
cmd = commandManager->findCommand(completions.at(0));
|
|
||||||
Q_ASSERT(cmd != 0);
|
|
||||||
}
|
|
||||||
if (!cmd) {
|
|
||||||
messageHandler->message(
|
|
||||||
QtWarningMsg,
|
|
||||||
QString::fromLatin1("Undefined command \"%0\". Try \"help\".")
|
|
||||||
.arg(name));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QStringList args;
|
|
||||||
QString tmp = command.mid(i+1);
|
|
||||||
if (cmd->argumentTypes().contains(QString::fromLatin1("script"))) {
|
|
||||||
if (!tmp.isEmpty())
|
|
||||||
args.append(tmp);
|
|
||||||
} else {
|
|
||||||
args = tmp.split(QLatin1Char(' '), QString::SkipEmptyParts);
|
|
||||||
}
|
|
||||||
return cmd->createJob(args, q_func(), messageHandler, commandScheduler);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsole::QScriptDebuggerConsole()
|
|
||||||
: d_ptr(new QScriptDebuggerConsolePrivate(this))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsole::~QScriptDebuggerConsole()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerConsole::loadScriptedCommands(QScriptMessageHandlerInterface *messageHandler)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerConsole);
|
|
||||||
d->loadScriptedCommands(messageHandler);
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandManager *QScriptDebuggerConsole::commandManager() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsole);
|
|
||||||
return d->commandManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QScriptDebuggerConsole::hasIncompleteInput() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsole);
|
|
||||||
return !d->input.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScriptDebuggerConsole::incompleteInput() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsole);
|
|
||||||
return d->input;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerConsole::setIncompleteInput(const QString &input)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerConsole);
|
|
||||||
d->input = input;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScriptDebuggerConsole::commandPrefix() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsole);
|
|
||||||
return d->commandPrefix;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Consumes the given line of \a input. If the input starts with the
|
|
||||||
command prefix, it is regarded as a debugger command; otherwise the
|
|
||||||
input is evaluated as a plain script.
|
|
||||||
*/
|
|
||||||
QScriptDebuggerConsoleCommandJob *QScriptDebuggerConsole::consumeInput(
|
|
||||||
const QString &input, QScriptMessageHandlerInterface *messageHandler,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerConsole);
|
|
||||||
static const int maximumHistoryCount = 100;
|
|
||||||
QString cmd;
|
|
||||||
if (d->input.isEmpty() && input.isEmpty()) {
|
|
||||||
if (d->commandHistory.isEmpty())
|
|
||||||
return 0;
|
|
||||||
cmd = d->commandHistory.first();
|
|
||||||
} else {
|
|
||||||
cmd = input;
|
|
||||||
}
|
|
||||||
if (d->input.isEmpty() && cmd.startsWith(d->commandPrefix)) {
|
|
||||||
if (!input.isEmpty()) {
|
|
||||||
d->commandHistory.prepend(cmd);
|
|
||||||
if (d->commandHistory.size() > maximumHistoryCount)
|
|
||||||
d->commandHistory.removeLast();
|
|
||||||
}
|
|
||||||
cmd.remove(0, d->commandPrefix.length());
|
|
||||||
return d->createJob(cmd, messageHandler, commandScheduler);
|
|
||||||
}
|
|
||||||
d->input += cmd;
|
|
||||||
d->input += QLatin1Char('\n');
|
|
||||||
QScriptSyntaxCheckResult check = QScriptEngine::checkSyntax(d->input);
|
|
||||||
if (check.state() == QScriptSyntaxCheckResult::Intermediate)
|
|
||||||
return 0;
|
|
||||||
d->input.chop(1); // remove the last \n
|
|
||||||
cmd = QString();
|
|
||||||
cmd.append(d->commandPrefix);
|
|
||||||
cmd.append(QString::fromLatin1("eval "));
|
|
||||||
cmd.append(d->input);
|
|
||||||
d->commandHistory.prepend(cmd);
|
|
||||||
if (d->commandHistory.size() > maximumHistoryCount)
|
|
||||||
d->commandHistory.removeLast();
|
|
||||||
d->input.clear();
|
|
||||||
cmd.remove(0, d->commandPrefix.length());
|
|
||||||
return d->createJob(cmd, messageHandler, commandScheduler);
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerConsole::currentFrameIndex() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsole);
|
|
||||||
return d->currentFrameIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerConsole::setCurrentFrameIndex(int index)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerConsole);
|
|
||||||
d->currentFrameIndex = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
qint64 QScriptDebuggerConsole::currentScriptId() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsole);
|
|
||||||
return d->currentScriptId;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerConsole::setCurrentScriptId(qint64 id)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerConsole);
|
|
||||||
d->currentScriptId = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerConsole::currentLineNumber() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsole);
|
|
||||||
return d->currentLineNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerConsole::setCurrentLineNumber(int lineNumber)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerConsole);
|
|
||||||
d->currentLineNumber = lineNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QScriptDebuggerConsole::evaluateAction() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsole);
|
|
||||||
return d->evaluateAction;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerConsole::setEvaluateAction(int action)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerConsole);
|
|
||||||
d->evaluateAction = action;
|
|
||||||
}
|
|
||||||
|
|
||||||
qint64 QScriptDebuggerConsole::sessionId() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsole);
|
|
||||||
return d->sessionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerConsole::bumpSessionId()
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerConsole);
|
|
||||||
++d->sessionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScriptDebuggerConsole::showDebuggerInfoMessage(
|
|
||||||
QScriptMessageHandlerInterface *messageHandler)
|
|
||||||
{
|
|
||||||
messageHandler->message(
|
|
||||||
QtDebugMsg,
|
|
||||||
QString::fromLatin1(
|
|
||||||
"Welcome to the Qt Script debugger.\n"
|
|
||||||
"Debugger commands start with a . (period).\n"
|
|
||||||
"Any other input will be evaluated by the script interpreter.\n"
|
|
||||||
"Type \".help\" for help.\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
int QScriptDebuggerConsole::historyCount() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsole);
|
|
||||||
return d->commandHistory.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
QString QScriptDebuggerConsole::historyAt(int index) const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsole);
|
|
||||||
return d->commandHistory.value(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\reimp
|
|
||||||
*/
|
|
||||||
void QScriptDebuggerConsole::changeHistoryAt(int index, const QString &newHistory)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerConsole);
|
|
||||||
d->commandHistory[index] = newHistory;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
|
@ -1,100 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCONSOLE_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCONSOLE_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobjectdefs.h>
|
|
||||||
#include <QtCore/qscopedpointer.h>
|
|
||||||
|
|
||||||
#include "qscriptdebuggerconsolehistorianinterface_p.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QString;
|
|
||||||
class QScriptDebuggerConsoleCommandJob;
|
|
||||||
class QScriptMessageHandlerInterface;
|
|
||||||
class QScriptDebuggerCommandSchedulerInterface;
|
|
||||||
class QScriptDebuggerConsoleCommandManager;
|
|
||||||
|
|
||||||
class QScriptDebuggerConsolePrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerConsole
|
|
||||||
: public QScriptDebuggerConsoleHistorianInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerConsole();
|
|
||||||
~QScriptDebuggerConsole();
|
|
||||||
|
|
||||||
void loadScriptedCommands(QScriptMessageHandlerInterface *messageHandler);
|
|
||||||
|
|
||||||
void showDebuggerInfoMessage(QScriptMessageHandlerInterface *messageHandler);
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandManager *commandManager() const;
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandJob *consumeInput(
|
|
||||||
const QString &input,
|
|
||||||
QScriptMessageHandlerInterface *messageHandler,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *commandScheduler);
|
|
||||||
bool hasIncompleteInput() const;
|
|
||||||
QString incompleteInput() const;
|
|
||||||
void setIncompleteInput(const QString &input);
|
|
||||||
QString commandPrefix() const;
|
|
||||||
|
|
||||||
int historyCount() const;
|
|
||||||
QString historyAt(int index) const;
|
|
||||||
void changeHistoryAt(int index, const QString &newHistory);
|
|
||||||
|
|
||||||
int currentFrameIndex() const;
|
|
||||||
void setCurrentFrameIndex(int index);
|
|
||||||
|
|
||||||
qint64 currentScriptId() const;
|
|
||||||
void setCurrentScriptId(qint64 id);
|
|
||||||
|
|
||||||
int currentLineNumber() const;
|
|
||||||
void setCurrentLineNumber(int lineNumber);
|
|
||||||
|
|
||||||
int evaluateAction() const;
|
|
||||||
void setEvaluateAction(int action);
|
|
||||||
|
|
||||||
qint64 sessionId() const;
|
|
||||||
void bumpSessionId();
|
|
||||||
|
|
||||||
private:
|
|
||||||
QScopedPointer<QScriptDebuggerConsolePrivate> d_ptr;
|
|
||||||
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerConsole)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerConsole)
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,125 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggerconsolecommand_p.h"
|
|
||||||
#include "qscriptdebuggerconsolecommand_p_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qstringlist.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\since 4.5
|
|
||||||
\class QScriptDebuggerConsoleCommand
|
|
||||||
\internal
|
|
||||||
|
|
||||||
\brief The QScriptDebuggerConsoleCommand class is the base class of console commands.
|
|
||||||
|
|
||||||
\sa QScriptDebuggerConsoleCommandManager
|
|
||||||
*/
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandPrivate::QScriptDebuggerConsoleCommandPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandPrivate::~QScriptDebuggerConsoleCommandPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommand::QScriptDebuggerConsoleCommand()
|
|
||||||
: d_ptr(new QScriptDebuggerConsoleCommandPrivate)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommand::~QScriptDebuggerConsoleCommand()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommand::QScriptDebuggerConsoleCommand(QScriptDebuggerConsoleCommandPrivate &dd)
|
|
||||||
: d_ptr(&dd)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn QString QScriptDebuggerConsoleCommand::name() const
|
|
||||||
|
|
||||||
Returns the name of this console command.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn QString QScriptDebuggerConsoleCommand::group() const
|
|
||||||
|
|
||||||
Returns the group that this console command belongs to.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn QString QScriptDebuggerConsoleCommand::shortDescription() const
|
|
||||||
|
|
||||||
Returns a short (one line) description of the command.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn QString QScriptDebuggerConsoleCommand::longDescription() const
|
|
||||||
|
|
||||||
Returns a detailed description of how to use the command.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn QScriptDebuggerConsoleCommandJob *QScriptDebuggerConsoleCommand::createJob(
|
|
||||||
const QStringList &arguments,
|
|
||||||
QScriptDebuggerConsole *console,
|
|
||||||
QScriptMessageHandlerInterface *messageHandler,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *scheduler) = 0
|
|
||||||
|
|
||||||
Creates a job that will execute this command with the given \a
|
|
||||||
arguments. If the command cannot be executed (e.g. because one or
|
|
||||||
more arguments are invalid), a suitable error message should be
|
|
||||||
output to the \a messageHandler, and 0 should be returned.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns a list of names of commands that may also be of interest to
|
|
||||||
users of this command.
|
|
||||||
*/
|
|
||||||
QStringList QScriptDebuggerConsoleCommand::seeAlso() const
|
|
||||||
{
|
|
||||||
return QStringList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns a list of aliases for this command.
|
|
||||||
*/
|
|
||||||
QStringList QScriptDebuggerConsoleCommand::aliases() const
|
|
||||||
{
|
|
||||||
return QStringList();
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList QScriptDebuggerConsoleCommand::argumentTypes() const
|
|
||||||
{
|
|
||||||
return QStringList();
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList QScriptDebuggerConsoleCommand::subCommands() const
|
|
||||||
{
|
|
||||||
return QStringList();
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
|
@ -1,85 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCONSOLECOMMAND_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCONSOLECOMMAND_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobjectdefs.h>
|
|
||||||
#include <QtCore/qscopedpointer.h>
|
|
||||||
#include <QtCore/qlist.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QString;
|
|
||||||
class QStringList;
|
|
||||||
class QScriptDebuggerConsole;
|
|
||||||
class QScriptDebuggerConsoleCommandJob;
|
|
||||||
class QScriptMessageHandlerInterface;
|
|
||||||
class QScriptDebuggerCommandSchedulerInterface;
|
|
||||||
|
|
||||||
class QScriptDebuggerConsoleCommandPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerConsoleCommand
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerConsoleCommand();
|
|
||||||
virtual ~QScriptDebuggerConsoleCommand();
|
|
||||||
|
|
||||||
virtual QString name() const = 0;
|
|
||||||
virtual QString group() const = 0;
|
|
||||||
virtual QString shortDescription() const = 0;
|
|
||||||
virtual QString longDescription() const = 0;
|
|
||||||
virtual QStringList seeAlso() const;
|
|
||||||
virtual QStringList aliases() const;
|
|
||||||
|
|
||||||
virtual QStringList argumentTypes() const;
|
|
||||||
|
|
||||||
virtual QStringList subCommands() const;
|
|
||||||
virtual QScriptDebuggerConsoleCommandJob *createJob(
|
|
||||||
const QStringList &arguments,
|
|
||||||
QScriptDebuggerConsole *console,
|
|
||||||
QScriptMessageHandlerInterface *messageHandler,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *scheduler) = 0;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QScriptDebuggerConsoleCommand(QScriptDebuggerConsoleCommandPrivate &dd);
|
|
||||||
QScopedPointer<QScriptDebuggerConsoleCommandPrivate> d_ptr;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerConsoleCommand)
|
|
||||||
Q_DISABLE_COPY(QScriptDebuggerConsoleCommand)
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef QList<QScriptDebuggerConsoleCommand*> QScriptDebuggerConsoleCommandList;
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,50 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCONSOLECOMMAND_P_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCONSOLECOMMAND_P_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <QtCore/qobjectdefs.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QScriptDebuggerConsoleCommand;
|
|
||||||
class QScriptDebuggerConsoleCommandPrivate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerConsoleCommandPrivate();
|
|
||||||
virtual ~QScriptDebuggerConsoleCommandPrivate();
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,106 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggerconsolecommandgroupdata_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qstring.h>
|
|
||||||
#include <QtCore/qshareddata.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\since 4.5
|
|
||||||
\class QScriptDebuggerConsoleCommandGroupData
|
|
||||||
\internal
|
|
||||||
|
|
||||||
\brief The QScriptDebuggerConsoleCommandGroupData class holds data associated with a console command group.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class QScriptDebuggerConsoleCommandGroupDataPrivate : public QSharedData
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerConsoleCommandGroupDataPrivate();
|
|
||||||
~QScriptDebuggerConsoleCommandGroupDataPrivate();
|
|
||||||
|
|
||||||
QString shortDescription;
|
|
||||||
QString longDescription;
|
|
||||||
};
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandGroupDataPrivate::QScriptDebuggerConsoleCommandGroupDataPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandGroupDataPrivate::~QScriptDebuggerConsoleCommandGroupDataPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandGroupData::QScriptDebuggerConsoleCommandGroupData()
|
|
||||||
: d_ptr(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandGroupData::QScriptDebuggerConsoleCommandGroupData(
|
|
||||||
const QString &shortDescription, const QString &longDescription)
|
|
||||||
: d_ptr(new QScriptDebuggerConsoleCommandGroupDataPrivate)
|
|
||||||
{
|
|
||||||
d_ptr->shortDescription = shortDescription;
|
|
||||||
d_ptr->longDescription = longDescription;
|
|
||||||
d_ptr->ref.ref();
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandGroupData::QScriptDebuggerConsoleCommandGroupData(
|
|
||||||
const QScriptDebuggerConsoleCommandGroupData &other)
|
|
||||||
: d_ptr(other.d_ptr.data())
|
|
||||||
{
|
|
||||||
if (d_ptr)
|
|
||||||
d_ptr->ref.ref();
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandGroupData::~QScriptDebuggerConsoleCommandGroupData()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandGroupData &QScriptDebuggerConsoleCommandGroupData::operator=(
|
|
||||||
const QScriptDebuggerConsoleCommandGroupData &other)
|
|
||||||
{
|
|
||||||
d_ptr.assign(other.d_ptr.data());
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScriptDebuggerConsoleCommandGroupData::shortDescription() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsoleCommandGroupData);
|
|
||||||
return d->shortDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScriptDebuggerConsoleCommandGroupData::longDescription() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsoleCommandGroupData);
|
|
||||||
return d->longDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QScriptDebuggerConsoleCommandGroupData::isValid() const
|
|
||||||
{
|
|
||||||
Q_D(const QScriptDebuggerConsoleCommandGroupData);
|
|
||||||
return (d != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
|
@ -1,75 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSCRIPTDEBUGGERCONSOLECOMMANDGROUPDATA_P_H
|
|
||||||
#define QSCRIPTDEBUGGERCONSOLECOMMANDGROUPDATA_P_H
|
|
||||||
|
|
||||||
//
|
|
||||||
// W A R N I N G
|
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// This file is not part of the Katie API. It exists purely as an
|
|
||||||
// implementation detail. This header file may change from version to
|
|
||||||
// version without notice, or even be removed.
|
|
||||||
//
|
|
||||||
// We mean it.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "qobjectdefs.h"
|
|
||||||
#include "qscopedpointer_p.h"
|
|
||||||
#include "qmap.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
class QString;
|
|
||||||
|
|
||||||
class QScriptDebuggerConsoleCommandGroupDataPrivate;
|
|
||||||
class Q_AUTOTEST_EXPORT QScriptDebuggerConsoleCommandGroupData
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QScriptDebuggerConsoleCommandGroupData();
|
|
||||||
QScriptDebuggerConsoleCommandGroupData(
|
|
||||||
const QString &shortDescription,
|
|
||||||
const QString &longDescription);
|
|
||||||
QScriptDebuggerConsoleCommandGroupData(
|
|
||||||
const QScriptDebuggerConsoleCommandGroupData &other);
|
|
||||||
~QScriptDebuggerConsoleCommandGroupData();
|
|
||||||
|
|
||||||
QString shortDescription() const;
|
|
||||||
QString longDescription() const;
|
|
||||||
|
|
||||||
bool isValid() const;
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandGroupData &operator=(
|
|
||||||
const QScriptDebuggerConsoleCommandGroupData &other);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QScopedSharedPointer<QScriptDebuggerConsoleCommandGroupDataPrivate> d_ptr;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PRIVATE(QScriptDebuggerConsoleCommandGroupData)
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef QMap<QString, QScriptDebuggerConsoleCommandGroupData> QScriptDebuggerConsoleCommandGroupMap;
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,65 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
** Copyright (C) 2016 Ivailo Monev
|
|
||||||
**
|
|
||||||
** This file is part of the QtSCriptTools module of the Katie Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** This file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qscriptdebuggerconsolecommandjob_p.h"
|
|
||||||
#include "qscriptdebuggerconsolecommandjob_p_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/qdebug.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandJobPrivate::QScriptDebuggerConsoleCommandJobPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandJobPrivate::~QScriptDebuggerConsoleCommandJobPrivate()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandJob::QScriptDebuggerConsoleCommandJob(
|
|
||||||
QScriptDebuggerConsole *console,
|
|
||||||
QScriptMessageHandlerInterface *messageHandler,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *scheduler)
|
|
||||||
: QScriptDebuggerCommandSchedulerJob(*new QScriptDebuggerConsoleCommandJobPrivate,
|
|
||||||
scheduler)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerConsoleCommandJob);
|
|
||||||
d->console = console;
|
|
||||||
d->messageHandler = messageHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandJob::~QScriptDebuggerConsoleCommandJob()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScriptDebuggerConsoleCommandJob::QScriptDebuggerConsoleCommandJob(
|
|
||||||
QScriptDebuggerConsoleCommandJobPrivate &dd,
|
|
||||||
QScriptDebuggerConsole *console,
|
|
||||||
QScriptMessageHandlerInterface *messageHandler,
|
|
||||||
QScriptDebuggerCommandSchedulerInterface *scheduler)
|
|
||||||
: QScriptDebuggerCommandSchedulerJob(dd, scheduler)
|
|
||||||
{
|
|
||||||
Q_D(QScriptDebuggerConsoleCommandJob);
|
|
||||||
d->console = console;
|
|
||||||
d->messageHandler = messageHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|