flowchart LR
MI["moon ide hover<br>--output-json"] --> PH["parse_moon_hover_output"]
PH --> HV["language.Hover?"]
ML["moon ide peek-def / find-references<br>--json"] --> PL["parse_moon_definition_output"]
PL --> LC["language.Location[]"]
MC["moon check<br>--output-json"] --> PC["parse_moon_check_diagnostics"]
PC --> DG["Map[remote URI, Diagnostic[]]"]///|
test "hover output maps onto the requested position" {
let with_range =
#|{"range":"20:15-20:33","contents":["```moonbit\nenum DiagnosticSeverity {}\n```","\n Doc text."]}
let rangeless =
#|{"contents":["plain"]}
debug_inspect(
(
@host.parse_moon_hover_output(with_range, Position(3, 7)).map(hover => {
hover.range
}),
@host.parse_moon_hover_output(rangeless, Position(3, 7)).map(hover => {
hover.range
}),
@host.parse_moon_hover_output(
"No hover information found at src/main.mbt:1:1",
Position(1, 1),
)
is None,
@host.parse_moon_hover_output("{\"contents\":[]}", Position(1, 1)) is None,
),
content=(
#|(
#| Some(
#| {
#| start_line_number: 20,
#| start_column: 15,
#| end_line_number: 20,
#| end_column: 33,
#| },
#| ),
#| Some(
#| {
#| start_line_number: 3,
#| start_column: 7,
#| end_line_number: 3,
#| end_column: 8,
#| },
#| ),
#| true,
#| true,
#|)
),
)
}///|
test "diagnostics are grouped by remote URI and clipped to the root" {
let raw =
#|{"$message_type":"diagnostic","level":"warning","error_code":1,"path":"/workspace/demo/src/bad.mbt","loc":"2:4-2:17","message":"Warning (unused_value): Unused function 'unused_helper'"}
#|{"$message_type":"diagnostic","level":"error","error_code":4014,"path":"/workspace/demo/src/bad.mbt","loc":"4:7-4:8","message":"Expr Type Mismatch"}
#|{"$message_type":"diagnostic","level":"error","error_code":1,"path":"/elsewhere/other.mbt","loc":"1:1-1:2","message":"outside the workspace root"}
#|Finished. moon: no work to do
#|
let grouped = @host.parse_moon_check_diagnostics("/workspace/demo", raw)
debug_inspect(
[
for entry in grouped => {
(
entry.0,
entry.1.map(diagnostic => (diagnostic.severity, diagnostic.range)),
)
}
],
content=(
#|[
#| (
#| "readonly-remote://workspace/src/bad.mbt",
#| [
#| (
#| Warning,
#| {
#| start_line_number: 2,
#| start_column: 4,
#| end_line_number: 2,
#| end_column: 17,
#| },
#| ),
#| (
#| Error,
#| {
#| start_line_number: 4,
#| start_column: 7,
#| end_line_number: 4,
#| end_column: 8,
#| },
#| ),
#| ],
#| ),
#|]
),
)
}type MoonCheckDiagnosticsfn MoonCheckDiagnostics::MoonCheckDiagnostics(root : Ref[String], publish : (Uri, String, Array[Diagnostic]) -> Unit, moon_command? : String) -> MoonCheckDiagnosticsfn MoonCheckDiagnostics::note_document(self : MoonCheckDiagnostics, document : DocumentSnapshot) -> Unitfn MoonCheckDiagnostics::schedule(self : MoonCheckDiagnostics, spawn_task : (async () -> Unit) -> Unit) -> Unittype MoonWorkspaceLanguageProviderasync fn provide_definition(self : MoonWorkspaceLanguageProvider, model : TextModel, position : Position, token : CancellationToken) -> Array[Location]async fn provide_document_symbols(_self : MoonWorkspaceLanguageProvider, _model : TextModel, _token : CancellationToken) -> Array[DocumentSymbol]async fn provide_hover(self : MoonWorkspaceLanguageProvider, model : TextModel, position : Position, _token : CancellationToken) -> Hover?async fn provide_references(self : MoonWorkspaceLanguageProvider, model : TextModel, position : Position, token : CancellationToken) -> Array[Location]fn MoonWorkspaceLanguageProvider::MoonWorkspaceLanguageProvider(root : Ref[String], moon_command? : String) -> MoonWorkspaceLanguageProvidertype NativeServerHostimpl ServerHost for NativeServerHostasync fn read_directory(self : NativeServerHost, root : String, relative : String) -> ServerHostResolveResultasync fn read_text_file(self : NativeServerHost, root : String, path : SourcePath) -> ServerHostReadResultfn watch_text_file(self : NativeServerHost, root : String, path : SourcePath, listener : async (FileChangeType) -> Unit, spawn_watch : (async () -> Unit) -> Unit) -> ServerWatchasync fn run_native_editor_server(root : String, host? : String, port? : Int, asset_dir? : String, moon_command? : String, browse_root? : String, log? : (String) -> Unit) -> Unit