From 8969a29379056a93cbcdb0590b5ebbc635e7c022 Mon Sep 17 00:00:00 2001 From: Corentin De Souza <9597216+fantazio@users.noreply.github.com> Date: Tue, 11 Aug 2026 14:00:29 +0200 Subject: [PATCH 1/7] [docs][field_ctor] add missing limitations in toc --- docs/fields_and_constructors/FIELDS_AND_CONSTRUCTORS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/fields_and_constructors/FIELDS_AND_CONSTRUCTORS.md b/docs/fields_and_constructors/FIELDS_AND_CONSTRUCTORS.md index 0670e55d..31de6699 100644 --- a/docs/fields_and_constructors/FIELDS_AND_CONSTRUCTORS.md +++ b/docs/fields_and_constructors/FIELDS_AND_CONSTRUCTORS.md @@ -10,6 +10,8 @@ + [Examples](#examples) + [Limitations](#limitations) + [Polymorphic variant](#polymorphic-variant) + + [Extensible variant](#extensible-variant) + + [Inline record](#inline-record) # Fields and constructors From a2f60a8313d20c643d344d2a838aac202d331c96 Mon Sep 17 00:00:00 2001 From: Corentin De Souza <9597216+fantazio@users.noreply.github.com> Date: Tue, 11 Aug 2026 16:07:24 +0200 Subject: [PATCH 2/7] [docs][field_ctor] add equal_types limitation In addition to documentation, examples are written and expected results are updated accordingly. This adds a lot of false positives in the tests, and as many false negatives (misplacements) for the threshold test scenarios --- check/classic/classic.exp | 9 + check/classic/classic.ref | 49 ++++- check/internal/internal.exp | 9 + check/internal/internal.ref | 49 ++++- check/threshold-1/threshold-1.exp | 50 +++++ check/threshold-1/threshold-1.ref | 89 +++++++- check/threshold-3-0.5/threshold-3-0.5.exp | 50 +++++ check/threshold-3-0.5/threshold-3-0.5.ref | 89 +++++++- .../FIELDS_AND_CONSTRUCTORS.md | 204 ++++++++++++++++++ .../docs/fields_and_constructors/Makefile | 2 + .../limitations/Makefile | 10 + .../limitations/equal_types/Makefile | 17 ++ .../limitations/equal_types/definitions.ml | 17 ++ .../limitations/equal_types/equal_types.ml | 20 ++ .../equal_types/via_explicit_equations.ml | 17 ++ .../equal_types/via_hidden_equations.ml | 18 ++ .../equal_types/via_hidden_equations.mli | 18 ++ .../limitations/equal_types/via_include.ml | 2 + .../limitations/equal_types/via_include.mli | 18 ++ .../equal_types/via_module_alias.ml | 2 + .../equal_types/via_module_alias.mli | 19 ++ 21 files changed, 742 insertions(+), 16 deletions(-) create mode 100644 examples/docs/fields_and_constructors/limitations/Makefile create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/Makefile create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/equal_types.ml create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/via_explicit_equations.ml create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.ml create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/via_include.ml create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.ml create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli diff --git a/check/classic/classic.exp b/check/classic/classic.exp index c7d1a0aa..43098436 100644 --- a/check/classic/classic.exp +++ b/check/classic/classic.exp @@ -269,6 +269,15 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused + ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:19: constr_with_eq.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:23: record.unused diff --git a/check/classic/classic.ref b/check/classic/classic.ref index cea2bcfe..f97c80ef 100644 --- a/check/classic/classic.ref +++ b/check/classic/classic.ref @@ -269,6 +269,47 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused + ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:19: constr_with_eq.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:23: record.unused @@ -721,7 +762,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 593 -Success: 593 -Failed: 0 -Ratio: 100.% +Total: 633 +Success: 601 +Failed: 32 +Ratio: 94.9447077409% diff --git a/check/internal/internal.exp b/check/internal/internal.exp index 84a6c92a..ead2908f 100644 --- a/check/internal/internal.exp +++ b/check/internal/internal.exp @@ -221,6 +221,15 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused + ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:19: constr_with_eq.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:23: record.unused diff --git a/check/internal/internal.ref b/check/internal/internal.ref index a004e70d..18fa535f 100644 --- a/check/internal/internal.ref +++ b/check/internal/internal.ref @@ -221,6 +221,47 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused + ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:19: constr_with_eq.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:23: record.unused @@ -673,7 +714,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 549 -Success: 549 -Failed: 0 -Ratio: 100.% +Total: 589 +Success: 557 +Failed: 32 +Ratio: 94.5670628183% diff --git a/check/threshold-1/threshold-1.exp b/check/threshold-1/threshold-1.exp index be1548ac..53c9423d 100644 --- a/check/threshold-1/threshold-1.exp +++ b/check/threshold-1/threshold-1.exp @@ -612,6 +612,15 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused + ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:19: constr_with_eq.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:23: record.unused @@ -691,6 +700,47 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:15: product.used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:12: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:13: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:7: Alias.sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:15: Alias.product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly + ./examples/using_dune/preprocessed_lib/preprocessed.mli:16: constructors.Internally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:17: constructors.Externally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:25: record.internally_used diff --git a/check/threshold-1/threshold-1.ref b/check/threshold-1/threshold-1.ref index aed84db1..38075a1e 100644 --- a/check/threshold-1/threshold-1.ref +++ b/check/threshold-1/threshold-1.ref @@ -612,6 +612,47 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused + ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:19: constr_with_eq.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:23: record.unused @@ -691,6 +732,46 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:15: product.used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:12: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:13: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:7: Alias.sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:15: Alias.product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Not detected ./examples/using_dune/preprocessed_lib/preprocessed.mli:16: constructors.Internally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:17: constructors.Externally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:25: record.internally_used @@ -1145,7 +1226,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 939 -Success: 939 -Failed: 0 -Ratio: 100.% +Total: 1019 +Success: 955 +Failed: 64 +Ratio: 93.7193326791% diff --git a/check/threshold-3-0.5/threshold-3-0.5.exp b/check/threshold-3-0.5/threshold-3-0.5.exp index 313bc7ea..55ee4d5a 100644 --- a/check/threshold-3-0.5/threshold-3-0.5.exp +++ b/check/threshold-3-0.5/threshold-3-0.5.exp @@ -794,6 +794,15 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused + ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:19: constr_with_eq.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:23: record.unused @@ -873,6 +882,47 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:15: product.used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:12: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:13: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:7: Alias.sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:15: Alias.product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly + ./examples/using_dune/preprocessed_lib/preprocessed.mli:16: constructors.Internally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:17: constructors.Externally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:25: record.internally_used diff --git a/check/threshold-3-0.5/threshold-3-0.5.ref b/check/threshold-3-0.5/threshold-3-0.5.ref index 7fed8c11..862511ba 100644 --- a/check/threshold-3-0.5/threshold-3-0.5.ref +++ b/check/threshold-3-0.5/threshold-3-0.5.ref @@ -794,6 +794,47 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused + ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:19: constr_with_eq.Unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:23: record.unused @@ -873,6 +914,46 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:15: product.used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:12: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:13: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:7: Alias.sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:15: Alias.product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Not detected ./examples/using_dune/preprocessed_lib/preprocessed.mli:16: constructors.Internally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:17: constructors.Externally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:25: record.internally_used @@ -1549,7 +1630,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1261 -Success: 1261 -Failed: 0 -Ratio: 100.% +Total: 1341 +Success: 1277 +Failed: 64 +Ratio: 95.2274422073% diff --git a/docs/fields_and_constructors/FIELDS_AND_CONSTRUCTORS.md b/docs/fields_and_constructors/FIELDS_AND_CONSTRUCTORS.md index 31de6699..656fbb0f 100644 --- a/docs/fields_and_constructors/FIELDS_AND_CONSTRUCTORS.md +++ b/docs/fields_and_constructors/FIELDS_AND_CONSTRUCTORS.md @@ -12,6 +12,7 @@ + [Polymorphic variant](#polymorphic-variant) + [Extensible variant](#extensible-variant) + [Inline record](#inline-record) + + [Type equalities](#type-equalities) # Fields and constructors @@ -259,3 +260,206 @@ the [Inline record](./code_constructs/INLINE_RECORD.md) example If you have a strong need/desire for this feature, please feel free to [open an issue](https://github.com/LexiFi/dead_code_analyzer/issues/new) + +## Type equalities + +Related issues : +- [issue #79](https://github.com/LexiFi/dead_code_analyzer/issues/79); +- [issue #80](https://github.com/LexiFi/dead_code_analyzer/issues/80); +- [issue #81](https://github.com/LexiFi/dead_code_analyzer/issues/81); +- [issue #82](https://github.com/LexiFi/dead_code_analyzer/issues/82). + +When defining a variant or record type, one can constrain it to be equal +to another in 2 different ways: +- via an explicit type equation (`type t1 = t2 = ...`); +- implicitly, when the type is defined without an explicit equation in the + interface, whereas it is either explicited or implied by construction + (e.g. through includes or module aliases) in the implementation. + +Either way, the analyzer does not account for such equalities and analyzes +each type's components indepently. Thus, a use of a constructor or field in +`t1` is not considered as a use for that same component in `t2` (with +`t1 = t2`), and vice versa. +This leads to **false positives**. + +### Example + +The reference files for this example are in the +[equal\_types](../../examples/docs/fields_and_constructors/limitations/equal_types) +directory. + +The reference takes place in `/tmp/docs/fields_and_constructors/limitations`, +which is a copy of the [limitations](../../../examples/docs/fields_and_constructors/limitations) +directory. Reported locations may differ depending on the location of the +source files. + +The compilation command is : +``` +make -C equal_types build +``` + +The analysis command is : +``` +make -C equal_types analyze +``` + +The compile + analyze command is : +``` +make -C equal_types +``` + +Code: +```OCaml +(* definitions.ml *) +type sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Unused + +type product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + unused : int; +} +``` +These 2 types are re-exposed by 4 modules : `Via_explicit_equations`, +`Via_hidden_equations`, `Via_include`, and `Via_module_alias`. We will not +display all of their content here because they mostly consist in the +repetition of `Definitions`. Feel free to explore them. + +`Via_explicit_equations` is defined within a single .ml and it uses the following constructs: +```OCaml +type sum = Definitions.sum = (* constructors *) +type product = Definitions.product = (* fields *) +``` + +`Via_hidden_equations` is implemented the same as `Via_explicit_equations` +in its .ml, and its .mli is the same as `Definitions`. + +`Via_include` is implemented as below and its interface is the same as +`Definitions` : +```OCaml +(* via_include.ml *) +include Definitions +``` + +`Via_module_alias` is implented as below and its module `Alias` is defined +explicitly in the interface : +```OCaml +(* via_module_alias.ml *) +module Alias = Definitions +``` + +The different constructors and fields are used by `Equal_types`: +```OCaml +(* equal_types.ml *) +let _ = + let open Definitions in + fun {used_directly; _} -> Used_directly + +let _ = + let open Via_explicit_equations in + fun {used_by_explicit_equation; _} -> Used_by_explicit_equation + +let _ = + let open Via_hidden_equations in + fun {used_by_hidden_equation; _} -> Used_by_hidden_equation + +let _ = + let open Via_include in + fun {used_by_include; _} -> Used_by_include + +let _ = + let open Via_module_alias.Alias in + fun {used_by_module_alias; _} -> Used_by_module_alias +``` + +Compile and analyze: +``` +$ make -C equal_types/ +make: Entering directory '/tmp/docs/fields_and_constructors/limitations/equal_types' +ocamlopt -bin-annot definitions.ml via_explicit_equations.ml via_hidden_equations.mli via_hidden_equations.ml via_include.mli via_include.ml via_mod +ule_alias.mli via_module_alias.ml equal_types.ml +dead_code_analyzer --nothing -T all . +Scanning files... + [DONE] + +.> UNUSED CONSTRUCTORS/RECORD FIELDS: +==================================== +/tmp/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include +/tmp/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias +/tmp/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused +/tmp/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include +/tmp/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias +/tmp/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused +/tmp/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include +/tmp/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias +/tmp/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly +/tmp/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused +/tmp/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include +/tmp/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias +/tmp/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly +/tmp/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused +/tmp/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias +/tmp/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly +/tmp/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused +/tmp/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias +/tmp/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly +/tmp/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused +/tmp/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include +/tmp/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly +/tmp/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused +/tmp/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation +/tmp/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include +/tmp/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly +/tmp/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused + +Nothing else to report in this section +-------------------------------------------------------------------------------- + + +make: Leaving directory '/tmp/docs/fields_and_constructors/limitations/equal_types' + +``` + +As we can see, there are a lot of reports. Most of them are false positives: +for each type, components only used by other equal types are report unused. +I.e. only components used directly via a type is considered used for that +type. + +Although the results are valid according to OCaml's typing (if there is no +type equation, the defined type is incompatible with any other type), they +are not actionable because one cannot remove a component without removing +it from all the other equal types. +In order to make the results actionable, one must be able to remove the +component from all the equal types. Thus, the expected results would only +consist of `sum.Unused`, and `product.unused`, either for each type or only +for `Definitions`' types. + +> [!NOTE] +> The type components in `Via_explicit_equations` are not reported. This +> follows OCaml's typing, and is the expected behavior. +> > The optional type equation `= typexpr` makes the defined type equivalent +> > to the type expression `typexpr`: one can be substituted for the other +> > during typing. +> +> There are no false negatives. diff --git a/examples/docs/fields_and_constructors/Makefile b/examples/docs/fields_and_constructors/Makefile index ed0a10f4..6b0a9a62 100644 --- a/examples/docs/fields_and_constructors/Makefile +++ b/examples/docs/fields_and_constructors/Makefile @@ -4,7 +4,9 @@ all: build build: make -C code_constructs + make -C limitations clean: rm -f *~ *.cm* *.o *.obj make -C code_constructs clean + make -C limitations clean diff --git a/examples/docs/fields_and_constructors/limitations/Makefile b/examples/docs/fields_and_constructors/limitations/Makefile new file mode 100644 index 00000000..2a0cd492 --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/Makefile @@ -0,0 +1,10 @@ +.PHONY: clean build + +all: build + +build: + make -C equal_types build + +clean: + rm -f *~ *.cm* *.o *.obj + make -C equal_types clean diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/Makefile b/examples/docs/fields_and_constructors/limitations/equal_types/Makefile new file mode 100644 index 00000000..c324a81f --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/Makefile @@ -0,0 +1,17 @@ +SRC:=definitions.ml \ + via_explicit_equations.ml \ + via_hidden_equations.mli via_hidden_equations.ml \ + via_include.mli via_include.ml \ + via_module_alias.mli via_module_alias.ml \ + equal_types.ml + +all: build analyze + +build: + ocamlopt -bin-annot ${SRC} + +analyze: + dead_code_analyzer --nothing -T all . + +clean: + rm -f *.cm* *.o a.out diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml b/examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml new file mode 100644 index 00000000..1ea767d5 --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml @@ -0,0 +1,17 @@ +(* definitions.ml *) +type sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Unused + +type product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + unused : int; +} diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/equal_types.ml b/examples/docs/fields_and_constructors/limitations/equal_types/equal_types.ml new file mode 100644 index 00000000..1eb605f0 --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/equal_types.ml @@ -0,0 +1,20 @@ +(* equal_types.ml *) +let _ = + let open Definitions in + fun {used_directly; _} -> Used_directly + +let _ = + let open Via_explicit_equations in + fun {used_by_explicit_equation; _} -> Used_by_explicit_equation + +let _ = + let open Via_hidden_equations in + fun {used_by_hidden_equation; _} -> Used_by_hidden_equation + +let _ = + let open Via_include in + fun {used_by_include; _} -> Used_by_include + +let _ = + let open Via_module_alias.Alias in + fun {used_by_module_alias; _} -> Used_by_module_alias diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/via_explicit_equations.ml b/examples/docs/fields_and_constructors/limitations/equal_types/via_explicit_equations.ml new file mode 100644 index 00000000..334f7c30 --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/via_explicit_equations.ml @@ -0,0 +1,17 @@ +(* via_explicit_equations.ml *) +type sum = Definitions.sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Unused + +type product = Definitions.product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + unused : int; +} diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.ml b/examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.ml new file mode 100644 index 00000000..c1c73577 --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.ml @@ -0,0 +1,18 @@ +(* via_hidden_equations.ml *) +type sum = Definitions.sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Unused + +type product = Definitions.product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + unused : int; +} + diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli b/examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli new file mode 100644 index 00000000..569db26b --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli @@ -0,0 +1,18 @@ +(* via_hidden_equations.mli *) +type sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Unused + +type product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + unused : int; +} + diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/via_include.ml b/examples/docs/fields_and_constructors/limitations/equal_types/via_include.ml new file mode 100644 index 00000000..9d62e576 --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/via_include.ml @@ -0,0 +1,2 @@ +(* via_include.ml *) +include Definitions diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli b/examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli new file mode 100644 index 00000000..18441a10 --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli @@ -0,0 +1,18 @@ +(* via_include.mli *) +type sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Unused + +type product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + unused : int; +} + diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.ml b/examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.ml new file mode 100644 index 00000000..46e2bf96 --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.ml @@ -0,0 +1,2 @@ +(* via_module_alias.ml *) +module Alias = Definitions diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli b/examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli new file mode 100644 index 00000000..74bab13b --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli @@ -0,0 +1,19 @@ +(* via_module_alias.mli *) +module Alias : sig + type sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Unused + + type product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + unused : int; + } +end From f49805e1578af0158d06d3b7ccf6a2685cc5b2db Mon Sep 17 00:00:00 2001 From: Corentin De Souza <9597216+fantazio@users.noreply.github.com> Date: Tue, 11 Aug 2026 18:49:58 +0200 Subject: [PATCH 3/7] [src][deadType] keep track of equivalent types The tracking is very naive (using an assoc list), and equivalent classes are only resolved at the end in the new `DeadType.prepare_report` function. The role of this new function is to merge all the references of an equivalent class and propagate the result back to its members. As a result, the FP/FN related to type equations are now resolved. The code still needs to be cleaned up but gives the direction to fix the other FP/FN in the `equal_types` limitation. --- check/classic/classic.ref | 14 +-- check/internal/internal.ref | 14 +-- check/threshold-1/threshold-1.ref | 32 ++--- check/threshold-3-0.5/threshold-3-0.5.ref | 32 ++--- src/deadCode.ml | 1 + src/deadType.ml | 138 +++++++++++++++++++--- src/deadType.mli | 5 + 7 files changed, 157 insertions(+), 79 deletions(-) diff --git a/check/classic/classic.ref b/check/classic/classic.ref index f97c80ef..c91a2047 100644 --- a/check/classic/classic.ref +++ b/check/classic/classic.ref @@ -269,25 +269,17 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected @@ -762,7 +754,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 633 +Total: 625 Success: 601 -Failed: 32 -Ratio: 94.9447077409% +Failed: 24 +Ratio: 96.16% diff --git a/check/internal/internal.ref b/check/internal/internal.ref index 18fa535f..86e9c276 100644 --- a/check/internal/internal.ref +++ b/check/internal/internal.ref @@ -221,25 +221,17 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected @@ -714,7 +706,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 589 +Total: 581 Success: 557 -Failed: 32 -Ratio: 94.5670628183% +Failed: 24 +Ratio: 95.8691910499% diff --git a/check/threshold-1/threshold-1.ref b/check/threshold-1/threshold-1.ref index 38075a1e..cc36b112 100644 --- a/check/threshold-1/threshold-1.ref +++ b/check/threshold-1/threshold-1.ref @@ -612,25 +612,17 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected @@ -732,26 +724,26 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:7: sum.Used_directly -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:15: product.used_directly -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:5: sum.Used_by_include @@ -1226,7 +1218,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1019 -Success: 955 -Failed: 64 -Ratio: 93.7193326791% +Total: 1011 +Success: 963 +Failed: 48 +Ratio: 95.2522255193% diff --git a/check/threshold-3-0.5/threshold-3-0.5.ref b/check/threshold-3-0.5/threshold-3-0.5.ref index 862511ba..a04f2458 100644 --- a/check/threshold-3-0.5/threshold-3-0.5.ref +++ b/check/threshold-3-0.5/threshold-3-0.5.ref @@ -794,25 +794,17 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected @@ -914,26 +906,26 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:7: sum.Used_directly -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:15: product.used_directly -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:5: sum.Used_by_include @@ -1630,7 +1622,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1341 -Success: 1277 -Failed: 64 -Ratio: 95.2274422073% +Total: 1333 +Success: 1285 +Failed: 48 +Ratio: 96.3990997749% diff --git a/src/deadCode.ml b/src/deadCode.ml index 3b1e7123..53544f81 100644 --- a/src/deadCode.ml +++ b/src/deadCode.ml @@ -678,6 +678,7 @@ try in !DeadLexiFi.prepare_report DeadType.decs; + DeadType.prepare_report (); let sections = state.config.sections in if Config.must_report_section sections.exported_values then report_unused_exported (); DeadObj.report(); diff --git a/src/deadType.ml b/src/deadType.ml index 668324a0..54679aad 100644 --- a/src/deadType.ml +++ b/src/deadType.ml @@ -21,6 +21,8 @@ let decs = Hashtbl.create 256 let dependencies = ref [] (* like the cmt value_dependencies but for types *) +let equivalences = ref [] (* t1 = t2 *) + (******** HELPERS ********) @@ -133,34 +135,75 @@ let rec check_style t loc = let tstr typ = let state = State.get_current() in let modname = State.File_infos.get_modname state.file_infos in + + (* A type equation [type t1 = t2 = ...] produces a + [typ_manifest = Some (Ttyp_constr t2)] in t1 + In this situation, we want to remember the equality between t1 and t2's + components, for later resolution of equivalence classes and merging + all their references (see {!prepare_report} below). + *) + let equivalent_type_path = + match typ.typ_manifest with + | Some {ctyp_desc=Ttyp_constr (_, {txt; _}, _); _} -> + let path = String.concat "." (Longident.flatten txt) in + Some path + | _ -> None + in + + let handle_external_type_eq : string -> string -> unit = + (* Store t1 = t2 equivalence, with t2 assumed to be defined outside the + current compilation unit *) + match equivalent_type_path with + | None -> fun _ _ -> () + | Some equivalent_type_path -> + fun path component_name -> + let eq_path = + equivalent_type_path ^ "." ^ component_name + in + equivalences := (path, eq_path) :: !equivalences + in + + let handle_internal_type_eq : Lexing.position -> string -> unit = + (* Store t1 = t2 equivalence as a dependency, with t2 defined within the + current compilation unit *) + match equivalent_type_path with + | None -> fun _ _ -> () + | Some equivalent_type_path -> + fun loc component_name -> + let eq_path = + String.concat "." [modname; equivalent_type_path; component_name] + in + match Hashtbl.find_opt fields eq_path with + | None -> () (* t2 is not defined locally *) + | Some eq_loc -> + dependencies := (eq_loc, loc) :: !dependencies; + in + + let handle_type_dep loc path_loc component_name = + handle_internal_type_eq loc component_name; + if path_loc <> loc then + (* store dependency between .ml and .mli *) + dependencies := (path_loc, loc) :: !dependencies; + in + let assoc name loc = + (* store the association from name to loc in fields, + the dependenicies and the equivalences *) + let component_name = name.Asttypes.txt in let path = let partial_path_rev = - name.Asttypes.txt :: typ.typ_name.Asttypes.txt :: !mods + component_name :: typ.typ_name.Asttypes.txt :: !mods in modname :: List.rev partial_path_rev |> String.concat "." in + handle_external_type_eq path component_name; match Hashtbl.find_opt fields path with | None -> Hashtbl.add fields path loc | Some path_loc -> - (match typ.typ_manifest with - (* TODO : describe what this pattern is for *) - | Some {ctyp_desc=Ttyp_constr (_, {txt; _}, _); _} -> - let constr_typ_path = - modname :: Longident.flatten txt @ (name.Asttypes.txt :: []) - |> String.concat "." - in - (match Hashtbl.find_opt fields constr_typ_path with - | None -> () - | Some constr_loc -> - dependencies := (path_loc, constr_loc) :: (constr_loc, loc) :: !dependencies - ) - | _ -> () - ); - dependencies := (path_loc, loc) :: !dependencies + (* The path is known because the current compilation unit exports it *) + handle_type_dep loc path_loc component_name in - let assoc name loc ctyp = assoc name loc; !DeadLexiFi.tstr_type typ ctyp @@ -180,6 +223,67 @@ let tstr typ = | _ -> () +let prepare_report () = + (* implement a pseudo union-find via 2 tables : references and reprs *) + (* references hold merged references of a union class with the + representative as key.*) + let references = LocHash.create 128 in + (* reprs points to another member of the location's equivalence class. + This memeber was the representative at some point. There are no + circular references. + _The_ representative of a class points to itself. + Use get_repr to get _the_ representative of a location's class. + *) + let reprs = Hashtbl.create 128 in + let init_refs loc = + (* the initial value for a single-element class is the set of references + gathered during the analysis *) + LocHash.find_set DeadCommon.references loc + |> LocHash.replace references loc + in + let rec get_repr loc = + (* explore members of loc's class until finding the class representative *) + match Hashtbl.find_opt reprs loc with + | None -> + (* loc does not belong to a class yet. Setup its own *) + init_refs loc; + Hashtbl.add reprs loc loc; + loc + | Some repr when repr = loc -> loc (* class representative found *) + | Some repr -> get_repr repr (* class member but not the representative *) + in + let merge_references (path1, path2) = + let loc1 = Hashtbl.find_opt fields path1 in + let loc2 = Hashtbl.find_opt fields path2 in + match loc1, loc2 with + | None, _ | _, None -> () + | Some loc1, Some loc2 -> + let repr1 = get_repr loc1 in + let repr2 = get_repr loc2 in + Hashtbl.replace reprs repr1 repr2; + (* repr1 is now represented by repr2: its references are transfered *) + LocHash.merge_set references repr2 references repr1; + LocHash.remove references repr1 + in + let update_references loc = + Option.iter + (fun loc -> + let repr = get_repr loc in + let refs = LocHash.find_set references repr in + (* refs include the references gathered for loc and all the members + of its equivalence class *) + LocHash.replace DeadCommon.references loc refs + ) + loc + in + let update_references (path1, path2) = + Hashtbl.find_opt fields path1 |> update_references; + Hashtbl.find_opt fields path2 |> update_references + in + List.iter merge_references !equivalences; + List.iter update_references !equivalences + + let report () = let state = State.get_current () in report_basic diff --git a/src/deadType.mli b/src/deadType.mli index a7280fe6..a4640652 100644 --- a/src/deadType.mli +++ b/src/deadType.mli @@ -38,4 +38,9 @@ val correct_export : Types.type_declaration -> unit val collect_references : Lexing.position -> Lexing.position -> unit +val prepare_report: unit -> unit +(** To use at the end of the codebase analysis, before reporting. + This merges all the references of equivalent types +*) + val report: unit -> unit From 35ef187466ea4a0ebd07657a7555fd5306bc768d Mon Sep 17 00:00:00 2001 From: Corentin De Souza <9597216+fantazio@users.noreply.github.com> Date: Wed, 12 Aug 2026 12:24:25 +0200 Subject: [PATCH 4/7] [src][deadType] track equivalence through includes When an include is encountered, all the type components defined in the included module and in the ucrrent compilation unit are considered equivalent. Although the equivalence is not necessarily true (e.g. the current implementation could redefine the same type explicitly and without equation right after the include), this is a good effort towards actionable results in the presence of type equalities. This fixes include-related FP and FN in the `equal_types` limitation. --- check/classic/classic.ref | 16 +---- check/internal/internal.ref | 16 +---- check/threshold-1/threshold-1.ref | 38 +++++------- check/threshold-3-0.5/threshold-3-0.5.ref | 38 +++++------- src/deadCode.ml | 28 ++------- src/deadSign.ml | 72 +++++++++++++++++++---- src/deadSign.mli | 20 +++---- src/deadType.ml | 58 ++++++++++++++---- src/deadType.mli | 16 +++++ 9 files changed, 167 insertions(+), 135 deletions(-) diff --git a/check/classic/classic.ref b/check/classic/classic.ref index c91a2047..ab38900d 100644 --- a/check/classic/classic.ref +++ b/check/classic/classic.ref @@ -269,27 +269,17 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected @@ -754,7 +744,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 625 +Total: 615 Success: 601 -Failed: 24 -Ratio: 96.16% +Failed: 14 +Ratio: 97.7235772358% diff --git a/check/internal/internal.ref b/check/internal/internal.ref index 86e9c276..080bd3d8 100644 --- a/check/internal/internal.ref +++ b/check/internal/internal.ref @@ -221,27 +221,17 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected @@ -706,7 +696,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 581 +Total: 571 Success: 557 -Failed: 24 -Ratio: 95.8691910499% +Failed: 14 +Ratio: 97.5481611208% diff --git a/check/threshold-1/threshold-1.ref b/check/threshold-1/threshold-1.ref index cc36b112..4025a9f1 100644 --- a/check/threshold-1/threshold-1.ref +++ b/check/threshold-1/threshold-1.ref @@ -612,27 +612,17 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected @@ -726,34 +716,34 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:15: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:4: sum.Used_by_hidden_equation -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:12: product.used_by_hidden_equation -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:5: sum.Used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:13: product.used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Not detected @@ -1218,7 +1208,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1011 -Success: 963 -Failed: 48 -Ratio: 95.2522255193% +Total: 1001 +Success: 973 +Failed: 28 +Ratio: 97.2027972028% diff --git a/check/threshold-3-0.5/threshold-3-0.5.ref b/check/threshold-3-0.5/threshold-3-0.5.ref index a04f2458..224eaf94 100644 --- a/check/threshold-3-0.5/threshold-3-0.5.ref +++ b/check/threshold-3-0.5/threshold-3-0.5.ref @@ -794,27 +794,17 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected @@ -908,34 +898,34 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:15: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:4: sum.Used_by_hidden_equation -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:12: product.used_by_hidden_equation -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:5: sum.Used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:13: product.used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Not detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Not detected @@ -1622,7 +1612,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1333 -Success: 1285 -Failed: 48 -Ratio: 96.3990997749% +Total: 1323 +Success: 1295 +Failed: 28 +Ratio: 97.8835978836% diff --git a/src/deadCode.ml b/src/deadCode.ml index 53544f81..ecbf1d22 100644 --- a/src/deadCode.ml +++ b/src/deadCode.ml @@ -110,30 +110,10 @@ let structure_item super self i = DeadMod.defined := String.concat "." (List.rev !mods) :: !DeadMod.defined | Tstr_class l when Config.must_report_section sections.methods -> List.iter DeadObj.tstr l - | Tstr_include i -> - let collect_include signature = - let prev_last_loc = !last_loc in - let module_id = - State.File_infos.get_modname state.file_infos - |> Ident.create_persistent - in - let path = [module_id] in - List.iter - (DeadSign.collect_export_from_include ~path) - signature; - last_loc := prev_last_loc; - in - let rec includ mod_expr = - match mod_expr.mod_desc with - | Tmod_ident (_, _) -> collect_include (Utils.signature_of_modtype mod_expr.mod_type) - | Tmod_structure structure -> collect_include structure.str_type - | Tmod_unpack (_, mod_type) -> collect_include (Utils.signature_of_modtype mod_type) - | Tmod_functor (_, mod_expr) - | Tmod_apply (_, mod_expr, _) - | Tmod_apply_unit mod_expr - | Tmod_constraint (mod_expr, _, _, _) -> includ mod_expr - in - includ i.incl_mod + | Tstr_include incl_decl -> + let prev_last_loc = !last_loc in + DeadSign.collect_from_include incl_decl; + last_loc := prev_last_loc | _ -> () end; let r = super.Tast_mapper.structure_item self i in diff --git a/src/deadSign.ml b/src/deadSign.ml index 0f5a5d42..63e306bf 100644 --- a/src/deadSign.ml +++ b/src/deadSign.ml @@ -239,21 +239,67 @@ let collect_export_from_structure ~path ~comp_unit structure = collect_structure ~path structure - -let rec collect_export_from_include ~path sig_item = +let collect_from_include incl_decl = + (* Get incl_decl's signature and export classes and objects in + DeadCommon.incl. + If the incl_decl is an ident, then store the equivalence between its + types and those of the current compilation unit. + *) + let rec get_mod_name_and_signature mod_expr = + match mod_expr.Typedtree.mod_desc with + | Tmod_ident (_, {txt; _}) -> + let signature = Utils.signature_of_modtype mod_expr.mod_type in + (Some txt, signature) + | Tmod_structure structure -> + (None, structure.str_type) + | Tmod_unpack (_, mod_type) -> + let signature = Utils.signature_of_modtype mod_type in + (None, signature) + | Tmod_functor (_, mod_expr) + | Tmod_apply (mod_expr, _, _) + | Tmod_apply_unit mod_expr + | Tmod_constraint (mod_expr, _, _, _) -> + get_mod_name_and_signature mod_expr + in + (* incl_id is used to identify and store type equivalences *) + let incl_id, signature = + get_mod_name_and_signature incl_decl.Typedtree.incl_mod + in + (* path to the module where include happens *) + let current_path = + let state = State.get_current () in + let module_id = State.File_infos.get_modname state.file_infos in + !DeadCommon.mods @ [module_id] + |> List.map Ident.create_persistent + in + (* comp_unit = DeadCommon._include enables exports from outside the current + compilation unit *) let comp_unit = DeadCommon._include in + (* exports from include are stored in their dedicated stock*) let stock = DeadCommon.incl in - match (sig_item : Types.signature_item) with - | Sig_value (id, ({val_loc; _} as value), _) - when not val_loc.Location.loc_ghost -> - export_object ~path ~comp_unit ~stock id value - | Sig_class (id, cd, _, _) -> - export_class ~path ~comp_unit ~stock id cd - | Sig_module (id, _, {Types.md_type; _}, _, _) -> - let path = id :: path in - Utils.signature_of_modtype md_type - |> List.iter (collect_export_from_include ~path) - | _ -> () + let rec collect_from_sig_item ~path sig_item = + (* [path] is the path within the included module *) + match (sig_item : Types.signature_item) with + | Sig_value (id, ({val_loc; _} as value), _) + when not val_loc.Location.loc_ghost -> + let path = path @ current_path in + export_object ~path ~comp_unit ~stock id value + | Sig_class (id, cd, _, _) -> + let path = path @ current_path in + export_class ~path ~comp_unit ~stock id cd + | Sig_module (id, _, {Types.md_type; _}, _, _) -> + let path = id :: path in + Utils.signature_of_modtype md_type + |> List.iter (collect_from_sig_item ~path) + | Sig_type (id, t, _, _) -> + Option.iter + (fun incl_id -> + let path = List.rev_map Ident.name (id :: path) in + DeadType.collect_equivalence_from_include ~incl_id ~path t) + incl_id + | _ -> () + in + List.iter (collect_from_sig_item ~path:[]) signature let correct_export sig_item = diff --git a/src/deadSign.mli b/src/deadSign.mli index 5ba44d6f..d3d44216 100644 --- a/src/deadSign.mli +++ b/src/deadSign.mli @@ -1,6 +1,6 @@ val collect_export_from_signature : - path:Ident.t list -> - comp_unit:string -> + path: Ident.t list -> + comp_unit: string -> Typedtree.signature -> unit (** [collect_export_from_signature ~path ~comp_unit signature] @@ -12,8 +12,8 @@ val collect_export_from_signature : *) val collect_export_from_structure : - path:Ident.t list -> - comp_unit:string -> + path: Ident.t list -> + comp_unit: string -> Typedtree.structure -> unit (** [collect_export_from_structure ~path ~comp_unit structure] @@ -22,14 +22,12 @@ val collect_export_from_structure : See {!collect_export_from_signature} above for more information. *) -val collect_export_from_include : - path:Ident.t list -> - Types.signature_item +val collect_from_include : + Typedtree.include_declaration -> unit -(** [collect_export_from_include ~path sig_item] - recursively traverse the [sig_item] and store exported elements - (values, constructors, ...) in {!DeadCommon.incl}. - See {!collect_export_from_signature} above for more information. +(** [collect_from_include incl_decl] + store exported object, class elements and type equivalences found in + [incl_decl]. *) val correct_export : Types.signature_item -> unit diff --git a/src/deadType.ml b/src/deadType.ml index 54679aad..75f8a14a 100644 --- a/src/deadType.ml +++ b/src/deadType.ml @@ -132,6 +132,43 @@ let rec check_style t loc = | _ -> () +let add_type_eq component_path eq_type_path component_name = + (* Store t1 = t2 equivalence, with t2 assumed to be defined outside the + current compilation unit *) + let eq_path = eq_type_path ^ "." ^ component_name in + equivalences := (component_path, eq_path) :: !equivalences + +let collect_equivalence_from_include ~incl_id ~path type_decl = + let state = State.get_current () in + (* internal path *) + let type_path = + let module_id = State.File_infos.get_modname state.file_infos in + module_id :: List.rev_append !DeadCommon.mods path + |> String.concat "." + in + (* external path, belongs to incl_id *) + let eq_type_path = + Longident.flatten incl_id @ path + |> String.concat "." + in + let add_type_eq component_id = + let component_name = Ident.name component_id in + (* internal path *) + let component_path = type_path ^ "." ^ component_name in + match Hashtbl.find_opt fields component_path with + | None -> () (* The comonent_path is not undefined (thus, unexported) *) + | Some _ -> + (* The component_path is known because the current compilation unit + defines it *) + add_type_eq component_path eq_type_path component_name + in + match type_decl.type_kind with + | Type_record (l, _) -> + List.iter (fun {Types.ld_id; _} -> add_type_eq ld_id) l + | Type_variant (l, _) -> + List.iter (fun {Types.cd_id; _} -> add_type_eq cd_id) l + | _ -> () + let tstr typ = let state = State.get_current() in let modname = State.File_infos.get_modname state.file_infos in @@ -142,7 +179,7 @@ let tstr typ = components, for later resolution of equivalence classes and merging all their references (see {!prepare_report} below). *) - let equivalent_type_path = + let eq_type_path = match typ.typ_manifest with | Some {ctyp_desc=Ttyp_constr (_, {txt; _}, _); _} -> let path = String.concat "." (Longident.flatten txt) in @@ -151,27 +188,22 @@ let tstr typ = in let handle_external_type_eq : string -> string -> unit = - (* Store t1 = t2 equivalence, with t2 assumed to be defined outside the - current compilation unit *) - match equivalent_type_path with + match eq_type_path with | None -> fun _ _ -> () - | Some equivalent_type_path -> - fun path component_name -> - let eq_path = - equivalent_type_path ^ "." ^ component_name - in - equivalences := (path, eq_path) :: !equivalences + | Some eq_type_path -> + fun component_path component_name -> + add_type_eq component_path eq_type_path component_name in let handle_internal_type_eq : Lexing.position -> string -> unit = (* Store t1 = t2 equivalence as a dependency, with t2 defined within the current compilation unit *) - match equivalent_type_path with + match eq_type_path with | None -> fun _ _ -> () - | Some equivalent_type_path -> + | Some eq_type_path -> fun loc component_name -> let eq_path = - String.concat "." [modname; equivalent_type_path; component_name] + String.concat "." [modname; eq_type_path; component_name] in match Hashtbl.find_opt fields eq_path with | None -> () (* t2 is not defined locally *) diff --git a/src/deadType.mli b/src/deadType.mli index a4640652..4696fd43 100644 --- a/src/deadType.mli +++ b/src/deadType.mli @@ -17,6 +17,22 @@ val to_string : Types.type_expr -> string val check_style : Types.type_expr -> Lexing.position -> unit (** Look for bad style typing. (i.e. Argument expecting an optional argument) *) +val collect_equivalence_from_include : + incl_id: Longident.t -> + path: string list -> + Types.type_declaration + -> unit +(** [collect_equivalence_from_include ~incl_id ~path type_decl] + stores equivalences between components of the included [type_decl] + defined in [incl_id] at [path] and the same components in the same + type at [path_at_include @ path] in the current compilation unit if it is exported. + [path] must not be empty and is represented forward (i.e. the type name + is at the end). + + E.g. the .mli declares [type t = (* type_decl *)] whereas the .ml + [include M] and [M] also declares [type t = (* type_decl *)] +*) + val tstr : Typedtree.type_declaration -> unit val is_unit : Types.type_expr -> bool From 3ccb5ffe0711cd33e9a274f224c00c28d9acd696 Mon Sep 17 00:00:00 2001 From: Corentin De Souza <9597216+fantazio@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:17:20 +0200 Subject: [PATCH 5/7] [src][deadType] track equivalence through module aliases This requires more changes than anticipated. The module types available in the .cmt where the aliasing occurs ar Mty_alias, and the surrounding Env.t do not help retrieving a more detailed information. Thus, we recreate in `DeadSign.exported_modules` what we hoped to find in environments : the association from path to module type. With this information, we are able to process a module alias's types and fill out our equivalences list. This fixes the remaining FP and FN (related to module aliases) of limitation `equal_types`. --- check/classic/classic.ref | 20 ++------ check/internal/internal.ref | 20 ++------ check/threshold-1/threshold-1.ref | 51 ++++++++------------ check/threshold-3-0.5/threshold-3-0.5.ref | 51 ++++++++------------ src/deadCode.ml | 8 ++- src/deadSign.ml | 59 +++++++++++++++++++++++ src/deadSign.mli | 14 ++++++ src/deadType.ml | 57 +++++++++++++++++++++- src/deadType.mli | 22 ++++++++- 9 files changed, 200 insertions(+), 102 deletions(-) diff --git a/check/classic/classic.ref b/check/classic/classic.ref index ab38900d..879e8010 100644 --- a/check/classic/classic.ref +++ b/check/classic/classic.ref @@ -269,27 +269,13 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused @@ -744,7 +730,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 615 +Total: 601 Success: 601 -Failed: 14 -Ratio: 97.7235772358% +Failed: 0 +Ratio: 100.% diff --git a/check/internal/internal.ref b/check/internal/internal.ref index 080bd3d8..09d64e00 100644 --- a/check/internal/internal.ref +++ b/check/internal/internal.ref @@ -221,27 +221,13 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused @@ -696,7 +682,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 571 +Total: 557 Success: 557 -Failed: 14 -Ratio: 97.5481611208% +Failed: 0 +Ratio: 100.% diff --git a/check/threshold-1/threshold-1.ref b/check/threshold-1/threshold-1.ref index 4025a9f1..4c62b833 100644 --- a/check/threshold-1/threshold-1.ref +++ b/check/threshold-1/threshold-1.ref @@ -612,27 +612,13 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused @@ -717,43 +703,44 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:15: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:5: sum.Used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:13: product.used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:7: Alias.sum.Used_by_module_alias -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:15: Alias.product.used_by_module_alias -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly + ./examples/using_dune/preprocessed_lib/preprocessed.mli:16: constructors.Internally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:17: constructors.Externally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:25: record.internally_used @@ -1208,7 +1195,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1001 -Success: 973 -Failed: 28 -Ratio: 97.2027972028% +Total: 987 +Success: 987 +Failed: 0 +Ratio: 100.% diff --git a/check/threshold-3-0.5/threshold-3-0.5.ref b/check/threshold-3-0.5/threshold-3-0.5.ref index 224eaf94..e7676771 100644 --- a/check/threshold-3-0.5/threshold-3-0.5.ref +++ b/check/threshold-3-0.5/threshold-3-0.5.ref @@ -794,27 +794,13 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:8: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:16: product.unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:9: Alias.sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:17: Alias.product.unused ./examples/using_dune/preprocessed_lib/preprocessed.mli:14: constructors.Unused @@ -899,43 +885,44 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:6: sum.Used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:13: product.used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:14: product.used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:15: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:5: sum.Used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:6: sum.Used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:13: product.used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:14: product.used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:15: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:5: sum.Used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:6: sum.Used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:11: product.used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:12: product.used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:13: product.used_by_include -./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:14: product.used_by_module_alias ./examples/docs/fields_and_constructors/limitations/equal_types/via_include.mli:15: product.used_directly -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:4: Alias.sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:5: Alias.sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:6: Alias.sum.Used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:7: Alias.sum.Used_by_module_alias -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:8: Alias.sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:12: Alias.product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:13: Alias.product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:14: Alias.product.used_by_include ./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:15: Alias.product.used_by_module_alias -./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/via_module_alias.mli:16: Alias.product.used_directly + ./examples/using_dune/preprocessed_lib/preprocessed.mli:16: constructors.Internally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:17: constructors.Externally_used ./examples/using_dune/preprocessed_lib/preprocessed.mli:25: record.internally_used @@ -1612,7 +1599,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1323 -Success: 1295 -Failed: 28 -Ratio: 97.8835978836% +Total: 1309 +Success: 1309 +Failed: 0 +Ratio: 100.% diff --git a/src/deadCode.ml b/src/deadCode.ml index ecbf1d22..f1db7188 100644 --- a/src/deadCode.ml +++ b/src/deadCode.ml @@ -105,9 +105,12 @@ let structure_item super self i = begin match i.str_desc with | Tstr_type (_, l) when Config.must_report_section sections.types -> List.iter DeadType.tstr l - | Tstr_module {mb_name = {txt = Some txt; _}; _} -> + | Tstr_module ({mb_name = {txt = Some txt; _}; _} as mb) -> mods := txt :: !mods; - DeadMod.defined := String.concat "." (List.rev !mods) :: !DeadMod.defined + DeadMod.defined := String.concat "." (List.rev !mods) :: !DeadMod.defined; + let modname = State.File_infos.get_modname state.file_infos in + let path = !mods @ [modname] in + DeadSign.collect_equivalence_from_module_alias ~path mb | Tstr_class l when Config.must_report_section sections.methods -> List.iter DeadObj.tstr l | Tstr_include incl_decl -> @@ -381,6 +384,7 @@ let eof loc_dep = end; VdNode.eof (); DeadObj.eof (); + DeadSign.eof (); DeadType.dependencies := []; Hashtbl.reset incl diff --git a/src/deadSign.ml b/src/deadSign.ml index 63e306bf..411820b8 100644 --- a/src/deadSign.ml +++ b/src/deadSign.ml @@ -1,6 +1,19 @@ +let exported_modules = Hashtbl.create 32 +(* types of modules exported by the current compilation unit. + This is reset when calling eof. + This is used when encountering a module alias in the .cmt because + the module type information is limited to Mty_alias there. *) + +let eof () = + Hashtbl.reset exported_modules + (* Export helpers *) +let export_module ~path mt = + let key = List.map Ident.name path in + Hashtbl.add exported_modules key mt + let export_object ~path ~comp_unit ~stock id value = (* export a value as an object *) let path = Ident.create_persistent (Ident.name id ^ "*") :: path in @@ -103,6 +116,7 @@ let collect_export_from_signature ~path ~comp_unit signature = | Tsig_module {md_id = Some id; md_type; _} -> let path = id :: path in + export_module ~path md_type.mty_type; Utils.typedtree_signature_of_modtype md_type |> Option.iter (collect_signature path); mark_modtype_elements md_type @@ -182,6 +196,7 @@ let collect_export_from_structure ~path ~comp_unit structure = | Tmod_unpack _ -> () | Tmod_structure structure -> + export_module ~path m.mod_type; collect_structure ~path structure | Tmod_functor (_, m) | Tmod_apply (m, _, _) @@ -189,6 +204,7 @@ let collect_export_from_structure ~path ~comp_unit structure = | Tmod_constraint (m, _, Tmodtype_implicit, _) -> collect_module ~path m | Tmod_constraint (_, _, Tmodtype_explicit mt, _) -> + export_module ~path mt.mty_type; Utils.typedtree_signature_of_modtype mt |> Option.iter (collect_export_from_signature ~path ~comp_unit) @@ -301,6 +317,49 @@ let collect_from_include incl_decl = in List.iter (collect_from_sig_item ~path:[]) signature +let collect_equivalence_from_module_alias ~path module_binding = + match (module_binding : Typedtree.module_binding) with + | {mb_id = None; _} -> () + | {mb_id = Some _; mb_expr; _} -> + let rev_alias_path = path in + let rec collect_from_sig_item ~original_path ?(sub_path=[]) sig_item = + match (sig_item : Types.signature_item) with + + | Sig_module (id, _, {Types.md_type; _}, _, _) -> + let sub_path = Ident.name id :: sub_path in + Utils.signature_of_modtype md_type + |> List.iter (collect_from_sig_item ~original_path ~sub_path) + + | Sig_type (id, t, _, _) -> + let sub_path = List.rev (Ident.name id :: sub_path) in + DeadType.collect_equivalence_from_module_alias + ~rev_alias_path + ~original_path + ~sub_path + t + + | _ -> () + in + let rec collect_from_module_expr mod_expr = + match mod_expr.Typedtree.mod_desc with + | Tmod_ident (_, {txt; _}) -> + begin match Hashtbl.find_opt exported_modules rev_alias_path with + | None -> () (* module is not exported *) + | Some mt -> + let original_path = Longident.flatten txt in + Utils.signature_of_modtype mt + |> List.iter (collect_from_sig_item ~original_path) + end + | Tmod_constraint (mod_expr, _, _, _) + | Tmod_functor (_, mod_expr) + | Tmod_apply (mod_expr, _, _) + | Tmod_apply_unit mod_expr -> + collect_from_module_expr mod_expr + | Tmod_structure _ + | Tmod_unpack (_, _) -> () + in + collect_from_module_expr mb_expr + let correct_export sig_item = let state = State.get_current () in diff --git a/src/deadSign.mli b/src/deadSign.mli index d3d44216..b4efe9ab 100644 --- a/src/deadSign.mli +++ b/src/deadSign.mli @@ -30,6 +30,17 @@ val collect_from_include : [incl_decl]. *) +val collect_equivalence_from_module_alias : + path: string list -> + Typedtree.module_binding + -> unit +(** [collect_export_from_module_alias ~path module_binding] + links exports in the [module_binding]'s expr to the new module if it is + an alias (M1 = M2). Aliases on functor applications are included. + [path] is the current module id's path (with the new id included) in + reverse order (i.e. the new id is at the head). +*) + val correct_export : Types.signature_item -> unit (** Recursively traverse the sig_item, unexport its content and disables the reporting of optional arguments on its values. This is used to @@ -45,3 +56,6 @@ val modtype : for [mt] agree. I.e. if the first one is explicit when the second one is. If not, then the first one is implicit and [on_mismatch] is called on the second. *) + +val eof : unit -> unit +(** To use at the end of a [.cmt]'s analysis: reset internal state *) diff --git a/src/deadType.ml b/src/deadType.ml index 75f8a14a..dc78c350 100644 --- a/src/deadType.ml +++ b/src/deadType.ml @@ -79,6 +79,7 @@ let collect_export path u stock t = let save id loc = if t.type_manifest = None then + (* do not export t1 when there is an explicit equation t1 = t2 *) export path u stock id loc; let path = String.concat "." @@ List.rev_map (fun id -> Ident.name id) (id::path) in Hashtbl.replace fields path loc.Location.loc_start @@ -138,6 +139,60 @@ let add_type_eq component_path eq_type_path component_name = let eq_path = eq_type_path ^ "." ^ component_name in equivalences := (component_path, eq_path) :: !equivalences + +let collect_equivalence_from_module_alias ~rev_alias_path ~original_path ~sub_path type_decl = + let type_path = + List.rev_append rev_alias_path sub_path + |> String.concat "." + in + let add_type_eq component_id = + let component_name = Ident.name component_id in + let component_path = type_path ^ "." ^ component_name in + match Hashtbl.find_opt fields component_path with + | None -> () (* The component_path is not undefined (thus, unexported) *) + | Some _ -> + (* The component_path is known because the current compilation unit + defines it *) + let original_eq_type_path = + String.concat "." (original_path @ sub_path) + in + let rec add_eq_type internal_path = + (* internal_path is a tentative path to the aliased type + internally. It ends with original_eq_type_path, which is + the shortest possible path to the aliased type within the + current compilation unit *) + match internal_path with + | None -> (* the equivalent type is external *) + add_type_eq component_path original_eq_type_path component_name + | Some internal_path -> + let eq_type_path = String.concat "." internal_path in + let eq_component_path = eq_type_path ^ "." ^ component_name in + match Hashtbl.find_opt fields eq_component_path with + | Some _ -> () (* local alias *) + | None -> + let internal_path = + match internal_path with + | [] | _::[] -> None + | _::internal_path -> Some internal_path + in + add_eq_type internal_path + in + (* *) + let internal_path = + original_eq_type_path :: List.tl rev_alias_path + |> List.rev + in + add_eq_type (Some internal_path) + + in + match type_decl.type_kind with + | Type_record (l, _) -> + List.iter (fun {Types.ld_id; _} -> add_type_eq ld_id) l + | Type_variant (l, _) -> + List.iter (fun {Types.cd_id; _} -> add_type_eq cd_id) l + | _ -> () + + let collect_equivalence_from_include ~incl_id ~path type_decl = let state = State.get_current () in (* internal path *) @@ -156,7 +211,7 @@ let collect_equivalence_from_include ~incl_id ~path type_decl = (* internal path *) let component_path = type_path ^ "." ^ component_name in match Hashtbl.find_opt fields component_path with - | None -> () (* The comonent_path is not undefined (thus, unexported) *) + | None -> () (* The component_path is not undefined (thus, unexported) *) | Some _ -> (* The component_path is known because the current compilation unit defines it *) diff --git a/src/deadType.mli b/src/deadType.mli index 4696fd43..4a711d0d 100644 --- a/src/deadType.mli +++ b/src/deadType.mli @@ -17,6 +17,26 @@ val to_string : Types.type_expr -> string val check_style : Types.type_expr -> Lexing.position -> unit (** Look for bad style typing. (i.e. Argument expecting an optional argument) *) +val collect_equivalence_from_module_alias : + rev_alias_path: string list -> + original_path: string list -> + sub_path: string list -> + Types.type_declaration + -> unit +(** [collect_equivalence_from_module_alias ~rev_alias_path ~original_path ~sub_path type_decl] + stores equivalences between components of the [type_decl] defined in + the current compilation unit at [sub_path] in the module defined at + [List.rev rev_alias_path], if they are exported, and the same components + in the same type at [sub_path] in the aliased module at [original_path] + if this module defined outside the current compilation unit. + [rev_alias_path] must not be empty and is represented backward + (i.e. the type name is at the head). + + E.g. the .mli declares [module M : sig type t = (* type_decl *) end] + and the .ml [module M = N] and [N] also declares + [type t = (* type_decl *)] +*) + val collect_equivalence_from_include : incl_id: Longident.t -> path: string list -> @@ -29,7 +49,7 @@ val collect_equivalence_from_include : [path] must not be empty and is represented forward (i.e. the type name is at the end). - E.g. the .mli declares [type t = (* type_decl *)] whereas the .ml + E.g. the .mli declares [type t = (* type_decl *)] and the .ml [include M] and [M] also declares [type t = (* type_decl *)] *) From 46d57c49cc9068abcc18e0096d649e250e3216e3 Mon Sep 17 00:00:00 2001 From: Corentin De Souza <9597216+fantazio@users.noreply.github.com> Date: Thu, 20 Aug 2026 14:04:20 +0200 Subject: [PATCH 6/7] [examples][field_ctor] add all_internal eq_types This specific example tests the handling of type equivalences within a single compilation unit, with only one of the types exported. All the internal types are equivalent, by means of eqcplicit equations, hidden equations, module alias and include. --- check/classic/classic.exp | 2 + check/classic/classic.ref | 20 +++- check/internal/internal.exp | 2 + check/internal/internal.ref | 20 +++- check/threshold-1/threshold-1.exp | 14 +++ check/threshold-1/threshold-1.ref | 32 +++++- check/threshold-3-0.5/threshold-3-0.5.exp | 14 +++ check/threshold-3-0.5/threshold-3-0.5.ref | 32 +++++- .../limitations/equal_types/Makefile | 1 + .../limitations/equal_types/all_internal.ml | 97 +++++++++++++++++++ .../limitations/equal_types/all_internal.mli | 19 ++++ .../limitations/equal_types/equal_types.ml | 4 + 12 files changed, 241 insertions(+), 16 deletions(-) create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/all_internal.ml create mode 100644 examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli diff --git a/check/classic/classic.exp b/check/classic/classic.exp index 43098436..5406478a 100644 --- a/check/classic/classic.exp +++ b/check/classic/classic.exp @@ -269,6 +269,8 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused diff --git a/check/classic/classic.ref b/check/classic/classic.ref index 879e8010..f2ec35f2 100644 --- a/check/classic/classic.ref +++ b/check/classic/classic.ref @@ -269,6 +269,18 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused @@ -730,7 +742,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 601 -Success: 601 -Failed: 0 -Ratio: 100.% +Total: 613 +Success: 603 +Failed: 10 +Ratio: 98.3686786297% diff --git a/check/internal/internal.exp b/check/internal/internal.exp index ead2908f..9429beef 100644 --- a/check/internal/internal.exp +++ b/check/internal/internal.exp @@ -221,6 +221,8 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused diff --git a/check/internal/internal.ref b/check/internal/internal.ref index 09d64e00..31c39b58 100644 --- a/check/internal/internal.ref +++ b/check/internal/internal.ref @@ -221,6 +221,18 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused @@ -682,7 +694,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 557 -Success: 557 -Failed: 0 -Ratio: 100.% +Total: 569 +Success: 559 +Failed: 10 +Ratio: 98.2425307557% diff --git a/check/threshold-1/threshold-1.exp b/check/threshold-1/threshold-1.exp index 53c9423d..19a9adc4 100644 --- a/check/threshold-1/threshold-1.exp +++ b/check/threshold-1/threshold-1.exp @@ -612,6 +612,8 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused @@ -700,6 +702,18 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:8: sum.Used_externally +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:17: product.used_externally ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include diff --git a/check/threshold-1/threshold-1.ref b/check/threshold-1/threshold-1.ref index 4c62b833..efef1638 100644 --- a/check/threshold-1/threshold-1.ref +++ b/check/threshold-1/threshold-1.ref @@ -612,6 +612,18 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused @@ -700,6 +712,18 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:8: sum.Used_externally +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:17: product.used_externally ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include @@ -1195,7 +1219,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 987 -Success: 987 -Failed: 0 -Ratio: 100.% +Total: 1011 +Success: 991 +Failed: 20 +Ratio: 98.021760633% diff --git a/check/threshold-3-0.5/threshold-3-0.5.exp b/check/threshold-3-0.5/threshold-3-0.5.exp index 55ee4d5a..999f0e6a 100644 --- a/check/threshold-3-0.5/threshold-3-0.5.exp +++ b/check/threshold-3-0.5/threshold-3-0.5.exp @@ -794,6 +794,8 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused @@ -882,6 +884,18 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:8: sum.Used_externally +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:17: product.used_externally ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include diff --git a/check/threshold-3-0.5/threshold-3-0.5.ref b/check/threshold-3-0.5/threshold-3-0.5.ref index e7676771..c03c8a1e 100644 --- a/check/threshold-3-0.5/threshold-3-0.5.ref +++ b/check/threshold-3-0.5/threshold-3-0.5.ref @@ -794,6 +794,18 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Should not be detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/via_hidden_equations.mli:8: sum.Unused @@ -882,6 +894,18 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:8: sum.Used_externally +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:17: product.used_externally ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:5: sum.Used_by_include @@ -1599,7 +1623,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1309 -Success: 1309 -Failed: 0 -Ratio: 100.% +Total: 1333 +Success: 1313 +Failed: 20 +Ratio: 98.4996249062% diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/Makefile b/examples/docs/fields_and_constructors/limitations/equal_types/Makefile index c324a81f..c0cd3ba3 100644 --- a/examples/docs/fields_and_constructors/limitations/equal_types/Makefile +++ b/examples/docs/fields_and_constructors/limitations/equal_types/Makefile @@ -3,6 +3,7 @@ SRC:=definitions.ml \ via_hidden_equations.mli via_hidden_equations.ml \ via_include.mli via_include.ml \ via_module_alias.mli via_module_alias.ml \ + all_internal.mli all_internal.ml \ equal_types.ml all: build analyze diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/all_internal.ml b/examples/docs/fields_and_constructors/limitations/equal_types/all_internal.ml new file mode 100644 index 00000000..4e46ffeb --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/all_internal.ml @@ -0,0 +1,97 @@ +(* all_internal.mli *) +type original_sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Used_externally + | Unused + +type original_product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + used_externally : int; + unused : int; +} + +let _ : original_product -> original_sum = + fun {used_directly; _} -> Used_directly + +type explicit_eq_sum = original_sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Used_externally + | Unused + +type explicit_eq_product = original_product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + used_externally : int; + unused : int; +} + +let _ : explicit_eq_product -> explicit_eq_sum = + fun {used_by_explicit_equation; _} -> Used_by_explicit_equation + +module M : sig + type sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Used_externally + | Unused + + type product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + used_externally : int; + unused : int; + } +end = struct + type sum = explicit_eq_sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Used_externally + | Unused + + type product = explicit_eq_product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + used_externally : int; + unused : int; + } +end + +let _ : M.product -> M.sum = + fun {used_by_hidden_equation; _} -> Used_by_hidden_equation + +module Alias = M + +let _ : Alias.product -> Alias.sum = + fun {used_by_module_alias; _} -> Used_by_module_alias + +include Alias + +let _ : product -> sum = + fun {used_by_include; _} -> Used_by_include diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli b/examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli new file mode 100644 index 00000000..0462e540 --- /dev/null +++ b/examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli @@ -0,0 +1,19 @@ +(* all_internal.mli *) +type sum = + | Used_by_explicit_equation + | Used_by_hidden_equation + | Used_by_include + | Used_by_module_alias + | Used_directly + | Used_externally + | Unused + +type product = { + used_by_explicit_equation : int; + used_by_hidden_equation : int; + used_by_include : int; + used_by_module_alias : int; + used_directly : int; + used_externally : int; + unused : int; +} diff --git a/examples/docs/fields_and_constructors/limitations/equal_types/equal_types.ml b/examples/docs/fields_and_constructors/limitations/equal_types/equal_types.ml index 1eb605f0..f122432b 100644 --- a/examples/docs/fields_and_constructors/limitations/equal_types/equal_types.ml +++ b/examples/docs/fields_and_constructors/limitations/equal_types/equal_types.ml @@ -18,3 +18,7 @@ let _ = let _ = let open Via_module_alias.Alias in fun {used_by_module_alias; _} -> Used_by_module_alias + +let _ = + let open All_internal in + fun {used_externally; _} -> Used_externally From 33e836c5103d1f094d5f818827c35f3277e5b09a Mon Sep 17 00:00:00 2001 From: Corentin De Souza <9597216+fantazio@users.noreply.github.com> Date: Wed, 19 Aug 2026 17:11:07 +0200 Subject: [PATCH 7/7] [src][deadType] handle internal type equivalences This relies on the use of the available env to retrieve the module types of local aliases. Internal type equivalences are stored with all the other equivalences and resolved at the end. This fixes the FP/FN of eq_types' all_internal examples. --- check/classic/classic.ref | 16 +-- check/internal/internal.ref | 16 +-- check/threshold-1/threshold-1.ref | 38 +++---- check/threshold-3-0.5/threshold-3-0.5.ref | 38 +++---- src/deadSign.ml | 59 ++++++++-- src/deadType.ml | 132 ++++++++++++---------- src/deadType.mli | 12 +- src/state/file_infos.ml | 8 ++ 8 files changed, 168 insertions(+), 151 deletions(-) diff --git a/check/classic/classic.ref b/check/classic/classic.ref index f2ec35f2..50255555 100644 --- a/check/classic/classic.ref +++ b/check/classic/classic.ref @@ -269,17 +269,7 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused @@ -742,7 +732,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 613 +Total: 603 Success: 603 -Failed: 10 -Ratio: 98.3686786297% +Failed: 0 +Ratio: 100.% diff --git a/check/internal/internal.ref b/check/internal/internal.ref index 31c39b58..dab000ad 100644 --- a/check/internal/internal.ref +++ b/check/internal/internal.ref @@ -221,17 +221,7 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused @@ -694,7 +684,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 569 +Total: 559 Success: 559 -Failed: 10 -Ratio: 98.2425307557% +Failed: 0 +Ratio: 100.% diff --git a/check/threshold-1/threshold-1.ref b/check/threshold-1/threshold-1.ref index efef1638..45c22c84 100644 --- a/check/threshold-1/threshold-1.ref +++ b/check/threshold-1/threshold-1.ref @@ -612,17 +612,7 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused @@ -712,17 +702,17 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:8: sum.Used_externally -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:17: product.used_externally ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation @@ -1219,7 +1209,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1011 -Success: 991 -Failed: 20 -Ratio: 98.021760633% +Total: 1001 +Success: 1001 +Failed: 0 +Ratio: 100.% diff --git a/check/threshold-3-0.5/threshold-3-0.5.ref b/check/threshold-3-0.5/threshold-3-0.5.ref index c03c8a1e..65cf15dd 100644 --- a/check/threshold-3-0.5/threshold-3-0.5.ref +++ b/check/threshold-3-0.5/threshold-3-0.5.ref @@ -794,17 +794,7 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Right ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.left -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:9: sum.Unused -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Should not be detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Should not be detected ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:18: product.unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:8: sum.Unused ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:16: product.unused @@ -894,17 +884,17 @@ Nothing else to report in this section ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:2: either.Left ./examples/docs/fields_and_constructors/code_constructs/polymorphic_type/polymorphic_type_lib.mli:3: both.right -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:3: sum.Used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:4: sum.Used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:5: sum.Used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:6: sum.Used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:7: sum.Used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:8: sum.Used_externally -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias: Not detected -./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly: Not detected +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:12: product.used_by_explicit_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:13: product.used_by_hidden_equation +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:14: product.used_by_include +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:15: product.used_by_module_alias +./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:16: product.used_directly ./examples/docs/fields_and_constructors/limitations/equal_types/all_internal.mli:17: product.used_externally ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:3: sum.Used_by_explicit_equation ./examples/docs/fields_and_constructors/limitations/equal_types/definitions.ml:4: sum.Used_by_hidden_equation @@ -1623,7 +1613,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1333 -Success: 1313 -Failed: 20 -Ratio: 98.4996249062% +Total: 1323 +Success: 1323 +Failed: 0 +Ratio: 100.% diff --git a/src/deadSign.ml b/src/deadSign.ml index 411820b8..239610e6 100644 --- a/src/deadSign.ml +++ b/src/deadSign.ml @@ -264,7 +264,18 @@ let collect_from_include incl_decl = let rec get_mod_name_and_signature mod_expr = match mod_expr.Typedtree.mod_desc with | Tmod_ident (_, {txt; _}) -> - let signature = Utils.signature_of_modtype mod_expr.mod_type in + let mt = + match mod_expr.mod_type with + | Mty_alias _ -> + (* find the original signature in the env *) + begin try + let env = Envaux.env_of_only_summary mod_expr.mod_env in + Env.scrape_alias env mod_expr.mod_type + with Envaux.(Error (Module_not_found _)) -> mod_expr.mod_type + end + | _ -> mod_expr.mod_type + in + let signature = Utils.signature_of_modtype mt in (Some txt, signature) | Tmod_structure structure -> (None, structure.str_type) @@ -317,22 +328,27 @@ let collect_from_include incl_decl = in List.iter (collect_from_sig_item ~path:[]) signature + let collect_equivalence_from_module_alias ~path module_binding = match (module_binding : Typedtree.module_binding) with | {mb_id = None; _} -> () | {mb_id = Some _; mb_expr; _} -> let rev_alias_path = path in - let rec collect_from_sig_item ~original_path ?(sub_path=[]) sig_item = + let rec collect_from_sig_item + ~is_internal ~original_path ?(sub_path=[]) sig_item + = match (sig_item : Types.signature_item) with | Sig_module (id, _, {Types.md_type; _}, _, _) -> let sub_path = Ident.name id :: sub_path in Utils.signature_of_modtype md_type - |> List.iter (collect_from_sig_item ~original_path ~sub_path) + |> List.iter + (collect_from_sig_item ~is_internal ~original_path ~sub_path) | Sig_type (id, t, _, _) -> let sub_path = List.rev (Ident.name id :: sub_path) in DeadType.collect_equivalence_from_module_alias + ~is_internal ~rev_alias_path ~original_path ~sub_path @@ -342,14 +358,35 @@ let collect_equivalence_from_module_alias ~path module_binding = in let rec collect_from_module_expr mod_expr = match mod_expr.Typedtree.mod_desc with - | Tmod_ident (_, {txt; _}) -> - begin match Hashtbl.find_opt exported_modules rev_alias_path with - | None -> () (* module is not exported *) - | Some mt -> - let original_path = Longident.flatten txt in - Utils.signature_of_modtype mt - |> List.iter (collect_from_sig_item ~original_path) - end + | Tmod_ident (mod_path, _) -> + let env = + try + Some (Envaux.env_of_only_summary mod_expr.mod_env) + with + Envaux.(Error (Module_not_found _)) -> None + in + let internal_md = + Option.bind env + (fun env -> + try + Some (Env.find_module mod_path env) + with Not_found -> None + ) + in + let mt = + match Hashtbl.find_opt exported_modules rev_alias_path with + | Some _ as mt -> mt + | None -> Option.map (fun md -> md.Types.md_type) internal_md + in + Option.iter + (fun mt -> + let original_path = Path.name mod_path in + let is_internal = Option.is_some internal_md in + Utils.signature_of_modtype mt + |> List.iter + (collect_from_sig_item ~is_internal ~original_path) + ) + mt | Tmod_constraint (mod_expr, _, _, _) | Tmod_functor (_, mod_expr) | Tmod_apply (mod_expr, _, _) diff --git a/src/deadType.ml b/src/deadType.ml index dc78c350..c4a2b8d6 100644 --- a/src/deadType.ml +++ b/src/deadType.ml @@ -139,70 +139,79 @@ let add_type_eq component_path eq_type_path component_name = let eq_path = eq_type_path ^ "." ^ component_name in equivalences := (component_path, eq_path) :: !equivalences +(** Attempt to find a valid path by shortening [internal_path] until + only the head is left. + [internal_path] is built in reverse: that head is equivalent to the + external path (in the right order), the end is the current compilation + unit's name, and the whole path is initially the longest to the + point of equivalence. + Thus, when only the head is left, this function is equivalent to + adding an external type_eq.. +*) +let rec add_type_eq_internal ~internal_path ~component_path ~component_name = + match internal_path with + | [] -> assert false (* There must be at least one element *) + | external_type_path :: [] -> (* external alias *) + add_type_eq component_path external_type_path component_name + | external_type_path :: rev_internal_path -> + let eq_type_path = + List.rev internal_path |> String.concat "." + in + let eq_component_path = eq_type_path ^ "." ^ component_name in + match Hashtbl.find_opt fields eq_component_path with + | Some _ -> (* internal alias *) + add_type_eq component_path eq_type_path component_name + | None -> + let internal_path = + match rev_internal_path with + | [] | _::[] -> external_type_path :: [] + | _::rev_internal_path -> external_type_path ::rev_internal_path + in + add_type_eq_internal ~internal_path ~component_path ~component_name -let collect_equivalence_from_module_alias ~rev_alias_path ~original_path ~sub_path type_decl = +let collect_equivalence_from_module_alias + ~is_internal ~rev_alias_path ~original_path ~sub_path type_decl += let type_path = List.rev_append rev_alias_path sub_path |> String.concat "." in - let add_type_eq component_id = + let original_eq_type_path = + String.concat "." (original_path :: sub_path) + in + let add_type_eq_internal = + if is_internal then + let internal_path = original_eq_type_path :: List.tl rev_alias_path in + add_type_eq_internal ~internal_path + else + fun ~component_path ~component_name -> + add_type_eq component_path original_eq_type_path component_name + in + let add_type_eq loc component_id = let component_name = Ident.name component_id in let component_path = type_path ^ "." ^ component_name in - match Hashtbl.find_opt fields component_path with - | None -> () (* The component_path is not undefined (thus, unexported) *) - | Some _ -> - (* The component_path is known because the current compilation unit - defines it *) - let original_eq_type_path = - String.concat "." (original_path @ sub_path) - in - let rec add_eq_type internal_path = - (* internal_path is a tentative path to the aliased type - internally. It ends with original_eq_type_path, which is - the shortest possible path to the aliased type within the - current compilation unit *) - match internal_path with - | None -> (* the equivalent type is external *) - add_type_eq component_path original_eq_type_path component_name - | Some internal_path -> - let eq_type_path = String.concat "." internal_path in - let eq_component_path = eq_type_path ^ "." ^ component_name in - match Hashtbl.find_opt fields eq_component_path with - | Some _ -> () (* local alias *) - | None -> - let internal_path = - match internal_path with - | [] | _::[] -> None - | _::internal_path -> Some internal_path - in - add_eq_type internal_path - in - (* *) - let internal_path = - original_eq_type_path :: List.tl rev_alias_path - |> List.rev - in - add_eq_type (Some internal_path) - + if not (Hashtbl.mem fields component_path) then + Hashtbl.add fields component_path loc.Location.loc_start; + add_type_eq_internal ~component_path ~component_name in match type_decl.type_kind with | Type_record (l, _) -> - List.iter (fun {Types.ld_id; _} -> add_type_eq ld_id) l + List.iter (fun {Types.ld_id; ld_loc; _} -> add_type_eq ld_loc ld_id) l | Type_variant (l, _) -> - List.iter (fun {Types.cd_id; _} -> add_type_eq cd_id) l + List.iter (fun {Types.cd_id; cd_loc; _} -> add_type_eq cd_loc cd_id) l | _ -> () let collect_equivalence_from_include ~incl_id ~path type_decl = let state = State.get_current () in + let module_id = State.File_infos.get_modname state.file_infos in (* internal path *) + let rev_curr_path = !DeadCommon.mods @ [module_id] in let type_path = - let module_id = State.File_infos.get_modname state.file_infos in - module_id :: List.rev_append !DeadCommon.mods path + List.rev_append rev_curr_path path |> String.concat "." in - (* external path, belongs to incl_id *) - let eq_type_path = + let original_eq_type_path = Longident.flatten incl_id @ path |> String.concat "." in @@ -210,12 +219,8 @@ let collect_equivalence_from_include ~incl_id ~path type_decl = let component_name = Ident.name component_id in (* internal path *) let component_path = type_path ^ "." ^ component_name in - match Hashtbl.find_opt fields component_path with - | None -> () (* The component_path is not undefined (thus, unexported) *) - | Some _ -> - (* The component_path is known because the current compilation unit - defines it *) - add_type_eq component_path eq_type_path component_name + let internal_path = original_eq_type_path :: rev_curr_path in + add_type_eq_internal ~internal_path ~component_path ~component_name in match type_decl.type_kind with | Type_record (l, _) -> @@ -250,27 +255,28 @@ let tstr typ = add_type_eq component_path eq_type_path component_name in - let handle_internal_type_eq : Lexing.position -> string -> unit = + let handle_internal_type_eq : string -> string -> unit = (* Store t1 = t2 equivalence as a dependency, with t2 defined within the current compilation unit *) match eq_type_path with | None -> fun _ _ -> () | Some eq_type_path -> - fun loc component_name -> - let eq_path = - String.concat "." [modname; eq_type_path; component_name] + fun component_path component_name -> + let eq_type_path = String.concat "." [modname; eq_type_path] in + let eq_component_path = + String.concat "." [eq_type_path; component_name] in - match Hashtbl.find_opt fields eq_path with + match Hashtbl.find_opt fields eq_component_path with | None -> () (* t2 is not defined locally *) - | Some eq_loc -> - dependencies := (eq_loc, loc) :: !dependencies; + | Some _ -> + add_type_eq component_path eq_type_path component_name in - let handle_type_dep loc path_loc component_name = - handle_internal_type_eq loc component_name; + let handle_type_dep loc path_loc component_path component_name = + handle_internal_type_eq component_path component_name; if path_loc <> loc then (* store dependency between .ml and .mli *) - dependencies := (path_loc, loc) :: !dependencies; + dependencies := (path_loc, loc) :: !dependencies in let assoc name loc = @@ -286,10 +292,12 @@ let tstr typ = in handle_external_type_eq path component_name; match Hashtbl.find_opt fields path with - | None -> Hashtbl.add fields path loc + | None -> + Hashtbl.add fields path loc; + handle_internal_type_eq path component_name | Some path_loc -> (* The path is known because the current compilation unit exports it *) - handle_type_dep loc path_loc component_name + handle_type_dep loc path_loc path component_name in let assoc name loc ctyp = assoc name loc; diff --git a/src/deadType.mli b/src/deadType.mli index 4a711d0d..1bc133fe 100644 --- a/src/deadType.mli +++ b/src/deadType.mli @@ -18,19 +18,23 @@ val check_style : Types.type_expr -> Lexing.position -> unit (** Look for bad style typing. (i.e. Argument expecting an optional argument) *) val collect_equivalence_from_module_alias : + is_internal: bool -> rev_alias_path: string list -> - original_path: string list -> + original_path: string -> sub_path: string list -> Types.type_declaration -> unit (** [collect_equivalence_from_module_alias ~rev_alias_path ~original_path ~sub_path type_decl] stores equivalences between components of the [type_decl] defined in the current compilation unit at [sub_path] in the module defined at - [List.rev rev_alias_path], if they are exported, and the same components - in the same type at [sub_path] in the aliased module at [original_path] - if this module defined outside the current compilation unit. + [List.rev rev_alias_path], and the same components in the same type + at [sub_path] in the aliased module at [original_path]. [rev_alias_path] must not be empty and is represented backward (i.e. the type name is at the head). + If [is_internal = true] then there is an attempt to find the aliased + definition in the current compilation unit (working upward from the + alias path). If not found, then the behavior is the same as if + [is_internal = false]: the aliased type is conidered external. E.g. the .mli declares [module M : sig type t = (* type_decl *) end] and the .ml [module M = N] and [N] also declares diff --git a/src/state/file_infos.ml b/src/state/file_infos.ml index 76e03867..06202e7b 100644 --- a/src/state/file_infos.ml +++ b/src/state/file_infos.ml @@ -28,6 +28,13 @@ let empty = { sourcepath = None; } +(** Necessary for Envaux.env_of_only_summary *) +let setup_env (paths : Load_path.paths) = + Load_path.reset(); + List.iter (Load_path.add_dir ~hidden:false) paths.visible; + List.iter (Load_path.add_dir ~hidden:true) paths.hidden; + Envaux.reset_cache () + (** [init_from_all_cm_infos ~cm_file cmt_infos] creates a [t] with: - information from [cmt_infos] : [builddir], [modname], [sourcepath]; - [cm_file]; @@ -51,6 +58,7 @@ let init_from_all_cm_infos ~cm_file cmt_infos = Cmt {strc; sign = None; location_dependencies} | _ -> Neither in + setup_env cmt_infos.cmt_loadpath; {builddir; cm_file; cm_infos; modname; sourcepath} (** [init_from_cm_file cm_file] returns an [Ok t] with [t] filled with general