package embedded_ocaml_templates

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file ppx_eml.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
module Parser_ = Parser
open Ppxlib

(* Not present before 4.11 *)
let set_position lexbuf position =
  Lexing.(
    lexbuf.lex_curr_p <- {position with pos_fname= lexbuf.lex_curr_p.pos_fname} ;
    lexbuf.lex_abs_pos <- position.pos_cnum )

let name = "eml"

let expand ~loc:_ ~path:_ (s : string) loc _delim =
  let startpos = loc.loc_start in
  (* let startpos = {loc.loc_start with pos_lnum= loc.loc_start.pos_lnum - 1} in *)
  match Common.Template_builder.of_string ~startpos s with
  | Error e ->
      Common.Lexer.pp_error Format.err_formatter e ;
      exit 1
  | Ok template ->
      let code = Common.Compile.compile_to_string template in
      (* print_endline code ; *)
      let buffer = Lexing.from_string code in
      set_position buffer loc.loc_start ;
      Parser_.parse_expression Lexer.token buffer
      |> Selected_ast.Of_ocaml.copy_expression

let ext =
  Extension.declare name Extension.Context.expression
    Ast_pattern.(single_expr_payload (pexp_constant (pconst_string __ __ __)))
    expand

let () = Ppxlib.Driver.register_transformation name ~extensions:[ext]
OCaml

Innovation. Community. Security.