[analysis_server] Consolidate some more writePackageConfig() methods

+ tidy up some redundant package versions that are inherited from the ConfigurationFiles mixin.

Change-Id: I93329cbf65af3a68ed27284903e7becac01cf5ea
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/349380
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Danny Tuppeny 2024-02-01 19:11:27 +00:00 committed by Commit Queue
parent 19677cb591
commit 581686b8fb
35 changed files with 244 additions and 289 deletions

View file

@ -3,6 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
mixin TestMacros {
// TODO(dantup): Merge this into `test\test_macros.dart`. Currently it uses
// another helper (`addMacros`) that isn't accessible where these one is
// used.
/// A macro that can be applied to a class to add a `foo()` method that calls
/// a bar() method.
final withFooMethodMacro = r'''

View file

@ -15,7 +15,6 @@ import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
import 'package:analyzer/src/test_utilities/package_config_file_builder.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';
@ -24,8 +23,10 @@ import 'package:meta/meta.dart';
import 'package:test/test.dart';
import 'src/utilities/mock_packages.dart';
import 'support/configuration_files.dart';
class AbstractContextTest with ResourceProviderMixin {
class AbstractContextTest
with MockPackagesMixin, ConfigurationFilesMixin, ResourceProviderMixin {
static bool _lintRulesAreRegistered = false;
static final ByteStore _byteStore = MemoryByteStore();
@ -59,11 +60,8 @@ class AbstractContextTest with ResourceProviderMixin {
EnableString.macros,
];
String get latestLanguageVersion =>
'${ExperimentStatus.currentVersion.major}.'
'${ExperimentStatus.currentVersion.minor}';
/// The path that is not in [workspaceRootPath], contains external packages.
@override
String get packagesRootPath => '/packages';
Folder get sdkRoot => newFolder('/sdk');
@ -76,10 +74,9 @@ class AbstractContextTest with ResourceProviderMixin {
File get testFile => getFile(testFilePath);
String? get testPackageLanguageVersion => latestLanguageVersion;
String get testPackageLibPath => '$testPackageRootPath/lib';
@override
String get testPackageRootPath => '$workspaceRootPath/test';
String get testPackageTestPath => '$testPackageRootPath/test';
@ -230,54 +227,6 @@ class AbstractContextTest with ResourceProviderMixin {
void verifyCreatedCollection() {}
void writePackageConfig(String path, PackageConfigFileBuilder config) {
newFile(path, config.toContent(toUriStr: toUriStr));
}
void writeTestPackageConfig({
PackageConfigFileBuilder? config,
String? languageVersion,
bool flutter = false,
bool meta = false,
bool vector_math = false,
}) {
if (config == null) {
config = PackageConfigFileBuilder();
} else {
config = config.copy();
}
config.add(
name: 'test',
rootPath: testPackageRootPath,
languageVersion: languageVersion ?? testPackageLanguageVersion,
);
if (meta || flutter) {
var libFolder = MockPackages.instance.addMeta(resourceProvider);
config.add(name: 'meta', rootPath: libFolder.parent.path);
}
if (flutter) {
{
var libFolder = MockPackages.instance.addUI(resourceProvider);
config.add(name: 'ui', rootPath: libFolder.parent.path);
}
{
var libFolder = MockPackages.instance.addFlutter(resourceProvider);
config.add(name: 'flutter', rootPath: libFolder.parent.path);
}
}
if (vector_math) {
var libFolder = MockPackages.instance.addVectorMath(resourceProvider);
config.add(name: 'vector_math', rootPath: libFolder.parent.path);
}
var path = '$testPackageRootPath/.dart_tool/package_config.json';
writePackageConfig(path, config);
}
void _addAnalyzedFilesToDrivers() {
for (var analysisContext in _analysisContextCollection!.contexts) {
for (var path in analysisContext.contextRoot.analyzedFiles()) {

View file

@ -15,7 +15,6 @@ import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../analysis_server_base.dart';
import '../src/utilities/mock_packages.dart';
void main() {
defineReflectiveSuite(() {
@ -25,7 +24,6 @@ void main() {
@reflectiveTest
class NotificationErrorsTest extends PubPackageAnalysisServerTest {
late Folder pedanticFolder;
Map<File, List<AnalysisError>?> filesErrors = {};
@override
@ -45,7 +43,6 @@ class NotificationErrorsTest extends PubPackageAnalysisServerTest {
void setUp() {
registerLintRules();
super.setUp();
pedanticFolder = MockPackages.instance.addPedantic(resourceProvider);
}
Future<void> test_analysisOptionsFile() async {
@ -87,12 +84,7 @@ include: package:pedantic/analysis_options.yaml
expect(error.type, AnalysisErrorType.STATIC_WARNING);
// Write a package file that allows resolving the include.
newPackageConfigJsonFile(
testPackageRootPath,
(PackageConfigFileBuilder()
..add(name: 'pedantic', rootPath: pedanticFolder.parent.path))
.toContent(toUriStr: toUriStr),
);
writeTestPackageConfig(pedantic: true);
// Ensure the errors disappear.
await waitForTasksFinished();

View file

@ -81,8 +81,8 @@ analyzer:
}
Future<void> test_ignoredInAnalysisOptions_inChildContext() async {
newPackageConfigJsonFile(testPackageRootPath, '');
newPackageConfigJsonFile('$testPackageRootPath/child', '');
writeTestPackageConfig();
writePackageConfig(convertPath('$testPackageRootPath/child'));
var sampleFile = newFile(
'$testPackageRootPath/child/samples/sample.dart',
'',
@ -99,8 +99,8 @@ analyzer:
}
Future<void> test_ignoredInAnalysisOptions_inRootContext() async {
newPackageConfigJsonFile(testPackageRootPath, '');
newPackageConfigJsonFile('$testPackageRootPath/child', '');
writeTestPackageConfig();
writePackageConfig(convertPath('$testPackageRootPath/child'));
var sampleFile = newFile(
'$testPackageRootPath/child/samples/sample.dart',
'',

View file

@ -13,10 +13,10 @@ 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/file_system/memory_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/package_config_file_builder.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
import 'package:meta/meta.dart';
@ -24,6 +24,7 @@ import 'package:test/test.dart';
import 'package:unified_analytics/unified_analytics.dart';
import 'mocks.dart';
import 'src/utilities/mock_packages.dart';
import 'support/configuration_files.dart';
import 'test_macros.dart';
@ -206,7 +207,10 @@ class ContextResolutionTest with ResourceProviderMixin {
}
class PubPackageAnalysisServerTest extends ContextResolutionTest
with ConfigurationFilesMixin, TestMacros {
with
MockPackagesMixin<MemoryResourceProvider>,
ConfigurationFilesMixin,
TestMacros {
// If experiments are needed,
// add `import 'package:analyzer/dart/analysis/features.dart';`
// and list the necessary experiments here.
@ -216,7 +220,8 @@ class PubPackageAnalysisServerTest extends ContextResolutionTest
];
/// The path that is not in [workspaceRootPath], contains external packages.
String get packagesRootPath => '/packages';
@override
String get packagesRootPath => resourceProvider.convertPath('/packages');
File get testFile => getFile(testFilePath);
@ -233,6 +238,7 @@ class PubPackageAnalysisServerTest extends ContextResolutionTest
Folder get testPackageRoot => getFolder(testPackageRootPath);
@override
String get testPackageRootPath => '$workspaceRootPath/test';
String get testPackageTestPath => '$testPackageRootPath/test';
@ -258,8 +264,7 @@ class PubPackageAnalysisServerTest extends ContextResolutionTest
/// include imports, the imports for macros will be added automatically.
void addMacros(List<String> macros) {
writeTestPackageConfig(
config: PackageConfigFileBuilder(),
temporaryMacroSupport: true,
macro: true,
);
newFile(
'$testPackageLibPath/macros.dart',
@ -323,23 +328,6 @@ import 'package:_fe_analyzer_shared/src/macros/api.dart';
);
}
void writeTestPackageConfig({
PackageConfigFileBuilder? config,
String? languageVersion,
bool flutter = false,
bool meta = false,
bool temporaryMacroSupport = false,
}) {
writePackageConfig(
testPackageRoot.path,
config: config,
languageVersion: languageVersion,
flutter: flutter,
meta: meta,
temporaryMacroSupport: temporaryMacroSupport,
);
}
void writeTestPackagePubspecYamlFile(String content) {
newPubspecYamlFile(testPackageRootPath, content);
}

View file

@ -1996,11 +1996,10 @@ class SetSubscriptionsTest extends PubPackageAnalysisServerTest {
library lib_a;
class A {}
''');
newPackageConfigJsonFile(
'/project',
(PackageConfigFileBuilder()
..add(name: 'pkgA', rootPath: '/packages/pkgA'))
.toContent(toUriStr: toUriStr),
writePackageConfig(
convertPath('/project'),
config: (PackageConfigFileBuilder()
..add(name: 'pkgA', rootPath: convertPath('/packages/pkgA'))),
);
//
addTestFile('''
@ -2049,11 +2048,10 @@ void f() {
library lib_a;
class A {}
''');
newPackageConfigJsonFile(
'/project',
(PackageConfigFileBuilder()
..add(name: 'pkgA', rootPath: '/packages/pkgA'))
.toContent(toUriStr: toUriStr),
writePackageConfig(
convertPath('/project'),
config: (PackageConfigFileBuilder()
..add(name: 'pkgA', rootPath: convertPath('/packages/pkgA'))),
);
//
addTestFile('// no "pkgA" reference');

View file

@ -152,23 +152,18 @@ print(1)
}
Future<void> test_suggestImportFromDifferentAnalysisRoot() async {
newPackageConfigJsonFile(
'$workspaceRootPath/aaa',
(PackageConfigFileBuilder()
..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa')
..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb'))
.toContent(toUriStr: toUriStr),
writePackageConfig(
convertPath('$workspaceRootPath/aaa'),
config: (PackageConfigFileBuilder()
..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb')),
);
newPubspecYamlFile('$workspaceRootPath/aaa', r'''
dependencies:
bbb: any
''');
newPackageConfigJsonFile(
'$workspaceRootPath/bbb',
(PackageConfigFileBuilder()
..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb'))
.toContent(toUriStr: toUriStr),
writePackageConfig(
convertPath('$workspaceRootPath/bbb'),
);
newFile('$workspaceRootPath/bbb/lib/target.dart', 'class Foo() {}');
newFile(

View file

@ -7,14 +7,12 @@ import 'dart:async';
import 'package:analysis_server/protocol/protocol.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/services/refactoring/legacy/refactoring_manager.dart';
import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../analysis_server_base.dart';
import '../mocks.dart';
import '../src/utilities/mock_packages.dart';
void main() {
defineReflectiveSuite(() {
@ -846,11 +844,7 @@ class GetAvailableRefactoringsTest extends PubPackageAnalysisServerTest {
late List<RefactoringKind> kinds;
void addFlutterPackage() {
var flutterLib = MockPackages.instance.addFlutter(resourceProvider);
writeTestPackageConfig(
config: PackageConfigFileBuilder()
..add(name: 'flutter', rootPath: flutterLib.parent.path),
);
writeTestPackageConfig(flutter: true);
}
/// Tests that there is refactoring of the given [kind] is available at the

View file

@ -10,11 +10,13 @@ import 'dart:io';
import 'package:analysis_server/protocol/protocol_constants.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/services/pub/pub_command.dart';
import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';
import '../../src/utilities/mock_packages.dart';
import '../../support/configuration_files.dart';
import 'integration_test_methods.dart';
import 'protocol_matchers.dart';
@ -82,7 +84,8 @@ typedef NotificationProcessor = void Function(
String event, Map<Object?, Object?> params);
/// Base class for analysis server integration tests.
abstract class AbstractAnalysisServerIntegrationTest extends IntegrationTest {
abstract class AbstractAnalysisServerIntegrationTest extends IntegrationTest
with MockPackagesMixin<PhysicalResourceProvider>, ConfigurationFilesMixin {
/// Amount of time to give the server to respond to a shutdown request before
/// forcibly terminating it.
static const Duration SHUTDOWN_TIMEOUT = Duration(seconds: 60);
@ -94,6 +97,12 @@ abstract class AbstractAnalysisServerIntegrationTest extends IntegrationTest {
/// Temporary directory in which source files can be stored.
late Directory sourceDirectory;
/// Temporary directory in which additional packages can be stored.
late Directory packagesDirectory;
@override
final resourceProvider = PhysicalResourceProvider.INSTANCE;
/// Map from file path to the list of analysis errors which have most recently
/// been received for the file.
Map<String, List<AnalysisError>> currentAnalysisErrors =
@ -135,6 +144,12 @@ abstract class AbstractAnalysisServerIntegrationTest extends IntegrationTest {
return completer.future;
}
@override
String get packagesRootPath => packagesDirectory.path;
@override
String get testPackageRootPath => sourceDirectory.path;
/// Print out any messages exchanged with the server. If some messages have
/// already been exchanged with the server, they are printed out immediately.
void debugStdio() {
@ -166,9 +181,15 @@ abstract class AbstractAnalysisServerIntegrationTest extends IntegrationTest {
/// The server is automatically started before every test, and a temporary
/// [sourceDirectory] is created.
Future<void> setUp() async {
sourceDirectory = Directory(Directory.systemTemp
var pathContext = resourceProvider.pathContext;
var tempDirectoryPath = Directory.systemTemp
.createTempSync('analysisServer')
.resolveSymbolicLinksSync());
.resolveSymbolicLinksSync();
sourceDirectory = Directory(pathContext.join(tempDirectoryPath, 'app'))
..createSync();
packagesDirectory =
Directory(pathContext.join(tempDirectoryPath, 'packages'))
..createSync();
writeTestPackageConfig();
onAnalysisErrors.listen((AnalysisErrorsParams params) {
@ -242,10 +263,12 @@ abstract class AbstractAnalysisServerIntegrationTest extends IntegrationTest {
);
}
/// After every test, the server is stopped and [sourceDirectory] is deleted.
/// After every test, the server is stopped and [sourceDirectory] and
/// [packagesDirectory] are deleted.
Future<void> tearDown() {
return shutdownIfNeeded().then((_) {
sourceDirectory.deleteSync(recursive: true);
packagesDirectory.deleteSync(recursive: true);
});
}
@ -277,40 +300,6 @@ abstract class AbstractAnalysisServerIntegrationTest extends IntegrationTest {
file.writeAsStringSync(contents);
return file.resolveSymbolicLinksSync();
}
void writePackageConfig(
String pathname, {
required PackageConfigFileBuilder config,
}) {
writeFile(
pathname,
config.toContent(
toUriStr: (p) => '${path.toUri(p)}',
),
);
}
void writeTestPackageConfig({
PackageConfigFileBuilder? config,
String? languageVersion,
}) {
if (config == null) {
config = PackageConfigFileBuilder();
} else {
config = config.copy();
}
config.add(
name: 'test',
rootPath: sourceDirectory.path,
languageVersion: languageVersion,
);
writePackageConfig(
sourcePath('.dart_tool/package_config.json'),
config: config,
);
}
}
/// Wrapper class for Matcher which doesn't create the underlying Matcher object

View file

@ -26,8 +26,7 @@ class AssistsCodeActionsTest extends AbstractCodeActionsTest {
@override
void setUp() {
super.setUp();
writePackageConfig(
projectFolderPath,
writeTestPackageConfig(
flutter: true,
);
setSupportedCodeActionKinds([CodeActionKind.Refactor]);

View file

@ -830,8 +830,7 @@ const NewWidget({
@override
void setUp() {
super.setUp();
writePackageConfig(
projectFolderPath,
writeTestPackageConfig(
flutter: true,
);

View file

@ -769,8 +769,7 @@ void f() {
@override
void setUp() {
super.setUp();
writePackageConfig(
projectFolderPath,
writeTestPackageConfig(
flutter: true,
);
}
@ -4366,8 +4365,7 @@ import 'package:flutter/widgets.dart';''';
@override
void setUp() {
super.setUp();
writePackageConfig(
projectFolderPath,
writeTestPackageConfig(
flutter: true,
);
}

View file

@ -85,7 +85,7 @@ class DartTextDocumentContentProviderTest extends AbstractLspAnalysisServerTest
}
Future<void> test_valid_content() async {
writePackageConfig(projectFolderPath, temporaryMacroSupport: true);
writeTestPackageConfig(macro: true);
newFile(
join(projectFolderPath, 'lib', 'with_foo.dart'), withFooMethodMacro);
@ -124,7 +124,7 @@ class A {
}
Future<void> test_valid_eventAndModifiedContent() async {
writePackageConfig(projectFolderPath, temporaryMacroSupport: true);
writeTestPackageConfig(macro: true);
var macroImplementationFilePath =
join(projectFolderPath, 'lib', 'with_foo.dart');

View file

@ -425,7 +425,7 @@ foo(int m) {
}
Future<void> test_macro_macroGeneratedFileToUserFile() async {
writePackageConfig(projectFolderPath, temporaryMacroSupport: true);
writeTestPackageConfig(macro: true);
setLocationLinkSupport(); // To verify the full set of ranges.
setDartTextDocumentContentProviderSupport();
@ -475,7 +475,7 @@ class A {
}
Future<void> test_macro_userFileToMacroGeneratedFile() async {
writePackageConfig(projectFolderPath, temporaryMacroSupport: true);
writeTestPackageConfig(macro: true);
// TODO(dantup): Consider making LocationLink the default for tests (with
// some specific tests for Location) because it's what VS Code uses and

View file

@ -120,7 +120,7 @@ include: package:pedantic/analysis_options.yaml
// // Write a package file that allows resolving the include.
// final secondDiagnosticsUpdate = waitForDiagnostics(analysisOptionsUri);
// writePackageConfig(projectFolderPath, pedantic: true);
// writeTestPackageConfig(pedantic: true);
//
// // Ensure the error disappeared.
// final updatedDiagnostics = await secondDiagnosticsUpdate;
@ -178,8 +178,7 @@ void f() {
setDiagnosticTagSupport([DiagnosticTag.Deprecated]);
var onePackagePath = convertPath('/home/one');
writePackageConfig(
projectFolderPath,
writeTestPackageConfig(
config: PackageConfigFileBuilder()
..add(name: 'one', rootPath: onePackagePath),
);
@ -203,8 +202,7 @@ void f() {
Future<void> test_diagnosticTag_notSupported() async {
var onePackagePath = convertPath('/home/one');
writePackageConfig(
projectFolderPath,
writeTestPackageConfig(
config: PackageConfigFileBuilder()
..add(name: 'one', rootPath: onePackagePath),
);

View file

@ -29,7 +29,7 @@ class DocumentColorPresentationTest extends AbstractLspAnalysisServerTest {
@override
void setUp() {
super.setUp();
writePackageConfig(projectFolderPath, flutter: true);
writeTestPackageConfig(flutter: true);
content = '';
testFilePath = mainFilePath;
@ -305,7 +305,7 @@ class DocumentColorTest extends AbstractLspAnalysisServerTest {
@override
void setUp() {
super.setUp();
writePackageConfig(projectFolderPath, flutter: true);
writeTestPackageConfig(flutter: true);
}
Future<void> test_nonDartFile() async {

View file

@ -49,7 +49,7 @@ class FlutterOutlineTest extends AbstractLspAnalysisServerTest {
@override
void setUp() {
super.setUp();
writePackageConfig(projectFolderPath, flutter: true);
writeTestPackageConfig(flutter: true);
}
Future<void> test_afterChange() async {

View file

@ -14,6 +14,7 @@ import 'package:analysis_server/src/plugin/plugin_manager.dart';
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/file_system/memory_file_system.dart';
import 'package:analyzer/instrumentation/instrumentation.dart';
import 'package:analyzer/src/generated/sdk.dart';
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
@ -31,6 +32,7 @@ import 'package:unified_analytics/unified_analytics.dart';
import '../mocks.dart';
import '../mocks_lsp.dart';
import '../src/utilities/mock_packages.dart';
import '../support/configuration_files.dart';
import 'change_verifier.dart';
import 'request_helpers_mixin.dart';
@ -49,6 +51,7 @@ abstract class AbstractLspAnalysisServerTest
LspEditHelpersMixin,
LspVerifyEditHelpersMixin,
LspAnalysisServerTestMixin,
MockPackagesMixin<MemoryResourceProvider>,
ConfigurationFilesMixin {
late MockLspServerChannel channel;
late TestPluginManager pluginManager;
@ -62,8 +65,9 @@ abstract class AbstractLspAnalysisServerTest
DartFixPromptManager? get dartFixPromptManager => null;
/// The path that is not in [projectFolderPath], contains external packages.
@override
path.Context get pathContext => server.resourceProvider.pathContext;
String get packagesRootPath => resourceProvider.convertPath('/packages');
AnalysisServerOptions get serverOptions => AnalysisServerOptions();
@ -301,7 +305,7 @@ analyzer:
''');
analysisOptionsUri = pathContext.toUri(analysisOptionsPath);
writePackageConfig(projectFolderPath);
writeTestPackageConfig();
}
Future<void> tearDown() async {
@ -864,6 +868,8 @@ mixin LspAnalysisServerTestMixin
Stream<Message> get serverToClient;
String get testPackageRootPath => projectFolderPath;
Future<void> changeFile(
int newVersion,
Uri uri,

View file

@ -50,7 +50,7 @@ class ServerDartFixPromptTest extends AbstractLspAnalysisServerTest {
expect(promptManager.checksTriggered, 1);
// Expect that writing package config attempts to trigger another check.
writePackageConfig(projectFolderPath);
writeTestPackageConfig();
await waitForAnalysisComplete();
await pumpEventQueue(times: 5000);
expect(promptManager.checksTriggered, 2);

View file

@ -22,7 +22,7 @@ void main() {
@reflectiveTest
class ConvertElementNullableTest extends AbstractSingleUnitTest {
@override
String? get testPackageLanguageVersion => '2.9';
String get testPackageLanguageVersion => '2.9';
Future<void> test_CONSTRUCTOR_required_parameters_1() async {
writeTestPackageConfig(meta: true);

View file

@ -163,19 +163,13 @@ library lib_a;
class A {}
class B extends A {}
''');
newPackageConfigJsonFile(
'$packagesRootPath/pkgA',
(PackageConfigFileBuilder()
..add(name: 'pkgA', rootPath: '$packagesRootPath/pkgA'))
.toContent(toUriStr: toUriStr),
writePackageConfig(
convertPath('$packagesRootPath/pkgA'),
);
// reference the package from a project
newPackageConfigJsonFile(
testPackageRootPath,
(PackageConfigFileBuilder()
..add(name: 'pkgA', rootPath: '$packagesRootPath/pkgA'))
.toContent(toUriStr: toUriStr),
);
writeTestPackageConfig(
config: (PackageConfigFileBuilder()
..add(name: 'pkgA', rootPath: '$packagesRootPath/pkgA')));
addTestFile('''
import 'package:pkgA/libA.dart';
class C extends A {}

View file

@ -2,10 +2,8 @@
// 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/src/test_utilities/package_config_file_builder.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../../../src/utilities/mock_packages.dart';
import 'completion_relevance.dart';
void main() {
@ -21,12 +19,7 @@ class NamedArgumentTest extends CompletionRelevanceTest
mixin NamedArgumentTestCases on CompletionRelevanceTest {
@override
Future<void> setUp() async {
var metaLibFolder = MockPackages.instance.addMeta(resourceProvider);
writeTestPackageConfig(
config: PackageConfigFileBuilder()
..add(name: 'meta', rootPath: metaLibFolder.parent.path),
);
writeTestPackageConfig(meta: true);
await super.setUp();
}

View file

@ -482,7 +482,7 @@ f() {
@reflectiveTest
class _NotNullTest extends PostfixCompletionTest {
@override
String? get testPackageLanguageVersion => '2.9';
String get testPackageLanguageVersion => '2.9';
Future<void> test_nn() async {
await _prepareCompletion('.nn', '''
@ -590,7 +590,7 @@ f() {
@reflectiveTest
class _ParenTest extends PostfixCompletionTest {
@override
String? get testPackageLanguageVersion => '2.9';
String get testPackageLanguageVersion => '2.9';
Future<void> test_paren() async {
await _prepareCompletion('.par', '''
@ -609,7 +609,7 @@ f(expr) {
@reflectiveTest
class _ReturnTest extends PostfixCompletionTest {
@override
String? get testPackageLanguageVersion => '2.9';
String get testPackageLanguageVersion => '2.9';
Future<void> test_return() async {
await _prepareCompletion('.return', '''
@ -628,7 +628,7 @@ f(expr) {
@reflectiveTest
class _SwitchTest extends PostfixCompletionTest {
@override
String? get testPackageLanguageVersion => '2.9';
String get testPackageLanguageVersion => '2.9';
Future<void> test_return() async {
await _prepareCompletion('.switch', '''

View file

@ -605,10 +605,7 @@ class B extends A {}
String _configureForPackage_aaa() {
var aaaRootPath = '$workspaceRootPath/aaa';
writePackageConfig(
'$aaaRootPath/.dart_tool/package_config.json',
PackageConfigFileBuilder()..add(name: 'aaa', rootPath: aaaRootPath),
);
writePackageConfig(aaaRootPath, config: PackageConfigFileBuilder());
writeTestPackageConfig(
config: PackageConfigFileBuilder()

View file

@ -3,12 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../../analysis_server_base.dart';
import '../../utilities/mock_packages.dart';
@reflectiveTest
class FlutterBase extends PubPackageAnalysisServerTest {
@ -43,15 +41,9 @@ class FlutterBase extends PubPackageAnalysisServerTest {
newPubspecYamlFile(testPackageRootPath, '');
var metaLib = MockPackages.instance.addMeta(resourceProvider);
var flutterLib = MockPackages.instance.addFlutter(resourceProvider);
newPackageConfigJsonFile(
'/home/test',
(PackageConfigFileBuilder()
..add(name: 'test', rootPath: testPackageRootPath)
..add(name: 'meta', rootPath: metaLib.parent.path)
..add(name: 'flutter', rootPath: flutterLib.parent.path))
.toContent(toUriStr: toUriStr),
writeTestPackageConfig(
meta: true,
flutter: true,
);
await setRoots(included: [workspaceRootPath], excluded: []);

View file

@ -8,12 +8,10 @@ import 'package:analysis_server/protocol/protocol.dart';
import 'package:analysis_server/protocol/protocol_constants.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../analysis_server_base.dart';
import '../utilities/mock_packages.dart';
void main() {
defineReflectiveSuite(() {
@ -23,8 +21,6 @@ void main() {
@reflectiveTest
class FlutterNotificationOutlineTest extends PubPackageAnalysisServerTest {
late Folder flutterFolder;
final Completer<void> _outlineReceived = Completer();
late FlutterOutline outline;
@ -56,17 +52,11 @@ class FlutterNotificationOutlineTest extends PubPackageAnalysisServerTest {
@override
Future<void> setUp() async {
super.setUp();
writeTestPackageConfig(flutter: true);
await setRoots(included: [workspaceRootPath], excluded: []);
flutterFolder = MockPackages.instance.addFlutter(resourceProvider);
}
Future<void> test_children() async {
newPackageConfigJsonFile(
testPackageRootPath,
(PackageConfigFileBuilder()
..add(name: 'flutter', rootPath: flutterFolder.parent.path))
.toContent(toUriStr: toUriStr),
);
newAnalysisOptionsYamlFile(testPackageRootPath, '''
analyzer:
strong-mode: true

View file

@ -22,7 +22,7 @@ class AddLatePreNnbdTest extends FixProcessorTest {
FixKind get kind => DartFixKind.ADD_LATE;
@override
String? get testPackageLanguageVersion => '2.9';
String get testPackageLanguageVersion => '2.9';
Future<void> test_withFinal() async {
await resolveTestCode('''

View file

@ -22,7 +22,7 @@ class AddSwitchCaseBreakMultiTest extends FixProcessorTest {
FixKind get kind => DartFixKind.ADD_SWITCH_CASE_BREAK_MULTI;
@override
String? get testPackageLanguageVersion => '2.19';
String get testPackageLanguageVersion => '2.19';
Future<void> test_singleFile() async {
await resolveTestCode('''
@ -61,7 +61,7 @@ class AddSwitchCaseBreakTest extends FixProcessorTest {
FixKind get kind => DartFixKind.ADD_SWITCH_CASE_BREAK;
@override
String? get testPackageLanguageVersion => '2.19';
String get testPackageLanguageVersion => '2.19';
Future<void> test_sharedCaseBody() async {
await resolveTestCode('''

View file

@ -52,7 +52,7 @@ class ConvertToWhereTypeTest extends FixProcessorLintTest {
String get lintCode => LintNames.prefer_iterable_whereType;
@override
String? get testPackageLanguageVersion => '2.9';
String get testPackageLanguageVersion => '2.9';
Future<void> test_default_declaredType() async {
await resolveTestCode('''

View file

@ -22,7 +22,7 @@ class RemoveDuplicateCaseBulkTest extends BulkFixProcessorTest {
String get lintCode => LintNames.no_duplicate_case_values;
@override
String? get testPackageLanguageVersion => '2.19';
String get testPackageLanguageVersion => '2.19';
Future<void> test_singleFile() async {
await resolveTestCode('''
@ -65,7 +65,7 @@ class RemoveDuplicateCaseTest extends FixProcessorLintTest {
String get lintCode => LintNames.no_duplicate_case_values;
@override
String? get testPackageLanguageVersion => '2.19';
String get testPackageLanguageVersion => '2.19';
Future<void> test_fallThroughFromPrevious() async {
await resolveTestCode('''

View file

@ -23,9 +23,6 @@ class RemoveQuestionMarkBulkTest extends BulkFixProcessorTest {
String get lintCode =>
LintNames.unnecessary_nullable_for_final_variable_declarations;
@override
String get testPackageLanguageVersion => latestLanguageVersion;
Future<void> test_singleFile() async {
await resolveTestCode('''
class C {

View file

@ -21,7 +21,7 @@ class ReplaceColonWithEqualsDeprecatedTest extends FixProcessorTest {
FixKind get kind => DartFixKind.REPLACE_COLON_WITH_EQUALS;
@override
String get latestLanguageVersion => '2.19';
String get testPackageLanguageVersion => '2.19';
Future<void> test_defaultFormalParameter() async {
await resolveTestCode('''

View file

@ -6,6 +6,7 @@ import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
import 'package:analyzer_utilities/package_root.dart' as package_root;
import 'package:path/path.dart' as path;
void _cacheFiles(Map<String, String> cachedFiles) {
var resourceProvider = PhysicalResourceProvider.INSTANCE;
@ -77,56 +78,82 @@ class BlazeMockPackages {
}
/// Helper for copying files from "test/mock_packages" to memory file system.
class MockPackages {
static final MockPackages instance = MockPackages._();
mixin MockPackagesMixin<T extends ResourceProvider> {
/// The mapping from relative Posix paths of files to the file contents.
final Map<String, String> _cachedFiles = {};
///
/// `null` until the cache is first populated.
Map<String, String>? _cachedFiles;
MockPackages._() {
_cacheFiles(_cachedFiles);
}
/// The path to a folder where mock packages can be written.
String get packagesRootPath;
Folder addFlutter(MemoryResourceProvider provider) {
var packageFolder = _addFiles(provider, 'flutter');
path.Context get pathContext => resourceProvider.pathContext;
T get resourceProvider;
Folder addFlutter() {
var packageFolder = _addFiles('flutter');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addMeta(MemoryResourceProvider provider) {
var packageFolder = _addFiles(provider, 'meta');
Folder addMeta() {
var packageFolder = _addFiles('meta');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addPedantic(MemoryResourceProvider provider) {
var packageFolder = _addFiles(provider, 'pedantic');
Folder addPedantic() {
var packageFolder = _addFiles('pedantic');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addUI(MemoryResourceProvider provider) {
var packageFolder = _addFiles(provider, 'ui');
Folder addUI() {
var packageFolder = _addFiles('ui');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addVectorMath(MemoryResourceProvider provider) {
var packageFolder = _addFiles(provider, 'vector_math');
Folder addVectorMath() {
var packageFolder = _addFiles('vector_math');
return packageFolder.getChildAssumingFolder('lib');
}
/// Convert the given posix [path] to conform to this provider's path context.
///
/// This is a utility method for testing; paths passed in to other methods in
/// this class are never converted automatically.
String convertPath(String inputPath) {
// TODO(dantup): Copied from MemoryResourceProvider so it can be used by
// shared code that's also used in integration tests.
if (pathContext.style == path.windows.style) {
if (inputPath.startsWith(path.posix.separator)) {
inputPath = r'C:' + inputPath;
}
inputPath =
inputPath.replaceAll(path.posix.separator, path.windows.separator);
}
return inputPath;
}
/// Add files of the given [packageName] to the [provider].
Folder _addFiles(MemoryResourceProvider provider, String packageName) {
var packagesPath = provider.convertPath('/packages');
Folder _addFiles(String packageName) {
var cachedFiles = _cachedFiles;
if (cachedFiles == null) {
cachedFiles = {};
_cacheFiles(cachedFiles);
_cachedFiles = cachedFiles;
}
for (var entry in _cachedFiles.entries) {
for (var entry in cachedFiles.entries) {
var relativePosixPath = entry.key;
var relativePathComponents = relativePosixPath.split('/');
if (relativePathComponents[0] == packageName) {
var relativePath = provider.pathContext.joinAll(relativePathComponents);
var path = provider.pathContext.join(packagesPath, relativePath);
provider.newFile(path, entry.value);
var relativePath = pathContext.joinAll(relativePathComponents);
var path = convertPath('$packagesRootPath/$relativePath');
resourceProvider.getFile(path).writeAsStringSync(entry.value);
}
}
var packagesFolder = provider.getFolder(packagesPath);
var packagesFolder =
resourceProvider.getFolder(convertPath(packagesRootPath));
return packagesFolder.getChildAssumingFolder(packageName);
}
}

View file

@ -2,81 +2,98 @@
// 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/file_system/file_system.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/test_utilities/package_config_file_builder.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/package_root.dart' as package_root;
import '../src/utilities/mock_packages.dart';
mixin ConfigurationFilesMixin on ResourceProviderMixin {
/// A mixin adding functionality to write `.dart_tool/package_config.json`
/// files along with mock packages to a [ResourceProvider].
mixin ConfigurationFilesMixin<T extends ResourceProvider>
on MockPackagesMixin<T> {
String get latestLanguageVersion =>
'${ExperimentStatus.currentVersion.major}.'
'${ExperimentStatus.currentVersion.minor}';
String get testPackageLanguageVersion => latestLanguageVersion;
/// The path to the test package being used for testing.
String get testPackageRootPath;
String toUriStr(String filePath) =>
pathContext.toUri(convertPath(filePath)).toString();
/// Writes a package_config.json for the package at [projectFolderPath]. If
/// [packageName] is not supplied, the last segment of [projectFolderPath] is
/// used.
void writePackageConfig(
String projectFolderPath, {
// The name of this package. If not provided, the last segment of the path
// will be used.
String? packageName,
PackageConfigFileBuilder? config,
String? languageVersion,
bool flutter = false,
bool meta = false,
bool pedantic = false,
bool vector_math = false,
// TODO(dantup): Remove this flag when we no longer need to copy packages
// for macro support.
bool temporaryMacroSupport = false,
bool macro = false,
}) {
projectFolderPath = convertPath(projectFolderPath);
if (config == null) {
config = PackageConfigFileBuilder();
} else {
config = config.copy();
}
// Add this package to its own config.
config.add(
name: 'test',
name: packageName ?? pathContext.basename(projectFolderPath),
rootPath: projectFolderPath,
languageVersion: languageVersion ?? testPackageLanguageVersion,
);
if (meta || flutter) {
var libFolder = MockPackages.instance.addMeta(resourceProvider);
var libFolder = addMeta();
config.add(name: 'meta', rootPath: libFolder.parent.path);
}
if (flutter) {
{
var libFolder = MockPackages.instance.addUI(resourceProvider);
var libFolder = addUI();
config.add(name: 'ui', rootPath: libFolder.parent.path);
}
{
var libFolder = MockPackages.instance.addFlutter(resourceProvider);
var libFolder = addFlutter();
config.add(name: 'flutter', rootPath: libFolder.parent.path);
}
}
if (pedantic) {
var libFolder = MockPackages.instance.addPedantic(resourceProvider);
var libFolder = addPedantic();
config.add(name: 'pedantic', rootPath: libFolder.parent.path);
}
if (vector_math) {
var libFolder = MockPackages.instance.addVectorMath(resourceProvider);
var libFolder = addVectorMath();
config.add(name: 'vector_math', rootPath: libFolder.parent.path);
}
if (temporaryMacroSupport) {
final testPackagesRootPath = resourceProvider.convertPath('/packages');
if (macro) {
// TODO(dantup): This code may need to change/be removed depending on how
// we ultimately reference the macro packages/libraries.
final physical = PhysicalResourceProvider.INSTANCE;
final packageRoot =
physical.pathContext.normalize(package_root.packageRoot);
// Copy _fe_analyzer_shared from local SDK into the memory FS.
final testSharedFolder =
getFolder('$testPackagesRootPath/_fe_analyzer_shared');
// Copy _fe_analyzer_shared from local SDK into the resource provider.
final testSharedFolder = resourceProvider
.getFolder(convertPath('$packagesRootPath/_fe_analyzer_shared'));
physical
.getFolder(packageRoot)
.getChildAssumingFolder('_fe_analyzer_shared/lib/src/macros')
@ -84,8 +101,8 @@ mixin ConfigurationFilesMixin on ResourceProviderMixin {
config.add(name: '_fe_analyzer_shared', rootPath: testSharedFolder.path);
// Copy dart_internal from local SDK into the memory FS.
final testInternalFolder =
getFolder('$testPackagesRootPath/dart_internal');
final testInternalFolder = resourceProvider
.getFolder(convertPath('$packagesRootPath/dart_internal'));
physical
.getFolder(packageRoot)
.getChildAssumingFolder('dart_internal')
@ -93,7 +110,46 @@ mixin ConfigurationFilesMixin on ResourceProviderMixin {
config.add(name: 'dart_internal', rootPath: testInternalFolder.path);
}
newPackageConfigJsonFile(
projectFolderPath, config.toContent(toUriStr: toUriStr));
_newPackageConfigJsonFile(
projectFolderPath,
config.toContent(toUriStr: toUriStr),
);
}
/// Writes a package_config.json for the package under test (considered
/// 'package:test') that lives in [testPackageRootPath].
void writeTestPackageConfig({
PackageConfigFileBuilder? config,
String? languageVersion,
bool flutter = false,
bool meta = false,
bool pedantic = false,
bool vector_math = false,
bool macro = false,
}) {
writePackageConfig(
testPackageRootPath,
config: config,
languageVersion: languageVersion,
packageName: 'test',
flutter: flutter,
meta: meta,
pedantic: pedantic,
vector_math: vector_math,
macro: macro,
);
}
File _newPackageConfigJsonFile(String packageRootPath, String content) {
var dartToolDirectoryPath = pathContext.join(
packageRootPath,
file_paths.dotDartTool,
);
var filePath = pathContext.join(
dartToolDirectoryPath,
file_paths.packageConfigJson,
);
resourceProvider.getFolder(dartToolDirectoryPath).create();
return resourceProvider.getFile(filePath)..writeAsStringSync(content);
}
}

View file

@ -24,11 +24,11 @@ void main() {
}
}
PhysicalResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
PhysicalResourceProvider _resourceProvider = PhysicalResourceProvider.INSTANCE;
/// Returns the path to the file containing the status information.
String statusFilePath() {
var pathContext = resourceProvider.pathContext;
var pathContext = _resourceProvider.pathContext;
var packageRoot = pathContext.normalize(package_root.packageRoot);
return pathContext.join(packageRoot, 'analysis_server', 'lib', 'src',
'services', 'correction', 'error_fix_status.yaml');
@ -117,7 +117,7 @@ String? verifyErrorFixStatus() {
/// Returns the content of the file containing the status information, parsed
/// as a YAML map.
(String? error, YamlMap? info) _statusInfo() {
var statusFile = resourceProvider.getFile(statusFilePath());
var statusFile = _resourceProvider.getFile(statusFilePath());
var document = loadYamlDocument(statusFile.readAsStringSync());
var statusInfo = document.contents;
if (statusInfo is! YamlMap) {