@@ -35,7 +35,7 @@ use crate::registry::{AsRule, Rule, RuleSet};
3535#[ cfg( any( feature = "test-rules" , test) ) ]
3636use crate :: rules:: ruff:: rules:: test_rules:: { self , TestRule , TEST_RULES } ;
3737use crate :: settings:: types:: UnsafeFixes ;
38- use crate :: settings:: { flags, LinterSettings } ;
38+ use crate :: settings:: { flags, LinterSettings , TargetVersion } ;
3939use crate :: source_kind:: SourceKind ;
4040use crate :: { directives, fs, warn_user_once, Locator } ;
4141
@@ -111,7 +111,7 @@ pub fn check_path(
111111 source_kind : & SourceKind ,
112112 source_type : PySourceType ,
113113 parsed : & Parsed < ModModule > ,
114- target_version : PythonVersion ,
114+ target_version : TargetVersion ,
115115) -> Vec < Message > {
116116 // Aggregate all diagnostics.
117117 let mut diagnostics = vec ! [ ] ;
@@ -160,7 +160,7 @@ pub fn check_path(
160160 locator,
161161 comment_ranges,
162162 settings,
163- target_version,
163+ target_version. linter_version ( ) ,
164164 ) ) ;
165165 }
166166
@@ -215,7 +215,7 @@ pub fn check_path(
215215 package,
216216 source_type,
217217 cell_offsets,
218- target_version,
218+ target_version. linter_version ( ) ,
219219 ) ;
220220
221221 diagnostics. extend ( import_diagnostics) ;
@@ -390,7 +390,7 @@ pub fn add_noqa_to_path(
390390) -> Result < usize > {
391391 // Parse once.
392392 let target_version = settings. resolve_target_version ( path) ;
393- let parsed = parse_unchecked_source ( source_kind, source_type, target_version) ;
393+ let parsed = parse_unchecked_source ( source_kind, source_type, target_version. parser_version ( ) ) ;
394394
395395 // Map row and column locations to byte slices (lazily).
396396 let locator = Locator :: new ( source_kind. source_code ( ) ) ;
@@ -451,11 +451,13 @@ pub fn lint_only(
451451) -> LinterResult {
452452 let target_version = settings. resolve_target_version ( path) ;
453453
454- if matches ! ( target_version, PythonVersion :: PY314 ) && !is_py314_support_enabled ( settings) {
454+ if matches ! ( target_version, TargetVersion ( Some ( PythonVersion :: PY314 ) ) )
455+ && !is_py314_support_enabled ( settings)
456+ {
455457 warn_user_once ! ( "Support for Python 3.14 is under development and may be unstable. Enable `preview` to remove this warning." ) ;
456458 }
457459
458- let parsed = source. into_parsed ( source_kind, source_type, target_version) ;
460+ let parsed = source. into_parsed ( source_kind, source_type, target_version. parser_version ( ) ) ;
459461
460462 // Map row and column locations to byte slices (lazily).
461463 let locator = Locator :: new ( source_kind. source_code ( ) ) ;
@@ -563,14 +565,17 @@ pub fn lint_fix<'a>(
563565
564566 let target_version = settings. resolve_target_version ( path) ;
565567
566- if matches ! ( target_version, PythonVersion :: PY314 ) && !is_py314_support_enabled ( settings) {
568+ if matches ! ( target_version, TargetVersion ( Some ( PythonVersion :: PY314 ) ) )
569+ && !is_py314_support_enabled ( settings)
570+ {
567571 warn_user_once ! ( "Support for Python 3.14 is under development and may be unstable. Enable `preview` to remove this warning." ) ;
568572 }
569573
570574 // Continuously fix until the source code stabilizes.
571575 loop {
572576 // Parse once.
573- let parsed = parse_unchecked_source ( & transformed, source_type, target_version) ;
577+ let parsed =
578+ parse_unchecked_source ( & transformed, source_type, target_version. parser_version ( ) ) ;
574579
575580 // Map row and column locations to byte slices (lazily).
576581 let locator = Locator :: new ( transformed. source_code ( ) ) ;
@@ -972,8 +977,9 @@ mod tests {
972977 settings : & LinterSettings ,
973978 ) -> Vec < Message > {
974979 let source_type = PySourceType :: from ( path) ;
980+ let target_version = settings. resolve_target_version ( path) ;
975981 let options =
976- ParseOptions :: from ( source_type) . with_target_version ( settings . unresolved_target_version ) ;
982+ ParseOptions :: from ( source_type) . with_target_version ( target_version . parser_version ( ) ) ;
977983 let parsed = ruff_python_parser:: parse_unchecked ( source_kind. source_code ( ) , options)
978984 . try_into_module ( )
979985 . expect ( "PySourceType always parses into a module" ) ;
@@ -998,7 +1004,7 @@ mod tests {
9981004 source_kind,
9991005 source_type,
10001006 & parsed,
1001- settings . unresolved_target_version ,
1007+ target_version ,
10021008 ) ;
10031009 messages. sort_by_key ( Ranged :: start) ;
10041010 messages
@@ -1121,7 +1127,7 @@ mod tests {
11211127 contents,
11221128 & LinterSettings {
11231129 rules : settings:: rule_table:: RuleTable :: empty ( ) ,
1124- unresolved_target_version : python_version,
1130+ unresolved_target_version : python_version. into ( ) ,
11251131 preview : settings:: types:: PreviewMode :: Enabled ,
11261132 ..Default :: default ( )
11271133 } ,
@@ -1139,7 +1145,7 @@ mod tests {
11391145 & SourceKind :: IpyNotebook ( Notebook :: from_path ( path) ?) ,
11401146 path,
11411147 & LinterSettings {
1142- unresolved_target_version : python_version,
1148+ unresolved_target_version : python_version. into ( ) ,
11431149 rules : settings:: rule_table:: RuleTable :: empty ( ) ,
11441150 preview : settings:: types:: PreviewMode :: Enabled ,
11451151 ..Default :: default ( )
@@ -1205,7 +1211,7 @@ mod tests {
12051211 "pyi019_adds_typing_extensions" ,
12061212 PYI019_EXAMPLE ,
12071213 & LinterSettings {
1208- unresolved_target_version: PythonVersion :: PY310 ,
1214+ unresolved_target_version: PythonVersion :: PY310 . into ( ) ,
12091215 typing_extensions: true ,
12101216 ..LinterSettings :: for_rule( Rule :: CustomTypeVarForSelf )
12111217 }
@@ -1214,7 +1220,7 @@ mod tests {
12141220 "pyi019_does_not_add_typing_extensions" ,
12151221 PYI019_EXAMPLE ,
12161222 & LinterSettings {
1217- unresolved_target_version: PythonVersion :: PY310 ,
1223+ unresolved_target_version: PythonVersion :: PY310 . into ( ) ,
12181224 typing_extensions: false ,
12191225 ..LinterSettings :: for_rule( Rule :: CustomTypeVarForSelf )
12201226 }
@@ -1223,7 +1229,7 @@ mod tests {
12231229 "pyi019_adds_typing_without_extensions_disabled" ,
12241230 PYI019_EXAMPLE ,
12251231 & LinterSettings {
1226- unresolved_target_version: PythonVersion :: PY311 ,
1232+ unresolved_target_version: PythonVersion :: PY311 . into ( ) ,
12271233 typing_extensions: true ,
12281234 ..LinterSettings :: for_rule( Rule :: CustomTypeVarForSelf )
12291235 }
@@ -1232,7 +1238,7 @@ mod tests {
12321238 "pyi019_adds_typing_with_extensions_disabled" ,
12331239 PYI019_EXAMPLE ,
12341240 & LinterSettings {
1235- unresolved_target_version: PythonVersion :: PY311 ,
1241+ unresolved_target_version: PythonVersion :: PY311 . into ( ) ,
12361242 typing_extensions: false ,
12371243 ..LinterSettings :: for_rule( Rule :: CustomTypeVarForSelf )
12381244 }
@@ -1244,7 +1250,7 @@ mod tests {
12441250 def __new__(cls) -> C: ...
12451251 " ,
12461252 & LinterSettings {
1247- unresolved_target_version: PythonVersion { major: 3 , minor: 10 } ,
1253+ unresolved_target_version: PythonVersion { major: 3 , minor: 10 } . into ( ) ,
12481254 typing_extensions: false ,
12491255 ..LinterSettings :: for_rule( Rule :: NonSelfReturnType )
12501256 }
@@ -1261,7 +1267,7 @@ mod tests {
12611267 return commons
12621268 "# ,
12631269 & LinterSettings {
1264- unresolved_target_version: PythonVersion { major: 3 , minor: 8 } ,
1270+ unresolved_target_version: PythonVersion { major: 3 , minor: 8 } . into ( ) ,
12651271 typing_extensions: false ,
12661272 ..LinterSettings :: for_rule( Rule :: FastApiNonAnnotatedDependency )
12671273 }
@@ -1276,7 +1282,7 @@ mod tests {
12761282 "pyi026_disabled" ,
12771283 "Vector = list[float]" ,
12781284 & LinterSettings {
1279- unresolved_target_version: PythonVersion { major: 3 , minor: 9 } ,
1285+ unresolved_target_version: PythonVersion { major: 3 , minor: 9 } . into ( ) ,
12801286 typing_extensions: false ,
12811287 ..LinterSettings :: for_rule( Rule :: TypeAliasWithoutAnnotation )
12821288 }
0 commit comments