@@ -30,7 +30,7 @@ pub fn pat_id_map(dm: &DefMap, pat: &ast::Pat) -> PatIdMap {
30
30
31
31
pub fn pat_is_refutable ( dm : & DefMap , pat : & ast:: Pat ) -> bool {
32
32
match pat. node {
33
- ast:: PatLit ( _) | ast:: PatRange ( _, _) => true ,
33
+ ast:: PatLit ( _) | ast:: PatRange ( _, _) | ast :: PatQPath ( .. ) => true ,
34
34
ast:: PatEnum ( _, _) |
35
35
ast:: PatIdent ( _, _, None ) |
36
36
ast:: PatStruct ( ..) => {
@@ -60,7 +60,7 @@ pub fn pat_is_variant_or_struct(dm: &DefMap, pat: &ast::Pat) -> bool {
60
60
61
61
pub fn pat_is_const ( dm : & DefMap , pat : & ast:: Pat ) -> bool {
62
62
match pat. node {
63
- ast:: PatIdent ( _, _, None ) | ast:: PatEnum ( ..) => {
63
+ ast:: PatIdent ( _, _, None ) | ast:: PatEnum ( ..) | ast :: PatQPath ( .. ) => {
64
64
match dm. borrow ( ) . get ( & pat. id ) . map ( |d| d. full_def ( ) ) {
65
65
Some ( DefConst ( ..) ) | Some ( DefAssociatedConst ( ..) ) => true ,
66
66
_ => false
@@ -70,6 +70,22 @@ pub fn pat_is_const(dm: &DefMap, pat: &ast::Pat) -> bool {
70
70
}
71
71
}
72
72
73
+ // Same as above, except that partially-resolved defs cause `false` to be
74
+ // returned instead of a panic.
75
+ pub fn pat_is_resolved_const ( dm : & DefMap , pat : & ast:: Pat ) -> bool {
76
+ match pat. node {
77
+ ast:: PatIdent ( _, _, None ) | ast:: PatEnum ( ..) | ast:: PatQPath ( ..) => {
78
+ match dm. borrow ( ) . get ( & pat. id )
79
+ . and_then ( |d| if d. depth == 0 { Some ( d. base_def ) }
80
+ else { None } ) {
81
+ Some ( DefConst ( ..) ) | Some ( DefAssociatedConst ( ..) ) => true ,
82
+ _ => false
83
+ }
84
+ }
85
+ _ => false
86
+ }
87
+ }
88
+
73
89
pub fn pat_is_binding ( dm : & DefMap , pat : & ast:: Pat ) -> bool {
74
90
match pat. node {
75
91
ast:: PatIdent ( ..) => {
0 commit comments