blob: fa3fb5fc99fe594ae7b427393f266631404d0040 [file] [log] [blame]
// Copyright (c) 2017, 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.
/// Shared code used by fasta_perf and incremental_perf.
library front_end.tool.perf_common;
import 'dart:io';
import 'package:front_end/src/api_prototype/front_end.dart';
import 'package:front_end/src/fasta/command_line_reporting.dart';
import 'package:front_end/src/fasta/fasta_codes.dart';
import 'package:kernel/target/flutter.dart' show FlutterTarget;
import 'package:kernel/target/targets.dart' show Target, TargetFlags;
import 'package:kernel/target/vm.dart' show VmTarget;
/// Error messages that we temporarily allow when compiling benchmarks in strong
/// mode.
///
/// This whitelist lets us run the compiler benchmarks while those errors get
/// fixed. We don't blindly allow any error message because we would then miss
/// situations where the benchmarks are actually broken.
///
/// Note: the performance bots compile both dart2js and the flutter-gallery app
/// as benchmarks, so they both need to be checked before we remove a message
/// from this set.
final whitelistMessageCode = new Set<String>.from(<String>[
// Code names in this list should match the key used in messages.yaml
codeInvalidAssignment.name,
// The following errors are not covered by unit tests in the SDK repo because
// they are only seen today in the flutter-gallery benchmark (external to
// this repo).
codeInvalidCastFunctionExpr.name,
codeInvalidCastTopLevelFunction.name,
codeUndefinedGetter.name,
codeUndefinedMethod.name,
]);
onErrorHandler(bool isStrong) {
bool messageReported = false;
return (CompilationMessage m) {
if (m.severity == Severity.internalProblem ||
m.severity == Severity.error) {
if (!isStrong || !whitelistMessageCode.contains(m.code)) {
var uri = m.span.start.sourceUrl;
var offset = m.span.start.offset;
stderr.writeln('$uri:$offset: '
'${severityName(m.severity, capitalized: true)}: ${m.message}');
exitCode = 1;
} else if (!messageReported) {
messageReported = true;
stderr.writeln('Whitelisted error messages omitted');
}
}
};
}
/// Creates a [VmTarget] or [FlutterTarget] with strong-mode enabled or
/// disabled.
// TODO(sigmund): delete as soon as the disableTypeInference flag and the
// strongMode flag get merged, and we have a single way of specifying the
// strong-mode flag to the FE.
Target createTarget({bool isFlutter: false, bool strongMode: true}) {
var flags = new TargetFlags(strongMode: strongMode);
if (isFlutter) {
return strongMode
? new FlutterTarget(flags)
: new LegacyFlutterTarget(flags);
} else {
return strongMode ? new VmTarget(flags) : new LegacyVmTarget(flags);
}
}
class LegacyVmTarget extends VmTarget {
LegacyVmTarget(TargetFlags flags) : super(flags);
@override
bool get disableTypeInference => true;
}
class LegacyFlutterTarget extends FlutterTarget {
LegacyFlutterTarget(TargetFlags flags) : super(flags);
@override
bool get disableTypeInference => true;
}