diff options
author | Lukacs Berki <lberki@google.com> | 2016-05-17 11:15:19 +0000 |
---|---|---|
committer | Kristina Chodorow <kchodorow@google.com> | 2016-05-17 16:17:48 +0000 |
commit | 4867ef74c00e78a441295d7bd5e970c99f1607b3 (patch) | |
tree | 4426c1b45c8969af0dcb1239b805f74e2bf44ffd /src/main/java/com/google/devtools | |
parent | 118ef0312b605d51461e4bf0a37a28366bb041d9 (diff) |
Make the rule in the workspace package reference the correct Package object.
Fixes #1228.
--
MOS_MIGRATED_REVID=122511655
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/packages/Package.java | 1 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java | 23 |
2 files changed, 21 insertions, 3 deletions
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 1776ed6626..fc2a1931ba 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 @@ public class Package { } 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 6df9f05411..625e3fe8fd 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.Label; 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 @@ public class WorkspaceFactory { 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 @@ public class WorkspaceFactory { 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); + } } } |