linter: use reportAtNode for rules a-p

Change-Id: Ib4cf60f26a9cf6496a9264a4846a1b617a276058
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/425150
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server_plugin/test/src/lint_rules.dart b/pkg/analysis_server_plugin/test/src/lint_rules.dart
index 954c8d1..6270082 100644
--- a/pkg/analysis_server_plugin/test/src/lint_rules.dart
+++ b/pkg/analysis_server_plugin/test/src/lint_rules.dart
@@ -47,7 +47,7 @@
 
   @override
   void visitBooleanLiteral(BooleanLiteral node) {
-    rule.reportLint(node);
+    rule.reportAtNode(node);
   }
 }
 
@@ -58,6 +58,6 @@
 
   @override
   void visitDoubleLiteral(DoubleLiteral node) {
-    rule.reportLint(node);
+    rule.reportAtNode(node);
   }
 }
diff --git a/pkg/analyzer/test/src/lint/lint_rule_test.dart b/pkg/analyzer/test/src/lint/lint_rule_test.dart
index 6984799..de056c4 100644
--- a/pkg/analyzer/test/src/lint/lint_rule_test.dart
+++ b/pkg/analyzer/test/src/lint/lint_rule_test.dart
@@ -54,7 +54,7 @@
         var node = EmptyStatementImpl(
           semicolon: SimpleToken(TokenType.SEMICOLON, 0),
         );
-        rule.reportLint(node, errorCode: customCode);
+        rule.reportAtNode(node, errorCode: customCode);
         expect(reporter.code, customCode);
       });
       test('reportLint (default)', () {
@@ -68,7 +68,7 @@
         var node = EmptyStatementImpl(
           semicolon: SimpleToken(TokenType.SEMICOLON, 0),
         );
-        rule.reportLint(node);
+        rule.reportAtNode(node);
         expect(reporter.code, rule.lintCode);
       });
     });
