package visitors
An OCaml syntax extension for generating visitor classes
Install
Dune Dependency
Authors
Maintainers
Sources
archive.tar.gz
md5=80fc467552d944dcae0c5d7895cfba64
sha512=42522af2845fab409cdf0766cce83ac1345e0169248252ad74da2d72eefdb5d846dff2ece566667b9d80a8db57dabdbf333c32c50fef9c39f7837e78b3476b5b
doc/src/ppx_deriving_visitors/VisitorsCompatibility.ml.html
Source file VisitorsCompatibility.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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
let mknoloc = Location.mknoloc open Ppxlib open Asttypes open Parsetree open Ast_helper (* OCaml's abstract syntax tree evolves with time. We depend on this tree because we analyze it (that is, we analyze type definitions) and because we construct it (that is, we generate code). This module was initially created to gather the ugly bits whose definition varies depending on the version of OCaml that we are working with. That said, since we have switched to using ppxlib, my understanding is that we always work with the latest version of the AST. More precisely, the version of the AST that we get no longer depends on which OCaml compiler we are using; it depends on which version of ppxlib we are using. At the time of writing, we depend on ppxlib 0.9.0 or newer, which implies that we get an AST for OCaml 4.08 or newer. See https://github.com/ocaml-ppx/ppxlib/blob/master/CHANGES.md *) (* Constructing an arrow type. *) let ty_arrow (a : core_type) (b : core_type) : core_type = Typ.arrow Nolabel a b (* Constructing a function. *) let plambda (p : pattern) (e : expression) : expression = Exp.fun_ Nolabel None p e (* [ld_label] and [ld_ty] extract a label and type out of an OCaml record label declaration. *) let ld_label (ld : label_declaration) : label = ld.pld_name.txt let ld_labels = List.map ld_label let ld_ty (ld : label_declaration) : core_type = ld.pld_type let ld_tys = List.map ld_ty (* Between OCaml 4.04 and OCaml 4.05, the types of several functions in [Ast_helper] have changed. They used to take arguments of type [string], and now take arguments of type [str], thus requiring a conversion. These functions include [Typ.object_], [Typ.poly], [Exp.send], [Exp.newtype], [Ctf.val_], [Ctf.method_], [Cf.inherit_]. *) type str = string Location.loc let string2str (s : string) : str = mknoloc s let str2string (s : str) : string = s.txt let typ_poly (tyvars : string list) (cty : core_type) : core_type = (* OCaml 5.3 does not allow [Typ.poly] to be applied to an empty list of universal quantifiers. *) match tyvars with | [] -> cty | _ :: _ -> Typ.poly (List.map string2str tyvars) cty let exp_send (e : expression) (m : string) : expression = Exp.send e (string2str m) (* In the data constructor [Ptyp_poly (qs, ty)], the type of [qs] has changed from [string list] to [string loc list] between OCaml 4.04 and 4.05. See commit b0e880c448c78ed0cedff28356fcaf88f1436eef. The function [quantifiers] compensates for this. *) let quantifiers qs : string list = List.map str2string qs (* In the data constructor [Ptyp_object (methods, _)], the type of [methods] has changed from [(string loc * attributes * core_type) list] in OCaml 4.05 to [object_field list] in OCaml 4.06. *) let object_field_to_core_type (field : object_field) : core_type = match field.pof_desc with | Otag (_, ty) -> ty | Oinherit ty -> ty (* this may seem nonsensical, but (so far) is used only in the function [occurs_type], where we do not care what the types mean *) let row_field_to_core_types (field : row_field) : core_type list = match field.prf_desc with | Rtag (_, _, tys) -> tys | Rinherit ty -> [ ty ] (* -------------------------------------------------------------------------- *) (* [floating s items] produces a floating attribute whose name is [s] and whose payload is the list of structure items [items]. *) (* The type [attribute] is defined in 4.07 as [string loc * payload], but in 4.08 its definition changes to a record type and the function [Attr.mk] appears. *) let floating (s : string) (items : structure) : structure_item = let name = mknoloc s and payload = PStr items in Str.attribute (Attr.mk name payload)
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>