1
1
use std:: iter:: { self , successors} ;
2
2
3
3
use either:: Either ;
4
- use ide_db:: { ty_filter:: TryEnum , RootDatabase } ;
4
+ use ide_db:: { defs :: NameClass , ty_filter:: TryEnum , RootDatabase } ;
5
5
use syntax:: {
6
6
ast:: {
7
7
self ,
8
8
edit:: { AstNodeEdit , IndentLevel } ,
9
- make,
9
+ make, NameOwner ,
10
10
} ,
11
11
AstNode ,
12
12
} ;
@@ -237,7 +237,7 @@ fn pick_pattern_and_expr_order(
237
237
( ast:: Pat :: WildcardPat ( _) , _) => return None ,
238
238
( pat, _) if is_empty_expr ( & expr2) => ( pat, expr, expr2) ,
239
239
( _, pat) if is_empty_expr ( & expr) => ( pat, expr2, expr) ,
240
- ( pat, pat2) => match ( binds_name ( & pat) , binds_name ( & pat2) ) {
240
+ ( pat, pat2) => match ( binds_name ( sema , & pat) , binds_name ( sema , & pat2) ) {
241
241
( true , true ) => return None ,
242
242
( true , false ) => ( pat, expr, expr2) ,
243
243
( false , true ) => ( pat2, expr2, expr) ,
@@ -259,11 +259,14 @@ fn is_empty_expr(expr: &ast::Expr) -> bool {
259
259
}
260
260
}
261
261
262
- fn binds_name ( pat : & ast:: Pat ) -> bool {
263
- let binds_name_v = |pat| binds_name ( & pat) ;
262
+ fn binds_name ( sema : & hir :: Semantics < RootDatabase > , pat : & ast:: Pat ) -> bool {
263
+ let binds_name_v = |pat| binds_name ( & sema , & pat) ;
264
264
match pat {
265
265
ast:: Pat :: IdentPat ( pat) => {
266
- pat. to_string ( ) . starts_with ( |c : char | c. is_lowercase ( ) && c != '_' )
266
+ match pat. name ( ) . and_then ( |name| NameClass :: classify ( sema, & name) ) {
267
+ Some ( NameClass :: ConstReference ( _) ) => false ,
268
+ _ => true ,
269
+ }
267
270
}
268
271
ast:: Pat :: MacroPat ( _) => true ,
269
272
ast:: Pat :: OrPat ( pat) => pat. pats ( ) . any ( binds_name_v) ,
0 commit comments