blob: e9801a90a6a1ea002fdf40dd5be0e68ab1e415d7 [file] [log] [blame]
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/analysis/utilities.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/src/test_utilities/find_node.dart';
import 'package:analyzer_utilities/testing/tree_string_sink.dart';
import 'package:test/test.dart';
import '../../generated/test_support.dart';
import '../../util/element_printer.dart';
import '../../util/feature_sets.dart';
import '../dart/resolution/node_text_expectations.dart';
import '../summary/resolved_ast_printer.dart';
class ParserDiagnosticsTest {
// TODO(scheglov): Enable [withCheckingLinking] everywhere.
void assertParsedNodeText(
AstNode node,
String expected, {
bool withCheckingLinking = false,
bool withOffsets = false,
}) {
var actual = _parsedNodeText(
node,
withCheckingLinking: withCheckingLinking,
withOffsets: withOffsets,
);
if (actual != expected) {
print(actual);
NodeTextExpectationsCollector.add(actual);
}
expect(actual, expected);
}
ExpectedError error(
ErrorCode code,
int offset,
int length, {
Pattern? correctionContains,
String? text,
List<Pattern> messageContains = const [],
List<ExpectedContextMessage> contextMessages = const [],
}) {
return ExpectedError(
code,
offset,
length,
correctionContains: correctionContains,
message: text,
messageContains: messageContains,
expectedContextMessages: contextMessages,
);
}
ParseStringResult parseStringWithErrors(String content) {
return parseString(
content: content,
featureSet: FeatureSets.latestWithExperiments,
throwIfDiagnostics: false,
);
}
String _parsedNodeText(
AstNode node, {
required bool withCheckingLinking,
required bool withOffsets,
}) {
var buffer = StringBuffer();
var sink = TreeStringSink(
sink: buffer,
indent: '',
);
var elementPrinter = ElementPrinter(
sink: sink,
configuration: ElementPrinterConfiguration(),
);
node.accept(
ResolvedAstPrinter(
sink: sink,
elementPrinter: elementPrinter,
configuration: ResolvedNodeTextConfiguration()
..withCheckingLinking = withCheckingLinking,
withResolution: false,
withOffsets: withOffsets,
),
);
return buffer.toString();
}
}
extension ParseStringResultExtension on ParseStringResult {
FindNode get findNode {
return FindNode(content, unit);
}
void assertErrors(List<ExpectedError> expectedErrors) {
var errorListener = GatheringErrorListener();
errorListener.addAll(errors);
errorListener.assertErrors(expectedErrors);
}
void assertNoErrors() {
assertErrors(const []);
}
}