Skip to content

Commit 8062d89

Browse files
committed
LSP
1 parent b46c8c7 commit 8062d89

26 files changed

+1929
-8
lines changed

dune-project

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
dune
2020
dune-build-info
2121
dune-site
22+
fmt
23+
logs
24+
lsp
25+
lwt
2226
markdown
2327
(pcre2 (>= 8))
2428
(why3 (and (>= 1.8.0) (< 1.9)))

easycrypt.opam

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ depends: [
77
"dune" {>= "3.13"}
88
"dune-build-info"
99
"dune-site"
10+
"logs"
11+
"lsp"
12+
"lwt"
1013
"markdown"
1114
"pcre2" {>= "8"}
1215
"why3" {>= "1.8.0" & < "1.9"}

src/dune

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@
1616
(public_name easycrypt.ecLib)
1717
(foreign_stubs (language c) (names eunix))
1818
(modules :standard \ ec)
19-
(libraries batteries camlp-streams dune-build-info dune-site inifiles markdown markdown.html pcre2 tyxml why3 yojson zarith)
19+
(libraries batteries camlp-streams dune-build-info dune-site inifiles logs logs.fmt lsp lwt lwt.unix markdown markdown.html pcre2 tyxml why3 yojson zarith)
2020
)
2121

2222
(executable
2323
(public_name easycrypt)
2424
(name ec)
2525
(modules ec)
2626
(promote (until-clean))
27-
(libraries batteries camlp-streams dune-build-info dune-site inifiles pcre2 why3 yojson zarith ecLib))
27+
(libraries batteries ecLib)
28+
)
2829

2930
(ocamllex ecLexer)
3031

src/ec.ml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,9 @@ let main () =
214214
(* Execution of eager commands *)
215215
begin
216216
match options.o_command with
217+
| `Lsp ->
218+
EcLsp.run ();
219+
exit 0
217220
| `Runtest input -> begin
218221
let root =
219222
match EcRelocate.sourceroot with
@@ -535,6 +538,9 @@ let main () =
535538
| `Runtest _ ->
536539
(* Eagerly executed *)
537540
assert false
541+
| `Lsp ->
542+
(* Eagerly executed *)
543+
assert false
538544

539545
| `DocGen docopts -> begin
540546
let name = docopts.doco_input in

src/ecIo.ml

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,15 @@ let from_string data =
9696
let finalize (ecreader : ecreader) =
9797
Disposable.dispose ecreader
9898

99+
(* -------------------------------------------------------------------- *)
100+
let isfinal_token = function
101+
| EcParser.FINAL _ -> true
102+
| _ -> false
103+
99104
(* -------------------------------------------------------------------- *)
100105
let lexer ?(checkpoint : _ I.checkpoint option) (ecreader : ecreader_r) =
101106
let lexbuf = ecreader.ecr_lexbuf in
102107

103-
let isfinal = function
104-
| EcParser.FINAL _ -> true
105-
| _ -> false in
106-
107108
if ecreader.ecr_atstart then
108109
ecreader.ecr_trim <- ecreader.ecr_lexbuf.Lexing.lex_curr_p.pos_cnum;
109110

@@ -134,7 +135,7 @@ let lexer ?(checkpoint : _ I.checkpoint option) (ecreader : ecreader_r) =
134135

135136
ecreader.ecr_tokens <- prequeue @ queue;
136137

137-
if isfinal token then
138+
if isfinal_token token then
138139
ecreader.ecr_atstart <- true
139140
else
140141
ecreader.ecr_atstart <- ecreader.ecr_atstart && (
@@ -177,6 +178,42 @@ let parse (ecreader : ecreader) : EcParsetree.prog =
177178

178179
in parse (EcParser.Incremental.prog ecreader.ecr_lexbuf.lex_curr_p)
179180

181+
(* -------------------------------------------------------------------- *)
182+
let next_sentence_from (text : string) (start : int) : (string * int * int) option =
183+
let len = String.length text in
184+
if start < 0 || start >= len then
185+
None
186+
else
187+
let sub = String.sub text start (len - start) in
188+
let reader = from_string sub in
189+
let ecr = Disposable.get reader in
190+
191+
let exception EOF in
192+
193+
Fun.protect
194+
~finally:(fun () -> finalize reader)
195+
(fun () ->
196+
try
197+
begin
198+
let exception Done in
199+
200+
try
201+
while true do
202+
match proj3_1 (lexer ecr) with
203+
| EcParser.FINAL _ -> raise Done
204+
| EcParser.EOF -> raise EOF
205+
| _ -> ()
206+
done
207+
with Done -> ()
208+
end;
209+
210+
let p = ecr.ecr_lexbuf.Lexing.lex_curr_p.pos_cnum - 1 in
211+
let s = String.sub sub 0 p in
212+
213+
Some (s, start, start + p)
214+
with
215+
| EcLexer.LexicalError _ | EOF -> None)
216+
180217
(* -------------------------------------------------------------------- *)
181218
let xparse (ecreader : ecreader) : string * EcParsetree.prog =
182219
let ecr = Disposable.get ecreader in

src/ecIo.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ val parse : ecreader -> EcParsetree.prog
1313
val parseall : ecreader -> EcParsetree.global list
1414
val drain : ecreader -> unit
1515
val lexbuf : ecreader -> Lexing.lexbuf
16+
val next_sentence_from : string -> int -> (string * int * int) option
1617

1718
(* -------------------------------------------------------------------- *)
1819
val lex_single_token : string -> EcParser.token option

0 commit comments

Comments
 (0)