diff options
author | dslomov <dslomov@google.com> | 2017-04-11 12:18:09 +0000 |
---|---|---|
committer | Jakob Buchgraber <buchgr@google.com> | 2017-04-12 11:48:55 +0200 |
commit | 423dccc87c4651d3d188f83dca5ce9362dad180e (patch) | |
tree | 40f27696a3dbc16e2299469392fb45c73a5ad6f0 /src/main/java/com/google/devtools/build | |
parent | c83c570ccf619a0afb9919851067a825eb1ac9ff (diff) |
Make immutability explicit for things exposed to Skylark.
RELNOTES: None.
PiperOrigin-RevId: 152800780
Diffstat (limited to 'src/main/java/com/google/devtools/build')
17 files changed, 47 insertions, 22 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Root.java b/src/main/java/com/google/devtools/build/lib/actions/Root.java index 859a8b6344..dfbfa7425b 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Root.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Root.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.actions; import com.google.common.annotations.VisibleForTesting; import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; @@ -46,6 +47,7 @@ import javax.annotation.Nullable; category = SkylarkModuleCategory.BUILTIN, doc = "A root for files. The roots are the directories containing files, and they are mapped " + "together into a single directory tree to form the execution environment.") +@Immutable public final class Root implements Comparable<Root>, Serializable { /** diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkExecutionResult.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkExecutionResult.java index 1d5f70c088..5f0bffd54c 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkExecutionResult.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkExecutionResult.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.bazel.repository.skylark; import com.google.common.collect.Maps; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.shell.BadExitStatusException; import com.google.devtools.build.lib.shell.Command; @@ -25,7 +26,6 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.util.Preconditions; - import com.google.devtools.build.lib.util.io.DelegatingOutErr; import com.google.devtools.build.lib.util.io.OutErr; import com.google.devtools.build.lib.util.io.RecordingOutErr; @@ -47,6 +47,7 @@ import java.util.Map; + " output stream content, the standard error stream content and the execution return" + " code." ) +@Immutable final class SkylarkExecutionResult { private final int returnCode; private final String stdout; diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkPath.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkPath.java index 3491b8cdab..72505fb217 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkPath.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkPath.java @@ -21,7 +21,6 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; import com.google.devtools.build.lib.vfs.Path; import java.io.IOException; -import java.util.List; /** * A Path object to be used into Skylark remote repository. @@ -70,7 +69,7 @@ final class SkylarkPath { structField = false, doc = "The list of entries in the directory denoted by this path." ) - public List<SkylarkPath> readdir() throws IOException { + public ImmutableList<SkylarkPath> readdir() throws IOException { ImmutableList.Builder<SkylarkPath> builder = ImmutableList.builder(); for (Path p : path.getDirectoryEntries()) { builder.add(new SkylarkPath(p)); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java index 7e382b2c0a..3ebfc4bb59 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java @@ -417,9 +417,10 @@ public class SkylarkRepositoryContext { name = "which", doc = "Returns the path of the corresponding program or None " - + "if there is no such program in the path" + + "if there is no such program in the path", + allowReturnNones = true ) - public Object which(String program) throws EvalException { + public SkylarkPath which(String program) throws EvalException { if (program.contains("/") || program.contains("\\")) { throw new EvalException( Location.BUILTIN, @@ -441,7 +442,7 @@ public class SkylarkRepositoryContext { } } } - return Runtime.NONE; + return null; } @SkylarkCallable( diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java index ca9547fb87..0b1b86d867 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java @@ -29,6 +29,7 @@ import com.google.common.collect.Ordering; import com.google.common.collect.Sets; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.concurrent.ThreadSafety; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.syntax.ClassObject; @@ -167,6 +168,7 @@ public final class Attribute implements Comparable<Attribute> { * the symbol isn't available here. */ // TODO(bazel-team): Serializability constraints? + @ThreadSafety.Immutable public interface SplitTransition<T> extends Transition { /** * Return the list of {@code BuildOptions} after splitting; empty if not applicable. diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkFileType.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkFileType.java index 287308ce8e..a32c6bc6c5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkFileType.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkFileType.java @@ -24,7 +24,6 @@ import com.google.devtools.build.lib.syntax.EvalUtils; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.util.FileTypeSet; -import java.util.List; /** A wrapper class for FileType and FileTypeSet functionality in Skylark. */ @SkylarkModule( @@ -60,7 +59,7 @@ public class SkylarkFileType { // Skylark interface framework. If there's a dynamic type error on a non-Artifact element, the // error will also be handled by the Skylark interface framework. @SuppressWarnings("unchecked") - public List<Artifact> filter(Object filesUnchecked) throws EvalException { + public ImmutableList<Artifact> filter(Object filesUnchecked) throws EvalException { return ImmutableList.copyOf( FileType.filter( (Iterable<Artifact>) EvalUtils.toIterableStrict(filesUnchecked, null), diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java index de8d3de361..2a32c96f42 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java @@ -479,7 +479,7 @@ public final class SkylarkRuleContext implements SkylarkValue { category = SkylarkModuleCategory.NONE, doc = "Information about attributes of a rule an aspect is applied to." ) - private static class SkylarkRuleAttributesCollection { + private static class SkylarkRuleAttributesCollection implements SkylarkValue { private final SkylarkRuleContext skylarkRuleContext; private final SkylarkClassObject attrObject; private final SkylarkClassObject executableObject; @@ -557,6 +557,17 @@ public final class SkylarkRuleContext implements SkylarkValue { public ImmutableMap<Artifact, FilesToRunProvider> getExecutableRunfilesMap() { return executableRunfilesMap; } + + @Override + public boolean isImmutable() { + return skylarkRuleContext.isImmutable(); + } + + @Override + public void write(Appendable buffer, char quotationMark) { + Printer.append(buffer, "rule_collection:"); + skylarkRuleContext.write(buffer, quotationMark); + } } private void addOutput(HashMap<String, Object> outputsBuilder, String key, Object value) @@ -621,7 +632,7 @@ public final class SkylarkRuleContext implements SkylarkValue { + "<br/><br/>" + "This is intended to help write tests for rule-implementation helper functions, which " + "may take in a <code>ctx</code> object and create actions on it.") - public Object createdActions() throws EvalException { + public SkylarkValue createdActions() throws EvalException { checkMutable("created_actions"); if (ruleContext.getRule().getRuleClassObject().isSkylarkTestable()) { return ActionsProvider.create( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java index 85d24500eb..4ca0f5beb1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java @@ -21,6 +21,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.collect.nestedset.NestedSet; 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.SkylarkApiProvider; import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceType; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; @@ -42,6 +43,7 @@ import javax.annotation.Nullable; "Provides access to information about Android rules. Every Android-related target provides " + "this struct, accessible as a 'android' field on a Target struct." ) +@Immutable public class AndroidSkylarkApiProvider extends SkylarkApiProvider { /** The name of the field in Skylark used to access this class. */ public static final String NAME = "android"; @@ -177,6 +179,7 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider { category = SkylarkModuleCategory.NONE, doc = "Provides access to information about Android rules." ) + @Immutable public class IdlInfo { @SkylarkCallable( name = "import_root", diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java index fb42de007e..f588ff50e6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration.DefaultL import com.google.devtools.build.lib.analysis.config.BuildConfiguration.LabelConverter; import com.google.devtools.build.lib.analysis.config.FragmentOptions; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher; import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; @@ -348,6 +349,7 @@ public class AppleCommandLineOptions extends FragmentOptions { "Apple Bitcode mode for compilation steps. Possible values are \"none\", " + "\"embedded\", and \"embedded_markers\"" ) + @Immutable public enum AppleBitcodeMode { /** Do not compile bitcode. */ diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java index 183f5a9a50..36c0b903a2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java @@ -249,7 +249,7 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { * their corresponding values. */ @SkylarkCallable(name = "target_apple_env") - public Map<String, String> getTargetAppleEnvironment(Platform platform) { + public ImmutableMap<String, String> getTargetAppleEnvironment(Platform platform) { ImmutableMap.Builder<String, String> mapBuilder = ImmutableMap.builder(); mapBuilder.putAll(appleTargetPlatformEnv(platform)); return mapBuilder.build(); @@ -267,7 +267,7 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { + "build on an apple host system. These environment variables are needed by the apple " + "toolchain. Keys are variable names and values are their corresponding values." ) - public Map<String, String> getAppleHostSystemEnv() { + public ImmutableMap<String, String> getAppleHostSystemEnv() { DottedVersion xcodeVersion = getXcodeVersion(); if (xcodeVersion != null) { return getXcodeVersionEnv(xcodeVersion); @@ -281,7 +281,7 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { * a version of xcode to be explicitly declared. Keys are variable names and values are their * corresponding values. */ - public Map<String, String> getXcodeVersionEnv(DottedVersion xcodeVersion) { + public ImmutableMap<String, String> getXcodeVersionEnv(DottedVersion xcodeVersion) { return ImmutableMap.of(AppleConfiguration.XCODE_VERSION_ENV_NAME, xcodeVersion.toString()); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java index ceb91debed..30cbb362d1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java @@ -44,6 +44,7 @@ import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBu name = "apple_toolchain", doc = "Utilities for resolving items from the Apple toolchain." ) +@Immutable public class AppleToolchain { // These next two strings are shared secrets with the xcrunwrapper.sh to allow diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java b/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java index ac5e80fd76..9bdb5a8649 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java @@ -20,6 +20,7 @@ import com.google.common.base.Strings; import com.google.common.collect.ComparisonChain; import com.google.common.collect.ImmutableList; import com.google.common.collect.Ordering; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; @@ -67,9 +68,10 @@ import java.util.regex.Pattern; name = "DottedVersion", category = SkylarkModuleCategory.NONE, doc = - "A value representing a version with multiple components, seperated by periods, such as " + "A value representing a version with multiple components, separated by periods, such as " + "1.2.3.4." ) +@Immutable public final class DottedVersion implements Comparable<DottedVersion> { private static final Splitter DOT_SPLITTER = Splitter.on('.'); private static final Pattern COMPONENT_PATTERN = Pattern.compile("(\\d+)(?:([a-z]+)(\\d*))?"); diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java b/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java index b5836ae270..0f1db252c5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.apple; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.ClassObjectConstructor; import com.google.devtools.build.lib.packages.NativeClassObjectConstructor; import com.google.devtools.build.lib.packages.SkylarkClassObject; @@ -32,6 +33,7 @@ import javax.annotation.Nullable; category = SkylarkModuleCategory.NONE, doc = "Distinguishes between various apple platforms." ) +@Immutable public enum Platform { IOS_DEVICE("ios_device", "iPhoneOS", PlatformType.IOS, true), @@ -202,6 +204,7 @@ public enum Platform { category = SkylarkModuleCategory.NONE, doc = "Describes Apple platform \"type\", such as iOS, tvOS, macOS etc." ) + @Immutable public enum PlatformType { IOS("ios"), WATCHOS("watchos"), 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 843a72c932..54e8d6457c 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 @@ -381,7 +381,7 @@ public class CppConfiguration extends BuildConfiguration.Fragment { private final PathFragment sysroot; private final PathFragment runtimeSysroot; - private final List<PathFragment> builtInIncludeDirectories; + private final ImmutableList<PathFragment> builtInIncludeDirectories; private final Map<String, PathFragment> toolPaths; private final PathFragment ldExecutable; @@ -1433,7 +1433,7 @@ public class CppConfiguration extends BuildConfiguration.Fragment { doc = "Built-in system include paths for the toolchain compiler. All paths in this list" + " should be relative to the exec directory. They may be absolute if they are also installed" + " on the remote build nodes or for local compilation.") - public List<PathFragment> getBuiltInIncludeDirectories() { + public ImmutableList<PathFragment> getBuiltInIncludeDirectories() { return builtInIncludeDirectories; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java index c5fc21b21e..7c3c11e871 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java @@ -106,17 +106,17 @@ public final class JavaRuleOutputJarsProvider implements TransitiveInfoProvider } } - final Iterable<OutputJar> outputJars; + final ImmutableList<OutputJar> outputJars; @Nullable final Artifact jdeps; - private JavaRuleOutputJarsProvider(Iterable<OutputJar> outputJars, + private JavaRuleOutputJarsProvider(ImmutableList<OutputJar> outputJars, @Nullable Artifact jdeps) { this.outputJars = outputJars; this.jdeps = jdeps; } @SkylarkCallable(name = "jars", doc = "A list of jars the rule outputs.", structField = true) - public Iterable<OutputJar> getOutputJars() { + public ImmutableList<OutputJar> getOutputJars() { return outputJars; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java index 99bc20e7d7..774907a61e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java @@ -254,7 +254,7 @@ public class JavaSkylarkCommon { @Param(name = "java_toolchain_attr", positional = false, named = true, type = String.class) } ) - public static List<String> getDefaultJavacOpts( + public static ImmutableList<String> getDefaultJavacOpts( SkylarkRuleContext skylarkRuleContext, String javaToolchainAttr) throws EvalException { RuleContext ruleContext = skylarkRuleContext.getRuleContext(); ConfiguredTarget javaToolchainConfigTarget = diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoSkylarkCommon.java index f4cbfb9b5e..710218f164 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoSkylarkCommon.java @@ -33,7 +33,6 @@ import com.google.devtools.build.lib.skylarkinterface.Param; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.syntax.EvalException; -import java.util.List; /** * A class that exposes Java common methods for proto compilation. @@ -137,7 +136,7 @@ public class JavaProtoSkylarkCommon { } ) // TODO(elenairina): Consider a nicer way of returning this, taking in a JavaToolchainProvider. - public static List<String> getJavacOpts( + public static ImmutableList<String> getJavacOpts( SkylarkRuleContext skylarkRuleContext, String javaToolchainAttr) throws EvalException { ConfiguredTarget javaToolchainConfigTarget = (ConfiguredTarget) checkNotNull(skylarkRuleContext.getAttr().getValue(javaToolchainAttr)); |