diff --git a/pkg/linter/lib/src/rules/always_specify_types.dart b/pkg/linter/lib/src/rules/always_specify_types.dart
index b887f7d..2becc1d 100644
--- a/pkg/linter/lib/src/rules/always_specify_types.dart
+++ b/pkg/linter/lib/src/rules/always_specify_types.dart
@@ -124,7 +124,7 @@
           namedType.typeArguments == null &&
           namedType.parent is! IsExpression &&
           !element.metadata2.hasOptionalTypeArgs) {
-        rule.reportLint(
+        rule.reportAtNode(
           namedType,
           errorCode: LinterLintCode.always_specify_types_add_type,
         );
@@ -160,12 +160,12 @@
         }
       } else if (type != null) {
         if (type is DynamicType) {
-          rule.reportLint(
+          rule.reportAtNode(
             param,
             errorCode: LinterLintCode.always_specify_types_add_type,
           );
         } else {
-          rule.reportLint(
+          rule.reportAtNode(
             param,
             arguments: [type],
             errorCode: LinterLintCode.always_specify_types_specify_type,
diff --git a/pkg/linter/lib/src/rules/always_use_package_imports.dart b/pkg/linter/lib/src/rules/always_use_package_imports.dart
index 8733096..63b8774 100644
--- a/pkg/linter/lib/src/rules/always_use_package_imports.dart
+++ b/pkg/linter/lib/src/rules/always_use_package_imports.dart
@@ -52,7 +52,7 @@
   @override
   void visitImportDirective(ImportDirective node) {
     if (isRelativeImport(node)) {
-      rule.reportLint(node.uri);
+      rule.reportAtNode(node.uri);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/analyzer_public_api.dart b/pkg/linter/lib/src/rules/analyzer_public_api.dart
index 464687a..cbebb6e 100644
--- a/pkg/linter/lib/src/rules/analyzer_public_api.dart
+++ b/pkg/linter/lib/src/rules/analyzer_public_api.dart
@@ -161,7 +161,7 @@
     }
 
     if (badNames != null) {
-      rule.reportLint(
+      rule.reportAtNode(
         node,
         errorCode: AnalyzerPublicApi.exportsNonPublicName,
         arguments: [badNames.join(', ')],
@@ -178,7 +178,7 @@
       return;
     }
     if (!partElement.includedFragment!.source.uri.isInAnalyzerPublicLib) {
-      rule.reportLint(node, errorCode: AnalyzerPublicApi.badPartDirective);
+      rule.reportAtNode(node, errorCode: AnalyzerPublicApi.badPartDirective);
     }
   }
 
diff --git a/pkg/linter/lib/src/rules/analyzer_use_new_elements.dart b/pkg/linter/lib/src/rules/analyzer_use_new_elements.dart
index 25af031..343e9c6 100644
--- a/pkg/linter/lib/src/rules/analyzer_use_new_elements.dart
+++ b/pkg/linter/lib/src/rules/analyzer_use_new_elements.dart
@@ -136,7 +136,7 @@
     }
 
     if (_isOldModelType(node.staticType)) {
-      rule.reportLint(node.methodName);
+      rule.reportAtNode(node.methodName);
     }
   }
 
@@ -164,12 +164,12 @@
     }
 
     if (_isOldModelElement(node.element)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
 
     if (_isOldModelType(node.staticType)) {
       _isDeprecatedNode(node);
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 
diff --git a/pkg/linter/lib/src/rules/avoid_annotating_with_dynamic.dart b/pkg/linter/lib/src/rules/avoid_annotating_with_dynamic.dart
index a7882e3..273e2e1 100644
--- a/pkg/linter/lib/src/rules/avoid_annotating_with_dynamic.dart
+++ b/pkg/linter/lib/src/rules/avoid_annotating_with_dynamic.dart
@@ -54,7 +54,7 @@
     if (node.inAugmentation) return;
 
     if (type is NamedType && type.type is DynamicType) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_bool_literals_in_conditional_expressions.dart b/pkg/linter/lib/src/rules/avoid_bool_literals_in_conditional_expressions.dart
index 16afdc3..833a78b 100644
--- a/pkg/linter/lib/src/rules/avoid_bool_literals_in_conditional_expressions.dart
+++ b/pkg/linter/lib/src/rules/avoid_bool_literals_in_conditional_expressions.dart
@@ -45,8 +45,8 @@
 
     if (thenExp.staticType == typeProvider.boolType &&
         elseExp.staticType == typeProvider.boolType) {
-      if (thenExp is BooleanLiteral) rule.reportLint(node);
-      if (elseExp is BooleanLiteral) rule.reportLint(node);
+      if (thenExp is BooleanLiteral) rule.reportAtNode(node);
+      if (elseExp is BooleanLiteral) rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_catching_errors.dart b/pkg/linter/lib/src/rules/avoid_catching_errors.dart
index d83a638..0b341e8 100644
--- a/pkg/linter/lib/src/rules/avoid_catching_errors.dart
+++ b/pkg/linter/lib/src/rules/avoid_catching_errors.dart
@@ -40,12 +40,12 @@
     var exceptionType = node.exceptionType?.type;
     if (exceptionType.implementsInterface('Error', 'dart.core')) {
       if (exceptionType.isSameAs('Error', 'dart.core')) {
-        rule.reportLint(
+        rule.reportAtNode(
           node,
           errorCode: LinterLintCode.avoid_catching_errors_class,
         );
       } else {
-        rule.reportLint(
+        rule.reportAtNode(
           node,
           errorCode: LinterLintCode.avoid_catching_errors_subclass,
           arguments: [exceptionType!.getDisplayString()],
diff --git a/pkg/linter/lib/src/rules/avoid_classes_with_only_static_members.dart b/pkg/linter/lib/src/rules/avoid_classes_with_only_static_members.dart
index 979ad0a..9bdb0af 100644
--- a/pkg/linter/lib/src/rules/avoid_classes_with_only_static_members.dart
+++ b/pkg/linter/lib/src/rules/avoid_classes_with_only_static_members.dart
@@ -67,7 +67,7 @@
     if (methods.isNotEmpty && !methods.every((m) => m.isStatic)) return;
 
     if (methods.isNotEmpty || declaredElement.fields2.any((f) => !f.isConst)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_double_and_int_checks.dart b/pkg/linter/lib/src/rules/avoid_double_and_int_checks.dart
index a22fc11..181cbd8 100644
--- a/pkg/linter/lib/src/rules/avoid_double_and_int_checks.dart
+++ b/pkg/linter/lib/src/rules/avoid_double_and_int_checks.dart
@@ -51,7 +51,7 @@
             elseCondition.type.type == typeProvider.intType &&
             (ifExpression.element is FormalParameterElement ||
                 ifExpression.element is LocalVariableElement)) {
-          rule.reportLint(elseCondition);
+          rule.reportAtNode(elseCondition);
         }
       }
     }
diff --git a/pkg/linter/lib/src/rules/avoid_dynamic_calls.dart b/pkg/linter/lib/src/rules/avoid_dynamic_calls.dart
index 609b56e..814a871 100644
--- a/pkg/linter/lib/src/rules/avoid_dynamic_calls.dart
+++ b/pkg/linter/lib/src/rules/avoid_dynamic_calls.dart
@@ -63,7 +63,7 @@
       // x ??= foo is not a dynamic call.
       return;
     }
-    rule.reportLint(node);
+    rule.reportAtNode(node);
   }
 
   @override
@@ -167,7 +167,7 @@
     if (node == null || node.staticType is! DynamicType) return false;
     if (_isExplicitCast(node)) return false;
 
-    rule.reportLint(node);
+    rule.reportAtNode(node);
     return true;
   }
 
@@ -176,7 +176,7 @@
     if (staticType == null) return;
     if (_isExplicitCast(node)) return;
     if (staticType is DynamicType || staticType.isDartCoreFunction) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 
@@ -189,7 +189,7 @@
         // An assignment expression can only be a dynamic call if it is a
         // "compound assignment" (i.e. such as `x += 1`); so if `readType` is
         // `dynamic` we should report.
-        rule.reportLint(root);
+        rule.reportAtNode(root);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/avoid_empty_else.dart b/pkg/linter/lib/src/rules/avoid_empty_else.dart
index dd9a7eb..bcd412c 100644
--- a/pkg/linter/lib/src/rules/avoid_empty_else.dart
+++ b/pkg/linter/lib/src/rules/avoid_empty_else.dart
@@ -36,7 +36,7 @@
     var elseStatement = node.elseStatement;
     if (elseStatement is EmptyStatement &&
         !elseStatement.semicolon.isSynthetic) {
-      rule.reportLint(elseStatement);
+      rule.reportAtNode(elseStatement);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_escaping_inner_quotes.dart b/pkg/linter/lib/src/rules/avoid_escaping_inner_quotes.dart
index 65d3c00..91c1915 100644
--- a/pkg/linter/lib/src/rules/avoid_escaping_inner_quotes.dart
+++ b/pkg/linter/lib/src/rules/avoid_escaping_inner_quotes.dart
@@ -53,7 +53,7 @@
 
   void _check(AstNode node, String text, bool isSingleQuoted) {
     if (_isChangeable(text, isSingleQuoted: isSingleQuoted)) {
-      rule.reportLint(
+      rule.reportAtNode(
         node,
         arguments: [isSingleQuoted ? "'" : '"', isSingleQuoted ? '"' : "'"],
       );
diff --git a/pkg/linter/lib/src/rules/avoid_field_initializers_in_const_classes.dart b/pkg/linter/lib/src/rules/avoid_field_initializers_in_const_classes.dart
index 4886ccd..f479ac2 100644
--- a/pkg/linter/lib/src/rules/avoid_field_initializers_in_const_classes.dart
+++ b/pkg/linter/lib/src/rules/avoid_field_initializers_in_const_classes.dart
@@ -76,7 +76,7 @@
       );
       node.expression.accept(visitor);
       if (!visitor.useParameter) {
-        rule.reportLint(node);
+        rule.reportAtNode(node);
       }
     }
   }
@@ -97,7 +97,7 @@
       }
       for (var variable in node.fields.variables) {
         if (variable.initializer != null) {
-          rule.reportLint(variable);
+          rule.reportAtNode(variable);
         }
       }
     }
diff --git a/pkg/linter/lib/src/rules/avoid_final_parameters.dart b/pkg/linter/lib/src/rules/avoid_final_parameters.dart
index 7962640..a8b7474 100644
--- a/pkg/linter/lib/src/rules/avoid_final_parameters.dart
+++ b/pkg/linter/lib/src/rules/avoid_final_parameters.dart
@@ -55,7 +55,7 @@
     if (parameters != null) {
       for (var param in parameters.parameters) {
         if (param.isFinal) {
-          rule.reportLint(param);
+          rule.reportAtNode(param);
         }
       }
     }
diff --git a/pkg/linter/lib/src/rules/avoid_function_literals_in_foreach_calls.dart b/pkg/linter/lib/src/rules/avoid_function_literals_in_foreach_calls.dart
index 4fcd20e..7597c02 100644
--- a/pkg/linter/lib/src/rules/avoid_function_literals_in_foreach_calls.dart
+++ b/pkg/linter/lib/src/rules/avoid_function_literals_in_foreach_calls.dart
@@ -71,7 +71,7 @@
         !node.containsNullAwareInvocationInChain &&
         !_hasMethodChaining(node) &&
         !_isInsideCascade(node)) {
-      rule.reportLint(node.function);
+      rule.reportAtNode(node.function);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_futureor_void.dart b/pkg/linter/lib/src/rules/avoid_futureor_void.dart
index cd71337..cdb0011 100644
--- a/pkg/linter/lib/src/rules/avoid_futureor_void.dart
+++ b/pkg/linter/lib/src/rules/avoid_futureor_void.dart
@@ -61,7 +61,7 @@
       var typeArguments = staticType.typeArguments;
       if (typeArguments.length != 1) return; // Just to be safe.
       if (typeArguments.first is VoidType) {
-        rule.reportLint(typeAnnotation);
+        rule.reportAtNode(typeAnnotation);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/avoid_implementing_value_types.dart b/pkg/linter/lib/src/rules/avoid_implementing_value_types.dart
index 38f92eb..be3176f 100644
--- a/pkg/linter/lib/src/rules/avoid_implementing_value_types.dart
+++ b/pkg/linter/lib/src/rules/avoid_implementing_value_types.dart
@@ -47,7 +47,7 @@
       var interfaceType = interface.type;
       if (interfaceType is InterfaceType &&
           _overridesEquals(interfaceType.element3)) {
-        rule.reportLint(interface);
+        rule.reportAtNode(interface);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/avoid_init_to_null.dart b/pkg/linter/lib/src/rules/avoid_init_to_null.dart
index 8deeabd..42ca261 100644
--- a/pkg/linter/lib/src/rules/avoid_init_to_null.dart
+++ b/pkg/linter/lib/src/rules/avoid_init_to_null.dart
@@ -52,7 +52,7 @@
     }
 
     if (node.defaultValue.isNullLiteral && isNullable(declaredElement.type)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 
@@ -65,7 +65,7 @@
         !node.isFinal &&
         node.initializer.isNullLiteral &&
         isNullable(declaredElement.type)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_js_rounded_ints.dart b/pkg/linter/lib/src/rules/avoid_js_rounded_ints.dart
index 871783d..64c4e22 100644
--- a/pkg/linter/lib/src/rules/avoid_js_rounded_ints.dart
+++ b/pkg/linter/lib/src/rules/avoid_js_rounded_ints.dart
@@ -35,7 +35,7 @@
   @override
   void visitIntegerLiteral(IntegerLiteral node) {
     if (isRounded(node.value)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_null_checks_in_equality_operators.dart b/pkg/linter/lib/src/rules/avoid_null_checks_in_equality_operators.dart
index 08f82f4..1448cd1 100644
--- a/pkg/linter/lib/src/rules/avoid_null_checks_in_equality_operators.dart
+++ b/pkg/linter/lib/src/rules/avoid_null_checks_in_equality_operators.dart
@@ -64,7 +64,7 @@
   visitBinaryExpression(BinaryExpression node) {
     if (_isParameterWithQuestionQuestion(node, parameter) ||
         _isComparingParameterWithNull(node, parameter)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
     super.visitBinaryExpression(node);
   }
@@ -73,7 +73,7 @@
   visitMethodInvocation(MethodInvocation node) {
     if (node.operator?.type == TokenType.QUESTION_PERIOD &&
         node.target.canonicalElement == parameter) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
     super.visitMethodInvocation(node);
   }
@@ -82,7 +82,7 @@
   visitPropertyAccess(PropertyAccess node) {
     if (node.operator.type == TokenType.QUESTION_PERIOD &&
         node.target.canonicalElement == parameter) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
     super.visitPropertyAccess(node);
   }
diff --git a/pkg/linter/lib/src/rules/avoid_positional_boolean_parameters.dart b/pkg/linter/lib/src/rules/avoid_positional_boolean_parameters.dart
index 746ba45..7b951a7 100644
--- a/pkg/linter/lib/src/rules/avoid_positional_boolean_parameters.dart
+++ b/pkg/linter/lib/src/rules/avoid_positional_boolean_parameters.dart
@@ -45,7 +45,7 @@
   void checkParams(List<FormalParameter>? parameters) {
     var parameterToLint = parameters?.firstWhereOrNull(_isBoolean);
     if (parameterToLint != null) {
-      rule.reportLint(parameterToLint);
+      rule.reportAtNode(parameterToLint);
     }
   }
 
diff --git a/pkg/linter/lib/src/rules/avoid_print.dart b/pkg/linter/lib/src/rules/avoid_print.dart
index c39e15e..9a7c88f 100644
--- a/pkg/linter/lib/src/rules/avoid_print.dart
+++ b/pkg/linter/lib/src/rules/avoid_print.dart
@@ -36,7 +36,7 @@
   void visitMethodInvocation(MethodInvocation node) {
     if ((node.methodName.element?.isDartCorePrint ?? false) &&
         !_isDebugOnly(node)) {
-      rule.reportLint(node.methodName);
+      rule.reportAtNode(node.methodName);
     }
 
     node.argumentList.arguments.forEach(_validateArgument);
@@ -63,7 +63,7 @@
     if (expression is SimpleIdentifier) {
       var element = expression.element;
       if (element.isDartCorePrint) {
-        rule.reportLint(expression);
+        rule.reportAtNode(expression);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/avoid_redundant_argument_values.dart b/pkg/linter/lib/src/rules/avoid_redundant_argument_values.dart
index f2f7724..3fa4027 100644
--- a/pkg/linter/lib/src/rules/avoid_redundant_argument_values.dart
+++ b/pkg/linter/lib/src/rules/avoid_redundant_argument_values.dart
@@ -79,7 +79,7 @@
       var expressionValue = arg.computeConstantValue().value;
       if ((expressionValue?.hasKnownValue ?? false) &&
           expressionValue == value) {
-        rule.reportLint(arg);
+        rule.reportAtNode(arg);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/avoid_relative_lib_imports.dart b/pkg/linter/lib/src/rules/avoid_relative_lib_imports.dart
index 3ab248b..e1728b6 100644
--- a/pkg/linter/lib/src/rules/avoid_relative_lib_imports.dart
+++ b/pkg/linter/lib/src/rules/avoid_relative_lib_imports.dart
@@ -47,7 +47,7 @@
   @override
   void visitImportDirective(ImportDirective node) {
     if (isRelativeLibImport(node)) {
-      rule.reportLint(node.uri);
+      rule.reportAtNode(node.uri);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_return_types_on_setters.dart b/pkg/linter/lib/src/rules/avoid_return_types_on_setters.dart
index c5899cd..9f821c5 100644
--- a/pkg/linter/lib/src/rules/avoid_return_types_on_setters.dart
+++ b/pkg/linter/lib/src/rules/avoid_return_types_on_setters.dart
@@ -39,7 +39,7 @@
   void visitFunctionDeclaration(FunctionDeclaration node) {
     if (node.isSetter) {
       if (node.returnType != null) {
-        rule.reportLint(node.returnType);
+        rule.reportAtNode(node.returnType);
       }
     }
   }
@@ -48,7 +48,7 @@
   void visitMethodDeclaration(MethodDeclaration node) {
     if (node.isSetter) {
       if (node.returnType != null) {
-        rule.reportLint(node.returnType);
+        rule.reportAtNode(node.returnType);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/avoid_returning_null_for_void.dart b/pkg/linter/lib/src/rules/avoid_returning_null_for_void.dart
index 17e8b50..eb082e9 100644
--- a/pkg/linter/lib/src/rules/avoid_returning_null_for_void.dart
+++ b/pkg/linter/lib/src/rules/avoid_returning_null_for_void.dart
@@ -72,11 +72,11 @@
     if (type == null) return;
 
     if (!isAsync && type is VoidType) {
-      rule.reportLint(node, errorCode: code);
+      rule.reportAtNode(node, errorCode: code);
     } else if (isAsync &&
         type.isDartAsyncFuture &&
         (type as InterfaceType).typeArguments.first is VoidType) {
-      rule.reportLint(node, errorCode: code);
+      rule.reportAtNode(node, errorCode: code);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_returning_this.dart b/pkg/linter/lib/src/rules/avoid_returning_this.dart
index 3f7c4d5..60bdce9 100644
--- a/pkg/linter/lib/src/rules/avoid_returning_this.dart
+++ b/pkg/linter/lib/src/rules/avoid_returning_this.dart
@@ -95,7 +95,7 @@
     if (body is BlockFunctionBody) {
       var returnStatements = _BodyVisitor().collectReturns(body);
       if (returnStatements.isNotEmpty) {
-        rule.reportLint(returnStatements.first.expression);
+        rule.reportAtNode(returnStatements.first.expression);
       }
     } else if (body is ExpressionFunctionBody) {
       if (body.expression is ThisExpression) {
diff --git a/pkg/linter/lib/src/rules/avoid_shadowing_type_parameters.dart b/pkg/linter/lib/src/rules/avoid_shadowing_type_parameters.dart
index 9941dae..9d0f37b 100644
--- a/pkg/linter/lib/src/rules/avoid_shadowing_type_parameters.dart
+++ b/pkg/linter/lib/src/rules/avoid_shadowing_type_parameters.dart
@@ -124,7 +124,7 @@
       var lexeme = parameter.name.lexeme;
       if (_wildCardVariablesEnabled && lexeme == '_') continue;
       if (ancestorTypeParameterNames.contains(lexeme)) {
-        rule.reportLint(
+        rule.reportAtNode(
           parameter,
           arguments: [parameter.name.lexeme, ancestorKind],
         );
diff --git a/pkg/linter/lib/src/rules/avoid_single_cascade_in_expression_statements.dart b/pkg/linter/lib/src/rules/avoid_single_cascade_in_expression_statements.dart
index 91353e9..d91137c 100644
--- a/pkg/linter/lib/src/rules/avoid_single_cascade_in_expression_statements.dart
+++ b/pkg/linter/lib/src/rules/avoid_single_cascade_in_expression_statements.dart
@@ -54,7 +54,7 @@
     var sections = node.cascadeSections;
     if (sections.length == 1 && node.parent is ExpressionStatement) {
       var operator = operatorFor(sections[0]);
-      rule.reportLint(node, arguments: [operator]);
+      rule.reportAtNode(node, arguments: [operator]);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_slow_async_io.dart b/pkg/linter/lib/src/rules/avoid_slow_async_io.dart
index cbc546b..2358de3 100644
--- a/pkg/linter/lib/src/rules/avoid_slow_async_io.dart
+++ b/pkg/linter/lib/src/rules/avoid_slow_async_io.dart
@@ -65,7 +65,7 @@
   void _checkDirectoryMethods(MethodInvocation node, DartType? type) {
     if (type.extendsClass('Directory', 'dart.io')) {
       if (_dirMethodNames.contains(node.methodName.name)) {
-        rule.reportLint(node);
+        rule.reportAtNode(node);
       }
     }
   }
@@ -73,7 +73,7 @@
   void _checkFileMethods(MethodInvocation node, DartType? type) {
     if (type.extendsClass('File', 'dart.io')) {
       if (_fileMethodNames.contains(node.methodName.name)) {
-        rule.reportLint(node);
+        rule.reportAtNode(node);
       }
     }
   }
@@ -84,7 +84,7 @@
       var element = target.element;
       if (element is ClassElement && element.name3 == 'FileSystemEntity') {
         if (_fileSystemEntityMethodNames.contains(node.methodName.name)) {
-          rule.reportLint(node);
+          rule.reportAtNode(node);
         }
       }
     }
diff --git a/pkg/linter/lib/src/rules/avoid_type_to_string.dart b/pkg/linter/lib/src/rules/avoid_type_to_string.dart
index 9204c97..b60ab7f 100644
--- a/pkg/linter/lib/src/rules/avoid_type_to_string.dart
+++ b/pkg/linter/lib/src/rules/avoid_type_to_string.dart
@@ -104,7 +104,7 @@
     SimpleIdentifier methodIdentifier,
   ) {
     if (_isToStringOnCoreTypeClass(targetType, methodIdentifier)) {
-      rule.reportLint(methodIdentifier);
+      rule.reportAtNode(methodIdentifier);
     }
   }
 
diff --git a/pkg/linter/lib/src/rules/avoid_types_as_parameter_names.dart b/pkg/linter/lib/src/rules/avoid_types_as_parameter_names.dart
index 38d8353..f8fa24f 100644
--- a/pkg/linter/lib/src/rules/avoid_types_as_parameter_names.dart
+++ b/pkg/linter/lib/src/rules/avoid_types_as_parameter_names.dart
@@ -42,7 +42,7 @@
   void visitCatchClause(CatchClause node) {
     var parameter = node.exceptionParameter;
     if (parameter != null && _isTypeName(node, parameter.name)) {
-      rule.reportLint(parameter, arguments: [parameter.name.lexeme]);
+      rule.reportAtNode(parameter, arguments: [parameter.name.lexeme]);
     }
   }
 
diff --git a/pkg/linter/lib/src/rules/avoid_types_on_closure_parameters.dart b/pkg/linter/lib/src/rules/avoid_types_on_closure_parameters.dart
index ecb36f3..10a1193 100644
--- a/pkg/linter/lib/src/rules/avoid_types_on_closure_parameters.dart
+++ b/pkg/linter/lib/src/rules/avoid_types_on_closure_parameters.dart
@@ -58,14 +58,14 @@
 
   @override
   void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    rule.reportLint(node);
+    rule.reportAtNode(node);
   }
 
   @override
   void visitSimpleFormalParameter(SimpleFormalParameter node) {
     var type = node.type;
     if (type is NamedType && type.type is! DynamicType) {
-      rule.reportLint(node.type);
+      rule.reportAtNode(node.type);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_unnecessary_containers.dart b/pkg/linter/lib/src/rules/avoid_unnecessary_containers.dart
index 5fd4e20..68ec537 100644
--- a/pkg/linter/lib/src/rules/avoid_unnecessary_containers.dart
+++ b/pkg/linter/lib/src/rules/avoid_unnecessary_containers.dart
@@ -46,7 +46,7 @@
             parent.thisOrAncestorOfType<InstanceCreationExpression>();
         if (parentCreation != null) {
           if (isExactWidgetTypeContainer(parentCreation.staticType)) {
-            rule.reportLint(parentCreation.constructorName);
+            rule.reportAtNode(parentCreation.constructorName);
           }
         }
       }
diff --git a/pkg/linter/lib/src/rules/avoid_unused_constructor_parameters.dart b/pkg/linter/lib/src/rules/avoid_unused_constructor_parameters.dart
index 5ae059d..f05a5a4 100644
--- a/pkg/linter/lib/src/rules/avoid_unused_constructor_parameters.dart
+++ b/pkg/linter/lib/src/rules/avoid_unused_constructor_parameters.dart
@@ -73,7 +73,7 @@
     }
 
     for (var parameter in constructorVisitor.unusedParameters) {
-      rule.reportLint(parameter, arguments: [parameter.name!.lexeme]);
+      rule.reportAtNode(parameter, arguments: [parameter.name!.lexeme]);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/avoid_web_libraries_in_flutter.dart b/pkg/linter/lib/src/rules/avoid_web_libraries_in_flutter.dart
index eea5907..8d7389c 100644
--- a/pkg/linter/lib/src/rules/avoid_web_libraries_in_flutter.dart
+++ b/pkg/linter/lib/src/rules/avoid_web_libraries_in_flutter.dart
@@ -115,7 +115,7 @@
   void visitImportDirective(ImportDirective node) {
     var uriString = node.uri.stringValue;
     if (uriString != null && isWebUri(uriString)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/cascade_invocations.dart b/pkg/linter/lib/src/rules/cascade_invocations.dart
index 4b09ccb..c2fe453 100644
--- a/pkg/linter/lib/src/rules/cascade_invocations.dart
+++ b/pkg/linter/lib/src/rules/cascade_invocations.dart
@@ -322,7 +322,7 @@
         );
       }
       if (currentExpressionBox.compatibleWith(previousExpressionBox)) {
-        rule.reportLint(statement);
+        rule.reportAtNode(statement);
       }
       previousExpressionBox = currentExpressionBox;
     }
diff --git a/pkg/linter/lib/src/rules/cast_nullable_to_non_nullable.dart b/pkg/linter/lib/src/rules/cast_nullable_to_non_nullable.dart
index 5379173..7c35e15 100644
--- a/pkg/linter/lib/src/rules/cast_nullable_to_non_nullable.dart
+++ b/pkg/linter/lib/src/rules/cast_nullable_to_non_nullable.dart
@@ -43,7 +43,7 @@
         context.typeSystem.isNullable(expressionType) &&
         type != null &&
         context.typeSystem.isNonNullable(type)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/collection_methods_unrelated_type.dart b/pkg/linter/lib/src/rules/collection_methods_unrelated_type.dart
index 6d5fb2f..e929d4c 100644
--- a/pkg/linter/lib/src/rules/collection_methods_unrelated_type.dart
+++ b/pkg/linter/lib/src/rules/collection_methods_unrelated_type.dart
@@ -258,7 +258,7 @@
         var typeArgument =
             collectionType.typeArguments[methodDefinition.typeArgumentIndex];
         if (typesAreUnrelated(typeSystem, argumentType, typeArgument)) {
-          rule.reportLint(
+          rule.reportAtNode(
             argument,
             arguments: [
               argumentType.getDisplayString(),
@@ -269,7 +269,7 @@
 
       case _ExpectedArgumentKind.assignableToCollection:
         if (!typeSystem.isAssignableTo(argumentType, collectionType)) {
-          rule.reportLint(
+          rule.reportAtNode(
             argument,
             arguments: [
               argumentType.getDisplayString(),
@@ -284,7 +284,7 @@
         );
         if (iterableType != null &&
             !typeSystem.isAssignableTo(argumentType, iterableType)) {
-          rule.reportLint(
+          rule.reportAtNode(
             argument,
             arguments: [
               argumentType.getDisplayString(),
diff --git a/pkg/linter/lib/src/rules/combinators_ordering.dart b/pkg/linter/lib/src/rules/combinators_ordering.dart
index 42ebaff..9a388ea 100644
--- a/pkg/linter/lib/src/rules/combinators_ordering.dart
+++ b/pkg/linter/lib/src/rules/combinators_ordering.dart
@@ -36,14 +36,14 @@
   @override
   void visitHideCombinator(HideCombinator node) {
     if (!node.hiddenNames.map((e) => e.name).isSorted()) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 
   @override
   void visitShowCombinator(ShowCombinator node) {
     if (!node.shownNames.map((e) => e.name).isSorted()) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/comment_references.dart b/pkg/linter/lib/src/rules/comment_references.dart
index 26f4aec..4f8c80f 100644
--- a/pkg/linter/lib/src/rules/comment_references.dart
+++ b/pkg/linter/lib/src/rules/comment_references.dart
@@ -87,14 +87,14 @@
     if (expression is Identifier &&
         expression.element == null &&
         !linkReferences.contains(expression.name)) {
-      rule.reportLint(expression);
+      rule.reportAtNode(expression);
     } else if (expression is PropertyAccess &&
         expression.propertyName.element == null) {
       var target = expression.target;
       if (target is PrefixedIdentifier) {
         var name = '${target.name}.${expression.propertyName.name}';
         if (!linkReferences.contains(name)) {
-          rule.reportLint(expression);
+          rule.reportAtNode(expression);
         }
       }
     }
diff --git a/pkg/linter/lib/src/rules/conditional_uri_does_not_exist.dart b/pkg/linter/lib/src/rules/conditional_uri_does_not_exist.dart
index f6bbbf2..7fb5341 100644
--- a/pkg/linter/lib/src/rules/conditional_uri_does_not_exist.dart
+++ b/pkg/linter/lib/src/rules/conditional_uri_does_not_exist.dart
@@ -41,7 +41,10 @@
       // in the analysis server (although running the script when the files
       // don't exist on disk would also fail to find it).
       if (!(source?.exists() ?? false)) {
-        rule.reportLint(configuration.uri, arguments: [uri.relativeUriString]);
+        rule.reportAtNode(
+          configuration.uri,
+          arguments: [uri.relativeUriString],
+        );
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/control_flow_in_finally.dart b/pkg/linter/lib/src/rules/control_flow_in_finally.dart
index e49224d..102114f 100644
--- a/pkg/linter/lib/src/rules/control_flow_in_finally.dart
+++ b/pkg/linter/lib/src/rules/control_flow_in_finally.dart
@@ -56,7 +56,7 @@
       tryStatement,
     );
     if (enablerNode == null) {
-      rule.reportLint(node, arguments: [kind]);
+      rule.reportAtNode(node, arguments: [kind]);
     }
   }
 
diff --git a/pkg/linter/lib/src/rules/curly_braces_in_flow_control_structures.dart b/pkg/linter/lib/src/rules/curly_braces_in_flow_control_structures.dart
index a961e29..77f5c75 100644
--- a/pkg/linter/lib/src/rules/curly_braces_in_flow_control_structures.dart
+++ b/pkg/linter/lib/src/rules/curly_braces_in_flow_control_structures.dart
@@ -66,7 +66,7 @@
       var lineInfo = unit.lineInfo;
       if (lineInfo.getLocation(node.ifKeyword.offset).lineNumber !=
           lineInfo.getLocation(node.thenStatement.end).lineNumber) {
-        rule.reportLint(node.thenStatement, arguments: ['an if']);
+        rule.reportAtNode(node.thenStatement, arguments: ['an if']);
       }
     } else {
       _check('an if', node.thenStatement);
@@ -82,6 +82,6 @@
   }
 
   void _check(String where, Statement node) {
-    if (node is! Block) rule.reportLint(node, arguments: [where]);
+    if (node is! Block) rule.reportAtNode(node, arguments: [where]);
   }
 }
diff --git a/pkg/linter/lib/src/rules/dangling_library_doc_comments.dart b/pkg/linter/lib/src/rules/dangling_library_doc_comments.dart
index 8f25e68..cf45f19 100644
--- a/pkg/linter/lib/src/rules/dangling_library_doc_comments.dart
+++ b/pkg/linter/lib/src/rules/dangling_library_doc_comments.dart
@@ -106,7 +106,7 @@
       if (followingCommentLine > commentEndLine + 1) {
         // There is a blank line between the declaration's doc comment and the
         // declaration.
-        rule.reportLint(docComment);
+        rule.reportAtNode(docComment);
         return;
       }
 
@@ -129,7 +129,7 @@
     if (declarationStartLine > commentEndLine + 1) {
       // There is a blank line between the declaration's doc comment and the
       // declaration.
-      rule.reportLint(docComment);
+      rule.reportAtNode(docComment);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/deprecated_consistency.dart b/pkg/linter/lib/src/rules/deprecated_consistency.dart
index 6caaf3e..c6ae1ab 100644
--- a/pkg/linter/lib/src/rules/deprecated_consistency.dart
+++ b/pkg/linter/lib/src/rules/deprecated_consistency.dart
@@ -61,7 +61,7 @@
     if (field == null) return;
 
     if (field.hasDeprecated && !declaredElement.hasDeprecated) {
-      rule.reportLint(
+      rule.reportAtNode(
         node,
         errorCode: LinterLintCode.deprecated_consistency_field,
       );
diff --git a/pkg/linter/lib/src/rules/directives_ordering.dart b/pkg/linter/lib/src/rules/directives_ordering.dart
index 8e62315..adf31dc 100644
--- a/pkg/linter/lib/src/rules/directives_ordering.dart
+++ b/pkg/linter/lib/src/rules/directives_ordering.dart
@@ -80,7 +80,7 @@
   }
 
   void _reportLintWithDartDirectiveGoFirstMessage(AstNode node, String type) {
-    reportLint(
+    reportAtNode(
       node,
       errorCode: LinterLintCode.directives_ordering_dart,
       arguments: [type],
@@ -90,21 +90,21 @@
   void _reportLintWithDirectiveSectionOrderedAlphabeticallyMessage(
     AstNode node,
   ) {
-    reportLint(
+    reportAtNode(
       node,
       errorCode: LinterLintCode.directives_ordering_alphabetical,
     );
   }
 
   void _reportLintWithExportDirectiveAfterImportDirectiveMessage(AstNode node) {
-    reportLint(node, errorCode: LinterLintCode.directives_ordering_exports);
+    reportAtNode(node, errorCode: LinterLintCode.directives_ordering_exports);
   }
 
   void _reportLintWithPackageDirectiveBeforeRelativeMessage(
     AstNode node,
     String type,
   ) {
-    reportLint(
+    reportAtNode(
       node,
       errorCode: LinterLintCode.directives_ordering_package_before_relative,
       arguments: [type],
diff --git a/pkg/linter/lib/src/rules/discarded_futures.dart b/pkg/linter/lib/src/rules/discarded_futures.dart
index 174cc60..196d0b9 100644
--- a/pkg/linter/lib/src/rules/discarded_futures.dart
+++ b/pkg/linter/lib/src/rules/discarded_futures.dart
@@ -105,7 +105,7 @@
       _isMapClass(expr.methodName.element?.enclosingElement2);
 
   void _reportOnExpression(Expression expr) {
-    rule.reportLint(switch (expr) {
+    rule.reportAtNode(switch (expr) {
       MethodInvocation(:var methodName) => methodName,
       InstanceCreationExpression(:var constructorName) => constructorName,
       FunctionExpressionInvocation(:var function) => function,
diff --git a/pkg/linter/lib/src/rules/do_not_use_environment.dart b/pkg/linter/lib/src/rules/do_not_use_environment.dart
index 3859f07..240d6a9 100644
--- a/pkg/linter/lib/src/rules/do_not_use_environment.dart
+++ b/pkg/linter/lib/src/rules/do_not_use_environment.dart
@@ -51,7 +51,7 @@
                 staticType.isDartCoreString) &&
             constructorName == 'fromEnvironment') ||
         (staticType.isDartCoreBool && constructorName == 'hasEnvironment')) {
-      rule.reportLint(constructorNameNode);
+      rule.reportAtNode(constructorNameNode);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/empty_catches.dart b/pkg/linter/lib/src/rules/empty_catches.dart
index 4c0ae25..0642e02 100644
--- a/pkg/linter/lib/src/rules/empty_catches.dart
+++ b/pkg/linter/lib/src/rules/empty_catches.dart
@@ -43,7 +43,7 @@
     var body = node.body;
     if (node.body.statements.isEmpty &&
         body.rightBracket.precedingComments == null) {
-      rule.reportLint(body);
+      rule.reportAtNode(body);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/empty_constructor_bodies.dart b/pkg/linter/lib/src/rules/empty_constructor_bodies.dart
index 42d6f40..6d23722 100644
--- a/pkg/linter/lib/src/rules/empty_constructor_bodies.dart
+++ b/pkg/linter/lib/src/rules/empty_constructor_bodies.dart
@@ -38,7 +38,7 @@
       var block = body.block;
       if (block.statements.isEmpty) {
         if (block.endToken.precedingComments == null) {
-          rule.reportLint(block);
+          rule.reportAtNode(block);
         }
       }
     }
diff --git a/pkg/linter/lib/src/rules/empty_statements.dart b/pkg/linter/lib/src/rules/empty_statements.dart
index 1f3c3bd..d55a09d 100644
--- a/pkg/linter/lib/src/rules/empty_statements.dart
+++ b/pkg/linter/lib/src/rules/empty_statements.dart
@@ -48,6 +48,6 @@
   @override
   void visitEmptyStatement(EmptyStatement node) {
     if (definesSemantics(node)) return;
-    rule.reportLint(node);
+    rule.reportAtNode(node);
   }
 }
diff --git a/pkg/linter/lib/src/rules/erase_dart_type_extension_types.dart b/pkg/linter/lib/src/rules/erase_dart_type_extension_types.dart
index f90fa0c..e412428 100644
--- a/pkg/linter/lib/src/rules/erase_dart_type_extension_types.dart
+++ b/pkg/linter/lib/src/rules/erase_dart_type_extension_types.dart
@@ -42,7 +42,7 @@
   visitIsExpression(IsExpression node) {
     var type = node.type.type;
     if (type != null && type.implementsInterface('DartType', 'kernel.ast')) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/implementation_imports.dart b/pkg/linter/lib/src/rules/implementation_imports.dart
index dbba765..8f2ca429 100644
--- a/pkg/linter/lib/src/rules/implementation_imports.dart
+++ b/pkg/linter/lib/src/rules/implementation_imports.dart
@@ -49,7 +49,7 @@
       if (!importUri.isImplementation) return;
 
       if (!importUri.isSamePackageAs(sourceUri)) {
-        rule.reportLint(node.uri);
+        rule.reportAtNode(node.uri);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/implicit_call_tearoffs.dart b/pkg/linter/lib/src/rules/implicit_call_tearoffs.dart
index 127ff99..4110594 100644
--- a/pkg/linter/lib/src/rules/implicit_call_tearoffs.dart
+++ b/pkg/linter/lib/src/rules/implicit_call_tearoffs.dart
@@ -34,6 +34,6 @@
 
   @override
   void visitImplicitCallReference(ImplicitCallReference node) {
-    rule.reportLint(node);
+    rule.reportAtNode(node);
   }
 }
diff --git a/pkg/linter/lib/src/rules/invalid_case_patterns.dart b/pkg/linter/lib/src/rules/invalid_case_patterns.dart
index c3db81e..807cdb0 100644
--- a/pkg/linter/lib/src/rules/invalid_case_patterns.dart
+++ b/pkg/linter/lib/src/rules/invalid_case_patterns.dart
@@ -49,38 +49,38 @@
     var expression = node.expression.unParenthesized;
     if (expression is SetOrMapLiteral) {
       if (expression.constKeyword == null) {
-        rule.reportLint(expression);
+        rule.reportAtNode(expression);
       }
     } else if (expression is ListLiteral) {
       if (expression.constKeyword == null) {
-        rule.reportLint(expression);
+        rule.reportAtNode(expression);
       }
     } else if (expression is MethodInvocation) {
       if (expression.methodName.isDartCoreIdentifier(named: 'identical')) {
-        rule.reportLint(expression);
+        rule.reportAtNode(expression);
       }
     } else if (expression is PrefixExpression) {
       if (expression.operand is! IntegerLiteral) {
-        rule.reportLint(expression);
+        rule.reportAtNode(expression);
       }
     } else if (expression is BinaryExpression) {
-      rule.reportLint(expression);
+      rule.reportAtNode(expression);
     } else if (expression is ConditionalExpression) {
-      rule.reportLint(expression);
+      rule.reportAtNode(expression);
     } else if (expression is PropertyAccess) {
       if (expression.propertyName.isDartCoreIdentifier(named: 'length')) {
-        rule.reportLint(expression);
+        rule.reportAtNode(expression);
       }
     } else if (expression is IsExpression) {
-      rule.reportLint(expression);
+      rule.reportAtNode(expression);
     } else if (expression is InstanceCreationExpression) {
       if (expression.isConst && expression.keyword?.type != Keyword.CONST) {
-        rule.reportLint(expression);
+        rule.reportAtNode(expression);
       }
     } else if (expression is SimpleIdentifier) {
       var token = expression.token;
       if (token is StringToken && token.lexeme == '_') {
-        rule.reportLint(expression);
+        rule.reportAtNode(expression);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart b/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart
index 0669e30..85109d4 100644
--- a/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart
+++ b/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart
@@ -420,7 +420,11 @@
     if (leftType == null || rightType == null) return;
     var code = getInvalidJsInteropTypeTest(leftType, rightType, check: false);
     if (code != null) {
-      rule.reportLint(node, arguments: [leftType, rightType], errorCode: code);
+      rule.reportAtNode(
+        node,
+        arguments: [leftType, rightType],
+        errorCode: code,
+      );
     }
   }
 
@@ -431,7 +435,11 @@
     if (leftType == null || rightType == null) return;
     var code = getInvalidJsInteropTypeTest(leftType, rightType, check: true);
     if (code != null) {
-      rule.reportLint(node, arguments: [leftType, rightType], errorCode: code);
+      rule.reportAtNode(
+        node,
+        arguments: [leftType, rightType],
+        errorCode: code,
+      );
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/join_return_with_assignment.dart b/pkg/linter/lib/src/rules/join_return_with_assignment.dart
index d282b90..1ba6e25 100644
--- a/pkg/linter/lib/src/rules/join_return_with_assignment.dart
+++ b/pkg/linter/lib/src/rules/join_return_with_assignment.dart
@@ -88,7 +88,7 @@
           lastExpression,
           secondLastExpression,
         )) {
-      rule.reportLint(secondLastStatement);
+      rule.reportAtNode(secondLastStatement);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/leading_newlines_in_multiline_strings.dart b/pkg/linter/lib/src/rules/leading_newlines_in_multiline_strings.dart
index 45b175a..10286e7 100644
--- a/pkg/linter/lib/src/rules/leading_newlines_in_multiline_strings.dart
+++ b/pkg/linter/lib/src/rules/leading_newlines_in_multiline_strings.dart
@@ -67,7 +67,7 @@
       bool startWithNewLine(int index) =>
           lexeme.startsWith('\n', index) || lexeme.startsWith('\r', index);
       if (!startWithNewLine(node.isRaw ? 4 : 3)) {
-        rule.reportLint(node);
+        rule.reportAtNode(node);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/library_annotations.dart b/pkg/linter/lib/src/rules/library_annotations.dart
index 253af43..a89bf09 100644
--- a/pkg/linter/lib/src/rules/library_annotations.dart
+++ b/pkg/linter/lib/src/rules/library_annotations.dart
@@ -63,9 +63,9 @@
       if (elementAnnotation.targetKinds.length == 1 &&
           elementAnnotation.targetKinds.contains(TargetKind.library) &&
           firstDirective == node) {
-        rule.reportLint(annotation);
+        rule.reportAtNode(annotation);
       } else if (elementAnnotation.isPragmaLateTrust) {
-        rule.reportLint(annotation);
+        rule.reportAtNode(annotation);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/library_names.dart b/pkg/linter/lib/src/rules/library_names.dart
index 8fb4787..10299f1 100644
--- a/pkg/linter/lib/src/rules/library_names.dart
+++ b/pkg/linter/lib/src/rules/library_names.dart
@@ -35,7 +35,7 @@
   void visitLibraryDirective(LibraryDirective node) {
     var name = node.name2;
     if (name != null && !isLowerCaseUnderScoreWithDots(name.toString())) {
-      rule.reportLint(name, arguments: [name.toString()]);
+      rule.reportAtNode(name, arguments: [name.toString()]);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/library_prefixes.dart b/pkg/linter/lib/src/rules/library_prefixes.dart
index 84a8a82..7004357 100644
--- a/pkg/linter/lib/src/rules/library_prefixes.dart
+++ b/pkg/linter/lib/src/rules/library_prefixes.dart
@@ -49,7 +49,7 @@
     if (_wildCardVariablesEnabled && prefixString == '_') return;
 
     if (!isValidLibraryPrefix(prefixString)) {
-      rule.reportLint(prefix, arguments: [prefixString]);
+      rule.reportAtNode(prefix, arguments: [prefixString]);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/literal_only_boolean_expressions.dart b/pkg/linter/lib/src/rules/literal_only_boolean_expressions.dart
index 3f97786..c2b9752 100644
--- a/pkg/linter/lib/src/rules/literal_only_boolean_expressions.dart
+++ b/pkg/linter/lib/src/rules/literal_only_boolean_expressions.dart
@@ -60,7 +60,7 @@
   @override
   void visitDoStatement(DoStatement node) {
     if (_onlyLiterals(node.condition)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 
@@ -69,7 +69,7 @@
     var loopParts = node.forLoopParts;
     if (loopParts is ForParts) {
       if (_onlyLiterals(loopParts.condition)) {
-        rule.reportLint(node);
+        rule.reportAtNode(node);
       }
     }
   }
@@ -78,14 +78,14 @@
   void visitIfStatement(IfStatement node) {
     if (node.caseClause != null) return;
     if (_onlyLiterals(node.expression)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 
   @override
   void visitWhenClause(WhenClause node) {
     if (_onlyLiterals(node.expression)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 
@@ -99,7 +99,7 @@
     }
 
     if (_onlyLiterals(condition)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/matching_super_parameters.dart b/pkg/linter/lib/src/rules/matching_super_parameters.dart
index e315041..88dedfc 100644
--- a/pkg/linter/lib/src/rules/matching_super_parameters.dart
+++ b/pkg/linter/lib/src/rules/matching_super_parameters.dart
@@ -74,7 +74,7 @@
       var parameterOfSuperName = positionalParametersOfSuper[i].name3;
       if (parameterOfSuperName != null &&
           superParameterName != parameterOfSuperName) {
-        rule.reportLint(
+        rule.reportAtNode(
           superParameter,
           arguments: [superParameterName, parameterOfSuperName],
         );
diff --git a/pkg/linter/lib/src/rules/missing_whitespace_between_adjacent_strings.dart b/pkg/linter/lib/src/rules/missing_whitespace_between_adjacent_strings.dart
index 025e11e..022b028 100644
--- a/pkg/linter/lib/src/rules/missing_whitespace_between_adjacent_strings.dart
+++ b/pkg/linter/lib/src/rules/missing_whitespace_between_adjacent_strings.dart
@@ -61,7 +61,7 @@
       if (!current.hasWhitespace) {
         continue;
       }
-      rule.reportLint(current);
+      rule.reportAtNode(current);
     }
 
     return super.visitAdjacentStrings(node);
diff --git a/pkg/linter/lib/src/rules/no_adjacent_strings_in_list.dart b/pkg/linter/lib/src/rules/no_adjacent_strings_in_list.dart
index fd79664..507bb47 100644
--- a/pkg/linter/lib/src/rules/no_adjacent_strings_in_list.dart
+++ b/pkg/linter/lib/src/rules/no_adjacent_strings_in_list.dart
@@ -37,7 +37,7 @@
 
   void check(AstNode? element) {
     if (element is AdjacentStrings) {
-      rule.reportLint(element);
+      rule.reportAtNode(element);
     }
   }
 
@@ -51,7 +51,7 @@
   @override
   void visitIfElement(IfElement node) {
     if (node.elseElement == null && node.thenElement is AdjacentStrings) {
-      rule.reportLint(node.thenElement);
+      rule.reportAtNode(node.thenElement);
     } else {
       check(node.elseElement);
     }
diff --git a/pkg/linter/lib/src/rules/no_default_cases.dart b/pkg/linter/lib/src/rules/no_default_cases.dart
index 141aed3..b749ec2 100644
--- a/pkg/linter/lib/src/rules/no_default_cases.dart
+++ b/pkg/linter/lib/src/rules/no_default_cases.dart
@@ -48,7 +48,7 @@
           if (interfaceElement is EnumElement ||
               interfaceElement is ClassElement &&
                   interfaceElement.isEnumLikeClass()) {
-            rule.reportLint(member);
+            rule.reportAtNode(member);
           }
           return;
         }
diff --git a/pkg/linter/lib/src/rules/no_duplicate_case_values.dart b/pkg/linter/lib/src/rules/no_duplicate_case_values.dart
index 85f52ce..4e3037f 100644
--- a/pkg/linter/lib/src/rules/no_duplicate_case_values.dart
+++ b/pkg/linter/lib/src/rules/no_duplicate_case_values.dart
@@ -52,7 +52,7 @@
         // TODO(brianwilkeson): This would benefit from having a context message
         //  pointing at the `duplicateValue`.
         if (duplicateValue != null) {
-          rule.reportLint(
+          rule.reportAtNode(
             expression,
             arguments: [expression.toString(), duplicateValue.toString()],
           );
diff --git a/pkg/linter/lib/src/rules/no_leading_underscores_for_library_prefixes.dart b/pkg/linter/lib/src/rules/no_leading_underscores_for_library_prefixes.dart
index 803a745..854a272 100644
--- a/pkg/linter/lib/src/rules/no_leading_underscores_for_library_prefixes.dart
+++ b/pkg/linter/lib/src/rules/no_leading_underscores_for_library_prefixes.dart
@@ -50,7 +50,7 @@
     if (_wildCardVariablesEnabled && name == '_') return;
 
     if (name.hasLeadingUnderscore) {
-      rule.reportLint(id, arguments: [id.name]);
+      rule.reportAtNode(id, arguments: [id.name]);
     }
   }
 
diff --git a/pkg/linter/lib/src/rules/no_literal_bool_comparisons.dart b/pkg/linter/lib/src/rules/no_literal_bool_comparisons.dart
index 80d6346..97bff0a 100644
--- a/pkg/linter/lib/src/rules/no_literal_bool_comparisons.dart
+++ b/pkg/linter/lib/src/rules/no_literal_bool_comparisons.dart
@@ -46,9 +46,9 @@
       var left = node.leftOperand;
       var right = node.rightOperand;
       if (right is BooleanLiteral && isBool(left.staticType)) {
-        rule.reportLint(right);
+        rule.reportAtNode(right);
       } else if (left is BooleanLiteral && isBool(right.staticType)) {
-        rule.reportLint(left);
+        rule.reportAtNode(left);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/no_logic_in_create_state.dart b/pkg/linter/lib/src/rules/no_logic_in_create_state.dart
index 3305318..243edc9 100644
--- a/pkg/linter/lib/src/rules/no_logic_in_create_state.dart
+++ b/pkg/linter/lib/src/rules/no_logic_in_create_state.dart
@@ -64,6 +64,6 @@
         return;
       }
     }
-    rule.reportLint(expressionToTest ?? body);
+    rule.reportAtNode(expressionToTest ?? body);
   }
 }
diff --git a/pkg/linter/lib/src/rules/no_runtimeType_toString.dart b/pkg/linter/lib/src/rules/no_runtimeType_toString.dart
index fba586f..70a1af1 100644
--- a/pkg/linter/lib/src/rules/no_runtimeType_toString.dart
+++ b/pkg/linter/lib/src/rules/no_runtimeType_toString.dart
@@ -40,7 +40,7 @@
     if (!_isRuntimeTypeAccess(node.expression)) return;
     if (_canSkip(node)) return;
 
-    rule.reportLint(node.expression);
+    rule.reportAtNode(node.expression);
   }
 
   @override
@@ -49,7 +49,7 @@
     if (!_isRuntimeTypeAccess(node.realTarget)) return;
     if (_canSkip(node)) return;
 
-    rule.reportLint(node.methodName);
+    rule.reportAtNode(node.methodName);
   }
 
   bool _canSkip(AstNode node) =>
diff --git a/pkg/linter/lib/src/rules/no_self_assignments.dart b/pkg/linter/lib/src/rules/no_self_assignments.dart
index 7e13256..ea29f9f 100644
--- a/pkg/linter/lib/src/rules/no_self_assignments.dart
+++ b/pkg/linter/lib/src/rules/no_self_assignments.dart
@@ -39,7 +39,7 @@
     var rhs = node.rightHandSide;
     if (lhs is Identifier && rhs is Identifier) {
       if (lhs.name == rhs.name) {
-        rule.reportLint(node);
+        rule.reportAtNode(node);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/no_wildcard_variable_uses.dart b/pkg/linter/lib/src/rules/no_wildcard_variable_uses.dart
index 9db29ee..7bde99a 100644
--- a/pkg/linter/lib/src/rules/no_wildcard_variable_uses.dart
+++ b/pkg/linter/lib/src/rules/no_wildcard_variable_uses.dart
@@ -45,7 +45,7 @@
     }
 
     if (node.name.isJustUnderscores) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/noop_primitive_operations.dart b/pkg/linter/lib/src/rules/noop_primitive_operations.dart
index 0581f5a..e63134e 100644
--- a/pkg/linter/lib/src/rules/noop_primitive_operations.dart
+++ b/pkg/linter/lib/src/rules/noop_primitive_operations.dart
@@ -42,7 +42,7 @@
     for (var i = 1; i < node.strings.length - 1; i++) {
       var literal = node.strings[i];
       if (literal.stringValue?.isEmpty ?? false) {
-        rule.reportLint(literal);
+        rule.reportAtNode(literal);
       }
     }
   }
@@ -68,7 +68,7 @@
     if (type.isDartCoreString &&
         node.methodName.name == 'toString' &&
         context.typeSystem.isNonNullable(type)) {
-      rule.reportLint(node.methodName);
+      rule.reportAtNode(node.methodName);
       return;
     }
 
@@ -81,13 +81,13 @@
           'floor',
           'truncate',
         ].contains(node.methodName.name)) {
-      rule.reportLint(node.methodName);
+      rule.reportAtNode(node.methodName);
       return;
     }
 
     // double.toDouble()
     if (type.isDartCoreDouble && node.methodName.name == 'toDouble') {
-      rule.reportLint(node.methodName);
+      rule.reportAtNode(node.methodName);
       return;
     }
   }
@@ -98,7 +98,7 @@
         expression.realTarget is! SuperExpression &&
         expression.methodName.name == 'toString' &&
         expression.argumentList.arguments.isEmpty) {
-      rule.reportLint(expression.methodName);
+      rule.reportAtNode(expression.methodName);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/null_closures.dart b/pkg/linter/lib/src/rules/null_closures.dart
index de02325..2404cf4 100644
--- a/pkg/linter/lib/src/rules/null_closures.dart
+++ b/pkg/linter/lib/src/rules/null_closures.dart
@@ -268,11 +268,11 @@
       if (arg is NamedExpression) {
         if (arg.expression is NullLiteral &&
             names.contains(arg.name.label.name)) {
-          rule.reportLint(arg);
+          rule.reportAtNode(arg);
         }
       } else {
         if (arg is NullLiteral && positions.contains(i)) {
-          rule.reportLint(arg);
+          rule.reportAtNode(arg);
         }
       }
     }
diff --git a/pkg/linter/lib/src/rules/omit_local_variable_types.dart b/pkg/linter/lib/src/rules/omit_local_variable_types.dart
index ac9463e..95851ea 100644
--- a/pkg/linter/lib/src/rules/omit_local_variable_types.dart
+++ b/pkg/linter/lib/src/rules/omit_local_variable_types.dart
@@ -61,7 +61,7 @@
 
       if (iterableType.typeArguments.isNotEmpty &&
           iterableType.typeArguments.first == staticType) {
-        rule.reportLint(loopVariableType);
+        rule.reportAtNode(loopVariableType);
       }
     }
   }
@@ -93,7 +93,7 @@
         return;
       }
     }
-    rule.reportLint(node.type);
+    rule.reportAtNode(node.type);
   }
 }
 
diff --git a/pkg/linter/lib/src/rules/omit_obvious_local_variable_types.dart b/pkg/linter/lib/src/rules/omit_obvious_local_variable_types.dart
index 733c834..b084d58 100644
--- a/pkg/linter/lib/src/rules/omit_obvious_local_variable_types.dart
+++ b/pkg/linter/lib/src/rules/omit_obvious_local_variable_types.dart
@@ -58,7 +58,7 @@
       }
       var iterableType = iterable.staticType;
       if (iterableType.elementTypeOfIterable == staticType) {
-        rule.reportLint(loopVariableType);
+        rule.reportAtNode(loopVariableType);
       }
     }
   }
@@ -82,6 +82,6 @@
         return;
       }
     }
-    rule.reportLint(node.type);
+    rule.reportAtNode(node.type);
   }
 }
diff --git a/pkg/linter/lib/src/rules/omit_obvious_property_types.dart b/pkg/linter/lib/src/rules/omit_obvious_property_types.dart
index 18f1788..9d3c217 100644
--- a/pkg/linter/lib/src/rules/omit_obvious_property_types.dart
+++ b/pkg/linter/lib/src/rules/omit_obvious_property_types.dart
@@ -63,6 +63,6 @@
         return;
       }
     }
-    rule.reportLint(node.type);
+    rule.reportAtNode(node.type);
   }
 }
diff --git a/pkg/linter/lib/src/rules/only_throw_errors.dart b/pkg/linter/lib/src/rules/only_throw_errors.dart
index 2ed5c6a..c2e944b 100644
--- a/pkg/linter/lib/src/rules/only_throw_errors.dart
+++ b/pkg/linter/lib/src/rules/only_throw_errors.dart
@@ -51,12 +51,12 @@
   @override
   void visitThrowExpression(ThrowExpression node) {
     if (node.expression is Literal) {
-      rule.reportLint(node.expression);
+      rule.reportAtNode(node.expression);
       return;
     }
 
     if (!_isThrowable(node.expression.staticType)) {
-      rule.reportLint(node.expression);
+      rule.reportAtNode(node.expression);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/parameter_assignments.dart b/pkg/linter/lib/src/rules/parameter_assignments.dart
index c9833e7..aa95cda 100644
--- a/pkg/linter/lib/src/rules/parameter_assignments.dart
+++ b/pkg/linter/lib/src/rules/parameter_assignments.dart
@@ -84,7 +84,7 @@
   }
 
   void reportLint(AstNode node) {
-    rule.reportLint(node, arguments: [parameter.name!.lexeme]);
+    rule.reportAtNode(node, arguments: [parameter.name!.lexeme]);
   }
 
   @override
diff --git a/pkg/linter/lib/src/rules/prefer_asserts_with_message.dart b/pkg/linter/lib/src/rules/prefer_asserts_with_message.dart
index 88310bb..11747b0 100644
--- a/pkg/linter/lib/src/rules/prefer_asserts_with_message.dart
+++ b/pkg/linter/lib/src/rules/prefer_asserts_with_message.dart
@@ -35,14 +35,14 @@
   @override
   void visitAssertInitializer(AssertInitializer node) {
     if (node.message == null) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 
   @override
   void visitAssertStatement(AssertStatement node) {
     if (node.message == null) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_collection_literals.dart b/pkg/linter/lib/src/rules/prefer_collection_literals.dart
index 620cdb4..d2cb0b2 100644
--- a/pkg/linter/lib/src/rules/prefer_collection_literals.dart
+++ b/pkg/linter/lib/src/rules/prefer_collection_literals.dart
@@ -53,7 +53,7 @@
     }
     if (node.isMap || node.isHashMap) {
       if (constructorName == null && node.argumentList.arguments.isEmpty) {
-        rule.reportLint(node);
+        rule.reportAtNode(node);
       }
       return;
     }
@@ -69,14 +69,14 @@
       if (constructorName == null) {
         // Allow `LinkedHashSet(equals: (a, b) => false, hashCode: (o) => 13)`.
         if (args.isEmpty) {
-          rule.reportLint(node);
+          rule.reportAtNode(node);
         }
       } else if (constructorName == 'from' || constructorName == 'of') {
         if (args.length != 1) {
           return;
         }
         if (args.first is ListLiteral) {
-          rule.reportLint(node);
+          rule.reportAtNode(node);
         }
       }
     }
@@ -89,7 +89,7 @@
       return;
     }
     if (node.target is ListLiteral) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_conditional_assignment.dart b/pkg/linter/lib/src/rules/prefer_conditional_assignment.dart
index 29bf615..ff9ec1b 100644
--- a/pkg/linter/lib/src/rules/prefer_conditional_assignment.dart
+++ b/pkg/linter/lib/src/rules/prefer_conditional_assignment.dart
@@ -73,7 +73,7 @@
     var expressionInCondition = _getExpressionCondition(node.expression);
     if (expressionInCondition != null &&
         _checkStatement(node.thenStatement, expressionInCondition)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_const_constructors.dart b/pkg/linter/lib/src/rules/prefer_const_constructors.dart
index 39be1a2..ebf4ced 100644
--- a/pkg/linter/lib/src/rules/prefer_const_constructors.dart
+++ b/pkg/linter/lib/src/rules/prefer_const_constructors.dart
@@ -73,7 +73,7 @@
     }
 
     if (node.canBeConst) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_const_declarations.dart b/pkg/linter/lib/src/rules/prefer_const_declarations.dart
index e50e38c..8f9a4f5 100644
--- a/pkg/linter/lib/src/rules/prefer_const_declarations.dart
+++ b/pkg/linter/lib/src/rules/prefer_const_declarations.dart
@@ -59,7 +59,7 @@
               (initializer.beginToken.keyword == Keyword.CONST)) &&
           !hasConstantError(initializer);
     })) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_const_literals_to_create_immutables.dart b/pkg/linter/lib/src/rules/prefer_const_literals_to_create_immutables.dart
index 790f879..75456db 100644
--- a/pkg/linter/lib/src/rules/prefer_const_literals_to_create_immutables.dart
+++ b/pkg/linter/lib/src/rules/prefer_const_literals_to_create_immutables.dart
@@ -67,7 +67,7 @@
     }
 
     if (literal.canBeConst) {
-      rule.reportLint(literal);
+      rule.reportAtNode(literal);
     }
   }
 
diff --git a/pkg/linter/lib/src/rules/prefer_contains.dart b/pkg/linter/lib/src/rules/prefer_contains.dart
index 67e2765..393c48d 100644
--- a/pkg/linter/lib/src/rules/prefer_contains.dart
+++ b/pkg/linter/lib/src/rules/prefer_contains.dart
@@ -77,19 +77,19 @@
           type == TokenType.BANG_EQ ||
           type == TokenType.LT_EQ ||
           type == TokenType.GT) {
-        rule.reportLint(
+        rule.reportAtNode(
           expression,
           errorCode: LinterLintCode.prefer_contains_use_contains,
         );
       } else if (type == TokenType.LT) {
         // indexOf < -1 is always false
-        rule.reportLint(
+        rule.reportAtNode(
           expression,
           errorCode: LinterLintCode.prefer_contains_always_false,
         );
       } else if (type == TokenType.GT_EQ) {
         // indexOf >= -1 is always true
-        rule.reportLint(
+        rule.reportAtNode(
           expression,
           errorCode: LinterLintCode.prefer_contains_always_true,
         );
@@ -98,7 +98,7 @@
       // 'indexOf >= 0' is same as 'contains',
       // and 'indexOf < 0' is same as '!contains'
       if (type == TokenType.GT_EQ || type == TokenType.LT) {
-        rule.reportLint(
+        rule.reportAtNode(
           expression,
           errorCode: LinterLintCode.prefer_contains_use_contains,
         );
@@ -109,14 +109,14 @@
       if (type == TokenType.EQ_EQ ||
           type == TokenType.LT_EQ ||
           type == TokenType.LT) {
-        rule.reportLint(
+        rule.reportAtNode(
           expression,
           errorCode: LinterLintCode.prefer_contains_always_false,
         );
       } else if (type == TokenType.BANG_EQ ||
           type == TokenType.GT_EQ ||
           type == TokenType.GT) {
-        rule.reportLint(
+        rule.reportAtNode(
           expression,
           errorCode: LinterLintCode.prefer_contains_always_true,
         );
diff --git a/pkg/linter/lib/src/rules/prefer_expression_function_bodies.dart b/pkg/linter/lib/src/rules/prefer_expression_function_bodies.dart
index 1a3fae2..d2737d0 100644
--- a/pkg/linter/lib/src/rules/prefer_expression_function_bodies.dart
+++ b/pkg/linter/lib/src/rules/prefer_expression_function_bodies.dart
@@ -44,6 +44,6 @@
     if (uniqueStatement is! ReturnStatement) return;
     if (uniqueStatement.expression == null) return;
 
-    rule.reportLint(node);
+    rule.reportAtNode(node);
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_final_fields.dart b/pkg/linter/lib/src/rules/prefer_final_fields.dart
index 094be40..c0e2ad5 100644
--- a/pkg/linter/lib/src/rules/prefer_final_fields.dart
+++ b/pkg/linter/lib/src/rules/prefer_final_fields.dart
@@ -143,10 +143,10 @@
         );
 
         if (isSetInEveryConstructor) {
-          rule.reportLint(variable, arguments: [variable.name.lexeme]);
+          rule.reportAtNode(variable, arguments: [variable.name.lexeme]);
         }
       } else if (field.hasInitializer) {
-        rule.reportLint(variable, arguments: [variable.name.lexeme]);
+        rule.reportAtNode(variable, arguments: [variable.name.lexeme]);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/prefer_final_in_for_each.dart b/pkg/linter/lib/src/rules/prefer_final_in_for_each.dart
index f31ca82..bf7bdf3 100644
--- a/pkg/linter/lib/src/rules/prefer_final_in_for_each.dart
+++ b/pkg/linter/lib/src/rules/prefer_final_in_for_each.dart
@@ -69,21 +69,21 @@
     var pattern = node.pattern;
     if (pattern is RecordPattern) {
       if (!function.potentiallyMutatesAnyField(pattern.fields)) {
-        rule.reportLint(
+        rule.reportAtNode(
           pattern,
           errorCode: LinterLintCode.prefer_final_in_for_each_pattern,
         );
       }
     } else if (pattern is ObjectPattern) {
       if (!function.potentiallyMutatesAnyField(pattern.fields)) {
-        rule.reportLint(
+        rule.reportAtNode(
           pattern,
           errorCode: LinterLintCode.prefer_final_in_for_each_pattern,
         );
       }
     } else if (pattern is ListPattern) {
       if (!pattern.elements.any((e) => function.potentiallyMutates(e))) {
-        rule.reportLint(
+        rule.reportAtNode(
           pattern,
           errorCode: LinterLintCode.prefer_final_in_for_each_pattern,
         );
@@ -92,7 +92,7 @@
       if (!pattern.elements.any(
         (e) => e is! MapPatternEntry || function.potentiallyMutates(e.value),
       )) {
-        rule.reportLint(
+        rule.reportAtNode(
           pattern,
           errorCode: LinterLintCode.prefer_final_in_for_each_pattern,
         );
diff --git a/pkg/linter/lib/src/rules/prefer_final_locals.dart b/pkg/linter/lib/src/rules/prefer_final_locals.dart
index 21433f4..f178899 100644
--- a/pkg/linter/lib/src/rules/prefer_final_locals.dart
+++ b/pkg/linter/lib/src/rules/prefer_final_locals.dart
@@ -76,7 +76,7 @@
     var inCaseClause = node.thisOrAncestorOfType<CaseClause>() != null;
     if (inCaseClause) {
       if (!isPotentiallyMutated(node, function)) {
-        rule.reportLint(node);
+        rule.reportAtNode(node);
       }
     } else {
       var forEachPattern = node.thisOrAncestorOfType<ForEachPartsWithPattern>();
@@ -92,7 +92,7 @@
     }
 
     if (!inCaseClause) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 
@@ -108,7 +108,7 @@
 
     if (inCaseClause) {
       if (!isPotentiallyMutated(node, function)) {
-        rule.reportLint(node);
+        rule.reportAtNode(node);
       }
     } else {
       if (!node.hasPotentiallyMutatedDeclaredVariableInScope(function)) {
@@ -140,7 +140,7 @@
     if (keyword != null) {
       rule.reportAtToken(keyword);
     } else if (node.type != null) {
-      rule.reportLint(node.type);
+      rule.reportAtNode(node.type);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_final_parameters.dart b/pkg/linter/lib/src/rules/prefer_final_parameters.dart
index ddf41d3..8a85e37 100644
--- a/pkg/linter/lib/src/rules/prefer_final_parameters.dart
+++ b/pkg/linter/lib/src/rules/prefer_final_parameters.dart
@@ -79,7 +79,7 @@
             !declaredElement.isInitializingFormal &&
             !declaredElement.isWildcardVariable &&
             !body.isPotentiallyMutatedInScope2(declaredElement)) {
-          rule.reportLint(param, arguments: [param.name!.lexeme]);
+          rule.reportAtNode(param, arguments: [param.name!.lexeme]);
         }
       }
     }
diff --git a/pkg/linter/lib/src/rules/prefer_for_elements_to_map_fromIterable.dart b/pkg/linter/lib/src/rules/prefer_for_elements_to_map_fromIterable.dart
index 09cf01a..cd91534 100644
--- a/pkg/linter/lib/src/rules/prefer_for_elements_to_map_fromIterable.dart
+++ b/pkg/linter/lib/src/rules/prefer_for_elements_to_map_fromIterable.dart
@@ -67,7 +67,7 @@
       return;
     }
 
-    rule.reportLint(creation);
+    rule.reportAtNode(creation);
   }
 
   FunctionExpression? _extractClosure(String name, Expression argument) {
diff --git a/pkg/linter/lib/src/rules/prefer_foreach.dart b/pkg/linter/lib/src/rules/prefer_foreach.dart
index 9ad5162..5b680e8 100644
--- a/pkg/linter/lib/src/rules/prefer_foreach.dart
+++ b/pkg/linter/lib/src/rules/prefer_foreach.dart
@@ -63,7 +63,7 @@
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     var arguments = node.argumentList.arguments;
     if (arguments.length == 1 && arguments.first.canonicalElement == element) {
-      rule.reportLint(forEachStatement);
+      rule.reportAtNode(forEachStatement);
     }
   }
 
@@ -74,7 +74,7 @@
     if (arguments.length == 1 &&
         arguments.first.canonicalElement == element &&
         (target == null || !_ReferenceFinder(element).references(target))) {
-      rule.reportLint(forEachStatement);
+      rule.reportAtNode(forEachStatement);
     }
   }
 
diff --git a/pkg/linter/lib/src/rules/prefer_function_declarations_over_variables.dart b/pkg/linter/lib/src/rules/prefer_function_declarations_over_variables.dart
index a9e55ec..e480cb6 100644
--- a/pkg/linter/lib/src/rules/prefer_function_declarations_over_variables.dart
+++ b/pkg/linter/lib/src/rules/prefer_function_declarations_over_variables.dart
@@ -44,13 +44,13 @@
         // definition for a field or a top-level variable, which should only
         // be reported if final.
         if (node.isFinal) {
-          rule.reportLint(node);
+          rule.reportAtNode(node);
         }
       } else {
         var declaredElement = node.declaredElement2;
         if (declaredElement != null &&
             !function.isPotentiallyMutatedInScope2(declaredElement)) {
-          rule.reportLint(node);
+          rule.reportAtNode(node);
         }
       }
     }
diff --git a/pkg/linter/lib/src/rules/prefer_if_elements_to_conditional_expressions.dart b/pkg/linter/lib/src/rules/prefer_if_elements_to_conditional_expressions.dart
index 46a361c..adbce3b 100644
--- a/pkg/linter/lib/src/rules/prefer_if_elements_to_conditional_expressions.dart
+++ b/pkg/linter/lib/src/rules/prefer_if_elements_to_conditional_expressions.dart
@@ -44,7 +44,7 @@
       parent = parent.parent;
     }
     if (parent is ListLiteral || (parent is SetOrMapLiteral && parent.isSet)) {
-      rule.reportLint(nodeToReplace);
+      rule.reportAtNode(nodeToReplace);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_if_null_operators.dart b/pkg/linter/lib/src/rules/prefer_if_null_operators.dart
index f1b0798..185f779 100644
--- a/pkg/linter/lib/src/rules/prefer_if_null_operators.dart
+++ b/pkg/linter/lib/src/rules/prefer_if_null_operators.dart
@@ -53,7 +53,7 @@
               ? node.elseExpression
               : node.thenExpression;
       if (exp.toString() == expression.toString()) {
-        rule.reportLint(node);
+        rule.reportAtNode(node);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/prefer_initializing_formals.dart b/pkg/linter/lib/src/rules/prefer_initializing_formals.dart
index 467ca55..d49ce73 100644
--- a/pkg/linter/lib/src/rules/prefer_initializing_formals.dart
+++ b/pkg/linter/lib/src/rules/prefer_initializing_formals.dart
@@ -146,14 +146,14 @@
     for (var assignment in assignments) {
       if (isAssignmentExpressionToLint(assignment)) {
         var rightElement = _getRightElement(assignment)!;
-        rule.reportLint(assignment, arguments: [rightElement.displayName]);
+        rule.reportAtNode(assignment, arguments: [rightElement.displayName]);
       }
     }
 
     for (var initializer in initializers) {
       if (isConstructorFieldInitializerToLint(initializer)) {
         var name = initializer.fieldName.element!.name3!;
-        rule.reportLint(initializer, arguments: [name]);
+        rule.reportAtNode(initializer, arguments: [name]);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/prefer_inlined_adds.dart b/pkg/linter/lib/src/rules/prefer_inlined_adds.dart
index 78205a1..687f576 100644
--- a/pkg/linter/lib/src/rules/prefer_inlined_adds.dart
+++ b/pkg/linter/lib/src/rules/prefer_inlined_adds.dart
@@ -57,7 +57,7 @@
       return;
     }
 
-    rule.reportLint(
+    rule.reportAtNode(
       invocation.methodName,
       errorCode:
           addAll
diff --git a/pkg/linter/lib/src/rules/prefer_int_literals.dart b/pkg/linter/lib/src/rules/prefer_int_literals.dart
index 4154784..d085e3f 100644
--- a/pkg/linter/lib/src/rules/prefer_int_literals.dart
+++ b/pkg/linter/lib/src/rules/prefer_int_literals.dart
@@ -99,7 +99,7 @@
 
     // Ensure that replacing the double would not change the semantics
     if (canReplaceWithIntLiteral(node)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 
diff --git a/pkg/linter/lib/src/rules/prefer_is_empty.dart b/pkg/linter/lib/src/rules/prefer_is_empty.dart
index f66cfbb..063d912 100644
--- a/pkg/linter/lib/src/rules/prefer_is_empty.dart
+++ b/pkg/linter/lib/src/rules/prefer_is_empty.dart
@@ -89,23 +89,23 @@
     if (value == 0) {
       if (operator.type == TokenType.EQ_EQ ||
           operator.type == TokenType.LT_EQ) {
-        rule.reportLint(
+        rule.reportAtNode(
           expression,
           errorCode: LinterLintCode.prefer_is_empty_use_is_empty,
         );
       } else if (operator.type == TokenType.GT ||
           operator.type == TokenType.BANG_EQ) {
-        rule.reportLint(
+        rule.reportAtNode(
           expression,
           errorCode: LinterLintCode.prefer_is_empty_use_is_not_empty,
         );
       } else if (operator.type == TokenType.LT) {
-        rule.reportLint(
+        rule.reportAtNode(
           expression,
           errorCode: LinterLintCode.prefer_is_empty_always_false,
         );
       } else if (operator.type == TokenType.GT_EQ) {
-        rule.reportLint(
+        rule.reportAtNode(
           expression,
           errorCode: LinterLintCode.prefer_is_empty_always_true,
         );
@@ -115,12 +115,12 @@
         // 'length >= 1' is same as 'isNotEmpty',
         // and 'length < 1' is same as 'isEmpty'
         if (operator.type == TokenType.GT_EQ) {
-          rule.reportLint(
+          rule.reportAtNode(
             expression,
             errorCode: LinterLintCode.prefer_is_empty_use_is_not_empty,
           );
         } else if (operator.type == TokenType.LT) {
-          rule.reportLint(
+          rule.reportAtNode(
             expression,
             errorCode: LinterLintCode.prefer_is_empty_use_is_empty,
           );
@@ -129,12 +129,12 @@
         // '1 <= length' is same as 'isNotEmpty',
         // and '1 > length' is same as 'isEmpty'
         if (operator.type == TokenType.LT_EQ) {
-          rule.reportLint(
+          rule.reportAtNode(
             expression,
             errorCode: LinterLintCode.prefer_is_empty_use_is_not_empty,
           );
         } else if (operator.type == TokenType.GT) {
-          rule.reportLint(
+          rule.reportAtNode(
             expression,
             errorCode: LinterLintCode.prefer_is_empty_use_is_empty,
           );
@@ -146,14 +146,14 @@
         if (operator.type == TokenType.EQ_EQ ||
             operator.type == TokenType.LT_EQ ||
             operator.type == TokenType.LT) {
-          rule.reportLint(
+          rule.reportAtNode(
             expression,
             errorCode: LinterLintCode.prefer_is_empty_always_false,
           );
         } else if (operator.type == TokenType.BANG_EQ ||
             operator.type == TokenType.GT_EQ ||
             operator.type == TokenType.GT) {
-          rule.reportLint(
+          rule.reportAtNode(
             expression,
             errorCode: LinterLintCode.prefer_is_empty_always_true,
           );
@@ -163,14 +163,14 @@
         if (operator.type == TokenType.EQ_EQ ||
             operator.type == TokenType.GT_EQ ||
             operator.type == TokenType.GT) {
-          rule.reportLint(
+          rule.reportAtNode(
             expression,
             errorCode: LinterLintCode.prefer_is_empty_always_false,
           );
         } else if (operator.type == TokenType.BANG_EQ ||
             operator.type == TokenType.LT_EQ ||
             operator.type == TokenType.LT) {
-          rule.reportLint(
+          rule.reportAtNode(
             expression,
             errorCode: LinterLintCode.prefer_is_empty_always_true,
           );
diff --git a/pkg/linter/lib/src/rules/prefer_is_not_empty.dart b/pkg/linter/lib/src/rules/prefer_is_not_empty.dart
index fb6a73e..3422421 100644
--- a/pkg/linter/lib/src/rules/prefer_is_not_empty.dart
+++ b/pkg/linter/lib/src/rules/prefer_is_not_empty.dart
@@ -68,6 +68,6 @@
       return;
     }
 
-    rule.reportLint(node);
+    rule.reportAtNode(node);
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_is_not_operator.dart b/pkg/linter/lib/src/rules/prefer_is_not_operator.dart
index 3fe39fb..91cdb03 100644
--- a/pkg/linter/lib/src/rules/prefer_is_not_operator.dart
+++ b/pkg/linter/lib/src/rules/prefer_is_not_operator.dart
@@ -46,7 +46,7 @@
       // Check for NOT (!) operator
       if (prefixExpression is PrefixExpression &&
           prefixExpression.operator.type == TokenType.BANG) {
-        rule.reportLint(prefixExpression);
+        rule.reportAtNode(prefixExpression);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/prefer_iterable_whereType.dart b/pkg/linter/lib/src/rules/prefer_iterable_whereType.dart
index 1b700a6..5910c08 100644
--- a/pkg/linter/lib/src/rules/prefer_iterable_whereType.dart
+++ b/pkg/linter/lib/src/rules/prefer_iterable_whereType.dart
@@ -66,7 +66,7 @@
         var target = expression.expression;
         if (target is SimpleIdentifier &&
             target.name == arg.parameters?.parameters.first.name?.lexeme) {
-          rule.reportLint(node.methodName);
+          rule.reportAtNode(node.methodName);
         }
       }
     }
diff --git a/pkg/linter/lib/src/rules/prefer_null_aware_method_calls.dart b/pkg/linter/lib/src/rules/prefer_null_aware_method_calls.dart
index c2ea3b3..e99f1e6 100644
--- a/pkg/linter/lib/src/rules/prefer_null_aware_method_calls.dart
+++ b/pkg/linter/lib/src/rules/prefer_null_aware_method_calls.dart
@@ -70,7 +70,7 @@
       if (target is PostfixExpression &&
           target.operator.type == TokenType.BANG &&
           target.operand.toSource() == condition.leftOperand.toSource()) {
-        rule.reportLint(expression);
+        rule.reportAtNode(expression);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/prefer_null_aware_operators.dart b/pkg/linter/lib/src/rules/prefer_null_aware_operators.dart
index ea5a9faf..b070a15 100644
--- a/pkg/linter/lib/src/rules/prefer_null_aware_operators.dart
+++ b/pkg/linter/lib/src/rules/prefer_null_aware_operators.dart
@@ -75,7 +75,7 @@
         _ => null,
       };
       if (resultExpression.toString() == conditionText) {
-        rule.reportLint(node);
+        rule.reportAtNode(node);
         return;
       }
     }
diff --git a/pkg/linter/lib/src/rules/prefer_relative_imports.dart b/pkg/linter/lib/src/rules/prefer_relative_imports.dart
index 5f59ffe..2561b57 100644
--- a/pkg/linter/lib/src/rules/prefer_relative_imports.dart
+++ b/pkg/linter/lib/src/rules/prefer_relative_imports.dart
@@ -66,7 +66,7 @@
   @override
   void visitImportDirective(ImportDirective node) {
     if (isPackageSelfReference(node)) {
-      rule.reportLint(node.uri);
+      rule.reportAtNode(node.uri);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_single_quotes.dart b/pkg/linter/lib/src/rules/prefer_single_quotes.dart
index 84555a5..5e8eb18 100644
--- a/pkg/linter/lib/src/rules/prefer_single_quotes.dart
+++ b/pkg/linter/lib/src/rules/prefer_single_quotes.dart
@@ -81,7 +81,7 @@
 
     // Bail out on "strings ${x ? 'containing' : 'other'} strings"
     if (!containsString(node) && !isNestedString(node)) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_spread_collections.dart b/pkg/linter/lib/src/rules/prefer_spread_collections.dart
index da4b88e..81890bf 100644
--- a/pkg/linter/lib/src/rules/prefer_spread_collections.dart
+++ b/pkg/linter/lib/src/rules/prefer_spread_collections.dart
@@ -55,6 +55,6 @@
       return;
     }
 
-    rule.reportLint(invocation.methodName);
+    rule.reportAtNode(invocation.methodName);
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_typing_uninitialized_variables.dart b/pkg/linter/lib/src/rules/prefer_typing_uninitialized_variables.dart
index 83f003e..a66c86a 100644
--- a/pkg/linter/lib/src/rules/prefer_typing_uninitialized_variables.dart
+++ b/pkg/linter/lib/src/rules/prefer_typing_uninitialized_variables.dart
@@ -49,7 +49,7 @@
                 ? LinterLintCode.prefer_typing_uninitialized_variables_for_field
                 : LinterLintCode
                     .prefer_typing_uninitialized_variables_for_local_variable;
-        rule.reportLint(v, errorCode: code);
+        rule.reportAtNode(v, errorCode: code);
       }
     }
   }
diff --git a/pkg/linter/lib/src/rules/provide_deprecation_message.dart b/pkg/linter/lib/src/rules/provide_deprecation_message.dart
index cf5aa24..ec6103c 100644
--- a/pkg/linter/lib/src/rules/provide_deprecation_message.dart
+++ b/pkg/linter/lib/src/rules/provide_deprecation_message.dart
@@ -37,7 +37,7 @@
     if (elementAnnotation != null &&
         elementAnnotation.isDeprecated &&
         node.arguments == null) {
-      rule.reportLint(node);
+      rule.reportAtNode(node);
     }
   }
 }