Skip to content

Commit 58af580

Browse files
committed
InvalidatedModuleReport -> ModifiedModuleReport
1 parent 3c305d1 commit 58af580

File tree

11 files changed

+105
-120
lines changed

11 files changed

+105
-120
lines changed

dwds/lib/src/debugging/inspector.dart

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ class AppInspector implements AppInspectorInterface {
3636
var _scriptCacheMemoizer = AsyncMemoizer<List<ScriptRef>>();
3737

3838
Future<List<ScriptRef>> getScriptRefs([
39-
InvalidatedModuleReport? invalidatedModuleReport,
40-
]) => _populateScriptCaches(invalidatedModuleReport);
39+
ModifiedModuleReport? modifiedModuleReport,
40+
]) => _populateScriptCaches(modifiedModuleReport);
4141

4242
final _logger = Logger('AppInspector');
4343

@@ -106,10 +106,8 @@ class AppInspector implements AppInspectorInterface {
106106

107107
/// Reset all caches and recompute any mappings.
108108
///
109-
/// Should be called across hot reloads with a valid [invalidatedModuleReport].
110-
Future<void> initialize([
111-
InvalidatedModuleReport? invalidatedModuleReport,
112-
]) async {
109+
/// Should be called across hot reloads with a valid [ModifiedModuleReport].
110+
Future<void> initialize([ModifiedModuleReport? modifiedModuleReport]) async {
113111
_scriptCacheMemoizer = AsyncMemoizer<List<ScriptRef>>();
114112

115113
// TODO(srujzs): We can invalidate these in a smarter way instead of
@@ -118,9 +116,9 @@ class AppInspector implements AppInspectorInterface {
118116
_classHelper = ClassHelper(this);
119117
_instanceHelper = InstanceHelper(this);
120118

121-
if (invalidatedModuleReport != null) {
119+
if (modifiedModuleReport != null) {
122120
// Invalidate `_libraryHelper` as we use it populate any script caches.
123-
_libraryHelper.invalidate(invalidatedModuleReport);
121+
_libraryHelper.invalidate(modifiedModuleReport);
124122
} else {
125123
_libraryHelper = LibraryHelper(this);
126124
_scriptRefsById.clear();
@@ -134,7 +132,7 @@ class AppInspector implements AppInspectorInterface {
134132
isolate.libraries?.clear();
135133
isolate.libraries?.addAll(libraries);
136134

137-
final scripts = await getScriptRefs(invalidatedModuleReport);
135+
final scripts = await getScriptRefs(modifiedModuleReport);
138136

139137
await DartUri.initialize();
140138
DartUri.recordAbsoluteUris(libraries.map((lib) => lib.uri).nonNulls);
@@ -728,25 +726,22 @@ class AppInspector implements AppInspectorInterface {
728726
///
729727
/// This will get repopulated on restarts and reloads.
730728
///
731-
/// If [invalidatedModuleReport] is provided, only invalidates and
732-
/// recalculates caches for the invalidated/new libraries.
729+
/// If [modifiedModuleReport] is provided, only invalidates and
730+
/// recalculates caches for the modified libraries.
733731
///
734732
/// Returns the list of scripts refs cached.
735733
Future<List<ScriptRef>> _populateScriptCaches([
736-
InvalidatedModuleReport? invalidatedModuleReport,
734+
ModifiedModuleReport? modifiedModuleReport,
737735
]) {
738736
return _scriptCacheMemoizer.runOnce(() async {
739737
final scripts =
740738
await globalToolConfiguration.loadStrategy
741739
.metadataProviderFor(appConnection.request.entrypointPath)
742740
.scripts;
743-
final invalidatedAndNewLibraries = invalidatedModuleReport
744-
?.deletedLibraries
745-
.union(invalidatedModuleReport.reloadedLibraries);
746-
if (invalidatedAndNewLibraries != null) {
741+
if (modifiedModuleReport != null) {
747742
// Invalidate any script caches that were computed for the now invalid
748743
// libraries. They will get repopulated later.
749-
for (final libraryUri in invalidatedAndNewLibraries) {
744+
for (final libraryUri in modifiedModuleReport.modifiedLibraries) {
750745
final libraryRef = await _libraryHelper.libraryRefFor(libraryUri);
751746
final libraryId = libraryRef?.id;
752747
if (libraryId == null) continue;
@@ -771,8 +766,8 @@ class AppInspector implements AppInspectorInterface {
771766
isolate.libraries ?? <LibraryRef>[],
772767
);
773768
for (final uri in userLibraries) {
774-
if (invalidatedAndNewLibraries != null &&
775-
!invalidatedAndNewLibraries.contains(uri)) {
769+
if (modifiedModuleReport != null &&
770+
!modifiedModuleReport.modifiedLibraries.contains(uri)) {
776771
continue;
777772
}
778773
final parts = scripts[uri];

dwds/lib/src/debugging/libraries.dart

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,13 @@ class LibraryHelper extends Domain {
5252
return _rootLib!;
5353
}
5454

55-
void invalidate(InvalidatedModuleReport invalidatedModuleReport) {
56-
final invalidatedLibraries = invalidatedModuleReport.deletedLibraries.union(
57-
invalidatedModuleReport.reloadedLibraries,
58-
);
59-
for (final library in invalidatedLibraries) {
55+
void invalidate(ModifiedModuleReport modifiedModuleReport) {
56+
for (final library in modifiedModuleReport.modifiedLibraries) {
6057
// These will later be initialized by `libraryFor` if needed.
6158
_librariesById.remove(library);
6259
_libraryRefsById.remove(library);
6360
}
64-
for (final library in invalidatedModuleReport.reloadedLibraries) {
61+
for (final library in modifiedModuleReport.reloadedLibraries) {
6562
_libraryRefsById[library] = _createLibraryRef(library);
6663
}
6764
}

dwds/lib/src/debugging/location.dart

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,12 @@ class Locations {
154154

155155
Future<void> initialize(
156156
String entrypoint, [
157-
InvalidatedModuleReport? invalidatedModuleReport,
157+
ModifiedModuleReport? modifiedModuleReport,
158158
]) async {
159159
// If we know that only certain modules are deleted or added, we can only
160160
// invalidate those.
161-
if (invalidatedModuleReport != null) {
162-
for (final module in invalidatedModuleReport.deletedModules.union(
163-
invalidatedModuleReport.reloadedModules,
164-
)) {
161+
if (modifiedModuleReport != null) {
162+
for (final module in modifiedModuleReport.modifiedModules) {
165163
_locationMemoizer.remove(module);
166164
_moduleToLocations.remove(module);
167165
final sources = await _modules.sourcesForModule(module);

dwds/lib/src/debugging/metadata/module_metadata.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ class ModuleMetadata {
103103
///
104104
/// Used as a name of the js module created by the compiler and
105105
/// as key to store and load modules in the debugger and the browser
106+
// TODO(srujzs): Remove once https://github.com/dart-lang/sdk/issues/59618 is
107+
// resolved.
106108
final String name;
107109

108110
/// Name of the function enclosing the module

dwds/lib/src/debugging/metadata/provider.dart

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ class MetadataProvider {
202202
);
203203
final moduleName = metadata.name;
204204
if (hotReload) {
205-
modules?[moduleName] = metadata;
205+
modules![moduleName] = metadata;
206206
} else {
207207
_addMetadata(metadata);
208208
}
@@ -226,9 +226,9 @@ class MetadataProvider {
226226
/// determines deleted and invalidated libraries and modules, invalidates them
227227
/// in any caches, and recomputes the necessary information.
228228
///
229-
/// Returns an [InvalidatedModuleReport] that can be used to invalidate other
229+
/// Returns an [ModifiedModuleReport] that can be used to invalidate other
230230
/// caches after a hot reload.
231-
Future<InvalidatedModuleReport> reinitializeAfterReload(
231+
Future<ModifiedModuleReport> reinitializeAfterReload(
232232
Map<String, List> reloadedModulesToLibraries,
233233
) async {
234234
final modules = (await _processMetadata(true))!;
@@ -271,7 +271,7 @@ class MetadataProvider {
271271
invalidatedLibraries
272272
.where((library) => !_libraries.contains(library))
273273
.toSet();
274-
return InvalidatedModuleReport(
274+
return ModifiedModuleReport(
275275
deletedModules: deletedModules,
276276
deletedLibraries: deletedLibraries,
277277
reloadedModules: reloadedModules,
@@ -334,10 +334,10 @@ class AbsoluteImportUriException implements Exception {
334334
/// Computed after a hot reload using
335335
/// [MetadataProvider.reinitializeAfterReload], represents the modules and
336336
/// libraries in the program that were deleted, reloaded, and therefore,
337-
/// invalidated.
337+
/// modified.
338338
///
339339
/// Used to recompute caches throughout DWDS.
340-
class InvalidatedModuleReport {
340+
class ModifiedModuleReport {
341341
/// Module names that are no longer in the program.
342342
final Set<String> deletedModules;
343343

@@ -349,10 +349,17 @@ class InvalidatedModuleReport {
349349

350350
/// Library uris that were loaded during the hot reload.
351351
final Set<String> reloadedLibraries;
352-
InvalidatedModuleReport({
352+
353+
/// Module names that were either removed or modified.
354+
final Set<String> modifiedModules;
355+
356+
/// Library uris that were either removed or modified.
357+
final Set<String> modifiedLibraries;
358+
ModifiedModuleReport({
353359
required this.deletedModules,
354360
required this.deletedLibraries,
355361
required this.reloadedModules,
356362
required this.reloadedLibraries,
357-
});
363+
}) : modifiedModules = deletedModules.union(reloadedModules),
364+
modifiedLibraries = deletedLibraries.union(reloadedLibraries);
358365
}

dwds/lib/src/debugging/modules.dart

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,25 @@ class Modules {
3434
///
3535
/// Intended to be called multiple times throughout the development workflow,
3636
/// e.g. after a hot-reload.
37+
///
38+
/// If [modifiedModuleReport] is not null, removes and recalculates caches for
39+
/// any modified modules and libraries.
3740
Future<void> initialize(
3841
String entrypoint, [
39-
InvalidatedModuleReport? invalidatedModuleReport,
42+
ModifiedModuleReport? modifiedModuleReport,
4043
]) async {
41-
if (invalidatedModuleReport != null) {
44+
if (modifiedModuleReport != null) {
4245
assert(_entrypoint == entrypoint);
43-
await _initializeMapping(invalidatedModuleReport);
46+
for (final library in modifiedModuleReport.modifiedLibraries) {
47+
final libraryServerPath = _getLibraryServerPath(library);
48+
_sourceToLibrary.remove(libraryServerPath);
49+
_sourceToModule.remove(libraryServerPath);
50+
_libraryToModule.remove(library);
51+
}
52+
for (final module in modifiedModuleReport.modifiedModules) {
53+
_moduleToSources.remove(module);
54+
}
55+
await _initializeMapping(modifiedModuleReport);
4456
} else {
4557
_sourceToModule.clear();
4658
_moduleToSources.clear();
@@ -96,34 +108,12 @@ class Modules {
96108
? library
97109
: DartUri(library, _root).serverPath;
98110

99-
Set<String> _invalidateLibraries(
100-
InvalidatedModuleReport invalidatedModuleReport,
101-
) {
102-
Set<String> invalidatedLibraries;
103-
invalidatedLibraries = invalidatedModuleReport.deletedLibraries.union(
104-
invalidatedModuleReport.reloadedLibraries,
105-
);
106-
final invalidatedModules = invalidatedModuleReport.deletedModules.union(
107-
invalidatedModuleReport.reloadedModules,
108-
);
109-
for (final library in invalidatedLibraries) {
110-
final libraryServerPath = _getLibraryServerPath(library);
111-
_sourceToLibrary.remove(libraryServerPath);
112-
_sourceToModule.remove(libraryServerPath);
113-
_libraryToModule.remove(library);
114-
}
115-
for (final module in invalidatedModules) {
116-
_moduleToSources.remove(module);
117-
}
118-
return invalidatedLibraries;
119-
}
120-
121111
/// Initializes [_sourceToModule], [_moduleToSources], and [_sourceToLibrary].
122112
///
123-
/// If [invalidatedModuleReport] is not null, only updates the maps for the
124-
/// invalidated libraries in the report.
113+
/// If [modifiedModuleReport] is not null, only updates the maps for the
114+
/// modified libraries in the report.
125115
Future<void> _initializeMapping([
126-
InvalidatedModuleReport? invalidatedModuleReport,
116+
ModifiedModuleReport? modifiedModuleReport,
127117
]) async {
128118
final provider = globalToolConfiguration.loadStrategy.metadataProviderFor(
129119
_entrypoint,
@@ -132,16 +122,11 @@ class Modules {
132122
final libraryToScripts = await provider.scripts;
133123
final scriptToModule = await provider.scriptToModule;
134124

135-
final invalidatedLibraries =
136-
invalidatedModuleReport != null
137-
? _invalidateLibraries(invalidatedModuleReport)
138-
: null;
139-
140125
for (final library in libraryToScripts.keys) {
141-
if (invalidatedLibraries != null) {
126+
if (modifiedModuleReport != null) {
142127
// Note that every module will have at least one library associated with
143-
// it, so it's okay to only process the invalidated libraries.
144-
if (!invalidatedLibraries.contains(library)) continue;
128+
// it, so it's okay to only process the modified libraries.
129+
if (!modifiedModuleReport.modifiedLibraries.contains(library)) continue;
145130
}
146131
final scripts = libraryToScripts[library]!;
147132
final libraryServerPath = _getLibraryServerPath(library);

dwds/lib/src/debugging/skip_list.dart

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,18 @@ class SkipLists {
2020

2121
Future<void> initialize([
2222
String? entrypoint,
23-
InvalidatedModuleReport? invalidatedModuleReport,
23+
ModifiedModuleReport? modifiedModuleReport,
2424
]) async {
25-
if (invalidatedModuleReport != null) {
25+
if (modifiedModuleReport != null) {
2626
assert(entrypoint != null);
27-
final invalidatedModules = invalidatedModuleReport.deletedModules.union(
28-
invalidatedModuleReport.reloadedModules,
29-
);
3027
for (final url in _urlToId.keys) {
3128
if (url.isEmpty) continue;
3229

3330
final dartUri = DartUri(url, _root);
3431
final serverPath = dartUri.serverPath;
3532
final module = await globalToolConfiguration.loadStrategy
3633
.moduleForServerPath(entrypoint!, serverPath);
37-
if (invalidatedModules.contains(module)) {
34+
if (modifiedModuleReport.modifiedModules.contains(module)) {
3835
_idToList.remove(_urlToId[url]!);
3936
}
4037
}

dwds/lib/src/loaders/strategy.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ abstract class LoadStrategy {
183183
return Future.value();
184184
}
185185

186-
Future<InvalidatedModuleReport> reinitializeEntrypointAfterReload(
186+
Future<ModifiedModuleReport> reinitializeEntrypointAfterReload(
187187
String entrypoint,
188188
Map<String, List> reloadedModulesToLibraries,
189189
) {

dwds/lib/src/services/chrome_proxy_service.dart

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -235,34 +235,29 @@ class ChromeProxyService implements VmServiceInterface {
235235
}
236236

237237
/// Reinitializes any caches so that they can be recomputed across hot reload.
238-
// TODO(srujzs): We can maybe do better here than reinitializing all the data.
239-
// Specifically, we can invalidate certain parts as we know what libraries
240-
// will be stale, and therefore recompute information only for those libraries
241-
// and possibly libraries that depend on them. Currently, there's no good
242-
// separation between "existing" information and "new" information, making
243-
// this difficult.
244-
// https://github.com/dart-lang/webdev/issues/2628
238+
///
239+
/// We use the [ModifiedModuleReport] to more efficiently invalidate caches.
245240
Future<void> _reinitializeForHotReload(
246241
Map<String, List> reloadedModules,
247242
) async {
248243
final entrypoint = inspector.appConnection.request.entrypointPath;
249-
final invalidatedModuleReport = await globalToolConfiguration.loadStrategy
244+
final modifiedModuleReport = await globalToolConfiguration.loadStrategy
250245
.reinitializeEntrypointAfterReload(entrypoint, reloadedModules);
251-
await _initializeEntrypoint(entrypoint, invalidatedModuleReport);
252-
await inspector.initialize(invalidatedModuleReport);
246+
await _initializeEntrypoint(entrypoint, modifiedModuleReport);
247+
await inspector.initialize(modifiedModuleReport);
253248
}
254249

255250
/// Initializes metadata in [Locations], [Modules], and [ExpressionCompiler].
256251
///
257-
/// If [invalidatedModuleReport] is not null, only removes and reinitializes
258-
/// invalidated metadata.
252+
/// If [modifiedModuleReport] is not null, only removes and reinitializes
253+
/// modified metadata.
259254
Future<void> _initializeEntrypoint(
260255
String entrypoint, [
261-
InvalidatedModuleReport? invalidatedModuleReport,
256+
ModifiedModuleReport? modifiedModuleReport,
262257
]) async {
263-
await _modules.initialize(entrypoint, invalidatedModuleReport);
264-
await _locations.initialize(entrypoint, invalidatedModuleReport);
265-
await _skipLists.initialize(entrypoint, invalidatedModuleReport);
258+
await _modules.initialize(entrypoint, modifiedModuleReport);
259+
await _locations.initialize(entrypoint, modifiedModuleReport);
260+
await _skipLists.initialize(entrypoint, modifiedModuleReport);
266261
// We do not need to wait for compiler dependencies to be updated as the
267262
// [ExpressionEvaluator] is robust to evaluation requests during updates.
268263
safeUnawaited(_updateCompilerDependencies(entrypoint));

dwds/test/fixtures/fakes.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,8 @@ class FakeInspector implements AppInspector {
6868
}
6969

7070
@override
71-
Future<void> initialize([
72-
InvalidatedModuleReport? invalidatedModuleReport,
73-
]) async => {};
71+
Future<void> initialize([ModifiedModuleReport? modifiedModuleReport]) async =>
72+
{};
7473

7574
@override
7675
Future<InstanceRef?> instanceRefFor(Object value) async =>
@@ -161,7 +160,7 @@ class FakeModules implements Modules {
161160
@override
162161
Future<void> initialize(
163162
String entrypoint, [
164-
InvalidatedModuleReport? invalidatedModuleReport,
163+
ModifiedModuleReport? modifiedModuleReport,
165164
]) async {}
166165

167166
@override

0 commit comments

Comments
 (0)