From d8d9078ba5dadc575e12f52424313b3a07bf3eaf Mon Sep 17 00:00:00 2001 From: Googler Date: Wed, 3 Jan 2024 07:35:10 -0800 Subject: [PATCH] Make Package.Builder own its event handler Previously there were three mechanisms for reporting events during package building: 1) a list of events/posts on the Package.Builder, which get accumulated until the package is constructed, at which they're replayed on the skyframe environment's eventHandler 2) a separate StoredEventHandler managed by PackageFactory, used for the odd message here and there, but ultimately merged into the Builder's events/posts 3) the StarlarkThread's print() handler, which points to the handler in (2) unknown commit moved the handler in (2) from PackageContext to a field of Package.Builder, but left the initialization and merging of this handler in PackageFactory#executeBuildFileImpl(). This CL closes the loop by making Package.Builder responsible for initializing this handler, and uses it to replace the separate events/posts list. Package.java: - events/posts fields on Builder go away, localEventHandler becomes non-nullable. addEvent[s]/addPosts/getEvents/getPosts accessors also go away, there were very few uses and they can all be replaced using getLocalEventHandler(). PackageFactory.java / WorkspaceFactory.java: - no need to create a StoredEventHandler and associate it with the Builder, or merge it into events/posts when done Event handling machinery: - add replayPostsOn(), for symmetry with replayEventsOn() This CL is *probably* a no-op, but there may be slight differences in error reporting at the margins, e.g. whether a certain type of error triggers Builder.setContainsErrors(). Work toward #19922. PiperOrigin-RevId: 595397832 Change-Id: I09d29dcc58870581a59a8275eff7533fa739be42 --- .../lib/events/ExtendedEventHandler.java | 7 ++ .../build/lib/events/StoredEventHandler.java | 11 +-- .../devtools/build/lib/packages/Package.java | 95 ++++--------------- .../build/lib/packages/PackageFactory.java | 14 +-- .../build/lib/packages/RuleClass.java | 1 + .../build/lib/packages/RuleFactory.java | 1 + .../build/lib/packages/WorkspaceFactory.java | 20 ++-- .../lib/packages/WorkspaceFactoryHelper.java | 19 ++-- .../build/lib/skyframe/PackageFunction.java | 14 ++- .../lib/skyframe/WorkspaceFileFunction.java | 6 +- .../packages/WorkspaceFactoryTestHelper.java | 3 +- 11 files changed, 66 insertions(+), 125 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/events/ExtendedEventHandler.java b/src/main/java/com/google/devtools/build/lib/events/ExtendedEventHandler.java index 4c46d6673839b1..7cb9763aa6e958 100644 --- a/src/main/java/com/google/devtools/build/lib/events/ExtendedEventHandler.java +++ b/src/main/java/com/google/devtools/build/lib/events/ExtendedEventHandler.java @@ -34,6 +34,13 @@ default void reportTo(ExtendedEventHandler handler) { default Postable withTag(@Nullable String tag) { return this; // No tag-based filtering. } + + /** Replays a sequence of posts on {@code handler}. */ + public static void replayPostsOn(ExtendedEventHandler handler, Iterable posts) { + for (Postable post : posts) { + handler.post(post); + } + } } /** Posts a {@link Postable} object about an important build event. */ diff --git a/src/main/java/com/google/devtools/build/lib/events/StoredEventHandler.java b/src/main/java/com/google/devtools/build/lib/events/StoredEventHandler.java index 6983afecfddb23..b7d8e2f148fd17 100644 --- a/src/main/java/com/google/devtools/build/lib/events/StoredEventHandler.java +++ b/src/main/java/com/google/devtools/build/lib/events/StoredEventHandler.java @@ -15,6 +15,7 @@ import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.events.ExtendedEventHandler.Postable; import java.util.ArrayList; import java.util.List; @@ -22,14 +23,14 @@ public class StoredEventHandler implements ExtendedEventHandler { private final List events = new ArrayList<>(); - private final List posts = new ArrayList<>(); + private final List posts = new ArrayList<>(); private boolean hasErrors; public synchronized ImmutableList getEvents() { return ImmutableList.copyOf(events); } - public synchronized ImmutableList getPosts() { + public synchronized ImmutableList getPosts() { return ImmutableList.copyOf(posts); } @@ -46,16 +47,14 @@ public synchronized void handle(Event e) { } @Override - public synchronized void post(ExtendedEventHandler.Postable e) { + public synchronized void post(Postable e) { posts.add(e); } /** Replay all events stored in this object on the given eventHandler, in the same order. */ public synchronized void replayOn(ExtendedEventHandler eventHandler) { Event.replayEventsOn(eventHandler, events); - for (ExtendedEventHandler.Postable obj : posts) { - eventHandler.post(obj); - } + Postable.replayPostsOn(eventHandler, posts); } /** diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java index 1cc48825ea3c16..9ce145252aea7e 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Package.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java @@ -25,7 +25,6 @@ import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Interner; import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.devtools.build.lib.bugreport.BugReport; import com.google.devtools.build.lib.cmdline.BazelModuleContext; @@ -42,8 +41,6 @@ import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.events.EventKind; -import com.google.devtools.build.lib.events.ExtendedEventHandler; -import com.google.devtools.build.lib.events.ExtendedEventHandler.Postable; import com.google.devtools.build.lib.events.StoredEventHandler; import com.google.devtools.build.lib.packages.Package.Builder.PackageSettings; import com.google.devtools.build.lib.server.FailureDetails.FailureDetail; @@ -858,21 +855,19 @@ default boolean precomputeTransitiveLoads() { // (which may change due to serialization). This is useful so that the serialized representation // is deterministic. private final TreeMap makeEnv = new TreeMap<>(); - private final List events = Lists.newArrayList(); - private final List posts = Lists.newArrayList(); - // Assigned by setLocalEventHandler, but not necessarily in all contexts. - // TODO(#19922): Make non-nullable, init in constructor. - @Nullable private StoredEventHandler localEventHandler = null; + + private final StoredEventHandler localEventHandler = new StoredEventHandler(); + @Nullable private String ioExceptionMessage = null; @Nullable private IOException ioException = null; @Nullable private DetailedExitCode ioExceptionDetailedExitCode = null; // TODO(#19922): Consider having separate containsErrors fields on Metadata and Package. In that // case, this field is replaced by the one on Metadata. private boolean containsErrors = false; - // A package's FailureDetail field derives from its Builder's events. During package - // deserialization, those events are unavailable, because those events aren't serialized [*]. - // Its FailureDetail value is serialized, however. During deserialization, that value is - // assigned here, so that it can be assigned to the deserialized package. + // A package's FailureDetail field derives from the events on its Builder's event handler. + // During package deserialization, those events are unavailable, because those events aren't + // serialized [*]. Its FailureDetail value is serialized, however. During deserialization, that + // value is assigned here, so that it can be assigned to the deserialized package. // // Likewise, during workspace part assembly, errors from parent parts should propagate to their // children. @@ -1124,46 +1119,8 @@ RootedPath getFilename() { return pkg.metadata.filename; } - /** - * Returns {@link Postable}s accumulated while building the package. - * - *

