From 3a021a654566e535a0b0613f0750426a8a2b3da2 Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Sat, 30 May 2020 09:47:02 +0000 Subject: [PATCH] [cfe] Remove EvaluationMode.legacy This is no longer valid. Since the SDK is agnostic we should default to weak mode. Change-Id: Ia9fbf911e7ebb595c93a71afe3bb8de7495cebba Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149065 Reviewed-by: Jens Johansen --- .../lib/src/sdk/allowed_experiments.dart | 2 +- pkg/compiler/lib/src/ir/constants.dart | 9 ++-- .../lib/src/js_model/element_map_impl.dart | 6 ++- .../lib/src/kernel/element_map_impl.dart | 6 ++- .../model/cfe_constant_evaluation_test.dart | 10 +++- .../src/api_prototype/experimental_flags.dart | 8 ++- .../src/fasta/kernel/constant_evaluator.dart | 7 +-- .../lib/src/fasta/kernel/kernel_target.dart | 31 ++++++----- pkg/front_end/test/fasta/testing/suite.dart | 3 +- .../test/spell_checking_list_code.txt | 1 + .../_fasta/generate_experimental_flags.dart | 51 +++++++++++++++++-- .../generate_experimental_flags_test.dart | 2 +- pkg/front_end/tool/smoke_test_quick.dart | 3 ++ pkg/kernel/bin/transform.dart | 8 +-- pkg/kernel/lib/default_language_version.dart | 2 +- 15 files changed, 108 insertions(+), 41 deletions(-) diff --git a/pkg/_fe_analyzer_shared/lib/src/sdk/allowed_experiments.dart b/pkg/_fe_analyzer_shared/lib/src/sdk/allowed_experiments.dart index a7faa11a741..0ef7461ca51 100644 --- a/pkg/_fe_analyzer_shared/lib/src/sdk/allowed_experiments.dart +++ b/pkg/_fe_analyzer_shared/lib/src/sdk/allowed_experiments.dart @@ -27,7 +27,7 @@ class AllowedExperiments { /// are enabled for all files of this package. final Map> packageExperiments; - AllowedExperiments({ + const AllowedExperiments({ @required this.sdkDefaultExperiments, @required this.sdkLibraryExperiments, @required this.packageExperiments, diff --git a/pkg/compiler/lib/src/ir/constants.dart b/pkg/compiler/lib/src/ir/constants.dart index a3d259a4ec0..ee22f6343ef 100644 --- a/pkg/compiler/lib/src/ir/constants.dart +++ b/pkg/compiler/lib/src/ir/constants.dart @@ -21,16 +21,17 @@ class Dart2jsConstantEvaluator extends ir.ConstantEvaluator { ir.TypeEnvironment typeEnvironment, ReportErrorFunction reportError, {Map environment: const {}, bool enableTripleShift = false, - bool supportReevaluationForTesting: false}) + bool supportReevaluationForTesting: false, + ir.EvaluationMode evaluationMode}) : _supportReevaluationForTesting = supportReevaluationForTesting, - // TODO(johnniwinther,sigmund): Pass evaluation mode for nnbd - // strong/weak mode. + assert(evaluationMode != null), super( const Dart2jsConstantsBackend(supportsUnevaluatedConstants: false), environment, typeEnvironment, new ErrorReporter(reportError), - enableTripleShift: enableTripleShift); + enableTripleShift: enableTripleShift, + evaluationMode: evaluationMode); @override ErrorReporter get errorReporter => super.errorReporter; diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart index 90c7c440da5..c990f17e739 100644 --- a/pkg/compiler/lib/src/js_model/element_map_impl.dart +++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart @@ -2,6 +2,7 @@ // 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:front_end/src/api_prototype/constant_evaluator.dart' as ir; import 'package:front_end/src/api_unstable/dart2js.dart' as ir; import 'package:kernel/ast.dart' as ir; @@ -1184,7 +1185,10 @@ class JsKernelToElementMap implements JsToElementMap, IrToElementMap { }, environment: _environment.toMap(), enableTripleShift: - options.languageExperiments[ir.ExperimentalFlag.tripleShift]); + options.languageExperiments[ir.ExperimentalFlag.tripleShift], + evaluationMode: options.nullSafetyMode == NullSafetyMode.sound + ? ir.EvaluationMode.strong + : ir.EvaluationMode.weak); } @override diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart index 8c345495212..3b7e499cac5 100644 --- a/pkg/compiler/lib/src/kernel/element_map_impl.dart +++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart @@ -4,6 +4,7 @@ library dart2js.kernel.element_map; +import 'package:front_end/src/api_prototype/constant_evaluator.dart' as ir; import 'package:front_end/src/api_unstable/dart2js.dart' as ir; import 'package:js_runtime/shared/embedded_names.dart'; import 'package:kernel/ast.dart' as ir; @@ -817,7 +818,10 @@ class KernelToElementMapImpl implements KernelToElementMap, IrToElementMap { }, environment: _environment.toMap(), enableTripleShift: - options.languageExperiments[ir.ExperimentalFlag.tripleShift]); + options.languageExperiments[ir.ExperimentalFlag.tripleShift], + evaluationMode: options.nullSafetyMode == NullSafetyMode.sound + ? ir.EvaluationMode.strong + : ir.EvaluationMode.weak); } @override diff --git a/pkg/compiler/test/model/cfe_constant_evaluation_test.dart b/pkg/compiler/test/model/cfe_constant_evaluation_test.dart index da4b8703d7d..803301dfe73 100644 --- a/pkg/compiler/test/model/cfe_constant_evaluation_test.dart +++ b/pkg/compiler/test/model/cfe_constant_evaluation_test.dart @@ -20,6 +20,8 @@ import 'package:compiler/src/ir/constants.dart'; import 'package:compiler/src/ir/visitors.dart'; import 'package:compiler/src/kernel/kernel_strategy.dart'; import 'package:compiler/src/kernel/element_map_impl.dart'; +import 'package:compiler/src/options.dart'; +import 'package:front_end/src/api_prototype/constant_evaluator.dart' as ir; import 'package:front_end/src/api_unstable/dart2js.dart' as ir; import 'package:kernel/ast.dart' as ir; import 'package:kernel/type_environment.dart' as ir; @@ -686,7 +688,13 @@ Future testData(TestData data) async { // the "real error message" is the first in the context. errors.add(context.first.code.name); reportLocatedMessage(elementMap.reporter, message, context); - }, environment: environment, supportReevaluationForTesting: true); + }, + environment: environment, + supportReevaluationForTesting: true, + evaluationMode: + compiler.options.nullSafetyMode == NullSafetyMode.sound + ? ir.EvaluationMode.strong + : ir.EvaluationMode.weak); ir.Constant evaluatedConstant = evaluator.evaluate( new ir.StaticTypeContext(node, typeEnvironment), initializer); diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart index d5094b85878..bfcb2b852e1 100644 --- a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart +++ b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart @@ -5,8 +5,9 @@ // NOTE: THIS FILE IS GENERATED. DO NOT EDIT. // // Instead modify 'tools/experimental_features.yaml' and run -// 'pkg/front_end/tool/fasta generate-experimental-flags' to update. +// 'dart pkg/front_end/tool/fasta.dart generate-experimental-flags' to update. +import 'package:_fe_analyzer_shared/src/sdk/allowed_experiments.dart'; import 'package:kernel/kernel.dart' show Version; enum ExperimentalFlag { @@ -78,3 +79,8 @@ const Map expiredExperimentalFlags = { ExperimentalFlag.tripleShift: false, ExperimentalFlag.variance: false, }; + +const AllowedExperiments allowedExperiments = + const AllowedExperiments(sdkDefaultExperiments: [ + "non-nullable", +], sdkLibraryExperiments: {}, packageExperiments: {}); diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart index 4714d44b975..7359ca99670 100644 --- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart +++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart @@ -128,7 +128,6 @@ void transformLibraries( } enum EvaluationMode { - legacy, weak, agnostic, strong, @@ -764,7 +763,7 @@ class ConstantEvaluator extends RecursiveVisitor { {this.desugarSets = false, this.enableTripleShift = false, this.errorOnUnevaluatedConstant = false, - this.evaluationMode: EvaluationMode.legacy}) + this.evaluationMode: EvaluationMode.weak}) : numberSemantics = backend.numberSemantics, coreTypes = typeEnvironment.coreTypes, canonicalizationCache = {}, @@ -799,7 +798,6 @@ class ConstantEvaluator extends RecursiveVisitor { DartType convertType(DartType type) { switch (evaluationMode) { - case EvaluationMode.legacy: case EvaluationMode.strong: case EvaluationMode.agnostic: return type; @@ -812,7 +810,6 @@ class ConstantEvaluator extends RecursiveVisitor { List convertTypes(List types) { switch (evaluationMode) { - case EvaluationMode.legacy: case EvaluationMode.strong: case EvaluationMode.agnostic: return types; @@ -2182,7 +2179,6 @@ class ConstantEvaluator extends RecursiveVisitor { } return makeBoolConstant(strongResult); case EvaluationMode.weak: - case EvaluationMode.legacy: return makeBoolConstant(performIs(constant, strongMode: false)); } throw new UnsupportedError("Unexpected evaluation mode $evaluationMode"); @@ -2327,7 +2323,6 @@ class ConstantEvaluator extends RecursiveVisitor { result = strongResult; break; case EvaluationMode.weak: - case EvaluationMode.legacy: result = isSubtype(constant, type, SubtypeCheckMode.ignoringNullabilities); break; diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart index ab04eed66ca..19b36257ee1 100644 --- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart +++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart @@ -1095,20 +1095,23 @@ class KernelTarget extends TargetImplementation { TypeEnvironment environment = new TypeEnvironment(loader.coreTypes, loader.hierarchy); constants.EvaluationMode evaluationMode; - if (enableNonNullable) { - switch (loader.nnbdMode) { - case NnbdMode.Weak: - evaluationMode = constants.EvaluationMode.weak; - break; - case NnbdMode.Strong: - evaluationMode = constants.EvaluationMode.strong; - break; - case NnbdMode.Agnostic: - evaluationMode = constants.EvaluationMode.agnostic; - break; - } - } else { - evaluationMode = constants.EvaluationMode.legacy; + // If nnbd is not enabled we will use weak evaluation mode. This is needed + // because the SDK might be agnostic and therefore needs to be weakened + // for legacy mode. + assert( + enableNonNullable || loader.nnbdMode == NnbdMode.Weak, + "Non-weak nnbd mode found without experiment enabled: " + "${loader.nnbdMode}."); + switch (loader.nnbdMode) { + case NnbdMode.Weak: + evaluationMode = constants.EvaluationMode.weak; + break; + case NnbdMode.Strong: + evaluationMode = constants.EvaluationMode.strong; + break; + case NnbdMode.Agnostic: + evaluationMode = constants.EvaluationMode.agnostic; + break; } constants.transformLibraries( diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart index c6c5b75d75c..f04de7591ec 100644 --- a/pkg/front_end/test/fasta/testing/suite.dart +++ b/pkg/front_end/test/fasta/testing/suite.dart @@ -617,7 +617,8 @@ class Outline extends Step { TestOptions testOptions = context.computeTestOptions(description); Map experimentalFlags = testOptions.computeExperimentalFlags(context.experimentalFlags); - NnbdMode nnbdMode = context.weak + NnbdMode nnbdMode = context.weak || + !experimentalFlags[ExperimentalFlag.nonNullable] ? NnbdMode.Weak : (testOptions.nnbdAgnosticMode ? NnbdMode.Agnostic : NnbdMode.Strong); List inputs = [description.uri]; diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt index b63f5aad971..a942ecd2d43 100644 --- a/pkg/front_end/test/spell_checking_list_code.txt +++ b/pkg/front_end/test/spell_checking_list_code.txt @@ -1205,6 +1205,7 @@ watch watcher wb wc +weakened weakener weird weren't diff --git a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart index 5b1356b4c6d..04ccb82c638 100644 --- a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart +++ b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart @@ -7,6 +7,8 @@ import 'dart:io' show File, Platform; import 'package:_fe_analyzer_shared/src/scanner/characters.dart' show $A, $MINUS, $a, $z; +import 'package:_fe_analyzer_shared/src/sdk/allowed_experiments.dart'; + import 'package:dart_style/dart_style.dart' show DartFormatter; import 'package:yaml/yaml.dart' show YamlMap, loadYaml; @@ -33,6 +35,11 @@ Uri computeYamlFile() { .resolve("../../../../tools/experimental_features.yaml"); } +Uri computeAllowListFile() { + return Platform.script + .resolve("../../../../sdk_nnbd/lib/_internal/allowed_experiments.json"); +} + String generateKernelFile() { Uri yamlFile = computeYamlFile(); Map yaml = @@ -57,7 +64,7 @@ String generateKernelFile() { // NOTE: THIS FILE IS GENERATED. DO NOT EDIT. // // Instead modify 'tools/experimental_features.yaml' and run -// 'pkg/front_end/tool/fasta generate-experimental-flags' to update. +// 'dart pkg/front_end/tool/fasta.dart generate-experimental-flags' to update. import "ast.dart"; @@ -91,8 +98,9 @@ String generateCfeFile() { // NOTE: THIS FILE IS GENERATED. DO NOT EDIT. // // Instead modify 'tools/experimental_features.yaml' and run -// 'pkg/front_end/tool/fasta generate-experimental-flags' to update. +// 'dart pkg/front_end/tool/fasta.dart generate-experimental-flags' to update. +import 'package:_fe_analyzer_shared/src/sdk/allowed_experiments.dart'; import 'package:kernel/kernel.dart' show Version; '''); @@ -164,7 +172,44 @@ const Map expiredExperimentalFlags = { bool expired = (features[key] as YamlMap)['expired'] == true; sb.writeln(' ExperimentalFlag.${keyToIdentifier(key)}: ${expired},'); } - sb.writeln('};'); + sb.write(''' +}; + +'''); + + Uri allowListFile = computeAllowListFile(); + AllowedExperiments allowedExperiments = parseAllowedExperiments( + new File.fromUri(allowListFile).readAsStringSync()); + + sb.write(''' +const AllowedExperiments allowedExperiments = const AllowedExperiments( +'''); + sb.writeln('sdkDefaultExperiments: ['); + for (String sdkDefaultExperiment + in allowedExperiments.sdkDefaultExperiments) { + sb.writeln('"$sdkDefaultExperiment",'); + } + sb.writeln('],'); + sb.writeln('sdkLibraryExperiments: {'); + allowedExperiments.sdkLibraryExperiments + .forEach((String library, List experiments) { + sb.writeln('"$library": ['); + for (String experiment in experiments) { + sb.writeln('"$experiment",'); + } + sb.writeln('],'); + }); + sb.writeln('},'); + sb.writeln('packageExperiments: {'); + allowedExperiments.packageExperiments + .forEach((String package, List experiments) { + sb.writeln('"$package": ['); + for (String experiment in experiments) { + sb.writeln('"$experiment",'); + } + sb.writeln('],'); + }); + sb.writeln('});'); return new DartFormatter().format("$sb"); } diff --git a/pkg/front_end/tool/_fasta/generate_experimental_flags_test.dart b/pkg/front_end/tool/_fasta/generate_experimental_flags_test.dart index 1249933b41d..d826ea5bdaf 100644 --- a/pkg/front_end/tool/_fasta/generate_experimental_flags_test.dart +++ b/pkg/front_end/tool/_fasta/generate_experimental_flags_test.dart @@ -37,7 +37,7 @@ The generated file ${generatedFile.path} is out of date. To regenerate the file, run - pkg/front_end/tool/fasta generate-experimental-flags + dart pkg/front_end/tool/fasta.dart generate-experimental-flags ------------------------ """); diff --git a/pkg/front_end/tool/smoke_test_quick.dart b/pkg/front_end/tool/smoke_test_quick.dart index b6bd88744f0..4956e0402e5 100644 --- a/pkg/front_end/tool/smoke_test_quick.dart +++ b/pkg/front_end/tool/smoke_test_quick.dart @@ -26,6 +26,9 @@ main(List args) async { futures.add( run("pkg/front_end/test/lint_suite.dart", ["--", "lint/front_end/..."])); futures.add(run("pkg/front_end/test/deps_test.dart", [], filter: false)); + futures.add(run( + "pkg/front_end/tool/_fasta/generate_experimental_flags_test.dart", [], + filter: false)); await Future.wait(futures); print("\n-----------------------\n"); print("Done with exitcode $exitCode in ${stopwatch.elapsedMilliseconds} ms"); diff --git a/pkg/kernel/bin/transform.dart b/pkg/kernel/bin/transform.dart index c0b9d02f74d..bec347f4d08 100755 --- a/pkg/kernel/bin/transform.dart +++ b/pkg/kernel/bin/transform.dart @@ -100,12 +100,8 @@ Future runTransformation(List arguments) async { break; case 'constants': final VmConstantsBackend backend = new VmConstantsBackend(coreTypes); - component = constants.transformComponent( - component, - backend, - defines, - const constants.SimpleErrorReporter(), - constants.EvaluationMode.legacy); + component = constants.transformComponent(component, backend, defines, + const constants.SimpleErrorReporter(), constants.EvaluationMode.weak); break; case 'empty': component = empty.transformComponent(component); diff --git a/pkg/kernel/lib/default_language_version.dart b/pkg/kernel/lib/default_language_version.dart index 4aa24886260..cd5308ed9af 100644 --- a/pkg/kernel/lib/default_language_version.dart +++ b/pkg/kernel/lib/default_language_version.dart @@ -5,7 +5,7 @@ // NOTE: THIS FILE IS GENERATED. DO NOT EDIT. // // Instead modify 'tools/experimental_features.yaml' and run -// 'pkg/front_end/tool/fasta generate-experimental-flags' to update. +// 'dart pkg/front_end/tool/fasta.dart generate-experimental-flags' to update. import "ast.dart";