@@ -39,6 +39,19 @@ pub(crate) fn _throw_err(
39
39
SessionDiagnosticDeriveError :: ErrorHandled
40
40
}
41
41
42
+ /// Helper function for printing `syn::Path` - doesn't handle arguments in paths and these are
43
+ /// unlikely to come up much in use of the macro.
44
+ fn path_to_string ( path : & syn:: Path ) -> String {
45
+ let mut out = String :: new ( ) ;
46
+ for ( i, segment) in path. segments . iter ( ) . enumerate ( ) {
47
+ if i > 0 || path. leading_colon . is_some ( ) {
48
+ out. push_str ( "::" ) ;
49
+ }
50
+ out. push_str ( & segment. ident . to_string ( ) ) ;
51
+ }
52
+ out
53
+ }
54
+
42
55
/// Returns an error diagnostic on span `span` with msg `msg`.
43
56
pub ( crate ) fn span_err ( span : impl MultiSpan , msg : & str ) -> Diagnostic {
44
57
Diagnostic :: spanned ( span, Level :: Error , msg)
@@ -61,15 +74,13 @@ pub(crate) use throw_span_err;
61
74
/// Returns an error diagnostic for an invalid attribute.
62
75
pub ( crate ) fn invalid_attr ( attr : & Attribute , meta : & Meta ) -> Diagnostic {
63
76
let span = attr. span ( ) . unwrap ( ) ;
64
- let name = attr. path . segments . last ( ) . unwrap ( ) . ident . to_string ( ) ;
65
- let name = name. as_str ( ) ;
66
-
77
+ let path = path_to_string ( & attr. path ) ;
67
78
match meta {
68
- Meta :: Path ( _) => span_err ( span, & format ! ( "`#[{}]` is not a valid attribute" , name ) ) ,
79
+ Meta :: Path ( _) => span_err ( span, & format ! ( "`#[{}]` is not a valid attribute" , path ) ) ,
69
80
Meta :: NameValue ( _) => {
70
- span_err ( span, & format ! ( "`#[{} = ...]` is not a valid attribute" , name ) )
81
+ span_err ( span, & format ! ( "`#[{} = ...]` is not a valid attribute" , path ) )
71
82
}
72
- Meta :: List ( _) => span_err ( span, & format ! ( "`#[{}(...)]` is not a valid attribute" , name ) ) ,
83
+ Meta :: List ( _) => span_err ( span, & format ! ( "`#[{}(...)]` is not a valid attribute" , path ) ) ,
73
84
}
74
85
}
75
86
@@ -101,18 +112,16 @@ pub(crate) fn invalid_nested_attr(attr: &Attribute, nested: &NestedMeta) -> Diag
101
112
} ;
102
113
103
114
let span = meta. span ( ) . unwrap ( ) ;
104
- let nested_name = meta. path ( ) . segments . last ( ) . unwrap ( ) . ident . to_string ( ) ;
105
- let nested_name = nested_name. as_str ( ) ;
115
+ let path = path_to_string ( meta. path ( ) ) ;
106
116
match meta {
107
- Meta :: NameValue ( ..) => span_err (
108
- span,
109
- & format ! ( "`#[{}({} = ...)]` is not a valid attribute" , name, nested_name) ,
110
- ) ,
117
+ Meta :: NameValue ( ..) => {
118
+ span_err ( span, & format ! ( "`#[{}({} = ...)]` is not a valid attribute" , name, path) )
119
+ }
111
120
Meta :: Path ( ..) => {
112
- span_err ( span, & format ! ( "`#[{}({})]` is not a valid attribute" , name, nested_name ) )
121
+ span_err ( span, & format ! ( "`#[{}({})]` is not a valid attribute" , name, path ) )
113
122
}
114
123
Meta :: List ( ..) => {
115
- span_err ( span, & format ! ( "`#[{}({}(...))]` is not a valid attribute" , name, nested_name ) )
124
+ span_err ( span, & format ! ( "`#[{}({}(...))]` is not a valid attribute" , name, path ) )
116
125
}
117
126
}
118
127
}
0 commit comments