blob: e7eaf6f84dd020b594f431dfbab4d948e5b5169e [file] [log] [blame]
// 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);
}
}