Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit 6cdc47b

Browse files
authored
add API for parsing impl/interface from a raw string (#643)
* add API for parsing impl/interface from a raw string * add live attributes to new fns
1 parent e01c050 commit 6cdc47b

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/res_driver.ml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ let setup ~filename ~forPrinter () =
4141
let mode = if forPrinter then Res_parser.Default else ParseForTypeChecker in
4242
Res_parser.make ~mode src filename
4343

44+
let setupFromSource ~displayFilename ~source ~forPrinter () =
45+
let mode = if forPrinter then Res_parser.Default else ParseForTypeChecker in
46+
Res_parser.make ~mode source displayFilename
47+
4448
let parsingEngine =
4549
{
4650
parseImplementation =
@@ -82,6 +86,40 @@ let parsingEngine =
8286
Res_diagnostics.printReport diagnostics source);
8387
}
8488

89+
let parseImplementationFromSource ~forPrinter ~displayFilename ~source =
90+
let engine = setupFromSource ~displayFilename ~source ~forPrinter () in
91+
let structure = Res_core.parseImplementation engine in
92+
let invalid, diagnostics =
93+
match engine.diagnostics with
94+
| [] as diagnostics -> (false, diagnostics)
95+
| _ as diagnostics -> (true, diagnostics)
96+
in
97+
{
98+
filename = engine.scanner.filename;
99+
source = engine.scanner.src;
100+
parsetree = structure;
101+
diagnostics;
102+
invalid;
103+
comments = List.rev engine.comments;
104+
}
105+
106+
let parseInterfaceFromSource ~forPrinter ~displayFilename ~source =
107+
let engine = setupFromSource ~displayFilename ~source ~forPrinter () in
108+
let signature = Res_core.parseSpecification engine in
109+
let invalid, diagnostics =
110+
match engine.diagnostics with
111+
| [] as diagnostics -> (false, diagnostics)
112+
| _ as diagnostics -> (true, diagnostics)
113+
in
114+
{
115+
filename = engine.scanner.filename;
116+
source = engine.scanner.src;
117+
parsetree = signature;
118+
diagnostics;
119+
invalid;
120+
comments = List.rev engine.comments;
121+
}
122+
85123
let printEngine =
86124
{
87125
printImplementation =

src/res_driver.mli

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,20 @@ type 'diagnostics parsingEngine = {
1919
stringOfDiagnostics: source:string -> filename:string -> 'diagnostics -> unit;
2020
}
2121

22+
val parseImplementationFromSource :
23+
forPrinter:bool ->
24+
displayFilename:string ->
25+
source:string ->
26+
(Parsetree.structure, Res_diagnostics.t list) parseResult
27+
[@@live]
28+
29+
val parseInterfaceFromSource :
30+
forPrinter:bool ->
31+
displayFilename:string ->
32+
source:string ->
33+
(Parsetree.signature, Res_diagnostics.t list) parseResult
34+
[@@live]
35+
2236
type printEngine = {
2337
printImplementation:
2438
width:int ->

0 commit comments

Comments
 (0)