我正在构建自己的应用程序,该应用程序具有用于用户脚本的JavaScript后端,并且正在实现与Chrome的JavaScript控制台类似的功能。
让我感到困惑的是Chrome用来决定返回键何时触发要执行的命令以及何时自动继续换行的逻辑。
例如,如果您键入
function blah() { <return>
然后继续到下一行,以允许您继续键入该函数,而
function blah() {] <return>
立即给出一个解析错误(因此,它不像仅计数未完成的括号对那样简单)
任何人都受到打击吗(或者对Chromium源代码足够熟悉的人,可以将我指向他们代码库中的特定逻辑)
答案 0 :(得分:2)
这里是the source that decides what to do when Enter is pressed(感谢wOxxOm):
async _enterKeyPressed(event) {
if (event.altKey || event.ctrlKey || event.shiftKey)
return;
event.consume(true);
this.clearAutocomplete();
const str = this.text();
if (!str.length)
return;
if (!this._isCaretAtEndOfPrompt()) {
await this._appendCommand(str, true);
return;
}
if (await ObjectUI.JavaScriptAutocomplete.isExpressionComplete(str))
await this._appendCommand(str, true);
else
this._editor.newlineAndIndent();
this._enterProcessedForTest();
}
这是the source that determines if an expression is complete:
static async isExpressionComplete(expression) {
const currentExecutionContext = UI.context.flavor(SDK.ExecutionContext);
if (!currentExecutionContext)
return true;
const result =
await currentExecutionContext.runtimeModel.compileScript(expression, '', false, currentExecutionContext.id);
if (!result.exceptionDetails)
return true;
const description = result.exceptionDetails.exception.description;
return !description.startsWith('SyntaxError: Unexpected end of input') &&
!description.startsWith('SyntaxError: Unterminated template literal');
}
如果我的解释是正确的,则好像DevTools只是编译表达式并使用该结果确定表达式是否完整。如果有异常或错误,则表示不完整。