Skip to content

Commit 1995eb1

Browse files
committed
make parsing of @deprecated with migration info an experimental feature
1 parent 6b798cc commit 1995eb1

14 files changed

+89
-872
lines changed

compiler/ml/builtin_attributes.ml

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ let cat s1 s2 =
7575

7676
let rec deprecated_of_attrs = function
7777
| [] -> None
78+
| ( {txt = "deprecated"; _},
79+
PStr [{pstr_desc = Pstr_eval ({pexp_desc = Pexp_record _}, _)}] )
80+
:: _ ->
81+
(* Skip record payloads here. `deprecated_of_attrs_with_migrate` should be used if we want to
82+
parse record payloads. *)
83+
None
7884
| ({txt = "ocaml.deprecated" | "deprecated"; _}, p) :: _ ->
7985
Some (string_of_opt_payload p)
8086
| _ :: tl -> deprecated_of_attrs tl
@@ -126,13 +132,18 @@ let rec deprecated_of_attrs_with_migrate = function
126132
| _ :: tl -> deprecated_of_attrs_with_migrate tl
127133

128134
let check_deprecated ?deprecated_context loc attrs s =
129-
match deprecated_of_attrs_with_migrate attrs with
130-
| None -> ()
131-
| Some (txt, migration_template, migration_in_pipe_chain_template) ->
132-
!Cmt_utils.record_deprecated_used
133-
?deprecated_context ?migration_template ?migration_in_pipe_chain_template
134-
loc txt;
135-
Location.deprecated loc (cat s txt)
135+
if Experimental_features.is_enabled DeprecatedMigrations then (
136+
match deprecated_of_attrs_with_migrate attrs with
137+
| None -> ()
138+
| Some (txt, migration_template, migration_in_pipe_chain_template) ->
139+
!Cmt_utils.record_deprecated_used
140+
?deprecated_context ?migration_template
141+
?migration_in_pipe_chain_template loc txt;
142+
Location.deprecated loc (cat s txt))
143+
else
144+
match deprecated_of_attrs attrs with
145+
| None -> ()
146+
| Some txt -> Location.deprecated loc (cat s txt)
136147

137148
let check_deprecated_inclusion ~def ~use loc attrs1 attrs2 s =
138149
match (deprecated_of_attrs attrs1, deprecated_of_attrs attrs2) with

compiler/ml/experimental_features.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
type feature = LetUnwrap
1+
type feature = LetUnwrap | DeprecatedMigrations
22

33
let to_string (f : feature) : string =
44
match f with
55
| LetUnwrap -> "LetUnwrap"
6+
| DeprecatedMigrations -> "DeprecatedMigrations"
67

78
let from_string (s : string) : feature option =
89
match s with
910
| "LetUnwrap" -> Some LetUnwrap
11+
| "DeprecatedMigrations" -> Some DeprecatedMigrations
1012
| _ -> None
1113

1214
module FeatureSet = Set.Make (struct

compiler/ml/experimental_features.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
type feature = LetUnwrap
1+
type feature = LetUnwrap | DeprecatedMigrations
22

33
val enable_from_string : string -> unit
44
val is_enabled : feature -> bool

docs/docson/build-schema.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,10 @@
492492
"LetUnwrap": {
493493
"type": "boolean",
494494
"description": "Enable `let?` syntax."
495+
},
496+
"DeprecatedMigrations": {
497+
"type": "boolean",
498+
"description": "Enable parsing of the `@deprecated` attribute with migration information."
495499
}
496500
},
497501
"additionalProperties": false

rewatch/CompilerConfigurationSpec.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ An object of feature flags to enable experimental compiler behavior. Only suppor
122122
Currently supported features:
123123

124124
- LetUnwrap: Enable `let?` syntax.
125+
- DeprecatedMigrations: Enable parsing of the `@deprecated` attribute with migration information.
125126

126127
### Warnings
127128

rewatch/src/config.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ pub enum DeprecationWarning {
229229
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
230230
pub enum ExperimentalFeature {
231231
LetUnwrap,
232+
DeprecatedMigrations,
232233
}
233234

234235
impl<'de> serde::Deserialize<'de> for ExperimentalFeature {
@@ -248,8 +249,9 @@ impl<'de> serde::Deserialize<'de> for ExperimentalFeature {
248249
{
249250
match v {
250251
"LetUnwrap" => Ok(ExperimentalFeature::LetUnwrap),
252+
"DeprecatedMigrations" => Ok(ExperimentalFeature::DeprecatedMigrations),
251253
other => {
252-
let available = ["LetUnwrap"].join(", ");
254+
let available = ["LetUnwrap", "DeprecatedMigrations"].join(", ");
253255
Err(DeError::custom(format!(
254256
"Unknown experimental feature '{}'. Available features: {}",
255257
other, available
@@ -549,6 +551,7 @@ impl Config {
549551
"-enable-experimental".to_string(),
550552
match feature {
551553
ExperimentalFeature::LetUnwrap => "LetUnwrap",
554+
ExperimentalFeature::DeprecatedMigrations => "DeprecatedMigrations",
552555
}
553556
.to_string(),
554557
]

rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt

Lines changed: 3 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,6 @@
1-
Cleaned 0/113
2-
Parsed 4 source files
3-
Compiled 3 modules
4-
5-
Warning number 3
6-
/packages/new-namespace/src/Other_module.res:1:17-22
7-
8-
1 │ let bla = () => Js.log("bla")
9-
2 │
10-
11-
deprecated: Js.log
12-
Use `Console.log` instead.
13-
14-
15-
Warning number 3
16-
/packages/dep02/src/Array.res:6:16-33
17-
18-
4 │ let at = get
19-
5 │
20-
6 │ let includes = Js.Array2.includes
21-
7 │
22-
8 │ let head = t => t->get(0)
23-
24-
deprecated: Js.Array2.includes
25-
Use `Array.includes` instead.
26-
27-
28-
Warning number 3
29-
/packages/dep02/src/Array.res:24:12-25
30-
31-
22 │ let flatMap = (t, fn) => t->map(fn)->concatMany
32-
23 │
33-
24 │ let mapi = Js.Array2.mapi
34-
25 │
35-
26 │ let flatten = t => t->flatMap(x => x)
36-
37-
deprecated: Js.Array2.mapi
38-
Use `Array.mapWithIndex` instead.
39-
40-
41-
Warning number 3
42-
/packages/dep02/src/Array.res:32:14-29
43-
44-
30 │ let findIndex = (t, fn) => Js.Array.findIndex(fn, t)
45-
31 │
46-
32 │ let filter = Js.Array2.filter
47-
33 │
48-
34 │ let reject = (t, fn) => t->filter(el => !fn(el))
49-
50-
deprecated: Js.Array2.filter
51-
Use `Array.filter` instead.
52-
53-
54-
Warning number 3
55-
/packages/dep02/src/Array.res:48:18-35
56-
57-
46 │
58-
47 │ module String = {
59-
48 │ let joinWith = Js.Array2.joinWith
60-
49 │ let join = joinWith(_, "")
61-
50 │ }
62-
63-
deprecated: Js.Array2.joinWith
64-
Use `Array.joinUnsafe` instead.
65-
66-
1+
Cleaned 0/115
2+
Parsed 2 source files
3+
Compiled 2 modules
674

685
The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version.
696
Use 'dependencies' instead.

rewatch/tests/snapshots/dependency-cycle.txt

Lines changed: 3 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,6 @@
1-
Cleaned 0/110
2-
Parsed 6 source files
3-
Compiled 2 modules
4-
5-
Warning number 3
6-
/packages/new-namespace/src/Other_module.res:1:17-22
7-
8-
1 │ let bla = () => Js.log("bla")
9-
2 │
10-
11-
deprecated: Js.log
12-
Use `Console.log` instead.
13-
14-
15-
Warning number 3
16-
/packages/dep02/src/Array.res:6:16-33
17-
18-
4 │ let at = get
19-
5 │
20-
6 │ let includes = Js.Array2.includes
21-
7 │
22-
8 │ let head = t => t->get(0)
23-
24-
deprecated: Js.Array2.includes
25-
Use `Array.includes` instead.
26-
27-
28-
Warning number 3
29-
/packages/dep02/src/Array.res:24:12-25
30-
31-
22 │ let flatMap = (t, fn) => t->map(fn)->concatMany
32-
23 │
33-
24 │ let mapi = Js.Array2.mapi
34-
25 │
35-
26 │ let flatten = t => t->flatMap(x => x)
36-
37-
deprecated: Js.Array2.mapi
38-
Use `Array.mapWithIndex` instead.
39-
40-
41-
Warning number 3
42-
/packages/dep02/src/Array.res:32:14-29
43-
44-
30 │ let findIndex = (t, fn) => Js.Array.findIndex(fn, t)
45-
31 │
46-
32 │ let filter = Js.Array2.filter
47-
33 │
48-
34 │ let reject = (t, fn) => t->filter(el => !fn(el))
49-
50-
deprecated: Js.Array2.filter
51-
Use `Array.filter` instead.
52-
53-
54-
Warning number 3
55-
/packages/dep02/src/Array.res:48:18-35
56-
57-
46 │
58-
47 │ module String = {
59-
48 │ let joinWith = Js.Array2.joinWith
60-
49 │ let join = joinWith(_, "")
61-
50 │ }
62-
63-
deprecated: Js.Array2.joinWith
64-
Use `Array.joinUnsafe` instead.
65-
66-
1+
Cleaned 0/115
2+
Parsed 1 source files
3+
Compiled 0 modules
674

685
The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version.
696
Use 'dependencies' instead.

rewatch/tests/snapshots/remove-file.txt

Lines changed: 19 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,30 @@
1-
Cleaned 0/110
2-
Parsed 4 source files
3-
Compiled 5 modules
1+
Cleaned 1/115
2+
Parsed 0 source files
3+
Compiled 1 modules
44

5-
Warning number 3
6-
/packages/dep02/src/Array.res:6:16-33
7-
8-
4 │ let at = get
9-
5 │
10-
6 │ let includes = Js.Array2.includes
11-
7 │
12-
8 │ let head = t => t->get(0)
13-
14-
deprecated: Js.Array2.includes
15-
Use `Array.includes` instead.
16-
17-
18-
Warning number 3
19-
/packages/dep02/src/Array.res:24:12-25
20-
21-
22 │ let flatMap = (t, fn) => t->map(fn)->concatMany
22-
23 │
23-
24 │ let mapi = Js.Array2.mapi
24-
25 │
25-
26 │ let flatten = t => t->flatMap(x => x)
26-
27-
deprecated: Js.Array2.mapi
28-
Use `Array.mapWithIndex` instead.
29-
30-
31-
Warning number 3
32-
/packages/dep02/src/Array.res:32:14-29
33-
34-
30 │ let findIndex = (t, fn) => Js.Array.findIndex(fn, t)
35-
31 │
36-
32 │ let filter = Js.Array2.filter
37-
33 │
38-
34 │ let reject = (t, fn) => t->filter(el => !fn(el))
39-
40-
deprecated: Js.Array2.filter
41-
Use `Array.filter` instead.
42-
43-
44-
Warning number 3
45-
/packages/dep02/src/Array.res:48:18-35
46-
47-
46 │
48-
47 │ module String = {
49-
48 │ let joinWith = Js.Array2.joinWith
50-
49 │ let join = joinWith(_, "")
51-
50 │ }
52-
53-
deprecated: Js.Array2.joinWith
54-
Use `Array.joinUnsafe` instead.
55-
56-
57-
Warning number 3
58-
/packages/new-namespace/src/Other_module.res:1:17-22
59-
60-
1 │ let bla = () => Js.log("bla")
61-
2 │
5+
The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version.
6+
Use 'dependencies' instead.
627

63-
deprecated: Js.log
64-
Use `Console.log` instead.
8+
The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version.
9+
Use 'dev-dependencies' instead.
6510

11+
The field 'bsc-flags' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version.
12+
Use 'compiler-flags' instead.
6613

67-
Warning number 3
68-
/packages/dep01/src/Dep01.res:2:9-14
14+
We've found a bug for you!
15+
/packages/dep01/src/Dep01.res:3:9-17
6916

7017
1 │ let log = () => {
71-
2 │ Js.log("02")
72-
3 │ Dep02.log()
18+
2 │ Js.log("02")
19+
3 │ Dep02.log()
7320
4 │ }
74-
75-
deprecated: Js.log
76-
Use `Console.log` instead.
77-
78-
79-
Warning number 3
80-
/packages/main/src/Main.res:1:1-6
81-
82-
1 │ Js.log("01")
83-
2 │ Dep01.log()
84-
3 │
85-
86-
deprecated: Js.log
87-
Use `Console.log` instead.
88-
89-
90-
Warning number 3
91-
/packages/main/src/Main.res:4:1-6
92-
93-
2 │ Dep01.log()
94-
3 │
95-
4 │ Js.log(InternalDep.value)
9621
5 │
97-
6 │ module Array = Belt.Array
98-
99-
deprecated: Js.log
100-
Use `Console.log` instead.
101-
10222

23+
The module or file Dep02 can't be found.
24+
- If it's a third-party dependency:
25+
- Did you add it to the "dependencies" or "dev-dependencies" in rescript.json?
26+
- Did you include the file's directory to the "sources" in rescript.json?
27+
10328

104-
The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version.
105-
Use 'dependencies' instead.
106-
107-
The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version.
108-
Use 'dev-dependencies' instead.
10929

110-
The field 'bsc-flags' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version.
111-
Use 'compiler-flags' instead.
30+
Incremental build failed. Error:  Failed to Compile. See Errors Above

0 commit comments

Comments
 (0)