blob: 70ab553fcd91b7de9618190dd8d9e45ed867f29f [file] [log] [blame]
// 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 'package:source_span/source_span.dart';
import 'package:test_api/backend.dart';
/// A compiler with which the user has chosen to run tests.
class CompilerSelection {
/// The chosen compiler to use.
final Compiler compiler;
/// The location in the configuration file of this compiler string, or `null`
/// if it was defined outside a configuration file (for example, on the
/// command line).
final SourceSpan? span;
/// The platform selector for which platforms this compiler should apply to,
/// if specified. Defaults to all platforms where the compiler is supported.
final PlatformSelector? platformSelector;
CompilerSelection(String compiler,
{required this.platformSelector, required this.span})
: compiler = Compiler.builtIn.firstWhere((c) => c.identifier == compiler);
factory CompilerSelection.parse(String option, {SourceSpan? parentSpan}) {
var parts = option.split(':');
switch (parts.length) {
case 1:
_checkValidCompiler(option, parentSpan);
return CompilerSelection(option,
platformSelector: null, span: parentSpan);
case 2:
var compiler = parts[1];
_checkValidCompiler(compiler, parentSpan);
return CompilerSelection(compiler,
platformSelector: PlatformSelector.parse(parts[0]),
span: parentSpan);
default:
throw ArgumentError.value(
option,
'--compiler',
'Must be of the format [<boolean-selector>:]<compiler>, but got '
'more than one `:`.');
}
}
@override
bool operator ==(Object other) =>
other is CompilerSelection && other.compiler == compiler;
@override
int get hashCode => compiler.hashCode;
}
void _checkValidCompiler(String compiler, SourceSpan? span) {
if (Compiler.builtIn.any((c) => c.identifier == compiler)) return;
throw SourceSpanFormatException(
'Invalid compiler `$compiler`, must be one of ${Compiler.builtIn.map((c) => c.identifier).join(', ')}',
span);
}