mirror of
				https://github.com/astral-sh/ruff.git
				synced 2025-10-31 12:05:57 +00:00 
			
		
		
		
	[ty] Model reachability of star import definitions for nonlocal lookups (#19066)
	
		
			
	
		
	
	
		
	
		
			Some checks are pending
		
		
	
	
		
			
				
	
				CI / Determine changes (push) Waiting to run
				
			
		
			
				
	
				CI / cargo fmt (push) Waiting to run
				
			
		
			
				
	
				CI / cargo clippy (push) Blocked by required conditions
				
			
		
			
				
	
				CI / cargo test (linux) (push) Blocked by required conditions
				
			
		
			
				
	
				CI / cargo test (linux, release) (push) Blocked by required conditions
				
			
		
			
				
	
				CI / cargo test (windows) (push) Blocked by required conditions
				
			
		
			
				
	
				CI / cargo test (wasm) (push) Blocked by required conditions
				
			
		
			
				
	
				CI / cargo build (release) (push) Waiting to run
				
			
		
			
				
	
				CI / cargo build (msrv) (push) Blocked by required conditions
				
			
		
			
				
	
				CI / cargo fuzz build (push) Blocked by required conditions
				
			
		
			
				
	
				CI / fuzz parser (push) Blocked by required conditions
				
			
		
			
				
	
				CI / test scripts (push) Blocked by required conditions
				
			
		
			
				
	
				CI / ecosystem (push) Blocked by required conditions
				
			
		
			
				
	
				CI / Fuzz for new ty panics (push) Blocked by required conditions
				
			
		
			
				
	
				CI / cargo shear (push) Blocked by required conditions
				
			
		
			
				
	
				CI / python package (push) Waiting to run
				
			
		
			
				
	
				CI / pre-commit (push) Waiting to run
				
			
		
			
				
	
				CI / mkdocs (push) Waiting to run
				
			
		
			
				
	
				CI / formatter instabilities and black similarity (push) Blocked by required conditions
				
			
		
			
				
	
				CI / test ruff-lsp (push) Blocked by required conditions
				
			
		
			
				
	
				CI / check playground (push) Blocked by required conditions
				
			
		
			
				
	
				CI / benchmarks-instrumented (push) Blocked by required conditions
				
			
		
			
				
	
				CI / benchmarks-walltime (push) Blocked by required conditions
				
			
		
			
				
	
				[ty Playground] Release / publish (push) Waiting to run
				
			
		
		
	
	
				
					
				
			
		
			Some checks are pending
		
		
	
	CI / Determine changes (push) Waiting to run
				
			CI / cargo fmt (push) Waiting to run
				
			CI / cargo clippy (push) Blocked by required conditions
				
			CI / cargo test (linux) (push) Blocked by required conditions
				
			CI / cargo test (linux, release) (push) Blocked by required conditions
				
			CI / cargo test (windows) (push) Blocked by required conditions
				
			CI / cargo test (wasm) (push) Blocked by required conditions
				
			CI / cargo build (release) (push) Waiting to run
				
			CI / cargo build (msrv) (push) Blocked by required conditions
				
			CI / cargo fuzz build (push) Blocked by required conditions
				
			CI / fuzz parser (push) Blocked by required conditions
				
			CI / test scripts (push) Blocked by required conditions
				
			CI / ecosystem (push) Blocked by required conditions
				
			CI / Fuzz for new ty panics (push) Blocked by required conditions
				
			CI / cargo shear (push) Blocked by required conditions
				
			CI / python package (push) Waiting to run
				
			CI / pre-commit (push) Waiting to run
				
			CI / mkdocs (push) Waiting to run
				
			CI / formatter instabilities and black similarity (push) Blocked by required conditions
				
			CI / test ruff-lsp (push) Blocked by required conditions
				
			CI / check playground (push) Blocked by required conditions
				
			CI / benchmarks-instrumented (push) Blocked by required conditions
				
			CI / benchmarks-walltime (push) Blocked by required conditions
				
			[ty Playground] Release / publish (push) Waiting to run
				
			## Summary Temporarily modify `UseDefMapBuilder::reachability` for star imports in order for new definitions to pick up the right reachability. This was already working for `UseDefMapBuilder::place_states`, but not for `UseDefMapBuilder::reachable_definitions`. closes https://github.com/astral-sh/ty/issues/728 ## Test Plan Regression test
This commit is contained in:
		
							parent
							
								
									4016521bf6
								
							
						
					
					
						commit
						7d468ee58a
					
				
					 4 changed files with 48 additions and 20 deletions
				
			
		|  | @ -1316,15 +1316,38 @@ impl<'ast> Visitor<'ast> for SemanticIndexBuilder<'_, 'ast> { | |||
|                                 referenced_module, | ||||
|                             ); | ||||
| 
 | ||||
|                             let star_import_predicate = self.add_predicate(star_import.into()); | ||||
| 
 | ||||
|                             let pre_definition = | ||||
|                                 self.current_use_def_map().single_place_snapshot(symbol_id); | ||||
|                             let pre_definition_reachability = | ||||
|                                 self.current_use_def_map().reachability; | ||||
| 
 | ||||
|                             // Temporarily modify the reachability to include the star import predicate,
 | ||||
|                             // in order for the new definition to pick it up.
 | ||||
|                             let reachability_constraints = | ||||
|                                 &mut self.current_use_def_map_mut().reachability_constraints; | ||||
|                             let star_import_reachability = | ||||
|                                 reachability_constraints.add_atom(star_import_predicate); | ||||
|                             let definition_reachability = reachability_constraints | ||||
|                                 .add_and_constraint( | ||||
|                                     pre_definition_reachability, | ||||
|                                     star_import_reachability, | ||||
|                                 ); | ||||
|                             self.current_use_def_map_mut().reachability = definition_reachability; | ||||
| 
 | ||||
|                             self.push_additional_definition(symbol_id, node_ref); | ||||
| 
 | ||||
|                             self.current_use_def_map_mut() | ||||
|                                 .record_and_negate_star_import_reachability_constraint( | ||||
|                                     star_import, | ||||
|                                     star_import_reachability, | ||||
|                                     symbol_id, | ||||
|                                     pre_definition, | ||||
|                                 ); | ||||
| 
 | ||||
|                             // Restore the reachability to its pre-definition state
 | ||||
|                             self.current_use_def_map_mut().reachability = | ||||
|                                 pre_definition_reachability; | ||||
|                         } | ||||
| 
 | ||||
