diff options
author | 2018-02-13 10:08:47 -0800 | |
---|---|---|
committer | 2018-02-13 10:10:14 -0800 | |
commit | fae34b9ee464186c628c313eebced9e89d8146f6 (patch) | |
tree | 55d6392acc16aa3c87ada027bf0d92c366c551cc /src | |
parent | a3339c8ca2e824757afe698f591770f4232af530 (diff) |
Replaces InjectingObjectCodec with dependencies threaded through (Des|S)erializationContext.
PiperOrigin-RevId: 185547740
Diffstat (limited to 'src')
53 files changed, 332 insertions, 745 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java index 4f6ac30365..a3da211376 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java @@ -31,7 +31,7 @@ import com.google.devtools.build.lib.analysis.actions.CommandLineItem; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.shell.ShellUtils; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.VisibleForSerialization; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; @@ -43,7 +43,6 @@ import com.google.devtools.build.lib.syntax.EvalUtils; import com.google.devtools.build.lib.syntax.EvalUtils.ComparisonException; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.util.FileTypeSet; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.ArrayList; @@ -114,7 +113,7 @@ import javax.annotation.Nullable; + "<a href='actions.html#declare_file'>ctx.actions.declare_file</a>, " + "or <a href='actions.html#declare_directory'>ctx.actions.declare_directory</a>." ) -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec public class Artifact implements FileType.HasFileType, ActionInput, @@ -122,8 +121,7 @@ public class Artifact Comparable<Object>, CommandLineItem { - public static final InjectingObjectCodec<Artifact, FileSystemProvider> CODEC = - new Artifact_AutoCodec(); + public static final ObjectCodec<Artifact> CODEC = new Artifact_AutoCodec(); /** Compares artifact according to their exec paths. Sorts null values first. */ @SuppressWarnings("ReferenceEquality") // "a == b" is an optimization @@ -451,10 +449,10 @@ public class Artifact */ @Immutable @VisibleForTesting - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec public static final class SpecialArtifact extends Artifact { - public static final InjectingObjectCodec<SpecialArtifact, FileSystemProvider> CODEC = + public static final ObjectCodec<SpecialArtifact> CODEC = new Artifact_SpecialArtifact_AutoCodec(); private final SpecialArtifactType type; @@ -512,9 +510,9 @@ public class Artifact * around the extra fields for the rest we save some memory. */ @Immutable - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec public static final class TreeFileArtifact extends Artifact { - public static final InjectingObjectCodec<TreeFileArtifact, FileSystemProvider> CODEC = + public static final ObjectCodec<TreeFileArtifact> CODEC = new Artifact_TreeFileArtifact_AutoCodec(); private final SpecialArtifact parentTreeArtifact; diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java index 1a84425e61..0e32c867f9 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java @@ -17,7 +17,7 @@ package com.google.devtools.build.lib.actions; import com.google.common.base.Preconditions; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.VisibleForSerialization; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; @@ -25,7 +25,6 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter; import com.google.devtools.build.lib.skylarkinterface.SkylarkValue; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; @@ -56,11 +55,10 @@ import java.util.Objects; + "together into a single directory tree to form the execution environment." ) @Immutable -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec public final class ArtifactRoot implements Comparable<ArtifactRoot>, Serializable, SkylarkValue { - public static final InjectingObjectCodec<ArtifactRoot, FileSystemProvider> CODEC = - new ArtifactRoot_AutoCodec(); + public static final ObjectCodec<ArtifactRoot> CODEC = new ArtifactRoot_AutoCodec(); // This must always be consistent with Package.getSourceRoot; otherwise computing source roots // from exec paths does not work, which can break the action cache for input-discovering actions. diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java index d121a3dfe9..7445761c9f 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java @@ -18,10 +18,9 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.hash.HashCode; import com.google.devtools.build.lib.actions.ArtifactRoot; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.util.StringCanonicalizer; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.Path; import java.util.Objects; @@ -44,11 +43,10 @@ import java.util.Objects; * * <p>Do not put shortcuts to specific files here! */ -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec @Immutable public final class BlazeDirectories { - public static final InjectingObjectCodec<BlazeDirectories, FileSystemProvider> CODEC = - new BlazeDirectories_AutoCodec(); + public static final ObjectCodec<BlazeDirectories> CODEC = new BlazeDirectories_AutoCodec(); // Include directory name, relative to execRoot/blaze-out/configuration. public static final String RELATIVE_INCLUDE_DIR = StringCanonicalizer.intern("include"); diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java index 6797cb21a2..0e34cf3067 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java @@ -19,9 +19,8 @@ import com.google.common.base.Strings; import com.google.common.hash.HashCode; import com.google.common.hash.Hashing; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.FileSystemProvider; import com.google.devtools.build.lib.vfs.Path; import java.util.Objects; import javax.annotation.Nullable; @@ -33,11 +32,10 @@ import javax.annotation.Nullable; * <p>The <code>installBase</code> is the directory where the Blaze binary has been installed. The * <code>outputBase</code> is the directory below which Blaze puts all its state. */ -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec @Immutable public final class ServerDirectories { - public static final InjectingObjectCodec<ServerDirectories, FileSystemProvider> CODEC = - new ServerDirectories_AutoCodec(); + public static final ObjectCodec<ServerDirectories> CODEC = new ServerDirectories_AutoCodec(); /** Where Blaze gets unpacked. */ private final Path installBase; diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java index abeec41caa..59c5badf37 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java @@ -54,7 +54,6 @@ import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.packages.RuleClassProvider; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; @@ -66,7 +65,6 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.OS; import com.google.devtools.build.lib.util.RegexFilter; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.common.options.Converter; @@ -122,8 +120,7 @@ import javax.annotation.Nullable; + "depend on it and not targets that it depends on." ) public class BuildConfiguration implements BuildConfigurationInterface { - public static final InjectingObjectCodec<BuildConfiguration, FileSystemProvider> CODEC = - new BuildConfigurationCodec(); + public static final ObjectCodec<BuildConfiguration> CODEC = new BuildConfigurationCodec(); /** * Sorts fragments by class name. This produces a stable order which, e.g., facilitates consistent @@ -142,10 +139,9 @@ public class BuildConfiguration implements BuildConfigurationInterface { * declare {@link ImmutableList} signatures on their interfaces vs. {@link List}). This is because * fragment instances may be shared across configurations. */ - @AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC, dependency = FileSystemProvider.class) + @AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC) public abstract static class Fragment { - public static final InjectingObjectCodec<Fragment, FileSystemProvider> CODEC = - new BuildConfiguration_Fragment_AutoCodec(); + public static final ObjectCodec<Fragment> CODEC = new BuildConfiguration_Fragment_AutoCodec(); /** * Validates the options for this Fragment. Issues warnings for the @@ -2182,8 +2178,7 @@ public class BuildConfiguration implements BuildConfigurationInterface { return GenericBuildEvent.protoChaining(this).setConfiguration(builder.build()).build(); } - private static class BuildConfigurationCodec - implements InjectingObjectCodec<BuildConfiguration, FileSystemProvider> { + private static class BuildConfigurationCodec implements ObjectCodec<BuildConfiguration> { @Override public Class<BuildConfiguration> getEncodedClass() { return BuildConfiguration.class; @@ -2191,31 +2186,28 @@ public class BuildConfiguration implements BuildConfigurationInterface { @Override public void serialize( - FileSystemProvider fsProvider, SerializationContext context, BuildConfiguration obj, CodedOutputStream codedOut) throws SerializationException, IOException { - BlazeDirectories.CODEC.serialize(fsProvider, context, obj.directories, codedOut); + BlazeDirectories.CODEC.serialize(context, obj.directories, codedOut); codedOut.writeInt32NoTag(obj.fragments.size()); for (Fragment fragment : obj.fragments.values()) { - Fragment.CODEC.serialize(fsProvider, context, fragment, codedOut); + Fragment.CODEC.serialize(context, fragment, codedOut); } BuildOptions.CODEC.serialize(context, obj.buildOptions, codedOut); StringCodecs.asciiOptimized().serialize(context, obj.repositoryName, codedOut); } @Override - public BuildConfiguration deserialize( - FileSystemProvider fsProvider, DeserializationContext context, CodedInputStream codedIn) + public BuildConfiguration deserialize(DeserializationContext context, CodedInputStream codedIn) throws SerializationException, IOException { - BlazeDirectories blazeDirectories = - BlazeDirectories.CODEC.deserialize(fsProvider, context, codedIn); + BlazeDirectories blazeDirectories = BlazeDirectories.CODEC.deserialize(context, codedIn); int length = codedIn.readInt32(); ImmutableSortedMap.Builder<Class<? extends Fragment>, Fragment> builder = new ImmutableSortedMap.Builder<>(lexicalFragmentSorter); for (int i = 0; i < length; ++i) { - Fragment fragment = Fragment.CODEC.deserialize(fsProvider, context, codedIn); + Fragment fragment = Fragment.CODEC.deserialize(context, codedIn); builder.put(fragment.getClass(), fragment); } BuildOptions options = BuildOptions.CODEC.deserialize(context, codedIn); diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java index 2067b641f0..e763fc9ece 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java @@ -18,6 +18,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ComparisonChain; import com.google.common.collect.Interner; import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter; import com.google.devtools.build.lib.skylarkinterface.SkylarkValue; import com.google.devtools.build.lib.vfs.Canonicalizer; @@ -37,6 +38,8 @@ import javax.annotation.concurrent.Immutable; public final class PackageIdentifier implements Comparable<PackageIdentifier>, Serializable, SkylarkValue { + public static final ObjectCodec<PackageIdentifier> CODEC = new PackageIdentifierCodec(); + private static final Interner<PackageIdentifier> INTERNER = BlazeInterners.newWeakInterner(); public static PackageIdentifier create(String repository, PathFragment pkgName) diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetCodec.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetCodec.java index 475e93b7ab..ec61883b2a 100644 --- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetCodec.java +++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetCodec.java @@ -18,8 +18,6 @@ import com.google.common.hash.Hashing; import com.google.common.hash.HashingOutputStream; import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; import com.google.devtools.build.lib.skyframe.serialization.EnumCodec; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; @@ -50,10 +48,6 @@ public class NestedSetCodec<T> implements ObjectCodec<NestedSet<T>> { this.objectCodec = objectCodec; } - public <D> NestedSetCodec(InjectingObjectCodec<T, D> injectingObjectCodec, D dependency) { - this.objectCodec = new InjectingObjectCodecAdapter<>(injectingObjectCodec, dependency); - } - @SuppressWarnings("unchecked") @Override public Class<NestedSet<T>> getEncodedClass() { 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 1d7ee3a792..648343c6da 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 @@ -35,7 +35,7 @@ import com.google.devtools.build.lib.events.ExtendedEventHandler.Postable; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.AttributeMap.AcceptsLabelAttribute; import com.google.devtools.build.lib.packages.License.DistributionType; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.build.lib.util.SpellChecker; @@ -68,8 +68,7 @@ import javax.annotation.Nullable; */ @SuppressWarnings("JavaLangClash") public class Package { - public static final InjectingObjectCodec<Package, PackageCodecDependencies> CODEC = - new PackageCodec(); + public static final ObjectCodec<Package> CODEC = new PackageCodec(); /** * Common superclass for all name-conflict exceptions. @@ -1575,8 +1574,7 @@ public class Package { } /** Package codec implementation. */ - private static final class PackageCodec - implements InjectingObjectCodec<Package, PackageCodecDependencies> { + private static final class PackageCodec implements ObjectCodec<Package> { @Override public Class<Package> getEncodedClass() { return Package.class; @@ -1584,20 +1582,20 @@ public class Package { @Override public void serialize( - PackageCodecDependencies codecDeps, com.google.devtools.build.lib.skyframe.serialization.SerializationContext context, Package input, CodedOutputStream codedOut) throws IOException, SerializationException { + PackageCodecDependencies codecDeps = context.getDependency(PackageCodecDependencies.class); codecDeps.getPackageSerializer().serialize(input, codedOut); } @Override public Package deserialize( - PackageCodecDependencies codecDeps, com.google.devtools.build.lib.skyframe.serialization.DeserializationContext context, CodedInputStream codedIn) throws SerializationException, IOException { + PackageCodecDependencies codecDeps = context.getDependency(PackageCodecDependencies.class); try { return codecDeps.getPackageDeserializer().deserialize(codedIn); } catch (PackageDeserializationException e) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java index 410fb41fbd..c89164a8c2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java @@ -38,13 +38,11 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; 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.util.Pair; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain.WithFeatureSet; @@ -1129,9 +1127,9 @@ public class CcToolchainFeatures implements Serializable { * instance could serve as a top level View used to expand all flag_groups. */ @Immutable - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec public static class Variables { - public static final InjectingObjectCodec<Variables, FileSystemProvider> CODEC = + public static final ObjectCodec<Variables> CODEC = new CcToolchainFeatures_Variables_AutoCodec(); /** An empty variables instance. */ @@ -1165,9 +1163,9 @@ public class CcToolchainFeatures implements Serializable { * <p>Implementations must be immutable and without any side-effects. They will be expanded and * queried multiple times. */ - @AutoCodec(strategy = Strategy.POLYMORPHIC, dependency = FileSystemProvider.class) + @AutoCodec(strategy = Strategy.POLYMORPHIC) interface VariableValue { - public static final InjectingObjectCodec<VariableValue, FileSystemProvider> CODEC = + public static final ObjectCodec<VariableValue> CODEC = new CcToolchainFeatures_Variables_VariableValue_AutoCodec(); /** @@ -1381,9 +1379,9 @@ public class CcToolchainFeatures implements Serializable { * significantly reduces memory overhead. */ @Immutable - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec public static class LibraryToLinkValue extends VariableValueAdapter { - public static final InjectingObjectCodec<LibraryToLinkValue, FileSystemProvider> CODEC = + public static final ObjectCodec<LibraryToLinkValue> CODEC = new CcToolchainFeatures_Variables_LibraryToLinkValue_AutoCodec(); public static final String OBJECT_FILES_FIELD_NAME = "object_files"; @@ -1514,10 +1512,10 @@ public class CcToolchainFeatures implements Serializable { /** Sequence of arbitrary VariableValue objects. */ @Immutable - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec @VisibleForSerialization static final class Sequence extends VariableValueAdapter { - public static final InjectingObjectCodec<Sequence, FileSystemProvider> CODEC = + public static final ObjectCodec<Sequence> CODEC = new CcToolchainFeatures_Variables_Sequence_AutoCodec(); private static final String SEQUENCE_VARIABLE_TYPE_NAME = "sequence"; @@ -1550,10 +1548,10 @@ public class CcToolchainFeatures implements Serializable { * significantly reduces memory overhead. */ @Immutable - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec @VisibleForSerialization static final class StructureSequence extends VariableValueAdapter { - public static final InjectingObjectCodec<StructureSequence, FileSystemProvider> CODEC = + public static final ObjectCodec<StructureSequence> CODEC = new CcToolchainFeatures_Variables_StructureSequence_AutoCodec(); private final ImmutableList<ImmutableMap<String, VariableValue>> values; @@ -1627,10 +1625,10 @@ public class CcToolchainFeatures implements Serializable { * memory overhead is prohibitively big. Use optimized {@link StructureSequence} instead. */ @Immutable - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec @VisibleForSerialization static final class StructureValue extends VariableValueAdapter { - public static final InjectingObjectCodec<StructureValue, FileSystemProvider> CODEC = + public static final ObjectCodec<StructureValue> CODEC = new CcToolchainFeatures_Variables_StructureValue_AutoCodec(); private static final String STRUCTURE_VARIABLE_TYPE_NAME = "structure"; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java index 7eef57f135..a3d55e2f22 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java @@ -21,11 +21,10 @@ import com.google.devtools.build.lib.rules.cpp.CcCommon.CoptsFilter; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables; import com.google.devtools.build.lib.rules.cpp.CppCompileAction.DotdFile; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.VisibleForSerialization; import com.google.devtools.build.lib.util.Pair; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.ArrayList; import java.util.List; @@ -33,10 +32,9 @@ import java.util.Map; import javax.annotation.Nullable; /** The compile command line for the C++ compile action. */ -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec public final class CompileCommandLine { - public static final InjectingObjectCodec<CompileCommandLine, FileSystemProvider> CODEC = - new CompileCommandLine_AutoCodec(); + public static final ObjectCodec<CompileCommandLine> CODEC = new CompileCommandLine_AutoCodec(); private final Artifact sourceFile; private final CoptsFilter coptsFilter; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java index ea12fadece..9ef128c3f2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java @@ -29,11 +29,9 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.cpp.CppHelper.PregreppedHeader; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; 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.VisibleForSerialization; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.ArrayList; import java.util.Collection; @@ -47,9 +45,9 @@ import javax.annotation.Nullable; * Immutable store of information needed for C++ compilation that is aggregated across dependencies. */ @Immutable -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec public final class CppCompilationContext implements TransitiveInfoProvider { - public static final InjectingObjectCodec<CppCompilationContext, FileSystemProvider> CODEC = + public static final ObjectCodec<CppCompilationContext> CODEC = new CppCompilationContext_AutoCodec(); /** An empty compilation context. */ @@ -782,9 +780,9 @@ public final class CppCompilationContext implements TransitiveInfoProvider { * either gather data on PIC or on no-PIC .pcm files. */ @Immutable - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec public static final class ModuleInfo { - public static final InjectingObjectCodec<ModuleInfo, FileSystemProvider> CODEC = + public static final ObjectCodec<ModuleInfo> CODEC = new CppCompilationContext_ModuleInfo_AutoCodec(); /** @@ -918,9 +916,9 @@ public final class CppCompilationContext implements TransitiveInfoProvider { /** Collects data for a specific module in a special format that makes pruning easy. */ @Immutable - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec public static final class TransitiveModuleHeaders { - public static final InjectingObjectCodec<TransitiveModuleHeaders, FileSystemProvider> CODEC = + public static final ObjectCodec<TransitiveModuleHeaders> CODEC = new CppCompilationContext_TransitiveModuleHeaders_AutoCodec(); /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java index 8b26bad06b..79df9f4582 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java @@ -58,13 +58,12 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfig import com.google.devtools.build.lib.rules.cpp.CppCompileActionContext.Reply; import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool; import com.google.devtools.build.lib.rules.cpp.CppHelper.PregreppedHeader; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.VisibleForSerialization; import com.google.devtools.build.lib.util.DependencySet; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.ShellEscaper; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -1337,15 +1336,15 @@ public class CppCompileAction extends AbstractAction /** * A reference to a .d file. There are two modes: + * * <ol> * <li>an Artifact that represents a real on-disk file * <li>just an execPath that refers to a virtual .d file that is not written to disk * </ol> */ - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec public static class DotdFile { - public static final InjectingObjectCodec<DotdFile, FileSystemProvider> CODEC = - new CppCompileAction_DotdFile_AutoCodec(); + public static final ObjectCodec<DotdFile> CODEC = new CppCompileAction_DotdFile_AutoCodec(); private final Artifact artifact; private final PathFragment execPath; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java index 36624d85a7..2049d04166 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java @@ -43,12 +43,11 @@ import com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader.CppConfigu import com.google.devtools.build.lib.rules.cpp.CrosstoolConfigurationLoader.CrosstoolFile; import com.google.devtools.build.lib.rules.cpp.transitions.ContextCollectorOwnerTransition; import com.google.devtools.build.lib.rules.cpp.transitions.DisableLipoTransition; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig; @@ -62,7 +61,7 @@ import javax.annotation.Nullable; * architecture, target architecture, compiler version, and a standard library version. It has * information about the tools locations and the flags required for compiling. */ -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec @SkylarkModule( name = "cpp", doc = "A configuration fragment for C++.", @@ -70,8 +69,7 @@ import javax.annotation.Nullable; ) @Immutable public final class CppConfiguration extends BuildConfiguration.Fragment { - public static final InjectingObjectCodec<CppConfiguration, FileSystemProvider> CODEC = - new CppConfiguration_AutoCodec(); + public static final ObjectCodec<CppConfiguration> CODEC = new CppConfiguration_AutoCodec(); /** * String indicating a Mac system, for example when used in a crosstool configuration's host or diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java index 1888c81000..126fda003d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java @@ -65,12 +65,11 @@ import com.google.devtools.build.lib.rules.cpp.CppCompilationContext.Builder; import com.google.devtools.build.lib.rules.cpp.CppConfiguration.DynamicMode; import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; import com.google.devtools.build.lib.shell.ShellUtils; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.syntax.Type; import com.google.devtools.build.lib.util.FileTypeSet; import com.google.devtools.build.lib.util.Pair; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.LipoMode; import java.util.ArrayList; @@ -575,10 +574,10 @@ public class CppHelper { * A header that has been grepped for #include statements. Includes the original header as well as * a stripped version of that header that contains only #include statements. */ - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec @AutoValue abstract static class PregreppedHeader { - public static final InjectingObjectCodec<PregreppedHeader, FileSystemProvider> CODEC = + public static final ObjectCodec<PregreppedHeader> CODEC = new CppHelper_PregreppedHeader_AutoCodec(); @AutoCodec.Instantiator diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModuleMap.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModuleMap.java index 8428d2c419..1e158882ac 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModuleMap.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModuleMap.java @@ -16,17 +16,15 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.common.base.Optional; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.VisibleForSerialization; -import com.google.devtools.build.lib.vfs.FileSystemProvider; /** Structure for C++ module maps. Stores the name of the module and a .cppmap artifact. */ @Immutable -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec public final class CppModuleMap { - public static final InjectingObjectCodec<CppModuleMap, FileSystemProvider> CODEC = - new CppModuleMap_AutoCodec(); + public static final ObjectCodec<CppModuleMap> CODEC = new CppModuleMap_AutoCodec(); // NOTE: If you add a field here, you'll likely need to update CppModuleMapAction.computeKey(). private final Artifact artifact; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java index 808db7be7d..8039c7b87f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java @@ -20,11 +20,10 @@ import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.collect.CollectionUtils; import com.google.devtools.build.lib.concurrent.ThreadSafety; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.vfs.FileSystemProvider; /** * Factory for creating new {@link LinkerInput} objects. @@ -145,9 +144,9 @@ public abstract class LinkerInputs { * A library the user can link to. This is different from a simple linker input in that it also * has a library identifier. */ - @AutoCodec(strategy = Strategy.POLYMORPHIC, dependency = FileSystemProvider.class) + @AutoCodec(strategy = Strategy.POLYMORPHIC) public interface LibraryToLink extends LinkerInput { - public static final InjectingObjectCodec<LibraryToLink, FileSystemProvider> CODEC = + public static final ObjectCodec<LibraryToLink> CODEC = new LinkerInputs_LibraryToLink_AutoCodec(); ImmutableMap<Artifact, Artifact> getLtoBitcodeFiles(); @@ -174,9 +173,9 @@ public abstract class LinkerInputs { * library that it links to. */ @ThreadSafety.Immutable - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec public static class SolibLibraryToLink implements LibraryToLink { - public static final InjectingObjectCodec<SolibLibraryToLink, FileSystemProvider> CODEC = + public static final ObjectCodec<SolibLibraryToLink> CODEC = new LinkerInputs_SolibLibraryToLink_AutoCodec(); private final Artifact solibSymlinkArtifact; @@ -276,10 +275,10 @@ public abstract class LinkerInputs { /** This class represents a library that may contain object files. */ @ThreadSafety.Immutable - @AutoCodec(dependency = FileSystemProvider.class) + @AutoCodec @VisibleForSerialization static class CompoundLibraryToLink implements LibraryToLink { - public static final InjectingObjectCodec<CompoundLibraryToLink, FileSystemProvider> CODEC = + public static final ObjectCodec<CompoundLibraryToLink> CODEC = new LinkerInputs_CompoundLibraryToLink_AutoCodec(); private final Artifact libraryArtifact; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java index 6ab5488005..883ca4d38b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java @@ -22,10 +22,9 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables; import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.VisibleForSerialization; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.ArrayList; @@ -53,10 +52,9 @@ import java.util.Map; * <li>4. Backend link (once). This is the traditional link, and produces the final executable. * </ul> */ -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec public final class LtoBackendArtifacts { - public static final InjectingObjectCodec<LtoBackendArtifacts, FileSystemProvider> CODEC = - new LtoBackendArtifacts_AutoCodec(); + public static final ObjectCodec<LtoBackendArtifacts> CODEC = new LtoBackendArtifacts_AutoCodec(); // A file containing mapping of symbol => bitcode file containing the symbol. private final Artifact index; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactSkyKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactSkyKey.java index 4370089799..dd3aa91fea 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactSkyKey.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactSkyKey.java @@ -21,9 +21,8 @@ import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.FileSystemProvider; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import java.util.Collection; @@ -54,11 +53,10 @@ import java.util.Collection; * check the owner, but only within these keys, since outside of Skyframe it is quite crucial that * Artifacts with different owners be able to compare equal. */ -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec public class ArtifactSkyKey implements SkyKey { private static final Interner<ArtifactSkyKey> INTERNER = BlazeInterners.newWeakInterner(); - public static final InjectingObjectCodec<ArtifactSkyKey, FileSystemProvider> CODEC = - new ArtifactSkyKey_AutoCodec(); + public static final ObjectCodec<ArtifactSkyKey> CODEC = new ArtifactSkyKey_AutoCodec(); private static final Function<Artifact, SkyKey> TO_MANDATORY_KEY = artifact -> key(artifact, true); private static final Function<ArtifactSkyKey, Artifact> TO_ARTIFACT = ArtifactSkyKey::getArtifact; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java index 76e8cbb4ea..b2e7ee3286 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java @@ -22,14 +22,12 @@ import com.google.devtools.build.lib.analysis.config.FragmentClassSet; import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -43,10 +41,10 @@ import java.util.Set; /** A Skyframe value representing a {@link BuildConfiguration}. */ // TODO(bazel-team): mark this immutable when BuildConfiguration is immutable. // @Immutable -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec @ThreadSafe public class BuildConfigurationValue implements SkyValue { - public static final InjectingObjectCodec<BuildConfigurationValue, FileSystemProvider> CODEC = + public static final ObjectCodec<BuildConfigurationValue> CODEC = new BuildConfigurationValue_AutoCodec(); private static final Interner<Key> keyInterner = BlazeInterners.newWeakInterner(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java index c81f29c55d..19d5ba3152 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java @@ -24,14 +24,12 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.packages.RuleClassProvider; import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs; import com.google.devtools.build.lib.util.Fingerprint; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -44,9 +42,9 @@ import javax.annotation.Nullable; /** A Skyframe node representing a build configuration fragment. */ @Immutable @ThreadSafe -@AutoCodec(dependency = FileSystemProvider.class) +@AutoCodec public class ConfigurationFragmentValue implements SkyValue { - public static final InjectingObjectCodec<ConfigurationFragmentValue, FileSystemProvider> CODEC = + public static final ObjectCodec<ConfigurationFragmentValue> CODEC = new ConfigurationFragmentValue_AutoCodec(); @Nullable diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GlobDescriptor.java b/src/main/java/com/google/devtools/build/lib/skyframe/GlobDescriptor.java index 01db160289..4b20998b0e 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/GlobDescriptor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/GlobDescriptor.java @@ -16,39 +16,30 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.PackageIdentifier; -import com.google.devtools.build.lib.cmdline.PackageIdentifierCodec; import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; -import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; -import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; -import com.google.devtools.build.lib.skyframe.serialization.SerializationException; -import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.util.StringCanonicalizer; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; -import com.google.protobuf.CodedInputStream; -import com.google.protobuf.CodedOutputStream; -import java.io.IOException; /** * A descriptor for a glob request, used as the {@link SkyKey} for {@link GlobFunction}. * - * <p>{@code subdir} must be empty or point to an existing directory.</p> + * <p>{@code subdir} must be empty or point to an existing directory. * * <p>{@code pattern} must be valid, as indicated by {@code UnixGlob#checkPatternForError}. */ +@AutoCodec @ThreadSafe public final class GlobDescriptor implements SkyKey { private static final Interner<GlobDescriptor> interner = BlazeInterners.newWeakInterner(); - /** Creates and returns a new {@link ObjectCodec} for {@link GlobDescriptor}s. */ - public static ObjectCodec<GlobDescriptor> getCodec(ObjectCodec<Root> rootCodec) { - return new GlobDescriptorCodec(rootCodec); - } + public static final ObjectCodec<GlobDescriptor> CODEC = new GlobDescriptor_AutoCodec(); /** * Returns interned instance based on the parameters. @@ -60,6 +51,7 @@ public final class GlobDescriptor implements SkyKey { * @param pattern a valid glob pattern * @param excludeDirs true if directories should be excluded from results */ + @AutoCodec.Instantiator public static GlobDescriptor create( PackageIdentifier packageId, Root packageRoot, @@ -166,43 +158,4 @@ public final class GlobDescriptor implements SkyKey { public SkyFunctionName functionName() { return SkyFunctions.GLOB; } - - private static class GlobDescriptorCodec implements ObjectCodec<GlobDescriptor> { - - private final PackageIdentifierCodec packageIdCodec = new PackageIdentifierCodec(); - private final ObjectCodec<Root> rootCodec; - private final ObjectCodec<String> stringCodec = StringCodecs.asciiOptimized(); - - private GlobDescriptorCodec(ObjectCodec<Root> rootCodec) { - this.rootCodec = rootCodec; - } - - @Override - public Class<GlobDescriptor> getEncodedClass() { - return GlobDescriptor.class; - } - - @Override - public void serialize( - SerializationContext context, GlobDescriptor globDesc, CodedOutputStream codedOut) - throws IOException, SerializationException { - packageIdCodec.serialize(context, globDesc.getPackageId(), codedOut); - rootCodec.serialize(context, globDesc.getPackageRoot(), codedOut); - PathFragment.CODEC.serialize(context, globDesc.getSubdir(), codedOut); - stringCodec.serialize(context, globDesc.getPattern(), codedOut); - codedOut.writeBoolNoTag(globDesc.excludeDirs()); - } - - @Override - public GlobDescriptor deserialize(DeserializationContext context, CodedInputStream codedIn) - throws SerializationException, IOException { - PackageIdentifier packageId = packageIdCodec.deserialize(context, codedIn); - Root packageRoot = rootCodec.deserialize(context, codedIn); - PathFragment pathFragment = PathFragment.CODEC.deserialize(context, codedIn); - String pattern = stringCodec.deserialize(context, codedIn); - boolean excludeDirs = codedIn.readBool(); - return GlobDescriptor.create(packageId, packageRoot, pathFragment, pattern, excludeDirs); - } - } - -}
\ No newline at end of file +} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java index f31bf09cb2..96304a1080 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java @@ -19,8 +19,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; import com.google.devtools.build.lib.packages.Package; -import com.google.devtools.build.lib.packages.PackageCodecDependencies; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +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.LegacySkyKey; import com.google.devtools.build.skyframe.NotComparableSkyValue; @@ -29,12 +28,11 @@ import java.util.ArrayList; import java.util.List; /** A Skyframe value representing a package. */ -@AutoCodec(dependency = PackageCodecDependencies.class) +@AutoCodec @Immutable @ThreadSafe public class PackageValue implements NotComparableSkyValue { - public static final InjectingObjectCodec<PackageValue, PackageCodecDependencies> CODEC = - new PackageValue_AutoCodec(); + public static final ObjectCodec<PackageValue> CODEC = new PackageValue_AutoCodec(); private final Package pkg; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java index 8b7d4354ea..e1026b26ca 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java @@ -14,21 +14,33 @@ package com.google.devtools.build.lib.skyframe.serialization; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; + /** Stateful class for providing additional context to a single deserialization "session". */ // TODO(bazel-team): This class is just a shell, fill in. public class DeserializationContext { - // TODO(bazel-team): Replace with real stateless implementation when we start adding - // functionality. - private static final DeserializationContext EMPTY_STATELESS = new DeserializationContext(); - public static DeserializationContext create() { - return new DeserializationContext(); - } + /** + * This is a stub for context where it is less straightforward to thread from the top-level + * invocation. + * + * <p>This is a bug waiting to happen because it is very easy to accidentally modify a codec to + * use this context which won't contain any of the expected state. + */ + // TODO(bazel-team): delete this and all references to it. + public static final DeserializationContext UNTHREADED_PLEASE_FIX = + new DeserializationContext(ImmutableMap.of()); - /** Returns an empty instance which doesn't retain any state. */ - public static DeserializationContext stateless() { - return EMPTY_STATELESS; + private final ImmutableMap<Class<?>, Object> dependencies; + + public DeserializationContext(ImmutableMap<Class<?>, Object> dependencies) { + this.dependencies = dependencies; } - private DeserializationContext() {} + @SuppressWarnings("unchecked") + public <T> T getDependency(Class<T> type) { + Preconditions.checkNotNull(type); + return (T) dependencies.get(type); + } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodec.java deleted file mode 100644 index abd9d4dcbf..0000000000 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodec.java +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2017 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.devtools.build.lib.skyframe.serialization; - -import com.google.protobuf.CodedInputStream; -import com.google.protobuf.CodedOutputStream; -import java.io.IOException; - -/** Like ObjectCodec, but allows user-specified injected dependencies. */ -public interface InjectingObjectCodec<T, D> extends BaseCodec<T> { - - /** - * Serializes {@code obj}, inverse of {@link #deserialize(CodedInputStream)}. - * - * @param dependency the injected dependency - * @param obj the object to serialize - * @param codedOut the {@link CodedOutputStream} to write this object into. Implementations need - * not call {@link CodedOutputStream#flush()}, this should be handled by the caller. - * @throws SerializationException on failure to serialize - * @throws IOException on {@link IOException} during serialization - */ - void serialize(D dependency, SerializationContext context, T obj, CodedOutputStream codedOut) - throws SerializationException, IOException; - - /** - * Deserializes from {@code codedIn}, inverse of {@link #serialize(Object, CodedOutputStream)}. - * - * @param dependency the injected dependency - * @param codedIn the {@link CodedInputStream} to read the serialized object from - * @return the object deserialized from {@code codedIn} - * @throws SerializationException on failure to deserialize - * @throws IOException on {@link IOException} during deserialization - */ - T deserialize(D dependency, DeserializationContext context, CodedInputStream codedIn) - throws SerializationException, IOException; -} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodecAdapter.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodecAdapter.java deleted file mode 100644 index ae44f245a9..0000000000 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodecAdapter.java +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2017 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.devtools.build.lib.skyframe.serialization; - -import com.google.protobuf.CodedInputStream; -import com.google.protobuf.CodedOutputStream; -import java.io.IOException; - -/** Adapts an InjectingObjectCodec to an ObjectCodec. */ -public class InjectingObjectCodecAdapter<T, D> implements ObjectCodec<T> { - - private final InjectingObjectCodec<T, D> codec; - private final D dependency; - - /** - * Creates an ObjectCodec from an InjectingObjectCodec. - * - * @param codec underlying codec to delegate to - * @param dependency object forwarded to {@code codec.deserialize} - */ - public InjectingObjectCodecAdapter(InjectingObjectCodec<T, D> codec, D dependency) { - this.codec = codec; - this.dependency = dependency; - } - - @Override - public Class<T> getEncodedClass() { - return codec.getEncodedClass(); - } - - @Override - public void serialize(SerializationContext context, T obj, CodedOutputStream codedOut) - throws SerializationException, IOException { - codec.serialize(dependency, context, obj, codedOut); - } - - @Override - public T deserialize(DeserializationContext context, CodedInputStream codedIn) - throws SerializationException, IOException { - return codec.deserialize(dependency, context, codedIn); - } -} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecs.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecs.java index 8eca0b578a..99a02ae8ed 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecs.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecs.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.skyframe.serialization; +import com.google.common.collect.ImmutableMap; import com.google.protobuf.ByteString; import com.google.protobuf.CodedInputStream; import com.google.protobuf.CodedOutputStream; @@ -26,13 +27,19 @@ import java.io.IOException; public class ObjectCodecs { private final ObjectCodecRegistry codecRegistry; + // TODO(shahan): when per-invocation state is needed, for example, memoization, these may + // need to be constructed each time. + private final SerializationContext serializationContext; + private final DeserializationContext deserializationContext; /** - * Creates an instance using the supplied {@link ObjectCodecRegistry} for looking up - * {@link ObjectCodec}s. + * Creates an instance using the supplied {@link ObjectCodecRegistry} for looking up {@link + * ObjectCodec}s. */ - ObjectCodecs(ObjectCodecRegistry codecRegistry) { + ObjectCodecs(ObjectCodecRegistry codecRegistry, ImmutableMap<Class<?>, Object> dependencies) { this.codecRegistry = codecRegistry; + serializationContext = new SerializationContext(dependencies); + deserializationContext = new DeserializationContext(dependencies); } /** @@ -94,7 +101,7 @@ public class ObjectCodecs { // in some situations, bypassing a copy. codedIn.enableAliasing(true); try { - Object result = codec.deserialize(DeserializationContext.create(), codedIn); + Object result = codec.deserialize(deserializationContext, codedIn); if (result == null) { throw new NullPointerException( "ObjectCodec " + codec + " for " + classifier.toStringUtf8() + " returned null"); @@ -106,12 +113,11 @@ public class ObjectCodecs { } } - private static <T> void doSerialize( + private <T> void doSerialize( String classifier, ObjectCodec<T> codec, Object subject, CodedOutputStream codedOut) throws SerializationException, IOException { try { - codec.serialize( - SerializationContext.create(), codec.getEncodedClass().cast(subject), codedOut); + codec.serialize(serializationContext, codec.getEncodedClass().cast(subject), codedOut); } catch (ClassCastException e) { throw new SerializationException( "Codec " diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java index a92c1c53dd..b199ca6ce1 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java @@ -51,13 +51,6 @@ public class PolymorphicHelper { StringCodecs.asciiOptimized().serialize(context, clazz.getName(), codedOut); if (codec instanceof ObjectCodec) { ((ObjectCodec) codec).serialize(context, input, codedOut); - } else if (codec instanceof InjectingObjectCodec) { - if (dependency == null) { - throw new SerializationException( - clazz.getCanonicalName() + " serialize parent class lacks required dependency."); - } - ((InjectingObjectCodec) codec) - .serialize(dependency.orElse(null), context, input, codedOut); } else { throw new SerializationException( clazz.getCanonicalName() @@ -90,13 +83,6 @@ public class PolymorphicHelper { Object codec = getCodec(Class.forName(className)); if (codec instanceof ObjectCodec) { return ((ObjectCodec) codec).deserialize(context, codedIn); - } else if (codec instanceof InjectingObjectCodec) { - if (dependency == null) { - throw new SerializationException( - className + " deserialize parent class lacks required dependency."); - } - return ((InjectingObjectCodec) codec) - .deserialize(dependency.orElse(null), context, codedIn); } else { throw new SerializationException( className + ".CODEC has unexpected type " + codec.getClass().getCanonicalName()); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationContext.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationContext.java index 234d049e04..c04e12dbf4 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationContext.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationContext.java @@ -14,21 +14,33 @@ package com.google.devtools.build.lib.skyframe.serialization; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; + /** Stateful class for providing additional context to a single serialization "session". */ // TODO(bazel-team): This class is just a shell, fill in. public class SerializationContext { - // TODO(bazel-team): Replace with real stateless implementation when we start adding - // functionality. - private static final SerializationContext EMPTY_STATELESS = new SerializationContext(); - public static SerializationContext create() { - return stateless(); - } + /** + * This is a stub for context where it is less straightforward to thread from the top-level + * invocation. + * + * <p>This is a bug waiting to happen because it is very easy to accidentally modify a codec to + * use this context which won't contain any of the expected state. + */ + // TODO(bazel-team): delete this and all references to it. + public static final SerializationContext UNTHREADED_PLEASE_FIX = + new SerializationContext(ImmutableMap.of()); - /** Returns an empty instance which doesn't retain any state. */ - public static SerializationContext stateless() { - return EMPTY_STATELESS; + private final ImmutableMap<Class<?>, Object> dependencies; + + public SerializationContext(ImmutableMap<Class<?>, Object> dependencies) { + this.dependencies = dependencies; } - private SerializationContext() {} + @SuppressWarnings("unchecked") + public <T> T getDependency(Class<T> type) { + Preconditions.checkNotNull(type); + return (T) dependencies.get(type); + } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializerAdapter.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializerAdapter.java index a6243cf771..5eaed4e4ef 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializerAdapter.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializerAdapter.java @@ -38,7 +38,7 @@ public class SerializerAdapter<T> extends Serializer<T> { ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(); CodedOutputStream codedOut = CodedOutputStream.newInstance(byteOutput); // TODO(shahan): Determine if there's any context we can/should pass along from kryo. - codec.serialize(SerializationContext.create(), object, codedOut); + codec.serialize(SerializationContext.UNTHREADED_PLEASE_FIX, object, codedOut); codedOut.flush(); byte[] byteData = byteOutput.toByteArray(); output.writeInt(byteData.length, true); @@ -54,7 +54,7 @@ public class SerializerAdapter<T> extends Serializer<T> { byte[] byteData = input.readBytes(input.readInt(true)); // TODO(shahan): Determine if there's any context we can/should pass along from kryo. return codec.deserialize( - DeserializationContext.create(), CodedInputStream.newInstance(byteData)); + DeserializationContext.UNTHREADED_PLEASE_FIX, CodedInputStream.newInstance(byteData)); } catch (SerializationException | IOException e) { throw new KryoException(e); } 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 be6a2bb47b..b627952a2f 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 @@ -73,8 +73,6 @@ public @interface AutoCodec { * <p>Commonly used with the POLYMORPHIC strategy. * * <p>The serialized class must have a codec accessible, static INSTANCE field. - * - * <p>Illegal to use with a non-Void dependency. */ SINGLETON } @@ -88,37 +86,7 @@ public @interface AutoCodec { @Target({ElementType.CONSTRUCTOR, ElementType.METHOD}) @interface Instantiator {} - /** - * Marks a specific constructor parameter as a dependency. - * - * <p>When a constructor selected for the {@code INSTANTIATOR} strategy has one of its parameters - * tagged {@code @Dependency}, {@code @AutoCodec} generates an {@link - * com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec} instead of the usual - * {@link com.google.devtools.build.lib.skyframe.serialization.ObjectCodec} with the dependency - * type parameter matching the tagged parameter type. - * - * <p>At deserialization, the {@code @Dependency} tagged parameter will be forwarded from the - * {@code dependency} parameter of {@link - * com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec#deserialize}. - * - * <p>A compiler error will result if more than one constructor parameter has the - * {@code @Dependency} annotation or if the annotation itself has a dependency element. - */ - @Target(ElementType.PARAMETER) - @interface Dependency {} - Strategy strategy() default Strategy.INSTANTIATOR; - /** - * Specifies a deserialization dependency. - * - * <p>When non-{@link Void}, generates an {@link - * com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec} instead of the usual - * {@link com.google.devtools.build.lib.skyframe.serialization.ObjectCodec} with the dependency - * type parameter matching the returned type. - * - * <p>It is an error to use this in conjunction with {@code @AutoCodec.Dependency}. - */ - Class<?> dependency() default Void.class; /** * Signals that the annotated element is only visible for use by serialization. It should not be 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 2fc409637b..fc9547daca 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 @@ -31,12 +31,10 @@ import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; import java.io.IOException; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.Nullable; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.Processor; @@ -48,8 +46,6 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.MirroredTypeException; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.ElementFilter; @@ -98,20 +94,19 @@ public class AutoCodecProcessor extends AbstractProcessor { for (Element element : roundEnv.getElementsAnnotatedWith(AutoCodecUtil.ANNOTATION)) { AutoCodec annotation = element.getAnnotation(AutoCodecUtil.ANNOTATION); TypeElement encodedType = (TypeElement) element; - @Nullable TypeElement dependencyType = getDependencyType(annotation); TypeSpec.Builder codecClassBuilder = null; switch (annotation.strategy()) { case INSTANTIATOR: - codecClassBuilder = buildClassWithInstantiatorStrategy(encodedType, dependencyType); + codecClassBuilder = buildClassWithInstantiatorStrategy(encodedType); break; case PUBLIC_FIELDS: - codecClassBuilder = buildClassWithPublicFieldsStrategy(encodedType, dependencyType); + codecClassBuilder = buildClassWithPublicFieldsStrategy(encodedType); break; case POLYMORPHIC: - codecClassBuilder = buildClassWithPolymorphicStrategy(encodedType, dependencyType); + codecClassBuilder = buildClassWithPolymorphicStrategy(encodedType); break; case SINGLETON: - codecClassBuilder = buildClassWithSingletonStrategy(encodedType, dependencyType); + codecClassBuilder = buildClassWithSingletonStrategy(encodedType); break; default: throw new IllegalArgumentException("Unknown strategy: " + annotation.strategy()); @@ -137,86 +132,29 @@ public class AutoCodecProcessor extends AbstractProcessor { return true; } - /** Returns the type of the annotation dependency or null if the type is {@link Void}. */ - @Nullable - private TypeElement getDependencyType(AutoCodec annotation) { - try { - annotation.dependency(); - throw new AssertionError("Expected MirroredTypeException!"); - } catch (MirroredTypeException e) { - DeclaredType dependencyMirror = (DeclaredType) e.getTypeMirror(); - if (matchesType(dependencyMirror, Void.class)) { - return null; - } - return (TypeElement) dependencyMirror.asElement(); - } - } - - private TypeSpec.Builder buildClassWithInstantiatorStrategy( - TypeElement encodedType, @Nullable TypeElement dependency) { + private TypeSpec.Builder buildClassWithInstantiatorStrategy(TypeElement encodedType) { ExecutableElement constructor = selectInstantiator(encodedType); - PartitionedParameters parameters = isolateDependency(constructor); - if (dependency != null) { - if (parameters.dependency != null) { - throw new IllegalArgumentException( - encodedType.getQualifiedName() - + " has both a @Dependency annotated constructor parameter " - + "and a non-Void dependency element " - + dependency.getQualifiedName()); - } - parameters.dependency = dependency; - } + List<? extends VariableElement> fields = constructor.getParameters(); - TypeSpec.Builder codecClassBuilder = - AutoCodecUtil.initializeCodecClassBuilder(encodedType, parameters.dependency); + TypeSpec.Builder codecClassBuilder = AutoCodecUtil.initializeCodecClassBuilder(encodedType); if (encodedType.getAnnotation(AutoValue.class) == null) { - initializeUnsafeOffsets(codecClassBuilder, encodedType, parameters.fields); - codecClassBuilder.addMethod(buildSerializeMethodWithInstantiator(encodedType, parameters)); + initializeUnsafeOffsets(codecClassBuilder, encodedType, fields); + codecClassBuilder.addMethod(buildSerializeMethodWithInstantiator(encodedType, fields)); } else { codecClassBuilder.addMethod( - buildSerializeMethodWithInstantiatorForAutoValue(encodedType, parameters)); + buildSerializeMethodWithInstantiatorForAutoValue(encodedType, fields)); } MethodSpec.Builder deserializeBuilder = - AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType, parameters.dependency); - buildDeserializeBody(deserializeBuilder, parameters.fields); + AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType); + buildDeserializeBody(deserializeBuilder, fields); addReturnNew(deserializeBuilder, encodedType, constructor); codecClassBuilder.addMethod(deserializeBuilder.build()); return codecClassBuilder; } - private static class PartitionedParameters { - /** Non-dependency parameters. */ - List<VariableElement> fields; - /** Dependency for this codec or null if no such dependency exists. */ - @Nullable TypeElement dependency; - } - - /** Separates any dependency from the constructor parameters. */ - private static PartitionedParameters isolateDependency(ExecutableElement constructor) { - Map<Boolean, List<VariableElement>> splitParameters = - constructor - .getParameters() - .stream() - .collect( - Collectors.partitioningBy( - p -> p.getAnnotation(AutoCodec.Dependency.class) != null)); - PartitionedParameters result = new PartitionedParameters(); - result.fields = splitParameters.get(Boolean.FALSE); - List<VariableElement> dependencies = splitParameters.get(Boolean.TRUE); - if (dependencies.size() > 1) { - throw new IllegalArgumentException( - ((TypeElement) constructor.getEnclosingElement()).getQualifiedName() - + " constructor has multiple Dependency annotations."); - } - if (!dependencies.isEmpty()) { - result.dependency = (TypeElement) ((DeclaredType) dependencies.get(0).asType()).asElement(); - } - return result; - } - private ExecutableElement selectInstantiator(TypeElement encodedType) { List<ExecutableElement> constructors = ElementFilter.constructorsIn(encodedType.getEnclosedElements()); @@ -263,10 +201,10 @@ public class AutoCodecProcessor extends AbstractProcessor { } private MethodSpec buildSerializeMethodWithInstantiator( - TypeElement encodedType, PartitionedParameters parameters) { + TypeElement encodedType, List<? extends VariableElement> fields) { MethodSpec.Builder serializeBuilder = - AutoCodecUtil.initializeSerializeMethodBuilder(encodedType, parameters.dependency); - for (VariableElement parameter : parameters.fields) { + AutoCodecUtil.initializeSerializeMethodBuilder(encodedType); + for (VariableElement parameter : fields) { TypeKind typeKind = parameter.asType().getKind(); switch (typeKind) { case BOOLEAN: @@ -336,10 +274,10 @@ public class AutoCodecProcessor extends AbstractProcessor { } private MethodSpec buildSerializeMethodWithInstantiatorForAutoValue( - TypeElement encodedType, PartitionedParameters parameters) { + TypeElement encodedType, List<? extends VariableElement> fields) { MethodSpec.Builder serializeBuilder = - AutoCodecUtil.initializeSerializeMethodBuilder(encodedType, parameters.dependency); - for (VariableElement parameter : parameters.fields) { + AutoCodecUtil.initializeSerializeMethodBuilder(encodedType); + for (VariableElement parameter : fields) { TypeKind typeKind = parameter.asType().getKind(); String getter = "input." + findGetterForAutoValue(parameter, encodedType) + "()"; switch (typeKind) { @@ -362,19 +300,16 @@ public class AutoCodecProcessor extends AbstractProcessor { return serializeBuilder.build(); } - private TypeSpec.Builder buildClassWithPublicFieldsStrategy( - TypeElement encodedType, @Nullable TypeElement dependency) { - TypeSpec.Builder codecClassBuilder = - AutoCodecUtil.initializeCodecClassBuilder(encodedType, dependency); + private TypeSpec.Builder buildClassWithPublicFieldsStrategy(TypeElement encodedType) { + TypeSpec.Builder codecClassBuilder = AutoCodecUtil.initializeCodecClassBuilder(encodedType); ImmutableList<? extends VariableElement> publicFields = ElementFilter.fieldsIn(env.getElementUtils().getAllMembers(encodedType)) .stream() .filter(this::isPublicField) .collect(toImmutableList()); - codecClassBuilder.addMethod( - buildSerializeMethodWithPublicFields(encodedType, publicFields, dependency)); + codecClassBuilder.addMethod(buildSerializeMethodWithPublicFields(encodedType, publicFields)); MethodSpec.Builder deserializeBuilder = - AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType, dependency); + AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType); buildDeserializeBody(deserializeBuilder, publicFields); addInstantiatePopulateFieldsAndReturn(deserializeBuilder, encodedType, publicFields); codecClassBuilder.addMethod(deserializeBuilder.build()); @@ -390,12 +325,10 @@ public class AutoCodecProcessor extends AbstractProcessor { } private MethodSpec buildSerializeMethodWithPublicFields( - TypeElement encodedType, - List<? extends VariableElement> parameters, - @Nullable TypeElement dependency) { + TypeElement encodedType, List<? extends VariableElement> fields) { MethodSpec.Builder serializeBuilder = - AutoCodecUtil.initializeSerializeMethodBuilder(encodedType, dependency); - for (VariableElement parameter : parameters) { + AutoCodecUtil.initializeSerializeMethodBuilder(encodedType); + for (VariableElement parameter : fields) { String paramAccessor = "input." + parameter.getSimpleName(); TypeKind typeKind = parameter.asType().getKind(); switch (typeKind) { @@ -428,8 +361,8 @@ public class AutoCodecProcessor extends AbstractProcessor { * is to avoid name collisions with variables used internally by AutoCodec. */ private void buildDeserializeBody( - MethodSpec.Builder builder, List<? extends VariableElement> parameters) { - for (VariableElement parameter : parameters) { + MethodSpec.Builder builder, List<? extends VariableElement> fields) { + for (VariableElement parameter : fields) { String paramName = parameter.getSimpleName() + "_"; TypeKind typeKind = parameter.asType().getKind(); switch (typeKind) { @@ -493,14 +426,9 @@ public class AutoCodecProcessor extends AbstractProcessor { /** * Coverts a constructor parameter to a String representing its handle within deserialize. - * - * <p>Uses the handle {@code dependency} for any parameter with the {@link AutoCodec.Dependency} - * annotation. */ private static String handleFromParameter(VariableElement parameter) { - return parameter.getAnnotation(AutoCodec.Dependency.class) != null - ? "dependency" - : (parameter.getSimpleName() + "_"); + return parameter.getSimpleName() + "_"; } /** @@ -595,71 +523,43 @@ public class AutoCodecProcessor extends AbstractProcessor { return Optional.empty(); } - private TypeSpec.Builder buildClassWithPolymorphicStrategy( - TypeElement encodedType, @Nullable TypeElement dependency) { + private TypeSpec.Builder buildClassWithPolymorphicStrategy(TypeElement encodedType) { if (!encodedType.getModifiers().contains(Modifier.ABSTRACT)) { throw new IllegalArgumentException( encodedType + " is not abstract, but POLYMORPHIC was selected as the strategy."); } - TypeSpec.Builder codecClassBuilder = - AutoCodecUtil.initializeCodecClassBuilder(encodedType, dependency); - codecClassBuilder.addMethod(buildPolymorphicSerializeMethod(encodedType, dependency)); - codecClassBuilder.addMethod(buildPolymorphicDeserializeMethod(encodedType, dependency)); + TypeSpec.Builder codecClassBuilder = AutoCodecUtil.initializeCodecClassBuilder(encodedType); + codecClassBuilder.addMethod(buildPolymorphicSerializeMethod(encodedType)); + codecClassBuilder.addMethod(buildPolymorphicDeserializeMethod(encodedType)); return codecClassBuilder; } - private MethodSpec buildPolymorphicSerializeMethod( - TypeElement encodedType, @Nullable TypeElement dependency) { - MethodSpec.Builder builder = - AutoCodecUtil.initializeSerializeMethodBuilder(encodedType, dependency); + private MethodSpec buildPolymorphicSerializeMethod(TypeElement encodedType) { + MethodSpec.Builder builder = AutoCodecUtil.initializeSerializeMethodBuilder(encodedType); TypeName polyClass = TypeName.get(env.getTypeUtils().erasure(encodedType.asType())); - if (dependency == null) { builder.addStatement( "$T.serialize(context, input, $T.class, codedOut, null)", PolymorphicHelper.class, polyClass); - } else { - builder.addStatement( - "$T.serialize(context, input, $T.class, codedOut, $T.ofNullable(dependency))", - PolymorphicHelper.class, - polyClass, - Optional.class); - } return builder.build(); } - private static MethodSpec buildPolymorphicDeserializeMethod( - TypeElement encodedType, @Nullable TypeElement dependency) { - MethodSpec.Builder builder = - AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType, dependency); - if (dependency == null) { + private static MethodSpec buildPolymorphicDeserializeMethod(TypeElement encodedType) { + MethodSpec.Builder builder = AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType); builder.addStatement( "return ($T) $T.deserialize(context, codedIn, null)", TypeName.get(encodedType.asType()), PolymorphicHelper.class); - } else { - builder.addStatement( - "return ($T) $T.deserialize(context, codedIn, $T.ofNullable(dependency))", - TypeName.get(encodedType.asType()), - PolymorphicHelper.class, - Optional.class); - } return builder.build(); } - private static TypeSpec.Builder buildClassWithSingletonStrategy( - TypeElement encodedType, @Nullable TypeElement dependency) { - if (dependency != null) { - throw new IllegalArgumentException( - encodedType + " specifies a dependency, but SINGLETON is selected as the strategy."); - } - TypeSpec.Builder codecClassBuilder = - AutoCodecUtil.initializeCodecClassBuilder(encodedType, dependency); + private static TypeSpec.Builder buildClassWithSingletonStrategy(TypeElement encodedType) { + TypeSpec.Builder codecClassBuilder = AutoCodecUtil.initializeCodecClassBuilder(encodedType); // Serialization is a no-op. codecClassBuilder.addMethod( - AutoCodecUtil.initializeSerializeMethodBuilder(encodedType, dependency).build()); + AutoCodecUtil.initializeSerializeMethodBuilder(encodedType).build()); MethodSpec.Builder deserializeMethodBuilder = - AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType, dependency); + AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType); deserializeMethodBuilder.addStatement("return $T.INSTANCE", TypeName.get(encodedType.asType())); codecClassBuilder.addMethod(deserializeMethodBuilder.build()); return codecClassBuilder; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecUtil.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecUtil.java index 4f5409269a..610badc465 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecUtil.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecUtil.java @@ -16,7 +16,6 @@ package com.google.devtools.build.lib.skyframe.serialization.autocodec; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; @@ -29,7 +28,6 @@ import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; import java.io.IOException; import java.util.stream.Collectors; -import javax.annotation.Nullable; import javax.lang.model.element.Element; import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; @@ -41,36 +39,15 @@ class AutoCodecUtil { static final Class<AutoCodec> ANNOTATION = AutoCodec.class; /** - * Initializes a builder for a class implementing {@link ObjectCodec}. - * - * @param encodedType type being serialized - */ - static TypeSpec.Builder initializeCodecClassBuilder(TypeElement encodedType) { - return initializeCodecClassBuilder(encodedType, null); - } - - /** * Initializes a builder for a class of the appropriate type. * - * <p>If the dependency is non-null, then the type is {@link InjectingObjectCodec} otherwise - * {@link ObjectCodec}. - * * @param encodedType type being serialized - * @param dependency type being injected or null */ - static TypeSpec.Builder initializeCodecClassBuilder( - TypeElement encodedType, @Nullable TypeElement dependency) { + static TypeSpec.Builder initializeCodecClassBuilder(TypeElement encodedType) { TypeSpec.Builder builder = TypeSpec.classBuilder(getCodecName(encodedType)); - if (dependency == null) { - return builder.addSuperinterface( - ParameterizedTypeName.get( - ClassName.get(ObjectCodec.class), TypeName.get(encodedType.asType()))); - } return builder.addSuperinterface( ParameterizedTypeName.get( - ClassName.get(InjectingObjectCodec.class), - TypeName.get(encodedType.asType()), - TypeName.get(dependency.asType()))); + ClassName.get(ObjectCodec.class), TypeName.get(encodedType.asType()))); } static MethodSpec.Builder initializeGetEncodedClassMethod(TypeElement encodedType) { @@ -82,21 +59,12 @@ class AutoCodecUtil { ClassName.get(Class.class), TypeName.get(encodedType.asType()))); } - static MethodSpec.Builder initializeSerializeMethodBuilder(TypeElement encodedType) { - return initializeSerializeMethodBuilder(encodedType, null); - } - /** - * Initializes the appropriate deserialize method based on presence of dependency. - * - * <p>{@link InjectingObjectCodec#serialize} if dependency is non-null and {@link - * ObjectCodec#serialize} otherwise. + * Initializes the deserialize method. * * @param encodedType type being serialized - * @param dependency type being injected */ - static MethodSpec.Builder initializeSerializeMethodBuilder( - TypeElement encodedType, @Nullable TypeElement dependency) { + static MethodSpec.Builder initializeSerializeMethodBuilder(TypeElement encodedType) { MethodSpec.Builder builder = MethodSpec.methodBuilder("serialize") .addModifiers(Modifier.PUBLIC) @@ -104,31 +72,18 @@ class AutoCodecUtil { .addAnnotation(Override.class) .addException(SerializationException.class) .addException(IOException.class); - if (dependency != null) { - builder.addParameter(TypeName.get(dependency.asType()), "dependency"); - } return builder .addParameter(SerializationContext.class, "context") .addParameter(TypeName.get(encodedType.asType()), "input") .addParameter(CodedOutputStream.class, "codedOut"); } - /** Initializes {@link ObjectCodec#deserialize}. */ - static MethodSpec.Builder initializeDeserializeMethodBuilder(TypeElement encodedType) { - return initializeDeserializeMethodBuilder(encodedType, null); - } - /** - * Initializes the appropriate deserialize method based on presence of dependency. - * - * <p>{@link InjectingObjectCodec#deserialize} if dependency is non-null and {@link - * ObjectCodec#deserialize} otherwise. + * Initializes the deserialize method. * * @param encodedType type being serialized - * @param dependency type being injected */ - static MethodSpec.Builder initializeDeserializeMethodBuilder( - TypeElement encodedType, @Nullable TypeElement dependency) { + static MethodSpec.Builder initializeDeserializeMethodBuilder(TypeElement encodedType) { MethodSpec.Builder builder = MethodSpec.methodBuilder("deserialize") .addModifiers(Modifier.PUBLIC) @@ -136,9 +91,6 @@ class AutoCodecUtil { .addAnnotation(Override.class) .addException(SerializationException.class) .addException(IOException.class); - if (dependency != null) { - builder.addParameter(TypeName.get(dependency.asType()), "dependency"); - } return builder .addParameter(DeserializationContext.class, "context") .addParameter(CodedInputStream.class, "codedIn"); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java index 541b1e3fa6..bb8e6e9495 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java @@ -28,7 +28,6 @@ import com.google.common.collect.Maps; import com.google.common.hash.HashCode; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetCodec; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationCodeGenerator.Context; import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationCodeGenerator.Marshaller; @@ -806,24 +805,13 @@ class Marshallers { typeParameter); return; } - - if (matchesErased(typeParameterCodec.get().asType(), InjectingObjectCodec.class)) { - context.builder.addStatement( - "$T<$T> $L = new $T<>($T.CODEC, dependency)", - NestedSetCodec.class, - typeParameter, - nestedSetCodec, - NestedSetCodec.class, - typeParameter); - } else { - context.builder.addStatement( - "$T<$T> $L = new $T<>($T.CODEC)", - NestedSetCodec.class, - typeParameter, - nestedSetCodec, - NestedSetCodec.class, - typeParameter); - } + context.builder.addStatement( + "$T<$T> $L = new $T<>($T.CODEC)", + NestedSetCodec.class, + typeParameter, + nestedSetCodec, + NestedSetCodec.class, + typeParameter); context.builder.addStatement( "$L.serialize(context, ($T<$T>) $L, codedOut)", nestedSetCodec, @@ -848,24 +836,13 @@ class Marshallers { typeParameter); return; } - - if (matchesErased(typeParameterCodec.get().asType(), InjectingObjectCodec.class)) { - context.builder.addStatement( - "$T<$T> $L = new $T<>($T.CODEC, dependency)", - NestedSetCodec.class, - typeParameter, - nestedSetCodec, - NestedSetCodec.class, - typeParameter); - } else { - context.builder.addStatement( - "$T<$T> $L = new $T<>($T.CODEC)", - NestedSetCodec.class, - typeParameter, - nestedSetCodec, - NestedSetCodec.class, - typeParameter); - } + context.builder.addStatement( + "$T<$T> $L = new $T<>($T.CODEC)", + NestedSetCodec.class, + typeParameter, + nestedSetCodec, + NestedSetCodec.class, + typeParameter); context.builder.addStatement( "$L = $L.deserialize(context, codedIn)", context.name, nestedSetCodec); } @@ -906,16 +883,11 @@ class Marshallers { if (isSubtypeErased(codecType, ObjectCodec.class)) { context.builder.addStatement( "$T.CODEC.serialize(context, $L, codedOut)", context.getTypeName(), context.name); - } else if (isSubtypeErased(codecType, InjectingObjectCodec.class)) { - context.builder.addStatement( - "$T.CODEC.serialize(dependency, context, $L, codedOut)", - context.getTypeName(), - context.name); } else { throw new IllegalArgumentException( "CODEC field of " + ((TypeElement) context.getDeclaredType().asElement()).getQualifiedName() - + " is neither ObjectCodec nor InjectingCodec"); + + " is not ObjectCodec"); } } @@ -925,16 +897,11 @@ class Marshallers { if (isSubtypeErased(codecType, ObjectCodec.class)) { context.builder.addStatement( "$L = $T.CODEC.deserialize(context, codedIn)", context.name, context.getTypeName()); - } else if (isSubtypeErased(codecType, InjectingObjectCodec.class)) { - context.builder.addStatement( - "$L = $T.CODEC.deserialize(dependency, context, codedIn)", - context.name, - context.getTypeName()); } else { throw new IllegalArgumentException( "CODEC field of " + ((TypeElement) context.getDeclaredType().asElement()).getQualifiedName() - + " is neither ObjectCodec nor InjectingCodec"); + + " is neither ObjectCodec"); } } }; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/AbstractObjectCodecTest.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/AbstractObjectCodecTest.java index 6be8562d4f..3b60141c4f 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/AbstractObjectCodecTest.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/AbstractObjectCodecTest.java @@ -18,7 +18,9 @@ import static com.google.common.truth.Truth.assertThat; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import java.io.IOException; import javax.annotation.Nullable; @@ -77,13 +79,15 @@ public abstract class AbstractObjectCodecTest<T> { objectCodecTester.testDeserializeJunkData(); } - protected T fromBytes(byte[] bytes) throws SerializationException, IOException { - return TestUtils.fromBytes(underTest, bytes); + protected T fromBytes(DeserializationContext context, byte[] bytes) + throws SerializationException, IOException { + return TestUtils.fromBytes(context, underTest, bytes); } /** Serialize subject using the {@link ObjectCodec} under test. */ - protected byte[] toBytes(T subject) throws IOException, SerializationException { - return TestUtils.toBytes(underTest, subject); + protected byte[] toBytes(SerializationContext context, T subject) + throws IOException, SerializationException { + return TestUtils.toBytes(context, underTest, subject); } protected void verifyDeserialization(T deserialized, T subject) { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/FsUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/FsUtils.java index 29cb354e57..e244098f32 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/FsUtils.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/FsUtils.java @@ -15,7 +15,6 @@ package com.google.devtools.build.lib.skyframe.serialization.testutils; import com.google.devtools.build.lib.vfs.FileSystem; -import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; import com.google.devtools.build.lib.vfs.RootedPath; @@ -26,8 +25,6 @@ public class FsUtils { public static final FileSystem TEST_FILESYSTEM = new InMemoryFileSystem(); - public static final FileSystemProvider TEST_FILESYSTEM_PROVIDER = () -> TEST_FILESYSTEM; - public static final RootedPath TEST_ROOT = RootedPath.toRootedPath( Root.fromPath(TEST_FILESYSTEM.getPath(PathFragment.create("/anywhere/at/all"))), diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/ObjectCodecTester.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/ObjectCodecTester.java index 82d4c36baa..a0f5873ae6 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/ObjectCodecTester.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/ObjectCodecTester.java @@ -20,8 +20,10 @@ import static org.junit.Assert.fail; import com.google.common.base.Preconditions; import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.protobuf.CodedInputStream; import java.io.IOException; @@ -55,17 +57,23 @@ public class ObjectCodecTester<T> { private final ObjectCodec<T> underTest; private final ImmutableList<T> subjects; + private final SerializationContext writeContext; + private final DeserializationContext readContext; private final boolean skipBadDataTest; private final VerificationFunction<T> verificationFunction; private ObjectCodecTester( ObjectCodec<T> underTest, ImmutableList<T> subjects, + SerializationContext writeContext, + DeserializationContext readContext, boolean skipBadDataTest, VerificationFunction<T> verificationFunction) { this.underTest = underTest; Preconditions.checkState(!subjects.isEmpty(), "No subjects provided"); this.subjects = subjects; + this.writeContext = writeContext; + this.readContext = readContext; this.skipBadDataTest = skipBadDataTest; this.verificationFunction = verificationFunction; } @@ -111,8 +119,7 @@ public class ObjectCodecTester<T> { void testDeserializeJunkData() { try { underTest.deserialize( - DeserializationContext.create(), - CodedInputStream.newInstance("junk".getBytes(StandardCharsets.UTF_8))); + readContext, CodedInputStream.newInstance("junk".getBytes(StandardCharsets.UTF_8))); fail("Expected exception"); } catch (SerializationException | IOException e) { // Expected. @@ -120,17 +127,19 @@ public class ObjectCodecTester<T> { } private T fromBytes(byte[] bytes) throws SerializationException, IOException { - return TestUtils.fromBytes(underTest, bytes); + return TestUtils.fromBytes(readContext, underTest, bytes); } private byte[] toBytes(T subject) throws IOException, SerializationException { - return TestUtils.toBytes(underTest, subject); + return TestUtils.toBytes(writeContext, underTest, subject); } /** Builder for {@link ObjectCodecTester}. */ public static class Builder<T> { private final ObjectCodec<T> underTest; private final ImmutableList.Builder<T> subjectsBuilder = ImmutableList.builder(); + private final ImmutableMap.Builder<Class<?>, Object> dependenciesBuilder = + ImmutableMap.builder(); private boolean skipBadDataTest = false; private VerificationFunction<T> verificationFunction = (original, deserialized) -> assertThat(deserialized).isEqualTo(original); @@ -151,6 +160,12 @@ public class ObjectCodecTester<T> { return this; } + /** Add subjects to be tested for serialization/deserialization. */ + public final <D> Builder<T> addDependency(Class<? super D> type, D dependency) { + dependenciesBuilder.put(type, dependency); + return this; + } + /** * Skip tests that check for the ability to detect bad data. This may be useful for simpler * codecs which don't do any error verification. @@ -180,9 +195,12 @@ public class ObjectCodecTester<T> { * individually. */ ObjectCodecTester<T> build() { + ImmutableMap<Class<?>, Object> dependencies = dependenciesBuilder.build(); return new ObjectCodecTester<>( underTest, subjectsBuilder.build(), + new SerializationContext(dependencies), + new DeserializationContext(dependencies), skipBadDataTest, verificationFunction); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java index 8e87e46a6c..8d914da254 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java @@ -33,19 +33,19 @@ public class TestUtils { private TestUtils() {} /** Serialize a value to a new byte array. */ - public static <T> byte[] toBytes(ObjectCodec<T> codec, T value) + public static <T> byte[] toBytes(SerializationContext context, ObjectCodec<T> codec, T value) throws IOException, SerializationException { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); CodedOutputStream codedOut = CodedOutputStream.newInstance(bytes); - codec.serialize(SerializationContext.create(), value, codedOut); + codec.serialize(context, value, codedOut); codedOut.flush(); return bytes.toByteArray(); } /** Deserialize a value from a byte array. */ - public static <T> T fromBytes(ObjectCodec<T> codec, byte[] bytes) + public static <T> T fromBytes(DeserializationContext context, ObjectCodec<T> codec, byte[] bytes) throws SerializationException, IOException { - return codec.deserialize(DeserializationContext.create(), CodedInputStream.newInstance(bytes)); + return codec.deserialize(context, CodedInputStream.newInstance(bytes)); } /** diff --git a/src/main/java/com/google/devtools/build/lib/vfs/FileSystemProvider.java b/src/main/java/com/google/devtools/build/lib/vfs/FileSystemProvider.java deleted file mode 100644 index 160bb2ecf9..0000000000 --- a/src/main/java/com/google/devtools/build/lib/vfs/FileSystemProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2018 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.devtools.build.lib.vfs; - -/** Abstraction for injecting FileSystem dependencies. */ -public interface FileSystemProvider { - - FileSystem getFileSystem(); -} diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Path.java b/src/main/java/com/google/devtools/build/lib/vfs/Path.java index 649eea9256..b4542ecd83 100644 --- a/src/main/java/com/google/devtools/build/lib/vfs/Path.java +++ b/src/main/java/com/google/devtools/build/lib/vfs/Path.java @@ -16,7 +16,6 @@ package com.google.devtools.build.lib.vfs; import com.google.common.base.Preconditions; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; @@ -62,8 +61,7 @@ import javax.annotation.Nullable; @ThreadSafe public class Path implements Comparable<Path>, Serializable, SkylarkPrintable, FileType.HasFileType { - public static final InjectingObjectCodec<Path, FileSystemProvider> CODEC = - new PathCodecWithInjectedFileSystem(); + public static final ObjectCodec<Path> CODEC = new Codec(); private static FileSystem fileSystemForSerialization; @@ -907,8 +905,7 @@ public class Path driveStrLength = OS.getDriveStrLength(path); } - private static class PathCodecWithInjectedFileSystem - implements InjectingObjectCodec<Path, FileSystemProvider> { + private static class Codec implements ObjectCodec<Path> { private final ObjectCodec<String> stringCodec = StringCodecs.asciiOptimized(); @Override @@ -918,21 +915,23 @@ public class Path @Override public void serialize( - FileSystemProvider fsProvider, SerializationContext context, Path path, CodedOutputStream codedOut) throws IOException, SerializationException { - Preconditions.checkArgument(path.getFileSystem() == fsProvider.getFileSystem()); + Preconditions.checkArgument( + path.getFileSystem() == context.getDependency(FileSystem.class), + "%s != %s", + path.getFileSystem(), + context.getDependency(FileSystem.class)); stringCodec.serialize(context, path.getPathString(), codedOut); } @Override - public Path deserialize( - FileSystemProvider fsProvider, DeserializationContext context, CodedInputStream codedIn) + public Path deserialize(DeserializationContext context, CodedInputStream codedIn) throws IOException, SerializationException { return Path.createAlreadyNormalized( - stringCodec.deserialize(context, codedIn), fsProvider.getFileSystem()); + stringCodec.deserialize(context, codedIn), context.getDependency(FileSystem.class)); } } } diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Root.java b/src/main/java/com/google/devtools/build/lib/vfs/Root.java index 73ff687b56..6f090e41a7 100644 --- a/src/main/java/com/google/devtools/build/lib/vfs/Root.java +++ b/src/main/java/com/google/devtools/build/lib/vfs/Root.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.vfs; import com.google.common.base.Objects; import com.google.common.base.Preconditions; import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.protobuf.CodedInputStream; @@ -35,7 +35,7 @@ import javax.annotation.Nullable; */ public interface Root extends Comparable<Root>, Serializable { - InjectingObjectCodec<Root, FileSystemProvider> CODEC = new RootCodec(); + ObjectCodec<Root> CODEC = new RootCodec(); /** Constructs a root from a path. */ static Root fromPath(Path path) { @@ -258,7 +258,7 @@ public interface Root extends Comparable<Root>, Serializable { } /** Codec to serialize {@link Root}s. */ - class RootCodec implements InjectingObjectCodec<Root, FileSystemProvider> { + class RootCodec implements ObjectCodec<Root> { @Override public Class<Root> getEncodedClass() { return Root.class; @@ -266,16 +266,16 @@ public interface Root extends Comparable<Root>, Serializable { @Override public void serialize( - FileSystemProvider dependency, SerializationContext context, Root obj, CodedOutputStream codedOut) throws SerializationException, IOException { if (obj instanceof PathRoot) { codedOut.writeBoolNoTag(false); - Path.CODEC.serialize(dependency, context, ((PathRoot) obj).path, codedOut); + Path.CODEC.serialize(context, ((PathRoot) obj).path, codedOut); } else if (obj instanceof AbsoluteRoot) { - Preconditions.checkArgument(((AbsoluteRoot) obj).fileSystem == dependency.getFileSystem()); + Preconditions.checkArgument( + ((AbsoluteRoot) obj).fileSystem == context.getDependency(FileSystem.class)); codedOut.writeBoolNoTag(true); } else { throw new AssertionError("Unknown Root subclass: " + obj.getClass().getName()); @@ -283,14 +283,13 @@ public interface Root extends Comparable<Root>, Serializable { } @Override - public Root deserialize( - FileSystemProvider dependency, DeserializationContext context, CodedInputStream codedIn) + public Root deserialize(DeserializationContext context, CodedInputStream codedIn) throws SerializationException, IOException { boolean isAbsolute = codedIn.readBool(); if (isAbsolute) { - return dependency.getFileSystem().getAbsoluteRoot(); + return context.getDependency(FileSystem.class).getAbsoluteRoot(); } else { - Path path = Path.CODEC.deserialize(dependency, context, codedIn); + Path path = Path.CODEC.deserialize(context, codedIn); return new PathRoot(path); } } diff --git a/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java b/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java index aa3153463d..bbc89a96d9 100644 --- a/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java +++ b/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java @@ -14,14 +14,8 @@ package com.google.devtools.build.lib.vfs; import com.google.common.base.Preconditions; -import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; -import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; -import com.google.devtools.build.lib.skyframe.serialization.SerializationException; -import com.google.protobuf.CodedInputStream; -import com.google.protobuf.CodedOutputStream; -import java.io.IOException; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import java.io.Serializable; import java.util.Objects; @@ -35,13 +29,18 @@ import java.util.Objects; * <p>TODO(bazel-team): use an opaque root representation so as to not expose the absolute path to * clients via #asPath or #getRoot. */ +@AutoCodec public class RootedPath implements Serializable { + public static final ObjectCodec<RootedPath> CODEC = new RootedPath_AutoCodec(); + private final Root root; private final PathFragment rootRelativePath; /** Constructs a {@link RootedPath} from a {@link Root} and path fragment relative to the root. */ - private RootedPath(Root root, PathFragment rootRelativePath) { + @AutoCodec.Instantiator + @AutoCodec.VisibleForSerialization + RootedPath(Root root, PathFragment rootRelativePath) { Preconditions.checkState( rootRelativePath.isAbsolute() == root.isAbsolute(), "rootRelativePath: %s root: %s", @@ -123,36 +122,4 @@ public class RootedPath implements Serializable { public String toString() { return "[" + root + "]/[" + rootRelativePath + "]"; } - - /** Custom serialization for {@link RootedPath}s. */ - public static class RootedPathCodec implements ObjectCodec<RootedPath> { - - private final ObjectCodec<Root> rootCodec; - - /** Create an instance which will deserialize RootedPaths on {@code fileSystem}. */ - public RootedPathCodec(FileSystem fileSystem) { - this.rootCodec = new InjectingObjectCodecAdapter<>(Root.CODEC, () -> fileSystem); - } - - @Override - public Class<RootedPath> getEncodedClass() { - return RootedPath.class; - } - - @Override - public void serialize( - SerializationContext context, RootedPath rootedPath, CodedOutputStream codedOut) - throws IOException, SerializationException { - rootCodec.serialize(context, rootedPath.getRoot(), codedOut); - PathFragment.CODEC.serialize(context, rootedPath.getRootRelativePath(), codedOut); - } - - @Override - public RootedPath deserialize(DeserializationContext context, CodedInputStream codedIn) - throws IOException, SerializationException { - Root root = rootCodec.deserialize(context, codedIn); - PathFragment rootRelativePath = PathFragment.CODEC.deserialize(context, codedIn); - return toRootedPath(root, rootRelativePath); - } - } } diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index cf66e2fe07..f1cc531c09 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD @@ -856,6 +856,7 @@ java_test( "//src/main/java/com/google/devtools/build/lib:packages", "//src/main/java/com/google/devtools/build/lib:skylarkinterface", "//src/main/java/com/google/devtools/build/lib:util", + "//src/main/java/com/google/devtools/build/lib/skyframe/serialization", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils", "//src/main/java/com/google/devtools/build/lib/vfs", "//src/main/java/com/google/devtools/build/skyframe", diff --git a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java index f26d00eaa5..a0261e9d99 100644 --- a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java +++ b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java @@ -25,10 +25,10 @@ import com.google.devtools.build.lib.actions.util.LabelArtifactOwner; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.rules.cpp.CppFileTypes; import com.google.devtools.build.lib.rules.java.JavaSemantics; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter; import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester; import com.google.devtools.build.lib.testutil.MoreAsserts; import com.google.devtools.build.lib.testutil.Scratch; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; @@ -336,8 +336,7 @@ public class ArtifactTest { @Test public void testCodec() throws Exception { - ObjectCodecTester.newBuilder( - new InjectingObjectCodecAdapter<>(Artifact.CODEC, () -> scratch.getFileSystem())) + ObjectCodecTester.newBuilder(Artifact.CODEC) .addSubjects( new Artifact(PathFragment.create("src/a"), rootDir), new Artifact( @@ -347,6 +346,7 @@ public class ArtifactTest { scratch.getFileSystem().getPath("/"), scratch.dir("/src")), PathFragment.create("src/c"), new LabelArtifactOwner(Label.parseAbsoluteUnchecked("//foo:bar")))) + .addDependency(FileSystem.class, scratch.getFileSystem()) .buildAndRunTests(); } diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java index c686a1f126..06ffcd07ae 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java @@ -15,7 +15,6 @@ package com.google.devtools.build.lib.analysis; import static com.google.common.truth.Truth.assertThat; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter; import com.google.devtools.build.lib.skyframe.serialization.testutils.FsUtils; import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester; import com.google.devtools.build.lib.testutil.FoundationTestCase; @@ -54,9 +53,7 @@ public class BlazeDirectoriesTest extends FoundationTestCase { @Test public void testCodec() throws Exception { - ObjectCodecTester.newBuilder( - new InjectingObjectCodecAdapter<>( - BlazeDirectories.CODEC, FsUtils.TEST_FILESYSTEM_PROVIDER)) + ObjectCodecTester.newBuilder(BlazeDirectories.CODEC) .addSubjects( new BlazeDirectories( new ServerDirectories( @@ -77,6 +74,7 @@ public class BlazeDirectoriesTest extends FoundationTestCase { FsUtils.TEST_FILESYSTEM.getPath("/output_base")), FsUtils.TEST_FILESYSTEM.getPath("/workspace"), "Bazel")) + .addDependency(FileSystem.class, FsUtils.TEST_FILESYSTEM) .buildAndRunTests(); } } diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java index d3a1d4d764..26b1d1eec6 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java @@ -29,8 +29,8 @@ import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.java.JavaConfiguration; import com.google.devtools.build.lib.rules.objc.J2ObjcConfiguration; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter; import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.common.options.Options; import java.util.Map; import java.util.regex.Pattern; @@ -430,9 +430,7 @@ public class BuildConfigurationTest extends ConfigurationTestCase { @Test public void testCodec() throws Exception { - ObjectCodecTester.newBuilder( - new InjectingObjectCodecAdapter<>( - BuildConfiguration.CODEC, () -> getScratch().getFileSystem())) + ObjectCodecTester.newBuilder(BuildConfiguration.CODEC) .addSubjects( create(), create("--cpu=piii"), @@ -453,6 +451,7 @@ public class BuildConfigurationTest extends ConfigurationTestCase { "qspace=a\\ quoted\\ space", "--define", "#a=pounda")) + .addDependency(FileSystem.class, getScratch().getFileSystem()) .verificationFunction(BuildConfigurationTest::verifyDeserialized) .buildAndRunTests(); } diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java index 56d8039642..339f060ce4 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java +++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java @@ -16,6 +16,9 @@ package com.google.devtools.build.lib.packages; import static com.google.common.truth.Truth.assertThat; +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; +import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; import com.google.devtools.build.lib.skyframe.serialization.testutils.TestUtils; import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.common.options.Options; @@ -84,7 +87,10 @@ public class SkylarkSemanticsConsistencyTest { for (int i = 0; i < NUM_RANDOM_TRIALS; i++) { SkylarkSemantics semantics = buildRandomSemantics(new Random(i)); SkylarkSemantics deserialized = - TestUtils.fromBytes(codec, TestUtils.toBytes(codec, semantics)); + TestUtils.fromBytes( + new DeserializationContext(ImmutableMap.of()), + codec, + TestUtils.toBytes(new SerializationContext(ImmutableMap.of()), codec, semantics)); assertThat(deserialized).isEqualTo(semantics); } } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobDescriptorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobDescriptorTest.java index ee37679eaa..d5174c53ba 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobDescriptorTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobDescriptorTest.java @@ -17,9 +17,9 @@ import static com.google.common.truth.Truth.assertThat; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.cmdline.PackageIdentifier; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter; import com.google.devtools.build.lib.skyframe.serialization.testutils.FsUtils; import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; import org.junit.Test; @@ -32,9 +32,7 @@ public class GlobDescriptorTest { @Test public void testSerialization() throws Exception { - ObjectCodecTester.newBuilder( - GlobDescriptor.getCodec( - new InjectingObjectCodecAdapter<>(Root.CODEC, () -> FsUtils.TEST_FILESYSTEM))) + ObjectCodecTester.newBuilder(GlobDescriptor.CODEC) .addSubjects( GlobDescriptor.create( PackageIdentifier.create("@foo", PathFragment.create("//bar")), @@ -48,6 +46,7 @@ public class GlobDescriptorTest { PathFragment.create("anotherSubdir"), "pattern", /*excludeDirs=*/ true)) + .addDependency(FileSystem.class, FsUtils.TEST_FILESYSTEM) .verificationFunction((orig, deserialized) -> assertThat(deserialized).isSameAs(orig)) .buildAndRunTests(); } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageValueTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageValueTest.java index 3c3652d903..c8d9d9e03b 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageValueTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageValueTest.java @@ -21,12 +21,13 @@ import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.packages.Package; +import com.google.devtools.build.lib.packages.PackageCodecDependencies; import com.google.devtools.build.lib.packages.PackageCodecDependencies.SimplePackageCodecDependencies; import com.google.devtools.build.lib.packages.PackageDeserializationException; import com.google.devtools.build.lib.packages.PackageDeserializerInterface; import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.protobuf.CodedInputStream; @@ -43,13 +44,13 @@ public class PackageValueTest { private PackageDeserializerInterface mockDeserializer; private ObjectCodec<PackageValue> underTest; + SimplePackageCodecDependencies codecDeps; @Before public void setUp() { this.mockDeserializer = mock(PackageDeserializerInterface.class); - this.underTest = - new InjectingObjectCodecAdapter<>( - PackageValue.CODEC, new SimplePackageCodecDependencies(null, mockDeserializer)); + this.underTest = PackageValue.CODEC; + this.codecDeps = new SimplePackageCodecDependencies(null, mockDeserializer); } @Test @@ -63,7 +64,10 @@ public class PackageValueTest { .thenReturn(mockPackage); CodedInputStream codedIn = CodedInputStream.newInstance(new byte[] {1, 2, 3, 4}); - PackageValue result = underTest.deserialize(DeserializationContext.create(), codedIn); + PackageValue result = + underTest.deserialize( + new DeserializationContext(ImmutableMap.of(PackageCodecDependencies.class, codecDeps)), + codedIn); assertThat(result.getPackage()).isSameAs(mockPackage); } @@ -75,7 +79,8 @@ public class PackageValueTest { try { underTest.deserialize( - DeserializationContext.create(), CodedInputStream.newInstance(new byte[] {1, 2, 3, 4})); + new DeserializationContext(ImmutableMap.of(PackageCodecDependencies.class, codecDeps)), + CodedInputStream.newInstance(new byte[] {1, 2, 3, 4})); fail("Expected exception"); } catch (IllegalStateException e) { assertThat(e) diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java index 5d24b9ef28..4928d73fa0 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java @@ -52,7 +52,6 @@ import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventKind; import com.google.devtools.build.lib.events.StoredEventHandler; import com.google.devtools.build.lib.skyframe.ActionTemplateExpansionValue.ActionTemplateExpansionKey; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter; import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester; import com.google.devtools.build.lib.testutil.TestUtils; import com.google.devtools.build.lib.vfs.FileStatus; @@ -118,9 +117,9 @@ public class TreeArtifactBuildTest extends TimestampBuilderTestCase { @Test public void testCodec() throws Exception { - ObjectCodecTester.newBuilder( - new InjectingObjectCodecAdapter<>(Artifact.CODEC, () -> scratch.getFileSystem())) + ObjectCodecTester.newBuilder(Artifact.CODEC) .addSubjects(outOne, outOneFileOne) + .addDependency(FileSystem.class, scratch.getFileSystem()) .buildAndRunTests(); } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java index 3b84c93353..dc835c7920 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java @@ -26,6 +26,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import com.google.common.collect.ImmutableMap; import com.google.protobuf.ByteString; import com.google.protobuf.CodedInputStream; import com.google.protobuf.CodedOutputStream; @@ -79,10 +80,10 @@ public class ObjectCodecsTest { @Before public final void setup() { spyObjectCodec = spy(new IntegerCodec()); - this.underTest = new ObjectCodecs( - ObjectCodecRegistry.newBuilder() - .add(KNOWN_CLASSIFIER, spyObjectCodec) - .build()); + this.underTest = + new ObjectCodecs( + ObjectCodecRegistry.newBuilder().add(KNOWN_CLASSIFIER, spyObjectCodec).build(), + ImmutableMap.of()); } @Test @@ -224,8 +225,10 @@ public class ObjectCodecsTest { @Test public void testSerializeFailsWhenNoCustomCodecAndFallbackDisabled() throws Exception { - ObjectCodecs underTest = new ObjectCodecs( - ObjectCodecRegistry.newBuilder().setAllowDefaultCodec(false).build()); + ObjectCodecs underTest = + new ObjectCodecs( + ObjectCodecRegistry.newBuilder().setAllowDefaultCodec(false).build(), + ImmutableMap.of()); SerializationException.NoCodecException expected = expectThrows( SerializationException.NoCodecException.class, () -> underTest.serialize("X", "Y")); @@ -237,8 +240,10 @@ public class ObjectCodecsTest { @Test public void testDeserializeFailsWhenNoCustomCodecAndFallbackDisabled() throws Exception { ByteString serialized = ByteString.copyFromUtf8("doesn't matter"); - ObjectCodecs underTest = new ObjectCodecs( - ObjectCodecRegistry.newBuilder().setAllowDefaultCodec(false).build()); + ObjectCodecs underTest = + new ObjectCodecs( + ObjectCodecRegistry.newBuilder().setAllowDefaultCodec(false).build(), + ImmutableMap.of()); SerializationException.NoCodecException expected = expectThrows( SerializationException.NoCodecException.class, diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java index f6532fcb61..f1bac51803 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.skyframe.serialization; +import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelCodec; import com.google.devtools.build.lib.skyframe.PrecomputedValue; @@ -30,13 +31,15 @@ public class PrecomputedValueCodecTest extends AbstractObjectCodecTest<Precomput public PrecomputedValueCodecTest() { super( new PrecomputedValueCodec( - () -> new ObjectCodecs( - ObjectCodecRegistry.newBuilder() - .asClassKeyedBuilder() - // Note no PathFragmentCodec. - .add(String.class, StringCodecs.asciiOptimized()) - .add(Label.class, LabelCodec.INSTANCE) - .build())), + () -> + new ObjectCodecs( + ObjectCodecRegistry.newBuilder() + .asClassKeyedBuilder() + // Note no PathFragmentCodec. + .add(String.class, StringCodecs.asciiOptimized()) + .add(Label.class, LabelCodec.INSTANCE) + .build(), + ImmutableMap.of())), new PrecomputedValue(PathFragment.create("java serializable 1")), new PrecomputedValue(PathFragment.create("java serializable 2")), new PrecomputedValue("first string"), diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RepositoryNameCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RepositoryNameCodecTest.java index 30f4e08cfd..f922e43d83 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RepositoryNameCodecTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RepositoryNameCodecTest.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.skyframe.serialization; import static org.junit.Assert.fail; +import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.cmdline.RepositoryNameCodec; @@ -47,7 +48,7 @@ public class RepositoryNameCodecTest extends AbstractObjectCodecTest<RepositoryN @Test public void testDeserializeBadDataThrowsSerializationException() { try { - fromBytes(INVALID_ENCODED_REPOSITORY_NAME); + fromBytes(new DeserializationContext(ImmutableMap.of()), INVALID_ENCODED_REPOSITORY_NAME); fail("Expected exception"); } catch (SerializationException | IOException e) { // Expected. diff --git a/src/test/java/com/google/devtools/build/lib/vfs/RootTest.java b/src/test/java/com/google/devtools/build/lib/vfs/RootTest.java index 9c67e72771..e9605b32fd 100644 --- a/src/test/java/com/google/devtools/build/lib/vfs/RootTest.java +++ b/src/test/java/com/google/devtools/build/lib/vfs/RootTest.java @@ -18,8 +18,6 @@ import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.Lists; import com.google.common.testing.EqualsTester; import com.google.devtools.build.lib.clock.BlazeClock; -import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter; -import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester; import com.google.devtools.build.lib.testutil.MoreAsserts; import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem; @@ -99,9 +97,9 @@ public class RootTest { @Test public void testSerialization() throws Exception { - ObjectCodec<Root> codec = new InjectingObjectCodecAdapter<>(Root.CODEC, () -> fs); - ObjectCodecTester.newBuilder(codec) + ObjectCodecTester.newBuilder(Root.CODEC) .addSubjects(Root.absoluteRoot(fs), Root.fromPath(fs.getPath("/foo"))) + .addDependency(FileSystem.class, fs) .skipBadDataTest() .buildAndRunTests(); } |