diff --git a/analysis/reanalyze/examples/deadcode/expected/deadcode.txt b/analysis/reanalyze/examples/deadcode/expected/deadcode.txt index 1f9234d89..9296b5944 100644 --- a/analysis/reanalyze/examples/deadcode/expected/deadcode.txt +++ b/analysis/reanalyze/examples/deadcode/expected/deadcode.txt @@ -256,15 +256,23 @@ 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 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 + 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 @@ -2024,8 +2032,16 @@ 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] 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 +3129,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..901d5af04 100644 --- a/analysis/reanalyze/examples/deadcode/src/DeadTest.res +++ b/analysis/reanalyze/examples/deadcode/src/DeadTest.res @@ -179,10 +179,15 @@ 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, d: 0, e: 0}) } + +@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 fd8486fee..b9cda3afb 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) -> + toplevelAttrs @ cd_attributes @ 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