@@ -5,8 +5,7 @@ use ruff_db::{
5
5
diagnostic:: { DiagnosticId , SecondaryDiagnosticMessage , Severity } ,
6
6
files:: File ,
7
7
} ;
8
- use ruff_python_ast:: AnyNodeRef ;
9
- use ruff_text_size:: Ranged ;
8
+ use ruff_text_size:: { Ranged , TextRange } ;
10
9
11
10
use super :: { binding_type, KnownFunction , TypeCheckDiagnostic , TypeCheckDiagnostics } ;
12
11
@@ -67,46 +66,60 @@ impl<'db> InferContext<'db> {
67
66
self . diagnostics . get_mut ( ) . extend ( other. diagnostics ( ) ) ;
68
67
}
69
68
70
- /// Reports a lint located at `node `.
71
- pub ( super ) fn report_lint (
69
+ /// Reports a lint located at `ranged `.
70
+ pub ( super ) fn report_lint < T > (
72
71
& self ,
73
72
lint : & ' static LintMetadata ,
74
- node : AnyNodeRef ,
73
+ ranged : T ,
75
74
message : fmt:: Arguments ,
76
- ) {
77
- self . report_lint_with_secondary_messages ( lint, node, message, vec ! [ ] ) ;
75
+ ) where
76
+ T : Ranged ,
77
+ {
78
+ self . report_lint_with_secondary_messages ( lint, ranged, message, vec ! [ ] ) ;
78
79
}
79
80
80
- /// Reports a lint located at `node `.
81
- pub ( super ) fn report_lint_with_secondary_messages (
81
+ /// Reports a lint located at `ranged `.
82
+ pub ( super ) fn report_lint_with_secondary_messages < T > (
82
83
& self ,
83
84
lint : & ' static LintMetadata ,
84
- node : AnyNodeRef ,
85
+ ranged : T ,
85
86
message : fmt:: Arguments ,
86
87
secondary_messages : Vec < SecondaryDiagnosticMessage > ,
87
- ) {
88
- if !self . db . is_file_open ( self . file ) {
89
- return ;
90
- }
88
+ ) where
89
+ T : Ranged ,
90
+ {
91
+ fn lint_severity (
92
+ context : & InferContext ,
93
+ lint : & ' static LintMetadata ,
94
+ range : TextRange ,
95
+ ) -> Option < Severity > {
96
+ if !context. db . is_file_open ( context. file ) {
97
+ return None ;
98
+ }
91
99
92
- // Skip over diagnostics if the rule is disabled.
93
- let Some ( severity) = self . db . rule_selection ( ) . severity ( LintId :: of ( lint) ) else {
94
- return ;
95
- } ;
100
+ // Skip over diagnostics if the rule is disabled.
101
+ let severity = context. db . rule_selection ( ) . severity ( LintId :: of ( lint) ) ?;
96
102
97
- if self . is_in_no_type_check ( ) {
98
- return ;
99
- }
103
+ if context . is_in_no_type_check ( ) {
104
+ return None ;
105
+ }
100
106
101
- let suppressions = suppressions ( self . db , self . file ) ;
107
+ let suppressions = suppressions ( context . db , context . file ) ;
102
108
103
- if let Some ( suppression) = suppressions. find_suppression ( node. range ( ) , LintId :: of ( lint) ) {
104
- self . diagnostics . borrow_mut ( ) . mark_used ( suppression. id ( ) ) ;
105
- return ;
109
+ if let Some ( suppression) = suppressions. find_suppression ( range, LintId :: of ( lint) ) {
110
+ context. diagnostics . borrow_mut ( ) . mark_used ( suppression. id ( ) ) ;
111
+ return None ;
112
+ }
113
+
114
+ Some ( severity)
106
115
}
107
116
117
+ let Some ( severity) = lint_severity ( self , lint, ranged. range ( ) ) else {
118
+ return ;
119
+ } ;
120
+
108
121
self . report_diagnostic (
109
- node ,
122
+ ranged ,
110
123
DiagnosticId :: Lint ( lint. name ( ) ) ,
111
124
severity,
112
125
message,
@@ -117,14 +130,16 @@ impl<'db> InferContext<'db> {
117
130
/// Adds a new diagnostic.
118
131
///
119
132
/// The diagnostic does not get added if the rule isn't enabled for this file.
120
- pub ( super ) fn report_diagnostic (
133
+ pub ( super ) fn report_diagnostic < T > (
121
134
& self ,
122
- node : AnyNodeRef ,
135
+ ranged : T ,
123
136
id : DiagnosticId ,
124
137
severity : Severity ,
125
138
message : fmt:: Arguments ,
126
139
secondary_messages : Vec < SecondaryDiagnosticMessage > ,
127
- ) {
140
+ ) where
141
+ T : Ranged ,
142
+ {
128
143
if !self . db . is_file_open ( self . file ) {
129
144
return ;
130
145
}
@@ -139,7 +154,7 @@ impl<'db> InferContext<'db> {
139
154
file : self . file ,
140
155
id,
141
156
message : message. to_string ( ) ,
142
- range : node . range ( ) ,
157
+ range : ranged . range ( ) ,
143
158
severity,
144
159
secondary_messages,
145
160
} ) ;
0 commit comments