@@ -93,7 +93,10 @@ pub fn format_code_blocks(
9393 let end = code_line. start ( ) ;
9494 let unformatted_code = dedent ( & source[ TextRange :: new ( start, end) ] ) ;
9595
96- let py_source_type = PySourceType :: from_extension ( & language) ;
96+ let py_source_type = match settings. extension . get_extension ( & language) {
97+ None => PySourceType :: from_extension ( & language) ,
98+ Some ( language) => PySourceType :: from ( language) ,
99+ } ;
97100 let options =
98101 settings. to_format_options ( py_source_type, & unformatted_code, path) ;
99102
@@ -132,6 +135,7 @@ pub fn format_code_blocks(
132135#[ cfg( test) ]
133136mod tests {
134137 use insta:: assert_snapshot;
138+ use ruff_linter:: settings:: types:: { ExtensionMapping , ExtensionPair , Language } ;
135139 use ruff_workspace:: FormatterSettings ;
136140
137141 use crate :: { MarkdownResult , format_code_blocks} ;
@@ -384,4 +388,27 @@ print( 'hello' )
384388 & FormatterSettings :: default ( )
385389 ) , @"Unchanged" ) ;
386390 }
391+
392+ #[ test]
393+ fn format_code_blocks_extension_mapping ( ) {
394+ // format "py" mapped as "pyi" instead
395+ let code = r#"
396+ ```py
397+ def foo(): ...
398+ def bar(): ...
399+ ```
400+ "# ;
401+ let mapping = ExtensionMapping :: from_iter ( [ ExtensionPair {
402+ extension : "py" . to_string ( ) ,
403+ language : Language :: Pyi ,
404+ } ] ) ;
405+ assert_snapshot ! ( format_code_blocks(
406+ code,
407+ None ,
408+ & FormatterSettings {
409+ extension: mapping,
410+ ..Default :: default ( )
411+ }
412+ ) , @"Unchanged" ) ;
413+ }
387414}
0 commit comments