Skip to content

Commit c178c66

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Record dependencies on InterfaceElementImpl2.getNamedConstructor2()
Change-Id: I8b05811c7e6a79b52e59dcc45ea7e7701ecac619 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/422260 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent 65cdd58 commit c178c66

File tree

3 files changed

+706
-13
lines changed

3 files changed

+706
-13
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import 'package:analyzer/src/dart/resolver/scope.dart'
4343
show Namespace, NamespaceBuilder;
4444
import 'package:analyzer/src/error/inference_error.dart';
4545
import 'package:analyzer/src/fine/library_manifest.dart';
46+
import 'package:analyzer/src/fine/requirements.dart';
4647
import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
4748
import 'package:analyzer/src/generated/source.dart' show DartUriResolver;
4849
import 'package:analyzer/src/generated/utilities_collection.dart';
@@ -6626,6 +6627,8 @@ abstract class InterfaceElementImpl2 extends InstanceElementImpl2
66266627

66276628
@override
66286629
ConstructorElementImpl2? getNamedConstructor2(String name) {
6630+
globalResultRequirements?.notify_interfaceElement_getNamedConstructor(
6631+
element: this, name: name);
66296632
return constructors2.firstWhereOrNull((e) => e.name3 == name);
66306633
}
66316634

pkg/analyzer/lib/src/fine/requirements.dart

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -331,18 +331,48 @@ class RequirementsManifest {
331331
return null;
332332
}
333333

334+
void notify_interfaceElement_getNamedConstructor({
335+
required InterfaceElementImpl2 element,
336+
required String name,
337+
}) {
338+
var libraryElement = element.library2;
339+
var manifest = libraryElement.manifest;
340+
341+
// If we are linking the library, its manifest is not set yet.
342+
// But then we also don't care about this dependency.
343+
if (manifest == null) {
344+
return;
345+
}
346+
347+
var interfaceName = element.lookupName?.asLookupName;
348+
349+
// SAFETY: we don't export elements without name.
350+
interfaceName!;
351+
352+
var interfacesMap = interfaceMembers[libraryElement.uri] ??= {};
353+
var interfaceItem = manifest.items[interfaceName];
354+
355+
// SAFETY: every interface element must be in the manifest.
356+
interfaceItem as InterfaceItem;
357+
358+
var memberName = name.asLookupName;
359+
var memberId = interfaceItem.getMemberId(memberName);
360+
var interfaceMap = interfacesMap[interfaceName] ??= {};
361+
interfaceMap[memberName] = memberId;
362+
}
363+
334364
/// This method is invoked by [InheritanceManager3] to notify the collector
335365
/// that a member with [nameObj] was requested from the [element].
336366
void notifyInterfaceRequest({
337-
required InterfaceElement2 element,
367+
required InterfaceElementImpl2 element,
338368
required Name nameObj,
339369
}) {
340370
// Skip private names, cannot be used outside this library.
341371
if (!nameObj.isPublic) {
342372
return;
343373
}
344374

345-
var libraryElement = element.library2 as LibraryElementImpl;
375+
var libraryElement = element.library2;
346376
var manifest = libraryElement.manifest;
347377

348378
// If we are linking the library, its manifest is not set yet.
@@ -351,20 +381,21 @@ class RequirementsManifest {
351381
return;
352382
}
353383

354-
var interfacesMap = interfaceMembers[libraryElement.uri] ??= {};
384+
var interfaceName = element.lookupName?.asLookupName;
355385

356-
var interfaceName = element.lookupName!.asLookupName;
357-
var interfaceMap = interfacesMap[interfaceName] ??= {};
386+
// SAFETY: we don't export elements without name.
387+
interfaceName!;
358388

359-
var classItem = manifest.items[interfaceName] as InterfaceItem?;
360-
// TODO(scheglov): can this happen?
361-
if (classItem == null) {
362-
return;
363-
}
389+
var interfacesMap = interfaceMembers[libraryElement.uri] ??= {};
390+
var interfaceItem = manifest.items[interfaceName];
391+
392+
// SAFETY: every interface element must be in the manifest.
393+
interfaceItem as InterfaceItem;
364394

365-
var name = nameObj.name.asLookupName;
366-
var memberId = classItem.getMemberId(name);
367-
interfaceMap[name] = memberId;
395+
var memberName = nameObj.name.asLookupName;
396+
var memberId = interfaceItem.getMemberId(memberName);
397+
var interfaceMap = interfacesMap[interfaceName] ??= {};
398+
interfaceMap[memberName] = memberId;
368399
}
369400

370401
/// This method is invoked by an import scope to notify the collector that

0 commit comments

Comments
 (0)