val session_resources = new VSCode_Resources(options, session_background, log) val session_options = options.bool.update("editor_output_state", true) val session = new VSCode_Session(session_options, session_resources) { overridedef deps_changed(): Unit = delay_load.invoke()
}
for ((session_background, session) <- try_session) { val store = Store(options) val session_heaps =
store.session_heaps(session_background, logic = session_background.session_name)
def reset_dictionary(): Unit = { for (spell_checker <- resources.spell_checker.get) {
spell_checker.reset()
update_output_visible()
}
}
/* hover */
def hover(id: LSP.Id, node_pos: Line.Node_Position): Unit = { val result = for {
(rendering, offset) <- rendering_offset(node_pos)
info <- rendering.tooltips(VSCode_Rendering.tooltip_elements, Text.Range(offset, offset + 1))
} yield { val range = rendering.model.content.doc.range(info.range) val contents = info.info.map(t => LSP.MarkedString(resources.output_pretty_tooltip(List(t))))
(range, contents)
}
channel.write(LSP.Hover.reply(id, result))
}
/* goto definition */
def goto_definition(id: LSP.Id, node_pos: Line.Node_Position): Unit = { val result =
(for ((rendering, offset) <- rendering_offset(node_pos)) yield rendering.hyperlinks(Text.Range(offset, offset + 1))) getOrElse Nil
channel.write(LSP.GotoDefinition.reply(id, result))
}
/* document highlights */
def document_highlights(id: LSP.Id, node_pos: Line.Node_Position): Unit = { val result =
(for ((rendering, offset) <- rendering_offset(node_pos)) yield { val model = rendering.model
rendering.caret_focus_ranges(Text.Range(offset, offset + 1), model.content.text_range)
.map(r => LSP.DocumentHighlight.text(model.content.doc.range(r)))
}) getOrElse Nil
channel.write(LSP.DocumentHighlights.reply(id, result))
}
/* code actions */
def code_action_request(id: LSP.Id, file: JFile, range: Line.Range): Unit = { for {
model <- resources.get_model(file)
version <- model.version
doc = model.content.doc
text_range <- doc.text_range(range)
} { val snapshot = resources.snapshot(model) val results =
snapshot.command_results(Text.Range(text_range.start - 1, text_range.stop + 1))
.iterator.map(_._2).toList val actions =
List.from( for {
(snippet, props) <- Protocol.sendback_snippets(results).iterator
id <- Position.Id.unapply(props)
(node, command) <- snapshot.find_command(id)
start <- node.command_start(command)
range = command.core_range + start
current_text <- model.get_text(range)
} yield { val line_range = doc.range(range) val edit_text = if (props.contains(Markup.PADDING_COMMAND)) { val whole_line = doc.lines(line_range.start.line) val indent = whole_line.text.takeWhile(_.isWhitespace)
current_text + "\n" + Library.prefix_lines(indent, snippet)
} else current_text + snippet val edit = LSP.TextEdit(line_range, resources.output_edit(edit_text))
LSP.CodeAction(snippet, List(LSP.TextDocumentEdit(file, Some(version), List(edit))))
})
channel.write(LSP.CodeActionRequest.reply(id, actions))
}
}
/* abbrevs */
def abbrevs_request(): Unit = { val syntax = session.resources.session_base.overall_syntax
channel.write(LSP.Abbrevs_Request.reply(syntax.abbrevs))
}
def documentation_request(): Unit =
channel.write(LSP.Documentation_Response(ml_settings))
/* main loop */
def start(): Unit = {
log("Server started " + Date.now())
def handle(json: JSON.T): Unit = { try {
json match { case LSP.Initialize(id) => init(id) case LSP.Initialized() => case LSP.Shutdown(id) => shutdown(id) case LSP.Exit() => exit() case LSP.DidOpenTextDocument(file, _, version, text) =>
change_document(file, version, List(LSP.TextDocumentChange(None, text)))
delay_load.invoke() case LSP.DidChangeTextDocument(file, version, changes) =>
change_document(file, version, changes) case LSP.DidCloseTextDocument(file) => close_document(file) case LSP.Completion(id, node_pos) => completion(id, node_pos) case LSP.Include_Word() => update_dictionary(true, false) case LSP.Include_Word_Permanently() => update_dictionary(true, true) case LSP.Exclude_Word() => update_dictionary(false, false) case LSP.Exclude_Word_Permanently() => update_dictionary(false, true) case LSP.Reset_Words() => reset_dictionary() case LSP.Hover(id, node_pos) => hover(id, node_pos) case LSP.GotoDefinition(id, node_pos) => goto_definition(id, node_pos) case LSP.DocumentHighlights(id, node_pos) => document_highlights(id, node_pos) case LSP.CodeActionRequest(id, file, range) => code_action_request(id, file, range) case LSP.Decoration_Request(file) => decoration_request(file) case LSP.Caret_Update(caret) => update_caret(caret) case LSP.Output_Set_Margin(margin) => dynamic_output.set_margin(margin) case LSP.State_Init(id) => State_Panel.init(id, server) case LSP.State_Exit(state_id) => State_Panel.exit(state_id) case LSP.State_Locate(state_id) => State_Panel.locate(state_id) case LSP.State_Update(state_id) => State_Panel.update(state_id) case LSP.State_Auto_Update(state_id, enabled) =>
State_Panel.auto_update(state_id, enabled) case LSP.State_Set_Margin(state_id, margin) => State_Panel.set_margin(state_id, margin) case LSP.Preview_Request(file, column) => preview_request(file, column) case LSP.Abbrevs_Request() => abbrevs_request() case LSP.Documentation_Request() => documentation_request() case LSP.Sledgehammer_Provers_Request() => sledgehammer.provers() case LSP.Sledgehammer_Request(args) => sledgehammer.request(args) case LSP.Sledgehammer_Cancel() => sledgehammer.cancel() case LSP.Sledgehammer_Locate() => sledgehammer.locate() case LSP.Sledgehammer_Sendback(text) => sledgehammer.sendback(text) case _ => if (!LSP.ResponseMessage.is_empty(json)) log("### IGNORED")
}
} catch { case exn: Throwable => channel.log_error_message(Exn.message(exn)) }
}
@tailrec def loop(): Unit = {
channel.read() match { case Some(json) =>
json match { case bulk: List[_] => bulk.foreach(handle) case _ => handle(json)
}
loop() case None => log("### TERMINATE")
}
}
loop()
}
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.39Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.