Make the rule in the workspace package reference the correct Package object.
Fixes #1228.
--
MOS_MIGRATED_REVID=122511655
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 1776ed6..fc2a193 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
@@ -1190,6 +1190,7 @@
}
void addRule(Rule rule) throws NameConflictException {
+ Preconditions.checkArgument(rule.getPackage() == pkg);
checkForConflicts(rule);
// Now, modify the package:
for (OutputFile outputFile : rule.getOutputFiles()) {
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 6df9f05..625e3fe 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
@@ -24,6 +24,7 @@
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.cmdline.LabelValidator;
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.Builder;
import com.google.devtools.build.lib.packages.Package.LegacyBuilder;
@@ -247,7 +248,7 @@
Package aPackage,
ImmutableMap<String, Extension> importMap,
ImmutableMap<String, Object> bindings)
- throws NameConflictException {
+ throws NameConflictException, InterruptedException {
this.parentVariableBindings = bindings;
this.parentImportMap = importMap;
builder.setWorkspaceName(aPackage.getWorkspaceName());
@@ -256,8 +257,24 @@
if (aPackage.containsErrors()) {
builder.setContainsErrors();
}
- for (Target target : aPackage.getTargets(Rule.class)) {
- builder.addRule((Rule) target);
+ for (Rule rule : aPackage.getTargets(Rule.class)) {
+ try {
+ // The old rule references another Package instance and we wan't to keep the invariant that
+ // every Rule references the Package it is contained within
+ Rule newRule = builder.createRule(
+ rule.getLabel(),
+ rule.getRuleClassObject(),
+ rule.getLocation(),
+ rule.getAttributeContainer());
+ newRule.populateOutputFiles(NullEventHandler.INSTANCE, builder);
+ if (rule.containsErrors()) {
+ newRule.setContainsErrors();
+ }
+ builder.addRule(newRule);
+ } catch (LabelSyntaxException e) {
+ // This rule has already been created once, so it should have worked the second time, too
+ throw new IllegalStateException(e);
+ }
}
}