Version 2.11.0-271.0.dev
Merge commit '7d764a6b3ab8fd732c7020c95a1950de644c2ae5' into 'dev'
diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml
index 0ba93d6..f763f70 100644
--- a/pkg/analyzer_plugin/pubspec.yaml
+++ b/pkg/analyzer_plugin/pubspec.yaml
@@ -16,6 +16,7 @@
analysis_tool:
path: ../analysis_tool
html: '>=0.13.1 <0.15.0'
+ meta: '^1.1.8'
path: '^1.4.1'
test_reflective_loader: ^0.1.8
test: ^1.0.0
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index 3ff7be2..6d37cfe 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -9,6 +9,7 @@
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/test_utilities/find_node.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart'
show DartLinkedEditBuilderImpl;
@@ -20,7 +21,8 @@
void main() {
defineReflectiveSuite(() {
- defineReflectiveTests(DartEditBuilderImplTest);
+ defineReflectiveTests(DartEditBuilderImpl_PreNullSafetyTest);
+ defineReflectiveTests(DartEditBuilderImpl_WithNullSafetyTest);
defineReflectiveTests(DartFileEditBuilderImplTest);
defineReflectiveTests(DartLinkedEditBuilderImplTest);
defineReflectiveTests(ImportLibraryTest);
@@ -29,10 +31,96 @@
}
@reflectiveTest
+class DartEditBuilderImpl_PreNullSafetyTest extends DartEditBuilderImplTest {
+ Future<void> test_writeParameter_covariantAndRequired() async {
+ var path = convertPath('$testPackageRootPath/lib/test.dart');
+ var content = 'class A {}';
+ addSource(path, content);
+
+ var builder = newBuilder();
+ await builder.addDartFileEdit(path, (builder) {
+ builder.addInsertion(content.length - 1, (builder) {
+ builder.writeParameter('a', isCovariant: true, isRequiredNamed: true);
+ });
+ });
+ var edits = getEdits(builder);
+ expect(edits, hasLength(2));
+ expect(edits[0].replacement,
+ equalsIgnoringWhitespace('covariant @required a'));
+ expect(edits[1].replacement,
+ equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
+ }
+
+ Future<void> test_writeParameter_required_addImport() async {
+ var path = convertPath('$testPackageRootPath/lib/test.dart');
+ var content = 'class A {}';
+ addSource(path, content);
+
+ var builder = newBuilder();
+ await builder.addDartFileEdit(path, (builder) {
+ builder.addInsertion(content.length - 1, (builder) {
+ builder.writeParameter('a', isRequiredNamed: true);
+ });
+ });
+ var edits = getEdits(builder);
+ expect(edits, hasLength(2));
+ expect(edits[0].replacement, equalsIgnoringWhitespace('@required a'));
+ expect(edits[1].replacement,
+ equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
+ }
+
+ Future<void> test_writeParameter_required_existingImport() async {
+ var path = convertPath('$testPackageRootPath/lib/test.dart');
+ var content = '''
+import 'package:meta/meta.dart';
+
+class A {}
+''';
+ addSource(path, content);
+
+ var builder = newBuilder();
+ await builder.addDartFileEdit(path, (builder) {
+ builder.addInsertion(content.length - 1, (builder) {
+ builder.writeParameter('a', isRequiredNamed: true);
+ });
+ });
+ var edit = getEdit(builder);
+ expect(edit.replacement, equalsIgnoringWhitespace('@required a'));
+ }
+}
+
+@reflectiveTest
+class DartEditBuilderImpl_WithNullSafetyTest extends DartEditBuilderImplTest
+ with WithNullSafetyMixin {
+ Future<void> test_writeParameter_required_keyword() async {
+ var path = convertPath('$testPackageRootPath/lib/test.dart');
+ var content = 'class A {}';
+ addSource(path, content);
+
+ var builder = newBuilder();
+ await builder.addDartFileEdit(path, (builder) {
+ builder.addInsertion(content.length - 1, (builder) {
+ builder.writeParameter('a', isRequiredNamed: true);
+ });
+ });
+ var edit = getEdit(builder);
+ expect(edit.replacement, equalsIgnoringWhitespace('required a'));
+ }
+}
+
class DartEditBuilderImplTest extends AbstractContextTest
with DartChangeBuilderMixin {
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ config: PackageConfigFileBuilder(),
+ meta: true,
+ );
+ }
+
Future<void> test_writeClassDeclaration_interfaces() async {
- var path = convertPath('/home/test/lib/test.dart');
+ var path = convertPath('$testPackageRootPath/lib/test.dart');
addSource(path, 'class A {}');
DartType typeA = await _getType(path, 'A');
@@ -604,7 +692,7 @@
}''';
addSource(path, content);
- await driver.getResult(path);
+ await resolveFile(path);
var builder = newBuilder();
await builder.addDartFileEdit(path, (builder) {
@@ -625,7 +713,7 @@
}''';
addSource(path, content);
- await driver.getResult(path);
+ await resolveFile(path);
var builder = newBuilder();
await builder.addDartFileEdit(path, (builder) {
@@ -651,7 +739,7 @@
}''';
addSource(path, content);
- await driver.getResult(path);
+ await resolveFile(path);
var builder = newBuilder();
await builder.addDartFileEdit(path, (builder) {
@@ -671,7 +759,7 @@
}''';
addSource(path, content);
- await driver.getResult(path);
+ await resolveFile(path);
var builder = newBuilder();
await builder.addDartFileEdit(path, (builder) {
@@ -691,7 +779,7 @@
}
class MyClass {}''';
addSource(path, content);
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var A = unit.declarations[1] as ClassDeclaration;
@@ -722,7 +810,7 @@
}
class MyClass {}''';
addSource(path, content);
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var A = unit.declarations[1] as ClassDeclaration;
@@ -758,7 +846,7 @@
}
class MyClass {}''';
addSource(path, content);
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var A = unit.declarations[1] as ClassDeclaration;
@@ -902,79 +990,6 @@
expect(edit.replacement, equalsIgnoringWhitespace('covariant a'));
}
- Future<void> test_writeParameter_covariantAndRequired() async {
- var path = convertPath('/home/test/lib/test.dart');
- var content = 'class A {}';
- addSource(path, content);
-
- var builder = newBuilder();
- await builder.addDartFileEdit(path, (builder) {
- builder.addInsertion(content.length - 1, (builder) {
- builder.writeParameter('a', isCovariant: true, isRequiredNamed: true);
- });
- });
- var edits = getEdits(builder);
- expect(edits, hasLength(2));
- expect(edits[0].replacement,
- equalsIgnoringWhitespace('covariant @required a'));
- expect(edits[1].replacement,
- equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
- }
-
- Future<void> test_writeParameter_required_addImport() async {
- var path = convertPath('/home/test/lib/test.dart');
- var content = 'class A {}';
- addSource(path, content);
-
- var builder = newBuilder();
- await builder.addDartFileEdit(path, (builder) {
- builder.addInsertion(content.length - 1, (builder) {
- builder.writeParameter('a', isRequiredNamed: true);
- });
- });
- var edits = getEdits(builder);
- expect(edits, hasLength(2));
- expect(edits[0].replacement, equalsIgnoringWhitespace('@required a'));
- expect(edits[1].replacement,
- equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
- }
-
- Future<void> test_writeParameter_required_existingImport() async {
- addMetaPackage();
- var path = convertPath('/home/test/lib/test.dart');
- var content = '''
-import 'package:meta/meta.dart';
-
-class A {}
-''';
- addSource(path, content);
-
- var builder = newBuilder();
- await builder.addDartFileEdit(path, (builder) {
- builder.addInsertion(content.length - 1, (builder) {
- builder.writeParameter('a', isRequiredNamed: true);
- });
- });
- var edit = getEdit(builder);
- expect(edit.replacement, equalsIgnoringWhitespace('@required a'));
- }
-
- Future<void> test_writeParameter_required_keyword() async {
- createAnalysisOptionsFile(experiments: ['non-nullable']);
- var path = convertPath('/home/test/lib/test.dart');
- var content = 'class A {}';
- addSource(path, content);
-
- var builder = newBuilder();
- await builder.addDartFileEdit(path, (builder) {
- builder.addInsertion(content.length - 1, (builder) {
- builder.writeParameter('a', isRequiredNamed: true);
- });
- });
- var edit = getEdit(builder);
- expect(edit.replacement, equalsIgnoringWhitespace('required a'));
- }
-
Future<void> test_writeParameter_type() async {
var path = convertPath('/home/test/lib/test.dart');
var content = 'class A {}';
@@ -1001,7 +1016,7 @@
class A {}
''';
addSource(path, content);
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var g = unit.declarations[1] as FunctionDeclaration;
var body = g.functionExpression.body as BlockFunctionBody;
var statement = body.block.statements[0] as ExpressionStatement;
@@ -1023,7 +1038,7 @@
var content = 'f(int a, {bool b = false, String c}) {}';
addSource(path, content);
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var f = unit.declarations[0] as FunctionDeclaration;
var parameters = f.functionExpression.parameters;
var elements = parameters.parameters.map((p) => p.declaredElement);
@@ -1043,7 +1058,7 @@
var path = convertPath('/home/test/lib/test.dart');
var content = 'f(int a, [bool b = false, String c]) {}';
addSource(path, content);
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var f = unit.declarations[0] as FunctionDeclaration;
var parameters = f.functionExpression.parameters;
var elements = parameters.parameters.map((p) => p.declaredElement);
@@ -1063,7 +1078,7 @@
var path = convertPath('/home/test/lib/test.dart');
var content = 'f(int i, String s) {}';
addSource(path, content);
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var f = unit.declarations[0] as FunctionDeclaration;
var parameters = f.functionExpression.parameters;
var elements = parameters.parameters.map((p) => p.declaredElement);
@@ -1085,7 +1100,7 @@
g(s, index: i);
}''';
addSource(path, content);
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var f = unit.declarations[0] as FunctionDeclaration;
var body = f.functionExpression.body as BlockFunctionBody;
var statement = body.block.statements[0] as ExpressionStatement;
@@ -1108,7 +1123,7 @@
g(s, i);
}''';
addSource(path, content);
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var f = unit.declarations[0] as FunctionDeclaration;
var body = f.functionExpression.body as BlockFunctionBody;
var statement = body.block.statements[0] as ExpressionStatement;
@@ -1125,14 +1140,14 @@
}
Future<void> test_writeReference_method() async {
- var aPath = convertPath('/a.dart');
+ var aPath = convertPath('$testPackageRootPath/a.dart');
addSource(aPath, r'''
class A {
void foo() {}
}
''');
- var path = convertPath('/home/test/lib/test.dart');
+ var path = convertPath('$testPackageRootPath/lib/test.dart');
var content = r'''
import 'a.dart';
''';
@@ -1152,10 +1167,10 @@
}
Future<void> test_writeReference_topLevel_hasImport_noPrefix() async {
- var aPath = convertPath('/home/test/lib/a.dart');
+ var aPath = convertPath('$testPackageRootPath/lib/a.dart');
addSource(aPath, 'const a = 42;');
- var path = convertPath('/home/test/lib/test.dart');
+ var path = convertPath('$testPackageRootPath/lib/test.dart');
var content = r'''
import 'a.dart';
''';
@@ -1301,7 +1316,7 @@
var path = convertPath('/home/test/lib/test.dart');
var content = 'class A {}';
addSource(path, content);
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var builder = newBuilder();
await builder.addDartFileEdit(path, (builder) {
@@ -1514,7 +1529,7 @@
var path = convertPath('/home/test/lib/test.dart');
var content = 'class A {}';
addSource(path, content);
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var builder = newBuilder();
await builder.addDartFileEdit(path, (builder) {
@@ -1665,14 +1680,14 @@
}
Future<ClassElement> _getClassElement(String path, String name) async {
- var result = await driver.getUnitElement(path);
- return result.element.getType(name);
+ var result = (await resolveFile(path))?.unit;
+ return result.declaredElement.getType(name);
}
Future<PropertyAccessorElement> _getTopLevelAccessorElement(
String path, String name) async {
- var result = await driver.getUnitElement(path);
- return result.element.accessors.firstWhere((v) => v.name == name);
+ var result = (await resolveFile(path))?.unit;
+ return result.declaredElement.accessors.firstWhere((v) => v.name == name);
}
Future<InterfaceType> _getType(
@@ -1695,7 +1710,7 @@
var path = convertPath('/home/test/lib/test.dart');
addSource(path, '''var f = () {}''');
- var resolvedUnit = await driver.getResult(path);
+ var resolvedUnit = await resolveFile(path);
var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
var body = findNode.functionBody('{}');
@@ -1712,7 +1727,7 @@
var path = convertPath('/home/test/lib/test.dart');
addSource(path, 'String f() {}');
- var resolvedUnit = await driver.getResult(path);
+ var resolvedUnit = await resolveFile(path);
var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
var body = findNode.functionBody('{}');
@@ -1825,7 +1840,7 @@
var path = convertPath('/home/test/lib/test.dart');
addSource(path, 'String f() {}');
- var resolvedUnit = await driver.getResult(path);
+ var resolvedUnit = await resolveFile(path);
var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
var type = findNode.typeAnnotation('String');
@@ -1848,7 +1863,7 @@
class B extends A {}
class C extends B {}
''');
- var unit = (await driver.getResult(path))?.unit;
+ var unit = (await resolveFile(path))?.unit;
var classC = unit.declarations[2] as ClassDeclaration;
var builder = DartLinkedEditBuilderImpl(null);
builder.addSuperTypesAsSuggestions(
@@ -2869,12 +2884,12 @@
ClassElement targetElement;
{
- var unitResult = await driver.getUnitElement(path);
+ var unitResult = (await resolveFile(path))?.unit;
if (targetMixinName != null) {
- targetElement = unitResult.element.mixins
+ targetElement = unitResult.declaredElement.mixins
.firstWhere((e) => e.name == targetMixinName);
} else {
- targetElement = unitResult.element.types
+ targetElement = unitResult.declaredElement.types
.firstWhere((e) => e.name == targetClassName);
}
}
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
index 8b94108..6970a80 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
@@ -676,9 +676,9 @@
Future<void> test_MapLiteral_expression() async {
super.setUp();
- final experimentStatus =
- (driver.analysisOptions as analyzer.AnalysisOptionsImpl)
- .experimentStatus;
+ final experimentStatus = (driverFor(testPackageRootPath).analysisOptions
+ as analyzer.AnalysisOptionsImpl)
+ .experimentStatus;
if (experimentStatus.control_flow_collections ||
experimentStatus.spread_collections) {
// SimpleIdentifier MapLiteral VariableDeclaration
@@ -974,7 +974,7 @@
var path = convertPath('/home/test/lib/test.dart');
newFile(path, content: content);
- var result = await driver.getResult(path);
+ var result = await resolveFile(path);
findElement = FindElement(result.unit);
target = CompletionTarget.forOffset(result.unit, offset);
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
index 7fc0527..4703fda 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
@@ -48,7 +48,7 @@
//
// Compute the OpType.
//
- var resolvedUnit = await driver.getResult(testPath);
+ var resolvedUnit = await resolveFile(testPath);
var completionTarget =
CompletionTarget.forOffset(resolvedUnit.unit, completionOffset);
var opType = OpType.forCompletion(completionTarget, completionOffset);
@@ -102,7 +102,7 @@
@override
void setUp() {
super.setUp();
- testPath = convertPath('/completionTest.dart');
+ testPath = convertPath('$testPackageRootPath/completionTest.dart');
}
}
diff --git a/pkg/analyzer_plugin/test/support/abstract_context.dart b/pkg/analyzer_plugin/test/support/abstract_context.dart
index 4421f8c..e2e289b 100644
--- a/pkg/analyzer_plugin/test/support/abstract_context.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_context.dart
@@ -2,19 +2,27 @@
// 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/analysis_context.dart';
+import 'package:analyzer/dart/analysis/analysis_context_collection.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/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/visitor.dart';
-import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
-import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
import 'package:analyzer/src/generated/source_io.dart';
import 'package:analyzer/src/generated/testing/element_search.dart';
+import 'package:analyzer/src/test_utilities/mock_packages.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:meta/meta.dart';
/// Finds an [Element] with the given [name].
Element findChildElement(Element root, String name, [ElementKind kind]) {
@@ -35,49 +43,43 @@
typedef _ElementVisitorFunction = void Function(Element element);
class AbstractContextTest with ResourceProviderMixin {
- AnalysisDriver _driver;
+ final ByteStore _byteStore = MemoryByteStore();
- /// The file system specific `/home/test/analysis_options.yaml` path.
- String get analysisOptionsPath =>
- convertPath('/home/test/analysis_options.yaml');
+ final Map<String, String> _declaredVariables = {};
- AnalysisDriver get driver => _driver;
+ AnalysisContextCollection _analysisContextCollection;
- AnalysisSession get session => driver.currentSession;
+ List<String> get collectionIncludedPaths => [workspaceRootPath];
- /// The file system specific `/home/test/pubspec.yaml` path.
- String get testPubspecPath => convertPath('/home/test/pubspec.yaml');
+ AnalysisSession get session => contextFor(testPackageRootPath).currentSession;
- void addMetaPackage() {
- addPackageFile('meta', 'meta.dart', r'''
-library meta;
+ /// The file system-specific `analysis_options.yaml` path.
+ String get testPackageAnalysisOptionsPath =>
+ convertPath('$testPackageRootPath/analysis_options.yaml');
-const Required required = const Required();
+ String get testPackageLanguageVersion => '2.9';
-class Required {
- final String reason;
- const Required([this.reason]);
-}
-''');
- }
+ /// The file system-specific `pubspec.yaml` path.
+ String get testPackagePubspecPath =>
+ convertPath('$testPackageRootPath/pubspec.yaml');
- /// Add a new file with the given [pathInLib] to the package with the
- /// given [packageName]. Then ensure that the test package depends on the
- /// [packageName].
- File addPackageFile(String packageName, String pathInLib, String content) {
- var packagePath = '/.pub-cache/$packageName';
- _addTestPackageDependency(packageName, packagePath);
- return newFile('$packagePath/lib/$pathInLib', content: content);
- }
+ String get testPackageRootPath => convertPath('/home/test');
+
+ String get workspaceRootPath => convertPath('/home');
Source addSource(String path, String content, [Uri uri]) {
var file = newFile(path, content: content);
var source = file.createSource(uri);
- driver.addFile(file.path);
- driver.changeFile(file.path);
return source;
}
+ AnalysisContext contextFor(String path) {
+ _createAnalysisContexts();
+
+ path = convertPath(path);
+ return _analysisContextCollection.contextFor(path);
+ }
+
/// Create an analysis options file based on the given arguments.
void createAnalysisOptionsFile({List<String> experiments}) {
var buffer = StringBuffer();
@@ -90,11 +92,12 @@
}
}
- newFile(analysisOptionsPath, content: buffer.toString());
+ newFile(testPackageAnalysisOptionsPath, content: buffer.toString());
+ }
- if (_driver != null) {
- _createDriver();
- }
+ AnalysisDriver driverFor(String path) {
+ var context = contextFor(path) as DriverBasedAnalysisContext;
+ return context.driver;
}
Element findElementInUnit(CompilationUnit unit, String name,
@@ -104,53 +107,89 @@
.single;
}
- Future<CompilationUnit> resolveLibraryUnit(Source source) async {
- return (await driver.getResult(source.fullName))?.unit;
+ Future<ResolvedUnitResult> resolveFile(String path) async {
+ return contextFor(path).currentSession.getResolvedUnit(path);
}
void setUp() {
MockSdk(resourceProvider: resourceProvider);
- newFolder('/home/test');
- newFile('/home/test/.packages', content: '''
-test:${toUriStr('/home/test/lib')}
-''');
-
- _createDriver();
+ newFolder(testPackageRootPath);
+ writeTestPackageConfig();
}
void tearDown() {
AnalysisEngine.instance.clearCaches();
}
- void _addTestPackageDependency(String name, String rootPath) {
- var packagesFile = getFile('/home/test/.packages');
- var packagesContent = packagesFile.readAsStringSync();
+ void writePackageConfig(String path, PackageConfigFileBuilder config) {
+ newFile(path, content: config.toContent(toUriStr: toUriStr));
+ }
- // Ignore if there is already the same package dependency.
- if (packagesContent.contains('$name:file://')) {
+ void writeTestPackageConfig({
+ PackageConfigFileBuilder config,
+ String languageVersion,
+ bool meta = false,
+ }) {
+ if (config == null) {
+ config = PackageConfigFileBuilder();
+ } else {
+ config = config.copy();
+ }
+
+ config.add(
+ name: 'test',
+ rootPath: testPackageRootPath,
+ languageVersion: languageVersion ?? testPackageLanguageVersion,
+ );
+
+ if (meta) {
+ var metaPath = '/packages/meta';
+ MockPackages.addMetaPackageFiles(
+ getFolder(metaPath),
+ );
+ config.add(name: 'meta', rootPath: metaPath);
+ }
+
+ var path = '$testPackageRootPath/.dart_tool/package_config.json';
+ writePackageConfig(path, config);
+ }
+
+ /// Create all analysis contexts in [collectionIncludedPaths].
+ void _createAnalysisContexts() {
+ if (_analysisContextCollection != null) {
return;
}
- packagesContent += '$name:${toUri('$rootPath/lib')}\n';
-
- packagesFile.writeAsStringSync(packagesContent);
-
- _createDriver();
- }
-
- void _createDriver() {
- var collection = AnalysisContextCollectionImpl(
- includedPaths: [convertPath('/home')],
+ _analysisContextCollection = AnalysisContextCollectionImpl(
+ byteStore: _byteStore,
+ declaredVariables: _declaredVariables,
enableIndex: true,
+ includedPaths: collectionIncludedPaths.map(convertPath).toList(),
resourceProvider: resourceProvider,
sdkPath: convertPath('/sdk'),
);
+ }
+}
- var testPath = convertPath('/home/test');
- var context = collection.contextFor(testPath) as DriverBasedAnalysisContext;
+mixin WithNullSafetyMixin on AbstractContextTest {
+ @override
+ String get testPackageLanguageVersion =>
+ Feature.non_nullable.isEnabledByDefault ? '2.12' : '2.11';
- _driver = context.driver;
+ bool get withPackageMeta => false;
+
+ /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43837
+ /// Remove when Null Safety is enabled by default.
+ @nonVirtual
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ languageVersion: testPackageLanguageVersion,
+ meta: withPackageMeta,
+ );
+ createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
}
}
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index 94560b0..4a8ea64 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -94,7 +94,7 @@
Future<void> resolveTestUnit(String code) async {
addTestSource(code);
- var result = await driver.getResult(testFile);
+ var result = await resolveFile(testFile);
testUnit = (result).unit;
if (verifyNoTestUnitErrors) {
expect(result.errors.where((AnalysisError error) {
@@ -114,6 +114,6 @@
@override
void setUp() {
super.setUp();
- testFile = convertPath('/test.dart');
+ testFile = convertPath('$testPackageRootPath/test.dart');
}
}
diff --git a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
index 681f5a4..5d75ed1 100644
--- a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
@@ -72,7 +72,7 @@
void setUp() {
super.setUp();
source = newFile('/foo/bar.dart').createSource();
- testFile = convertPath('/test.dart');
+ testFile = convertPath('$testPackageRootPath/lib/test.dart');
}
void test_convertAnalysisError_contextMessages() {
@@ -200,11 +200,11 @@
}
Future<void> test_convertElement_class() async {
- var source = addSource(testFile, '''
+ addSource(testFile, '''
@deprecated
abstract class _A {}
class B<K, V> {}''');
- var unit = await resolveLibraryUnit(source);
+ var unit = (await resolveFile(testFile))?.unit;
{
var engineElement =
findElementInUnit(unit, '_A') as analyzer.ClassElement;
@@ -240,11 +240,11 @@
}
Future<void> test_convertElement_constructor() async {
- var source = addSource(testFile, '''
+ addSource(testFile, '''
class A {
const A.myConstructor(int a, [String b]);
}''');
- var unit = await resolveLibraryUnit(source);
+ var unit = (await resolveFile(testFile))?.unit;
var engineElement =
findElementInUnit(unit, 'myConstructor') as analyzer.ConstructorElement;
// create notification Element
@@ -278,11 +278,11 @@
}
Future<void> test_convertElement_enum() async {
- var source = addSource(testFile, '''
+ addSource(testFile, '''
@deprecated
enum _E1 { one, two }
enum E2 { three, four }''');
- var unit = await resolveLibraryUnit(source);
+ var unit = (await resolveFile(testFile))?.unit;
{
var engineElement =
findElementInUnit(unit, '_E1') as analyzer.ClassElement;
@@ -319,11 +319,11 @@
}
Future<void> test_convertElement_enumConstant() async {
- var source = addSource(testFile, '''
+ addSource(testFile, '''
@deprecated
enum _E1 { one, two }
enum E2 { three, four }''');
- var unit = await resolveLibraryUnit(source);
+ var unit = (await resolveFile(testFile))?.unit;
{
var engineElement =
findElementInUnit(unit, 'one') as analyzer.FieldElement;
@@ -410,11 +410,11 @@
}
Future<void> test_convertElement_field() async {
- var source = addSource(testFile, '''
+ addSource(testFile, '''
class A {
static const myField = 42;
}''');
- var unit = await resolveLibraryUnit(source);
+ var unit = (await resolveFile(testFile))?.unit;
var engineElement =
findElementInUnit(unit, 'myField') as analyzer.FieldElement;
// create notification Element
@@ -436,10 +436,10 @@
}
Future<void> test_convertElement_functionTypeAlias() async {
- var source = addSource(testFile, '''
+ addSource(testFile, '''
typedef int F<T>(String x);
''');
- var unit = await resolveLibraryUnit(source);
+ var unit = (await resolveFile(testFile))?.unit;
var engineElement =
findElementInUnit(unit, 'F') as analyzer.FunctionTypeAliasElement;
// create notification Element
@@ -461,10 +461,10 @@
}
Future<void> test_convertElement_genericTypeAlias_function() async {
- var source = addSource(testFile, '''
+ addSource(testFile, '''
typedef F<T> = int Function(String x);
''');
- var unit = await resolveLibraryUnit(source);
+ var unit = (await resolveFile(testFile))?.unit;
var engineElement =
findElementInUnit(unit, 'F') as analyzer.FunctionTypeAliasElement;
// create notification Element
@@ -486,11 +486,11 @@
}
Future<void> test_convertElement_getter() async {
- var source = addSource(testFile, '''
+ addSource(testFile, '''
class A {
String get myGetter => 42;
}''');
- var unit = await resolveLibraryUnit(source);
+ var unit = (await resolveFile(testFile))?.unit;
var engineElement =
findElementInUnit(unit, 'myGetter', analyzer.ElementKind.GETTER)
as analyzer.PropertyAccessorElement;
@@ -512,13 +512,13 @@
}
Future<void> test_convertElement_method() async {
- var source = addSource(testFile, '''
+ addSource(testFile, '''
class A {
static List<String> myMethod(int a, {String b, int c}) {
return null;
}
}''');
- var unit = await resolveLibraryUnit(source);
+ var unit = (await resolveFile(testFile))?.unit;
var engineElement =
findElementInUnit(unit, 'myMethod') as analyzer.MethodElement;
// create notification Element
@@ -539,11 +539,11 @@
}
Future<void> test_convertElement_setter() async {
- var source = addSource(testFile, '''
+ addSource(testFile, '''
class A {
set mySetter(String x) {}
}''');
- var unit = await resolveLibraryUnit(source);
+ var unit = (await resolveFile(testFile))?.unit;
var engineElement =
findElementInUnit(unit, 'mySetter', analyzer.ElementKind.SETTER)
as analyzer.PropertyAccessorElement;
@@ -615,14 +615,14 @@
}
Future<void> test_fromElement_LABEL() async {
- var source = addSource(testFile, '''
+ addSource(testFile, '''
main() {
myLabel:
while (true) {
break myLabel;
}
}''');
- var unit = await resolveLibraryUnit(source);
+ var unit = (await resolveFile(testFile))?.unit;
var engineElement =
findElementInUnit(unit, 'myLabel') as analyzer.LabelElement;
// create notification Element
diff --git a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
index f780177..b1992c4 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
@@ -409,11 +409,11 @@
}
Future<void> computeLibrariesContaining() {
- return driver.getResult(testFile).then((result) => null);
+ return resolveFile(testFile).then((result) => null);
}
Future computeSuggestions() async {
- var result = await driver.getResult(testFile);
+ var result = await resolveFile(testFile);
testSource = result.unit.declaredElement.source;
request =
DartCompletionRequestImpl(resourceProvider, completionOffset, result);
diff --git a/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
index 927b5b3..49d103d 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.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:analyzer/src/test_utilities/package_config_file_builder.dart';
import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
import 'package:analyzer_plugin/utilities/completion/inherited_reference_contributor.dart';
import 'package:test/test.dart';
@@ -25,9 +26,17 @@
return InheritedReferenceContributor();
}
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ config: PackageConfigFileBuilder(),
+ meta: true,
+ );
+ }
+
/// Sanity check. Permutations tested in local_ref_contributor.
Future<void> test_ArgDefaults_inherited_method_with_required_named() async {
- addMetaPackage();
resolveSource('/home/test/lib/b.dart', '''
import 'package:meta/meta.dart';
diff --git a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
index 186ce86..c268c4e 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.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:analyzer/src/test_utilities/package_config_file_builder.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
import 'package:analyzer_plugin/utilities/completion/relevance.dart';
@@ -53,6 +54,16 @@
return TypeMemberContributor();
}
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ config: PackageConfigFileBuilder()
+ ..add(name: 'myBar', rootPath: '$workspaceRootPath/myBar'),
+ meta: true,
+ );
+ }
+
Future<void> test_ArgDefaults_method() async {
addTestSource('''
class A {
@@ -78,7 +89,6 @@
}
Future<void> test_ArgDefaults_method_with_optional_positional() async {
- addMetaPackage();
addTestSource('''
import 'package:meta/meta.dart';
@@ -93,7 +103,6 @@
}
Future<void> test_ArgDefaults_method_with_required_named() async {
- addMetaPackage();
addTestSource('''
import 'package:meta/meta.dart';
@@ -1075,10 +1084,10 @@
}
Future<void> test_Block_unimported() async {
- addPackageFile('myBar', 'bar.dart', 'class Foo2 { Foo2() { } }');
+ newFile('$workspaceRootPath/myBar/bar.dart',
+ content: 'class Foo2 { Foo2() { } }');
addSource(
'/proj/testAB.dart', 'import "package:myBar/bar.dart"; class Foo { }');
- testFile = convertPath('/proj/completionTest.dart');
addTestSource('class C {foo(){F^}}');
await computeSuggestions();
expect(replacementOffset, completionOffset - 1);
diff --git a/tools/VERSION b/tools/VERSION
index fb8bbdd..c74d0b4 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 11
PATCH 0
-PRERELEASE 270
+PRERELEASE 271
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 4490eea..e78a878 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -510,6 +510,12 @@
"use-sdk": true
}
},
+ "dart2js-(linux|mac|win)-chrome-unsound": {
+ "options": {
+ "use-sdk": true,
+ "dart2js-options": ["--no-sound-null-safety"]
+ }
+ },
"dart2js-weak-(linux|mac|win)-x64-d8": {
"options": {
"builder-tag": "dart2js-weak",
@@ -521,22 +527,47 @@
"use-sdk": true
}
},
+ "dart2js-(linux|win)-firefox-unsound": {
+ "options": {
+ "use-sdk": true,
+ "dart2js-options": ["--no-sound-null-safety"]
+ }
+ },
"dart2js-win-ie11": {
"options": {
"use-sdk": true,
"babel": "{\"presets\":[\"es2015\"]}"
}
},
+ "dart2js-win-ie11-unsound": {
+ "options": {
+ "use-sdk": true,
+ "babel": "{\"presets\":[\"es2015\"]}",
+ "dart2js-options": ["--no-sound-null-safety"]
+ }
+ },
"dart2js-win-edge": {
"options": {
"use-sdk": true
}
},
+ "dart2js-win-edge-unsound": {
+ "options": {
+ "use-sdk": true,
+ "dart2js-options": ["--no-sound-null-safety"]
+ }
+ },
"dart2js-mac-safari": {
"options": {
"use-sdk": true
}
},
+ "dart2js-mac-safari-unsound": {
+ "options": {
+ "use-sdk": true,
+ "dart2js-options": ["--no-sound-null-safety"]
+ }
+ },
"dart2js-minified-csp-(linux|mac|win)-chrome": {
"options": {
"minified": true,
@@ -544,12 +575,27 @@
"use-sdk": true
}
},
+ "dart2js-minified-csp-(linux|mac|win)-chrome-unsound": {
+ "options": {
+ "minified": true,
+ "csp": true,
+ "use-sdk": true,
+ "dart2js-options": ["--no-sound-null-safety"]
+ }
+ },
"dart2js-minified-(linux|mac|win)-d8": {
"options": {
"minified": true,
"use-sdk": true
}
},
+ "dart2js-minified-(linux|mac|win)-d8-unsound": {
+ "options": {
+ "minified": true,
+ "use-sdk": true,
+ "dart2js-options": ["--no-sound-null-safety"]
+ }
+ },
"dart2js-production-(linux|mac|win)-d8": {
"options": {
"builder-tag": "dart2js_production",
@@ -564,6 +610,12 @@
"host-checked": true
}
},
+ "dart2js-hostasserts-(linux|mac|win)-(ia32|x64)-d8-unsound": {
+ "options": {
+ "host-checked": true,
+ "dart2js-options": ["--no-sound-null-safety"]
+ }
+ },
"dart2js-hostasserts-weak-(linux|win)-x64-(d8|chrome)": {
"options": {
"builder-tag": "dart2js-weak",
@@ -2139,10 +2191,9 @@
{
"name": "dart2js observatory-ui tests",
"arguments": [
- "-ndart2js-hostasserts-linux-ia32-d8",
+ "-ndart2js-hostasserts-linux-ia32-d8-unsound",
"--dart2js-batch",
"--enable-experiment=non-nullable",
- "--dart2js-options=--no-sound-null-safety",
"observatory_ui"
]
},
@@ -2212,11 +2263,10 @@
{
"name": "dart2js observatory-ui tests",
"arguments": [
- "-ndart2js-${system}-${runtime}",
+ "-ndart2js-${system}-${runtime}-unsound",
"--dart2js-batch",
"--reset-browser-configuration",
"--enable-experiment=non-nullable",
- "--dart2js-options=--no-sound-null-safety",
"observatory_ui"
]
},
@@ -2267,10 +2317,9 @@
{
"name": "dart2js observatory-ui tests",
"arguments": [
- "-ndart2js-minified-linux-d8",
+ "-ndart2js-minified-linux-d8-unsound",
"--dart2js-batch",
"--enable-experiment=non-nullable",
- "--dart2js-options=--no-sound-null-safety",
"observatory_ui"
]
},
@@ -2340,11 +2389,10 @@
{
"name": "dart2js observatory-ui tests",
"arguments": [
- "-ndart2js-minified-csp-linux-chrome",
+ "-ndart2js-minified-csp-linux-chrome-unsound",
"--dart2js-batch",
"--reset-browser-configuration",
"--enable-experiment=non-nullable",
- "--dart2js-options=--no-sound-null-safety",
"observatory_ui"
]
},