Should retrieved and reported as close to after {@link #build()} or {@link #finishBuild()} - * as possible - any earlier and the data may be incomplete. - */ - public List getPosts() { - return posts; - } - - /** - * Returns {@link Event}s accumulated while building the package. - * - *

Should retrieved and reported as close to after {@link #build()} or {@link #finishBuild()} - * as possible - any earlier and the data may be incomplete. - */ - public List getEvents() { - return events; - } - - /** Associates a {@link StoredEventHandler} with this builder. */ - // TODO(#19922): This is a temporary method resulting from migrating PackageContext.eventHandler - // to Package.Builder. The next step is to create the StoredEventHandler in Package.Builder's - // constructor, and use that to eliminate the separate `events` and `posts` fields. - @CanIgnoreReturnValue - Builder setLocalEventHandler(StoredEventHandler eventHandler) { - this.localEventHandler = eventHandler; - return this; - } - - /** - * Returns the {@link ExtendedEventHandler} associated with this builder. Using this handler - * should be equivalent to calling {@link #addEvent} / {@link #addPosts}. - * - *

This field may be null in tests. - */ - // TODO(#19922): The "should" in the above javadoc will be guaranteed by eliminating the - // separate `events` and `posts` fields. We'll also make this non-nullable. - @Nullable - public ExtendedEventHandler getLocalEventHandler() { + /** Returns the {@link StoredEventHandler} associated with this builder. */ + public StoredEventHandler getLocalEventHandler() { return localEventHandler; } @@ -1236,8 +1193,14 @@ Builder setIOException(IOException e, String message, DetailedExitCode detailedE * #addEvent} or {@link #addEvents} should already have been called with an {@link Event} of * type {@link EventKind#ERROR} that includes a {@link FailureDetail}. */ + // TODO(bazel-team): For simplicity it would be nice to replace this with + // getLocalEventHandler().hasErrors(), since that would prevent the kind of inconsistency where + // we have reported an ERROR event but not called setContainsErrors(), or vice versa. @CanIgnoreReturnValue public Builder setContainsErrors() { + // TODO(bazel-team): Maybe do Preconditions.checkState(localEventHandler.hasErrors()). + // Maybe even assert that it has a FailureDetail, though that's a linear scan unless we + // customize the event handler. containsErrors = true; return this; } @@ -1246,28 +1209,6 @@ public boolean containsErrors() { return containsErrors; } - @CanIgnoreReturnValue - Builder addPosts(Iterable posts) { - for (Postable post : posts) { - this.posts.add(post); - } - return this; - } - - @CanIgnoreReturnValue - Builder addEvents(Iterable events) { - for (Event event : events) { - addEvent(event); - } - return this; - } - - @CanIgnoreReturnValue - public Builder addEvent(Event event) { - this.events.add(event); - return this; - } - void setFailureDetailOverride(FailureDetail failureDetail) { failureDetailOverride = failureDetail; } @@ -1279,7 +1220,7 @@ FailureDetail getFailureDetail() { } List undetailedEvents = null; - for (Event event : this.events) { + for (Event event : localEventHandler.getEvents()) { if (event.getKind() != EventKind.ERROR) { continue; } @@ -1782,7 +1723,9 @@ public Package finishBuild() { for (EnvironmentGroup envGroup : ImmutableSet.copyOf(environmentGroups.values())) { List errors = envGroup.processMemberEnvironments(targets); if (!errors.isEmpty()) { - addEvents(errors); + Event.replayEventsOn(localEventHandler, errors); + // TODO(bazel-team): Can't we automatically infer containsError from the presence of + // ERRORs on our handler? setContainsErrors(); } } diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java index c908a8853d3750..adda64472e7139 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java @@ -27,7 +27,6 @@ import com.google.devtools.build.lib.concurrent.NamedForkJoinPool; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.ExtendedEventHandler; -import com.google.devtools.build.lib.events.StoredEventHandler; import com.google.devtools.build.lib.packages.Globber.BadGlobException; import com.google.devtools.build.lib.packages.Package.Builder.PackageSettings; import com.google.devtools.build.lib.packages.PackageValidator.InvalidPackageException; @@ -401,14 +400,11 @@ private void executeBuildFileImpl( throws InterruptedException { pkgBuilder.setLoads(loadedModules.values()); - StoredEventHandler eventHandler = new StoredEventHandler(); - pkgBuilder.setLocalEventHandler(eventHandler); - try (Mutability mu = Mutability.create("package", pkgBuilder.getFilename())) { Module module = Module.withPredeclared(semantics, predeclared); StarlarkThread thread = new StarlarkThread(mu, semantics); thread.setLoader(loadedModules::get); - thread.setPrintHandler(Event.makeDebugPrintHandler(eventHandler)); + thread.setPrintHandler(Event.makeDebugPrintHandler(pkgBuilder.getLocalEventHandler())); new BazelStarlarkContext( BazelStarlarkContext.Phase.LOADING, @@ -428,8 +424,9 @@ private void executeBuildFileImpl( try { Starlark.execFileProgram(buildFileProgram, module, thread); } catch (EvalException ex) { - eventHandler.handle( - Package.error(null, ex.getMessageWithStack(), Code.STARLARK_EVAL_ERROR)); + pkgBuilder + .getLocalEventHandler() + .handle(Package.error(null, ex.getMessageWithStack(), Code.STARLARK_EVAL_ERROR)); pkgBuilder.setContainsErrors(); } catch (InterruptedException ex) { if (pkgBuilder.containsErrors()) { @@ -444,9 +441,6 @@ private void executeBuildFileImpl( } pkgBuilder.setComputationSteps(thread.getExecutedSteps()); } - - pkgBuilder.addPosts(eventHandler.getPosts()); - pkgBuilder.addEvents(eventHandler.getEvents()); } /** diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java index 32138da283f6b6..984799b7d6e167 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java @@ -2117,6 +2117,7 @@ Rule createRule( Label ruleLabel, AttributeValues attributeValues, boolean failOnUnknownAttributes, + // TODO(#19922): elim eventHandler param, it's redundant with pkgBuilder EventHandler eventHandler, List callstack) throws LabelSyntaxException, InterruptedException, CannotPrecomputeDefaultsException { diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java index f2e8a90979f014..e28a0a990d0674 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java @@ -56,6 +56,7 @@ public static Rule createRule( RuleClass ruleClass, BuildLangTypedAttributeValuesMap attributeValues, boolean failOnUnknownAttributes, + // TODO(#19922): elim eventHandler param, it's redundant with pkgBuilder EventHandler eventHandler, ImmutableList callstack) throws InvalidRuleException, InterruptedException { diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java index bdbe548b02d35f..62b00fb70c0ac3 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java @@ -19,7 +19,6 @@ import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.NullEventHandler; -import com.google.devtools.build.lib.events.StoredEventHandler; import com.google.devtools.build.lib.packages.Package.NameConflictException; import com.google.devtools.build.lib.server.FailureDetails; import com.google.devtools.build.lib.server.FailureDetails.PackageLoading; @@ -110,7 +109,6 @@ public void execute( predeclared.putAll(bindings); // (may shadow bindings in default environment) Module module = Module.withPredeclared(starlarkSemantics, predeclared); - StoredEventHandler localReporter = new StoredEventHandler(); try { // compile new DotBazelFileSyntaxChecker("WORKSPACE files", /* canLoadBzl= */ true).check(file); @@ -119,9 +117,8 @@ public void execute( // create thread StarlarkThread thread = new StarlarkThread(mutability, starlarkSemantics); thread.setLoader(loadedModules::get); - thread.setPrintHandler(Event.makeDebugPrintHandler(localReporter)); + thread.setPrintHandler(Event.makeDebugPrintHandler(builder.getLocalEventHandler())); thread.setThreadLocal(Package.Builder.class, builder); - builder.setLocalEventHandler(localReporter); // The workspace environment doesn't need the tools repository or the fragment map // because executing workspace rules happens before analysis and it doesn't need a @@ -134,8 +131,11 @@ public void execute( try { Starlark.execFileProgram(prog, module, thread); } catch (EvalException ex) { - localReporter.handle( - Package.error(null, ex.getMessageWithStack(), PackageLoading.Code.STARLARK_EVAL_ERROR)); + builder + .getLocalEventHandler() + .handle( + Package.error( + null, ex.getMessageWithStack(), PackageLoading.Code.STARLARK_EVAL_ERROR)); } // Accumulate the global bindings created by this chunk of the WORKSPACE file, @@ -146,7 +146,7 @@ public void execute( } catch (SyntaxError.Exception ex) { // compilation failed - Event.replayEventsOn(localReporter, ex.errors()); + Event.replayEventsOn(builder.getLocalEventHandler(), ex.errors()); builder.setFailureDetailOverride( FailureDetails.FailureDetail.newBuilder() .setMessage(ex.getMessage()) @@ -157,9 +157,9 @@ public void execute( } // cleanup (success or failure) - builder.addPosts(localReporter.getPosts()); - builder.addEvents(localReporter.getEvents()); - if (localReporter.hasErrors()) { + // TODO(bazel-team): Package.Builder should manage its own containsErrors bit based on whether + // its handler has errors, without our telling it to. + if (builder.getLocalEventHandler().hasErrors()) { builder.setContainsErrors(); } } diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java index 0f2847470d452d..fb44b7a64af016 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java +++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java @@ -45,7 +45,7 @@ public static boolean originatesInWorkspaceSuffix( @CanIgnoreReturnValue public static Rule createAndAddRepositoryRule( - Package.Builder pkg, + Package.Builder pkgBuilder, RuleClass ruleClass, RuleClass bindRuleClass, Map kwargs, @@ -54,17 +54,20 @@ public static Rule createAndAddRepositoryRule( Package.NameConflictException, LabelSyntaxException, InterruptedException { - StoredEventHandler eventHandler = new StoredEventHandler(); BuildLangTypedAttributeValuesMap attributeValues = new BuildLangTypedAttributeValuesMap(kwargs); Rule rule = - RuleFactory.createRule(pkg, ruleClass, attributeValues, true, eventHandler, callstack); - pkg.addEvents(eventHandler.getEvents()); - pkg.addPosts(eventHandler.getPosts()); - overwriteRule(pkg, rule); + RuleFactory.createRule( + pkgBuilder, + ruleClass, + attributeValues, + true, + pkgBuilder.getLocalEventHandler(), + callstack); + overwriteRule(pkgBuilder, rule); for (Map.Entry entry : ruleClass.getExternalBindingsFunction().apply(rule).entrySet()) { Label nameLabel = Label.parseCanonical("//external:" + entry.getKey()); - addBindRule(pkg, bindRuleClass, nameLabel, entry.getValue(), callstack); + addBindRule(pkgBuilder, bindRuleClass, nameLabel, entry.getValue(), callstack); } // NOTE(wyv): What is this madness?? This is the only instance where a repository rule can // register toolchains upon being instantiated. We should look into converting @@ -77,7 +80,7 @@ public static Rule createAndAddRepositoryRule( throw new LabelSyntaxException(e.getMessage()); } } - pkg.addRegisteredToolchains(toolchains.build(), originatesInWorkspaceSuffix(callstack)); + pkgBuilder.addRegisteredToolchains(toolchains.build(), originatesInWorkspaceSuffix(callstack)); return rule; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java index 66d952d95e9167..cb09d824e7b93a 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java @@ -35,7 +35,6 @@ import com.google.devtools.build.lib.cmdline.RepositoryMapping; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.Event; -import com.google.devtools.build.lib.events.ExtendedEventHandler.Postable; import com.google.devtools.build.lib.io.FileSymlinkException; import com.google.devtools.build.lib.io.InconsistentFilesystemException; import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; @@ -574,10 +573,7 @@ public SkyValue compute(SkyKey key, Environment env) Package pkg = pkgBuilder.finishBuild(); - Event.replayEventsOn(env.getListener(), pkgBuilder.getEvents()); - for (Postable post : pkgBuilder.getPosts()) { - env.getListener().post(post); - } + pkgBuilder.getLocalEventHandler().replayOn(env.getListener()); try { packageFactory.afterDoneLoadingPackage( @@ -903,7 +899,7 @@ private static boolean maybeAddEventAboutLabelCrossingSubpackage( if (errMsg != null) { Event error = Package.error(target.getLocation(), errMsg, Code.LABEL_CROSSES_PACKAGE_BOUNDARY); - pkgBuilder.addEvent(error); + pkgBuilder.getLocalEventHandler().handle(error); return true; } else { return false; @@ -1449,8 +1445,10 @@ private LoadedPackage loadPackage( } else { // Execution not attempted due to static errors. for (SyntaxError err : compiled.errors) { - pkgBuilder.addEvent( - Package.error(err.location(), err.message(), PackageLoading.Code.SYNTAX_ERROR)); + pkgBuilder + .getLocalEventHandler() + .handle( + Package.error(err.location(), err.message(), PackageLoading.Code.SYNTAX_ERROR)); } pkgBuilder.setContainsErrors(); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java index 6d6186548494a0..59af4e004d37bf 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java @@ -33,7 +33,6 @@ import com.google.devtools.build.lib.cmdline.RepositoryMapping; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.Event; -import com.google.devtools.build.lib.events.ExtendedEventHandler.Postable; import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.Package; @@ -450,10 +449,7 @@ private static Package buildAndReportEvents(Package.Builder pkgBuilder, Environm throw new WorkspaceFileFunctionException(e, Transience.TRANSIENT); } - Event.replayEventsOn(env.getListener(), pkgBuilder.getEvents()); - for (Postable postable : pkgBuilder.getPosts()) { - env.getListener().post(postable); - } + pkgBuilder.getLocalEventHandler().replayOn(env.getListener()); return result; } diff --git a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java index fa8ada16e696ff..b5f9fdd602effc 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java +++ b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java @@ -28,7 +28,6 @@ import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.Root; import com.google.devtools.build.lib.vfs.RootedPath; -import java.util.List; import net.starlark.java.eval.Mutability; import net.starlark.java.eval.StarlarkSemantics; import net.starlark.java.syntax.ParserInput; @@ -101,7 +100,7 @@ Package getPackage() throws InterruptedException, NoSuchPackageException { } String getParserError() { - List events = builder.getEvents(); + ImmutableList events = builder.getLocalEventHandler().getEvents(); assertThat(events.size()).isGreaterThan(0); return events.get(0).getMessage(); }