From 464083a8a2bfb92562ec88be61dd51500fb19da9 Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Mon, 19 Sep 2022 18:26:40 +0200 Subject: [PATCH 1/2] add API for parsing impl/interface from a raw string --- src/res_driver.ml | 38 ++++++++++++++++++++++++++++++++++++++ src/res_driver.mli | 12 ++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/res_driver.ml b/src/res_driver.ml index f30a071c..c7c722d9 100644 --- a/src/res_driver.ml +++ b/src/res_driver.ml @@ -41,6 +41,10 @@ let setup ~filename ~forPrinter () = let mode = if forPrinter then Res_parser.Default else ParseForTypeChecker in Res_parser.make ~mode src filename +let setupFromSource ~displayFilename ~source ~forPrinter () = + let mode = if forPrinter then Res_parser.Default else ParseForTypeChecker in + Res_parser.make ~mode source displayFilename + let parsingEngine = { parseImplementation = @@ -82,6 +86,40 @@ let parsingEngine = Res_diagnostics.printReport diagnostics source); } +let parseImplementationFromSource ~forPrinter ~displayFilename ~source = + let engine = setupFromSource ~displayFilename ~source ~forPrinter () in + let structure = Res_core.parseImplementation engine in + let invalid, diagnostics = + match engine.diagnostics with + | [] as diagnostics -> (false, diagnostics) + | _ as diagnostics -> (true, diagnostics) + in + { + filename = engine.scanner.filename; + source = engine.scanner.src; + parsetree = structure; + diagnostics; + invalid; + comments = List.rev engine.comments; + } + +let parseInterfaceFromSource ~forPrinter ~displayFilename ~source = + let engine = setupFromSource ~displayFilename ~source ~forPrinter () in + let signature = Res_core.parseSpecification engine in + let invalid, diagnostics = + match engine.diagnostics with + | [] as diagnostics -> (false, diagnostics) + | _ as diagnostics -> (true, diagnostics) + in + { + filename = engine.scanner.filename; + source = engine.scanner.src; + parsetree = signature; + diagnostics; + invalid; + comments = List.rev engine.comments; + } + let printEngine = { printImplementation = diff --git a/src/res_driver.mli b/src/res_driver.mli index 9ea21e37..8211487e 100644 --- a/src/res_driver.mli +++ b/src/res_driver.mli @@ -19,6 +19,18 @@ type 'diagnostics parsingEngine = { stringOfDiagnostics: source:string -> filename:string -> 'diagnostics -> unit; } +val parseImplementationFromSource : + forPrinter:bool -> + displayFilename:string -> + source:string -> + (Parsetree.structure, Res_diagnostics.t list) parseResult + +val parseInterfaceFromSource : + forPrinter:bool -> + displayFilename:string -> + source:string -> + (Parsetree.signature, Res_diagnostics.t list) parseResult + type printEngine = { printImplementation: width:int -> From e8daf288352c0c2f692b2ac38fc071b2b9cb5339 Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Mon, 19 Sep 2022 18:41:05 +0200 Subject: [PATCH 2/2] add live attributes to new fns --- src/res_driver.mli | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/res_driver.mli b/src/res_driver.mli index 8211487e..fe44722a 100644 --- a/src/res_driver.mli +++ b/src/res_driver.mli @@ -24,12 +24,14 @@ val parseImplementationFromSource : displayFilename:string -> source:string -> (Parsetree.structure, Res_diagnostics.t list) parseResult + [@@live] val parseInterfaceFromSource : forPrinter:bool -> displayFilename:string -> source:string -> (Parsetree.signature, Res_diagnostics.t list) parseResult + [@@live] type printEngine = { printImplementation: