Skip to content

Commit 7cfb1fa

Browse files
authored
Support @dead and @live annotations on inline records. (#859)
* Support `@dead` and `@live` annotations on inline records. * Toplevel attributes propagated to inline records. * Attributes on variant case propagate to inline records.
1 parent d850def commit 7cfb1fa

File tree

4 files changed

+42
-7
lines changed

4 files changed

+42
-7
lines changed

analysis/reanalyze/examples/deadcode/expected/deadcode.txt

+18-2
Original file line numberDiff line numberDiff line change
@@ -256,15 +256,23 @@
256256
addRecordLabelDeclaration IR.a DeadTest.res:182:24 path:+DeadTest.inlineRecord
257257
addRecordLabelDeclaration IR.b DeadTest.res:182:32 path:+DeadTest.inlineRecord
258258
addRecordLabelDeclaration IR.c DeadTest.res:182:40 path:+DeadTest.inlineRecord
259+
addRecordLabelDeclaration IR.d DeadTest.res:182:51 path:+DeadTest.inlineRecord
260+
addRecordLabelDeclaration IR.e DeadTest.res:182:65 path:+DeadTest.inlineRecord
259261
addVariantCaseDeclaration IR DeadTest.res:182:20 path:+DeadTest.inlineRecord
260262
addValueDeclaration +_ DeadTest.res:185:0 path:+DeadTest
261263
addTypeReference DeadTest.res:187:20 --> DeadTest.res:182:20
262264
addValueReference DeadTest.res:187:27 --> DeadTest.res:184:4
263265
addTypeReference DeadTest.res:187:35 --> DeadTest.res:182:32
264266
addValueReference DeadTest.res:187:35 --> DeadTest.res:187:7
265-
addValueReference DeadTest.res:187:43 --> DeadTest.res:187:8
267+
addValueReference DeadTest.res:187:40 --> DeadTest.res:187:8
266268
addTypeReference DeadTest.res:187:7 --> DeadTest.res:182:40
267269
addValueReference DeadTest.res:186:9 --> DeadTest.res:185:8
270+
addRecordLabelDeclaration IR2.a DeadTest.res:191:26 path:+DeadTest.inlineRecord2
271+
addRecordLabelDeclaration IR2.b DeadTest.res:191:34 path:+DeadTest.inlineRecord2
272+
addVariantCaseDeclaration IR2 DeadTest.res:191:21 path:+DeadTest.inlineRecord2
273+
addRecordLabelDeclaration IR3.a DeadTest.res:193:34 path:+DeadTest.inlineRecord3
274+
addRecordLabelDeclaration IR3.b DeadTest.res:193:42 path:+DeadTest.inlineRecord3
275+
addVariantCaseDeclaration IR3 DeadTest.res:193:21 path:+DeadTest.inlineRecord3
268276
addValueReference DeadTest.res:28:2 --> DeadTest.res:31:6
269277
addValueReference DeadTest.res:36:2 --> DeadTest.res:39:6
270278
addValueReference DeadTest.res:60:2 --> DeadTest.res:64:6
@@ -2024,8 +2032,16 @@ File References
20242032
Live VariantCase DeadRT.moduleAccessPath.Root: 1 references (DeadTest.res:106:16) [1]
20252033
Live VariantCase +DeadRT.moduleAccessPath.Root: 1 references (DeadRT.resi:2:2) [0]
20262034
Live VariantCase DeadRT.moduleAccessPath.Kaboom: 1 references (DeadRT.res:3:2) [0]
2035+
Dead RecordLabel +DeadTest.inlineRecord3.IR3.b: 0 references () [0]
2036+
Dead RecordLabel +DeadTest.inlineRecord3.IR3.a: 0 references () [0]
2037+
Dead VariantCase +DeadTest.inlineRecord3.IR3: 0 references () [0]
2038+
Dead RecordLabel +DeadTest.inlineRecord2.IR2.b: 0 references () [0]
2039+
Dead RecordLabel +DeadTest.inlineRecord2.IR2.a: 0 references () [0]
2040+
Dead VariantCase +DeadTest.inlineRecord2.IR2: 0 references () [0]
20272041
Dead Value +DeadTest.+_: 0 references () [0]
20282042
Live Value +DeadTest.+ira: 1 references (DeadTest.res:187:27) [0]
2043+
Live RecordLabel +DeadTest.inlineRecord.IR.e: 0 references () [0]
2044+
Dead RecordLabel +DeadTest.inlineRecord.IR.d: 0 references () [0]
20292045
Live RecordLabel +DeadTest.inlineRecord.IR.c: 1 references (DeadTest.res:187:7) [0]
20302046
Live RecordLabel +DeadTest.inlineRecord.IR.b: 1 references (DeadTest.res:187:35) [0]
20312047
Dead RecordLabel +DeadTest.inlineRecord.IR.a: 0 references () [0]
@@ -3113,7 +3129,7 @@ File References
31133129
DeadTest.res:182:25-30
31143130
inlineRecord.IR.a is a record label never used to read a value
31153131
<-- line 182
3116-
type inlineRecord = IR({@dead("inlineRecord.IR.a") a: int, b: int, c: string})
3132+
type inlineRecord = IR({@dead("inlineRecord.IR.a") a: int, b: int, c: string, @dead d: int, @live e: int})
31173133

31183134
Warning Dead Module
31193135
DeadTestBlacklist.res:0:1

analysis/reanalyze/examples/deadcode/src/DeadTest.res

+7-2
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,15 @@ let deadIncorrect = 34
179179

180180
let _ = deadIncorrect
181181

182-
type inlineRecord = IR({a: int, b: int, c: string})
182+
type inlineRecord = IR({a: int, b: int, c: string, @dead d: int, @live e: int})
183183

184184
let ira = 10
185185
let _ = ir =>
186186
switch ir {
187-
| IR({c} as r) => IR({a: ira, b: r.b, c: c})
187+
| IR({c} as r) => IR({a: ira, b: r.b, c, d: 0, e: 0})
188188
}
189+
190+
@dead
191+
type inlineRecord2 = IR2({a: int, b: int})
192+
193+
type inlineRecord3 = | @dead IR3({a: int, b: int})

analysis/reanalyze/src/DeadCommon.ml

+15-1
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,22 @@ module ProcessDeadAnnotations = struct
266266
| Ttype_variant constructorDeclarations ->
267267
constructorDeclarations
268268
|> List.iter
269-
(fun ({cd_attributes; cd_loc} : Typedtree.constructor_declaration)
269+
(fun
270+
({cd_attributes; cd_loc; cd_args} :
271+
Typedtree.constructor_declaration)
270272
->
273+
let _process_inline_records =
274+
match cd_args with
275+
| Cstr_record flds ->
276+
List.iter
277+
(fun ({ld_attributes; ld_loc} :
278+
Typedtree.label_declaration) ->
279+
toplevelAttrs @ cd_attributes @ ld_attributes
280+
|> processAttributes ~doGenType:false ~name:""
281+
~pos:ld_loc.loc_start)
282+
flds
283+
| Cstr_tuple _ -> ()
284+
in
271285
toplevelAttrs @ cd_attributes
272286
|> processAttributes ~doGenType:false ~name:""
273287
~pos:cd_loc.loc_start)

analysis/src/SharedTypes.ml

+2-2
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ module Module = struct
134134
docstring: string list;
135135
exported: Exported.t;
136136
items: item list;
137-
deprecated: string option
137+
deprecated: string option;
138138
}
139139

140140
and t = Ident of Path.t | Structure of structure | Constraint of t * t
@@ -259,7 +259,7 @@ module File = struct
259259
docstring = [];
260260
exported = Exported.init ();
261261
items = [];
262-
deprecated = None
262+
deprecated = None;
263263
};
264264
}
265265
end

0 commit comments

Comments
 (0)