@@ -86,39 +86,27 @@ pub struct Lint {
86
86
87
87
impl Lint {
88
88
pub fn level ( & self , lints : & TomlToolLints , edition : Edition ) -> LintLevel {
89
- let edition_level = self
90
- . edition_lint_opts
91
- . filter ( |( e, _) | edition >= * e)
92
- . map ( |( _, l) | l) ;
93
-
94
- if self . default_level == LintLevel :: Forbid || edition_level == Some ( LintLevel :: Forbid ) {
95
- return LintLevel :: Forbid ;
96
- }
97
-
98
- let level = self
99
- . groups
89
+ self . groups
100
90
. iter ( )
101
- . map ( |g| g. name )
102
- . chain ( std:: iter:: once ( self . name ) )
103
- . filter_map ( |n| lints. get ( n) . map ( |l| ( n, l) ) )
104
- . max_by_key ( |( n, l) | {
91
+ . map ( |g| {
105
92
(
106
- l. level ( ) == TomlLintLevel :: Forbid ,
107
- l. priority ( ) ,
108
- std:: cmp:: Reverse ( * n) ,
93
+ g. name ,
94
+ level_priority ( g. name , g. default_level , g. edition_lint_opts , lints, edition) ,
109
95
)
110
- } ) ;
111
-
112
- match level {
113
- Some ( ( _, toml_lint) ) => toml_lint. level ( ) . into ( ) ,
114
- None => {
115
- if let Some ( level) = edition_level {
116
- level
117
- } else {
118
- self . default_level
119
- }
120
- }
121
- }
96
+ } )
97
+ . chain ( std:: iter:: once ( (
98
+ self . name ,
99
+ level_priority (
100
+ self . name ,
101
+ self . default_level ,
102
+ self . edition_lint_opts ,
103
+ lints,
104
+ edition,
105
+ ) ,
106
+ ) ) )
107
+ . max_by_key ( |( n, ( l, p) ) | ( l == & LintLevel :: Forbid , * p, std:: cmp:: Reverse ( * n) ) )
108
+ . map ( |( _, ( l, _) ) | l)
109
+ . unwrap ( )
122
110
}
123
111
}
124
112
@@ -163,6 +151,34 @@ impl From<TomlLintLevel> for LintLevel {
163
151
}
164
152
}
165
153
154
+ fn level_priority (
155
+ name : & str ,
156
+ default_level : LintLevel ,
157
+ edition_lint_opts : Option < ( Edition , LintLevel ) > ,
158
+ lints : & TomlToolLints ,
159
+ edition : Edition ,
160
+ ) -> ( LintLevel , i8 ) {
161
+ let unspecified_level = if let Some ( level) = edition_lint_opts
162
+ . filter ( |( e, _) | edition >= * e)
163
+ . map ( |( _, l) | l)
164
+ {
165
+ level
166
+ } else {
167
+ default_level
168
+ } ;
169
+
170
+ // Don't allow the group to be overridden if the level is `Forbid`
171
+ if unspecified_level == LintLevel :: Forbid {
172
+ return ( unspecified_level, 0 ) ;
173
+ }
174
+
175
+ if let Some ( defined_level) = lints. get ( name) {
176
+ ( defined_level. level ( ) . into ( ) , defined_level. priority ( ) )
177
+ } else {
178
+ ( unspecified_level, 0 )
179
+ }
180
+ }
181
+
166
182
const IM_A_TEAPOT : Lint = Lint {
167
183
name : "im_a_teapot" ,
168
184
desc : "`im_a_teapot` is specified" ,
0 commit comments