诚然,这是一个糟糕的答案,但我认为它总比没有好。如果我站在你的立场上,我会这样做:
现在显然可以使用某种插件从浏览器到 IDE 进行通信,但我不喜欢这样至少有两个原因:我不喜欢使用强类型语言进行编码,而且我生成的任何代码都是本质上是特定于浏览器的。虽然它不是最轻量级的解决方案,但阻塞模式下的 XHR 可以完成工作。
IDE 将托管一个发送CORS 标头的 http 服务器。编译后的源代码将包含如下内容:
var ___, __INTERRUPT_SIGNAL = {};
(function() {
var oXhr = new XMLHttpRequest();
oXhr.open('POST', 'http://localhost/debugging_port', false); // Force XHR to work synchronously
___ = function(nLineNumber) {
var sState = 'line_number='+nLineNumber;
for(var nOffset = 0; nOffset < arguments.length; nOffset++) sState += '&i=' + escape(arguments[nOffset]);
oXhr.send(sState);
if(oXhr.status !== 200) return ___.apply(this, arguments);
var sCommand = oXhr.responseText;
if(sCommand === 'step_into') {
return;
}else if(sCommand === 'step_out') {
throw __INTERRUPT_SIGNAL;
}else{
return ___.apply(this, arguments);
}
};
})();
现在,当 Caffeinated Beverage Script 编译器编译源代码时,它应该在源代码的每个换行处调用_函数。例如,
int nCheese = 0;
char cLetter = 'Q';
customClass productZeroQ = nCheese * cLetter;
可能会编译成类似的东西
var $0xA1, $0xA2, $0xA3;
___(9, $0xA1, $0xA2, $0xA3);
$0xA1 = 0;
___(10, $0xA1, $0xA2, $0xA3);
$0xA2 = 'Q';
___(11, $0xA1, $0xA2, $0xA3);
try {
$0xA3 = $0x34.$0x21($0xA1, $0xA2);
}catch(oSignal){
if(oSignal !== ___INTERRUPT_SIGNAL) throw oSignal;
}
XHR 将在 IDE 决定是 step_out 还是 step_forward 时阻止执行。这可以扩展到包括堆栈跟踪,但我不想写小说。
我知道这很丑陋,但我希望这会有所帮助!