Skip to content

Commit 357436e

Browse files
committed
Variants and records.
1 parent a56cea9 commit 357436e

File tree

3 files changed

+35
-9
lines changed

3 files changed

+35
-9
lines changed

analysis/src/Actions.ml

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,41 @@ let posInLoc ~pos ~loc =
22
Utils.tupleOfLexing loc.Location.loc_start <= pos
33
&& pos < Utils.tupleOfLexing loc.loc_end
44

5+
let rec listToPat ~itemToPat = function
6+
| [] -> Some []
7+
| x :: xList -> (
8+
match (itemToPat x, listToPat ~itemToPat xList) with
9+
| Some p, Some pList -> Some (p :: pList)
10+
| _ -> None)
11+
512
let rec expToPat (exp : Parsetree.expression) =
613
let mkPat ppat_desc =
714
Ast_helper.Pat.mk ~loc:exp.pexp_loc ~attrs:exp.pexp_attributes ppat_desc
815
in
916
match exp.pexp_desc with
10-
| Pexp_construct (lid, None) ->
11-
Some (mkPat (Parsetree.Ppat_construct (lid, None)))
17+
| Pexp_construct (lid, None) -> Some (mkPat (Ppat_construct (lid, None)))
1218
| Pexp_construct (lid, Some e1) -> (
1319
match expToPat e1 with
1420
| None -> None
15-
| Some p1 -> Some (mkPat (Parsetree.Ppat_construct (lid, Some p1))))
16-
| Pexp_constant c -> Some (mkPat (Parsetree.Ppat_constant c))
21+
| Some p1 -> Some (mkPat (Ppat_construct (lid, Some p1))))
22+
| Pexp_variant (label, None) -> Some (mkPat (Ppat_variant (label, None)))
23+
| Pexp_variant (label, Some e1) -> (
24+
match expToPat e1 with
25+
| None -> None
26+
| Some p1 -> Some (mkPat (Ppat_variant (label, Some p1))))
27+
| Pexp_constant c -> Some (mkPat (Ppat_constant c))
28+
| Pexp_tuple eList -> (
29+
match listToPat ~itemToPat:expToPat eList with
30+
| None -> None
31+
| Some patList -> Some (mkPat (Ppat_tuple patList)))
32+
| Pexp_record (items, None) -> (
33+
let itemToPat (x, e) =
34+
match expToPat e with None -> None | Some p -> Some (x, p)
35+
in
36+
match listToPat ~itemToPat items with
37+
| None -> None
38+
| Some patItems -> Some (mkPat (Ppat_record (patItems, Closed))))
39+
| Pexp_record (_, Some _) -> None
1740
| _ -> None
1841

1942
let mkMapper ~pos ~changed =

analysis/tests/src/Actions.res

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
type kind = First | Second | Third
2+
type r = {name: string, age: int}
23

34
let _ = (kind, kindStr) => {
45
let _ifThenElse = if kind == First {
@@ -8,6 +9,6 @@ let _ = (kind, kindStr) => {
89
"Not First"
910
}
1011

11-
let _ternary = "First" != kindStr ? "Not First" : "First"
12+
let _ternary = #kind("First", {name: "abc", age: 3}) != kindStr ? "Not First" : "First"
1213
// ^act
1314
}

analysis/tests/src/expected/Actions.res.txt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
Actions tests/src/Actions.res 3:10
1+
Actions tests/src/Actions.res 4:10
22
Hit _ifThenElse
33
Formatted:
44
type kind = First | Second | Third
5+
type r = {name: string, age: int}
56

67
let _ = (kind, kindStr) => {
78
let _ifThenElse = switch kind {
@@ -10,14 +11,15 @@ let _ = (kind, kindStr) => {
1011
| _ => "Not First"
1112
}
1213

13-
let _ternary = "First" != kindStr ? "Not First" : "First"
14+
let _ternary = #kind("First", {name: "abc", age: 3}) != kindStr ? "Not First" : "First"
1415
// ^act
1516
}
1617

17-
Actions tests/src/Actions.res 10:9
18+
Actions tests/src/Actions.res 11:9
1819
Hit _ternary
1920
Formatted:
2021
type kind = First | Second | Third
22+
type r = {name: string, age: int}
2123

2224
let _ = (kind, kindStr) => {
2325
let _ifThenElse = if kind == First {
@@ -28,7 +30,7 @@ let _ = (kind, kindStr) => {
2830
}
2931

3032
let _ternary = switch kindStr {
31-
| "First" => "First"
33+
| #kind("First", {name: "abc", age: 3}) => "First"
3234
| _ => "Not First"
3335
}
3436
// ^act

0 commit comments

Comments
 (0)