String_with_vars: represent quoted vars differently from unquoted ones
Define the representation for quoted variables, adapt the test of strings made of a single variable, and add a constructor. [String_with_vars.t] is not yet able to use that representation because the necessary information is not available from the parser.
This commit is contained in:
parent
3e2dc2517d
commit
e8e3698e15
|
@ -363,7 +363,7 @@ module Unexpanded = struct
|
||||||
let expand ~generic ~special ~map ~dir ~f = function
|
let expand ~generic ~special ~map ~dir ~f = function
|
||||||
| Inl x -> map x
|
| Inl x -> map x
|
||||||
| Inr template as x ->
|
| Inr template as x ->
|
||||||
match SW.just_a_var template with
|
match SW.unquoted_var template with
|
||||||
| None -> generic ~dir (string ~dir ~f x)
|
| None -> generic ~dir (string ~dir ~f x)
|
||||||
| Some var ->
|
| Some var ->
|
||||||
match f (SW.loc template) var with
|
match f (SW.loc template) var with
|
||||||
|
@ -452,7 +452,7 @@ module Unexpanded = struct
|
||||||
| Some e -> Some (VE.to_string ~dir e))
|
| Some e -> Some (VE.to_string ~dir e))
|
||||||
|
|
||||||
let expand ~generic ~special ~dir ~f template =
|
let expand ~generic ~special ~dir ~f template =
|
||||||
match SW.just_a_var template with
|
match SW.unquoted_var template with
|
||||||
| None -> begin
|
| None -> begin
|
||||||
match string ~dir ~f template with
|
match string ~dir ~f template with
|
||||||
| Inl x -> Inl (generic ~dir x)
|
| Inl x -> Inl (generic ~dir x)
|
||||||
|
|
|
@ -6,6 +6,8 @@ type item =
|
||||||
| Text of string
|
| Text of string
|
||||||
| Var of var_syntax * string
|
| Var of var_syntax * string
|
||||||
|
|
||||||
|
(* A single unquoted variable is encoded as the list [Var v]. A
|
||||||
|
quoted variable is encoded as [Var v; Text ""]. *)
|
||||||
type t =
|
type t =
|
||||||
{ items : item list
|
{ items : item list
|
||||||
; loc : Loc.t
|
; loc : Loc.t
|
||||||
|
@ -67,9 +69,11 @@ let loc t = t.loc
|
||||||
|
|
||||||
let virt pos s = of_string ~loc:(Loc.of_pos pos) s
|
let virt pos s = of_string ~loc:(Loc.of_pos pos) s
|
||||||
let virt_var pos s = { loc = Loc.of_pos pos; items = [Var (Braces, s)] }
|
let virt_var pos s = { loc = Loc.of_pos pos; items = [Var (Braces, s)] }
|
||||||
|
let virt_quoted_var pos s = { loc = Loc.of_pos pos;
|
||||||
|
items = [Var (Braces, s); Text ""] }
|
||||||
let virt_text pos s = { loc = Loc.of_pos pos; items = [Text s] }
|
let virt_text pos s = { loc = Loc.of_pos pos; items = [Text s] }
|
||||||
|
|
||||||
let just_a_var t =
|
let unquoted_var t =
|
||||||
match t.items with
|
match t.items with
|
||||||
| [Var (_, s)] -> Some s
|
| [Var (_, s)] -> Some s
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
|
@ -21,12 +21,13 @@ val to_string : t -> string
|
||||||
(** [t] generated by the OCaml code. The first argument should be
|
(** [t] generated by the OCaml code. The first argument should be
|
||||||
[__POS__]. The second is either a string to parse, a variable name
|
[__POS__]. The second is either a string to parse, a variable name
|
||||||
or plain text. *)
|
or plain text. *)
|
||||||
val virt : (string * int * int * int) -> string -> t
|
val virt : (string * int * int * int) -> string -> t
|
||||||
val virt_var : (string * int * int * int) -> string -> t
|
val virt_var : (string * int * int * int) -> string -> t
|
||||||
val virt_text : (string * int * int * int) -> string -> t
|
val virt_quoted_var : (string * int * int * int) -> string -> t
|
||||||
|
val virt_text : (string * int * int * int) -> string -> t
|
||||||
|
|
||||||
val just_a_var : t -> string option
|
val unquoted_var : t -> string option
|
||||||
(** [just_a_var t] return the [Some name] where [name] is the name of
|
(** [unquoted_var t] return the [Some name] where [name] is the name of
|
||||||
the variable if [t] is solely made of a variable and [None] otherwise. *)
|
the variable if [t] is solely made of a variable and [None] otherwise. *)
|
||||||
|
|
||||||
val vars : t -> String_set.t
|
val vars : t -> String_set.t
|
||||||
|
|
Loading…
Reference in New Issue