Skip to content

Commit 5d53bf6

Browse files
tetrominocopybara-github
authored andcommitted
Split PackagePiece Identifier out into its own file/target
... and split the identifier for a package piece for build file into a sibling rather than parent class of the identifier of a package piece for macro. This is in preparation for making package piece identifiers into skykeys - with the two flavors of identifier being evaluated by different skyfunctions. Working towards bazelbuild#23852 PiperOrigin-RevId: 747509571 Change-Id: Ib62469f8e88906c6f4beceeeb0da47cb444d4b11
1 parent 2b43f31 commit 5d53bf6

File tree

5 files changed

+200
-136
lines changed

5 files changed

+200
-136
lines changed

src/main/java/com/google/devtools/build/lib/packages/BUILD

+12
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ java_library(
5454
"Globber.java",
5555
"GlobberUtils.java",
5656
"LabelPrinter.java",
57+
"PackagePieceIdentifier.java",
5758
"PackageSpecification.java",
5859
"RuleClassUtils.java",
5960
],
@@ -64,6 +65,7 @@ java_library(
6465
":globber",
6566
":globber_utils",
6667
":label_printer",
68+
":package_piece_identifier",
6769
":package_specification",
6870
"//src/main/java/com/google/devtools/build/docgen/annot",
6971
"//src/main/java/com/google/devtools/build/lib/actions:execution_requirements",
@@ -209,6 +211,16 @@ java_library(
209211
],
210212
)
211213

