diff --git a/.github/workflows/mypy_primer.yaml b/.github/workflows/mypy_primer.yaml index abdba795b4..367e36fa73 100644 --- a/.github/workflows/mypy_primer.yaml +++ b/.github/workflows/mypy_primer.yaml @@ -68,7 +68,7 @@ jobs: --type-checker knot \ --old base_commit \ --new "$GITHUB_SHA" \ - --project-selector '/(mypy_primer|black|pyp|git-revise|zipp|arrow|isort|itsdangerous|rich|packaging|pybind11|pyinstrument|typeshed-stats|scrapy)$' \ + --project-selector '/(mypy_primer|black|pyp|git-revise|zipp|arrow|isort|itsdangerous|rich|packaging|pybind11|pyinstrument|typeshed-stats|scrapy|werkzeug|bidict)$' \ --output concise \ --debug > mypy_primer.diff || [ $? -eq 1 ] diff --git a/crates/red_knot_python_semantic/src/types/narrow.rs b/crates/red_knot_python_semantic/src/types/narrow.rs index 9410253a79..05b4c22462 100644 --- a/crates/red_knot_python_semantic/src/types/narrow.rs +++ b/crates/red_knot_python_semantic/src/types/narrow.rs @@ -69,7 +69,11 @@ fn all_narrowing_constraints_for_pattern<'db>( } #[allow(clippy::ref_option)] -#[salsa::tracked(return_ref)] +#[salsa::tracked( + return_ref, + cycle_fn=constraints_for_expression_cycle_recover, + cycle_initial=constraints_for_expression_cycle_initial, +)] fn all_narrowing_constraints_for_expression<'db>( db: &'db dyn Db, expression: Expression<'db>, @@ -78,7 +82,11 @@ fn all_narrowing_constraints_for_expression<'db>( } #[allow(clippy::ref_option)] -#[salsa::tracked(return_ref)] +#[salsa::tracked( + return_ref, + cycle_fn=negative_constraints_for_expression_cycle_recover, + cycle_initial=negative_constraints_for_expression_cycle_initial, +)] fn all_negative_narrowing_constraints_for_expression<'db>( db: &'db dyn Db, expression: Expression<'db>, @@ -86,6 +94,40 @@ fn all_negative_narrowing_constraints_for_expression<'db>( NarrowingConstraintsBuilder::new(db, PredicateNode::Expression(expression), false).finish() } +#[allow(clippy::ref_option)] +fn constraints_for_expression_cycle_recover<'db>( + _db: &'db dyn Db, + _value: &Option>, + _count: u32, + _expression: Expression<'db>, +) -> salsa::CycleRecoveryAction>> { + salsa::CycleRecoveryAction::Iterate +} + +fn constraints_for_expression_cycle_initial<'db>( + _db: &'db dyn Db, + _expression: Expression<'db>, +) -> Option> { + None +} + +#[allow(clippy::ref_option)] +fn negative_constraints_for_expression_cycle_recover<'db>( + _db: &'db dyn Db, + _value: &Option>, + _count: u32, + _expression: Expression<'db>, +) -> salsa::CycleRecoveryAction>> { + salsa::CycleRecoveryAction::Iterate +} + +fn negative_constraints_for_expression_cycle_initial<'db>( + _db: &'db dyn Db, + _expression: Expression<'db>, +) -> Option> { + None +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum KnownConstraintFunction { /// `builtins.isinstance`