Create a unified place to declare experiments used in tests

Change-Id: Ifb9a82391be6c7a92ce9641b4b708add3eaa387e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/375540
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Brian Wilkerson
2024-07-12 21:06:29 +00:00
committed by Commit Queue
parent 9dd8b66cc4
commit 99130844d6
10 changed files with 59 additions and 55 deletions
@@ -5,7 +5,6 @@
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/services/correction/fix_internal.dart';
import 'package:analyzer/dart/analysis/analysis_context.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/file_system/file_system.dart';
@@ -19,6 +18,7 @@ import 'package:analyzer/src/test_utilities/platform.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
import 'package:analyzer/src/utilities/extensions/file_system.dart';
import 'package:analyzer_utilities/test/experiments/experiments.dart';
import 'package:analyzer_utilities/test/mock_packages/mock_packages.dart';
import 'package:linter/src/rules.dart';
import 'package:meta/meta.dart';
@@ -64,13 +64,7 @@ class AbstractContextTest
/// Return a list of the experiments that are to be enabled for tests in this
/// class, an empty list if there are no experiments that should be enabled.
List<String> get experiments => [
Feature.digit_separators.enableString,
Feature.augmentations.enableString,
Feature.enhanced_parts.enableString,
Feature.macros.enableString,
Feature.wildcard_variables.enableString,
];
List<String> get experiments => experimentsForTests;
/// The path that is not in [workspaceRootPath], contains external packages.
@override
@@ -11,13 +11,13 @@ import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
import 'package:analysis_server/src/services/user_prompts/dart_fix_prompt_manager.dart';
import 'package:analysis_server/src/utilities/mocks.dart';
import 'package:analyzer/dart/analysis/analysis_options.dart' as analysis;
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/instrumentation/service.dart';
import 'package:analyzer/src/generated/sdk.dart';
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
import 'package:analyzer_utilities/test/experiments/experiments.dart';
import 'package:analyzer_utilities/test/mock_packages/mock_packages.dart';
import 'package:meta/meta.dart';
import 'package:test/test.dart';
@@ -214,14 +214,9 @@ class PubPackageAnalysisServerTest extends ContextResolutionTest
// TODO(scheglov): Consider turning it back into a getter.
late String testFilePath = '$testPackageLibPath/test.dart';
// If experiments are needed,
// add `import 'package:analyzer/dart/analysis/features.dart';`
// and list the necessary experiments here.
List<String> get experiments => [
Feature.augmentations.enableString,
Feature.enhanced_parts.enableString,
Feature.macros.enableString,
];
/// Return a list of the experiments that are to be enabled for tests in this
/// class, an empty list if there are no experiments that should be enabled.
List<String> get experiments => experimentsForTests;
/// The path that is not in [workspaceRootPath], contains external packages.
@override
@@ -3,8 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/legacy_analysis_server.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer_plugin/src/utilities/client_uri_converter.dart';
import 'package:analyzer_utilities/test/experiments/experiments.dart';
import 'package:language_server_protocol/protocol_generated.dart';
import 'package:test/expect.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -25,9 +25,7 @@ class DartTextDocumentContentProviderTest
AnalysisServerOptions get serverOptions => AnalysisServerOptions()
..enabledExperiments = [
...super.serverOptions.enabledExperiments,
Feature.augmentations.enableString,
Feature.enhanced_parts.enableString,
Feature.macros.enableString,
...experimentsForTests,
];
@override
@@ -5,10 +5,10 @@
import 'package:analysis_server/lsp_protocol/protocol.dart' as lsp;
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/legacy_analysis_server.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/src/test_utilities/test_code_format.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:analyzer_utilities/test/experiments/experiments.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -27,9 +27,7 @@ class DefinitionTest extends AbstractLspAnalysisServerTest {
AnalysisServerOptions get serverOptions => AnalysisServerOptions()
..enabledExperiments = [
...super.serverOptions.enabledExperiments,
Feature.augmentations.enableString,
Feature.enhanced_parts.enableString,
Feature.macros.enableString,
...experimentsForTests,
];
Future<void> test_acrossFiles() async {
+3 -7
View File
@@ -5,8 +5,8 @@
import 'package:analysis_server/lsp_protocol/protocol.dart';
import 'package:analysis_server/src/legacy_analysis_server.dart';
import 'package:analysis_server/src/lsp/constants.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/src/test_utilities/test_code_format.dart';
import 'package:analyzer_utilities/test/experiments/experiments.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -23,12 +23,8 @@ void main() {
@reflectiveTest
class HoverTest extends AbstractLspAnalysisServerTest {
@override
AnalysisServerOptions get serverOptions => AnalysisServerOptions()
..enabledExperiments = [
Feature.augmentations.enableString,
Feature.enhanced_parts.enableString,
Feature.macros.enableString,
];
AnalysisServerOptions get serverOptions =>
AnalysisServerOptions()..enabledExperiments = experimentsForTests;
/// Checks whether the correct types of documentation are returned in a Hover
/// based on [preference].
@@ -9,10 +9,10 @@ import 'package:analysis_server/src/legacy_analysis_server.dart';
import 'package:analysis_server/src/lsp/constants.dart';
import 'package:analysis_server/src/lsp/semantic_tokens/legend.dart';
import 'package:analysis_server/src/protocol/protocol_internal.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/src/test_utilities/test_code_format.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:analyzer_utilities/test/experiments/experiments.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -28,12 +28,8 @@ void main() {
@reflectiveTest
class SemanticTokensTest extends AbstractLspAnalysisServerTest {
@override
AnalysisServerOptions get serverOptions => AnalysisServerOptions()
..enabledExperiments = [
Feature.augmentations.enableString,
Feature.enhanced_parts.enableString,
Feature.macros.enableString,
];
AnalysisServerOptions get serverOptions =>
AnalysisServerOptions()..enabledExperiments = experimentsForTests;
Future<void> test_annotation() async {
var content = '''
@@ -11,7 +11,21 @@ feature. In almost all cases new tests will need to be written to ensure that
the feature isn't broken when run over code that uses the new language feature.
In some cases, new support will need to be added.
Separate issues should be created for each of the items in the list.
## Add an experiment flag
New language features are always implemented behind an experiment flag.
If the experiment flag hasn't already been created, add it.
In the analyzer packages we almost always immediately enable the experiment flag
for all of our tests. This allows us to ensure that existing functionality isn't
broken by the implementation of the new feature. The exception to this rule is
when there's a language feature that is breaking enough in semantics that the
meaning of existing tests would change as a result, in which case we usually
have to take a different approach (not described here).
The list of enabled features is maintained in the file
`pkg/analyzer_utilities/lib/test/experiments/experiments.dart`.
## Template
@@ -5,7 +5,6 @@
import 'package:analyzer/dart/analysis/analysis_context.dart';
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
import 'package:analyzer/dart/analysis/context_root.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/sdk/build_sdk_summary.dart';
import 'package:analyzer/file_system/file_system.dart';
@@ -28,6 +27,7 @@ import 'package:analyzer/src/workspace/basic.dart';
import 'package:analyzer/src/workspace/blaze.dart';
import 'package:analyzer/src/workspace/gn.dart';
import 'package:analyzer/src/workspace/pub.dart';
import 'package:analyzer_utilities/test/experiments/experiments.dart';
import 'package:analyzer_utilities/test/mock_packages/mock_packages.dart';
import 'package:linter/src/rules.dart';
import 'package:meta/meta.dart';
@@ -335,15 +335,7 @@ class PubPackageResolutionTest extends ContextResolutionTest
@override
List<String> get collectionIncludedPaths => [workspaceRootPath];
List<String> get experiments {
return [
Feature.augmentations.enableString,
Feature.digit_separators.enableString,
Feature.enhanced_parts.enableString,
Feature.macros.enableString,
Feature.wildcard_variables.enableString,
];
}
List<String> get experiments => experimentsForTests;
@override
String get packagesRootPath => '/packages';
+2 -5
View File
@@ -4,6 +4,7 @@
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer_utilities/test/experiments/experiments.dart';
import 'package:pub_semver/pub_semver.dart';
class FeatureSets {
@@ -46,11 +47,7 @@ class FeatureSets {
static final FeatureSet latestWithExperiments = FeatureSet.fromEnableFlags2(
sdkLanguageVersion: ExperimentStatus.currentVersion,
flags: [
Feature.augmentations.enableString,
Feature.enhanced_parts.enableString,
Feature.macros.enableString,
],
flags: experimentsForTests,
);
static final FeatureSet latestWithVariance = FeatureSet.fromEnableFlags2(
@@ -0,0 +1,24 @@
// Copyright (c) 2024, 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:analyzer/dart/analysis/features.dart';
/// A list of the experiments that are to be enabled for tests.
///
/// The list will be empty if there are no experiments that should be enabled.
///
/// Experiments should be added to this list when work on a new experiment
/// begins. Experiments should be removed from this list when they are marked
/// as being enable by default.
///
/// The flags in the list are kept in alphabetic order for ease of determining
/// whether a given flag is already included.
List<String> experimentsForTests = [
Feature.augmentations.enableString,
Feature.digit_separators.enableString,
Feature.enhanced_parts.enableString,
Feature.macros.enableString,
Feature.null_aware_elements.enableString,
Feature.wildcard_variables.enableString,
];