mirror of
				https://github.com/astral-sh/ruff.git
				synced 2025-10-31 03:55:09 +00:00 
			
		
		
		
	[ty] Allow declared-only class-level attributes to be accessed on the class (#19071)
	
		
			
	
		
	
	
		
	
		
			Some checks are pending
		
		
	
	
		
			
				
	
				CI / cargo test (linux) (push) Blocked by required conditions
				
			
		
			
				
	
				CI / cargo fuzz build (push) Blocked by required conditions
				
			
		
			
				
	
				CI / python package (push) Waiting to run
				
			
		
			
				
	
				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, 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 / 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 / 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 / cargo test (linux) (push) Blocked by required conditions
				
			CI / cargo fuzz build (push) Blocked by required conditions
				
			CI / python package (push) Waiting to run
				
			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, 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 / 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 / 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
Allow declared-only class-level attributes to be accessed on the class:
```py
class C:
    attr: int
C.attr  # this is now allowed
``` 
closes https://github.com/astral-sh/ty/issues/384
closes https://github.com/astral-sh/ty/issues/553
## Ecosystem analysis
* We see many removed `unresolved-attribute` false-positives for code
that makes use of sqlalchemy, as expected (see changes for `prefect`)
* We see many removed `call-non-callable` false-positives for uses of
`pytest.skip` and similar, as expected
* Most new diagnostics seem to be related to cases like the following,
where we previously inferred `int` for `Derived().x`, but now we infer
`int | None`. I think this should be a
conflicting-declarations/bad-override error anyway? The new behavior may
even be preferred here?
  ```py
  class Base:
      x: int | None
  
  
  class Derived(Base):
      def __init__(self):
          self.x: int = 1
  ```
			
			
This commit is contained in:
		
							parent
							
								
									5f426b9f8b
								
							
						
					
					
						commit
						f76d3f87cf
					
				
					 6 changed files with 37 additions and 68 deletions
				
			
		|  | @ -235,29 +235,28 @@ pub(crate) fn class_symbol<'db>( | |||
| ) -> PlaceAndQualifiers<'db> { | ||||
|     place_table(db, scope) | ||||
|         .place_id_by_name(name) | ||||
|         .map(|symbol| { | ||||
|             let symbol_and_quals = place_by_id( | ||||
|         .map(|place| { | ||||
|             let place_and_quals = place_by_id( | ||||
|                 db, | ||||
|                 scope, | ||||
|                 symbol, | ||||
|                 place, | ||||
|                 RequiresExplicitReExport::No, | ||||
|                 ConsideredDefinitions::EndOfScope, | ||||
|             ); | ||||
| 
 | ||||
|             if symbol_and_quals.is_class_var() { | ||||
|                 // For declared class vars we do not need to check if they have bindings,
 | ||||
|                 // we just trust the declaration.
 | ||||
|                 return symbol_and_quals; | ||||
|             if !place_and_quals.place.is_unbound() { | ||||
|                 // Trust the declared type if we see a class-level declaration
 | ||||
|                 return place_and_quals; | ||||
|             } | ||||
| 
 | ||||
|             if let PlaceAndQualifiers { | ||||
|                 place: Place::Type(ty, _), | ||||
|                 qualifiers, | ||||
|             } = symbol_and_quals | ||||
|             } = place_and_quals | ||||
|             { | ||||
|                 // Otherwise, we need to check if the symbol has bindings
 | ||||
|                 let use_def = use_def_map(db, scope); | ||||
|                 let bindings = use_def.end_of_scope_bindings(symbol); | ||||
|                 let bindings = use_def.end_of_scope_bindings(place); | ||||
|                 let inferred = place_from_bindings_impl(db, bindings, RequiresExplicitReExport::No); | ||||
| 
 | ||||
|                 // TODO: we should not need to calculate inferred type second time. This is a temporary
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 David Peter
						David Peter