diff options
author | 2018-03-28 08:51:32 -0700 | |
---|---|---|
committer | 2018-03-28 08:53:10 -0700 | |
commit | f6d2881825f8b42331263abfa47da9ebe5f951ba (patch) | |
tree | e0d6ee28af39489e3a865ced2a7dc1f7dd60ca13 | |
parent | 3a61eb654b2ee4da0a1a749ec48adbc06aa42aee (diff) |
Make deprecated ObjcProvider fields return empty sets when --incompatible_disable_objc_provider_resources is true.
This involves propagating SkylarkSemantics to all ObjcProvider constructors.
RELNOTES: Introduce --incompatible_disable_objc_provider_resources to turn off all resource-related fields of the Objc provider.
PiperOrigin-RevId: 190778491
14 files changed, 147 insertions, 43 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java index 4150d8ec52..9b6c5ae54c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java @@ -179,7 +179,8 @@ public class AppleBinary implements RuleConfiguredTargetFactory { outputArtifact, platform); - ObjcProvider.Builder objcProviderBuilder = new ObjcProvider.Builder(); + ObjcProvider.Builder objcProviderBuilder = + new ObjcProvider.Builder(ruleContext.getAnalysisEnvironment().getSkylarkSemantics()); for (DependencySpecificConfiguration dependencySpecificConfiguration : dependencySpecificConfigurations) { objcProviderBuilder.addTransitiveAndPropagate( diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java index 921f398560..b4c07e32fd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java @@ -377,7 +377,7 @@ public class AppleSkylarkCommon { Environment environment) { boolean disableObjcResourceKeys = environment.getSemantics().incompatibleDisableObjcProviderResources(); - ObjcProvider.Builder resultBuilder = new ObjcProvider.Builder(); + ObjcProvider.Builder resultBuilder = new ObjcProvider.Builder(environment.getSemantics()); if (usesSwift) { resultBuilder.add(ObjcProvider.FLAG, ObjcProvider.Flag.USES_SWIFT); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java index 98b764baff..30f6c1e428 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java @@ -102,7 +102,8 @@ public class AppleStaticLibrary implements RuleConfiguredTargetFactory { NestedSetBuilder.<Artifact>stableOrder() .add(ruleIntermediateArtifacts.combinedArchitectureArchive()); - ObjcProvider.Builder objcProviderBuilder = new ObjcProvider.Builder(); + ObjcProvider.Builder objcProviderBuilder = + new ObjcProvider.Builder(ruleContext.getAnalysisEnvironment().getSkylarkSemantics()); ImmutableListMultimap<BuildConfiguration, ObjcProtoProvider> objcProtoProvidersMap = ruleContext.getPrerequisitesByConfiguration("deps", Mode.SPLIT, @@ -209,7 +210,7 @@ public class AppleStaticLibrary implements RuleConfiguredTargetFactory { BuildConfiguration buildConfiguration, IntermediateArtifacts intermediateArtifacts, List<ConfiguredTargetAndData> propagatedConfigredTargetAndTargetDeps, - Optional<ObjcProvider> protosObjcProvider) { + Optional<ObjcProvider> protosObjcProvider) throws InterruptedException { CompilationArtifacts compilationArtifacts = new CompilationArtifacts.Builder().build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java index e72b47c3a8..184d4e4ba4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java @@ -126,7 +126,8 @@ public class AppleStubBinary implements RuleConfiguredTargetFactory { RuleConfiguredTargetBuilder targetBuilder = ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()); - ObjcProvider.Builder objcProviderBuilder = new ObjcProvider.Builder(); + ObjcProvider.Builder objcProviderBuilder = + new ObjcProvider.Builder(ruleContext.getAnalysisEnvironment().getSkylarkSemantics()); for (ObjcProvider depProvider : configurationToDepsMap.values()) { objcProviderBuilder.addTransitiveAndPropagate(depProvider); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java index 3870556daa..7f325a3016 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java @@ -787,7 +787,7 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF */ static ObjcCommon common(RuleContext ruleContext, Iterable<Artifact> transpiledSources, Iterable<Artifact> transpiledHeaders, Iterable<PathFragment> headerSearchPaths, - Iterable<Attribute> dependentAttributes) { + Iterable<Attribute> dependentAttributes) throws InterruptedException { ObjcCommon.Builder builder = new ObjcCommon.Builder(ruleContext); IntermediateArtifacts intermediateArtifacts = ObjcRuleClasses.j2objcIntermediateArtifacts(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java index 83a35b91bf..b761f53fdc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java @@ -47,7 +47,7 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory { public static final ImmutableList<String> J2OBJC_SUPPORTED_RULES = ImmutableList.of("java_import", "java_library", "proto_library"); - private ObjcCommon common(RuleContext ruleContext) { + private ObjcCommon common(RuleContext ruleContext) throws InterruptedException { return new ObjcCommon.Builder(ruleContext) .setCompilationAttributes( CompilationAttributes.Builder.fromRuleContext(ruleContext).build()) @@ -75,7 +75,7 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory { Iterable<ObjcProvider> jreDeps = ruleContext.getPrerequisites("jre_deps", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR); ObjcProvider.Builder objcProviderBuilder = - new ObjcProvider.Builder() + new ObjcProvider.Builder(ruleContext.getAnalysisEnvironment().getSkylarkSemantics()) .addTransitiveAndPropagate(jreDeps) .addTransitiveAndPropagate( ruleContext.getPrerequisites( diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java index fa1662265d..cac4fdbe49 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java @@ -301,7 +301,7 @@ public class MultiArchBinarySupport { IntermediateArtifacts intermediateArtifacts, List<ConfiguredTargetAndData> propagatedConfiguredTargetAndDataDeps, List<ObjcProvider> nonPropagatedObjcDeps, - Iterable<ObjcProvider> additionalDepProviders) { + Iterable<ObjcProvider> additionalDepProviders) throws InterruptedException { ObjcCommon.Builder commonBuilder = new ObjcCommon.Builder(ruleContext, buildConfiguration) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java index 3088b5df6b..f795cf94a9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java @@ -81,9 +81,10 @@ public class ObjcBundleLibrary implements RuleConfiguredTargetFactory { return null; } - ObjcProvider nestedBundleProvider = new ObjcProvider.Builder() - .add(NESTED_BUNDLE, bundling) - .build(); + ObjcProvider nestedBundleProvider = + new ObjcProvider.Builder(ruleContext.getAnalysisEnvironment().getSkylarkSemantics()) + .add(NESTED_BUNDLE, bundling) + .build(); return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()) .addNativeDeclaredProvider(nestedBundleProvider) @@ -119,7 +120,7 @@ public class ObjcBundleLibrary implements RuleConfiguredTargetFactory { .build(); } - private ObjcCommon common(RuleContext ruleContext) { + private ObjcCommon common(RuleContext ruleContext) throws InterruptedException { return new ObjcCommon.Builder(ruleContext) .setResourceAttributes(new ResourceAttributes(ruleContext)) .addDepObjcProviders( diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java index bb20db497c..1b1a89d527 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java @@ -73,6 +73,7 @@ import com.google.devtools.build.lib.rules.cpp.CcLinkParamsInfo; import com.google.devtools.build.lib.rules.cpp.CppFileTypes; import com.google.devtools.build.lib.rules.cpp.CppModuleMap; import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.util.FileTypeSet; import com.google.devtools.build.lib.vfs.PathFragment; @@ -143,6 +144,7 @@ public final class ObjcCommon { static class Builder { private final RuleContext context; + private final SkylarkSemantics semantics; private final BuildConfiguration buildConfiguration; private Optional<CompilationAttributes> compilationAttributes = Optional.absent(); private Optional<ResourceAttributes> resourceAttributes = Optional.absent(); @@ -172,7 +174,7 @@ public final class ObjcCommon { * Builder for {@link ObjcCommon} obtaining both attribute data and configuration data from * the given rule context. */ - Builder(RuleContext context) { + Builder(RuleContext context) throws InterruptedException { this(context, context.getConfiguration()); } @@ -181,8 +183,10 @@ public final class ObjcCommon { * configuration data from the given configuration object for use in situations where a single * target's outputs are under multiple configurations. */ - Builder(RuleContext context, BuildConfiguration buildConfiguration) { + Builder(RuleContext context, BuildConfiguration buildConfiguration) + throws InterruptedException { this.context = Preconditions.checkNotNull(context); + this.semantics = context.getAnalysisEnvironment().getSkylarkSemantics(); this.buildConfiguration = Preconditions.checkNotNull(buildConfiguration); } @@ -394,7 +398,7 @@ public final class ObjcCommon { Iterable<BundleableFile> bundleImports = BundleableFile.bundleImportsFromRule(context); ObjcProvider.Builder objcProvider = - new ObjcProvider.Builder() + new ObjcProvider.Builder(semantics) .addAll(IMPORTED_LIBRARY, extraImportLibraries) .addAll(BUNDLE_FILE, bundleImports) .addAll(SDK_FRAMEWORK, extraSdkFrameworks) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java index 23b468476b..323de180cd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java @@ -39,7 +39,7 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { /** * Constructs an {@link ObjcCommon} instance based on the attributes of the given rule context. */ - private ObjcCommon common(RuleContext ruleContext) { + private ObjcCommon common(RuleContext ruleContext) throws InterruptedException { return new ObjcCommon.Builder(ruleContext) .setCompilationAttributes( CompilationAttributes.Builder.fromRuleContext(ruleContext).build()) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java index 1cc56aeefc..648be7e6be 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java @@ -42,6 +42,7 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; import com.google.devtools.build.lib.syntax.EvalUtils; import com.google.devtools.build.lib.syntax.SkylarkNestedSet; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.HashMap; import java.util.HashSet; @@ -364,6 +365,7 @@ public final class ObjcProvider extends NativeInfo { HAS_WATCH2_EXTENSION, } + private final SkylarkSemantics semantics; private final ImmutableMap<Key<?>, NestedSet<?>> items; // Items which should not be propagated to dependents. @@ -832,10 +834,12 @@ public final class ObjcProvider extends NativeInfo { public static final NativeProvider<ObjcProvider> SKYLARK_CONSTRUCTOR = new Constructor(); private ObjcProvider( + SkylarkSemantics semantics, ImmutableMap<Key<?>, NestedSet<?>> items, ImmutableMap<Key<?>, NestedSet<?>> nonPropagatedItems, ImmutableMap<Key<?>, NestedSet<?>> strictDependencyItems) { super(SKYLARK_CONSTRUCTOR); + this.semantics = semantics; this.items = Preconditions.checkNotNull(items); this.nonPropagatedItems = Preconditions.checkNotNull(nonPropagatedItems); this.strictDependencyItems = Preconditions.checkNotNull(strictDependencyItems); @@ -848,6 +852,10 @@ public final class ObjcProvider extends NativeInfo { public <E> NestedSet<E> get(Key<E> key) { Preconditions.checkNotNull(key); NestedSetBuilder<E> builder = new NestedSetBuilder<>(key.order); + if (semantics.incompatibleDisableObjcProviderResources() + && ObjcProvider.isDeprecatedResourceKey(key)) { + return builder.build(); + } if (strictDependencyItems.containsKey(key)) { builder.addTransitive((NestedSet<E>) strictDependencyItems.get(key)); } @@ -959,7 +967,7 @@ public final class ObjcProvider extends NativeInfo { avoidLibrariesSet.add(libraryToAvoid.getRunfilesPath()); } } - ObjcProvider.Builder objcProviderBuilder = new ObjcProvider.Builder(); + ObjcProvider.Builder objcProviderBuilder = new ObjcProvider.Builder(semantics); for (Key<?> key : getValuedKeys()) { if (key == CC_LIBRARY) { addTransitiveAndFilter(objcProviderBuilder, CC_LIBRARY, @@ -1075,10 +1083,15 @@ public final class ObjcProvider extends NativeInfo { * several transitive dependencies. */ public static final class Builder { + private final SkylarkSemantics skylarkSemantics; private final Map<Key<?>, NestedSetBuilder<?>> items = new HashMap<>(); private final Map<Key<?>, NestedSetBuilder<?>> nonPropagatedItems = new HashMap<>(); private final Map<Key<?>, NestedSetBuilder<?>> strictDependencyItems = new HashMap<>(); + public Builder(SkylarkSemantics semantics) { + this.skylarkSemantics = semantics; + } + private static void maybeAddEmptyBuilder(Map<Key<?>, NestedSetBuilder<?>> set, Key<?> key) { set.computeIfAbsent(key, k -> new NestedSetBuilder<>(k.order)); } @@ -1328,7 +1341,8 @@ public final class ObjcProvider extends NativeInfo { strictDependencyBuilder.put(typeEntry.getKey(), typeEntry.getValue().build()); } - return new ObjcProvider(propagatedBuilder.build(), nonPropagatedBuilder.build(), + return new ObjcProvider(skylarkSemantics, + propagatedBuilder.build(), nonPropagatedBuilder.build(), strictDependencyBuilder.build()); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java index 3ae8e83d10..89de32a4e6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java @@ -253,7 +253,7 @@ final class ProtobufSupport { * Returns the ObjcProvider for this target, or Optional.absent() if there were no protos to * generate. */ - public Optional<ObjcProvider> getObjcProvider() { + public Optional<ObjcProvider> getObjcProvider() throws InterruptedException { if (inputsToOutputsMap.isEmpty()) { return Optional.absent(); } @@ -398,7 +398,8 @@ final class ProtobufSupport { } private ObjcCommon getCommon( - IntermediateArtifacts intermediateArtifacts, CompilationArtifacts compilationArtifacts) { + IntermediateArtifacts intermediateArtifacts, CompilationArtifacts compilationArtifacts) + throws InterruptedException { ObjcCommon.Builder commonBuilder = new ObjcCommon.Builder(ruleContext) .setIntermediateArtifacts(intermediateArtifacts) diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java index 0996bb4318..5c1f6b7ba5 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertWithMessage; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.build.lib.vfs.PathFragment; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -33,15 +34,19 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class ObjcProviderTest { + private static ObjcProvider.Builder objcProviderBuilder() { + return new ObjcProvider.Builder(SkylarkSemantics.DEFAULT_SEMANTICS); + } + @Test public void emptyProvider() { - ObjcProvider empty = new ObjcProvider.Builder().build(); + ObjcProvider empty = objcProviderBuilder().build(); assertThat(empty.get(ObjcProvider.SDK_DYLIB)).isEmpty(); } @Test public void onlyPropagatesProvider() { - ObjcProvider onlyPropagates = new ObjcProvider.Builder() + ObjcProvider onlyPropagates = objcProviderBuilder() .add(ObjcProvider.SDK_DYLIB, "foo") .build(); assertThat(onlyPropagates.get(ObjcProvider.SDK_DYLIB)).containsExactly("foo"); @@ -49,10 +54,10 @@ public class ObjcProviderTest { @Test public void onlyNonPropagatesProvider() { - ObjcProvider dep = new ObjcProvider.Builder() + ObjcProvider dep = objcProviderBuilder() .add(ObjcProvider.SDK_DYLIB, "foo") .build(); - ObjcProvider notPropagates = new ObjcProvider.Builder() + ObjcProvider notPropagates = objcProviderBuilder() .addTransitiveWithoutPropagating(ImmutableList.of(dep)) .build(); assertThat(notPropagates.get(ObjcProvider.SDK_DYLIB)).containsExactly("foo"); @@ -60,10 +65,10 @@ public class ObjcProviderTest { @Test public void propagatesAndNonPropagatesProvider() { - ObjcProvider dep = new ObjcProvider.Builder() + ObjcProvider dep = objcProviderBuilder() .add(ObjcProvider.SDK_DYLIB, "foo") .build(); - ObjcProvider provider = new ObjcProvider.Builder() + ObjcProvider provider = objcProviderBuilder() .addTransitiveWithoutPropagating(ImmutableList.of(dep)) .add(ObjcProvider.SDK_DYLIB, "bar") .build(); @@ -72,14 +77,14 @@ public class ObjcProviderTest { @Test public void doesNotPropagate() { - ObjcProvider dep = new ObjcProvider.Builder() + ObjcProvider dep = objcProviderBuilder() .add(ObjcProvider.SDK_DYLIB, "foo") .build(); - ObjcProvider provider = new ObjcProvider.Builder() + ObjcProvider provider = objcProviderBuilder() .addTransitiveWithoutPropagating(ImmutableList.of(dep)) .add(ObjcProvider.SDK_DYLIB, "bar") .build(); - ObjcProvider depender = new ObjcProvider.Builder() + ObjcProvider depender = objcProviderBuilder() .addTransitiveAndPropagate(provider) .build(); assertThat(depender.get(ObjcProvider.SDK_DYLIB)).containsExactly("bar"); @@ -91,17 +96,17 @@ public class ObjcProviderTest { PathFragment propagatedInclude = PathFragment.create("propagated_path"); ObjcProvider strictDep = - new ObjcProvider.Builder() + objcProviderBuilder() .addForDirectDependents(ObjcProvider.INCLUDE, strictInclude) .build(); ObjcProvider propagatedDep = - new ObjcProvider.Builder().add(ObjcProvider.INCLUDE, propagatedInclude).build(); + objcProviderBuilder().add(ObjcProvider.INCLUDE, propagatedInclude).build(); ObjcProvider provider = - new ObjcProvider.Builder() + objcProviderBuilder() .addTransitiveAndPropagate(ImmutableList.of(strictDep, propagatedDep)) .build(); - ObjcProvider depender = new ObjcProvider.Builder().addTransitiveAndPropagate(provider).build(); + ObjcProvider depender = objcProviderBuilder().addTransitiveAndPropagate(provider).build(); assertThat(provider.get(ObjcProvider.INCLUDE)) .containsExactly(strictInclude, propagatedInclude); @@ -114,17 +119,17 @@ public class ObjcProviderTest { PathFragment propagatedInclude = PathFragment.create("propagated_path"); ObjcProvider strictDep = - new ObjcProvider.Builder() + objcProviderBuilder() .addForDirectDependents(ObjcProvider.INCLUDE, strictInclude) .build(); ObjcProvider propagatedDep = - new ObjcProvider.Builder().add(ObjcProvider.INCLUDE, propagatedInclude).build(); + objcProviderBuilder().add(ObjcProvider.INCLUDE, propagatedInclude).build(); ObjcProvider provider = - new ObjcProvider.Builder() + objcProviderBuilder() .addTransitiveAndPropagate(ImmutableList.of(strictDep, propagatedDep)) .build(); - ObjcProvider depender = new ObjcProvider.Builder().addTransitiveAndPropagate(provider).build(); + ObjcProvider depender = objcProviderBuilder().addTransitiveAndPropagate(provider).build(); assertThat(provider.include().toCollection()) .containsExactly(strictInclude.toString(), propagatedInclude.toString()); diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java index 20a32ce795..7a63720693 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.apple.DottedVersion; import com.google.devtools.build.lib.syntax.SkylarkDict; import com.google.devtools.build.lib.syntax.SkylarkNestedSet; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.List; import org.junit.Test; @@ -41,6 +42,10 @@ import org.junit.runners.JUnit4; */ @RunWith(JUnit4.class) public class ObjcSkylarkTest extends ObjcRuleTestCase { + private static ObjcProvider.Builder objcProviderBuilder() { + return new ObjcProvider.Builder(SkylarkSemantics.DEFAULT_SEMANTICS); + } + @Test public void testSkylarkRuleCanDependOnNativeAppleRule() throws Exception { scratch.file("examples/rule/BUILD"); @@ -855,9 +860,9 @@ public class ObjcSkylarkTest extends ObjcRuleTestCase { ObjcProvider skylarkProvider = skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR); ObjcProvider skylarkProviderDirectDepender = - new ObjcProvider.Builder().addTransitiveAndPropagate(skylarkProvider).build(); - ObjcProvider skylarkProviderIndirectDepender = - new ObjcProvider.Builder().addTransitiveAndPropagate(skylarkProviderDirectDepender).build(); + objcProviderBuilder().addTransitiveAndPropagate(skylarkProvider).build(); + ObjcProvider skylarkProviderIndirectDepender = + objcProviderBuilder().addTransitiveAndPropagate(skylarkProviderDirectDepender).build(); assertThat(skylarkProvider.get(ObjcProvider.INCLUDE)) .containsExactly(PathFragment.create("path1"), PathFragment.create("path2")); @@ -1347,7 +1352,7 @@ public class ObjcSkylarkTest extends ObjcRuleTestCase { } @Test - public void testDisableObjcProviderResources() throws Exception { + public void testDisableObjcProviderResourcesWrite() throws Exception { scratch.file("examples/rule/BUILD"); scratch.file( "examples/rule/apple_rules.bzl", @@ -1378,7 +1383,7 @@ public class ObjcSkylarkTest extends ObjcRuleTestCase { } @Test - public void testEnabledObjcProviderResources() throws Exception { + public void testEnabledObjcProviderResourcesWrite() throws Exception { scratch.file("examples/rule/BUILD"); scratch.file( "examples/rule/apple_rules.bzl", @@ -1406,6 +1411,77 @@ public class ObjcSkylarkTest extends ObjcRuleTestCase { assertThat(objcProvider.get(ObjcProvider.XIB)).isNotNull(); } + @Test + public void testDisableObjcProviderResourcesRead() throws Exception { + scratch.file("examples/rule/BUILD"); + scratch.file( + "examples/rule/apple_rules.bzl", + "def my_rule_impl(ctx):", + " dep = ctx.attr.deps[0]", + " objc_provider = dep[apple_common.Objc]", + " return struct(strings=str(objc_provider.strings))", + "my_rule = rule(implementation = my_rule_impl,", + " attrs = {", + " 'deps': attr.label_list(providers = ['objc'])})"); + + scratch.file("examples/apple_skylark/foo.strings"); + scratch.file("examples/apple_skylark/bar.a"); + scratch.file( + "examples/apple_skylark/BUILD", + "package(default_visibility = ['//visibility:public'])", + "load('//examples/rule:apple_rules.bzl', 'my_rule')", + "my_rule(", + " name='my_target',", + " deps=[':bundle_lib'],", + ")", + "objc_import(", + " name='bundle_lib',", + " archives = ['bar.a'],", + " strings=['foo.strings'],", + ")"); + + setSkylarkSemanticsOptions("--incompatible_disable_objc_provider_resources=true"); + ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target"); + + assertThat(skylarkTarget.get("strings")).isEqualTo("depset([])"); + } + + @Test + public void testEnabledObjcProviderResourcesRead() throws Exception { + scratch.file("examples/rule/BUILD"); + scratch.file( + "examples/rule/apple_rules.bzl", + "def my_rule_impl(ctx):", + " dep = ctx.attr.deps[0]", + " objc_provider = dep[apple_common.Objc]", + " return struct(strings=str(objc_provider.strings))", + "my_rule = rule(implementation = my_rule_impl,", + " attrs = {", + " 'deps': attr.label_list(providers = ['objc'])})"); + + scratch.file("examples/apple_skylark/foo.strings"); + scratch.file("examples/apple_skylark/bar.a"); + scratch.file( + "examples/apple_skylark/BUILD", + "package(default_visibility = ['//visibility:public'])", + "load('//examples/rule:apple_rules.bzl', 'my_rule')", + "my_rule(", + " name='my_target',", + " deps=[':bundle_lib'],", + ")", + "objc_import(", + " name='bundle_lib',", + " archives = ['bar.a'],", + " strings=['foo.strings'],", + ")"); + + setSkylarkSemanticsOptions("--incompatible_disable_objc_provider_resources=false"); + ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target"); + + assertThat(skylarkTarget.get("strings")) + .isEqualTo("depset([<source file examples/apple_skylark/foo.strings>])"); + } + private void checkSkylarkRunMemleaksWithExpectedValue(boolean expectedValue) throws Exception { scratch.file("examples/rule/BUILD"); scratch.file( |