Macro. Optimize for large number of libraries in the library cycle.

See https://dart-review.googlesource.com/c/sdk/+/361160/1

Base
116399
115298
118562

Get LibraryElement from target
61165
62028
62587

Use identical() for LibraryElement
22795
23462
22797

Use for-index loop instead of for-each
13651
11733
11529

Use Map<LibraryElement, List<Application>>
10812
9922
9597

Change-Id: If06075e7d4264dfd21b9c9ef8b310f84f2f9bb6e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/361130
Reviewed-by: Keerti Parthasarathy <keertip@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov 2024-04-05 19:13:55 +00:00 committed by Commit Queue
parent 1cd4705935
commit 6e11b5dd40

View file

@ -90,7 +90,8 @@ class LibraryMacroApplier {
/// 1. inner before outer
/// 2. right to left
/// 3. source order
final List<_MacroApplication> _applications = [];
final Map<LibraryElementImpl, List<_MacroApplication>> _libraryApplications =
Map.identity();
/// The applications that currently run the declarations phase.
final List<_MacroApplication> _declarationsPhaseRunning = [];
@ -520,7 +521,7 @@ class LibraryMacroApplier {
phasesToExecute: phasesToExecute,
);
_applications.add(application);
_libraryApplications.add(libraryElement, application);
}
}
@ -733,14 +734,17 @@ class LibraryMacroApplier {
required LibraryElementImpl library,
required Element? targetElement,
}) {
for (final application in _applications.reversed) {
final applicationElement = application.target.element;
if (applicationElement.library != library) {
continue;
}
final applications = _libraryApplications[library];
if (applications == null) {
return null;
}
for (var i = applications.length - 1; i >= 0; i--) {
final application = applications[i];
if (targetElement != null) {
if (applicationElement != targetElement &&
applicationElement.enclosingElement != targetElement) {
final applicationElement = application.target.element;
if (!identical(applicationElement, targetElement) &&
!identical(applicationElement.enclosingElement, targetElement)) {
continue;
}
}
@ -748,15 +752,21 @@ class LibraryMacroApplier {
return application;
}
}
return null;
}
_MacroApplication? _nextForDefinitionsPhase({
required LibraryElementImpl library,
}) {
for (final application in _applications.reversed) {
final applicationElement = application.target.element;
if (applicationElement.library != library) {
final applications = _libraryApplications[library];
if (applications == null) {
return null;
}
for (var i = applications.length - 1; i >= 0; i--) {
final application = applications[i];
if (!identical(application.target.library, library)) {
continue;
}
if (application.phasesToExecute.remove(macro.Phase.definitions)) {
@ -769,9 +779,14 @@ class LibraryMacroApplier {
_MacroApplication? _nextForTypesPhase({
required LibraryElementImpl library,
}) {
for (final application in _applications.reversed) {
final applicationElement = application.target.element;
if (applicationElement.library != library) {
final applications = _libraryApplications[library];
if (applications == null) {
return null;
}
for (var i = applications.length - 1; i >= 0; i--) {
final application = applications[i];
if (!identical(application.target.library, library)) {
continue;
}
if (application.phasesToExecute.remove(macro.Phase.types)) {