| // 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.md file. |
| |
| import 'package:kernel/ast.dart'; |
| |
| /// Writes constant coverage for [component] into [buffer}. |
| /// |
| /// Libraries for whose import uri [skipImportUri] returns `true` are skipped. |
| void addConstantCoverageToExpectation(Component component, StringBuffer buffer, |
| {required bool Function(Uri?) skipImportUri}) { |
| bool printedConstantCoverageHeader = false; |
| for (Source source in component.uriToSource.values) { |
| if (skipImportUri(source.importUri)) continue; |
| |
| if (source.constantCoverageConstructors != null && |
| source.constantCoverageConstructors!.isNotEmpty) { |
| if (!printedConstantCoverageHeader) { |
| buffer.writeln(""); |
| buffer.writeln(""); |
| buffer.writeln("Constructor coverage from constants:"); |
| printedConstantCoverageHeader = true; |
| } |
| buffer.writeln("${source.fileUri}:"); |
| for (Reference reference in source.constantCoverageConstructors!) { |
| buffer.writeln( |
| "- ${reference.node} (from ${locationToString(reference)})"); |
| } |
| buffer.writeln(""); |
| } |
| } |
| } |
| |
| /// Computes a string representation of the location of the node from |
| /// [reference]. |
| /// |
| /// References to sdk nodes only include the file uri to avoid unnecessary |
| /// dependency on sdk library sources. |
| String locationToString(Reference reference) { |
| Location? location = reference.node?.location; |
| if (location != null && location.file.isScheme('org-dartlang-sdk')) { |
| // Don't include line/column numbers for sdk libraries to avoid unnecessary |
| // dependency on sdk library sources. |
| return '${location.file}'; |
| } |
| return '$location'; |
| } |