Import Upstream version 20180207
[hcoop/debian/mlton.git] / mlton / ast / ast-id.fun
CommitLineData
7f918cf1
CE
1(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh
2 * Jagannathan, and Stephen Weeks.
3 * Copyright (C) 1997-2000 NEC Research Institute.
4 *
5 * MLton is released under a BSD-style license.
6 * See the file MLton-LICENSE for details.
7 *)
8
9functor AstId (S: AST_ID_STRUCTS): AST_ID =
10struct
11
12open S
13
14datatype t = T of {name: Symbol.t,
15 region: Region.t}
16
17type obj = t
18type node' = Symbol.t
19
20local
21 fun make f (T r) = f r
22in
23 val name = make #name
24 val region = make #region
25end
26
27val node = name
28(* quell unused warning *)
29val _ = node
30val toSymbol = name
31
32fun makeRegion (s, r) = T {name = s,
33 region = r}
34
35val fromSymbol = makeRegion
36
37fun makeRegion' (s, x, y) =
38 makeRegion (s, Region.make {left = x, right = y})
39(* quell unused warning *)
40val _ = makeRegion'
41
42fun dest (T {name, region, ...}) = (name, region)
43(* quell unused warning *)
44val _ = dest
45
46val bogus = makeRegion (Symbol.bogus, Region.bogus)
47
48fun isAlphaNumeric id =
49 let
50 val c = String.sub (Symbol.toString (name id), 0)
51 in
52 Char.isAlphaNum c orelse c = #"'"
53 end
54
55val isSymbolic = not o isAlphaNumeric
56
57val toString = Symbol.toString o name
58
59val layout = String.layout o toString
60
61(* val left = Region.left o region *)
62(* val right = Region.left o region *)
63
64local
65 fun binary (f: string * string -> 'a) (x :t, y: t): 'a =
66 f (toString x, toString y)
67in
68 val compare = binary String.compare
69end
70
71fun equals (x, x') = Symbol.equals (name x, name x')
72
73val equals = Trace.trace2 ("AstId.equals", layout, layout, Bool.layout) equals
74
75end