|                         continue; | ||||
|  |  | |||
|  | @ -248,7 +248,6 @@ use crate::semantic_index::place::{ | |||
| }; | ||||
| use crate::semantic_index::predicate::{ | ||||
|     Predicate, PredicateOrLiteral, Predicates, PredicatesBuilder, ScopedPredicateId, | ||||
|     StarImportPlaceholderPredicate, | ||||
| }; | ||||
| use crate::semantic_index::reachability_constraints::{ | ||||
|     ReachabilityConstraints, ReachabilityConstraintsBuilder, ScopedReachabilityConstraintId, | ||||
|  | @ -844,7 +843,7 @@ impl<'db> UseDefMapBuilder<'db> { | |||
|     /// This method exists solely for handling `*`-import reachability constraints.
 | ||||
|     ///
 | ||||
|     /// The reason why we add reachability constraints for [`Definition`]s created by `*` imports
 | ||||
|     /// is laid out in the doc-comment for [`StarImportPlaceholderPredicate`]. But treating these
 | ||||
|     /// is laid out in the doc-comment for `StarImportPlaceholderPredicate`. But treating these
 | ||||
|     /// reachability constraints in the use-def map the same way as all other reachability constraints
 | ||||
|     /// was shown to lead to [significant regressions] for small codebases where typeshed
 | ||||
|     /// dominates. (Although `*` imports are not common generally, they are used in several
 | ||||
|  | @ -872,12 +871,10 @@ impl<'db> UseDefMapBuilder<'db> { | |||
|     /// [significant regressions]: https://github.com/astral-sh/ruff/pull/17286#issuecomment-2786755746
 | ||||
|     pub(super) fn record_and_negate_star_import_reachability_constraint( | ||||
|         &mut self, | ||||
|         star_import: StarImportPlaceholderPredicate<'db>, | ||||
|         reachability_id: ScopedReachabilityConstraintId, | ||||
|         symbol: ScopedPlaceId, | ||||
|         pre_definition_state: PlaceState, | ||||
|     ) { | ||||
|         let predicate_id = self.add_predicate(star_import.into()); | ||||
|         let reachability_id = self.reachability_constraints.add_atom(predicate_id); | ||||
|         let negated_reachability_id = self | ||||
|             .reachability_constraints | ||||
|             .add_not_constraint(reachability_id); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 David Peter
						David Peter