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;