问题描述
我正在用Monaco Editor编写自己的IDE。
首先,我有一个诊断程序,可以根据optimizeFormula(text,"A1")
的结果设置标记:
export class DiagnosticsAdapter {
private async _doValidate(model: monaco.editor.ITextModel): Promise<void> {
if (model.isDisposed()) {
// model was disposed in the meantime
return;
}
const promises: Promise<Diagnostic>[] = [];
let text = model.getValue();
let resultA = optimizeFormula(text,"A1");
resultA.forEach(resultA1 => {
promises.push(Promise.resolve({ // see "interface Diagnostic" and "interface DiagnosticRelatedInformation" above
category: DiagnosticCategory.Warning,// DiagnosticCategory.Suggestion,category: DiagnosticCategory.Error,code: utilities.codeFromRule(resultA1.rule),file: undefined,length: resultA1.ending - resultA1.start,messageText: utilities.diagnosticMessageFromResult(resultA1),start: resultA1.start + 1,}))
});
const diagnostics = await Promise.all(promises);
if (!diagnostics || model.isDisposed()) {
// model was disposed in the meantime
return;
}
const markers = diagnostics
.map(d => this._convertDiagnostics(model,d));
monaco.editor.setModelMarkers(model,this._selector,markers);
}
}
因为我们可以在悬停的弹出窗口中编写markdown,所以我也使用悬停,它是由先前生成的标记制成的。
public async provideHover(model: monaco.editor.ITextModel,position: monaco.Position,token: CancellationToken): Promise<monaco.languages.Hover | undefined> {
let contents : any[] = [];
monaco.editor.getModelMarkers({}).forEach(marker => {
let markerStart = new monaco.Position(marker.startLineNumber,marker.startColumn);
let markerEnd = new monaco.Position(marker.endLineNumber,marker.endColumn);
if (markerStart.isBeforeOrEqual(position) && position.isBeforeOrEqual(markerEnd) && marker.code != undefined) {
contents.push({ value: utilities.contentMarkdownFromCodeMessage(marker.code,marker.message),isTrusted: false })
}
})
return { contents: contents };
}
请注意,悬停的内容是由之前生成的标记制成的。
但是,在构建标记的过程中,我希望直接根据optimizeFormula(text,"A1")
的结果构建悬停的内容。但是我不想再次运行optimizeFormula(text,"A1")
。
因此,理想情况下,我想一次在optimizeFormula(text,"A1")
中计算 _doValidate
的结果,将其保存在模型中的某个地方,然后在provideHover
中得到它。
有可能吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)