Skip to content

Commit 25b3c9b

Browse files
brad4dcopybara-github
authored andcommitted
Use LinkedHash(Map|Set) to guarantee deterministic iteration order
modules PiperOrigin-RevId: 617584390
1 parent 047cfff commit 25b3c9b

File tree

4 files changed

+27
-28
lines changed

4 files changed

+27
-28
lines changed

src/com/google/javascript/jscomp/modules/ClosureModuleProcessor.java

+8-5
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,8 @@
3333
import com.google.javascript.jscomp.modules.ModuleMapCreator.ModuleProcessor;
3434
import com.google.javascript.jscomp.modules.ModuleMetadataMap.ModuleMetadata;
3535
import com.google.javascript.rhino.Node;
36-
import java.util.HashMap;
37-
import java.util.HashSet;
3836
import java.util.LinkedHashMap;
37+
import java.util.LinkedHashSet;
3938
import java.util.Map;
4039
import java.util.Set;
4140
import org.jspecify.nullness.Nullable;
@@ -117,7 +116,7 @@ public Module resolve(
117116

118117
/** A map from import bound name to binding. */
119118
Map<String, Binding> getAllResolvedImports(ModuleRequestResolver moduleRequestResolver) {
120-
Map<String, Binding> imports = new HashMap<>();
119+
Map<String, Binding> imports = new LinkedHashMap<>();
121120

122121
for (String name : requiresByLocalName.keySet()) {
123122
ResolveExportResult b = resolveImport(moduleRequestResolver, name);
@@ -152,8 +151,8 @@ ResolveExportResult resolveImport(ModuleRequestResolver moduleRequestResolver, S
152151
moduleRequestResolver,
153152
importRecord.moduleRequest(),
154153
importRecord.importName(),
155-
new HashSet<>(),
156-
new HashSet<>());
154+
new LinkedHashSet<>(),
155+
new LinkedHashSet<>());
157156
if (!result.found() && !result.hadError()) {
158157
reportInvalidDestructuringRequire(requested, importRecord);
159158
return ResolveExportResult.ERROR;
@@ -288,15 +287,19 @@ public UnresolvedModule process(ModuleMetadata metadata, ModulePath path, Node s
288287
/** Traverses a subtree rooted at a module, gathering all exports and requires */
289288
private static class ModuleProcessingCallback extends AbstractPreOrderCallback {
290289
private final ModuleMetadata metadata;
290+
291291
/** The Closure namespace 'a.b.c' from the `goog.module('a.b.c');` statement */
292292
private final String closureNamespace;
293+
293294
// Note: the following two maps are mutable because in some cases, we need to check if a key has
294295
// already been added before trying to add a second.
295296

296297
/** All named exports and explicit assignments of the `exports` object */
297298
private final Map<String, Binding> namespace;
299+
298300
/** All required/forwardDeclared local names */
299301
private final Map<String, Require> requiresByLocalName;
302+
300303
/** Whether we've come across an "exports = ..." assignment */
301304
private boolean seenExportsAssignment;
302305

src/com/google/javascript/jscomp/modules/EsModuleProcessor.java

+11-14
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,8 @@
3838
import com.google.javascript.jscomp.modules.ModuleMetadataMap.ModuleMetadata;
3939
import com.google.javascript.rhino.Node;
4040
import java.util.ArrayList;
41-
import java.util.HashMap;
42-
import java.util.HashSet;
4341
import java.util.LinkedHashMap;
42+
import java.util.LinkedHashSet;
4443
import java.util.List;
4544
import java.util.Map;
4645
import java.util.Set;
@@ -196,9 +195,9 @@ private final class UnresolvedModuleBuilder {
196195
UnresolvedModuleBuilder(ModulePath path, Node root) {
197196
this.path = path;
198197
this.root = root;
199-
importsByLocalName = new HashMap<>();
198+
importsByLocalName = new LinkedHashMap<>();
200199
exports = new ArrayList<>();
201-
exportedNames = new HashSet<>();
200+
exportedNames = new LinkedHashSet<>();
202201
}
203202

204203
void add(Import i) {
@@ -293,8 +292,8 @@ private UnresolvedEsModule(
293292
this.indirectExports = indirectExports;
294293
this.starExports = starExports;
295294
exportedNames = null;
296-
resolvedImports = new HashMap<>();
297-
resolvedExports = new HashMap<>();
295+
resolvedImports = new LinkedHashMap<>();
296+
resolvedExports = new LinkedHashMap<>();
298297
resolved = null;
299298
}
300299

@@ -314,7 +313,7 @@ public Module resolve(
314313
Map<String, Binding> boundNames =
315314
new LinkedHashMap<>(getAllResolvedImports(moduleRequestResolver));
316315

317-
Map<String, Export> localNameToLocalExport = new HashMap<>();
316+
Map<String, Export> localNameToLocalExport = new LinkedHashMap<>();
318317

319318
// Only local exports that are not an anonymous default export create local bindings.
320319
for (Export e : localExports) {
@@ -350,7 +349,7 @@ ModuleMetadata metadata() {
350349

351350
/** A map from import bound name to binding. */
352351
Map<String, Binding> getAllResolvedImports(ModuleRequestResolver moduleRequestResolver) {
353-
Map<String, Binding> imports = new HashMap<>();
352+
Map<String, Binding> imports = new LinkedHashMap<>();
354353

355354
for (String name : importsByLocalName.keySet()) {
356355
ResolveExportResult b = resolveImport(moduleRequestResolver, name);
@@ -378,7 +377,8 @@ public ResolveExportResult resolveImport(
378377

379378
public ResolveExportResult resolveImport(
380379
ModuleRequestResolver moduleRequestResolver, String name) {
381-
return resolveImport(moduleRequestResolver, name, new HashSet<>(), new HashSet<>());
380+
return resolveImport(
381+
moduleRequestResolver, name, new LinkedHashSet<>(), new LinkedHashSet<>());
382382
}
383383

384384
private ResolveExportResult resolveImportImpl(
@@ -461,7 +461,7 @@ private ResolveExportResult resolveImportImpl(
461461
@Override
462462
public ImmutableSet<String> getExportedNames(ModuleRequestResolver moduleRequestResolver) {
463463
if (exportedNames == null) {
464-
exportedNames = getExportedNames(moduleRequestResolver, new HashSet<>());
464+
exportedNames = getExportedNames(moduleRequestResolver, new LinkedHashSet<>());
465465
}
466466
return exportedNames;
467467
}
@@ -672,10 +672,7 @@ public ResolveExportResult resolveExport(
672672
private @Nullable ModuleMetadata metadata;
673673

674674
@Override
675-
public UnresolvedModule process(
676-
ModuleMetadata metadata,
677-
ModulePath path,
678-
Node script) {
675+
public UnresolvedModule process(ModuleMetadata metadata, ModulePath path, Node script) {
679676
this.metadata = metadata;
680677
currentModuleBuilder = new UnresolvedModuleBuilder(path, script);
681678

src/com/google/javascript/jscomp/modules/ModuleMapCreator.java

+5-6
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import com.google.javascript.jscomp.modules.ModuleMetadataMap.ModuleMetadata;
2727
import com.google.javascript.jscomp.modules.ModuleMetadataMap.ModuleType;
2828
import com.google.javascript.rhino.Node;
29-
import java.util.HashMap;
29+
import java.util.LinkedHashMap;
3030
import java.util.Map;
3131
import java.util.Set;
3232
import org.jspecify.nullness.Nullable;
@@ -185,8 +185,8 @@ public ModuleMapCreator(AbstractCompiler compiler, ModuleMetadataMap moduleMetad
185185
this.esModuleProcessor = new EsModuleProcessor(compiler);
186186
this.closureModuleProcessor = new ClosureModuleProcessor(compiler);
187187
this.nonEsModuleProcessor = new NonEsModuleProcessor();
188-
unresolvedModules = new HashMap<>();
189-
unresolvedModulesByClosureNamespace = new HashMap<>();
188+
unresolvedModules = new LinkedHashMap<>();
189+
unresolvedModulesByClosureNamespace = new LinkedHashMap<>();
190190
}
191191

192192
private ModuleMap create() {
@@ -204,8 +204,8 @@ private ModuleMap create() {
204204

205205
private ModuleMap resolve() {
206206
ModuleRequestResolver requestResolver = new ModuleRequestResolverImpl();
207-
Map<String, Module> resolvedModules = new HashMap<>();
208-
Map<String, Module> resolvedClosureModules = new HashMap<>();
207+
Map<String, Module> resolvedModules = new LinkedHashMap<>();
208+
Map<String, Module> resolvedClosureModules = new LinkedHashMap<>();
209209

210210
// We need to resolve in a loop as any missing reference will add a fake to the
211211
// unresolvedModules map (see getFallback* methods above). This would cause a concurrent
@@ -286,5 +286,4 @@ private void process(ModuleMetadata moduleMetadata) {
286286
public void process(Node externs, Node root) {
287287
compiler.setModuleMap(create());
288288
}
289-
290289
}

src/com/google/javascript/jscomp/modules/UnresolvedModule.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import com.google.common.collect.ImmutableSet;
1919
import com.google.javascript.jscomp.modules.ModuleMetadataMap.ModuleMetadata;
20-
import java.util.HashSet;
20+
import java.util.LinkedHashSet;
2121
import java.util.Set;
2222
import org.jspecify.nullness.Nullable;
2323

@@ -81,8 +81,8 @@ ResolveExportResult resolveExport(
8181
moduleRequestResolver,
8282
/* moduleSpecifier= */ null,
8383
exportName,
84-
new HashSet<>(),
85-
new HashSet<>());
84+
new LinkedHashSet<>(),
85+
new LinkedHashSet<>());
8686
}
8787

8888
/**

0 commit comments

Comments
 (0)