214+
java_library(
215+
name = "package_piece_identifier",
216+
srcs = ["PackagePieceIdentifier.java"],
217+
deps = [
218+
"//src/main/java/com/google/devtools/build/lib/cmdline",
219+
"//src/main/java/com/google/devtools/build/lib/util:hash_codes",
220+
"//third_party:guava",
221+
],
222+
)
223+
212224
java_library(
213225
name = "rule_class_id",
214226
srcs = ["RuleClassId.java"],

src/main/java/com/google/devtools/build/lib/packages/PackagePiece.java

+19-129
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,8 @@
3131
import com.google.devtools.build.lib.packages.Package.Declarations;
3232
import com.google.devtools.build.lib.packages.Package.Metadata;
3333
import com.google.devtools.build.lib.packages.TargetRecorder.MacroNamespaceViolationException;
34-
import com.google.devtools.build.lib.util.HashCodes;
3534
import com.google.devtools.build.lib.vfs.RootedPath;
3635
import com.google.errorprone.annotations.CanIgnoreReturnValue;
37-
import java.util.Objects;
3836
import java.util.Optional;
3937
import java.util.concurrent.Semaphore;
4038
import javax.annotation.Nullable;
@@ -55,11 +53,7 @@
5553
// another class of package piece obtained by evaluating a set of macros.
5654
public abstract sealed class PackagePiece extends Packageoid
5755
permits PackagePiece.ForBuildFile, PackagePiece.ForMacro {
58-
protected final Identifier identifier;
59-
60-
public Identifier getIdentifier() {
61-
return identifier;
62-
}
56+
public abstract PackagePieceIdentifier getIdentifier();
6357

6458
/**
6559
* Returns the {@link PackagePiece} corresponding to the evaluation of the BUILD file for this
@@ -150,100 +144,20 @@ public String getShortDescription() {
150144
return "package piece " + getIdentifier();
151145
}
152146

153-
private PackagePiece(Identifier identifier) {
154-
this.identifier = identifier;
155-
}
156-
157-
/** A unique identifier for a {@link PackagePiece}. */
158-
public static sealed class Identifier permits PackagePiece.ForMacro.Identifier {
159-
protected final PackageIdentifier packageIdentifier;
160-
// BUILD file label for a {@link PackagePiece.ForBuildFile}, or the label of the macro class
161-
// definition for a {@link PackagePiece.ForMacro}.
162-
protected final Label definingLabel;
163-
164-
/**
165-
* The canonical form of the package name if this is an identifier for a {@link
166-
* PackagePiece.ForBuildFile}, or the canonical form of the macro instance name if this is an
167-
* identifier for a {@link PackagePiece.ForMacro}.
168-
*
169-
* <p>This string is not unique, since multiple macro instances can have the same name. Intended
170-
* to be used in combination with {@link #getCanonicalFormDefinedBy}, or with {@link
171-
* #getDefiningLabel} + {@link #getDefiningSymbol} pair.
172-
*/
173-
public String getCanonicalFormName() {
174-
String pkgIdString = packageIdentifier.getCanonicalForm();
175-
return getInstanceName() != null
176-
? String.format("%s:%s", pkgIdString, getInstanceName())
177-
: pkgIdString;
178-
}
179-
180-
public String getCanonicalFormDefinedBy() {
181-
String definingLabelString = definingLabel.getCanonicalForm();
182-
return getDefiningSymbol() != null
183-
? String.format("%s%%%s", definingLabelString, getDefiningSymbol())
184-
: definingLabelString;
185-
}
186-
187-
@Nullable
188-
protected String getInstanceName() {
189-
return null;
190-
}
191-
192-
/**
193-
* BUILD file label for a {@link PackagePiece.ForBuildFile}, or the label of the macro class
194-
* definition for a {@link PackagePiece.ForMacro}.
195-
*/
196-
public Label getDefiningLabel() {
197-
return definingLabel;
198-
}
199-
200-
@Nullable
201-
public String getDefiningSymbol() {
202-
return null;
203-
}
204-
205-
@Override
206-
public String toString() {
207-
return String.format("%s defined by %s", getCanonicalFormName(), getCanonicalFormDefinedBy());
208-
}
209-
210-
@Override
211-
public boolean equals(Object other) {
212-
if (this == other) {
213-
return true;
214-
}
215-
if (!(other instanceof PackagePiece.Identifier that)) {
216-
return false;
217-
}
218-
return this.packageIdentifier.equals(that.packageIdentifier)
219-
&& this.definingLabel.equals(that.definingLabel)
220-
// Valid because PackagePiece.ForMacro.Identifier requires defining symbol and instance
221-
// name to be non-null.
222-
&& Objects.equals(this.getDefiningSymbol(), that.getDefiningSymbol())
223-
&& Objects.equals(this.getInstanceName(), that.getInstanceName());
224-
}
225-
226-
@Override
227-
public int hashCode() {
228-
return HashCodes.hashObjects(
229-
packageIdentifier, definingLabel, getDefiningSymbol(), getInstanceName());
230-
}
231-
232-
@VisibleForTesting
233-
Identifier(PackageIdentifier packageIdentifier, Label definingLabel) {
234-
this.packageIdentifier = packageIdentifier;
235-
this.definingLabel = definingLabel;
236-
}
237-
}
238-
239147
/**
240148
* A {@link PackagePiece} obtained by evaluating a BUILD file, without expanding any symbolic
241149
* macros.
242150
*/
243151
public static final class ForBuildFile extends PackagePiece {
152+
private final PackagePieceIdentifier.ForBuildFile identifier;
244153
private final Metadata metadata;
245154
private final Declarations declarations;
246155

156+
@Override
157+
public PackagePieceIdentifier.ForBuildFile getIdentifier() {
158+
return identifier;
159+
}
160+
247161
@Override
248162
public PackagePiece.ForBuildFile getPackagePieceForBuildFile() {
249163
return this;
@@ -266,7 +180,9 @@ public void checkMacroNamespaceCompliance(Target target) {
266180
}
267181

268182
private ForBuildFile(Metadata metadata) {
269-
super(new Identifier(metadata.packageIdentifier(), metadata.buildFileLabel()));
183+
this.identifier =
184+
new PackagePieceIdentifier.ForBuildFile(
185+
metadata.packageIdentifier(), metadata.buildFileLabel());
270186
this.metadata = metadata;
271187
this.declarations = new Declarations();
272188
}
@@ -394,11 +310,17 @@ private Builder(
394310

395311
/** A {@link PackagePiece} obtained by evaluating a symbolic macro instance. */
396312
public static final class ForMacro extends PackagePiece {
313+
private final PackagePieceIdentifier.ForMacro identifier;
397314
private final MacroInstance evaluatedMacro;
398315
private final PackagePiece.ForBuildFile pieceForBuildFile;
399316
// Null until the package piece is fully initialized by its builder's {@code finishBuild()}.
400317
@Nullable private ImmutableSet<String> macroNamespaceViolations = null;
401318

319+
@Override
320+
public PackagePieceIdentifier.ForMacro getIdentifier() {
321+
return identifier;
322+
}
323+
402324
@Override
403325
public PackagePiece.ForBuildFile getPackagePieceForBuildFile() {
404326
return pieceForBuildFile;
@@ -444,12 +366,12 @@ public void checkMacroNamespaceCompliance(Target target)
444366
}
445367

446368
private ForMacro(MacroInstance evaluatedMacro, PackagePiece.ForBuildFile pieceForBuildFile) {
447-
super(
448-
new PackagePiece.ForMacro.Identifier(
369+
this.identifier =
370+
new PackagePieceIdentifier.ForMacro(
449371
pieceForBuildFile.getPackageIdentifier(),
450372
evaluatedMacro.getMacroClass().getDefiningBzlLabel(),
451373
/* definingSymbol= */ evaluatedMacro.getMacroClass().getName(),
452-
/* instanceName= */ evaluatedMacro.getName()));
374+
/* instanceName= */ evaluatedMacro.getName());
453375
this.evaluatedMacro = evaluatedMacro;
454376
this.pieceForBuildFile = pieceForBuildFile;
455377
}
@@ -480,38 +402,6 @@ public static Builder newBuilder(
480402
trackFullMacroInformation);
481403
}
482404

483-
/**
484-
* A unique identifier for a {@link PackagePiece.ForMacro}.
485-
*
486-
* <p>Exists purely as a memory optimization to avoid allocating the defining symbol and
487-
* instance name for {@link PackagePiece.ForBuildFile} objects.
488-
*/
489-
public static final class Identifier extends PackagePiece.Identifier {
490-
private final String definingSymbol;
491-
private final String instanceName;
492-
493-
@Override
494-
public String getDefiningSymbol() {
495-
return definingSymbol;
496-
}
497-
498-
@Override
499-
public String getInstanceName() {
500-
return instanceName;
501-
}
502-
503-
@VisibleForTesting
504-
Identifier(
505-
PackageIdentifier packageIdentifier,
506-
Label definingLabel,
507-
String definingSymbol,
508-
String instanceName) {
509-
super(packageIdentifier, definingLabel);
510-
this.definingSymbol = checkNotNull(definingSymbol);
511-
this.instanceName = checkNotNull(instanceName);
512-
}
513-
}
514-
515405
/** A builder for {@link PackagePieceForMacro} objects. */
516406
public static class Builder extends TargetDefinitionContext {
517407

0 commit comments

Comments
 (0)