Files
sdk/pkg/front_end/tool/analyze.dart
T
Johnni Winther 6bf48988c8 [cfe] Add test for type arguments on map().toList()
This updates the analysis helpers to add a test for the `map().toList()`
problem addressed in https://dart-review.googlesource.com/c/sdk/+/241605

Included in the CL is the addition of the 'analyze.dart' tools, which
can be used for advanced code searches. This was used to find the
occurences of `map().toList()`.

Change-Id: I6e9da282e37fde4534ed5e308260f092779d0750
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/241744
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
2022-04-20 12:28:18 +00:00

34 lines
1.4 KiB
Dart

// Copyright (c) 2022, 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:front_end/src/testing/analysis_helper.dart';
import 'package:kernel/kernel.dart';
Future<void> main(List<String> arguments) async {
await runAnalysis(
cfeAndBackendsEntryPoints,
performGeneralAnalysis(cfeAndBackends,
(TreeNode node, AnalysisInterface interface) {
// Use 'analyze.dart' to perform advanced analysis/code search by
// replacing the "example analysis" with a custom analysis.
// Example analysis:
if (node is InstanceInvocation && node.name.text == 'toList') {
TreeNode receiver = node.receiver;
if (receiver is InstanceInvocation &&
receiver.name.text == 'map' &&
receiver.arguments.types.length == 1) {
InterfaceType expressionType = interface.createInterfaceType(
'Expression',
uri: 'package:kernel/ast.dart');
DartType typeArgument = receiver.arguments.types.single;
if (interface.isSubtypeOf(typeArgument, expressionType) &&
typeArgument != expressionType) {
interface.reportMessage(node, "map().toList()");
}
}
}
}));
}