[messages] Use literate diagnostic reporting for data driven fixes.

Changes the code that parses the YAML description of data driven fixes
so that it reports errors using the literate diagnostic reporting API.

Change-Id: I6a6a6964e8f78eb5fd313e3ee5b84d1b6cdac10d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/481180
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Paul Berry
2026-02-17 13:57:10 -08:00
committed by Commit Queue
parent 89859e5fa7
commit 9bfc687c22
4 changed files with 109 additions and 106 deletions
+40 -37
View File
@@ -83,9 +83,9 @@ invalidChangeForKind = DiagnosticWithArguments(
);
/// Parameters:
/// Object p0: the character that is invalid
/// String text: the character that is invalid
const DiagnosticWithArguments<
LocatableDiagnostic Function({required Object p0})
LocatableDiagnostic Function({required String text})
>
invalidCharacter = DiagnosticWithArguments(
name: 'invalid_character',
@@ -93,7 +93,7 @@ invalidCharacter = DiagnosticWithArguments(
type: DiagnosticType.COMPILE_TIME_ERROR,
uniqueName: 'invalid_character',
withArguments: _withArgumentsInvalidCharacter,
expectedTypes: [ExpectedType.object],
expectedTypes: [ExpectedType.string],
);
/// Parameters:
@@ -217,9 +217,9 @@ const DiagnosticWithoutArguments missingTemplateEnd =
);
/// Parameters:
/// Object p0: a description of the expected kinds of tokens
/// String validKinds: a description of the expected kinds of tokens
const DiagnosticWithArguments<
LocatableDiagnostic Function({required Object p0})
LocatableDiagnostic Function({required String validKinds})
>
missingToken = DiagnosticWithArguments(
name: 'missing_token',
@@ -227,7 +227,7 @@ missingToken = DiagnosticWithArguments(
type: DiagnosticType.COMPILE_TIME_ERROR,
uniqueName: 'missing_token',
withArguments: _withArgumentsMissingToken,
expectedTypes: [ExpectedType.object],
expectedTypes: [ExpectedType.string],
);
/// No parameters.
@@ -240,9 +240,9 @@ const DiagnosticWithoutArguments missingUri = DiagnosticWithoutArgumentsImpl(
);
/// Parameters:
/// Object p0: the missing key
/// String key: the missing key
const DiagnosticWithArguments<
LocatableDiagnostic Function({required Object p0})
LocatableDiagnostic Function({required String key})
>
undefinedVariable = DiagnosticWithArguments(
name: 'undefined_variable',
@@ -250,13 +250,13 @@ undefinedVariable = DiagnosticWithArguments(
type: DiagnosticType.COMPILE_TIME_ERROR,
uniqueName: 'undefined_variable',
withArguments: _withArgumentsUndefinedVariable,
expectedTypes: [ExpectedType.object],
expectedTypes: [ExpectedType.string],
);
/// Parameters:
/// Object p0: the token that was unexpectedly found
/// String tokenKind: the token that was unexpectedly found
const DiagnosticWithArguments<
LocatableDiagnostic Function({required Object p0})
LocatableDiagnostic Function({required String tokenKind})
>
unexpectedTransformSetToken = DiagnosticWithArguments(
name: 'unexpected_transform_set_token',
@@ -264,13 +264,13 @@ unexpectedTransformSetToken = DiagnosticWithArguments(
type: DiagnosticType.COMPILE_TIME_ERROR,
uniqueName: 'unexpected_transform_set_token',
withArguments: _withArgumentsUnexpectedTransformSetToken,
expectedTypes: [ExpectedType.object],
expectedTypes: [ExpectedType.string],
);
/// Parameters:
/// Object p0: a description of the expected kind of token
/// String accessor: a description of the expected kind of token
const DiagnosticWithArguments<
LocatableDiagnostic Function({required Object p0})
LocatableDiagnostic Function({required String accessor})
>
unknownAccessor = DiagnosticWithArguments(
name: 'unknown_accessor',
@@ -278,7 +278,7 @@ unknownAccessor = DiagnosticWithArguments(
type: DiagnosticType.COMPILE_TIME_ERROR,
uniqueName: 'unknown_accessor',
withArguments: _withArgumentsUnknownAccessor,
expectedTypes: [ExpectedType.object],
expectedTypes: [ExpectedType.string],
);
/// Parameters:
@@ -318,10 +318,13 @@ const DiagnosticWithoutArguments unsupportedVersion =
);
/// Parameters:
/// Object p0: a description of the expected kind of token
/// Object p1: a description of the actual kind of token
/// String validKinds: a description of the expected kind of token
/// String actualKind: a description of the actual kind of token
const DiagnosticWithArguments<
LocatableDiagnostic Function({required Object p0, required Object p1})
LocatableDiagnostic Function({
required String validKinds,
required String actualKind,
})
>
wrongToken = DiagnosticWithArguments(
name: 'wrong_token',
@@ -329,13 +332,13 @@ wrongToken = DiagnosticWithArguments(
type: DiagnosticType.COMPILE_TIME_ERROR,
uniqueName: 'wrong_token',
withArguments: _withArgumentsWrongToken,
expectedTypes: [ExpectedType.object, ExpectedType.object],
expectedTypes: [ExpectedType.string, ExpectedType.string],
);
/// Parameters:
/// Object p0: the message produced by the YAML parser
/// String message: the message produced by the YAML parser
const DiagnosticWithArguments<
LocatableDiagnostic Function({required Object p0})
LocatableDiagnostic Function({required String message})
>
yamlSyntaxError = DiagnosticWithArguments(
name: 'yaml_syntax_error',
@@ -343,7 +346,7 @@ yamlSyntaxError = DiagnosticWithArguments(
type: DiagnosticType.COMPILE_TIME_ERROR,
uniqueName: 'yaml_syntax_error',
withArguments: _withArgumentsYamlSyntaxError,
expectedTypes: [ExpectedType.object],
expectedTypes: [ExpectedType.string],
);
LocatableDiagnostic _withArgumentsConflictingKey({
@@ -373,8 +376,8 @@ LocatableDiagnostic _withArgumentsInvalidChangeForKind({
]);
}
LocatableDiagnostic _withArgumentsInvalidCharacter({required Object p0}) {
return LocatableDiagnosticImpl(diag.invalidCharacter, [p0]);
LocatableDiagnostic _withArgumentsInvalidCharacter({required String text}) {
return LocatableDiagnosticImpl(diag.invalidCharacter, [text]);
}
LocatableDiagnostic _withArgumentsInvalidKey({required String keyType}) {
@@ -416,22 +419,22 @@ LocatableDiagnostic _withArgumentsMissingOneOfMultipleKeys({
return LocatableDiagnosticImpl(diag.missingOneOfMultipleKeys, [validKeys]);
}
LocatableDiagnostic _withArgumentsMissingToken({required Object p0}) {
return LocatableDiagnosticImpl(diag.missingToken, [p0]);
LocatableDiagnostic _withArgumentsMissingToken({required String validKinds}) {
return LocatableDiagnosticImpl(diag.missingToken, [validKinds]);
}
LocatableDiagnostic _withArgumentsUndefinedVariable({required Object p0}) {
return LocatableDiagnosticImpl(diag.undefinedVariable, [p0]);
LocatableDiagnostic _withArgumentsUndefinedVariable({required String key}) {
return LocatableDiagnosticImpl(diag.undefinedVariable, [key]);
}
LocatableDiagnostic _withArgumentsUnexpectedTransformSetToken({
required Object p0,
required String tokenKind,
}) {
return LocatableDiagnosticImpl(diag.unexpectedTransformSetToken, [p0]);
return LocatableDiagnosticImpl(diag.unexpectedTransformSetToken, [tokenKind]);
}
LocatableDiagnostic _withArgumentsUnknownAccessor({required Object p0}) {
return LocatableDiagnosticImpl(diag.unknownAccessor, [p0]);
LocatableDiagnostic _withArgumentsUnknownAccessor({required String accessor}) {
return LocatableDiagnosticImpl(diag.unknownAccessor, [accessor]);
}
LocatableDiagnostic _withArgumentsUnsupportedKey({required String key}) {
@@ -439,12 +442,12 @@ LocatableDiagnostic _withArgumentsUnsupportedKey({required String key}) {
}
LocatableDiagnostic _withArgumentsWrongToken({
required Object p0,
required Object p1,
required String validKinds,
required String actualKind,
}) {
return LocatableDiagnosticImpl(diag.wrongToken, [p0, p1]);
return LocatableDiagnosticImpl(diag.wrongToken, [validKinds, actualKind]);
}
LocatableDiagnostic _withArgumentsYamlSyntaxError({required Object p0}) {
return LocatableDiagnosticImpl(diag.yamlSyntaxError, [p0]);
LocatableDiagnostic _withArgumentsYamlSyntaxError({required String message}) {
return LocatableDiagnosticImpl(diag.yamlSyntaxError, [message]);
}
@@ -7,7 +7,7 @@ import 'package:analysis_server/src/services/correction/fix/data_driven/accessor
import 'package:analysis_server/src/services/correction/fix/data_driven/expression.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/variable_scope.dart';
import 'package:analysis_server/src/services/refactoring/framework/formal_parameter.dart';
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/src/error/listener.dart';
import 'package:analyzer/src/utilities/extensions/string.dart';
// Several "report" functions intentionally return a `Null`-typed value.
@@ -83,11 +83,13 @@ class CodeFragmentParser {
}
accessors.add(accessor);
} else {
diagnosticReporter.atOffset(
offset: token.offset + delta,
length: token.length,
diagnosticCode: diag.wrongToken,
arguments: ['.', token.kind.displayName],
diagnosticReporter.report(
diag.wrongToken
.withArguments(
validKinds: '.',
actualKind: token.kind.displayName,
)
.atOffset(offset: token.offset + delta, length: token.length),
);
return null;
}
@@ -116,11 +118,10 @@ class CodeFragmentParser {
var expression = _parseLogicalAndExpression();
if (currentIndex < _tokens.length) {
var token = _tokens[currentIndex];
diagnosticReporter.atOffset(
offset: token.offset + delta,
length: token.length,
diagnosticCode: diag.unexpectedTransformSetToken,
arguments: [token.kind.displayName],
diagnosticReporter.report(
diag.unexpectedTransformSetToken
.withArguments(tokenKind: token.kind.displayName)
.atOffset(offset: token.offset + delta, length: token.length),
);
return null;
}
@@ -154,20 +155,21 @@ class CodeFragmentParser {
offset = last.offset;
length = last.length;
}
diagnosticReporter.atOffset(
offset: offset + delta,
length: length,
diagnosticCode: diag.missingToken,
arguments: [validKindsDisplayString()],
diagnosticReporter.report(
diag.missingToken
.withArguments(validKinds: validKindsDisplayString())
.atOffset(offset: offset + delta, length: length),
);
return null;
}
if (!validKinds.contains(token.kind)) {
diagnosticReporter.atOffset(
offset: token.offset + delta,
length: token.length,
diagnosticCode: diag.wrongToken,
arguments: [validKindsDisplayString(), token.kind.displayName],
diagnosticReporter.report(
diag.wrongToken
.withArguments(
validKinds: validKindsDisplayString(),
actualKind: token.kind.displayName,
)
.atOffset(offset: token.offset + delta, length: token.length),
);
return null;
}
@@ -236,11 +238,10 @@ class CodeFragmentParser {
advance();
return TypeArgumentAccessor(argumentIndex);
} else {
diagnosticReporter.atOffset(
offset: token.offset + delta,
length: token.length,
diagnosticCode: diag.unknownAccessor,
arguments: [identifier],
diagnosticReporter.report(
diag.unknownAccessor
.withArguments(accessor: identifier)
.atOffset(offset: token.offset + delta, length: token.length),
);
return null;
}
@@ -317,11 +318,10 @@ class CodeFragmentParser {
var variableName = token.lexeme;
var generator = variableScope.lookup(variableName);
if (generator == null) {
diagnosticReporter.atOffset(
offset: token.offset + delta,
length: token.length,
diagnosticCode: diag.undefinedVariable,
arguments: [variableName],
diagnosticReporter.report(
diag.undefinedVariable
.withArguments(key: variableName)
.atOffset(offset: token.offset + delta, length: token.length),
);
return null;
}
@@ -348,10 +348,8 @@ class CodeFragmentParser {
offset = token.offset + delta;
length = token.length;
}
diagnosticReporter.atOffset(
offset: offset,
length: length,
diagnosticCode: diag.expectedPrimary,
diagnosticReporter.report(
diag.expectedPrimary.atOffset(offset: offset, length: length),
);
return null;
}
@@ -475,11 +473,10 @@ class _CodeFragmentScanner {
/// Report the presence of an invalid character at the given [offset].
Null _reportInvalidCharacter(int offset) {
_diagnosticReporter.atOffset(
offset: offset + delta,
length: 1,
diagnosticCode: diag.invalidCharacter,
arguments: [content.substring(offset, offset + 1)],
_diagnosticReporter.report(
diag.invalidCharacter
.withArguments(text: content.substring(offset, offset + 1))
.atOffset(offset: offset + delta, length: 1),
);
return null;
}
@@ -210,10 +210,11 @@ class TransformSetParser {
}
var endIndex = template.indexOf(_closeComponent, variableStart + 2);
if (endIndex < 0) {
_diagnosticReporter.atOffset(
offset: templateOffset + variableStart,
length: 2,
diagnosticCode: diag.missingTemplateEnd,
_diagnosticReporter.report(
diag.missingTemplateEnd.atOffset(
offset: templateOffset + variableStart,
length: 2,
),
);
// Ignore the invalid component, treating it as if it extended to the
// end of the template.
@@ -222,11 +223,14 @@ class TransformSetParser {
var name = template.substring(variableStart + 2, endIndex).trim();
var generator = variableScope.lookup(name);
if (generator == null) {
_diagnosticReporter.atOffset(
offset: templateOffset + template.indexOf(name, variableStart),
length: name.length,
diagnosticCode: diag.undefinedVariable,
arguments: [name],
_diagnosticReporter.report(
diag.undefinedVariable
.withArguments(key: name)
.atOffset(
offset:
templateOffset + template.indexOf(name, variableStart),
length: name.length,
),
);
// Ignore the invalid component.
} else {
@@ -276,11 +280,10 @@ class TransformSetParser {
var span = e.span;
var offset = span?.start.offset ?? 0;
var length = span?.length ?? 0;
_diagnosticReporter.atOffset(
offset: offset,
length: length,
diagnosticCode: diag.yamlSyntaxError,
arguments: [e.message],
_diagnosticReporter.report(
diag.yamlSyntaxError
.withArguments(message: e.message)
.atOffset(offset: offset, length: length),
);
}
return null;
+15 -15
View File
@@ -41,8 +41,8 @@ TransformSetErrorCode:
invalidCharacter:
type: compileTimeError
parameters:
Object p0: the character that is invalid
problemMessage: "Invalid character '#p0'."
String text: the character that is invalid
problemMessage: "Invalid character '#text'."
hasPublishedDocs: false
invalidKey:
type: compileTimeError
@@ -96,8 +96,8 @@ TransformSetErrorCode:
missingToken:
type: compileTimeError
parameters:
Object p0: a description of the expected kinds of tokens
problemMessage: "Expected to find #p0."
String validKinds: a description of the expected kinds of tokens
problemMessage: "Expected to find #validKinds."
hasPublishedDocs: false
missingUri:
type: compileTimeError
@@ -107,20 +107,20 @@ TransformSetErrorCode:
undefinedVariable:
type: compileTimeError
parameters:
Object p0: the missing key
problemMessage: "The variable '#p0' isn't defined."
String key: the missing key
problemMessage: "The variable '#key' isn't defined."
hasPublishedDocs: false
unexpectedTransformSetToken:
type: compileTimeError
parameters:
Object p0: the token that was unexpectedly found
problemMessage: "Didn't expect to find #p0."
String tokenKind: the token that was unexpectedly found
problemMessage: "Didn't expect to find #tokenKind."
hasPublishedDocs: false
unknownAccessor:
type: compileTimeError
parameters:
Object p0: a description of the expected kind of token
problemMessage: "The accessor '#p0' is invalid."
String accessor: a description of the expected kind of token
problemMessage: "The accessor '#accessor' is invalid."
hasPublishedDocs: false
unsupportedKey:
type: compileTimeError
@@ -141,13 +141,13 @@ TransformSetErrorCode:
wrongToken:
type: compileTimeError
parameters:
Object p0: a description of the expected kind of token
Object p1: a description of the actual kind of token
problemMessage: "Expected to find #p0, but found #p1."
String validKinds: a description of the expected kind of token
String actualKind: a description of the actual kind of token
problemMessage: "Expected to find #validKinds, but found #actualKind."
hasPublishedDocs: false
yamlSyntaxError:
type: compileTimeError
parameters:
Object p0: the message produced by the YAML parser
problemMessage: "Parse error: #p0"
String message: the message produced by the YAML parser
problemMessage: "Parse error: #message"
hasPublishedDocs: false