Deletes AutoCodec.Strategy.SINGLETON now that we have @AutoCodec field tags.
This also gets rid of some static initialization cycles which we should try very hard to avoid in the future.
PiperOrigin-RevId: 187334087
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java
index 36f7b24..b8b62c9 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java
@@ -29,9 +29,9 @@
* An {@link ArtifactOwner} that just returns null for its label. Only for use with resolved
* source artifacts and tests.
*/
- @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
class NullArtifactOwner implements ArtifactOwner {
- @VisibleForTesting public static final NullArtifactOwner INSTANCE = new NullArtifactOwner();
+ @AutoCodec @VisibleForTesting
+ public static final NullArtifactOwner INSTANCE = new NullArtifactOwner();
private NullArtifactOwner() {}
diff --git a/src/main/java/com/google/devtools/build/lib/actions/EmptyRunfilesSupplier.java b/src/main/java/com/google/devtools/build/lib/actions/EmptyRunfilesSupplier.java
index ddab7c9..5cc2e52 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/EmptyRunfilesSupplier.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/EmptyRunfilesSupplier.java
@@ -18,15 +18,13 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.Map;
/** Empty implementation of RunfilesSupplier */
-@AutoCodec(strategy = Strategy.SINGLETON)
public class EmptyRunfilesSupplier implements RunfilesSupplier {
- public static final EmptyRunfilesSupplier INSTANCE = new EmptyRunfilesSupplier();
+ @AutoCodec public static final EmptyRunfilesSupplier INSTANCE = new EmptyRunfilesSupplier();
private EmptyRunfilesSupplier() {}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
index 933a1a8..a1f02fa 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
@@ -33,7 +33,6 @@
import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
@@ -73,8 +72,6 @@
)
@AutoCodec
public final class Runfiles {
- public static ObjectCodec<Runfiles> CODEC = new Runfiles_AutoCodec();
-
private static final Function<SymlinkEntry, Artifact> TO_ARTIFACT =
new Function<SymlinkEntry, Artifact>() {
@Override
@@ -83,12 +80,9 @@
}
};
- @AutoCodec(strategy = Strategy.SINGLETON)
@VisibleForSerialization
static class DummyEmptyFilesSupplier implements EmptyFilesSupplier {
- public static final ObjectCodec<DummyEmptyFilesSupplier> CODEC =
- new Runfiles_DummyEmptyFilesSupplier_AutoCodec();
- public static final DummyEmptyFilesSupplier INSTANCE = new DummyEmptyFilesSupplier();
+ @AutoCodec public static final DummyEmptyFilesSupplier INSTANCE = new DummyEmptyFilesSupplier();
@Override
public Iterable<PathFragment> getExtraPaths(Set<PathFragment> manifestPaths) {
diff --git a/src/main/java/com/google/devtools/build/lib/events/Location.java b/src/main/java/com/google/devtools/build/lib/events/Location.java
index 162678d..5865489 100644
--- a/src/main/java/com/google/devtools/build/lib/events/Location.java
+++ b/src/main/java/com/google/devtools/build/lib/events/Location.java
@@ -15,7 +15,6 @@
package com.google.devtools.build.lib.events;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -36,9 +35,6 @@
@AutoCodec
@Immutable
static final class LocationWithPathAndStartColumn extends Location {
- public static final ObjectCodec<LocationWithPathAndStartColumn> CODEC =
- new Location_LocationWithPathAndStartColumn_AutoCodec();
-
private final PathFragment path;
private final LineAndColumn startLineAndColumn;
@@ -219,14 +215,14 @@
* "23:2"
* "foo.cc:char offsets 123--456"
* "char offsets 123--456"
- *</pre>
+ * </pre>
*
* <p>This version replace the package's path with the relative package path. I.e., if {@code
* packagePath} is equivalent to "/absolute/path/to/workspace/pack/age" and {@code
* relativePackage} is equivalent to "pack/age" then the result for the 2nd character of the 23rd
* line of the "foo/bar.cc" file in "pack/age" would be "pack/age/foo/bar.cc:23:2" whereas with
* {@link #print()} the result would be "/absolute/path/to/workspace/pack/age/foo/bar.cc:23:2".
- *
+ *
* <p>If {@code packagePath} is not a parent of the location path, then the result of this
* function is the same as the result of {@link #print()}.
*/
@@ -262,8 +258,6 @@
@AutoCodec
@Immutable
public static final class LineAndColumn {
- public static final ObjectCodec<LineAndColumn> CODEC = new Location_LineAndColumn_AutoCodec();
-
private final int line;
private final int column;
@@ -298,11 +292,7 @@
}
}
- @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
- @AutoCodec.VisibleForSerialization
static final class BuiltinLocation extends Location {
- public static final BuiltinLocation INSTANCE = new BuiltinLocation();
-
private BuiltinLocation() {
super(0, 0);
}
@@ -332,7 +322,7 @@
* Dummy location for built-in functions which ensures that stack traces contain "nice" location
* strings.
*/
- public static final Location BUILTIN = BuiltinLocation.INSTANCE;
+ @AutoCodec public static final Location BUILTIN = new BuiltinLocation();
/**
* Returns the location in the format "filename:line".
@@ -343,7 +333,7 @@
if (location == null) {
return "";
}
-
+
StringBuilder builder = new StringBuilder();
PathFragment path = location.getPath();
if (path != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/NoProcessing.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/NoProcessing.java
index 9542149..f6a5bd0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/NoProcessing.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/NoProcessing.java
@@ -18,17 +18,12 @@
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ExecException;
import com.google.devtools.build.lib.rules.cpp.IncludeScanner.IncludeScannerSupplier;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
import javax.annotation.Nullable;
/** Always performs no include processing and returns null. */
-@AutoCodec(strategy = Strategy.SINGLETON)
public class NoProcessing implements IncludeProcessing {
- public static final ObjectCodec<NoProcessing> CODEC = new NoProcessing_AutoCodec();
-
- public static final NoProcessing INSTANCE = new NoProcessing();
+ @AutoCodec public static final NoProcessing INSTANCE = new NoProcessing();
@Override
public Iterable<Artifact> determineAdditionalInputs(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java
index 4454dbe..2465258 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java
@@ -28,7 +28,7 @@
*/
public abstract class ContainingPackageLookupValue implements SkyValue {
- public static final NoContainingPackage NONE = NoContainingPackage.INSTANCE;
+ @AutoCodec public static final NoContainingPackage NONE = new NoContainingPackage();
/** Returns whether there is a containing package. */
public abstract boolean hasContainingPackage();
@@ -50,10 +50,7 @@
}
/** Value indicating there is no containing package. */
- @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
public static class NoContainingPackage extends ContainingPackageLookupValue {
- public static final NoContainingPackage INSTANCE = new NoContainingPackage();
-
private NoContainingPackage() {}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java
index edb9226..e752285 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java
@@ -16,7 +16,6 @@
import com.google.devtools.build.lib.actions.ActionLookupValue;
import com.google.devtools.build.lib.actions.Actions.GeneratingActions;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.skyframe.SkyFunctionName;
@@ -26,24 +25,18 @@
public class CoverageReportValue extends ActionLookupValue {
// There should only ever be one CoverageReportValue value in the graph.
- public static final CoverageReportKey COVERAGE_REPORT_KEY = CoverageReportKey.INSTANCE;
+ @AutoCodec public static final CoverageReportKey COVERAGE_REPORT_KEY = new CoverageReportKey();
CoverageReportValue(GeneratingActions generatingActions, boolean removeActionsAfterEvaluation) {
super(generatingActions, removeActionsAfterEvaluation);
}
- @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
static class CoverageReportKey extends ActionLookupKey {
- static final CoverageReportKey INSTANCE = new CoverageReportKey();
- static final ObjectCodec<CoverageReportKey> CODEC =
- new CoverageReportValue_CoverageReportKey_AutoCodec();
-
private CoverageReportKey() {}
@Override
public SkyFunctionName functionName() {
return SkyFunctions.COVERAGE_REPORT;
}
-
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java
index 0c78c40..c76a7ad 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java
@@ -38,12 +38,17 @@
*/
public abstract class PackageLookupValue implements SkyValue {
+ @AutoCodec
public static final NoBuildFilePackageLookupValue NO_BUILD_FILE_VALUE =
- NoBuildFilePackageLookupValue.INSTANCE;
+ new NoBuildFilePackageLookupValue();
+
+ @AutoCodec
public static final DeletedPackageLookupValue DELETED_PACKAGE_VALUE =
- DeletedPackageLookupValue.INSTANCE;
+ new DeletedPackageLookupValue();
+
+ @AutoCodec
public static final NoRepositoryPackageLookupValue NO_SUCH_REPOSITORY_VALUE =
- NoRepositoryPackageLookupValue.INSTANCE;
+ new NoRepositoryPackageLookupValue();
enum ErrorReason {
/** There is no BUILD file. */
@@ -191,10 +196,7 @@
}
/** Marker value for no build file found. */
- @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
public static class NoBuildFilePackageLookupValue extends UnsuccessfulPackageLookupValue {
- static final NoBuildFilePackageLookupValue INSTANCE = new NoBuildFilePackageLookupValue();
-
private NoBuildFilePackageLookupValue() {
}
@@ -317,10 +319,7 @@
}
/** Marker value for a deleted package. */
- @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
public static class DeletedPackageLookupValue extends UnsuccessfulPackageLookupValue {
- static final DeletedPackageLookupValue INSTANCE = new DeletedPackageLookupValue();
-
private DeletedPackageLookupValue() {
}
@@ -339,10 +338,7 @@
* Marker value for repository we could not find. This can happen when looking for a label that
* specifies a non-existent repository.
*/
- @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
public static class NoRepositoryPackageLookupValue extends UnsuccessfulPackageLookupValue {
- static final NoRepositoryPackageLookupValue INSTANCE = new NoRepositoryPackageLookupValue();
-
private NoRepositoryPackageLookupValue() {}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java
index 02030e4..0bbff1c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java
@@ -16,7 +16,6 @@
import com.google.devtools.build.lib.actions.ActionLookupValue;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.WorkspaceStatusAction;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.skyframe.SkyFunctionName;
import com.google.devtools.build.skyframe.SkyKey;
@@ -53,11 +52,9 @@
}
/** {@link SkyKey} for {@link WorkspaceStatusValue}. */
- @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
public static class BuildInfoKey extends ActionLookupKey {
- @AutoCodec.VisibleForSerialization static final BuildInfoKey INSTANCE = new BuildInfoKey();
- public static final ObjectCodec<BuildInfoKey> CODEC =
- new WorkspaceStatusValue_BuildInfoKey_AutoCodec();
+ @AutoCodec @AutoCodec.VisibleForSerialization
+ static final BuildInfoKey INSTANCE = new BuildInfoKey();
private BuildInfoKey() {}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java
index 867dbca..e6a687d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java
@@ -70,12 +70,6 @@
* instance for deserialization.
*/
PUBLIC_FIELDS,
- /**
- * For use with classes that are singleton.
- *
- * <p>The serialized class must have a codec accessible, static INSTANCE field.
- */
- SINGLETON
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
index d7c2e8a..250e391 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
@@ -109,9 +109,6 @@
case PUBLIC_FIELDS:
codecClassBuilder = buildClassWithPublicFieldsStrategy(encodedType);
break;
- case SINGLETON:
- codecClassBuilder = buildClassWithSingletonStrategy(encodedType, env);
- break;
default:
throw new IllegalArgumentException("Unknown strategy: " + annotation.strategy());
}
@@ -142,6 +139,7 @@
return true;
}
+ @SuppressWarnings("MutableConstantField")
private static final Collection<Modifier> REQUIRED_SINGLETON_MODIFIERS =
ImmutableList.of(Modifier.STATIC, Modifier.FINAL);
@@ -532,20 +530,6 @@
return Optional.empty();
}
- private static TypeSpec.Builder buildClassWithSingletonStrategy(
- TypeElement encodedType, ProcessingEnvironment env) {
- TypeSpec.Builder codecClassBuilder =
- AutoCodecUtil.initializeCodecClassBuilder(encodedType, env);
- // Serialization is a no-op.
- codecClassBuilder.addMethod(
- AutoCodecUtil.initializeSerializeMethodBuilder(encodedType, env).build());
- MethodSpec.Builder deserializeMethodBuilder =
- AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType, env);
- deserializeMethodBuilder.addStatement("return $T.INSTANCE", TypeName.get(encodedType.asType()));
- codecClassBuilder.addMethod(deserializeMethodBuilder.build());
- return codecClassBuilder;
- }
-
/** True when {@code type} has the same type as {@code clazz}. */
private boolean matchesType(TypeMirror type, Class<?> clazz) {
return env.getTypeUtils()
diff --git a/src/main/java/com/google/devtools/build/skyframe/EmptySkyValue.java b/src/main/java/com/google/devtools/build/skyframe/EmptySkyValue.java
index bd31c4f..878dd67 100644
--- a/src/main/java/com/google/devtools/build/skyframe/EmptySkyValue.java
+++ b/src/main/java/com/google/devtools/build/skyframe/EmptySkyValue.java
@@ -21,9 +21,8 @@
* A SkyValue with no attached data. Preferable to a specialized empty value class to minimize
* bloat.
*/
-@AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
public final class EmptySkyValue implements SkyValue {
- public static final EmptySkyValue INSTANCE = new EmptySkyValue();
+ @AutoCodec public static final EmptySkyValue INSTANCE = new EmptySkyValue();
private EmptySkyValue() {}
diff --git a/src/main/java/com/google/devtools/build/skyframe/ErrorTransienceValue.java b/src/main/java/com/google/devtools/build/skyframe/ErrorTransienceValue.java
index 2d6de96..6d44fbe 100644
--- a/src/main/java/com/google/devtools/build/skyframe/ErrorTransienceValue.java
+++ b/src/main/java/com/google/devtools/build/skyframe/ErrorTransienceValue.java
@@ -21,11 +21,10 @@
* A value that represents "error transience", i.e. anything which may have caused an unexpected
* failure. Is not equal to anything, including itself, in order to force re-evaluation.
*/
-@AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
public final class ErrorTransienceValue implements SkyValue {
public static final SkyFunctionName FUNCTION_NAME = SkyFunctionName.create("ERROR_TRANSIENCE");
public static final SkyKey KEY = LegacySkyKey.create(FUNCTION_NAME, "ERROR_TRANSIENCE");
- public static final ErrorTransienceValue INSTANCE = new ErrorTransienceValue();
+ @AutoCodec public static final ErrorTransienceValue INSTANCE = new ErrorTransienceValue();
private ErrorTransienceValue() {}
diff --git a/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java b/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
index 04aa0d7..e3bd837 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
@@ -65,7 +65,6 @@
import com.google.devtools.build.lib.exec.SingleBuildFileCache;
import com.google.devtools.build.lib.packages.AspectDescriptor;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.util.ResourceUsage;
import com.google.devtools.build.lib.util.io.FileOutErr;
@@ -267,10 +266,8 @@
null,
null);
- @AutoCodec(strategy = Strategy.SINGLETON)
static class NullArtifactOwner implements ArtifactOwner {
- public static final ActionsTestUtil.NullArtifactOwner INSTANCE =
- new ActionsTestUtil.NullArtifactOwner();
+ private NullArtifactOwner() {}
@Override
public Label getLabel() {
@@ -278,7 +275,7 @@
}
}
- public static final ArtifactOwner NULL_ARTIFACT_OWNER = NullArtifactOwner.INSTANCE;
+ @AutoCodec public static final ArtifactOwner NULL_ARTIFACT_OWNER = new NullArtifactOwner();
/** An unchecked exception class for action conflicts. */
public static class UncheckedActionConflictException extends RuntimeException {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index 6fc7684..40c74d0 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -111,8 +111,10 @@
* The common code that's shared between various builder tests.
*/
public abstract class TimestampBuilderTestCase extends FoundationTestCase {
+ @AutoCodec
protected static final ActionLookupValue.ActionLookupKey ACTION_LOOKUP_KEY =
new SingletonActionLookupKey();
+
protected static final Predicate<Action> ALWAYS_EXECUTE_FILTER = Predicates.alwaysTrue();
protected static final String CYCLE_MSG = "Yarrrr, there be a cycle up in here";
@@ -501,10 +503,7 @@
}
}
- @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
static class SingletonActionLookupKey extends ActionLookupValue.ActionLookupKey {
- public static final SingletonActionLookupKey INSTANCE = new SingletonActionLookupKey();
-
@Override
public SkyFunctionName functionName() {
return SkyFunctions.CONFIGURED_TARGET;