Version 2.14.0-17.0.dev
Merge commit '543d653ca827a2ff1856d7d3a76bded9ae233477' into 'dev'
diff --git a/.packages b/.packages
index 7646deb..af07227 100644
--- a/.packages
+++ b/.packages
@@ -66,7 +66,6 @@
mime:third_party/pkg/mime/lib
mockito:third_party/pkg/mockito/lib
modular_test:pkg/modular_test/lib
-mustache:third_party/pkg/mustache/lib
native_stack_traces:pkg/native_stack_traces/lib
nnbd_migration:pkg/nnbd_migration/lib
oauth2:third_party/pkg/oauth2/lib
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 1cb9178..5fab9db 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -340,7 +340,9 @@
return null;
}
- return getAnalysisDriver(path)?.currentSession.getParsedUnit(path);
+ var session = getAnalysisDriver(path)?.currentSession;
+ var result = session?.getParsedUnit2(path);
+ return result is ParsedUnitResult ? result : null;
}
/// Return the resolved unit for the file with the given [path]. The file is
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
index dd7b2d0..5eec574 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
@@ -12,6 +12,7 @@
import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
import 'package:analysis_server/src/lsp/progress.dart';
import 'package:analysis_server/src/services/correction/sort_members.dart';
+import 'package:analyzer/dart/analysis/results.dart';
class SortMembersCommandHandler extends SimpleEditCommandHandler {
SortMembersCommandHandler(LspAnalysisServer server) : super(server);
@@ -37,18 +38,20 @@
final docIdentifier = server.getVersionedDocumentIdentifier(path);
var driver = server.getAnalysisDriver(path);
- final result = await driver?.parseFile(path);
+ final result0 = await driver?.parseFile2(path);
if (cancellationToken.isCancellationRequested) {
return error(ErrorCodes.RequestCancelled, 'Request was cancelled');
}
- if (result == null) {
+ if (result0 is! ParsedUnitResult) {
return ErrorOr.error(ResponseError(
code: ServerErrorCodes.FileNotAnalyzed,
message: '$commandName is only available for analyzed files',
));
}
+ // TODO(scheglov) inline after migration
+ var result = result0 as ParsedUnitResult;
final code = result.content;
final unit = result.unit;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
index 5de4b4b..db58a6d 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
@@ -8,6 +8,7 @@
import 'package:analysis_server/src/services/refactoring/refactoring.dart';
import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
import 'package:analysis_server/src/services/refactoring/rename.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';
@@ -49,7 +50,7 @@
// update declaration
{
var prefix = element.prefix;
- SourceEdit edit;
+ SourceEdit? edit;
if (newName.isEmpty) {
// We should not get `prefix == null` because we check in
// `checkNewName` that the new name is different.
@@ -57,22 +58,28 @@
return;
}
var node = _findNode();
- var uriEnd = node.uri.end;
- var prefixEnd = element.prefixOffset + prefix.nameLength;
- edit = newSourceEdit_range(
- range.startOffsetEndOffset(uriEnd, prefixEnd), '');
+ if (node != null) {
+ var uriEnd = node.uri.end;
+ var prefixEnd = element.prefixOffset + prefix.nameLength;
+ edit = newSourceEdit_range(
+ range.startOffsetEndOffset(uriEnd, prefixEnd), '');
+ }
} else {
if (prefix == null) {
var node = _findNode();
- var uriEnd = node.uri.end;
- edit = newSourceEdit_range(SourceRange(uriEnd, 0), ' as $newName');
+ if (node != null) {
+ var uriEnd = node.uri.end;
+ edit = newSourceEdit_range(SourceRange(uriEnd, 0), ' as $newName');
+ }
} else {
var offset = element.prefixOffset;
var length = prefix.nameLength;
edit = newSourceEdit_range(SourceRange(offset, length), newName);
}
}
- doSourceChange_addElementEdit(change, element, edit);
+ if (edit != null) {
+ doSourceChange_addElementEdit(change, element, edit);
+ }
}
// update references
var matches = await searchEngine.searchReferences(element);
@@ -98,10 +105,14 @@
}
/// Return the [ImportDirective] node that corresponds to the [element].
- ImportDirective _findNode() {
+ ImportDirective? _findNode() {
var library = element.library;
var path = library.source.fullName;
- var unit = session.getParsedUnit(path).unit;
+ var unitResult = session.getParsedUnit2(path);
+ if (unitResult is! ParsedUnitResult) {
+ return null;
+ }
+ var unit = unitResult.unit;
var index = library.imports.indexOf(element);
return unit.directives.whereType<ImportDirective>().elementAt(index);
}
@@ -111,7 +122,11 @@
/// it. Otherwise return `null`.
SimpleIdentifier? _getInterpolationIdentifier(SourceReference reference) {
var source = reference.element.source!;
- var unit = session.getParsedUnit(source.fullName).unit;
+ var unitResult = session.getParsedUnit2(source.fullName);
+ if (unitResult is! ParsedUnitResult) {
+ return null;
+ }
+ var unit = unitResult.unit;
var nodeLocator = NodeLocator(reference.range.offset);
var node = nodeLocator.searchWithin(unit);
if (node is SimpleIdentifier) {
diff --git a/pkg/analysis_server/test/analysis/get_navigation_test.dart b/pkg/analysis_server/test/analysis/get_navigation_test.dart
index 99943b9..38def2f 100644
--- a/pkg/analysis_server/test/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/get_navigation_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/domain_analysis.dart';
@@ -94,9 +92,10 @@
var request = _createGetNavigationRequest(file, 0, 100);
var response = await serverChannel.sendRequest(request);
expect(response.error, isNull);
- expect(response.result['files'], isEmpty);
- expect(response.result['targets'], isEmpty);
- expect(response.result['regions'], isEmpty);
+ var result = response.result!;
+ expect(result['files'], isEmpty);
+ expect(result['targets'], isEmpty);
+ expect(result['regions'], isEmpty);
}
Future<void> test_fileOutsideOfRoot() async {
diff --git a/pkg/analysis_server/test/analysis/test_all.dart b/pkg/analysis_server/test/analysis/test_all.dart
index 8954813..1187065 100644
--- a/pkg/analysis_server/test/analysis/test_all.dart
+++ b/pkg/analysis_server/test/analysis/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'get_errors_test.dart' as get_errors;
diff --git a/pkg/analysis_server/test/client/completion_driver_test.dart b/pkg/analysis_server/test/client/completion_driver_test.dart
index 4d6ee60..86d1fbb 100644
--- a/pkg/analysis_server/test/client/completion_driver_test.dart
+++ b/pkg/analysis_server/test/client/completion_driver_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/services/completion/dart/utilities.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
@@ -23,9 +21,9 @@
}
abstract class AbstractCompletionDriverTest with ResourceProviderMixin {
- CompletionDriver driver;
- Map<String, String> packageRoots;
- List<CompletionSuggestion> suggestions;
+ late CompletionDriver driver;
+ Map<String, String> packageRoots = {};
+ late List<CompletionSuggestion> suggestions;
String get projectName => 'project';
@@ -47,7 +45,7 @@
}
Future<List<CompletionSuggestion>> addTestFile(String content,
- {int offset}) async {
+ {int? offset}) async {
driver.addTestFile(content, offset: offset);
await getSuggestions();
// For sanity, ensure that there are no errors recorded for project files
@@ -57,10 +55,10 @@
}
void assertNoSuggestion({
- @required String completion,
- ElementKind element,
- CompletionSuggestionKind kind,
- String file,
+ required String completion,
+ ElementKind? element,
+ CompletionSuggestionKind? kind,
+ String? file,
}) {
expect(
suggestionsWith(
@@ -73,10 +71,10 @@
}
void assertSuggestion({
- @required String completion,
- ElementKind element,
- CompletionSuggestionKind kind,
- String file,
+ required String completion,
+ ElementKind? element,
+ CompletionSuggestionKind? kind,
+ String? file,
}) {
expect(
suggestionWith(
@@ -89,10 +87,10 @@
}
void assertSuggestions({
- @required String completion,
- ElementKind element,
- CompletionSuggestionKind kind,
- String file,
+ required String completion,
+ ElementKind? element,
+ CompletionSuggestionKind? kind,
+ String? file,
}) {
expect(
suggestionWith(
@@ -129,7 +127,7 @@
suggestions.sort(completionComparator);
for (var s in suggestions) {
print(
- '[${s.relevance}] ${s.completion} • ${s.element?.kind?.name ?? ""} ${s.kind.name} ${s.element?.location?.file ?? ""}');
+ '[${s.relevance}] ${s.completion} • ${s.element?.kind.name ?? ""} ${s.kind.name} ${s.element?.location?.file ?? ""}');
}
}
@@ -152,10 +150,10 @@
}
SuggestionMatcher suggestionHas({
- @required String completion,
- ElementKind element,
- CompletionSuggestionKind kind,
- String file,
+ required String completion,
+ ElementKind? element,
+ CompletionSuggestionKind? kind,
+ String? file,
}) =>
(CompletionSuggestion s) {
if (s.completion != completion) {
@@ -175,19 +173,19 @@
};
Iterable<CompletionSuggestion> suggestionsWith({
- @required String completion,
- ElementKind element,
- CompletionSuggestionKind kind,
- String file,
+ required String completion,
+ ElementKind? element,
+ CompletionSuggestionKind? kind,
+ String? file,
}) =>
suggestions.where(suggestionHas(
completion: completion, element: element, kind: kind, file: file));
CompletionSuggestion suggestionWith({
- @required String completion,
- ElementKind element,
- CompletionSuggestionKind kind,
- String file,
+ required String completion,
+ ElementKind? element,
+ CompletionSuggestionKind? kind,
+ String? file,
}) {
final matches = suggestionsWith(
completion: completion, element: element, kind: kind, file: file);
diff --git a/pkg/analysis_server/test/client/impl/completion_driver.dart b/pkg/analysis_server/test/client/impl/completion_driver.dart
index a4569aa..48a7ef0 100644
--- a/pkg/analysis_server/test/client/impl/completion_driver.dart
+++ b/pkg/analysis_server/test/client/impl/completion_driver.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'dart:async';
import 'dart:math' as math;
@@ -73,18 +71,18 @@
final Map<String, List<AnalysisError>> filesErrors = {};
- String completionId;
- int completionOffset;
- int replacementOffset;
- int replacementLength;
+ late String completionId;
+ late int completionOffset;
+ late int replacementOffset;
+ late int replacementLength;
CompletionDriver({
- @required this.supportsAvailableSuggestions,
- AnalysisServerOptions serverOptions,
- @required MemoryResourceProvider resourceProvider,
- @required String projectPath,
- @required String testFilePath,
- }) : _resourceProvider = resourceProvider,
+ required this.supportsAvailableSuggestions,
+ AnalysisServerOptions? serverOptions,
+ required MemoryResourceProvider resourceProvider,
+ required String projectPath,
+ required String testFilePath,
+ }) : _resourceProvider = resourceProvider,
super(
serverOptions: serverOptions ?? AnalysisServerOptions(),
projectPath: resourceProvider.convertPath(projectPath),
@@ -95,7 +93,7 @@
MemoryResourceProvider get resourceProvider => _resourceProvider;
@override
- String addTestFile(String content, {int offset}) {
+ String addTestFile(String content, {int? offset}) {
completionOffset = content.indexOf('^');
if (offset != null) {
expect(completionOffset, -1, reason: 'cannot supply offset and ^');
@@ -110,7 +108,7 @@
}
@override
- void createProject({Map<String, String> packageRoots}) {
+ void createProject({Map<String, String>? packageRoots}) {
super.createProject(packageRoots: packageRoots);
if (supportsAvailableSuggestions) {
var request = CompletionSetSubscriptionsParams(
@@ -133,7 +131,7 @@
}
@override
- File newFile(String path, String content, [int stamp]) => resourceProvider
+ File newFile(String path, String content, [int? stamp]) => resourceProvider
.newFile(resourceProvider.convertPath(path), content, stamp);
@override
@@ -190,12 +188,12 @@
var importedSets = <IncludedSuggestionSet>[];
var notImportedSets = <IncludedSuggestionSet>[];
- for (var set in params.includedSuggestionSets) {
+ for (var set in params.includedSuggestionSets!) {
var id = set.id;
while (!idToSetMap.containsKey(id)) {
await Future.delayed(const Duration(milliseconds: 1));
}
- var suggestionSet = idToSetMap[id];
+ var suggestionSet = idToSetMap[id]!;
if (importedLibraryUris.contains(suggestionSet.uri)) {
importedSets.add(set);
} else {
@@ -212,7 +210,7 @@
void addSuggestion(
AvailableSuggestion suggestion, IncludedSuggestionSet includeSet) {
var kind = suggestion.element.kind;
- if (!includedKinds.contains(kind)) {
+ if (!includedKinds!.contains(kind)) {
return;
}
var completionSuggestion =
@@ -229,7 +227,7 @@
'${s.declaringLibraryUri}:${s.element.kind}:${s.label}';
for (var includeSet in importedSets) {
- var set = idToSetMap[includeSet.id];
+ var set = idToSetMap[includeSet.id]!;
for (var suggestion in set.items) {
if (seenElements.add(suggestionId(suggestion))) {
addSuggestion(suggestion, includeSet);
@@ -238,7 +236,7 @@
}
for (var includeSet in notImportedSets) {
- var set = idToSetMap[includeSet.id];
+ var set = idToSetMap[includeSet.id]!;
for (var suggestion in set.items) {
if (!seenElements.contains(suggestionId(suggestion))) {
addSuggestion(suggestion, includeSet);
@@ -252,11 +250,11 @@
var params = CompletionAvailableSuggestionsParams.fromNotification(
notification,
);
- for (var set in params.changedLibraries) {
+ for (var set in params.changedLibraries!) {
idToSetMap[set.id] = set;
uriToSetMap[set.uri] = set;
}
- for (var id in params.removedLibraries) {
+ for (var id in params.removedLibraries!) {
var set = idToSetMap.remove(id);
uriToSetMap.remove(set?.uri);
}
diff --git a/pkg/analysis_server/test/client/test_all.dart b/pkg/analysis_server/test/client/test_all.dart
index 7887a9d..417c4d3 100644
--- a/pkg/analysis_server/test/client/test_all.dart
+++ b/pkg/analysis_server/test/client/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'completion_driver_test.dart' as completion_driver;
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index 4cefdef..eaf324a 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'dart:collection';
import 'package:test/test.dart';
@@ -2418,7 +2416,7 @@
/// expected to fail. This should be used to mark known completion bugs that
/// have not yet been fixed.
void buildTests(String baseName, String originalSource, List<String> results,
- {Map<String, String> extraFiles, String failingTests = ''}) {
+ {Map<String, String>? extraFiles, String failingTests = ''}) {
var completionTests = LocationSpec.from(originalSource, results);
completionTests.sort((LocationSpec first, LocationSpec second) {
return first.id.compareTo(second.id);
diff --git a/pkg/analysis_server/test/completion_test_support.dart b/pkg/analysis_server/test/completion_test_support.dart
index 83a70c8..0e63271 100644
--- a/pkg/analysis_server/test/completion_test_support.dart
+++ b/pkg/analysis_server/test/completion_test_support.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'dart:collection';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -20,7 +18,7 @@
.toList();
void assertHasCompletion(String completion,
- {ElementKind elementKind, bool isDeprecated}) {
+ {ElementKind? elementKind, bool? isDeprecated}) {
var expectedOffset = completion.indexOf(CURSOR_MARKER);
if (expectedOffset >= 0) {
if (completion.contains(CURSOR_MARKER, expectedOffset + 1)) {
@@ -31,8 +29,8 @@
} else {
expectedOffset = completion.length;
}
- CompletionSuggestion matchingSuggestion;
- suggestions.forEach((CompletionSuggestion suggestion) {
+ CompletionSuggestion? matchingSuggestion;
+ for (var suggestion in suggestions) {
if (suggestion.completion == completion) {
if (matchingSuggestion == null) {
matchingSuggestion = suggestion;
@@ -48,14 +46,14 @@
"Expected exactly one '$completion' but found multiple:\n $suggestedCompletions");
}
}
- });
+ }
if (matchingSuggestion == null) {
fail("Expected '$completion' but found none:\n $suggestedCompletions");
}
expect(matchingSuggestion.selectionOffset, equals(expectedOffset));
expect(matchingSuggestion.selectionLength, equals(0));
if (elementKind != null) {
- expect(matchingSuggestion.element.kind, elementKind);
+ expect(matchingSuggestion.element!.kind, elementKind);
}
if (isDeprecated != null) {
expect(matchingSuggestion.isDeprecated, isDeprecated);
@@ -74,14 +72,14 @@
/// "already typed".
void filterResults(String content) {
var charsAlreadyTyped =
- content.substring(replacementOffset, completionOffset).toLowerCase();
+ content.substring(replacementOffset!, completionOffset).toLowerCase();
suggestions = suggestions
.where((CompletionSuggestion suggestion) =>
suggestion.completion.toLowerCase().startsWith(charsAlreadyTyped))
.toList();
}
- Future runTest(LocationSpec spec, [Map<String, String> extraFiles]) {
+ Future runTest(LocationSpec spec, [Map<String, String>? extraFiles]) {
super.setUp();
return Future(() {
var content = spec.source;
@@ -113,7 +111,7 @@
int testLocation = -1;
List<String> positiveResults = <String>[];
List<String> negativeResults = <String>[];
- String source;
+ late String source;
LocationSpec(this.id);
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index b05effd..653339c 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'dart:async';
import 'package:analysis_server/protocol/protocol.dart';
@@ -20,7 +18,6 @@
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
-import 'package:meta/meta.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -263,7 +260,7 @@
Response testSetAnalysisRoots(List<String> included, List<String> excluded) {
var request =
AnalysisSetAnalysisRootsParams(included, excluded).toRequest('0');
- return handler.handleRequest(request);
+ return handler.handleRequest(request)!;
}
Future<void> xtest_getReachableSources_invalidSource() async {
@@ -276,10 +273,9 @@
var request = AnalysisGetReachableSourcesParams('/does/not/exist.dart')
.toRequest('0');
- var response = handler.handleRequest(request);
- expect(response.error, isNotNull);
- expect(response.error.code,
- RequestErrorCode.GET_REACHABLE_SOURCES_INVALID_FILE);
+ var response = handler.handleRequest(request)!;
+ var error = response.error!;
+ expect(error.code, RequestErrorCode.GET_REACHABLE_SOURCES_INVALID_FILE);
}
Future<void> xtest_getReachableSources_validSources() async {
@@ -293,9 +289,9 @@
await server.onAnalysisComplete;
var request = AnalysisGetReachableSourcesParams(fileA).toRequest('0');
- var response = handler.handleRequest(request);
+ var response = handler.handleRequest(request)!;
- Map json = response.toJson()[Response.RESULT];
+ var json = response.toJson()[Response.RESULT] as Map<String, dynamic>;
// Sanity checks.
expect(json['sources'], hasLength(6));
@@ -1418,9 +1414,9 @@
}
void _assertAnalyzedFiles({
- @required List<String> hasErrors,
+ required List<String> hasErrors,
List<String> noErrors = const [],
- @required List<String> notAnalyzed,
+ required List<String> notAnalyzed,
}) {
for (var path in hasErrors) {
assertHasErrors(path);
@@ -1454,9 +1450,9 @@
/// A helper to test 'analysis.*' requests.
class AnalysisTestHelper with ResourceProviderMixin {
- MockServerChannel serverChannel;
- AnalysisServer server;
- AnalysisDomainHandler handler;
+ late MockServerChannel serverChannel;
+ late AnalysisServer server;
+ late AnalysisDomainHandler handler;
Map<AnalysisService, List<String>> analysisSubscriptions = {};
@@ -1464,9 +1460,9 @@
Map<String, List<HighlightRegion>> filesHighlights = {};
Map<String, List<NavigationRegion>> filesNavigation = {};
- String projectPath;
- String testFile;
- String testCode;
+ late String projectPath;
+ late String testFile;
+ late String testCode;
AnalysisTestHelper() {
projectPath = convertPath('/project');
@@ -1773,8 +1769,7 @@
addAnalysisSubscription(AnalysisService.HIGHLIGHTS, testFile);
// wait for analysis
await waitForTasksFinished();
- var params = pluginManager.analysisSetSubscriptionsParams;
- expect(params, isNotNull);
+ var params = pluginManager.analysisSetSubscriptionsParams!;
var subscriptions = params.subscriptions;
expect(subscriptions, hasLength(1));
var files = subscriptions[plugin.AnalysisService.HIGHLIGHTS];
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 8da9476..08d3056 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -2,11 +2,10 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/plugin/plugin_manager.dart';
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analyzer/instrumentation/service.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@@ -15,6 +14,7 @@
import 'domain_completion_util.dart';
import 'mocks.dart';
+import 'src/plugin/plugin_manager_test.dart';
void main() {
defineReflectiveSuite(() {
@@ -735,7 +735,7 @@
.toRequest('0');
var response = await waitResponse(request);
expect(response.id, '0');
- expect(response.error.code, RequestErrorCode.INVALID_PARAMETER);
+ expect(response.error!.code, RequestErrorCode.INVALID_PARAMETER);
}
Future<void> test_overrides() {
@@ -803,7 +803,8 @@
^
}
''');
- PluginInfo info = DiscoveredPluginInfo('a', 'b', 'c', null, null);
+ PluginInfo info = DiscoveredPluginInfo('a', 'b', 'c',
+ TestNotificationManager(), InstrumentationService.NULL_SERVICE);
var result = plugin.CompletionGetSuggestionsResult(
testFile.indexOf('^'), 0, <CompletionSuggestion>[
CompletionSuggestion(CompletionSuggestionKind.IDENTIFIER,
diff --git a/pkg/analysis_server/test/domain_completion_util.dart b/pkg/analysis_server/test/domain_completion_util.dart
index 80786c5..8670a6f 100644
--- a/pkg/analysis_server/test/domain_completion_util.dart
+++ b/pkg/analysis_server/test/domain_completion_util.dart
@@ -17,7 +17,7 @@
class AbstractCompletionDomainTest extends AbstractAnalysisTest {
late String completionId;
late int completionOffset;
- late int replacementOffset;
+ int? replacementOffset;
late int replacementLength;
Map<String, Completer<void>> receivedSuggestionsCompleters = {};
List<CompletionSuggestion> suggestions = [];
diff --git a/pkg/analysis_server/test/edit/assists_test.dart b/pkg/analysis_server/test/edit/assists_test.dart
index 93a35f0..e2cb0dc 100644
--- a/pkg/analysis_server/test/edit/assists_test.dart
+++ b/pkg/analysis_server/test/edit/assists_test.dart
@@ -2,11 +2,10 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/edit/edit_domain.dart';
import 'package:analysis_server/src/plugin/plugin_manager.dart';
+import 'package:analyzer/instrumentation/service.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@@ -15,6 +14,7 @@
import '../analysis_abstract.dart';
import '../mocks.dart';
+import '../src/plugin/plugin_manager_test.dart';
void main() {
defineReflectiveSuite(() {
@@ -24,7 +24,7 @@
@reflectiveTest
class AssistsTest extends AbstractAnalysisTest {
- List<SourceChange> changes;
+ late List<SourceChange> changes;
Future<void> prepareAssists(String search, [int length = 0]) async {
var offset = findOffset(search);
@@ -46,7 +46,8 @@
}
Future<void> test_fromPlugins() async {
- PluginInfo info = DiscoveredPluginInfo('a', 'b', 'c', null, null);
+ PluginInfo info = DiscoveredPluginInfo('a', 'b', 'c',
+ TestNotificationManager(), InstrumentationService.NULL_SERVICE);
var message = 'From a plugin';
var change = plugin.PrioritizedSourceChange(
5,
diff --git a/pkg/analysis_server/test/edit/bulk_fixes_test.dart b/pkg/analysis_server/test/edit/bulk_fixes_test.dart
index 5d88990..d48358f 100644
--- a/pkg/analysis_server/test/edit/bulk_fixes_test.dart
+++ b/pkg/analysis_server/test/edit/bulk_fixes_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'dart:io';
import 'package:analysis_server/protocol/protocol_generated.dart';
@@ -11,7 +9,6 @@
import 'package:analysis_server/src/services/linter/lint_names.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:linter/src/rules.dart';
-import 'package:meta/meta.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -26,7 +23,7 @@
@reflectiveTest
class BulkFixesTest extends AbstractAnalysisTest {
void assertContains(List<BulkFix> details,
- {@required String path, @required String code, @required int count}) {
+ {required String path, required String code, required int count}) {
for (var detail in details) {
if (detail.path == path) {
for (var fix in detail.fixes) {
diff --git a/pkg/analysis_server/test/edit/format_test.dart b/pkg/analysis_server/test/edit/format_test.dart
index bcab9d1..1990b31 100644
--- a/pkg/analysis_server/test/edit/format_test.dart
+++ b/pkg/analysis_server/test/edit/format_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/edit/edit_domain.dart';
import 'package:test/test.dart';
@@ -112,7 +110,7 @@
}
EditFormatResult _formatAt(int selectionOffset, int selectionLength,
- {int lineLength}) {
+ {int? lineLength}) {
var request = EditFormatParams(testFile, selectionOffset, selectionLength,
lineLength: lineLength)
.toRequest('0');
diff --git a/pkg/analysis_server/test/edit/organize_directives_test.dart b/pkg/analysis_server/test/edit/organize_directives_test.dart
index e81ca0e..c18850e 100644
--- a/pkg/analysis_server/test/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/edit/organize_directives_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/edit/edit_domain.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -21,7 +19,7 @@
@reflectiveTest
class OrganizeDirectivesTest extends AbstractAnalysisTest {
- SourceFileEdit fileEdit;
+ late SourceFileEdit fileEdit;
@override
void setUp() {
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index 9baa5b3..d14a01d 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/edit/edit_domain.dart';
@@ -248,7 +246,7 @@
@reflectiveTest
class ExtractLocalVariableTest extends _AbstractGetRefactoring_Test {
Future<Response> sendExtractRequest(
- int offset, int length, String name, bool extractAll) {
+ int offset, int length, String? name, bool extractAll) {
var kind = RefactoringKind.EXTRACT_LOCAL_VARIABLE;
var options =
name != null ? ExtractLocalVariableOptions(name, extractAll) : null;
@@ -263,7 +261,7 @@
}
Future<Response> sendStringSuffixRequest(
- String search, String suffix, String name, bool extractAll) {
+ String search, String suffix, String? name, bool extractAll) {
var offset = findOffset(search + suffix);
var length = search.length;
return sendExtractRequest(offset, length, name, extractAll);
@@ -293,7 +291,7 @@
return sendStringRequest('1 + 2', 'res', true);
});
// We get the refactoring feedback....
- ExtractLocalVariableFeedback feedback = result.feedback;
+ var feedback = result.feedback as ExtractLocalVariableFeedback;
expect(feedback.names, contains('myName'));
}
@@ -306,7 +304,7 @@
return getRefactoringResult(() {
return sendExtractRequest(testCode.indexOf('222 +'), 0, 'res', true);
}).then((result) {
- ExtractLocalVariableFeedback feedback = result.feedback;
+ var feedback = result.feedback as ExtractLocalVariableFeedback;
expect(feedback.coveringExpressionOffsets, [
testCode.indexOf('222 +'),
testCode.indexOf('111 +'),
@@ -390,7 +388,7 @@
var result = await getRefactoringResult(() {
return sendStringSuffixRequest('getSelectedItem()', ';', null, true);
});
- ExtractLocalVariableFeedback feedback = result.feedback;
+ var feedback = result.feedback as ExtractLocalVariableFeedback;
expect(
feedback.names, unorderedEquals(['treeItem', 'item', 'selectedItem']));
expect(result.change, isNull);
@@ -426,7 +424,7 @@
return getRefactoringResult(() {
return sendStringRequest('1 + 2', 'res', true);
}).then((result) {
- ExtractLocalVariableFeedback feedback = result.feedback;
+ var feedback = result.feedback as ExtractLocalVariableFeedback;
expect(feedback.offsets, [findOffset('1 + 2'), findOffset('1 + 2')]);
expect(feedback.lengths, [5, 6]);
});
@@ -490,7 +488,7 @@
var result = await getRefactoringResult(() {
return sendStringRequest('1 + 2', 'res', true);
});
- ExtractLocalVariableFeedback feedback = result.feedback;
+ var feedback = result.feedback as ExtractLocalVariableFeedback;
expect(feedback.names, contains('myName'));
}
var initialResetCount = test_resetCount;
@@ -515,7 +513,7 @@
var result = await getRefactoringResult(() {
return sendStringRequest('1 + 2', 'res', true);
});
- ExtractLocalVariableFeedback feedback = result.feedback;
+ var feedback = result.feedback as ExtractLocalVariableFeedback;
expect(feedback.names, contains('myName'));
}
var initialResetCount = test_resetCount;
@@ -534,7 +532,7 @@
var result = await getRefactoringResult(() {
return sendStringRequest('1 + 2', 'res', true);
});
- ExtractLocalVariableFeedback feedback = result.feedback;
+ var feedback = result.feedback as ExtractLocalVariableFeedback;
// The refactoring was reset, so we don't get stale results.
expect(feedback.names, contains('otherName'));
}
@@ -549,8 +547,8 @@
''');
return waitForTasksFinished().then((_) {
return sendStringRequest('1 + 2', 'res', true).then((response) {
- expect(response.error, isNotNull);
- expect(response.error.code, RequestErrorCode.SERVER_ERROR);
+ var error = response.error!;
+ expect(error.code, RequestErrorCode.SERVER_ERROR);
});
});
}
@@ -564,8 +562,8 @@
''');
return waitForTasksFinished().then((_) {
return sendStringRequest('1 + 2', 'res', true).then((response) {
- expect(response.error, isNotNull);
- expect(response.error.code, RequestErrorCode.SERVER_ERROR);
+ var error = response.error!;
+ expect(error.code, RequestErrorCode.SERVER_ERROR);
});
});
}
@@ -579,8 +577,8 @@
''');
return waitForTasksFinished().then((_) {
return sendStringRequest('1 + 2', 'res', true).then((response) {
- expect(response.error, isNotNull);
- expect(response.error.code, RequestErrorCode.SERVER_ERROR);
+ var error = response.error!;
+ expect(error.code, RequestErrorCode.SERVER_ERROR);
});
});
}
@@ -588,10 +586,10 @@
@reflectiveTest
class ExtractMethodTest extends _AbstractGetRefactoring_Test {
- int offset;
- int length;
+ late int offset;
+ late int length;
String name = 'res';
- ExtractMethodOptions options;
+ ExtractMethodOptions? options;
Future<void> test_expression() {
addTestFile('''
@@ -644,13 +642,13 @@
''');
_setOffsetLengthForString('a + b');
var result = await getRefactoringResult(_computeChange);
- ExtractMethodFeedback feedback = result.feedback;
+ var feedback = result.feedback as ExtractMethodFeedback;
var parameters = feedback.parameters;
parameters[0].name = 'aaa';
parameters[1].name = 'bbb';
parameters[1].type = 'num';
parameters.insert(0, parameters.removeLast());
- options.parameters = parameters;
+ options!.parameters = parameters;
return assertSuccessfulRefactoring(_sendExtractRequest, '''
main() {
int a = 1;
@@ -775,7 +773,7 @@
await waitForTasksFinished();
var response = await _sendExtractRequest();
var result = EditGetRefactoringResult.fromResponse(response);
- return result.feedback;
+ return result.feedback as ExtractMethodFeedback;
}
Future _prepareOptions() {
@@ -785,7 +783,7 @@
}).then((result) {
assertResultProblemsOK(result);
// fill options from result
- ExtractMethodFeedback feedback = result.feedback;
+ var feedback = result.feedback as ExtractMethodFeedback;
options = ExtractMethodOptions(
feedback.returnType, false, name, feedback.parameters, true);
// done
@@ -811,7 +809,7 @@
@reflectiveTest
class GetAvailableRefactoringsTest extends AbstractAnalysisTest {
- List<RefactoringKind> kinds;
+ late List<RefactoringKind> kinds;
void addFlutterPackage() {
var libFolder = MockPackages.instance.addFlutter(resourceProvider);
@@ -1077,7 +1075,7 @@
return _sendInlineRequest('res =');
});
// We get the refactoring feedback....
- InlineLocalVariableFeedback feedback = result.feedback;
+ var feedback = result.feedback as InlineLocalVariableFeedback;
expect(feedback.occurrences, 2);
}
@@ -1092,7 +1090,7 @@
return getRefactoringResult(() {
return _sendInlineRequest('test =');
}).then((result) {
- InlineLocalVariableFeedback feedback = result.feedback;
+ var feedback = result.feedback as InlineLocalVariableFeedback;
expect(feedback.name, 'test');
expect(feedback.occurrences, 2);
});
@@ -1183,7 +1181,7 @@
return getRefactoringResult(() {
return _sendInlineRequest('test(int p)');
}).then((result) {
- InlineMethodFeedback feedback = result.feedback;
+ var feedback = result.feedback as InlineMethodFeedback;
expect(feedback.className, 'A');
expect(feedback.methodName, 'test');
expect(feedback.isDeclaration, isTrue);
@@ -1288,7 +1286,7 @@
@reflectiveTest
class MoveFileTest extends _AbstractGetRefactoring_Test {
- MoveFileOptions options;
+ late MoveFileOptions options;
@failingTest
Future<void> test_OK() {
@@ -1322,7 +1320,7 @@
@reflectiveTest
class RenameTest extends _AbstractGetRefactoring_Test {
- Future<Response> sendRenameRequest(String search, String newName,
+ Future<Response> sendRenameRequest(String search, String? newName,
{String id = '0', bool validateOnly = false}) {
var options = newName != null ? RenameOptions(newName) : null;
var request = EditGetRefactoringParams(RefactoringKind.RENAME, testFile,
@@ -1409,7 +1407,7 @@
}
''',
feedbackValidator: (feedback) {
- RenameFeedback renameFeedback = feedback;
+ var renameFeedback = feedback as RenameFeedback;
expect(renameFeedback.offset, 18);
expect(renameFeedback.length, 4);
},
@@ -1438,7 +1436,7 @@
}
''',
feedbackValidator: (feedback) {
- RenameFeedback renameFeedback = feedback;
+ var renameFeedback = feedback as RenameFeedback;
expect(renameFeedback.offset, 42);
expect(renameFeedback.length, 4);
},
@@ -1467,7 +1465,7 @@
}
''',
feedbackValidator: (feedback) {
- RenameFeedback renameFeedback = feedback;
+ var renameFeedback = feedback as RenameFeedback;
expect(renameFeedback.offset, 48);
expect(renameFeedback.length, 4);
},
@@ -1496,7 +1494,7 @@
}
''',
feedbackValidator: (feedback) {
- RenameFeedback renameFeedback = feedback;
+ var renameFeedback = feedback as RenameFeedback;
expect(renameFeedback.offset, 42);
expect(renameFeedback.length, 4);
},
@@ -1525,7 +1523,7 @@
}
''',
feedbackValidator: (feedback) {
- RenameFeedback renameFeedback = feedback;
+ var renameFeedback = feedback as RenameFeedback;
expect(renameFeedback.offset, 48);
expect(renameFeedback.length, 4);
},
@@ -1559,7 +1557,7 @@
return getRefactoringResult(() {
return sendRenameRequest('Test {}', 'NewName', validateOnly: true);
}).then((result) {
- RenameFeedback feedback = result.feedback;
+ var feedback = result.feedback as RenameFeedback;
assertResultProblemsOK(result);
expect(feedback.elementKindName, 'class');
expect(feedback.oldName, 'Test');
@@ -1735,13 +1733,12 @@
}).then((result) {
assertResultProblemsOK(result);
// prepare potential edit ID
- var potentialIds = result.potentialEdits;
+ var potentialIds = result.potentialEdits!;
expect(potentialIds, hasLength(1));
var potentialId = potentialIds[0];
// find potential edit
- var change = result.change;
- var potentialEdit = _findEditWithId(change, potentialId);
- expect(potentialEdit, isNotNull);
+ var change = result.change!;
+ var potentialEdit = _findEditWithId(change, potentialId)!;
expect(potentialEdit.offset, findOffset('test(); // a2'));
expect(potentialEdit.length, 4);
});
@@ -1790,7 +1787,7 @@
}
''',
feedbackValidator: (feedback) {
- RenameFeedback renameFeedback = feedback;
+ var renameFeedback = feedback as RenameFeedback;
expect(renameFeedback.offset, 20);
expect(renameFeedback.length, 4);
},
@@ -1819,7 +1816,7 @@
}
''',
feedbackValidator: (feedback) {
- RenameFeedback renameFeedback = feedback;
+ var renameFeedback = feedback as RenameFeedback;
expect(renameFeedback.offset, 43);
expect(renameFeedback.length, 4);
},
@@ -1836,7 +1833,7 @@
return getRefactoringResult(() {
return sendRenameRequest('st v;', 'NewName');
}).then((result) {
- RenameFeedback feedback = result.feedback;
+ var feedback = result.feedback as RenameFeedback;
expect(feedback, isNotNull);
expect(feedback.offset, findOffset('Test v;'));
expect(feedback.length, 'Test'.length);
@@ -1930,7 +1927,7 @@
}
''',
feedbackValidator: (feedback) {
- RenameFeedback renameFeedback = feedback;
+ var renameFeedback = feedback as RenameFeedback;
expect(renameFeedback.offset, -1);
expect(renameFeedback.length, 0);
});
@@ -1958,7 +1955,7 @@
}
''',
feedbackValidator: (feedback) {
- RenameFeedback renameFeedback = feedback;
+ var renameFeedback = feedback as RenameFeedback;
expect(renameFeedback.offset, 51);
expect(renameFeedback.length, 4);
});
@@ -2127,7 +2124,7 @@
print(otherName);
}
''');
- server.getAnalysisDriver(testFile).getResult2(testFile);
+ server.getAnalysisDriver(testFile)!.getResult2(testFile);
// send the second request, with the same kind, file and offset
await waitForTasksFinished();
result = await getRefactoringResult(() {
@@ -2143,8 +2140,8 @@
isResponseFailure('0', RequestErrorCode.REFACTORING_REQUEST_CANCELLED));
}
- SourceEdit _findEditWithId(SourceChange change, String id) {
- SourceEdit potentialEdit;
+ SourceEdit? _findEditWithId(SourceChange change, String id) {
+ SourceEdit? potentialEdit;
change.edits.forEach((fileEdit) {
fileEdit.edits.forEach((edit) {
if (edit.id == id) {
@@ -2155,9 +2152,8 @@
return potentialEdit;
}
- void _validateFeedback(EditGetRefactoringResult result, {String oldName}) {
- RenameFeedback feedback = result.feedback;
- expect(feedback, isNotNull);
+ void _validateFeedback(EditGetRefactoringResult result, {String? oldName}) {
+ var feedback = result.feedback as RenameFeedback;
if (oldName != null) {
expect(feedback.oldName, oldName);
}
@@ -2170,7 +2166,7 @@
/// Asserts that [problems] has a single ERROR problem.
void assertResultProblemsError(List<RefactoringProblem> problems,
- [String message]) {
+ [String? message]) {
var problem = problems[0];
expect(problem.severity, RefactoringProblemSeverity.ERROR,
reason: problem.toString());
@@ -2181,7 +2177,7 @@
/// Asserts that [result] has a single FATAL problem.
void assertResultProblemsFatal(List<RefactoringProblem> problems,
- [String message]) {
+ [String? message]) {
var problem = problems[0];
expect(problems, hasLength(1));
expect(problem.severity, RefactoringProblemSeverity.FATAL,
@@ -2200,7 +2196,7 @@
/// Asserts that [result] has a single WARNING problem.
void assertResultProblemsWarning(List<RefactoringProblem> problems,
- [String message]) {
+ [String? message]) {
var problem = problems[0];
expect(problems, hasLength(1));
expect(problem.severity, RefactoringProblemSeverity.WARNING,
@@ -2212,7 +2208,7 @@
Future assertSuccessfulRefactoring(
Future<Response> Function() requestSender, String expectedCode,
- {void Function(RefactoringFeedback) feedbackValidator}) async {
+ {void Function(RefactoringFeedback?)? feedbackValidator}) async {
var result = await getRefactoringResult(requestSender);
assertResultProblemsOK(result);
if (feedbackValidator != null) {
@@ -2225,8 +2221,7 @@
/// which results in the [expectedCode].
void assertTestRefactoringResult(
EditGetRefactoringResult result, String expectedCode) {
- var change = result.change;
- expect(change, isNotNull);
+ var change = result.change!;
for (var fileEdit in change.edits) {
if (fileEdit.file == testFile) {
var actualCode = SourceEdit.applySequence(testCode, fileEdit.edits);
@@ -2247,7 +2242,7 @@
}
Future<Response> sendRequest(
- RefactoringKind kind, int offset, int length, RefactoringOptions options,
+ RefactoringKind kind, int offset, int length, RefactoringOptions? options,
[bool validateOnly = false]) {
var request = EditGetRefactoringParams(
kind, testFile, offset, length, validateOnly,
diff --git a/pkg/analysis_server/test/edit/sort_members_test.dart b/pkg/analysis_server/test/edit/sort_members_test.dart
index 083b834..52c1932 100644
--- a/pkg/analysis_server/test/edit/sort_members_test.dart
+++ b/pkg/analysis_server/test/edit/sort_members_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/edit/edit_domain.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -21,7 +19,7 @@
@reflectiveTest
class SortMembersTest extends AbstractAnalysisTest {
- SourceFileEdit fileEdit;
+ late SourceFileEdit fileEdit;
@override
void setUp() {
diff --git a/pkg/analysis_server/test/edit/statement_completion_test.dart b/pkg/analysis_server/test/edit/statement_completion_test.dart
index c442c9c..09e11a7 100644
--- a/pkg/analysis_server/test/edit/statement_completion_test.dart
+++ b/pkg/analysis_server/test/edit/statement_completion_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/edit/edit_domain.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -21,7 +19,7 @@
@reflectiveTest
class StatementCompletionTest extends AbstractAnalysisTest {
- SourceChange change;
+ late SourceChange change;
@override
void setUp() {
@@ -103,7 +101,7 @@
(s) => s.indexOf(match) + match.length); // Ensure cursor after '='.
}
- void _assertHasChange(String message, String expectedCode, [Function cmp]) {
+ void _assertHasChange(String message, String expectedCode, [Function? cmp]) {
if (change.message == message) {
if (change.edits.isNotEmpty) {
var resultCode =
@@ -111,12 +109,12 @@
expect(resultCode, expectedCode.replaceAll('/*caret*/', ''));
if (cmp != null) {
int offset = cmp(resultCode);
- expect(change.selection.offset, offset);
+ expect(change.selection!.offset, offset);
}
} else {
if (cmp != null) {
int offset = cmp(testCode);
- expect(change.selection.offset, offset);
+ expect(change.selection!.offset, offset);
}
}
return;
diff --git a/pkg/analysis_server/test/edit/test_all.dart b/pkg/analysis_server/test/edit/test_all.dart
index e1d5aec..21cf0bc 100644
--- a/pkg/analysis_server/test/edit/test_all.dart
+++ b/pkg/analysis_server/test/edit/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'assists_test.dart' as assists;
diff --git a/pkg/analysis_server/test/lsp/definition_test.dart b/pkg/analysis_server/test/lsp/definition_test.dart
index f78d059..08b013a 100644
--- a/pkg/analysis_server/test/lsp/definition_test.dart
+++ b/pkg/analysis_server/test/lsp/definition_test.dart
@@ -198,9 +198,6 @@
expect(res, isEmpty);
}
- /// Failing due to incorrect range because _DartNavigationCollector._getCodeLocation
- /// does not handle parts.
- @failingTest
Future<void> test_part() async {
final mainContents = '''
import 'lib.dart';
diff --git a/pkg/analysis_server/test/search/abstract_search_domain.dart b/pkg/analysis_server/test/search/abstract_search_domain.dart
index f6e20ee..cba622f 100644
--- a/pkg/analysis_server/test/search/abstract_search_domain.dart
+++ b/pkg/analysis_server/test/search/abstract_search_domain.dart
@@ -13,7 +13,7 @@
class AbstractSearchDomainTest extends AbstractAnalysisTest {
final Map<String, _ResultSet> resultSets = {};
- late String searchId;
+ String? searchId;
List<SearchResult> results = <SearchResult>[];
late SearchResult result;
diff --git a/pkg/analysis_server/test/search/declarations_test.dart b/pkg/analysis_server/test/search/declarations_test.dart
index 349085d..a1f4900 100644
--- a/pkg/analysis_server/test/search/declarations_test.dart
+++ b/pkg/analysis_server/test/search/declarations_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
@@ -19,10 +17,10 @@
@reflectiveTest
class DeclarationsTest extends AbstractSearchDomainTest {
- SearchGetElementDeclarationsResult declarationsResult;
+ late SearchGetElementDeclarationsResult declarationsResult;
ElementDeclaration assertHas(String name, ElementKind kind,
- {String className, String mixinName}) {
+ {String? className, String? mixinName}) {
return declarationsResult.declarations.singleWhere((ElementDeclaration d) =>
declarationsResult.files[d.fileIndex] == testFile &&
d.name == name &&
@@ -214,7 +212,7 @@
}
Future<void> _getDeclarations(
- {String file, String pattern, int maxResults}) async {
+ {String? file, String? pattern, int? maxResults}) async {
var request = SearchGetElementDeclarationsParams(
file: file, pattern: pattern, maxResults: maxResults)
.toRequest('0');
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
index 1049186..9515144 100644
--- a/pkg/analysis_server/test/search/element_references_test.dart
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
@@ -19,7 +17,7 @@
@reflectiveTest
class ElementReferencesTest extends AbstractSearchDomainTest {
- Element searchElement;
+ Element? searchElement;
void assertHasRef(SearchResultKind kind, String search, bool isPotential) {
assertHasResult(kind, search);
@@ -53,7 +51,7 @@
}
''');
await findElementReferences('named(p)', false);
- expect(searchElement.kind, ElementKind.CONSTRUCTOR);
+ expect(searchElement!.kind, ElementKind.CONSTRUCTOR);
expect(results, hasLength(2));
assertHasResult(SearchResultKind.REFERENCE, '.named(1)', 6);
assertHasResult(SearchResultKind.REFERENCE, '.named(2)', 6);
@@ -77,7 +75,7 @@
}
''');
await findElementReferences('named(p); // A', true);
- expect(searchElement.kind, ElementKind.CONSTRUCTOR);
+ expect(searchElement!.kind, ElementKind.CONSTRUCTOR);
expect(results, hasLength(1));
assertHasResult(SearchResultKind.REFERENCE, '.named(1)', 6);
}
@@ -93,7 +91,7 @@
}
''');
await findElementReferences('A(p)', false);
- expect(searchElement.kind, ElementKind.CONSTRUCTOR);
+ expect(searchElement!.kind, ElementKind.CONSTRUCTOR);
expect(results, hasLength(2));
assertHasResult(SearchResultKind.REFERENCE, '(1)', 0);
assertHasResult(SearchResultKind.REFERENCE, '(2)', 0);
@@ -122,7 +120,7 @@
}
''');
await findElementReferences('A(p)', true);
- expect(searchElement.kind, ElementKind.CONSTRUCTOR);
+ expect(searchElement!.kind, ElementKind.CONSTRUCTOR);
expect(results, hasLength(1));
assertHasResult(SearchResultKind.REFERENCE, '(1)', 0);
}
@@ -140,7 +138,7 @@
}
''');
await findElementReferences('E on int', false);
- expect(searchElement.kind, ElementKind.EXTENSION);
+ expect(searchElement!.kind, ElementKind.EXTENSION);
expect(results, hasLength(2));
assertHasResult(SearchResultKind.REFERENCE, 'E.foo();');
assertHasResult(SearchResultKind.REFERENCE, 'E(0)');
@@ -167,7 +165,7 @@
}
''');
await findElementReferences('fff; // declaration', false);
- expect(searchElement.kind, ElementKind.FIELD);
+ expect(searchElement!.kind, ElementKind.FIELD);
expect(results, hasLength(10));
assertHasResult(SearchResultKind.WRITE, 'fff); // in constructor');
assertHasResult(SearchResultKind.WRITE, 'fff = 1;');
@@ -200,7 +198,7 @@
''');
{
await findElementReferences('fff =>', false);
- expect(searchElement.kind, ElementKind.FIELD);
+ expect(searchElement!.kind, ElementKind.FIELD);
expect(results, hasLength(4));
assertHasResult(SearchResultKind.READ, 'fff); // in m()');
assertHasResult(SearchResultKind.WRITE, 'fff = 1;');
@@ -229,7 +227,7 @@
}
''');
await findElementReferences('fff); // in constructor', false);
- expect(searchElement.kind, ElementKind.FIELD);
+ expect(searchElement!.kind, ElementKind.FIELD);
expect(results, hasLength(3));
assertHasResult(SearchResultKind.WRITE, 'fff); // in constructor');
assertHasResult(SearchResultKind.WRITE, 'fff = 2;');
@@ -257,7 +255,7 @@
}
''');
await findElementReferences('fff; // declaration', false);
- expect(searchElement.kind, ElementKind.FIELD);
+ expect(searchElement!.kind, ElementKind.FIELD);
expect(results, hasLength(8));
// m()
assertHasResult(SearchResultKind.WRITE, 'fff = 2;');
@@ -288,7 +286,7 @@
''');
{
await findElementReferences('fff =>', false);
- expect(searchElement.kind, ElementKind.FIELD);
+ expect(searchElement!.kind, ElementKind.FIELD);
expect(results, hasLength(4));
assertHasResult(SearchResultKind.READ, 'fff); // in m()');
assertHasResult(SearchResultKind.WRITE, 'fff = 1;');
@@ -322,7 +320,7 @@
''');
{
await findElementReferences('fff =>', false);
- expect(searchElement.kind, ElementKind.FIELD);
+ expect(searchElement!.kind, ElementKind.FIELD);
expect(results, hasLength(4));
assertHasResult(SearchResultKind.READ, 'fff); // in m()');
assertHasResult(SearchResultKind.WRITE, 'fff = 1;');
@@ -348,7 +346,7 @@
}
''');
await findElementReferences('fff(p) {}', false);
- expect(searchElement.kind, ElementKind.FUNCTION);
+ expect(searchElement!.kind, ElementKind.FUNCTION);
expect(results, hasLength(2));
assertHasResult(SearchResultKind.INVOCATION, 'fff(1)');
assertHasResult(SearchResultKind.REFERENCE, 'fff);');
@@ -372,7 +370,7 @@
}
''');
await findElementReferences('fff; // in B', false);
- expect(searchElement.kind, ElementKind.FIELD);
+ expect(searchElement!.kind, ElementKind.FIELD);
assertHasResult(SearchResultKind.WRITE, 'fff = 10;');
assertHasResult(SearchResultKind.WRITE, 'fff = 20;');
assertHasResult(SearchResultKind.WRITE, 'fff = 30;');
@@ -396,7 +394,7 @@
}
''');
await findElementReferences('mmm(_) {} // in B', false);
- expect(searchElement.kind, ElementKind.METHOD);
+ expect(searchElement!.kind, ElementKind.METHOD);
assertHasResult(SearchResultKind.INVOCATION, 'mmm(10)');
assertHasResult(SearchResultKind.INVOCATION, 'mmm(20)');
assertHasResult(SearchResultKind.INVOCATION, 'mmm(30)');
@@ -420,7 +418,7 @@
}
''');
await findElementReferences('mmm(_) {} // in B', false);
- expect(searchElement.kind, ElementKind.METHOD);
+ expect(searchElement!.kind, ElementKind.METHOD);
expect(results, hasLength(1));
assertHasResult(SearchResultKind.INVOCATION, 'mmm(20)');
}
@@ -443,7 +441,7 @@
}
''');
await findElementReferences('p}) {} // in B', false);
- expect(searchElement.kind, ElementKind.PARAMETER);
+ expect(searchElement!.kind, ElementKind.PARAMETER);
assertHasResult(SearchResultKind.REFERENCE, 'p: 1');
assertHasResult(SearchResultKind.REFERENCE, 'p: 2');
assertHasResult(SearchResultKind.REFERENCE, 'p: 3');
@@ -462,7 +460,7 @@
}
''');
await findElementReferences('myLabel; // break', false);
- expect(searchElement.kind, ElementKind.LABEL);
+ expect(searchElement!.kind, ElementKind.LABEL);
expect(results, hasLength(2));
assertHasResult(SearchResultKind.REFERENCE, 'myLabel; // continue');
assertHasResult(SearchResultKind.REFERENCE, 'myLabel; // break');
@@ -479,7 +477,7 @@
}
''');
await findElementReferences('vvv = 1', false);
- expect(searchElement.kind, ElementKind.LOCAL_VARIABLE);
+ expect(searchElement!.kind, ElementKind.LOCAL_VARIABLE);
expect(results, hasLength(4));
assertHasResult(SearchResultKind.READ, 'vvv);');
assertHasResult(SearchResultKind.READ_WRITE, 'vvv += 3');
@@ -502,7 +500,7 @@
}
''');
await findElementReferences('mmm(p) {}', false);
- expect(searchElement.kind, ElementKind.METHOD);
+ expect(searchElement!.kind, ElementKind.METHOD);
expect(results, hasLength(4));
assertHasResult(SearchResultKind.INVOCATION, 'mmm(1);');
assertHasResult(SearchResultKind.REFERENCE, 'mmm); // in m()');
@@ -524,7 +522,7 @@
}
''');
await findElementReferences('foo() {}', false);
- expect(searchElement.kind, ElementKind.METHOD);
+ expect(searchElement!.kind, ElementKind.METHOD);
expect(results, hasLength(4));
assertHasResult(SearchResultKind.INVOCATION, 'foo(); // 1');
assertHasResult(SearchResultKind.REFERENCE, 'foo; // 2');
@@ -544,7 +542,7 @@
}
''');
await findElementReferences('mmm(p) {}', false);
- expect(searchElement.kind, ElementKind.METHOD);
+ expect(searchElement!.kind, ElementKind.METHOD);
expect(results, hasLength(2));
assertHasResult(SearchResultKind.INVOCATION, 'mmm(10);');
assertHasResult(SearchResultKind.REFERENCE, 'mmm);');
@@ -556,7 +554,7 @@
class B extends Object with A {} // B
''');
await findElementReferences('A {}', false);
- expect(searchElement.kind, ElementKind.MIXIN);
+ expect(searchElement!.kind, ElementKind.MIXIN);
expect(results, hasLength(1));
assertHasResult(SearchResultKind.REFERENCE, 'A {} // B');
}
@@ -594,7 +592,7 @@
}
''');
await findElementReferences('ppp) {', false);
- expect(searchElement.kind, ElementKind.PARAMETER);
+ expect(searchElement!.kind, ElementKind.PARAMETER);
expect(results, hasLength(4));
assertHasResult(SearchResultKind.READ, 'ppp);');
assertHasResult(SearchResultKind.READ_WRITE, 'ppp += 3');
@@ -801,9 +799,10 @@
}
''');
await findElementReferences('ppp;', false);
+ var searchElement = this.searchElement!;
expect(searchElement.kind, ElementKind.PREFIX);
expect(searchElement.name, 'ppp');
- expect(searchElement.location.startLine, 1);
+ expect(searchElement.location!.startLine, 1);
expect(results, hasLength(2));
assertHasResult(SearchResultKind.REFERENCE, 'ppp.Future');
assertHasResult(SearchResultKind.REFERENCE, 'ppp.Stream');
@@ -820,7 +819,7 @@
}
''');
await findElementReferences('vvv = 1', false);
- expect(searchElement.kind, ElementKind.TOP_LEVEL_VARIABLE);
+ expect(searchElement!.kind, ElementKind.TOP_LEVEL_VARIABLE);
expect(results, hasLength(4));
assertHasResult(SearchResultKind.READ, 'vvv);');
assertHasResult(SearchResultKind.WRITE, 'vvv += 3');
@@ -839,7 +838,7 @@
''');
{
await findElementReferences('vvv =>', false);
- expect(searchElement.kind, ElementKind.TOP_LEVEL_VARIABLE);
+ expect(searchElement!.kind, ElementKind.TOP_LEVEL_VARIABLE);
expect(results, hasLength(2));
assertHasResult(SearchResultKind.READ, 'vvv);');
assertHasResult(SearchResultKind.WRITE, 'vvv = 1;');
@@ -860,7 +859,7 @@
}
''');
await findElementReferences('int a', false);
- expect(searchElement.kind, ElementKind.CLASS);
+ expect(searchElement!.kind, ElementKind.CLASS);
assertHasResult(SearchResultKind.REFERENCE, 'int a');
assertHasResult(SearchResultKind.REFERENCE, 'int b');
}
@@ -872,7 +871,7 @@
}
''');
await findElementReferences('F =', false);
- expect(searchElement.kind, ElementKind.TYPE_ALIAS);
+ expect(searchElement!.kind, ElementKind.TYPE_ALIAS);
expect(results, hasLength(1));
assertHasResult(SearchResultKind.REFERENCE, 'F f');
}
@@ -885,13 +884,13 @@
''');
// Can find `A`.
await findElementReferences('A<T> =', false);
- expect(searchElement.kind, ElementKind.TYPE_ALIAS);
+ expect(searchElement!.kind, ElementKind.TYPE_ALIAS);
expect(results, hasLength(1));
assertHasResult(SearchResultKind.REFERENCE, 'A<String>');
// Can find in `A`.
await findElementReferences('int,', false);
- expect(searchElement.kind, ElementKind.CLASS);
+ expect(searchElement!.kind, ElementKind.CLASS);
assertHasResult(SearchResultKind.REFERENCE, 'int,');
}
@@ -902,7 +901,7 @@
}
''');
await findElementReferences('F()', false);
- expect(searchElement.kind, ElementKind.TYPE_ALIAS);
+ expect(searchElement!.kind, ElementKind.TYPE_ALIAS);
expect(results, hasLength(1));
assertHasResult(SearchResultKind.REFERENCE, 'F f');
}
@@ -915,7 +914,7 @@
}
''');
await findElementReferences('T> {', false);
- expect(searchElement.kind, ElementKind.TYPE_PARAMETER);
+ expect(searchElement!.kind, ElementKind.TYPE_PARAMETER);
expect(results, hasLength(2));
assertHasResult(SearchResultKind.REFERENCE, 'T f;');
assertHasResult(SearchResultKind.REFERENCE, 'T m()');
diff --git a/pkg/analysis_server/test/search/member_declarations_test.dart b/pkg/analysis_server/test/search/member_declarations_test.dart
index 46e9a46..d838f8e 100644
--- a/pkg/analysis_server/test/search/member_declarations_test.dart
+++ b/pkg/analysis_server/test/search/member_declarations_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
@@ -20,10 +18,11 @@
@reflectiveTest
class MemberDeclarationsTest extends AbstractSearchDomainTest {
void assertHasDeclaration(ElementKind kind, String className) {
- result = findTopLevelResult(kind, className);
+ var result = findTopLevelResult(kind, className);
if (result == null) {
fail('Not found: kind=$kind in="$className"\nin\n' + results.join('\n'));
}
+ this.result = result;
}
Future findMemberDeclarations(String name) async {
@@ -35,7 +34,7 @@
return waitForSearchResults();
}
- SearchResult findTopLevelResult(ElementKind kind, String enclosingClass) {
+ SearchResult? findTopLevelResult(ElementKind kind, String enclosingClass) {
for (var result in results) {
var element = result.path[0];
var clazz = result.path[1];
diff --git a/pkg/analysis_server/test/search/member_references_test.dart b/pkg/analysis_server/test/search/member_references_test.dart
index ca74c67..a2c7b18 100644
--- a/pkg/analysis_server/test/search/member_references_test.dart
+++ b/pkg/analysis_server/test/search/member_references_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/search/test_all.dart b/pkg/analysis_server/test/search/test_all.dart
index b4e4f8c..403be90 100644
--- a/pkg/analysis_server/test/search/test_all.dart
+++ b/pkg/analysis_server/test/search/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'declarations_test.dart' as declarations_test;
diff --git a/pkg/analysis_server/test/search/top_level_declarations_test.dart b/pkg/analysis_server/test/search/top_level_declarations_test.dart
index 37a7cf8..2242204 100644
--- a/pkg/analysis_server/test/search/top_level_declarations_test.dart
+++ b/pkg/analysis_server/test/search/top_level_declarations_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
@@ -20,14 +18,15 @@
@reflectiveTest
class TopLevelDeclarationsTest extends AbstractSearchDomainTest {
void assertHasDeclaration(ElementKind kind, String name) {
- result = findTopLevelResult(kind, name);
+ var result = findTopLevelResult(kind, name);
if (result == null) {
fail('Not found: kind=$kind name="$name"\nin\n' + results.join('\n'));
}
+ this.result = result;
}
void assertNoDeclaration(ElementKind kind, String name) {
- result = findTopLevelResult(kind, name);
+ var result = findTopLevelResult(kind, name);
if (result != null) {
fail('Unexpected: kind=$kind name="$name"\nin\n' + results.join('\n'));
}
@@ -44,7 +43,7 @@
return waitForSearchResults();
}
- SearchResult findTopLevelResult(ElementKind kind, String name) {
+ SearchResult? findTopLevelResult(ElementKind kind, String name) {
for (var result in results) {
var element = result.path[0];
if (element.kind == kind && element.name == name) {
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart
index 701f7c5..039c915 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.dart b/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.dart
index 8a2fcd3b..81532df 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/deprecated_member_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/deprecated_member_test.dart
index fe82af1..44d0f92 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/deprecated_member_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/deprecated_member_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_test.dart
index 5faa5df..de08d73 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'completion_relevance.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/is_no_such_method_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/is_no_such_method_test.dart
index 52327e6..388a377 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/is_no_such_method_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/is_no_such_method_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/local_variable_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/local_variable_test.dart
index 284020f..c1481fb 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/local_variable_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/local_variable_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart
index b9c200d..ff02ed2 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../../../src/utilities/mock_packages.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/non_type_member_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/non_type_member_test.dart
index 27f3789..084c91c 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/non_type_member_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/non_type_member_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/static_member_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/static_member_test.dart
index 7042169..314b1e0 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/static_member_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/static_member_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'completion_relevance.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart b/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart
index d6bf383..d6679e5 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'bool_assignment_test.dart' as bool_assignments;
diff --git a/pkg/analysis_server/test/services/completion/dart/test_all.dart b/pkg/analysis_server/test/services/completion/dart/test_all.dart
index 7e3c13c..c8ccce6 100644
--- a/pkg/analysis_server/test/services/completion/dart/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'arglist_contributor_test.dart' as arglist_test;
diff --git a/pkg/analysis_server/test/services/completion/test_all.dart b/pkg/analysis_server/test/services/completion/test_all.dart
index 4aaa784..533fb7a 100644
--- a/pkg/analysis_server/test/services/completion/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'dart/test_all.dart' as dart_all;
diff --git a/pkg/analysis_server/test/services/correction/sort_members_test.dart b/pkg/analysis_server/test/services/correction/sort_members_test.dart
index 88cc25d..a766800 100644
--- a/pkg/analysis_server/test/services/correction/sort_members_test.dart
+++ b/pkg/analysis_server/test/services/correction/sort_members_test.dart
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/services/correction/sort_members.dart';
+import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -924,7 +925,7 @@
Future<void> _parseTestUnit(String code) async {
addTestSource(code);
- var result = session.getParsedUnit(testFile);
+ var result = session.getParsedUnit2(testFile) as ParsedUnitResult;
testUnit = result.unit;
}
}
diff --git a/pkg/analysis_server/test/services/test_all.dart b/pkg/analysis_server/test/services/test_all.dart
index 85f29c1..954023d 100644
--- a/pkg/analysis_server/test/services/test_all.dart
+++ b/pkg/analysis_server/test/services/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'completion/test_all.dart' as completion_all;
diff --git a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
index 7057898..2cd24c1 100644
--- a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/computer/imported_elements_computer.dart';
import 'package:analyzer/dart/analysis/results.dart';
@@ -21,9 +19,9 @@
@reflectiveTest
class ImportedElementsComputerTest extends AbstractContextTest {
- String sourcePath;
+ late String sourcePath;
- List<ImportedElements> importedElements;
+ late List<ImportedElements> importedElements;
void assertElements(List<ImportedElements> expectedElementsList) {
expect(importedElements, hasLength(expectedElementsList.length));
@@ -475,7 +473,7 @@
var result =
await session.getResolvedUnit2(sourcePath) as ResolvedUnitResult;
var computer = ImportedElementsComputer(
- result.unit, content.indexOf(selection), selection.length);
+ result.unit!, content.indexOf(selection), selection.length);
importedElements = computer.compute();
}
}
diff --git a/pkg/analysis_server/test/src/computer/test_all.dart b/pkg/analysis_server/test/src/computer/test_all.dart
index a1243b2..1a04173 100644
--- a/pkg/analysis_server/test/src/computer/test_all.dart
+++ b/pkg/analysis_server/test/src/computer/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'closing_labels_computer_test.dart' as closing_labels_computer;
diff --git a/pkg/analysis_server/test/src/domain_abstract_test.dart b/pkg/analysis_server/test/src/domain_abstract_test.dart
index 73c72eb..36ca0d3 100644
--- a/pkg/analysis_server/test/src/domain_abstract_test.dart
+++ b/pkg/analysis_server/test/src/domain_abstract_test.dart
@@ -2,17 +2,17 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/domain_abstract.dart';
import 'package:analysis_server/src/plugin/plugin_manager.dart';
import 'package:analysis_server/src/protocol_server.dart' hide Element;
+import 'package:analyzer/instrumentation/service.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../analysis_abstract.dart';
+import 'plugin/plugin_manager_test.dart';
void main() {
defineReflectiveSuite(() {
@@ -38,8 +38,8 @@
Future<void> test_waitForResponses_nonEmpty_noTimeout_immediate() async {
AbstractRequestHandler handler = TestAbstractRequestHandler(server);
- PluginInfo plugin1 = DiscoveredPluginInfo('p1', '', '', null, null);
- PluginInfo plugin2 = DiscoveredPluginInfo('p2', '', '', null, null);
+ var plugin1 = _pluginInfo('p1');
+ var plugin2 = _pluginInfo('p2');
var response1 = plugin.Response('1', 1);
var response2 = plugin.Response('2', 2);
var futures = <PluginInfo, Future<plugin.Response>>{
@@ -52,8 +52,8 @@
Future<void> test_waitForResponses_nonEmpty_noTimeout_withError() async {
AbstractRequestHandler handler = TestAbstractRequestHandler(server);
- PluginInfo plugin1 = DiscoveredPluginInfo('p1', '', '', null, null);
- PluginInfo plugin2 = DiscoveredPluginInfo('p2', '', '', null, null);
+ var plugin1 = _pluginInfo('p1');
+ var plugin2 = _pluginInfo('p2');
var response1 = plugin.Response('1', 1);
var response2 = plugin.Response('2', 2,
error: plugin.RequestError(
@@ -68,9 +68,9 @@
Future<void> test_waitForResponses_nonEmpty_timeout_someDelayed() async {
AbstractRequestHandler handler = TestAbstractRequestHandler(server);
- PluginInfo plugin1 = DiscoveredPluginInfo('p1', '', '', null, null);
- PluginInfo plugin2 = DiscoveredPluginInfo('p2', '', '', null, null);
- PluginInfo plugin3 = DiscoveredPluginInfo('p3', '', '', null, null);
+ var plugin1 = _pluginInfo('p1');
+ var plugin2 = _pluginInfo('p2');
+ var plugin3 = _pluginInfo('p3');
var response1 = plugin.Response('1', 1);
var response2 = plugin.Response('2', 2);
var response3 = plugin.Response('3', 3);
@@ -82,6 +82,11 @@
var responses = await handler.waitForResponses(futures, timeout: 50);
expect(responses, unorderedEquals([response2]));
}
+
+ PluginInfo _pluginInfo(String path) {
+ return DiscoveredPluginInfo(path, '', '', TestNotificationManager(),
+ InstrumentationService.NULL_SERVICE);
+ }
}
class TestAbstractRequestHandler extends AbstractRequestHandler {
diff --git a/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart b/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
index 32f0198..68ef83c 100644
--- a/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
@@ -2,9 +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.
-// @dart = 2.9
-
import 'package:analysis_server/src/protocol_server.dart';
+import 'package:collection/collection.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -471,16 +470,15 @@
}
static void assertNoSuggestion(AvailableSuggestionSet set, String label,
- {ElementKind kind}) {
- var suggestion = set.items.singleWhere(
- (s) => s.label == label && (kind == null || s.element.kind == kind),
- orElse: () => null);
+ {ElementKind? kind}) {
+ var suggestion = set.items.singleWhereOrNull(
+ (s) => s.label == label && (kind == null || s.element.kind == kind));
expect(suggestion, null);
}
static AvailableSuggestion _getSuggestion(
AvailableSuggestionSet set, String label,
- {ElementKind kind}) {
+ {ElementKind? kind}) {
return set.items.singleWhere(
(s) => s.label == label && (kind == null || s.element.kind == kind));
}
diff --git a/pkg/analysis_server/test/src/domains/completion/available_suggestions_base.dart b/pkg/analysis_server/test/src/domains/completion/available_suggestions_base.dart
index 76e3d5c..d9417a4 100644
--- a/pkg/analysis_server/test/src/domains/completion/available_suggestions_base.dart
+++ b/pkg/analysis_server/test/src/domains/completion/available_suggestions_base.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'dart:convert';
import 'package:analysis_server/protocol/protocol_constants.dart';
@@ -45,11 +43,11 @@
var params = CompletionAvailableSuggestionsParams.fromNotification(
notification,
);
- for (var set in params.changedLibraries) {
+ for (var set in params.changedLibraries!) {
idToSetMap[set.id] = set;
uriToSetMap[set.uri] = set;
}
- for (var id in params.removedLibraries) {
+ for (var id in params.removedLibraries!) {
var set = idToSetMap.remove(id);
uriToSetMap.remove(set?.uri);
}
@@ -69,9 +67,7 @@
/// Remove the set with the given [uri].
/// The set must be already received.
void removeSet(String uri) {
- var set = uriToSetMap.remove(uri);
- expect(set, isNotNull);
-
+ var set = uriToSetMap.remove(uri)!;
idToSetMap.remove(set.id);
}
diff --git a/pkg/analysis_server/test/src/domains/completion/get_suggestion_details_test.dart b/pkg/analysis_server/test/src/domains/completion/get_suggestion_details_test.dart
index 9b4d38a..9009034 100644
--- a/pkg/analysis_server/test/src/domains/completion/get_suggestion_details_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/get_suggestion_details_test.dart
@@ -2,10 +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.
-// @dart = 2.9
-
import 'package:analysis_server/src/protocol_server.dart';
-import 'package:meta/meta.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -39,7 +36,7 @@
);
expect(result.completion, 'MyEnum.aaa');
- _assertTestFileChange(result.change, r'''
+ _assertTestFileChange(result.change!, r'''
import 'package:test/a.dart';
main() {} // ref
@@ -63,7 +60,7 @@
);
expect(result.completion, 'sin');
- _assertEmptyChange(result.change);
+ _assertEmptyChange(result.change!);
}
Future<void> test_existingImport_prefixed() async {
@@ -83,7 +80,7 @@
);
expect(result.completion, 'math.sin');
- _assertEmptyChange(result.change);
+ _assertEmptyChange(result.change!);
}
Future<void> test_invalid_library() async {
@@ -92,7 +89,7 @@
var response = await waitResponse(
_buildRequest(id: -1, label: 'foo', offset: 0),
);
- expect(response.error.code, RequestErrorCode.INVALID_PARAMETER);
+ expect(response.error!.code, RequestErrorCode.INVALID_PARAMETER);
}
Future<void> test_newImport() async {
@@ -110,7 +107,7 @@
);
expect(result.completion, 'sin');
- _assertTestFileChange(result.change, r'''
+ _assertTestFileChange(result.change!, r'''
import 'dart:math';
main() {} // ref
@@ -139,7 +136,7 @@
);
expect(result.completion, 'sin');
- _assertTestFileChange(result.change, r'''
+ _assertTestFileChange(result.change!, r'''
library foo;
import 'dart:math';
@@ -173,7 +170,7 @@
);
expect(result.completion, 'sin');
- _assertTestFileChange(result.change, r'''
+ _assertTestFileChange(result.change!, r'''
@myAnnotation
import 'dart:math';
@@ -205,7 +202,7 @@
);
expect(result.completion, 'sin');
- _assertTestFileChange(result.change, r'''
+ _assertTestFileChange(result.change!, r'''
import 'dart:async';
import 'dart:math';
@myAnnotation
@@ -237,7 +234,7 @@
);
expect(result.completion, 'sin');
- _assertTestFileChange(result.change, r'''
+ _assertTestFileChange(result.change!, r'''
import 'dart:math';
part 'a.dart';
@@ -260,10 +257,10 @@
}
Request _buildRequest({
- String file,
- @required int id,
- @required String label,
- @required int offset,
+ String? file,
+ required int id,
+ required String label,
+ required int offset,
}) {
return CompletionGetSuggestionDetailsParams(
file ?? testFile,
diff --git a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
index 9ec1326..195678c 100644
--- a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/protocol_server.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -36,8 +34,7 @@
}
void _assertHasImport(String exportingUri, String declaringUri, String name) {
- var existingImports = fileToExistingImports[testFile];
- expect(existingImports, isNotNull);
+ var existingImports = fileToExistingImports[testFile]!;
var existingImport = existingImports.imports.singleWhere((import) =>
existingImports.elements.strings[import.uri] == exportingUri);
@@ -64,7 +61,7 @@
var results = await _getSuggestions(testFile, 0);
expect(results.includedElementKinds, isNotEmpty);
- var includedIdSet = results.includedSuggestionSets.map((set) => set.id);
+ var includedIdSet = results.includedSuggestionSets!.map((set) => set.id);
expect(includedIdSet, contains(mathSet.id));
expect(includedIdSet, contains(asyncSet.id));
}
@@ -107,7 +104,7 @@
unorderedEquals([ElementKind.CONSTRUCTOR]),
);
- var includedIdSet = results.includedSuggestionSets.map((set) => set.id);
+ var includedIdSet = results.includedSuggestionSets!.map((set) => set.id);
expect(includedIdSet, contains(mathSet.id));
expect(includedIdSet, contains(asyncSet.id));
}
@@ -140,7 +137,7 @@
var results = await _getSuggestions(testPath, 0);
expect(
- results.includedSuggestionSets.singleWhere((set) {
+ results.includedSuggestionSets!.singleWhere((set) {
return set.id == aSet.id;
}).displayUri,
'../a.dart',
@@ -156,7 +153,7 @@
var results = await _getSuggestions(testPath, 0);
expect(
- results.includedSuggestionSets.singleWhere((set) {
+ results.includedSuggestionSets!.singleWhere((set) {
return set.id == aSet.id;
}).displayUri,
isNull,
@@ -242,7 +239,7 @@
testCode.indexOf('); // ref'),
);
- var includedTags = results.includedSuggestionRelevanceTags;
+ var includedTags = results.includedSuggestionRelevanceTags!;
int findBoost(String tag) {
for (var includedTag in includedTags) {
if (includedTag.tag == tag) {
@@ -276,7 +273,7 @@
testCode.indexOf(' // ref'),
);
- assertJsonText(results.includedSuggestionRelevanceTags, r'''
+ assertJsonText(results.includedSuggestionRelevanceTags!, r'''
[
{
"tag": "ElementKind.PREFIX",
@@ -340,7 +337,7 @@
testCode.indexOf('); // ref'),
);
- assertJsonText(results.includedSuggestionRelevanceTags, r'''
+ assertJsonText(results.includedSuggestionRelevanceTags!, r'''
[
{
"tag": "ElementKind.PREFIX",
@@ -404,7 +401,7 @@
testCode.indexOf('); // ref'),
);
- assertJsonText(results.includedSuggestionRelevanceTags, r'''
+ assertJsonText(results.includedSuggestionRelevanceTags!, r'''
[
{
"tag": "ElementKind.MIXIN",
@@ -475,7 +472,7 @@
testCode.indexOf(' // ref'),
);
- assertJsonText(results.includedSuggestionRelevanceTags, r'''
+ assertJsonText(results.includedSuggestionRelevanceTags!, r'''
[
{
"tag": "ElementKind.PREFIX",
@@ -535,7 +532,7 @@
testCode.indexOf(' // ref'),
);
- assertJsonText(results.includedSuggestionRelevanceTags, r'''
+ assertJsonText(results.includedSuggestionRelevanceTags!, r'''
[
{
"tag": "ElementKind.MIXIN",
@@ -605,7 +602,7 @@
testCode.indexOf(']; // ref'),
);
- assertJsonText(results.includedSuggestionRelevanceTags, r'''
+ assertJsonText(results.includedSuggestionRelevanceTags!, r'''
[
{
"tag": "dart:core::int",
diff --git a/pkg/analysis_server/test/src/domains/completion/test_all.dart b/pkg/analysis_server/test/src/domains/completion/test_all.dart
index dc4bd6b..1452e21 100644
--- a/pkg/analysis_server/test/src/domains/completion/test_all.dart
+++ b/pkg/analysis_server/test/src/domains/completion/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'available_suggestion_sets_test.dart' as available_suggestion_sets;
diff --git a/pkg/analysis_server/test/src/domains/flutter/base.dart b/pkg/analysis_server/test/src/domains/flutter/base.dart
index 88d9c9d..2cadf8b 100644
--- a/pkg/analysis_server/test/src/domains/flutter/base.dart
+++ b/pkg/analysis_server/test/src/domains/flutter/base.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/flutter/flutter_domain.dart';
import 'package:analysis_server/src/protocol_server.dart';
import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/src/domains/flutter/get_widget_description_test.dart b/pkg/analysis_server/test/src/domains/flutter/get_widget_description_test.dart
index fe6b73a..39baacd 100644
--- a/pkg/analysis_server/test/src/domains/flutter/get_widget_description_test.dart
+++ b/pkg/analysis_server/test/src/domains/flutter/get_widget_description_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/protocol_server.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -34,7 +32,7 @@
expect(property.expression, "'aaa'");
expect(property.isRequired, isTrue);
expect(property.editor, isNotNull);
- expect(property.value.stringValue, 'aaa');
+ expect(property.value!.stringValue, 'aaa');
}
Future<void> test_notInstanceCreation() async {
@@ -46,7 +44,7 @@
var response = await getWidgetDescriptionResponse('42');
expect(
- response.error.code,
+ response.error!.code,
RequestErrorCode.FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET,
);
}
@@ -60,7 +58,7 @@
var response = await getWidgetDescriptionResponse('new Foo');
expect(
- response.error.code,
+ response.error!.code,
RequestErrorCode.FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET,
);
}
diff --git a/pkg/analysis_server/test/src/domains/flutter/set_property_value_test.dart b/pkg/analysis_server/test/src/domains/flutter/set_property_value_test.dart
index 10c2eb9..56a8c90 100644
--- a/pkg/analysis_server/test/src/domains/flutter/set_property_value_test.dart
+++ b/pkg/analysis_server/test/src/domains/flutter/set_property_value_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/protocol_server.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -135,7 +133,7 @@
Future<FlutterSetWidgetPropertyValueResult> _setValue(
FlutterWidgetProperty property,
- FlutterWidgetPropertyValue value,
+ FlutterWidgetPropertyValue? value,
) async {
var response = await _setValueResponse(property, value);
expect(response.error, isNull);
@@ -144,7 +142,7 @@
Future<Response> _setValueResponse(
FlutterWidgetProperty property,
- FlutterWidgetPropertyValue value,
+ FlutterWidgetPropertyValue? value,
) async {
var request = FlutterSetWidgetPropertyValueParams(
property.id,
diff --git a/pkg/analysis_server/test/src/domains/flutter/test_all.dart b/pkg/analysis_server/test/src/domains/flutter/test_all.dart
index 97e2c81..2030531 100644
--- a/pkg/analysis_server/test/src/domains/flutter/test_all.dart
+++ b/pkg/analysis_server/test/src/domains/flutter/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'get_widget_description_test.dart' as get_widget_description;
diff --git a/pkg/analysis_server/test/src/domains/test_all.dart b/pkg/analysis_server/test/src/domains/test_all.dart
index dc9a595..dac4cfe 100644
--- a/pkg/analysis_server/test/src/domains/test_all.dart
+++ b/pkg/analysis_server/test/src/domains/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'completion/test_all.dart' as completion;
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart
index 7096a77..6d57e25 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'dart:async';
import 'package:analysis_server/protocol/protocol.dart';
@@ -25,15 +23,16 @@
@reflectiveTest
class FlutterNotificationOutlineTest extends AbstractAnalysisTest {
- Folder flutterFolder;
+ late Folder flutterFolder;
final Map<FlutterService, List<String>> flutterSubscriptions = {};
final Completer<void> _outlineReceived = Completer();
- FlutterOutline outline;
+ late FlutterOutline outline;
FlutterDomainHandler get flutterHandler =>
- server.handlers.singleWhere((handler) => handler is FlutterDomainHandler);
+ server.handlers.singleWhere((handler) => handler is FlutterDomainHandler)
+ as FlutterDomainHandler;
void addFlutterSubscription(FlutterService service, String file) {
// add file to subscription
@@ -97,25 +96,25 @@
await prepareOutline();
var unitOutline = outline;
- var myWidgetOutline = unitOutline.children[0];
+ var myWidgetOutline = unitOutline.children![0];
expect(myWidgetOutline.kind, FlutterOutlineKind.DART_ELEMENT);
- expect(myWidgetOutline.dartElement.name, 'MyWidget');
+ expect(myWidgetOutline.dartElement!.name, 'MyWidget');
- var buildOutline = myWidgetOutline.children[0];
+ var buildOutline = myWidgetOutline.children![0];
expect(buildOutline.kind, FlutterOutlineKind.DART_ELEMENT);
- expect(buildOutline.dartElement.name, 'build');
+ expect(buildOutline.dartElement!.name, 'build');
- var columnOutline = buildOutline.children[0];
+ var columnOutline = buildOutline.children![0];
expect(columnOutline.kind, FlutterOutlineKind.NEW_INSTANCE);
expect(columnOutline.className, 'Column');
expect(columnOutline.children, hasLength(2));
- var textOutlineA = columnOutline.children[0];
+ var textOutlineA = columnOutline.children![0];
expect(textOutlineA.kind, FlutterOutlineKind.NEW_INSTANCE);
expect(textOutlineA.className, 'Text');
expect(textOutlineA.offset, code.indexOf("const Text('aaa')"));
- var textOutlineB = columnOutline.children[1];
+ var textOutlineB = columnOutline.children![1];
expect(textOutlineB.kind, FlutterOutlineKind.NEW_INSTANCE);
expect(textOutlineB.className, 'Text');
expect(textOutlineB.offset, code.indexOf("const Text('bbb')"));
diff --git a/pkg/analysis_server/test/src/flutter/test_all.dart b/pkg/analysis_server/test/src/flutter/test_all.dart
index 54e575a..48db007 100644
--- a/pkg/analysis_server/test/src/flutter/test_all.dart
+++ b/pkg/analysis_server/test/src/flutter/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'flutter_outline_computer_test.dart' as outline_computer;
diff --git a/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart b/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
index c9c355e..004e07b 100644
--- a/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/protocol_server.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/completion/dart/test_all.dart b/pkg/analysis_server/test/src/services/completion/dart/test_all.dart
index 06a051a..ab0ad81 100644
--- a/pkg/analysis_server/test/src/services/completion/dart/test_all.dart
+++ b/pkg/analysis_server/test/src/services/completion/dart/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'completion_test.dart' as completion;
diff --git a/pkg/analysis_server/test/src/services/completion/test_all.dart b/pkg/analysis_server/test/src/services/completion/test_all.dart
index 75303aa..19d31b3 100644
--- a/pkg/analysis_server/test/src/services/completion/test_all.dart
+++ b/pkg/analysis_server/test/src/services/completion/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'dart/test_all.dart' as dart;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
index f393c9b..a21ba3c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'add_type_parameter_test.dart' as add_type_parameter;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
index 60665b9..d182ab1 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_manager.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/analysis/session.dart';
@@ -38,7 +36,7 @@
var testFile = convertPath('/home/test/lib/test.dart');
addSource(testFile, '');
var result = await session.getResolvedLibraryValid(testFile);
- var sets = manager.forLibrary(result.element);
+ var sets = manager.forLibrary(result.element!);
expect(sets, hasLength(2));
}
@@ -49,7 +47,7 @@
var testFile = convertPath('/home/test/lib/test.dart');
addSource(testFile, '');
var result = await session.getResolvedLibraryValid(testFile);
- var sets = manager.forLibrary(result.element);
+ var sets = manager.forLibrary(result.element!);
expect(sets, hasLength(0));
}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 8d78b42..570d7a8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'add_async_test.dart' as add_async;
diff --git a/pkg/analysis_server/test/src/services/correction/test_all.dart b/pkg/analysis_server/test/src/services/correction/test_all.dart
index 96c3fa6..abc5ddb 100644
--- a/pkg/analysis_server/test/src/services/correction/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'assist/test_all.dart' as assist_all;
diff --git a/pkg/analysis_server/test/src/services/test_all.dart b/pkg/analysis_server/test/src/services/test_all.dart
index 2c3be26..e5d8aa0 100644
--- a/pkg/analysis_server/test/src/services/test_all.dart
+++ b/pkg/analysis_server/test/src/services/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'completion/test_all.dart' as completion;
diff --git a/pkg/analysis_server/test/src/test_all.dart b/pkg/analysis_server/test/src/test_all.dart
index ce38f77..0cb76aa 100644
--- a/pkg/analysis_server/test/src/test_all.dart
+++ b/pkg/analysis_server/test/src/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'cider/test_all.dart' as cider;
diff --git a/pkg/analysis_server/test/verify_sorted_test.dart b/pkg/analysis_server/test/verify_sorted_test.dart
index dff52dd..9cf62ed 100644
--- a/pkg/analysis_server/test/verify_sorted_test.dart
+++ b/pkg/analysis_server/test/verify_sorted_test.dart
@@ -134,8 +134,8 @@
}
var relativePath = pathContext.relative(path, from: testDirPath);
test(relativePath, () {
- var result = session.getParsedUnit(path);
- if (result.state != ResultState.VALID) {
+ var result = session.getParsedUnit2(path);
+ if (result is! ParsedUnitResult) {
fail('Could not parse $path');
}
var code = result.content;
diff --git a/pkg/analysis_server/tool/migration_runner.dart b/pkg/analysis_server/tool/migration_runner.dart
index 355040f..ec9b6a2 100644
--- a/pkg/analysis_server/tool/migration_runner.dart
+++ b/pkg/analysis_server/tool/migration_runner.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
/// This executable provides the ability to run the migration tool in process
/// on a single package. It should be invoked with two command-line arguments:
/// a path to a configuration file and the name of a package to migrate.
@@ -54,18 +52,14 @@
migrationTest.setUp();
print('Migrating');
await migrationTest.run(packageRoot, port);
- if (port == null) {
- print('Done');
- io.exit(0);
- } else {
- print('Done. Please point your browser to localhost:$port/\$filePath');
- }
+ migrationTest.tearDown();
+ print('Done. Please point your browser to localhost:$port/\$filePath');
}
class MigrationBase {
ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
- MockServerChannel serverChannel;
- AnalysisServer server;
+ late MockServerChannel serverChannel;
+ late AnalysisServer server;
AnalysisServer createAnalysisServer() {
//
@@ -114,8 +108,6 @@
void tearDown() {
server.done();
- server = null;
- serverChannel = null;
}
/// Returns a [Future] that completes when the server's analysis is complete.
@@ -157,11 +149,11 @@
Map<String, String> get externalPackages =>
((testInfoJson['external_packages'] ?? {}) as Map).cast<String, String>();
- String get outputRoot => testInfoJson['output_root'];
+ String get outputRoot => testInfoJson['output_root'] as String;
- int get port => testInfoJson['port'];
+ int get port => testInfoJson['port'] as int;
- String get sdkRoot => testInfoJson['sdk_root'];
+ String get sdkRoot => testInfoJson['sdk_root'] as String;
String packageRoot(String packageName) {
if (thirdPartyPackages.contains(packageName)) {
@@ -169,7 +161,7 @@
} else if (builtInPackages.contains(packageName)) {
return path.join(sdkRoot, 'pkg', packageName);
} else if (externalPackages.containsKey(packageName)) {
- return externalPackages[packageName];
+ return externalPackages[packageName] as String;
} else {
throw StateError('Unrecognized package $packageName');
}
diff --git a/pkg/analysis_server_client/test/verify_sorted_test.dart b/pkg/analysis_server_client/test/verify_sorted_test.dart
index 5a19d51..dfa4c4a 100644
--- a/pkg/analysis_server_client/test/verify_sorted_test.dart
+++ b/pkg/analysis_server_client/test/verify_sorted_test.dart
@@ -55,8 +55,8 @@
}
var relativePath = pathContext.relative(path, from: testDirPath);
test(relativePath, () {
- var result = session.getParsedUnit(path);
- if (result.state != ResultState.VALID) {
+ var result = session.getParsedUnit2(path);
+ if (result is! ParsedUnitResult) {
fail('Could not parse $path');
}
var code = result.content;
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 398e956..13fe6b3 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -11,6 +11,12 @@
Use `AnalysisSession.getLibraryByUri2()` instead.
* Deprecated `AnalysisSession.getErrors()`.
Use `AnalysisSession.getErrors2()` instead.
+* Deprecated `AnalysisSession.getParsedLibrary()`.
+ Use `AnalysisSession.getParsedLibrary2()` instead.
+* Deprecated `AnalysisSession.getParsedLibraryByElement()`.
+ Use `AnalysisSession.getParsedLibraryByElement2()` instead.
+* Deprecated `AnalysisSession.getParsedUnit()`.
+ Use `AnalysisSession.getParsedUnit2()` instead.
## 1.4.0
* Deprecated `TypeProvider.nonSubtypableClasses`.
diff --git a/pkg/analyzer/doc/tutorial/ast.md b/pkg/analyzer/doc/tutorial/ast.md
index 2adab31..3e9e3fa 100644
--- a/pkg/analyzer/doc/tutorial/ast.md
+++ b/pkg/analyzer/doc/tutorial/ast.md
@@ -55,8 +55,10 @@
```dart
void processFile(AnalysisSession session, String path) {
- ParsedUnitResult result = session.getParsedUnit(path);
- CompilationUnit unit = result.unit;
+ var result = session.getParsedUnit2(path);
+ if (result is ParsedUnitResult) {
+ CompilationUnit unit = result.unit;
+ }
}
```
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index 762a44f..a79c4af 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -49,6 +49,7 @@
implements
InvalidResult,
SomeLibraryElementResult,
+ SomeParsedLibraryResult,
SomeResolvedLibraryResult {}
/// The declaration of an [Element].
@@ -99,6 +100,8 @@
implements
InvalidResult,
SomeErrorsResult,
+ SomeParsedLibraryResult,
+ SomeParsedUnitResult,
SomeResolvedLibraryResult,
SomeResolvedUnitResult,
SomeUnitElementResult {}
@@ -121,7 +124,10 @@
///
/// Clients may not extend, implement or mix-in this class.
class NotElementOfThisSessionResult
- implements InvalidResult, SomeResolvedLibraryResult {}
+ implements
+ InvalidResult,
+ SomeParsedLibraryResult,
+ SomeResolvedLibraryResult {}
/// The type of [InvalidResult] returned when the given file is not a library,
/// but a part of a library.
@@ -131,6 +137,7 @@
implements
InvalidResult,
SomeLibraryElementResult,
+ SomeParsedLibraryResult,
SomeResolvedLibraryResult {}
/// The type of [InvalidResult] returned when the given file path does not
@@ -145,6 +152,7 @@
implements
InvalidResult,
SomeErrorsResult,
+ SomeParsedLibraryResult,
SomeResolvedLibraryResult,
SomeResolvedUnitResult,
SomeUnitElementResult {}
@@ -152,7 +160,8 @@
/// The result of building parsed AST(s) for the whole library.
///
/// Clients may not extend, implement or mix-in this class.
-abstract class ParsedLibraryResult implements AnalysisResult {
+abstract class ParsedLibraryResult
+ implements SomeParsedLibraryResult, AnalysisResult {
/// The parsed units of the library.
///
/// TODO(migration): should not be null, probably empty list
@@ -168,7 +177,8 @@
/// those discovered during scanning and parsing.
///
/// Clients may not extend, implement or mix-in this class.
-abstract class ParsedUnitResult implements AnalysisResultWithErrors {
+abstract class ParsedUnitResult
+ implements SomeParsedUnitResult, AnalysisResultWithErrors {
/// The content of the file that was scanned and parsed.
String get content;
@@ -278,9 +288,27 @@
///
/// Clients may not extend, implement or mix-in this class.
///
+/// There are existing implementations of this class.
/// [LibraryElementResult] represents a valid result.
abstract class SomeLibraryElementResult {}
+/// The result of building parsed AST(s) for the whole library.
+///
+/// Clients may not extend, implement or mix-in this class.
+///
+/// There are existing implementations of this class.
+/// [ParsedLibraryResult] represents a valid result.
+abstract class SomeParsedLibraryResult {}
+
+/// The result of parsing of a single file. The errors returned include only
+/// those discovered during scanning and parsing.
+///
+/// Clients may not extend, implement or mix-in this class.
+///
+/// There are existing implementations of this class.
+/// [ParsedUnitResult] represents a valid result.
+abstract class SomeParsedUnitResult {}
+
/// The result of building resolved AST(s) for the whole library.
///
/// Clients may not extend, implement or mix-in this class.
@@ -331,11 +359,17 @@
///
/// Clients may not extend, implement or mix-in this class.
class UnspecifiedInvalidResult
- implements InvalidResult, SomeLibraryElementResult {}
+ implements
+ InvalidResult,
+ SomeLibraryElementResult,
+ SomeParsedLibraryResult {}
/// The type of [InvalidResult] returned when the given URI corresponds to
/// a library that is served from an external summary bundle.
///
/// Clients may not extend, implement or mix-in this class.
class UriOfExternalLibraryResult
- implements InvalidResult, SomeResolvedLibraryResult {}
+ implements
+ InvalidResult,
+ SomeParsedLibraryResult,
+ SomeResolvedLibraryResult {}
diff --git a/pkg/analyzer/lib/dart/analysis/session.dart b/pkg/analyzer/lib/dart/analysis/session.dart
index 5e4b6fa..8b8db65 100644
--- a/pkg/analyzer/lib/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/dart/analysis/session.dart
@@ -64,18 +64,33 @@
///
/// Throw [ArgumentError] if the given [path] is not the defining compilation
/// unit for a library (that is, is a part of a library).
+ @Deprecated('Use getParsedLibrary2() instead')
ParsedLibraryResult getParsedLibrary(String path);
/// Return information about the results of parsing units of the library file
+ /// with the given absolute, normalized [path].
+ SomeParsedLibraryResult getParsedLibrary2(String path);
+
+ /// Return information about the results of parsing units of the library file
/// with the given library [element].
///
/// Throw [ArgumentError] if the [element] was not produced by this session.
+ @Deprecated('Use getParsedLibraryByElement2() instead')
ParsedLibraryResult getParsedLibraryByElement(LibraryElement element);
+ /// Return information about the results of parsing units of the library file
+ /// with the given library [element].
+ SomeParsedLibraryResult getParsedLibraryByElement2(LibraryElement element);
+
/// Return information about the results of parsing the file with the given
/// absolute, normalized [path].
+ @Deprecated('Use getParsedUnit2() instead')
ParsedUnitResult getParsedUnit(String path);
+ /// Return information about the results of parsing the file with the given
+ /// absolute, normalized [path].
+ SomeParsedUnitResult getParsedUnit2(String path);
+
/// Return a future that will complete with information about the results of
/// resolving all of the files in the library with the given absolute,
/// normalized [path].
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 33182f1..fd284cf 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -720,20 +720,40 @@
///
/// The [path] must be absolute and normalized.
ParsedLibraryResult getParsedLibrary(String path) {
- FileState file = _fsState.getFileForPath(path);
+ var result = getParsedLibrary2(path);
- if (file.isExternalLibrary) {
- return ParsedLibraryResultImpl.external(currentSession, file.uri);
+ if (result is NotLibraryButPartResult) {
+ throw ArgumentError('Is a part: $path');
}
+ return result as ParsedLibraryResult;
+ }
+
+ /// Return a [ParsedLibraryResult] for the library with the given [path].
+ ///
+ /// The [path] must be absolute and normalized.
+ SomeParsedLibraryResult getParsedLibrary2(String path) {
+ if (!_isAbsolutePath(path)) {
+ return InvalidPathResult();
+ }
+
+ if (!_fsState.hasUri(path)) {
+ return NotPathOfUriResult();
+ }
+
+ FileState file = _fsState.getFileForPath(path);
+
if (file.isPart) {
- throw ArgumentError('Is a part: $path');
+ return NotLibraryButPartResult();
}
var units = <ParsedUnitResult>[];
for (var unitFile in file.libraryFiles) {
var unitPath = unitFile.path;
- var unitResult = parseFileSync(unitPath);
+ var unitResult = parseFileSync2(unitPath);
+ if (unitResult is! ParsedUnitResult) {
+ return UnspecifiedInvalidResult();
+ }
units.add(unitResult);
}
@@ -744,6 +764,7 @@
///
/// Throw [ArgumentError] if the given [uri] is not the defining compilation
/// unit for a library (that is, is a part of a library).
+ @Deprecated('Use getParsedLibraryByUri2() instead')
ParsedLibraryResult getParsedLibraryByUri(Uri uri) {
var fileOr = _fsState.getFileForUri(uri);
return fileOr.map(
@@ -762,6 +783,25 @@
);
}
+ /// Return a [ParsedLibraryResult] for the library with the given [uri].
+ SomeParsedLibraryResult getParsedLibraryByUri2(Uri uri) {
+ var fileOr = _fsState.getFileForUri(uri);
+ return fileOr.map(
+ (file) {
+ if (file == null) {
+ return CannotResolveUriResult();
+ }
+ if (file.isPart) {
+ return NotLibraryButPartResult();
+ }
+ return getParsedLibrary(file.path);
+ },
+ (externalLibrary) {
+ return UriOfExternalLibraryResult();
+ },
+ );
+ }
+
/// Return a [Future] that completes with a [ResolvedLibraryResult] for the
/// Dart library file with the given [path]. If the file is not a Dart file
/// or cannot be analyzed, the [Future] completes with `null`.
@@ -1096,10 +1136,25 @@
/// The parsing is performed in the method itself, and the result is not
/// produced through the [results] stream (just because it is not a fully
/// resolved unit).
+ @Deprecated('Use parseFile2() instead')
Future<ParsedUnitResult> parseFile(String path) async {
return parseFileSync(path);
}
+ /// Return a [Future] that completes with a [ParsedUnitResult] for the file
+ /// with the given [path].
+ ///
+ /// The [path] must be absolute and normalized.
+ ///
+ /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
+ ///
+ /// The parsing is performed in the method itself, and the result is not
+ /// produced through the [results] stream (just because it is not a fully
+ /// resolved unit).
+ Future<SomeParsedUnitResult> parseFile2(String path) async {
+ return parseFileSync2(path);
+ }
+
/// Return a [ParsedUnitResult] for the file with the given [path].
///
/// The [path] must be absolute and normalized.
@@ -1109,8 +1164,27 @@
/// The parsing is performed in the method itself, and the result is not
/// produced through the [results] stream (just because it is not a fully
/// resolved unit).
+ @Deprecated('Use parseFileSync2() instead')
ParsedUnitResult parseFileSync(String path) {
_throwIfNotAbsolutePath(path);
+
+ return parseFileSync2(path) as ParsedUnitResult;
+ }
+
+ /// Return a [ParsedUnitResult] for the file with the given [path].
+ ///
+ /// The [path] must be absolute and normalized.
+ ///
+ /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
+ ///
+ /// The parsing is performed in the method itself, and the result is not
+ /// produced through the [results] stream (just because it is not a fully
+ /// resolved unit).
+ SomeParsedUnitResult parseFileSync2(String path) {
+ if (!_isAbsolutePath(path)) {
+ return InvalidPathResult();
+ }
+
FileState file = _fileTracker.getFile(path);
RecordingErrorListener listener = RecordingErrorListener();
CompilationUnit unit = file.parse(listener);
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index fe0a088..fbc5371 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -95,6 +95,7 @@
return _driver.getLibraryByUri2(uri);
}
+ @Deprecated('Use getParsedLibrary2() instead')
@override
ParsedLibraryResult getParsedLibrary(String path) {
_checkConsistency();
@@ -102,6 +103,13 @@
}
@override
+ SomeParsedLibraryResult getParsedLibrary2(String path) {
+ _checkConsistency();
+ return _driver.getParsedLibrary2(path);
+ }
+
+ @Deprecated('Use getParsedLibraryByElement2() instead')
+ @override
ParsedLibraryResult getParsedLibraryByElement(LibraryElement element) {
_checkConsistency();
_checkElementOfThisSession(element);
@@ -109,11 +117,29 @@
}
@override
+ SomeParsedLibraryResult getParsedLibraryByElement2(LibraryElement element) {
+ _checkConsistency();
+
+ if (element.session != this) {
+ return NotElementOfThisSessionResult();
+ }
+
+ return _driver.getParsedLibraryByUri2(element.source.uri);
+ }
+
+ @Deprecated('Use getParsedUnit2() instead')
+ @override
ParsedUnitResult getParsedUnit(String path) {
_checkConsistency();
return _driver.parseFileSync(path);
}
+ @override
+ SomeParsedUnitResult getParsedUnit2(String path) {
+ _checkConsistency();
+ return _driver.parseFileSync2(path);
+ }
+
@Deprecated('Use getResolvedLibrary2() instead')
@override
Future<ResolvedLibraryResult> getResolvedLibrary(String path) {
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 793b2a6..87cdde7 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1513,6 +1513,57 @@
}, throwsArgumentError);
}
+ test_getParsedLibrary2() async {
+ var content = 'class A {}';
+ addTestFile(content);
+ var result = driver.getParsedLibrary2(testFile);
+ result as ParsedLibraryResult;
+ expect(result.units, hasLength(1));
+ expect(result.units![0].path, testFile);
+ expect(result.units![0].content, content);
+ expect(result.units![0].unit, isNotNull);
+ expect(result.units![0].errors, isEmpty);
+ }
+
+ test_getParsedLibrary2_invalidPath_notAbsolute() async {
+ var result = driver.getParsedLibrary2('not_absolute.dart');
+ expect(result, isA<InvalidPathResult>());
+ }
+
+ test_getParsedLibrary2_notLibraryButPart() async {
+ addTestFile('part of my;');
+ var result = driver.getParsedLibrary2(testFile);
+ expect(result, isA<NotLibraryButPartResult>());
+ }
+
+ test_getParsedLibraryByUri2() async {
+ var content = 'class A {}';
+ addTestFile(content);
+
+ var uri = Uri.parse('package:test/test.dart');
+ var result = driver.getParsedLibraryByUri2(uri);
+ result as ParsedLibraryResult;
+ expect(result.uri, uri);
+ expect(result.units, hasLength(1));
+ expect(result.units![0].uri, uri);
+ expect(result.units![0].path, testFile);
+ expect(result.units![0].content, content);
+ }
+
+ test_getParsedLibraryByUri2_notLibrary() async {
+ addTestFile('part of my;');
+
+ var uri = Uri.parse('package:test/test.dart');
+ var result = driver.getParsedLibraryByUri2(uri);
+ expect(result, isA<NotLibraryButPartResult>());
+ }
+
+ test_getParsedLibraryByUri2_unresolvedUri() async {
+ var uri = Uri.parse('package:unknown/a.dart');
+ var result = driver.getParsedLibraryByUri2(uri);
+ expect(result, isA<CannotResolveUriResult>());
+ }
+
test_getResolvedLibrary2() async {
var content = 'class A {}';
addTestFile(content);
@@ -2480,6 +2531,70 @@
expect(error.errorCode, CompileTimeErrorCode.MISSING_DART_LIBRARY);
}
+ test_parseFile2_changedFile() async {
+ var a = convertPath('/test/lib/a.dart');
+ var b = convertPath('/test/lib/b.dart');
+
+ newFile(a, content: '');
+ newFile(b, content: r'''
+import 'a.dart';
+
+void f(A a) {}
+''');
+
+ // Ensure that [a.dart] library cycle is loaded.
+ // So, `a.dart` is in the library context.
+ await driver.getResultValid(a);
+
+ // Update the file, changing its API signature.
+ // Note that we don't call `changeFile`.
+ newFile(a, content: 'class A {}');
+
+ // Parse the file.
+ // We have not called `changeFile(a)`, so we should not read the file.
+ // Moreover, doing this will create a new library cycle [a.dart].
+ // Library cycles are compared by their identity, so we would try to
+ // reload linked summary for [a.dart], and crash.
+ {
+ var parseResult = await driver.parseFile2(a) as ParsedUnitResult;
+ expect(parseResult.unit.declarations, isEmpty);
+ }
+
+ // We have not read `a.dart`, so `A` is still not declared.
+ {
+ var bResult = await driver.getResultValid(b);
+ expect(bResult.errors, isNotEmpty);
+ }
+
+ // Notify the driver that the file was changed.
+ driver.changeFile(a);
+
+ // So, `class A {}` is declared now.
+ {
+ var parseResult = driver.parseFileSync2(a) as ParsedUnitResult;
+ expect(parseResult.unit.declarations, hasLength(1));
+ }
+ {
+ var bResult = await driver.getResultValid(b);
+ expect(bResult.errors, isEmpty);
+ }
+ }
+
+ test_parseFile2_notAbsolutePath() async {
+ var result = await driver.parseFile2('not_absolute.dart');
+ expect(result, isA<InvalidPathResult>());
+ }
+
+ test_parseFile2_notDart() async {
+ var p = convertPath('/test/bin/a.txt');
+ newFile(p, content: 'class A {}');
+
+ var parseResult = await driver.parseFile2(p) as ParsedUnitResult;
+ expect(parseResult, isNotNull);
+ expect(driver.knownFiles, contains(p));
+ }
+
+ @deprecated
test_parseFile_changedFile() async {
var a = convertPath('/test/lib/a.dart');
var b = convertPath('/test/lib/b.dart');
@@ -2529,12 +2644,14 @@
}
}
+ @deprecated
test_parseFile_notAbsolutePath() async {
expect(() async {
await driver.parseFile('not_absolute.dart');
}, throwsArgumentError);
}
+ @deprecated
test_parseFile_notDart() async {
var p = convertPath('/test/bin/a.txt');
newFile(p, content: 'class A {}');
@@ -2544,6 +2661,138 @@
expect(driver.knownFiles, contains(p));
}
+ test_parseFileSync2_changedFile() async {
+ var a = convertPath('/test/lib/a.dart');
+ var b = convertPath('/test/lib/b.dart');
+
+ newFile(a, content: '');
+ newFile(b, content: r'''
+import 'a.dart';
+
+void f(A a) {}
+''');
+
+ // Ensure that [a.dart] library cycle is loaded.
+ // So, `a.dart` is in the library context.
+ await driver.getResultValid(a);
+
+ // Update the file, changing its API signature.
+ // Note that we don't call `changeFile`.
+ newFile(a, content: 'class A {}');
+
+ // Parse the file.
+ // We have not called `changeFile(a)`, so we should not read the file.
+ // Moreover, doing this will create a new library cycle [a.dart].
+ // Library cycles are compared by their identity, so we would try to
+ // reload linked summary for [a.dart], and crash.
+ {
+ var parseResult = driver.parseFileSync2(a) as ParsedUnitResult;
+ expect(parseResult.unit.declarations, isEmpty);
+ }
+
+ // We have not read `a.dart`, so `A` is still not declared.
+ {
+ var bResult = await driver.getResultValid(b);
+ expect(bResult.errors, isNotEmpty);
+ }
+
+ // Notify the driver that the file was changed.
+ driver.changeFile(a);
+
+ // So, `class A {}` is declared now.
+ {
+ var parseResult = driver.parseFileSync2(a) as ParsedUnitResult;
+ expect(parseResult.unit.declarations, hasLength(1));
+ }
+ {
+ var bResult = await driver.getResultValid(b);
+ expect(bResult.errors, isEmpty);
+ }
+ }
+
+ test_parseFileSync2_doesNotReadImportedFiles() async {
+ var a = convertPath('/test/lib/a.dart');
+ var b = convertPath('/test/lib/b.dart');
+
+ newFile(a, content: '');
+ newFile(b, content: r'''
+import 'a.dart';
+''');
+
+ expect(driver.fsState.knownFilePaths, isEmpty);
+
+ // Don't read `a.dart` when parse.
+ driver.parseFileSync2(b);
+ expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+
+ // Still don't read `a.dart` when parse the second time.
+ driver.parseFileSync2(b);
+ expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+ }
+
+ test_parseFileSync2_doesNotReadPartedFiles() async {
+ var a = convertPath('/test/lib/a.dart');
+ var b = convertPath('/test/lib/b.dart');
+
+ newFile(a, content: r'''
+part of my;
+''');
+ newFile(b, content: r'''
+library my;
+part 'a.dart';
+''');
+
+ expect(driver.fsState.knownFilePaths, isEmpty);
+
+ // Don't read `a.dart` when parse.
+ driver.parseFileSync2(b);
+ expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+
+ // Still don't read `a.dart` when parse the second time.
+ driver.parseFileSync2(b);
+ expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+ }
+
+ test_parseFileSync2_languageVersion() async {
+ var path = convertPath('/test/lib/test.dart');
+
+ newFile(path, content: r'''
+// @dart = 2.7
+class A {}
+''');
+
+ var parseResult = driver.parseFileSync2(path) as ParsedUnitResult;
+ var languageVersion = parseResult.unit.languageVersionToken!;
+ expect(languageVersion.major, 2);
+ expect(languageVersion.minor, 7);
+ }
+
+ test_parseFileSync2_languageVersion_null() async {
+ var path = convertPath('/test/lib/test.dart');
+
+ newFile(path, content: r'''
+class A {}
+''');
+
+ var parseResult = driver.parseFileSync2(path) as ParsedUnitResult;
+ expect(parseResult.unit.languageVersionToken, isNull);
+ }
+
+ test_parseFileSync2_notAbsolutePath() {
+ var result = driver.parseFileSync2('not_absolute.dart');
+ expect(result, isA<InvalidPathResult>());
+ }
+
+ test_parseFileSync2_notDart() {
+ var p = convertPath('/test/bin/a.txt');
+ newFile(p, content: 'class A {}');
+
+ var parseResult = driver.parseFileSync2(p) as ParsedUnitResult;
+ expect(parseResult, isNotNull);
+ expect(driver.knownFiles, contains(p));
+ }
+
+ @deprecated
test_parseFileSync_changedFile() async {
var a = convertPath('/test/lib/a.dart');
var b = convertPath('/test/lib/b.dart');
@@ -2593,6 +2842,7 @@
}
}
+ @deprecated
test_parseFileSync_doesNotReadImportedFiles() async {
var a = convertPath('/test/lib/a.dart');
var b = convertPath('/test/lib/b.dart');
@@ -2613,6 +2863,7 @@
expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
}
+ @deprecated
test_parseFileSync_doesNotReadPartedFiles() async {
var a = convertPath('/test/lib/a.dart');
var b = convertPath('/test/lib/b.dart');
@@ -2636,6 +2887,7 @@
expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
}
+ @deprecated
test_parseFileSync_languageVersion() async {
var path = convertPath('/test/lib/test.dart');
@@ -2650,6 +2902,7 @@
expect(languageVersion.minor, 7);
}
+ @deprecated
test_parseFileSync_languageVersion_null() async {
var path = convertPath('/test/lib/test.dart');
@@ -2661,12 +2914,14 @@
expect(parseResult.unit.languageVersionToken, isNull);
}
- test_parseFileSync_notAbsolutePath() async {
+ @deprecated
+ test_parseFileSync_notAbsolutePath() {
expect(() {
driver.parseFileSync('not_absolute.dart');
}, throwsArgumentError);
}
+ @deprecated
test_parseFileSync_notDart() {
var p = convertPath('/test/bin/a.txt');
newFile(p, content: 'class A {}');
diff --git a/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart b/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
index 6984d0e..89fdeda 100644
--- a/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
@@ -5,7 +5,6 @@
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/results.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -438,9 +437,9 @@
return library.getElementDeclaration(element);
}
- ParsedLibraryResultImpl _getParsedLibrary(String path) {
+ ParsedLibraryResult _getParsedLibrary(String path) {
var session = contextFor(path).currentSession;
- return session.getParsedLibrary(path) as ParsedLibraryResultImpl;
+ return session.getParsedLibrary2(path) as ParsedLibraryResult;
}
}
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index e75afcd..5af5179 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -79,6 +79,16 @@
expect(result.uri.toString(), 'package:dart.my/a.dart');
}
+ void test_getParsedLibrary2_notFileOfUri() async {
+ var relPath = 'dart/my/lib/a.dart';
+ newFile('$workspaceRootPath/bazel-bin/$relPath');
+
+ var path = convertPath('$workspaceRootPath/$relPath');
+ var session = contextFor(path).currentSession;
+ var result = session.getParsedLibrary2(path);
+ expect(result, isA<NotPathOfUriResult>());
+ }
+
void test_getResolvedLibrary2_notFileOfUri() async {
var relPath = 'dart/my/lib/a.dart';
newFile('$workspaceRootPath/bazel-bin/$relPath');
@@ -298,6 +308,7 @@
}, throwsArgumentError);
}
+ @deprecated
test_getParsedLibrary() async {
newFile(testPath, content: r'''
class A {}
@@ -319,6 +330,95 @@
}
}
+ test_getParsedLibrary2() async {
+ newFile(testPath, content: r'''
+class A {}
+class B {}
+''');
+
+ var parsedLibrary = session.getParsedLibraryValid(testPath);
+ expect(parsedLibrary.session, session);
+ expect(parsedLibrary.path, testPath);
+ expect(parsedLibrary.uri, Uri.parse('package:test/test.dart'));
+
+ expect(parsedLibrary.units, hasLength(1));
+ {
+ var parsedUnit = parsedLibrary.units![0];
+ expect(parsedUnit.session, session);
+ expect(parsedUnit.path, testPath);
+ expect(parsedUnit.uri, Uri.parse('package:test/test.dart'));
+ expect(parsedUnit.unit.declarations, hasLength(2));
+ }
+ }
+
+ test_getParsedLibrary2_invalidPath_notAbsolute() async {
+ var result = session.getParsedLibrary2('not_absolute.dart');
+ expect(result, isA<InvalidPathResult>());
+ }
+
+ test_getParsedLibrary2_notLibrary() async {
+ newFile(testPath, content: 'part of "a.dart";');
+ expect(session.getParsedLibrary2(testPath), isA<NotLibraryButPartResult>());
+ }
+
+ test_getParsedLibrary2_parts() async {
+ var a = convertPath('/home/test/lib/a.dart');
+ var b = convertPath('/home/test/lib/b.dart');
+ var c = convertPath('/home/test/lib/c.dart');
+
+ var aContent = r'''
+part 'b.dart';
+part 'c.dart';
+
+class A {}
+''';
+
+ var bContent = r'''
+part of 'a.dart';
+
+class B1 {}
+class B2 {}
+''';
+
+ var cContent = r'''
+part of 'a.dart';
+
+class C1 {}
+class C2 {}
+class C3 {}
+''';
+
+ newFile(a, content: aContent);
+ newFile(b, content: bContent);
+ newFile(c, content: cContent);
+
+ var parsedLibrary = session.getParsedLibraryValid(a);
+ expect(parsedLibrary.path, a);
+ expect(parsedLibrary.uri, Uri.parse('package:test/a.dart'));
+ expect(parsedLibrary.units, hasLength(3));
+
+ {
+ var aUnit = parsedLibrary.units![0];
+ expect(aUnit.path, a);
+ expect(aUnit.uri, Uri.parse('package:test/a.dart'));
+ expect(aUnit.unit.declarations, hasLength(1));
+ }
+
+ {
+ var bUnit = parsedLibrary.units![1];
+ expect(bUnit.path, b);
+ expect(bUnit.uri, Uri.parse('package:test/b.dart'));
+ expect(bUnit.unit.declarations, hasLength(2));
+ }
+
+ {
+ var cUnit = parsedLibrary.units![2];
+ expect(cUnit.path, c);
+ expect(cUnit.uri, Uri.parse('package:test/c.dart'));
+ expect(cUnit.unit.declarations, hasLength(3));
+ }
+ }
+
test_getParsedLibrary_getElementDeclaration_class() async {
newFile(testPath, content: r'''
class A {}
@@ -328,7 +428,7 @@
var libraryResult = await session.getLibraryByUriValid(
'package:test/test.dart',
);
- var parsedLibrary = session.getParsedLibrary(testPath);
+ var parsedLibrary = session.getParsedLibraryValid(testPath);
var element = libraryResult.element.getType('A')!;
var declaration = parsedLibrary.getElementDeclaration(element)!;
@@ -361,7 +461,7 @@
var typeProvider = resolvedUnit.typeProvider;
var intClass = typeProvider.intType.element;
- var parsedLibrary = session.getParsedLibrary(testPath);
+ var parsedLibrary = session.getParsedLibraryValid(testPath);
expect(() {
parsedLibrary.getElementDeclaration(intClass);
@@ -373,7 +473,7 @@
int foo = 0;
''');
- var parsedLibrary = session.getParsedLibrary(testPath);
+ var parsedLibrary = session.getParsedLibraryValid(testPath);
var unitResult = await session.getUnitElement2(testPath);
var unitElement = (unitResult as UnitElementResult).element;
@@ -425,7 +525,7 @@
part 'c.dart';
''');
- var parsedLibrary = session.getParsedLibrary(testPath);
+ var parsedLibrary = session.getParsedLibraryValid(testPath);
expect(parsedLibrary.units, hasLength(3));
expect(
@@ -442,6 +542,7 @@
);
}
+ @deprecated
test_getParsedLibrary_notLibrary() async {
newFile(testPath, content: 'part of "a.dart";');
@@ -450,6 +551,7 @@
}, throwsArgumentError);
}
+ @deprecated
test_getParsedLibrary_parts() async {
var a = convertPath('/home/test/lib/a.dart');
var b = convertPath('/home/test/lib/b.dart');
@@ -508,6 +610,7 @@
}
}
+ @deprecated
test_getParsedLibraryByElement() async {
newFile(testPath, content: '');
@@ -523,6 +626,37 @@
expect(parsedLibrary.units, hasLength(1));
}
+ test_getParsedLibraryByElement2() async {
+ newFile(testPath, content: '');
+
+ var libraryResult = await session.getLibraryByUriValid(
+ 'package:test/test.dart',
+ );
+ var element = libraryResult.element;
+
+ var parsedLibrary = session.getParsedLibraryByElementValid(element);
+ expect(parsedLibrary.session, session);
+ expect(parsedLibrary.path, testPath);
+ expect(parsedLibrary.uri, Uri.parse('package:test/test.dart'));
+ expect(parsedLibrary.units, hasLength(1));
+ }
+
+ test_getParsedLibraryByElement2_differentSession() async {
+ newFile(testPath, content: '');
+
+ var libraryResult = await session.getLibraryByUriValid(
+ 'package:test/test.dart',
+ );
+ var element = libraryResult.element;
+
+ var aaaSession =
+ contextCollection.contextFor(aaaContextPath).currentSession;
+
+ var result = aaaSession.getParsedLibraryByElement2(element);
+ expect(result, isA<NotElementOfThisSessionResult>());
+ }
+
+ @deprecated
test_getParsedLibraryByElement_differentSession() async {
newFile(testPath, content: '');
@@ -539,6 +673,7 @@
}, throwsArgumentError);
}
+ @deprecated
test_getParsedUnit() async {
newFile(testPath, content: r'''
class A {}
@@ -552,6 +687,24 @@
expect(unitResult.unit.declarations, hasLength(2));
}
+ test_getParsedUnit2() async {
+ newFile(testPath, content: r'''
+class A {}
+class B {}
+''');
+
+ var unitResult = session.getParsedUnitValid(testPath);
+ expect(unitResult.session, session);
+ expect(unitResult.path, testPath);
+ expect(unitResult.uri, Uri.parse('package:test/test.dart'));
+ expect(unitResult.unit.declarations, hasLength(2));
+ }
+
+ test_getParsedUnit2_invalidPath_notAbsolute() async {
+ var result = session.getParsedUnit2('not_absolute.dart');
+ expect(result, isA<InvalidPathResult>());
+ }
+
test_getResolvedLibrary() async {
var a = convertPath('/home/test/lib/a.dart');
var b = convertPath('/home/test/lib/b.dart');
@@ -846,6 +999,14 @@
return await getUnitElement2(path) as UnitElementResult;
}
+ ParsedLibraryResult getParsedLibraryValid(String path) {
+ return getParsedLibrary2(path) as ParsedLibraryResult;
+ }
+
+ ParsedUnitResult getParsedUnitValid(String path) {
+ return getParsedUnit2(path) as ParsedUnitResult;
+ }
+
Future<ResolvedLibraryResult> getResolvedLibraryValid(String path) async {
return await getResolvedLibrary2(path) as ResolvedLibraryResult;
}
@@ -859,6 +1020,10 @@
return await getResolvedLibraryByElement2(element) as ResolvedLibraryResult;
}
+ ParsedLibraryResult getParsedLibraryByElementValid(LibraryElement element) {
+ return getParsedLibraryByElement2(element) as ParsedLibraryResult;
+ }
+
Future<ErrorsResult> getErrorsValid(String path) async {
return await getErrors2(path) as ErrorsResult;
}
diff --git a/pkg/analyzer/test/verify_diagnostics_test.dart b/pkg/analyzer/test/verify_diagnostics_test.dart
index f99f600..c1c68c6 100644
--- a/pkg/analyzer/test/verify_diagnostics_test.dart
+++ b/pkg/analyzer/test/verify_diagnostics_test.dart
@@ -251,8 +251,8 @@
/// [path] and return the result.
ParsedUnitResult _parse(AnalysisContextCollection collection, String path) {
AnalysisSession session = collection.contextFor(path).currentSession;
- ParsedUnitResult result = session.getParsedUnit(path);
- if (result.state != ResultState.VALID) {
+ var result = session.getParsedUnit2(path);
+ if (result is! ParsedUnitResult) {
throw StateError('Unable to parse "$path"');
}
return result;
diff --git a/pkg/analyzer/tool/diagnostics/generate.dart b/pkg/analyzer/tool/diagnostics/generate.dart
index 5f8db9e..b95e8dc 100644
--- a/pkg/analyzer/tool/diagnostics/generate.dart
+++ b/pkg/analyzer/tool/diagnostics/generate.dart
@@ -361,8 +361,8 @@
/// [path] and return the result.
ParsedUnitResult _parse(AnalysisContextCollection collection, String path) {
AnalysisSession session = collection.contextFor(path).currentSession;
- ParsedUnitResult result = session.getParsedUnit(path);
- if (result.state != ResultState.VALID) {
+ var result = session.getParsedUnit2(path);
+ if (result is! ParsedUnitResult) {
throw StateError('Unable to parse "$path"');
}
return result;
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index dde44ba..897f2d7 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.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/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/ast/visitor.dart';
@@ -130,13 +131,7 @@
// Read the declaration so we can get the offset after the doc comments.
// TODO(dantup): Skip this for parts (getParsedLibrary will throw), but find
// a better solution.
- var session = codeElement.session;
- final declaration =
- session != null && !session.getFile(location.file).isPart
- ? session
- .getParsedLibrary(location.file)
- .getElementDeclaration(codeElement)
- : null;
+ final declaration = _parsedDeclaration(codeElement);
var node = declaration?.node;
if (node is VariableDeclaration) {
node = node.parent;
@@ -152,6 +147,25 @@
return converter.locationFromElement(element,
offset: codeOffset, length: codeLength);
}
+
+ static ElementDeclarationResult? _parsedDeclaration(Element element) {
+ var session = element.session;
+ if (session == null) {
+ return null;
+ }
+
+ var libraryPath = element.library?.source.fullName;
+ if (libraryPath == null) {
+ return null;
+ }
+
+ var parsedLibrary = session.getParsedLibrary2(libraryPath);
+ if (parsedLibrary is! ParsedLibraryResult) {
+ return null;
+ }
+
+ return parsedLibrary.getElementDeclaration(element);
+ }
}
class _DartNavigationComputerVisitor extends RecursiveAstVisitor<void> {
diff --git a/pkg/analyzer_utilities/lib/verify_tests.dart b/pkg/analyzer_utilities/lib/verify_tests.dart
index d6fad18..201e88d 100644
--- a/pkg/analyzer_utilities/lib/verify_tests.dart
+++ b/pkg/analyzer_utilities/lib/verify_tests.dart
@@ -103,8 +103,8 @@
if (isOkForTestAllToBeMissing(directory)) {
fail('Found "test_all.dart" in $relativePath but did not expect one');
}
- var result = session.getParsedUnit(testAllFile.path);
- if (result.state != ResultState.VALID) {
+ var result = session.getParsedUnit2(testAllFile.path);
+ if (result is! ParsedUnitResult) {
fail('Could not parse ${testAllFile.path}');
}
var importedFiles = <String>[];
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 5d38a56..315781f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -2089,9 +2089,9 @@
// This is a white-listed set of methods we need to support on constants.
if (receiver is StringConstant) {
if (arguments.length == 1) {
+ final Constant other = arguments[0];
switch (op) {
case '+':
- final Constant other = arguments[0];
if (other is StringConstant) {
return canonicalize(
new StringConstant(receiver.value + other.value));
@@ -2104,6 +2104,32 @@
typeEnvironment.coreTypes.stringLegacyRawType,
other.getType(_staticTypeContext),
isNonNullableByDefault));
+ case '[]':
+ if (enableConstFunctions) {
+ if (intFolder.isInt(other)) {
+ int index;
+ if (intFolder is JsConstantIntFolder) {
+ index = (other as DoubleConstant).value.toInt();
+ } else if (intFolder is VmConstantIntFolder) {
+ index = (other as IntConstant).value;
+ }
+ assert(index != null);
+
+ if (index < 0 || index >= receiver.value.length) {
+ return new _AbortDueToThrowConstant(
+ node, new RangeError.index(index, receiver.value));
+ }
+ return canonicalize(new StringConstant(receiver.value[index]));
+ }
+ return createErrorConstant(
+ node,
+ templateConstEvalInvalidBinaryOperandType.withArguments(
+ '[]',
+ receiver,
+ typeEnvironment.coreTypes.intNonNullableRawType,
+ other.getType(_staticTypeContext),
+ isNonNullableByDefault));
+ }
}
}
} else if (intFolder.isInt(receiver)) {
@@ -3644,6 +3670,12 @@
.firstWhere((Class klass) => klass.name == 'StateError');
throwType =
new InterfaceType(stateErrorClass, Nullability.nonNullable);
+ } else if (throwValue is RangeError) {
+ final Class rangeErrorClass = exprEvaluator
+ .coreTypes.coreLibrary.classes
+ .firstWhere((Class klass) => klass.name == 'RangeError');
+ throwType =
+ new InterfaceType(rangeErrorClass, Nullability.nonNullable);
}
assert(throwType != null);
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 19f3191..3069d7d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -927,13 +927,12 @@
@override
void printOn(StringSink sink) {
- NameSystem syntheticNames = new NameSystem();
sink.write(", name: ");
sink.write(name.text);
sink.write(", getter: ");
- printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(getter, sink);
sink.write(", setter: ");
- printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(setter, sink);
}
}
@@ -1303,9 +1302,9 @@
sink.write(", index: ");
printNodeOn(index, sink, syntheticNames: syntheticNames);
sink.write(", getter: ");
- printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(getter, sink);
sink.write(", setter: ");
- printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(setter, sink);
}
}
@@ -1503,13 +1502,12 @@
@override
void printOn(StringSink sink) {
- NameSystem syntheticNames = new NameSystem();
sink.write(", targetName: ");
sink.write(targetName);
sink.write(", readTarget: ");
- printQualifiedNameOn(readTarget, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(readTarget, sink);
sink.write(", writeTarget: ");
- printQualifiedNameOn(writeTarget, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(writeTarget, sink);
}
}
@@ -1777,13 +1775,12 @@
@override
void printOn(StringSink sink) {
- NameSystem syntheticNames = new NameSystem();
sink.write(", targetName: ");
sink.write(targetName);
sink.write(", readTarget: ");
- printQualifiedNameOn(readTarget, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(readTarget, sink);
sink.write(", writeTarget: ");
- printQualifiedNameOn(writeTarget, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(writeTarget, sink);
}
}
@@ -2192,13 +2189,12 @@
@override
void printOn(StringSink sink) {
- NameSystem syntheticNames = new NameSystem();
sink.write(", targetName: ");
sink.write(targetName);
sink.write(", readTarget: ");
- printQualifiedNameOn(readTarget, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(readTarget, sink);
sink.write(", writeTarget: ");
- printQualifiedNameOn(writeTarget, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(writeTarget, sink);
}
}
@@ -2475,9 +2471,9 @@
sink.write(", index: ");
printNodeOn(index, sink, syntheticNames: syntheticNames);
sink.write(", readTarget: ");
- printQualifiedNameOn(readTarget, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(readTarget, sink);
sink.write(", writeTarget: ");
- printQualifiedNameOn(writeTarget, sink, syntheticNames: syntheticNames);
+ printQualifiedNameOn(writeTarget, sink);
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
index 3cafb52..2a81180 100644
--- a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-// @dart = 2.9
-
import 'package:kernel/ast.dart';
import '../type_inference/type_schema.dart';
@@ -81,7 +79,7 @@
bool visitFunctionType(FunctionType node, Set<TypedefType> visitedTypedefs) {
if (node.returnType.accept1(this, visitedTypedefs)) return true;
for (TypeParameter typeParameter in node.typeParameters) {
- if (typeParameter.bound.accept1(this, visitedTypedefs)) return true;
+ if (typeParameter.bound!.accept1(this, visitedTypedefs)) return true;
// TODO(dmitryas): Check defaultTypes as well if they cause cascading
// errors.
}
@@ -91,8 +89,8 @@
for (NamedType parameter in node.namedParameters) {
if (parameter.type.accept1(this, visitedTypedefs)) return true;
}
- if (node.typedefType != null && visitedTypedefs.add(node.typedefType)) {
- if (node.typedefType.accept1(this, visitedTypedefs)) return true;
+ if (node.typedefType != null && visitedTypedefs.add(node.typedefType!)) {
+ if (node.typedefType!.accept1(this, visitedTypedefs)) return true;
}
return false;
}
@@ -105,7 +103,7 @@
for (DartType typeArgument in node.typeArguments) {
if (typeArgument.accept1(this, visitedTypedefs)) return true;
}
- if (node.typedefNode.type.accept1(this, visitedTypedefs)) return true;
+ if (node.typedefNode.type!.accept1(this, visitedTypedefs)) return true;
return false;
}
@@ -116,7 +114,7 @@
// automatically means that the potential errors related to the occurrences
// of the type-parameter type itself are reported.
if (node.promotedBound != null &&
- node.promotedBound.accept1(this, visitedTypedefs)) {
+ node.promotedBound!.accept1(this, visitedTypedefs)) {
return true;
}
return false;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
index 8724cfa..40f86af 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
/// This library exports all API from Kernel that can be used throughout fasta.
library fasta.kernel_api;
@@ -27,7 +25,7 @@
import 'package:kernel/ast.dart' show Class, Member, Node;
-void printNodeOn(Node node, StringSink sink, {NameSystem syntheticNames}) {
+void printNodeOn(Node? node, StringSink sink, {NameSystem? syntheticNames}) {
if (node == null) {
sink.write("null");
} else {
@@ -36,19 +34,17 @@
}
}
-void printQualifiedNameOn(Member member, StringSink sink,
- {NameSystem syntheticNames}) {
+void printQualifiedNameOn(Member? member, StringSink sink) {
if (member == null) {
sink.write("null");
} else {
- syntheticNames ??= new NameSystem();
sink.write(member.enclosingLibrary.importUri);
sink.write("::");
- Class cls = member.enclosingClass;
+ Class? cls = member.enclosingClass;
if (cls != null) {
- sink.write(cls.name ?? syntheticNames.nameClass(cls));
+ sink.write(cls.name);
sink.write("::");
}
- sink.write(member.name?.text ?? syntheticNames.nameMember(member));
+ sink.write(member.name.text);
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index 917607e..22ca5d8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'dart:io' show BytesBuilder, File, IOSink;
import 'dart:typed_data' show Uint8List;
@@ -29,8 +27,8 @@
/// Print the given [component]. Do nothing if it is `null`. If the
/// [libraryFilter] is provided, then only libraries that satisfy it are
/// printed.
-void printComponentText(Component component,
- {bool libraryFilter(Library library)}) {
+void printComponentText(Component? component,
+ {bool Function(Library library)? libraryFilter}) {
if (component == null) return;
StringBuffer sb = new StringBuffer();
Printer printer = new Printer(sb);
@@ -45,7 +43,7 @@
/// Write [component] to file only including libraries that match [filter].
Future<Null> writeComponentToFile(Component component, Uri uri,
- {bool filter(Library library)}) async {
+ {bool Function(Library library)? filter}) async {
File output = new File.fromUri(uri);
IOSink sink = output.openWrite();
try {
@@ -58,7 +56,7 @@
/// Serialize the libraries in [component] that match [filter].
Uint8List serializeComponent(Component component,
- {bool filter(Library library),
+ {bool Function(Library library)? filter,
bool includeSources: true,
bool includeOffsets: true}) {
ByteSink byteSink = new ByteSink();
@@ -82,7 +80,7 @@
..nonNullableByDefaultCompiledMode =
realLibrary.nonNullableByDefaultCompiledMode;
- TreeNode realClass = procedure.parent;
+ TreeNode? realClass = procedure.parent;
if (realClass is Class) {
Class fakeClass = new Class(name: kDebugClassName, fileUri: uri)
..parent = fakeLibrary;
@@ -100,14 +98,15 @@
typeSubstitution: typeSubstitution, typeParams: typeParams);
for (TypeParameter typeParam in realClass.typeParameters) {
- fakeClass.typeParameters.add(typeParam.accept<TreeNode>(cloner));
+ fakeClass.typeParameters
+ .add(typeParam.accept<TreeNode>(cloner) as TypeParameter);
}
if (realClass.supertype != null) {
// supertype is null for Object.
fakeClass.supertype = new Supertype.byReference(
- realClass.supertype.className,
- realClass.supertype.typeArguments.map(cloner.visitType).toList());
+ realClass.supertype!.className,
+ realClass.supertype!.typeArguments.map(cloner.visitType).toList());
}
// Rebind the type parameters in the procedure.
diff --git a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
index 5f149f6..b9261dd 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-// @dart = 2.9
-
import 'package:kernel/ast.dart' show DartType, Library, NeverType;
import 'package:kernel/src/standard_bounds.dart';
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
index cce226f..9be3b48 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-// @dart = 2.9
-
import 'package:kernel/ast.dart'
show
DartType,
@@ -38,10 +36,10 @@
/// Extension of [Printer] that represents the unknown type as `?`.
class TypeSchemaPrinter extends Printer {
TypeSchemaPrinter(StringSink sink,
- {NameSystem syntheticNames,
+ {NameSystem? syntheticNames,
bool showOffsets: false,
- ImportTable importTable,
- Annotator annotator})
+ ImportTable? importTable,
+ Annotator? annotator})
: super(sink,
syntheticNames: syntheticNames,
showOffsets: showOffsets,
@@ -64,16 +62,16 @@
const UnknownType();
@override
- Nullability get declaredNullability => null;
+ Nullability get declaredNullability => Nullability.undetermined;
@override
- Nullability get nullability => null;
+ Nullability get nullability => Nullability.undetermined;
@override
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) {
+ bool equals(Object other, Assumptions? assumptions) {
// This class doesn't have any fields so all instances of `UnknownType` are
// equal.
return other is UnknownType;
@@ -124,7 +122,7 @@
for (NamedType namedParameterType in node.namedParameters) {
if (!namedParameterType.type.accept(this)) return false;
}
- if (node.typedefType != null && !node.typedefType.accept(this)) {
+ if (node.typedefType != null && !node.typedefType!.accept(this)) {
return false;
}
return true;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
index 9e7c2ea..8927d85 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-// @dart = 2.9
-
import 'package:kernel/ast.dart';
import 'package:kernel/src/replacement_visitor.dart';
@@ -56,7 +54,7 @@
_TypeSchemaEliminationVisitor(this.topType, this.bottomType);
@override
- DartType defaultDartType(DartType node, int variance) {
+ DartType? defaultDartType(DartType node, int variance) {
bool isLeastClosure = variance == Variance.covariant;
if (node is UnknownType) {
return isLeastClosure ? bottomType : topType;
@@ -79,7 +77,7 @@
bottomType == const NeverType.nonNullable() || bottomType is NullType);
_TypeSchemaEliminationVisitor visitor =
new _TypeSchemaEliminationVisitor(topType, bottomType);
- DartType result = schema.accept1(
+ DartType? result = schema.accept1(
visitor, isLeastClosure ? Variance.covariant : Variance.contravariant);
return result ?? schema;
}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string.dart b/pkg/front_end/testcases/const_functions/const_functions_string.dart
new file mode 100644
index 0000000..e0f0f73
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, 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.
+
+// Tests string usage with const functions.
+
+import "package:expect/expect.dart";
+
+const String str = "str";
+const var1 = str[2];
+
+const var2 = fn();
+fn() {
+ String local = "str";
+ return local[0];
+}
+
+const var3 = "str"[0];
+
+const var4 = fn2();
+fn2() {
+ try {
+ var x = str[-1];
+ } on RangeError {
+ return 2;
+ }
+}
+
+void main() {
+ Expect.equals(var1, 'r');
+ Expect.equals(var2, 's');
+ Expect.equals(var3, 's');
+ Expect.equals(var4, 2);
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_string.dart.strong.expect
new file mode 100644
index 0000000..f573022
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string.dart.strong.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = #C1;
+static const field core::String var1 = #C2;
+static const field dynamic var2 = #C3;
+static const field core::String var3 = #C3;
+static const field dynamic var4 = #C4;
+static method fn() → dynamic {
+ core::String local = "str";
+ return local.{core::String::[]}(0);
+}
+static method fn2() → dynamic {
+ try {
+ core::String x = (#C1).{core::String::[]}(1.{core::int::unary-}());
+ }
+ on core::RangeError catch(no-exception-var) {
+ return 2;
+ }
+}
+static method main() → void {
+ exp::Expect::equals(#C2, "r");
+ exp::Expect::equals(#C3, "s");
+ exp::Expect::equals(#C3, "s");
+ exp::Expect::equals(#C4, 2);
+}
+
+constants {
+ #C1 = "str"
+ #C2 = "r"
+ #C3 = "s"
+ #C4 = 2
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_string.dart.strong.transformed.expect
new file mode 100644
index 0000000..9ba5e5c
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string.dart.strong.transformed.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = #C1;
+static const field core::String var1 = #C2;
+static const field dynamic var2 = #C3;
+static const field core::String var3 = #C3;
+static const field dynamic var4 = #C4;
+static method fn() → dynamic {
+ core::String local = "str";
+ return local.{core::String::[]}(0);
+}
+static method fn2() → dynamic {
+ try {
+ core::String x = (#C1).{core::String::[]}(1.{core::int::unary-}());
+ }
+ on core::RangeError catch(no-exception-var) {
+ return 2;
+ }
+}
+static method main() → void {
+ exp::Expect::equals(#C2, "r");
+ exp::Expect::equals(#C3, "s");
+ exp::Expect::equals(#C3, "s");
+ exp::Expect::equals(#C4, 2);
+}
+
+constants {
+ #C1 = "str"
+ #C2 = "r"
+ #C3 = "s"
+ #C4 = 2
+}
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_string.dart:23:17 -> IntConstant(-1)
+Extra constant evaluation: evaluated: 8, effectively constant: 1
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_string.dart.textual_outline.expect
new file mode 100644
index 0000000..07c61ae
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+import "package:expect/expect.dart";
+
+const String str = "str";
+const var1 = str[2];
+const var2 = fn();
+fn() {}
+const var3 = "str"[0];
+const var4 = fn2();
+fn2() {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/const_functions/const_functions_string.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..2785bbc
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+import "package:expect/expect.dart";
+
+const String str = "str";
+const var1 = str[2];
+const var2 = fn();
+const var3 = "str"[0];
+const var4 = fn2();
+fn() {}
+fn2() {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.expect
new file mode 100644
index 0000000..f573022
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = #C1;
+static const field core::String var1 = #C2;
+static const field dynamic var2 = #C3;
+static const field core::String var3 = #C3;
+static const field dynamic var4 = #C4;
+static method fn() → dynamic {
+ core::String local = "str";
+ return local.{core::String::[]}(0);
+}
+static method fn2() → dynamic {
+ try {
+ core::String x = (#C1).{core::String::[]}(1.{core::int::unary-}());
+ }
+ on core::RangeError catch(no-exception-var) {
+ return 2;
+ }
+}
+static method main() → void {
+ exp::Expect::equals(#C2, "r");
+ exp::Expect::equals(#C3, "s");
+ exp::Expect::equals(#C3, "s");
+ exp::Expect::equals(#C4, 2);
+}
+
+constants {
+ #C1 = "str"
+ #C2 = "r"
+ #C3 = "s"
+ #C4 = 2
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.outline.expect b/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.outline.expect
new file mode 100644
index 0000000..8da9073
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.outline.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = "str";
+static const field core::String var1 = self::str.{core::String::[]}(2);
+static const field dynamic var2 = self::fn();
+static const field core::String var3 = "str".{core::String::[]}(0);
+static const field dynamic var4 = self::fn2();
+static method fn() → dynamic
+ ;
+static method fn2() → dynamic
+ ;
+static method main() → void
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///const_functions_string.dart:10:14 -> StringConstant("str")
+Extra constant evaluation: evaluated: 5, effectively constant: 1
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.transformed.expect
new file mode 100644
index 0000000..9ba5e5c
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.transformed.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = #C1;
+static const field core::String var1 = #C2;
+static const field dynamic var2 = #C3;
+static const field core::String var3 = #C3;
+static const field dynamic var4 = #C4;
+static method fn() → dynamic {
+ core::String local = "str";
+ return local.{core::String::[]}(0);
+}
+static method fn2() → dynamic {
+ try {
+ core::String x = (#C1).{core::String::[]}(1.{core::int::unary-}());
+ }
+ on core::RangeError catch(no-exception-var) {
+ return 2;
+ }
+}
+static method main() → void {
+ exp::Expect::equals(#C2, "r");
+ exp::Expect::equals(#C3, "s");
+ exp::Expect::equals(#C3, "s");
+ exp::Expect::equals(#C4, 2);
+}
+
+constants {
+ #C1 = "str"
+ #C2 = "r"
+ #C3 = "s"
+ #C4 = 2
+}
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_string.dart:23:17 -> IntConstant(-1)
+Extra constant evaluation: evaluated: 8, effectively constant: 1
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string_error.dart b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart
new file mode 100644
index 0000000..5f892a6
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2021, 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.
+
+// Tests erroneous string usage with const functions.
+
+import "package:expect/expect.dart";
+
+const String str = "str";
+const var1 = str[-1];
+const var2 = str[3];
+
+const var3 = fn();
+fn() {
+ String s = "str";
+ return str[-1];
+}
+
+const var4 = fn2();
+fn2() {
+ String s = "str";
+ return str[3];
+}
+
+const var5 = fn3();
+fn3() {
+ String s = "str";
+ return str[1.1];
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.strong.expect
new file mode 100644
index 0000000..0cdd42f
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.strong.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// return str[1.1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:10:17: Error: Constant evaluation error:
+// const var1 = str[-1];
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:10:17: Context: Unhandled core exception: RangeError: Index out of range: index must not be negative: -1
+// const var1 = str[-1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:11:17: Error: Constant evaluation error:
+// const var2 = str[3];
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:11:17: Context: Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3
+// const var2 = str[3];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:13:14: Error: Constant evaluation error:
+// const var3 = fn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:16:13: Context: Unhandled core exception: RangeError: Index out of range: index must not be negative: -1
+// return str[-1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:19:14: Error: Constant evaluation error:
+// const var4 = fn2();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:22:13: Context: Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3
+// return str[3];
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = #C1;
+static const field core::String var1 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index must not be negative: -1";
+static const field core::String var2 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3";
+static const field dynamic var3 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index must not be negative: -1";
+static const field dynamic var4 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3";
+static const field dynamic var5 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ return str[1.1];
+ ^";
+static method fn() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(1.{core::int::unary-}());
+}
+static method fn2() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(3);
+}
+static method fn3() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(let final Never #t1 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ return str[1.1];
+ ^" in 1.1 as{TypeError,ForNonNullableByDefault} core::int);
+}
+static method main() → void {}
+
+constants {
+ #C1 = "str"
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..e7133c8
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.strong.transformed.expect
@@ -0,0 +1,72 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// return str[1.1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:10:17: Error: Constant evaluation error:
+// const var1 = str[-1];
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:10:17: Context: Unhandled core exception: RangeError: Index out of range: index must not be negative: -1
+// const var1 = str[-1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:11:17: Error: Constant evaluation error:
+// const var2 = str[3];
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:11:17: Context: Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3
+// const var2 = str[3];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:13:14: Error: Constant evaluation error:
+// const var3 = fn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:16:13: Context: Unhandled core exception: RangeError: Index out of range: index must not be negative: -1
+// return str[-1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:19:14: Error: Constant evaluation error:
+// const var4 = fn2();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:22:13: Context: Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3
+// return str[3];
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = #C1;
+static const field core::String var1 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index must not be negative: -1";
+static const field core::String var2 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3";
+static const field dynamic var3 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index must not be negative: -1";
+static const field dynamic var4 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3";
+static const field dynamic var5 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ return str[1.1];
+ ^";
+static method fn() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(1.{core::int::unary-}());
+}
+static method fn2() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(3);
+}
+static method fn3() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(let final Never #t1 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ return str[1.1];
+ ^" in 1.1 as{TypeError,ForNonNullableByDefault} core::int);
+}
+static method main() → void {}
+
+constants {
+ #C1 = "str"
+}
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_string_error.dart:16:14 -> IntConstant(-1)
+Extra constant evaluation: evaluated: 6, effectively constant: 1
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.textual_outline.expect
new file mode 100644
index 0000000..27583e1
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.textual_outline.expect
@@ -0,0 +1,12 @@
+import "package:expect/expect.dart";
+
+const String str = "str";
+const var1 = str[-1];
+const var2 = str[3];
+const var3 = fn();
+fn() {}
+const var4 = fn2();
+fn2() {}
+const var5 = fn3();
+fn3() {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..9227263
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.textual_outline_modelled.expect
@@ -0,0 +1,12 @@
+import "package:expect/expect.dart";
+
+const String str = "str";
+const var1 = str[-1];
+const var2 = str[3];
+const var3 = fn();
+const var4 = fn2();
+const var5 = fn3();
+fn() {}
+fn2() {}
+fn3() {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.expect
new file mode 100644
index 0000000..0cdd42f
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// return str[1.1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:10:17: Error: Constant evaluation error:
+// const var1 = str[-1];
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:10:17: Context: Unhandled core exception: RangeError: Index out of range: index must not be negative: -1
+// const var1 = str[-1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:11:17: Error: Constant evaluation error:
+// const var2 = str[3];
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:11:17: Context: Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3
+// const var2 = str[3];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:13:14: Error: Constant evaluation error:
+// const var3 = fn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:16:13: Context: Unhandled core exception: RangeError: Index out of range: index must not be negative: -1
+// return str[-1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:19:14: Error: Constant evaluation error:
+// const var4 = fn2();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:22:13: Context: Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3
+// return str[3];
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = #C1;
+static const field core::String var1 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index must not be negative: -1";
+static const field core::String var2 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3";
+static const field dynamic var3 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index must not be negative: -1";
+static const field dynamic var4 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3";
+static const field dynamic var5 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ return str[1.1];
+ ^";
+static method fn() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(1.{core::int::unary-}());
+}
+static method fn2() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(3);
+}
+static method fn3() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(let final Never #t1 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ return str[1.1];
+ ^" in 1.1 as{TypeError,ForNonNullableByDefault} core::int);
+}
+static method main() → void {}
+
+constants {
+ #C1 = "str"
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.outline.expect b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.outline.expect
new file mode 100644
index 0000000..183676d
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.outline.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = "str";
+static const field core::String var1 = self::str.{core::String::[]}(1.{core::int::unary-}());
+static const field core::String var2 = self::str.{core::String::[]}(3);
+static const field dynamic var3 = self::fn();
+static const field dynamic var4 = self::fn2();
+static const field dynamic var5 = self::fn3();
+static method fn() → dynamic
+ ;
+static method fn2() → dynamic
+ ;
+static method fn3() → dynamic
+ ;
+static method main() → void
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///const_functions_string_error.dart:10:14 -> StringConstant("str")
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_string_error.dart:10:18 -> IntConstant(-1)
+Evaluated: StaticGet @ org-dartlang-testcase:///const_functions_string_error.dart:11:14 -> StringConstant("str")
+Extra constant evaluation: evaluated: 8, effectively constant: 3
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..e7133c8
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.transformed.expect
@@ -0,0 +1,72 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// return str[1.1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:10:17: Error: Constant evaluation error:
+// const var1 = str[-1];
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:10:17: Context: Unhandled core exception: RangeError: Index out of range: index must not be negative: -1
+// const var1 = str[-1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:11:17: Error: Constant evaluation error:
+// const var2 = str[3];
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:11:17: Context: Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3
+// const var2 = str[3];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:13:14: Error: Constant evaluation error:
+// const var3 = fn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:16:13: Context: Unhandled core exception: RangeError: Index out of range: index must not be negative: -1
+// return str[-1];
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:19:14: Error: Constant evaluation error:
+// const var4 = fn2();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:22:13: Context: Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3
+// return str[3];
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = #C1;
+static const field core::String var1 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index must not be negative: -1";
+static const field core::String var2 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3";
+static const field dynamic var3 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index must not be negative: -1";
+static const field dynamic var4 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3";
+static const field dynamic var5 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ return str[1.1];
+ ^";
+static method fn() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(1.{core::int::unary-}());
+}
+static method fn2() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(3);
+}
+static method fn3() → dynamic {
+ core::String s = "str";
+ return (#C1).{core::String::[]}(let final Never #t1 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ return str[1.1];
+ ^" in 1.1 as{TypeError,ForNonNullableByDefault} core::int);
+}
+static method main() → void {}
+
+constants {
+ #C1 = "str"
+}
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_string_error.dart:16:14 -> IntConstant(-1)
+Extra constant evaluation: evaluated: 6, effectively constant: 1
diff --git a/runtime/vm/elf.h b/runtime/vm/elf.h
index d0f8a96..fb27dc2 100644
--- a/runtime/vm/elf.h
+++ b/runtime/vm/elf.h
@@ -32,7 +32,7 @@
Elf(Zone* zone, BaseWriteStream* stream, Type type, Dwarf* dwarf = nullptr);
- static constexpr intptr_t kPageSize = 4096;
+ static constexpr intptr_t kPageSize = 16 * KB;
static constexpr uword kNoSectionStart = 0;
bool IsStripped() const { return dwarf_ == nullptr; }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 08b8d07..4256646 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -10148,19 +10148,25 @@
}
void Field::DisableFieldUnboxing() const {
- Thread* thread = Thread::Current();
ASSERT(!IsOriginal());
const Field& original = Field::Handle(Original());
if (!original.is_unboxing_candidate()) {
return;
}
+ auto thread = Thread::Current();
SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
if (!original.is_unboxing_candidate()) {
return;
}
- original.set_is_unboxing_candidate(false);
- set_is_unboxing_candidate(false);
- original.DeoptimizeDependentCode();
+
+ // Ensures that to-be-disabled existing code won't continue running as we
+ // update field properties as it might write into now boxed field thinking
+ // it still holds unboxed(reusable box) value.
+ thread->isolate_group()->RunWithStoppedMutators([&]() {
+ original.set_is_unboxing_candidate(false);
+ set_is_unboxing_candidate(false);
+ original.DeoptimizeDependentCode();
+ });
}
intptr_t Field::guarded_cid() const {
diff --git a/tests/language/const_functions/const_functions_string_error_test.dart b/tests/language/const_functions/const_functions_string_error_test.dart
new file mode 100644
index 0000000..2d89d66
--- /dev/null
+++ b/tests/language/const_functions/const_functions_string_error_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2021, 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.
+
+// Tests erroneous string usage with const functions.
+
+// SharedOptions=--enable-experiment=const-functions
+
+import "package:expect/expect.dart";
+
+const String str = "str";
+const var1 = str[-1];
+// ^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// ^
+// [cfe] Constant evaluation error:
+const var2 = str[3];
+// ^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// ^
+// [cfe] Constant evaluation error:
+
+const var3 = fn();
+// ^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [cfe] Constant evaluation error:
+fn() {
+ String s = "str";
+ return str[-1];
+}
+
+const var4 = fn2();
+// ^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [cfe] Constant evaluation error:
+fn2() {
+ String s = "str";
+ return str[3];
+}
+
+const var5 = fn3();
+// ^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+fn3() {
+ String s = "str";
+ return str[1.1];
+ // ^^^
+ // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+ // [cfe] A value of type 'double' can't be assigned to a variable of type 'int'.
+}
diff --git a/tests/language/const_functions/const_functions_string_test.dart b/tests/language/const_functions/const_functions_string_test.dart
new file mode 100644
index 0000000..1cbc4396
--- /dev/null
+++ b/tests/language/const_functions/const_functions_string_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2021, 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.
+
+// Tests string usage with const functions.
+
+// SharedOptions=--enable-experiment=const-functions
+
+import "package:expect/expect.dart";
+
+const String str = "str";
+const var1 = str[2];
+// ^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+
+const var2 = fn();
+// ^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+fn() {
+ String local = "str";
+ return local[0];
+}
+
+const var3 = "str"[0];
+// ^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+
+const var4 = fn2();
+// ^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+fn2() {
+ try {
+ var x = str[-1];
+ } on RangeError {
+ return 2;
+ }
+}
+
+void main() {
+ Expect.equals(var1, 'r');
+ Expect.equals(var2, 's');
+ Expect.equals(var3, 's');
+ Expect.equals(var4, 2);
+}
diff --git a/tools/VERSION b/tools/VERSION
index c1ed934..a536092 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 16
+PRERELEASE 17
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/spec_parse.py b/tools/spec_parse.py
index d9238f5..777475f 100755
--- a/tools/spec_parse.py
+++ b/tools/spec_parse.py
@@ -14,12 +14,9 @@
# - the ANTLR3 jar is available as /usr/share/java/antlr4-runtime.jar.
import os
-import string
import subprocess
import sys
-import utils
-
def Help(missing):
print('Execution of the spec parser failed. Missing: ' + missing)
@@ -33,18 +30,14 @@
spec_parser_dir = os.path.join(tools_dir, 'spec_parser')
spec_parser_file = os.path.join(spec_parser_dir, 'SpecParser.class')
antlr_jar = '/usr/share/java/antlr4-runtime.jar'
- class_path = string.join([spec_parser_dir, antlr_jar], ':')
+ class_path = ':'.join([spec_parser_dir, antlr_jar])
command = ['java', '-cp', class_path, 'SpecParser'] + args
if not os.path.exists(antlr_jar): Help(antlr_jar)
if not os.path.exists(spec_parser_file):
Help('"make parser" in spec_parser')
- with utils.CoreDumpArchiver(args):
- exit_code = subprocess.call(command)
-
- utils.DiagnoseExitCode(exit_code, command)
- return exit_code
+ return subprocess.call(command)
if __name__ == '__main__':