Files
sdk/pkg/front_end/test/find_all_subclasses_tool.dart
Paul Berry d810c7d0c0 [front_end] Bump language version to 3.9 and reformat.
This commit was generated by the following steps:

- Manually change the SDK constraint in `pkg/front_end/pubspec.yaml`

- Run `gclient sync`

- Run `find pkg/front_end/benchmarks pkg/front_end/lib
  pkg/front_end/presubmit_helper.dart
  pkg/front_end/presubmit_helper_spawn.dart pkg/front_end/test
  pkg/front_end/tool -iname '*.dart' | xargs
  tools/sdks/dart-sdk/bin/dart format`

- Manually fix remaining long lines and add dead code ignore comments.

- Fix coverage by running `dart --enable-asserts
  pkg/front_end/test/coverage_suite.dart --tasks=5
  --add-and-remove-comments`

- Fix `pkg/front_end/test/coverage_merger/assert_message_auto_ignored`
  by running `dart pkg/front_end/test/unit_test_suites.dart -p
  pkg/front_end/test/coverage_merger/assert_message_auto_ignored
  -DupdateExpectations=true`

The diff is large because the version bump causes the formatter to
switch into "tall mode".

Change-Id: I6a6a696410da8b168060acfe0e4d6e91e294c4f0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447628
Auto-Submit: Paul Berry <paulberry@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
2025-08-29 07:31:41 -07:00

84 lines
2.6 KiB
Dart

// Copyright (c) 2023, 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 'dart:io';
import 'package:front_end/src/api_prototype/compiler_options.dart';
import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
import 'package:kernel/ast.dart';
import 'incremental_suite.dart' as helper;
import 'utils/io_utils.dart' show computeRepoDirUri;
final Uri repoDir = computeRepoDirUri();
void main() async {
print(await getAllTokens());
}
Future<Set<Class>> getAllTokens() async {
Uri scannerDir = repoDir.resolve("pkg/_fe_analyzer_shared/lib/src/scanner/");
return await findIn(Directory.fromUri(scannerDir), "Token", "/token.dart");
}
/// Compiles either a File or a Directory and finds all subtypes of (including)
/// the specified [className] in a file containing [classFilename].
Future<Set<Class>> findIn(
Directory where,
String className,
String classFilename,
) async {
List<Uri> files = [];
for (FileSystemEntity subEntity in where.listSync(recursive: true)) {
if (subEntity is File) {
if (subEntity.path.toLowerCase().endsWith(".dart")) {
files.add(subEntity.uri);
}
}
}
Class? foundTarget;
Map<Class, Set<Class>> subclassMap = {};
Component component = await compileOutline(files);
for (Library lib in component.libraries) {
for (Class c in lib.classes) {
if (c.name == className && c.fileUri.toString().contains(classFilename)) {
if (foundTarget != null) throw "Found both $foundTarget and $c";
foundTarget = c;
}
for (Supertype s in c.supers) {
(subclassMap[s.classNode] ??= {}).add(c);
}
}
}
if (foundTarget == null) throw "Didn't find '$className' in '$classFilename'";
Set<Class> result = {foundTarget};
List<Class> worklist = [foundTarget];
while (worklist.isNotEmpty) {
Class c = worklist.removeLast();
for (Class child in subclassMap[c] ?? const []) {
if (result.add(child)) {
worklist.add(child);
}
}
}
return result;
}
Future<Component> compileOutline(List<Uri> input) async {
CompilerOptions options = helper.getOptions();
options.omitPlatform = true;
// Give only one input so it automatically finds the packages file.
helper.TestIncrementalCompiler compiler = new helper.TestIncrementalCompiler(
options,
input.first,
null,
true,
);
IncrementalCompilerResult compilerResult = await compiler.computeDelta(
entryPoints: input,
);
return compilerResult.component;
}