Skip to content

Commit 6d38824

Browse files
authored
Eagerly initialize Environment._globalModules (#952)
We had been lazily initializing this to be more efficient when no global modules were used, but this meant that the object wasn't shared with closures created for mixins and functions that were created when it was still `null`, so later imported forwards weren't visible to those members.
1 parent 0a2142d commit 6d38824

File tree

3 files changed

+18
-39
lines changed

3 files changed

+18
-39
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
* Don't throw errors if the exact same member is loaded or forwarded from
77
multiple modules at the same time.
88

9+
* Fix a bug where imported forwarded members weren't visible in mixins and
10+
functions that were defined before the `@import`.
11+
912
## 1.25.2
1013

1114
* Fix a bug where, under extremely rare circumstances, a valid variable could

lib/src/async_environment.dart

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,11 @@ class AsyncEnvironment {
4040
final Map<String, AstNode> _namespaceNodes;
4141

4242
/// The namespaceless modules used in the current scope.
43-
///
44-
/// This is `null` if there are no namespaceless modules.
45-
Set<Module> _globalModules;
43+
final Set<Module> _globalModules;
4644

4745
/// A map from modules in [_globalModules] to the nodes whose spans
4846
/// indicate where those modules were originally loaded.
49-
///
50-
/// This is `null` if there are no namespaceless modules.
51-
Map<Module, AstNode> _globalModuleNodes;
47+
final Map<Module, AstNode> _globalModuleNodes;
5248

5349
/// The modules forwarded by this module.
5450
///
@@ -153,8 +149,8 @@ class AsyncEnvironment {
153149
AsyncEnvironment({bool sourceMap = false})
154150
: _modules = {},
155151
_namespaceNodes = {},
156-
_globalModules = null,
157-
_globalModuleNodes = null,
152+
_globalModules = {},
153+
_globalModuleNodes = {},
158154
_forwardedModules = null,
159155
_forwardedModuleNodes = null,
160156
_nestedForwardedModules = null,
@@ -216,8 +212,8 @@ class AsyncEnvironment {
216212
AsyncEnvironment forImport() => AsyncEnvironment._(
217213
{},
218214
{},
219-
null,
220-
null,
215+
{},
216+
{},
221217
null,
222218
null,
223219
null,
@@ -240,8 +236,6 @@ class AsyncEnvironment {
240236
/// with the same name as a variable defined in this environment.
241237
void addModule(Module module, AstNode nodeWithSpan, {String namespace}) {
242238
if (namespace == null) {
243-
_globalModules ??= {};
244-
_globalModuleNodes ??= {};
245239
_globalModules.add(module);
246240
_globalModuleNodes[module] = nodeWithSpan;
247241
_allModules.add(module);
@@ -337,8 +331,6 @@ class AsyncEnvironment {
337331
var forwarded = module._environment._forwardedModules;
338332
if (forwarded == null) return;
339333

340-
_globalModules ??= {};
341-
_globalModuleNodes ??= {};
342334
_forwardedModules ??= [];
343335
_forwardedModuleNodes ??= {};
344336

@@ -487,8 +479,6 @@ class AsyncEnvironment {
487479
/// required, since some nodes need to do real work to manufacture a source
488480
/// span.
489481
AstNode _getVariableNodeFromGlobalModule(String name) {
490-
if (_globalModules == null) return null;
491-
492482
// We don't need to worry about multiple modules defining the same variable,
493483
// because that's already been checked by [getVariable].
494484
for (var module in _globalModules) {
@@ -558,7 +548,7 @@ class AsyncEnvironment {
558548

559549
// If this module doesn't already contain a variable named [name], try
560550
// setting it in a global module.
561-
if (!_variables.first.containsKey(name) && _globalModules != null) {
551+
if (!_variables.first.containsKey(name)) {
562552
var moduleWithName = _fromOneModule(name, "variable",
563553
(module) => module.variables.containsKey(name) ? module : null);
564554
if (moduleWithName != null) {
@@ -861,8 +851,6 @@ class AsyncEnvironment {
861851
}
862852
}
863853

864-
if (_globalModules == null) return null;
865-
866854
T value;
867855
Object identity;
868856
for (var module in _globalModules) {

lib/src/environment.dart

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// DO NOT EDIT. This file was generated from async_environment.dart.
66
// See tool/grind/synchronize.dart for details.
77
//
8-
// Checksum: db31838dbc5c44989803274acb581263e98b488d
8+
// Checksum: df5ee8bde1eec6e47c1d025041921aba01637696
99
//
1010
// ignore_for_file: unused_import
1111

@@ -46,15 +46,11 @@ class Environment {
4646
final Map<String, AstNode> _namespaceNodes;
4747

4848
/// The namespaceless modules used in the current scope.
49-
///
50-
/// This is `null` if there are no namespaceless modules.
51-
Set<Module<Callable>> _globalModules;
49+
final Set<Module<Callable>> _globalModules;
5250

5351
/// A map from modules in [_globalModules] to the nodes whose spans
5452
/// indicate where those modules were originally loaded.
55-
///
56-
/// This is `null` if there are no namespaceless modules.
57-
Map<Module<Callable>, AstNode> _globalModuleNodes;
53+
final Map<Module<Callable>, AstNode> _globalModuleNodes;
5854

5955
/// The modules forwarded by this module.
6056
///
@@ -159,8 +155,8 @@ class Environment {
159155
Environment({bool sourceMap = false})
160156
: _modules = {},
161157
_namespaceNodes = {},
162-
_globalModules = null,
163-
_globalModuleNodes = null,
158+
_globalModules = {},
159+
_globalModuleNodes = {},
164160
_forwardedModules = null,
165161
_forwardedModuleNodes = null,
166162
_nestedForwardedModules = null,
@@ -222,8 +218,8 @@ class Environment {
222218
Environment forImport() => Environment._(
223219
{},
224220
{},
225-
null,
226-
null,
221+
{},
222+
{},
227223
null,
228224
null,
229225
null,
@@ -247,8 +243,6 @@ class Environment {
247243
void addModule(Module<Callable> module, AstNode nodeWithSpan,
248244
{String namespace}) {
249245
if (namespace == null) {
250-
_globalModules ??= {};
251-
_globalModuleNodes ??= {};
252246
_globalModules.add(module);
253247
_globalModuleNodes[module] = nodeWithSpan;
254248
_allModules.add(module);
@@ -344,8 +338,6 @@ class Environment {
344338
var forwarded = module._environment._forwardedModules;
345339
if (forwarded == null) return;
346340

347-
_globalModules ??= {};
348-
_globalModuleNodes ??= {};
349341
_forwardedModules ??= [];
350342
_forwardedModuleNodes ??= {};
351343

@@ -494,8 +486,6 @@ class Environment {
494486
/// required, since some nodes need to do real work to manufacture a source
495487
/// span.
496488
AstNode _getVariableNodeFromGlobalModule(String name) {
497-
if (_globalModules == null) return null;
498-
499489
// We don't need to worry about multiple modules defining the same variable,
500490
// because that's already been checked by [getVariable].
501491
for (var module in _globalModules) {
@@ -565,7 +555,7 @@ class Environment {
565555

566556
// If this module doesn't already contain a variable named [name], try
567557
// setting it in a global module.
568-
if (!_variables.first.containsKey(name) && _globalModules != null) {
558+
if (!_variables.first.containsKey(name)) {
569559
var moduleWithName = _fromOneModule(name, "variable",
570560
(module) => module.variables.containsKey(name) ? module : null);
571561
if (moduleWithName != null) {
@@ -867,8 +857,6 @@ class Environment {
867857
}
868858
}
869859

870-
if (_globalModules == null) return null;
871-
872860
T value;
873861
Object identity;
874862
for (var module in _globalModules) {

0 commit comments

Comments
 (0)