b48d4f224f
Change-Id: I60891b46119d6451810adf2846a05a66050bacd0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/373246 Reviewed-by: Jens Johansen <jensj@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com>
154 lines
5.5 KiB
Dart
154 lines
5.5 KiB
Dart
// 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' show Directory, File, Platform;
|
|
|
|
import 'package:_fe_analyzer_shared/src/testing/features.dart';
|
|
import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
|
|
import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
|
|
import 'package:front_end/src/api_prototype/compiler_options.dart';
|
|
import 'package:front_end/src/api_prototype/language_version.dart' as lv;
|
|
import 'package:front_end/src/base/messages.dart' show FormattedMessage;
|
|
import 'package:front_end/src/builder/library_builder.dart';
|
|
import 'package:front_end/src/source/source_library_builder.dart';
|
|
import 'package:front_end/src/testing/id_testing_helper.dart'
|
|
show
|
|
CfeDataExtractor,
|
|
CfeDataComputer,
|
|
CfeTestConfig,
|
|
CfeTestResultData,
|
|
InternalCompilerResult,
|
|
createUriForFileName,
|
|
onFailure,
|
|
runTestFor;
|
|
import 'package:front_end/src/testing/id_testing_utils.dart';
|
|
import 'package:kernel/ast.dart' show Component, Library, Version;
|
|
|
|
import '../utils/symbolic_language_versions.dart';
|
|
|
|
Future<void> main(List<String> args) async {
|
|
// Fix default/max major and minor version so we can test it.
|
|
// This config sets it to 2.8.
|
|
TestConfigWithLanguageVersion cfeConfig =
|
|
new TestConfigWithLanguageVersion(cfeMarker, "cfe");
|
|
|
|
Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
|
|
await runTests<Features>(dataDir,
|
|
args: args,
|
|
createUriForFileName: createUriForFileName,
|
|
onFailure: onFailure,
|
|
runTest: runTestFor(const LanguageVersioningDataComputer(), [cfeConfig]),
|
|
skipList: [
|
|
// Two language versions specified, the last one is ok and is used here.
|
|
"package_default_version_is_wrong_2",
|
|
],
|
|
preProcessFile: replaceMarkersWithVersions,
|
|
postProcessFile: replaceVersionsWithMarkers);
|
|
}
|
|
|
|
class TestConfigWithLanguageVersion extends CfeTestConfig {
|
|
TestConfigWithLanguageVersion(String marker, String name)
|
|
: super(marker, name);
|
|
|
|
@override
|
|
CompilerOptions customizeCompilerOptions(
|
|
CompilerOptions options, TestData testData) {
|
|
options.currentSdkVersion =
|
|
SymbolicLanguageVersion.currentVersion.version.toText();
|
|
|
|
File f = new File.fromUri(testData.testFileUri.resolve("test.options"));
|
|
if (f.existsSync()) {
|
|
List<String> lines = f.readAsStringSync().split("\n");
|
|
for (String line in lines) {
|
|
const String packages = "--packages=";
|
|
if (line == "" || line.startsWith("#")) continue;
|
|
if (line.startsWith(packages)) {
|
|
String value = line.substring(packages.length);
|
|
options.packagesFileUri = testData.entryPoint.resolve(value);
|
|
print("Setting package file uri to ${options.packagesFileUri}");
|
|
} else {
|
|
throw "Unsupported: $line";
|
|
}
|
|
}
|
|
}
|
|
return options;
|
|
}
|
|
}
|
|
|
|
class Tags {
|
|
static const String languageVersion = 'languageVersion';
|
|
static const String packageUri = 'packageUri';
|
|
static const String errors = 'errors';
|
|
}
|
|
|
|
class LanguageVersioningDataComputer extends CfeDataComputer<Features> {
|
|
const LanguageVersioningDataComputer();
|
|
|
|
@override
|
|
Future<void> inspectTestResultData(CfeTestResultData testResultData) async {
|
|
CompilerOptions options = testResultData.customData;
|
|
Component component = testResultData.compilerResult.component!;
|
|
for (Library library in component.libraries) {
|
|
if (library.importUri.isScheme("dart")) continue;
|
|
Version lvFile =
|
|
(await lv.languageVersionForUri(library.fileUri, options)).version;
|
|
Version lvImportUri =
|
|
(await lv.languageVersionForUri(library.importUri, options)).version;
|
|
if ((lvFile != lvImportUri || lvFile != library.languageVersion)) {
|
|
throw """
|
|
Language version disagreement:
|
|
Library: ${library.languageVersion}
|
|
Language version API (file URI): ${lvFile}
|
|
Language version API (import URI): ${lvImportUri}
|
|
""";
|
|
}
|
|
}
|
|
}
|
|
|
|
@override
|
|
void computeLibraryData(CfeTestResultData testResultData, Library library,
|
|
Map<Id, ActualData<Features>> actualMap,
|
|
{bool? verbose}) {
|
|
new LanguageVersioningDataExtractor(
|
|
testResultData.compilerResult, actualMap)
|
|
.computeForLibrary(library);
|
|
}
|
|
|
|
@override
|
|
bool get supportsErrors => true;
|
|
|
|
@override
|
|
Features computeErrorData(
|
|
CfeTestResultData testResultData, Id id, List<FormattedMessage> errors) {
|
|
Features features = new Features();
|
|
features[Tags.errors] = errors.map((m) => m.code.name).join(',');
|
|
return features;
|
|
}
|
|
|
|
@override
|
|
DataInterpreter<Features> get dataValidator =>
|
|
const FeaturesDataInterpreter();
|
|
}
|
|
|
|
class LanguageVersioningDataExtractor extends CfeDataExtractor<Features> {
|
|
LanguageVersioningDataExtractor(InternalCompilerResult compilerResult,
|
|
Map<Id, ActualData<Features>> actualMap)
|
|
: super(compilerResult, actualMap);
|
|
|
|
@override
|
|
Features computeLibraryValue(Id id, Library library) {
|
|
Features features = new Features();
|
|
features[Tags.languageVersion] =
|
|
"${library.languageVersion.major}.${library.languageVersion.minor}";
|
|
LibraryBuilder? libraryBuilder =
|
|
lookupLibraryBuilder(compilerResult, library);
|
|
if (libraryBuilder is SourceLibraryBuilder &&
|
|
libraryBuilder.packageUriForTesting != null) {
|
|
features[Tags.packageUri] =
|
|
libraryBuilder.packageUriForTesting.toString();
|
|
}
|
|
return features;
|
|
}
|
|
}
|