From 057efec4982116abffec8e93184295a5a2920458 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 6 Dec 2023 13:43:50 +0100 Subject: [PATCH 1/3] Support `@dead` and `@live` annotations on inline records. --- .../examples/deadcode/expected/deadcode.txt | 6 +++++- .../reanalyze/examples/deadcode/src/DeadTest.res | 4 ++-- analysis/reanalyze/src/DeadCommon.ml | 16 +++++++++++++++- analysis/src/SharedTypes.ml | 4 ++-- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/analysis/reanalyze/examples/deadcode/expected/deadcode.txt b/analysis/reanalyze/examples/deadcode/expected/deadcode.txt index 1f9234d89..28e5dd9c0 100644 --- a/analysis/reanalyze/examples/deadcode/expected/deadcode.txt +++ b/analysis/reanalyze/examples/deadcode/expected/deadcode.txt @@ -256,6 +256,8 @@ addRecordLabelDeclaration IR.a DeadTest.res:182:24 path:+DeadTest.inlineRecord addRecordLabelDeclaration IR.b DeadTest.res:182:32 path:+DeadTest.inlineRecord addRecordLabelDeclaration IR.c DeadTest.res:182:40 path:+DeadTest.inlineRecord + addRecordLabelDeclaration IR.d DeadTest.res:182:51 path:+DeadTest.inlineRecord + addRecordLabelDeclaration IR.e DeadTest.res:182:65 path:+DeadTest.inlineRecord addVariantCaseDeclaration IR DeadTest.res:182:20 path:+DeadTest.inlineRecord addValueDeclaration +_ DeadTest.res:185:0 path:+DeadTest addTypeReference DeadTest.res:187:20 --> DeadTest.res:182:20 @@ -2026,6 +2028,8 @@ File References Live VariantCase DeadRT.moduleAccessPath.Kaboom: 1 references (DeadRT.res:3:2) [0] Dead Value +DeadTest.+_: 0 references () [0] Live Value +DeadTest.+ira: 1 references (DeadTest.res:187:27) [0] + Live RecordLabel +DeadTest.inlineRecord.IR.e: 0 references () [0] + Dead RecordLabel +DeadTest.inlineRecord.IR.d: 0 references () [0] Live RecordLabel +DeadTest.inlineRecord.IR.c: 1 references (DeadTest.res:187:7) [0] Live RecordLabel +DeadTest.inlineRecord.IR.b: 1 references (DeadTest.res:187:35) [0] Dead RecordLabel +DeadTest.inlineRecord.IR.a: 0 references () [0] @@ -3113,7 +3117,7 @@ File References DeadTest.res:182:25-30 inlineRecord.IR.a is a record label never used to read a value <-- line 182 - type inlineRecord = IR({@dead("inlineRecord.IR.a") a: int, b: int, c: string}) + type inlineRecord = IR({@dead("inlineRecord.IR.a") a: int, b: int, c: string, @dead d: int, @live e: int}) Warning Dead Module DeadTestBlacklist.res:0:1 diff --git a/analysis/reanalyze/examples/deadcode/src/DeadTest.res b/analysis/reanalyze/examples/deadcode/src/DeadTest.res index a9b7247e7..ab40adf2d 100644 --- a/analysis/reanalyze/examples/deadcode/src/DeadTest.res +++ b/analysis/reanalyze/examples/deadcode/src/DeadTest.res @@ -179,10 +179,10 @@ let deadIncorrect = 34 let _ = deadIncorrect -type inlineRecord = IR({a: int, b: int, c: string}) +type inlineRecord = IR({a: int, b: int, c: string, @dead d: int, @live e: int}) let ira = 10 let _ = ir => switch ir { - | IR({c} as r) => IR({a: ira, b: r.b, c: c}) + | IR({c} as r) => IR({a: ira, b: r.b, c: c, d: 0, e: 0}) } diff --git a/analysis/reanalyze/src/DeadCommon.ml b/analysis/reanalyze/src/DeadCommon.ml index fd8486fee..590d7b334 100644 --- a/analysis/reanalyze/src/DeadCommon.ml +++ b/analysis/reanalyze/src/DeadCommon.ml @@ -266,8 +266,22 @@ module ProcessDeadAnnotations = struct | Ttype_variant constructorDeclarations -> constructorDeclarations |> List.iter - (fun ({cd_attributes; cd_loc} : Typedtree.constructor_declaration) + (fun + ({cd_attributes; cd_loc; cd_args} : + Typedtree.constructor_declaration) -> + let _process_inline_records = + match cd_args with + | Cstr_record flds -> + List.iter + (fun ({ld_attributes; ld_loc} : + Typedtree.label_declaration) -> + ld_attributes + |> processAttributes ~doGenType:false ~name:"" + ~pos:ld_loc.loc_start) + flds + | Cstr_tuple _ -> () + in toplevelAttrs @ cd_attributes |> processAttributes ~doGenType:false ~name:"" ~pos:cd_loc.loc_start) diff --git a/analysis/src/SharedTypes.ml b/analysis/src/SharedTypes.ml index e975c6264..a32576e2c 100644 --- a/analysis/src/SharedTypes.ml +++ b/analysis/src/SharedTypes.ml @@ -134,7 +134,7 @@ module Module = struct docstring: string list; exported: Exported.t; items: item list; - deprecated: string option + deprecated: string option; } and t = Ident of Path.t | Structure of structure | Constraint of t * t @@ -259,7 +259,7 @@ module File = struct docstring = []; exported = Exported.init (); items = []; - deprecated = None + deprecated = None; }; } end From fbd32f6b1854c6cca816c9947a36a48cef4b43fd Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 6 Dec 2023 13:48:45 +0100 Subject: [PATCH 2/3] Toplevel attributes propagated to inline records. --- .../reanalyze/examples/deadcode/expected/deadcode.txt | 8 +++++++- analysis/reanalyze/examples/deadcode/src/DeadTest.res | 5 ++++- analysis/reanalyze/src/DeadCommon.ml | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/analysis/reanalyze/examples/deadcode/expected/deadcode.txt b/analysis/reanalyze/examples/deadcode/expected/deadcode.txt index 28e5dd9c0..08a1a8eea 100644 --- a/analysis/reanalyze/examples/deadcode/expected/deadcode.txt +++ b/analysis/reanalyze/examples/deadcode/expected/deadcode.txt @@ -264,9 +264,12 @@ addValueReference DeadTest.res:187:27 --> DeadTest.res:184:4 addTypeReference DeadTest.res:187:35 --> DeadTest.res:182:32 addValueReference DeadTest.res:187:35 --> DeadTest.res:187:7 - addValueReference DeadTest.res:187:43 --> DeadTest.res:187:8 + addValueReference DeadTest.res:187:40 --> DeadTest.res:187:8 addTypeReference DeadTest.res:187:7 --> DeadTest.res:182:40 addValueReference DeadTest.res:186:9 --> DeadTest.res:185:8 + addRecordLabelDeclaration IR2.a DeadTest.res:191:26 path:+DeadTest.inlineRecord2 + addRecordLabelDeclaration IR2.b DeadTest.res:191:34 path:+DeadTest.inlineRecord2 + addVariantCaseDeclaration IR2 DeadTest.res:191:21 path:+DeadTest.inlineRecord2 addValueReference DeadTest.res:28:2 --> DeadTest.res:31:6 addValueReference DeadTest.res:36:2 --> DeadTest.res:39:6 addValueReference DeadTest.res:60:2 --> DeadTest.res:64:6 @@ -2026,6 +2029,9 @@ File References Live VariantCase DeadRT.moduleAccessPath.Root: 1 references (DeadTest.res:106:16) [1] Live VariantCase +DeadRT.moduleAccessPath.Root: 1 references (DeadRT.resi:2:2) [0] Live VariantCase DeadRT.moduleAccessPath.Kaboom: 1 references (DeadRT.res:3:2) [0] + Dead RecordLabel +DeadTest.inlineRecord2.IR2.b: 0 references () [0] + Dead RecordLabel +DeadTest.inlineRecord2.IR2.a: 0 references () [0] + Dead VariantCase +DeadTest.inlineRecord2.IR2: 0 references () [0] Dead Value +DeadTest.+_: 0 references () [0] Live Value +DeadTest.+ira: 1 references (DeadTest.res:187:27) [0] Live RecordLabel +DeadTest.inlineRecord.IR.e: 0 references () [0] diff --git a/analysis/reanalyze/examples/deadcode/src/DeadTest.res b/analysis/reanalyze/examples/deadcode/src/DeadTest.res index ab40adf2d..434b6db5b 100644 --- a/analysis/reanalyze/examples/deadcode/src/DeadTest.res +++ b/analysis/reanalyze/examples/deadcode/src/DeadTest.res @@ -184,5 +184,8 @@ type inlineRecord = IR({a: int, b: int, c: string, @dead d: int, @live e: int}) let ira = 10 let _ = ir => switch ir { - | IR({c} as r) => IR({a: ira, b: r.b, c: c, d: 0, e: 0}) + | IR({c} as r) => IR({a: ira, b: r.b, c, d: 0, e: 0}) } + +@dead +type inlineRecord2 = IR2({a: int, b: int}) diff --git a/analysis/reanalyze/src/DeadCommon.ml b/analysis/reanalyze/src/DeadCommon.ml index 590d7b334..100f4a982 100644 --- a/analysis/reanalyze/src/DeadCommon.ml +++ b/analysis/reanalyze/src/DeadCommon.ml @@ -276,7 +276,7 @@ module ProcessDeadAnnotations = struct List.iter (fun ({ld_attributes; ld_loc} : Typedtree.label_declaration) -> - ld_attributes + toplevelAttrs @ ld_attributes |> processAttributes ~doGenType:false ~name:"" ~pos:ld_loc.loc_start) flds From e521ec63f6202a5e0f044584385812126e7b67f1 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 6 Dec 2023 13:51:13 +0100 Subject: [PATCH 3/3] Attributes on variant case propagate to inline records. --- analysis/reanalyze/examples/deadcode/expected/deadcode.txt | 6 ++++++ analysis/reanalyze/examples/deadcode/src/DeadTest.res | 2 ++ analysis/reanalyze/src/DeadCommon.ml | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/analysis/reanalyze/examples/deadcode/expected/deadcode.txt b/analysis/reanalyze/examples/deadcode/expected/deadcode.txt index 08a1a8eea..9296b5944 100644 --- a/analysis/reanalyze/examples/deadcode/expected/deadcode.txt +++ b/analysis/reanalyze/examples/deadcode/expected/deadcode.txt @@ -270,6 +270,9 @@ addRecordLabelDeclaration IR2.a DeadTest.res:191:26 path:+DeadTest.inlineRecord2 addRecordLabelDeclaration IR2.b DeadTest.res:191:34 path:+DeadTest.inlineRecord2 addVariantCaseDeclaration IR2 DeadTest.res:191:21 path:+DeadTest.inlineRecord2 + addRecordLabelDeclaration IR3.a DeadTest.res:193:34 path:+DeadTest.inlineRecord3 + addRecordLabelDeclaration IR3.b DeadTest.res:193:42 path:+DeadTest.inlineRecord3 + addVariantCaseDeclaration IR3 DeadTest.res:193:21 path:+DeadTest.inlineRecord3 addValueReference DeadTest.res:28:2 --> DeadTest.res:31:6 addValueReference DeadTest.res:36:2 --> DeadTest.res:39:6 addValueReference DeadTest.res:60:2 --> DeadTest.res:64:6 @@ -2029,6 +2032,9 @@ File References Live VariantCase DeadRT.moduleAccessPath.Root: 1 references (DeadTest.res:106:16) [1] Live VariantCase +DeadRT.moduleAccessPath.Root: 1 references (DeadRT.resi:2:2) [0] Live VariantCase DeadRT.moduleAccessPath.Kaboom: 1 references (DeadRT.res:3:2) [0] + Dead RecordLabel +DeadTest.inlineRecord3.IR3.b: 0 references () [0] + Dead RecordLabel +DeadTest.inlineRecord3.IR3.a: 0 references () [0] + Dead VariantCase +DeadTest.inlineRecord3.IR3: 0 references () [0] Dead RecordLabel +DeadTest.inlineRecord2.IR2.b: 0 references () [0] Dead RecordLabel +DeadTest.inlineRecord2.IR2.a: 0 references () [0] Dead VariantCase +DeadTest.inlineRecord2.IR2: 0 references () [0] diff --git a/analysis/reanalyze/examples/deadcode/src/DeadTest.res b/analysis/reanalyze/examples/deadcode/src/DeadTest.res index 434b6db5b..901d5af04 100644 --- a/analysis/reanalyze/examples/deadcode/src/DeadTest.res +++ b/analysis/reanalyze/examples/deadcode/src/DeadTest.res @@ -189,3 +189,5 @@ let _ = ir => @dead type inlineRecord2 = IR2({a: int, b: int}) + +type inlineRecord3 = | @dead IR3({a: int, b: int}) diff --git a/analysis/reanalyze/src/DeadCommon.ml b/analysis/reanalyze/src/DeadCommon.ml index 100f4a982..b9cda3afb 100644 --- a/analysis/reanalyze/src/DeadCommon.ml +++ b/analysis/reanalyze/src/DeadCommon.ml @@ -276,7 +276,7 @@ module ProcessDeadAnnotations = struct List.iter (fun ({ld_attributes; ld_loc} : Typedtree.label_declaration) -> - toplevelAttrs @ ld_attributes + toplevelAttrs @ cd_attributes @ ld_attributes |> processAttributes ~doGenType:false ~name:"" ~pos:ld_loc.loc_start) flds