| // Copyright (c) 2019, 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:nnbd_migration/src/front_end/migration_info.dart'; |
| import 'package:nnbd_migration/src/front_end/path_mapper.dart'; |
| import 'package:nnbd_migration/src/front_end/resources/resources.g.dart' |
| as resources; |
| import 'package:path/path.dart' as path; |
| |
| String get _dartSdkVersion { |
| var version = Platform.version; |
| |
| // Remove the build date and OS. |
| if (version.contains(' ')) { |
| version = version.substring(0, version.indexOf(' ')); |
| } |
| |
| // Convert a git hash to 8 chars. |
| // '2.8.0-edge.fd992e423ef69ece9f44bd3ac58fa2355b563212' |
| var versionRegExp = RegExp(r'^.*\.([0-9a-f]+)$'); |
| var match = versionRegExp.firstMatch(version); |
| if (match != null && match.group(1)!.length == 40) { |
| var commit = match.group(1)!; |
| version = version.replaceAll(commit, commit.substring(0, 10)); |
| } |
| |
| return version; |
| } |
| |
| String substituteVariables(String content, Map<String, String?> variables) { |
| for (var variable in variables.keys) { |
| var value = variables[variable]!; |
| content = content.replaceAll('{{ $variable }}', value); |
| } |
| |
| return content; |
| } |
| |
| /// Instrumentation display output for a library that was migrated to use |
| /// non-nullable types. |
| class InstrumentationRenderer { |
| /// Information for a whole migration, so that libraries can reference each |
| /// other. |
| final MigrationInfo? migrationInfo; |
| |
| /// Whether the migration has been applied already or not. |
| final bool hasBeenApplied; |
| |
| /// Whether the migration needs to be rerun due to disk changes. |
| final bool needsRerun; |
| |
| /// An object used to map the file paths of analyzed files to the file paths |
| /// of the HTML files used to view the content of those files. |
| final PathMapper? pathMapper; |
| |
| /// Creates an output object for the given library info. |
| InstrumentationRenderer(this.migrationInfo, this.pathMapper, |
| this.hasBeenApplied, this.needsRerun); |
| |
| /// Returns the path context used to manipulate paths. |
| path.Context get pathContext => migrationInfo!.pathContext; |
| |
| /// Builds an HTML view of the instrumentation information. |
| String render() { |
| var variables = <String, String?>{ |
| 'root': migrationInfo!.includedRoot, |
| 'dartPageScript': resources.migration_js, |
| 'dartPageStyle': resources.migration_css, |
| 'highlightJsPath': migrationInfo!.highlightJsPath, |
| 'highlightStylePath': migrationInfo!.highlightStylePath, |
| 'dartLogoPath': migrationInfo!.dartLogoPath, |
| 'sdkVersion': _dartSdkVersion, |
| 'migrationAppliedStyle': hasBeenApplied ? 'applied' : 'proposed', |
| 'needsRerunStyle': needsRerun ? 'needs-rerun' : '', |
| }; |
| |
| return substituteVariables(resources.index_html, variables); |
| } |
| } |