package stdint-literals

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

Source file stdint_literals.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
33
34
35
36
37
open Ppxlib

let rewriter kind loc s =
  let number = Ast_builder.Default.pexp_constant ~loc
      (Parsetree.Pconst_integer (s, None)) in
  [%expr [%e (kind loc)] [%e number]]

module Converter = struct
  let u8 loc = [%expr Stdint.Uint8.of_int]
  let u16 loc = [%expr Stdint.Uint16.of_int]
  let u32 loc = [%expr Stdint.Uint32.of_int]
  let u64 loc = [%expr Stdint.Uint64.of_int]
  let u128 loc = [%expr Stdint.Uint128.of_int]
  let s8 loc = [%expr Stdint.Int8.of_int]
  let s16 loc = [%expr Stdint.Int16.of_int]
  let s128 loc = [%expr Stdint.Int128.of_int]
end

module Rule = struct
  let patterns = Converter.[
      ('u', u8);
      ('U', u16);
      ('i', u32);
      ('I', u64);
      ('w', u128);
      ('s', s8);
      ('S', s16);
      ('W', s128)
    ]

  let rule_of_pattern (ch, conv) =
    Ppxlib.Context_free.Rule.(constant Constant_kind.Integer ch (rewriter conv))

  let all = List.map rule_of_pattern patterns
end

let () = Driver.register_transformation ~rules:Rule.all "Constant rewriting"
OCaml

Innovation. Community. Security.