diff options
author | Adam Chlipala <adam@chlipala.net> | 2020-01-15 12:07:44 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-15 12:07:44 -0500 |
commit | 5cce43a484bdde0053820b8ae408bcba830b25ba (patch) | |
tree | 9d5719046e082337e3ed057e6a495db3faca2c8a /src/errormsg.sml | |
parent | 11bf1e86020f99893cd987eb1a15952e517248cf (diff) | |
parent | 483115ee395c26ba7b52ac84757c8a1de4fe2d33 (diff) |
Merge pull request #186 from FrigoEU/lsp
Language Server Protocol (LSP)
Diffstat (limited to 'src/errormsg.sml')
-rw-r--r-- | src/errormsg.sml | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/errormsg.sml b/src/errormsg.sml index 8f3c93b1..d40789ed 100644 --- a/src/errormsg.sml +++ b/src/errormsg.sml @@ -88,12 +88,34 @@ fun spanOf (pos1, pos2) = {file = !file, val errors = ref false +val errorLog = ref ([]: { span: span + , message: string } list) +fun readErrorLog () = !errorLog +val structuresCurrentlyElaborating: ((string * bool) list) ref = ref nil + +fun startElabStructure s = + structuresCurrentlyElaborating := ((s, false) :: !structuresCurrentlyElaborating) +fun stopElabStructureAndGetErrored s = + let + val errored = + case List.find (fn x => #1 x = s) (!structuresCurrentlyElaborating) of + NONE => false + | SOME tup => #2 tup + val () = structuresCurrentlyElaborating := + (List.filter (fn x => #1 x <> s) (!structuresCurrentlyElaborating)) + in + errored + end +fun resetStructureTracker () = + structuresCurrentlyElaborating := [] -fun resetErrors () = errors := false +fun resetErrors () = (errors := false; errorLog := []) fun anyErrors () = !errors fun error s = (TextIO.output (TextIO.stdErr, s); TextIO.output1 (TextIO.stdErr, #"\n"); - errors := true) + errors := true; + structuresCurrentlyElaborating := + List.map (fn (s, e) => (s, true)) (!structuresCurrentlyElaborating)) fun errorAt (span : span) s = (TextIO.output (TextIO.stdErr, #file span); TextIO.output (TextIO.stdErr, ":"); @@ -101,6 +123,9 @@ fun errorAt (span : span) s = (TextIO.output (TextIO.stdErr, #file span); TextIO.output (TextIO.stdErr, ": (to "); TextIO.output (TextIO.stdErr, posToString (#last span)); TextIO.output (TextIO.stdErr, ") "); + errorLog := ({ span = span + , message = s + } :: !errorLog); error s) fun errorAt' span s = errorAt (spanOf span) s |