Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 616f110

Browse files
author
Dart CI
committed
Version 2.13.0-131.0.dev
Merge commit 'f13285482df8f30462410851a6b90f0cb14bb8f3' into 'dev'
2 parents 827748a + f132854 commit 616f110

File tree

81 files changed

+1646
-1020
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+1646
-1020
lines changed

WATCHLISTS

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@
7373
},
7474

7575
'WATCHLISTS': {
76-
'build': [ '[email protected]' ],
7776
'dart2js': [ '[email protected]' ],
7877
'dartdevc': [ '[email protected]' ],
7978
'front_end': [ '[email protected]' ],

pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,9 @@ class FeatureComputer {
164164
/// offset is within the given [node], or `null` if the context does not
165165
/// impose any type.
166166
DartType computeContextType(AstNode node, int offset) {
167-
var type = node.accept(_ContextTypeVisitor(typeProvider, offset));
167+
var type = node
168+
.accept(_ContextTypeVisitor(typeProvider, offset))
169+
?.resolveToBound(typeProvider.objectType);
168170
if (type == null || type.isDynamic) {
169171
return null;
170172
}

pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class TypeMemberContributor extends DartCompletionContributor {
4747
}
4848

4949
// Determine the target expression's type.
50-
var type = expression.staticType;
50+
var type = expression.staticType?.resolveToBound(request.objectType);
5151
if (type == null || type.isDynamic) {
5252
// If the expression does not provide a good type, then attempt to get a
5353
// better type from the element.

pkg/analysis_server/test/completion_test.dart

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2351,9 +2351,7 @@ main() {
23512351
<String>['1+HttpServer', '1-HttpClient'],
23522352
failingTests: '1');
23532353

2354-
buildTests(
2355-
'test038',
2356-
'''
2354+
buildTests('test038', '''
23572355
class X {
23582356
x(){}
23592357
}
@@ -2367,9 +2365,7 @@ class A<Z extends X> {
23672365
ay.!1y;
23682366
az.!2x;
23692367
}
2370-
}''',
2371-
<String>['1+y', '1-x', '2+x', '2-y'],
2372-
failingTests: '2');
2368+
}''', <String>['1+y', '1-x', '2+x', '2-y']);
23732369

23742370
// test analysis of untyped fields and top-level vars
23752371
buildTests(

pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3067,6 +3067,21 @@ void main() {new C().^}''');
30673067
assertNotSuggested('==');
30683068
}
30693069

3070+
Future<void> test_methodInvocation_typeParameter() async {
3071+
addTestSource('''
3072+
class A {
3073+
void a() {}
3074+
}
3075+
class C<T extends A> {
3076+
void c(T t) {
3077+
t.^;
3078+
}
3079+
}
3080+
''');
3081+
await computeSuggestions();
3082+
assertSuggestMethod('a', 'A', 'void');
3083+
}
3084+
30703085
Future<void> test_mixin() async {
30713086
addTestSource(r'''
30723087
class A {

pkg/analysis_server/test/src/services/completion/dart/feature_computer_test.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,31 @@ void g() {
357357
''', 'String');
358358
}
359359

360+
Future<void> test_argumentList_typeParameter_resolved() async {
361+
await assertContextType('''
362+
class A {}
363+
class B {}
364+
class C<T extends A> {
365+
void m(T t) {}
366+
}
367+
void f(C<B> c) {
368+
c.m(^);
369+
}
370+
''', 'B');
371+
}
372+
373+
Future<void> test_argumentList_typeParameter_unresolved() async {
374+
await assertContextType('''
375+
class A {}
376+
class C<T extends A> {
377+
void m1(T t) {}
378+
void m2() {
379+
m1(^);
380+
}
381+
}
382+
''', 'A');
383+
}
384+
360385
Future<void> test_assertInitializer_with_identifier() async {
361386
await assertContextType('''
362387
class C {

pkg/analyzer/lib/src/dart/analysis/driver.dart

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,6 @@ import 'package:analyzer/src/summary2/ast_binary_flags.dart';
4444
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
4545
import 'package:meta/meta.dart';
4646

47-
/// TODO(scheglov) We could use generalized Function in
48-
/// [AnalysisDriverTestView], but this breaks `AnalysisContext` and code
49-
/// generation. So, for now let's work around them, and rewrite generators to
50-
/// [AnalysisDriver].
51-
typedef WorkToWaitAfterComputingResult = Future<void> Function(String path);
52-
5347
/// This class computes [AnalysisResult]s for Dart files.
5448
///
5549
/// Let the set of "explicitly analyzed files" denote the set of paths that have
@@ -528,7 +522,7 @@ class AnalysisDriver implements AnalysisDriverGeneric {
528522
}
529523
_discoverAvailableFiles();
530524
_scheduler.notify(this);
531-
return _discoverAvailableFilesTask!.completer!.future;
525+
return _discoverAvailableFilesTask!.completer.future;
532526
}
533527

534528
@override
@@ -2214,28 +2208,31 @@ class _DiscoverAvailableFilesTask {
22142208

22152209
final AnalysisDriver driver;
22162210

2217-
bool isCompleted = false;
2218-
Completer<void>? completer = Completer<void>();
2211+
final Completer<void> completer = Completer<void>();
22192212

22202213
Iterator<Folder>? folderIterator;
2221-
List<String>? files = [];
2214+
2215+
final List<String> files = [];
2216+
22222217
int fileIndex = 0;
22232218

22242219
_DiscoverAvailableFilesTask(this.driver);
22252220

2221+
bool get isCompleted => completer.isCompleted;
2222+
22262223
/// Perform the next piece of work, and set [isCompleted] to `true` to
22272224
/// indicate that the task is done, or keeps it `false` to indicate that the
22282225
/// task should continue to be run.
22292226
void perform() {
22302227
if (folderIterator == null) {
2231-
files!.addAll(driver.addedFiles);
2228+
files.addAll(driver.addedFiles);
22322229

22332230
// Discover SDK libraries.
22342231
var dartSdk = driver._sourceFactory.dartSdk;
22352232
if (dartSdk != null) {
22362233
for (var sdkLibrary in dartSdk.sdkLibraries) {
22372234
var file = dartSdk.mapDartUri(sdkLibrary.shortName)!.fullName;
2238-
files!.add(file);
2235+
files.add(file);
22392236
}
22402237
}
22412238

@@ -2262,22 +2259,18 @@ class _DiscoverAvailableFilesTask {
22622259
}
22632260

22642261
// Get know files one by one.
2265-
while (fileIndex < files!.length) {
2262+
while (fileIndex < files.length) {
22662263
if (timer.elapsedMilliseconds > _MS_WORK_INTERVAL) {
22672264
return;
22682265
}
2269-
var file = files![fileIndex++];
2266+
var file = files[fileIndex++];
22702267
driver._fsState.getFileForPath(file);
22712268
}
22722269

22732270
// The task is done, clean up.
22742271
folderIterator = null;
2275-
files = null;
2276-
2277-
// Complete and clean up.
2278-
isCompleted = true;
2279-
completer!.complete();
2280-
completer = null;
2272+
files.clear();
2273+
completer.complete();
22812274
}
22822275

22832276
void _appendFilesRecursively(Folder folder) {
@@ -2287,7 +2280,7 @@ class _DiscoverAvailableFilesTask {
22872280
if (child is File) {
22882281
var path = child.path;
22892282
if (file_paths.isDart(pathContext, path)) {
2290-
files!.add(path);
2283+
files.add(path);
22912284
}
22922285
} else if (child is Folder) {
22932286
_appendFilesRecursively(child);

pkg/analyzer/lib/src/dart/ast/extensions.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,18 @@ extension ListOfFormalParameterExtension on List<FormalParameter> {
143143
return cast<FormalParameterImpl>();
144144
}
145145
}
146+
147+
extension TypeAnnotationExtension on TypeAnnotation {
148+
/// Return the static type of this type annotation.
149+
///
150+
/// This accessor should be used on expressions that are expected to
151+
/// be already resolved. Every such expression must have the type set,
152+
/// at least `dynamic`.
153+
DartType get typeOrThrow {
154+
var type = this.type;
155+
if (type == null) {
156+
throw StateError('No type: $this');
157+
}
158+
return type;
159+
}
160+
}

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:analyzer/error/error.dart';
1717
import 'package:analyzer/src/dart/analysis/experiments.dart';
1818
import 'package:analyzer/src/dart/analysis/session.dart';
1919
import 'package:analyzer/src/dart/ast/ast.dart';
20+
import 'package:analyzer/src/dart/ast/extensions.dart';
2021
import 'package:analyzer/src/dart/constant/compute.dart';
2122
import 'package:analyzer/src/dart/constant/evaluation.dart';
2223
import 'package:analyzer/src/dart/constant/value.dart';
@@ -3873,7 +3874,7 @@ class ExtensionElementImpl extends _ExistingElementImpl
38733874
if (linkedNode != null) {
38743875
var linkedNode = this.linkedNode as ExtensionDeclaration;
38753876
linkedContext!.applyResolution(linkedNode);
3876-
return _extendedType = linkedNode.extendedType.type!;
3877+
return _extendedType = linkedNode.extendedType.typeOrThrow;
38773878
}
38783879

38793880
return _extendedType!;

pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ class ExtensionMemberResolver {
199199
if (typeArguments != null) {
200200
var arguments = typeArguments.arguments;
201201
if (arguments.length == typeParameters.length) {
202-
typeArgumentTypes = arguments.map((a) => a.type!).toList();
202+
typeArgumentTypes = arguments.map((a) => a.typeOrThrow).toList();
203203
} else {
204204
typeArgumentTypes = _listOfDynamic(typeParameters);
205205
}
@@ -392,7 +392,7 @@ class ExtensionMemberResolver {
392392
if (typeParameters.isEmpty) {
393393
return const <DartType>[];
394394
}
395-
return arguments.map((a) => a.type!).toList();
395+
return arguments.map((a) => a.typeOrThrow).toList();
396396
} else {
397397
_errorReporter.reportErrorForNode(
398398
CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION,

0 commit comments

Comments
 (0)