Add simpler Starlark interface for creating strict_deps
This is in preparation for removing the old interface. The old
interface requires that user create an ObjcProvider that is then
passed as a "direct_dep_providers" to create another ObjcProvider.
Now that we only support one kind of strict_deps, we don't need the
generality that this interface provides us. The old interface also
relies on the ObjcProvider compile info API that we are in the process
of obsoleting.
RELNOTES: None
PiperOrigin-RevId: 301247927
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 10a327e..42b3761 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
@@ -63,8 +63,9 @@
ApplePlatform> {
@VisibleForTesting
- public static final String BAD_KEY_ERROR = "Argument %s not a recognized key, 'providers',"
- + " or 'direct_dep_providers'.";
+ public static final String BAD_KEY_ERROR =
+ "Argument %s not a recognized key,"
+ + " 'strict_include', 'providers', or 'direct_dep_providers'.";
@VisibleForTesting
public static final String BAD_SET_TYPE_ERROR =
@@ -200,6 +201,8 @@
Key<?> key = ObjcProvider.getSkylarkKeyForString((String) entry.getKey());
if (key != null) {
resultBuilder.addElementsFromSkylark(key, entry.getValue());
+ } else if (entry.getKey().equals("strict_include")) {
+ resultBuilder.addStrictIncludeFromSkylark(entry.getValue());
} else if (entry.getKey().equals("providers")) {
resultBuilder.addProvidersFromSkylark(entry.getValue());
} else if (entry.getKey().equals("direct_dep_providers")) {
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 1487259..3d1f189 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
@@ -1124,7 +1124,7 @@
return this;
}
- Builder addStrictDependencyIncludes(Iterable<PathFragment> includes) {
+ protected Builder addStrictDependencyIncludes(Iterable<PathFragment> includes) {
strictDependencyIncludes.addAll(includes);
return this;
}
@@ -1295,6 +1295,19 @@
}
}
+ /**
+ * Adds the given strict include paths from skylark. An error is thrown if skylarkToAdd is not
+ * an appropriate Depset.
+ */
+ @SuppressWarnings("unchecked")
+ void addStrictIncludeFromSkylark(Object skylarkToAdd) throws EvalException {
+ NestedSet<PathFragment> toAdd =
+ (NestedSet<PathFragment>)
+ ObjcProviderSkylarkConverters.convertToJava(INCLUDE, skylarkToAdd);
+
+ addStrictDependencyIncludes(toAdd.toList());
+ }
+
@Override
public ObjcProvider build() {
return build(ccCompilationContextBuilder.build());
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 eee81ce..4b8cb62 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
@@ -1226,6 +1226,32 @@
}
@Test
+ public void testSkylarkCanCreateObjcProviderWithStrictDepsDirectly() throws Exception {
+ ConfiguredTarget skylarkTarget =
+ createObjcProviderSkylarkTarget(
+ " strict_includes = depset(['path'])",
+ " created_provider = apple_common.new_objc_provider\\",
+ "(strict_include=strict_includes)",
+ " return [created_provider]");
+
+ ObjcProvider skylarkProvider = skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR);
+ assertThat(skylarkProvider.getStrictDependencyIncludes())
+ .containsExactly(PathFragment.create("path"));
+
+ scratch.file(
+ "examples/objc_skylark2/BUILD",
+ "objc_library(",
+ " name = 'direct_dep',",
+ " deps = ['//examples/objc_skylark:my_target']",
+ ")");
+
+ ObjcProvider skylarkProviderDirectDepender =
+ getConfiguredTarget("//examples/objc_skylark2:direct_dep")
+ .get(ObjcProvider.SKYLARK_CONSTRUCTOR);
+ assertThat(skylarkProviderDirectDepender.getStrictDependencyIncludes()).isEmpty();
+ }
+
+ @Test
public void testSkylarkStrictDepsDoesNotSupportDefine() throws Exception {
AssertionError e =
assertThrows(