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..fe44722a 100644 --- a/src/res_driver.mli +++ b/src/res_driver.mli @@ -19,6 +19,20 @@ 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 + [@@live] + +val parseInterfaceFromSource : + forPrinter:bool -> + displayFilename:string -> + source:string -> + (Parsetree.signature, Res_diagnostics.t list) parseResult + [@@live] + type printEngine = { printImplementation: width:int ->