Skip to content

Commit ae349e9

Browse files
kotlajacopybara-github
authored andcommittedMay 3, 2022
Export ProtoLangToolchainInfo provider and flip proto_lang_toolchain rule
I’ve exported ProtoLangToolchainInfo provider from it’s native class by adding two new functions: one that’s creating starlark provider (create function), and the other that’s wrapping the starlark provider as a native one (get function). Also, in all locations where native ProtoLangToolchainInfo provider was used/created, I’ve modified it with previously mentioned functions. I’ve also replaced native ProtoLangToolchainTest with the starlark one, in the same file. PiperOrigin-RevId: 446142771
1 parent 22e9d5c commit ae349e9

20 files changed

+244
-386
lines changed
 

‎src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java

-3
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@
112112
import com.google.devtools.build.lib.rules.proto.BazelProtoLibraryRule;
113113
import com.google.devtools.build.lib.rules.proto.ProtoConfiguration;
114114
import com.google.devtools.build.lib.rules.proto.ProtoInfo;
115-
import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider;
116115
import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainRule;
117116
import com.google.devtools.build.lib.rules.python.PyInfo;
118117
import com.google.devtools.build.lib.rules.python.PyRuleClasses.PySymlink;
@@ -292,8 +291,6 @@ public void init(ConfiguredRuleClassProvider.Builder builder) {
292291
new StarlarkAspectStub(),
293292
new ProviderStub());
294293
builder.addStarlarkBootstrap(bootstrap);
295-
builder.addStarlarkBuiltinsInternal(
296-
"ProtoLangToolchainInfo", ProtoLangToolchainProvider.PROVIDER);
297294
}
298295

299296
@Override

‎src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment envi
5656
.aspect(javaProtoAspect))
5757
.add(
5858
attr(JavaProtoAspectCommon.LITE_PROTO_TOOLCHAIN_ATTR, LABEL)
59-
.mandatoryProviders(ProtoLangToolchainProvider.PROVIDER.id())
59+
.mandatoryProviders(ProtoLangToolchainProvider.PROVIDER_ID)
6060
.value(getProtoToolchainLabel(DEFAULT_PROTO_TOOLCHAIN_LABEL)))
6161
.advertiseStarlarkProvider(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
6262
.build();

‎src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaProtoAspect.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
import com.google.devtools.build.lib.bazel.rules.java.BazelJavaSemantics;
2626
import com.google.devtools.build.lib.packages.AspectDefinition;
2727
import com.google.devtools.build.lib.packages.AspectParameters;
28+
import com.google.devtools.build.lib.packages.StarlarkInfo;
2829
import com.google.devtools.build.lib.rules.java.proto.JavaProtoAspect;
2930
import com.google.devtools.build.lib.rules.java.proto.RpcSupport;
30-
import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider;
3131

3232
/** An Aspect which BazelJavaProtoLibrary injects to build Java SPEED protos. */
3333
public class BazelJavaProtoAspect extends JavaProtoAspect {
@@ -56,7 +56,7 @@ public boolean allowServices(RuleContext ruleContext) {
5656
}
5757

5858
@Override
59-
public Optional<ProtoLangToolchainProvider> getToolchain(RuleContext ruleContext) {
59+
public Optional<StarlarkInfo> getToolchain(RuleContext ruleContext) {
6060
return Optional.absent();
6161
}
6262

‎src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public AspectDefinition getDefinition(AspectParameters params) {
186186
ImmutableList.of(
187187
// For proto_lang_toolchain rules, where we just want to get at their runtime
188188
// deps.
189-
ImmutableSet.of(ProtoLangToolchainProvider.PROVIDER.id())))
189+
ImmutableSet.of(ProtoLangToolchainProvider.PROVIDER_ID)))
190190
.addToolchainTypes(
191191
ToolchainTypeRequirement.create(
192192
Label.parseAbsoluteUnchecked(toolsRepository + sdkToolchainLabel)))
@@ -407,7 +407,7 @@ private static Iterable<Artifact> getProducedRuntimeJars(
407407

408408
Artifact rJar = getAndroidLibraryRJar(base);
409409
if (rJar != null) {
410-
jars.add(rJar);
410+
jars.add(rJar);
411411
}
412412

413413
Artifact buildStampJar = getAndroidBuildStampJar(base);
@@ -482,9 +482,7 @@ private static NestedSet<Artifact> getBootclasspath(
482482
return NestedSetBuilder.<Artifact>naiveLinkOrder()
483483
.add(
484484
ruleContext
485-
.getPrerequisite(
486-
":dex_archive_android_sdk",
487-
AndroidSdkProvider.PROVIDER)
485+
.getPrerequisite(":dex_archive_android_sdk", AndroidSdkProvider.PROVIDER)
488486
.getAndroidJar())
489487
.build();
490488
}

‎src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java

+9-4
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault;
4444
import com.google.devtools.build.lib.packages.NativeAspectClass;
4545
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
46+
import com.google.devtools.build.lib.packages.StarlarkInfo;
4647
import com.google.devtools.build.lib.packages.TargetUtils;
4748
import com.google.devtools.build.lib.rules.cpp.AspectLegalCppSemantics;
4849
import com.google.devtools.build.lib.rules.cpp.CcCommon;
@@ -129,7 +130,7 @@ public AspectDefinition getDefinition(AspectParameters aspectParameters) {
129130
.useToolchainTransition(true)
130131
.add(
131132
attr(PROTO_TOOLCHAIN_ATTR, LABEL)
132-
.mandatoryProviders(ProtoLangToolchainProvider.PROVIDER.id())
133+
.mandatoryProviders(ProtoLangToolchainProvider.PROVIDER_ID)
133134
.value(PROTO_TOOLCHAIN_LABEL))
134135
.add(
135136
attr(CcToolchain.CC_TOOLCHAIN_DEFAULT_ATTRIBUTE_NAME, LABEL)
@@ -288,7 +289,7 @@ private static void checkProtoLibrariesInDeps(
288289

289290
private boolean areSrcsExcluded() throws RuleErrorException, InterruptedException {
290291
return !ProtoCommon.shouldGenerateCode(
291-
ruleContext, protoTarget, getProtoToolchainProvider(), "cc_proto_library");
292+
ruleContext, protoTarget, getStarlarkProtoToolchainProvider(), "cc_proto_library");
292293
}
293294

294295
private FeatureConfiguration getFeatureConfiguration()
@@ -461,15 +462,19 @@ private void createProtoCompileAction(Collection<Artifact> outputs)
461462
ProtoCommon.compile(
462463
ruleContext,
463464
protoTarget,
464-
getProtoToolchainProvider(),
465+
getStarlarkProtoToolchainProvider(),
465466
outputs,
466467
genfilesPath,
467468
"Generating C++ proto_library %{label}");
468469
}
469470
}
470471

471472
private ProtoLangToolchainProvider getProtoToolchainProvider() {
472-
return ruleContext.getPrerequisite(PROTO_TOOLCHAIN_ATTR, ProtoLangToolchainProvider.PROVIDER);
473+
return ProtoLangToolchainProvider.get(ruleContext, PROTO_TOOLCHAIN_ATTR);
474+
}
475+
476+
private StarlarkInfo getStarlarkProtoToolchainProvider() {
477+
return ProtoLangToolchainProvider.getStarlarkProvider(ruleContext, PROTO_TOOLCHAIN_ATTR);
473478
}
474479

475480
public void addProviders(ConfiguredAspect.Builder builder) {

‎src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public AspectDefinition getDefinition(AspectParameters aspectParameters) {
116116
ImmutableList.of(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))
117117
.add(
118118
attr(JavaProtoAspectCommon.LITE_PROTO_TOOLCHAIN_ATTR, LABEL)
119-
.mandatoryProviders(ProtoLangToolchainProvider.PROVIDER.id())
119+
.mandatoryProviders(ProtoLangToolchainProvider.PROVIDER_ID)
120120
.value(getProtoToolchainLabel(defaultProtoToolchainLabel)))
121121
.add(
122122
attr(JavaRuleClasses.JAVA_TOOLCHAIN_ATTRIBUTE_NAME, LABEL)
@@ -245,7 +245,7 @@ private void createProtoCompileAction(Artifact sourceJar)
245245
ProtoCommon.compile(
246246
ruleContext,
247247
protoTarget,
248-
aspectCommon.getProtoToolchainProvider(),
248+
aspectCommon.getStarlarkProtoToolchainProvider(),
249249
ImmutableList.of(sourceJar),
250250
sourceJar.getExecPathString(),
251251
"Generating JavaLite proto_library %{label}");

‎src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ void addProviders(ConfiguredAspect.Builder aspect)
224224
if (ProtoCommon.shouldGenerateCode(
225225
ruleContext,
226226
protoTarget,
227-
aspectCommon.getProtoToolchainProvider(),
227+
aspectCommon.getStarlarkProtoToolchainProvider(),
228228
"java_proto_library")) {
229229
Artifact sourceJar = aspectCommon.getSourceJarArtifact();
230230
createProtoCompileAction(sourceJar);
@@ -320,7 +320,7 @@ private void createProtoCompileAction(Artifact sourceJar)
320320
ProtoCommon.compile(
321321
ruleContext,
322322
protoTarget,
323-
aspectCommon.getProtoToolchainProvider(),
323+
aspectCommon.getStarlarkProtoToolchainProvider(),
324324
ImmutableList.of(sourceJar),
325325
/* pluginOutput= */ null,
326326
additionalArgs,

‎src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspectCommon.java

+12-5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
2525
import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.StrictDepsMode;
2626
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
27+
import com.google.devtools.build.lib.packages.StarlarkInfo;
2728
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
2829
import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
2930
import com.google.devtools.build.lib.rules.java.JavaInfo;
@@ -159,16 +160,22 @@ public ImmutableList<TransitiveInfoCollection> getProtoRuntimeDeps() {
159160

160161
/** Returns the toolchain that specifies how to generate code from {@code .proto} files. */
161162
public ProtoLangToolchainProvider getProtoToolchainProvider() {
163+
return checkNotNull(ProtoLangToolchainProvider.get(ruleContext, protoToolchainAttr));
164+
}
165+
166+
/**
167+
* Returns the Starlark toolchain that specifies how to generate code from {@code .proto} files.
168+
*/
169+
public StarlarkInfo getStarlarkProtoToolchainProvider() {
162170
return checkNotNull(
163-
ruleContext.getPrerequisite(protoToolchainAttr, ProtoLangToolchainProvider.PROVIDER));
171+
ProtoLangToolchainProvider.getStarlarkProvider(ruleContext, protoToolchainAttr));
164172
}
165173

166174
/**
167175
* Returns the toolchain that specifies how to generate Java-lite code from {@code .proto} files.
168176
*/
169177
static ProtoLangToolchainProvider getLiteProtoToolchainProvider(RuleContext ruleContext) {
170-
return ruleContext.getPrerequisite(
171-
LITE_PROTO_TOOLCHAIN_ATTR, ProtoLangToolchainProvider.PROVIDER);
178+
return ProtoLangToolchainProvider.get(ruleContext, LITE_PROTO_TOOLCHAIN_ATTR);
172179
}
173180

174181
/**
@@ -206,9 +213,9 @@ boolean shouldGenerateCode(ConfiguredTarget protoTarget, String ruleName)
206213

207214
boolean shouldGenerate =
208215
ProtoCommon.shouldGenerateCode(
209-
ruleContext, protoTarget, getProtoToolchainProvider(), ruleName);
216+
ruleContext, protoTarget, getStarlarkProtoToolchainProvider(), ruleName);
210217
if (rpcSupport != null) {
211-
Optional<ProtoLangToolchainProvider> toolchain = rpcSupport.getToolchain(ruleContext);
218+
Optional<StarlarkInfo> toolchain = rpcSupport.getToolchain(ruleContext);
212219
if (toolchain.isPresent()) {
213220
if (!ProtoCommon.shouldGenerateCode(ruleContext, protoTarget, toolchain.get(), ruleName)) {
214221
shouldGenerate = false;

‎src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoStarlarkCommon.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
2424
import com.google.devtools.build.lib.analysis.starlark.StarlarkRuleContext;
2525
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
26+
import com.google.devtools.build.lib.packages.StarlarkInfo;
2627
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
2728
import com.google.devtools.build.lib.rules.java.JavaInfo;
2829
import com.google.devtools.build.lib.rules.proto.ProtoCommon;
@@ -49,7 +50,7 @@ public void createProtoCompileAction(
4950
ProtoCommon.compile(
5051
starlarkRuleContext.getRuleContext(),
5152
target,
52-
getProtoToolchainProvider(starlarkRuleContext, protoToolchainAttr),
53+
getStarlarkProtoToolchainProvider(starlarkRuleContext, protoToolchainAttr),
5354
ImmutableList.of(sourceJar),
5455
sourceJar.getExecPathString(),
5556
"Generating JavaLite proto_library %{label}");
@@ -90,6 +91,13 @@ private static ProtoLangToolchainProvider getProtoToolchainProvider(
9091
StarlarkRuleContext starlarkRuleContext, String protoToolchainAttr) throws EvalException {
9192
ConfiguredTarget javaliteToolchain =
9293
(ConfiguredTarget) checkNotNull(starlarkRuleContext.getAttr().getValue(protoToolchainAttr));
93-
return checkNotNull(javaliteToolchain.get(ProtoLangToolchainProvider.PROVIDER));
94+
return checkNotNull(ProtoLangToolchainProvider.get(javaliteToolchain));
95+
}
96+
97+
private static StarlarkInfo getStarlarkProtoToolchainProvider(
98+
StarlarkRuleContext starlarkRuleContext, String protoToolchainAttr) throws EvalException {
99+
ConfiguredTarget javaliteToolchain =
100+
(ConfiguredTarget) checkNotNull(starlarkRuleContext.getAttr().getValue(protoToolchainAttr));
101+
return checkNotNull(ProtoLangToolchainProvider.getStarlarkProvider(javaliteToolchain));
94102
}
95103
}

‎src/main/java/com/google/devtools/build/lib/rules/java/proto/RpcSupport.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import com.google.devtools.build.lib.analysis.starlark.Args;
2424
import com.google.devtools.build.lib.packages.AspectDefinition;
2525
import com.google.devtools.build.lib.packages.AspectParameters;
26-
import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider;
26+
import com.google.devtools.build.lib.packages.StarlarkInfo;
2727
import net.starlark.java.eval.EvalException;
2828

2929
/** Used by java_proto_library to support Google-specific features. */
@@ -35,7 +35,7 @@ void populateAdditionalArgs(RuleContext ruleContext, Artifact sourceJar, Args ar
3535

3636
boolean allowServices(RuleContext ruleContext);
3737

38-
Optional<ProtoLangToolchainProvider> getToolchain(RuleContext ruleContext);
38+
Optional<StarlarkInfo> getToolchain(RuleContext ruleContext);
3939

4040
ImmutableList<TransitiveInfoCollection> getRuntimes(RuleContext ruleContext);
4141

‎src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import com.google.devtools.build.lib.packages.BuildType;
5353
import com.google.devtools.build.lib.packages.NativeAspectClass;
5454
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
55+
import com.google.devtools.build.lib.packages.StarlarkInfo;
5556
import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
5657
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
5758
import com.google.devtools.build.lib.rules.apple.AppleToolchain;
@@ -386,13 +387,14 @@ private ConfiguredAspect java(ConfiguredTarget base, RuleContext ruleContext)
386387
private ConfiguredAspect proto(ConfiguredTarget base, RuleContext ruleContext)
387388
throws InterruptedException, ActionConflictException {
388389
ProtoLangToolchainProvider protoToolchain =
389-
ruleContext.getPrerequisite(
390-
J2OBJC_PROTO_TOOLCHAIN_ATTR, ProtoLangToolchainProvider.PROVIDER);
391-
390+
ProtoLangToolchainProvider.get(ruleContext, J2OBJC_PROTO_TOOLCHAIN_ATTR);
391+
StarlarkInfo starlarkProtoToolchain =
392+
ProtoLangToolchainProvider.getStarlarkProvider(ruleContext, J2OBJC_PROTO_TOOLCHAIN_ATTR);
392393
try {
393394
// Avoid pulling in any generated files from forbidden protos.
394395
ImmutableList<Artifact> filteredProtoSources =
395-
ImmutableList.copyOf(ProtoCommon.filterSources(ruleContext, base, protoToolchain));
396+
ImmutableList.copyOf(
397+
ProtoCommon.filterSources(ruleContext, base, starlarkProtoToolchain));
396398

397399
J2ObjcSource j2ObjcSource = protoJ2ObjcSource(ruleContext, base, filteredProtoSources);
398400

@@ -403,7 +405,7 @@ private ConfiguredAspect proto(ConfiguredTarget base, RuleContext ruleContext)
403405

404406
directJ2ObjcMappingFileProvider =
405407
createJ2ObjcProtoCompileActions(
406-
base, protoToolchain, ruleContext, filteredProtoSources, j2ObjcSource);
408+
base, starlarkProtoToolchain, ruleContext, filteredProtoSources, j2ObjcSource);
407409
}
408410

409411
return buildAspect(
@@ -637,7 +639,7 @@ private static J2ObjcMappingFileProvider createJ2ObjcTranspilationAction(
637639

638640
private J2ObjcMappingFileProvider createJ2ObjcProtoCompileActions(
639641
ConfiguredTarget base,
640-
ProtoLangToolchainProvider protoToolchain,
642+
StarlarkInfo protoToolchain,
641643
RuleContext ruleContext,
642644
ImmutableList<Artifact> filteredProtoSources,
643645
J2ObjcSource j2ObjcSource)

‎src/main/java/com/google/devtools/build/lib/rules/proto/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ java_library(
4848
"//src/main/java/com/google/devtools/common/options",
4949
"//src/main/java/net/starlark/java/annot",
5050
"//src/main/java/net/starlark/java/eval",
51+
"//src/main/java/net/starlark/java/syntax",
5152
"//third_party:auto_value",
5253
"//third_party:guava",
5354
"//third_party:jsr305",

‎src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java

+5-6
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.google.devtools.build.lib.concurrent.BlazeInterners;
3434
import com.google.devtools.build.lib.packages.BazelModuleContext;
3535
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
36+
import com.google.devtools.build.lib.packages.StarlarkInfo;
3637
import com.google.devtools.build.lib.vfs.FileSystemUtils;
3738
import com.google.devtools.build.lib.vfs.PathFragment;
3839
import javax.annotation.Nullable;
@@ -195,7 +196,7 @@ public static ImmutableList<Artifact> declareGeneratedFilesPython(
195196
public static void compile(
196197
RuleContext ruleContext,
197198
ConfiguredTarget protoTarget,
198-
ProtoLangToolchainProvider protoLangToolchainInfo,
199+
StarlarkInfo protoLangToolchainInfo,
199200
Iterable<Artifact> generatedFiles,
200201
@Nullable Object pluginOutput,
201202
@Nullable Args additionalArgs,
@@ -229,7 +230,7 @@ public static void compile(
229230
public static void compile(
230231
RuleContext ruleContext,
231232
ConfiguredTarget protoTarget,
232-
ProtoLangToolchainProvider protoLangToolchainInfo,
233+
StarlarkInfo protoLangToolchainInfo,
233234
Iterable<Artifact> generatedFiles,
234235
@Nullable Object pluginOutput,
235236
String progressMessage)
@@ -251,7 +252,7 @@ public static void compile(
251252
public static boolean shouldGenerateCode(
252253
RuleContext ruleContext,
253254
ConfiguredTarget protoTarget,
254-
ProtoLangToolchainProvider protoLangToolchainInfo,
255+
StarlarkInfo protoLangToolchainInfo,
255256
String ruleName)
256257
throws RuleErrorException, InterruptedException {
257258
StarlarkFunction shouldGenerateCode =
@@ -269,9 +270,7 @@ public static boolean shouldGenerateCode(
269270
}
270271

271272
public static Sequence<Artifact> filterSources(
272-
RuleContext ruleContext,
273-
ConfiguredTarget protoTarget,
274-
ProtoLangToolchainProvider protoLangToolchainInfo)
273+
RuleContext ruleContext, ConfiguredTarget protoTarget, StarlarkInfo protoLangToolchainInfo)
275274
throws RuleErrorException, InterruptedException {
276275
StarlarkFunction filterSources =
277276
(StarlarkFunction)

‎src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainProvider.java

+117-61
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,23 @@
1717
import com.google.auto.value.AutoValue;
1818
import com.google.common.collect.ImmutableList;
1919
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
20+
import com.google.devtools.build.lib.analysis.RuleContext;
2021
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
21-
import com.google.devtools.build.lib.packages.BuiltinProvider;
22-
import com.google.devtools.build.lib.packages.NativeInfo;
22+
import com.google.devtools.build.lib.cmdline.Label;
23+
import com.google.devtools.build.lib.collect.nestedset.Depset;
24+
import com.google.devtools.build.lib.collect.nestedset.Depset.ElementType;
25+
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
26+
import com.google.devtools.build.lib.packages.StarlarkInfo;
27+
import com.google.devtools.build.lib.packages.StarlarkProvider;
28+
import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
29+
import java.util.LinkedHashMap;
30+
import java.util.Map;
2331
import javax.annotation.Nullable;
24-
import net.starlark.java.annot.StarlarkBuiltin;
25-
import net.starlark.java.annot.StarlarkMethod;
32+
import net.starlark.java.eval.EvalException;
33+
import net.starlark.java.eval.NoneType;
34+
import net.starlark.java.eval.Starlark;
2635
import net.starlark.java.eval.StarlarkList;
36+
import net.starlark.java.syntax.Location;
2737

2838
// Note: AutoValue v1.4-rc1 has AutoValue.CopyAnnotations which makes it work with Starlark. No need
2939
// to un-AutoValue this class to expose it to Starlark.
@@ -32,42 +42,22 @@
3242
* rules.
3343
*/
3444
@AutoValue
35-
public abstract class ProtoLangToolchainProvider extends NativeInfo {
45+
public abstract class ProtoLangToolchainProvider {
3646
public static final String PROVIDER_NAME = "ProtoLangToolchainInfo";
37-
public static final Provider PROVIDER = new Provider();
47+
public static final StarlarkProvider.Key starlarkProtoLangToolchainKey =
48+
new StarlarkProvider.Key(
49+
Label.parseAbsoluteUnchecked("@_builtins//:common/proto/providers.bzl"), PROVIDER_NAME);
50+
public static final StarlarkProviderIdentifier PROVIDER_ID =
51+
StarlarkProviderIdentifier.forKey(starlarkProtoLangToolchainKey);
3852

39-
/** Provider class for {@link ProtoLangToolchainProvider} objects. */
40-
@StarlarkBuiltin(name = "Provider", documented = false, doc = "")
41-
public static class Provider extends BuiltinProvider<ProtoLangToolchainProvider> {
42-
public Provider() {
43-
super(PROVIDER_NAME, ProtoLangToolchainProvider.class);
44-
}
45-
}
46-
47-
@Override
48-
public Provider getProvider() {
49-
return PROVIDER;
50-
}
51-
52-
@StarlarkMethod(
53-
name = "out_replacement_format_flag",
54-
doc = "Format string used when passing output to the plugin used by proto compiler.",
55-
structField = true)
53+
// Format string used when passing output to the plugin used by proto compiler.
5654
public abstract String outReplacementFormatFlag();
5755

58-
@StarlarkMethod(
59-
name = "plugin_format_flag",
60-
doc = "Format string used when passing plugin to proto compiler.",
61-
structField = true,
62-
allowReturnNones = true)
56+
// Format string used when passing plugin to proto compiler.
6357
@Nullable
6458
public abstract String pluginFormatFlag();
6559

66-
@StarlarkMethod(
67-
name = "plugin",
68-
doc = "Proto compiler plugin.",
69-
structField = true,
70-
allowReturnNones = true)
60+
// Proto compiler plugin.
7161
@Nullable
7262
public abstract FilesToRunProvider pluginExecutable();
7363

@@ -78,38 +68,26 @@ public Provider getProvider() {
7868
* Returns a list of {@link ProtoSource}s that are already provided by the protobuf runtime (i.e.
7969
* for which {@code <lang>_proto_library} should not generate bindings.
8070
*/
81-
@StarlarkMethod(
82-
name = "provided_proto_sources",
83-
doc = "Proto sources provided by the toolchain.",
84-
structField = true)
71+
// Proto sources provided by the toolchain.
8572
public abstract ImmutableList<ProtoSource> providedProtoSources();
8673

87-
@StarlarkMethod(name = "proto_compiler", doc = "Proto compiler.", structField = true)
74+
// Proto compiler.
8875
public abstract FilesToRunProvider protoc();
8976

90-
@StarlarkMethod(
91-
name = "protoc_opts",
92-
doc = "Options to pass to proto compiler.",
93-
structField = true)
77+
// Options to pass to proto compiler.
9478
public StarlarkList<String> protocOptsForStarlark() {
9579
return StarlarkList.immutableCopyOf(protocOpts());
9680
}
9781

9882
public abstract ImmutableList<String> protocOpts();
9983

100-
@StarlarkMethod(
101-
name = "progress_message",
102-
doc = "Progress message to set on the proto compiler action.",
103-
structField = true)
84+
// Progress message to set on the proto compiler action.
10485
public abstract String progressMessage();
10586

106-
@StarlarkMethod(
107-
name = "mnemonic",
108-
doc = "Mnemonic to set on the proto compiler action.",
109-
structField = true)
87+
// Mnemonic to set on the proto compiler action.
11088
public abstract String mnemonic();
11189

112-
public static ProtoLangToolchainProvider create(
90+
public static StarlarkInfo create(
11391
String outReplacementFormatFlag,
11492
String pluginFormatFlag,
11593
FilesToRunProvider pluginExecutable,
@@ -119,15 +97,93 @@ public static ProtoLangToolchainProvider create(
11997
ImmutableList<String> protocOpts,
12098
String progressMessage,
12199
String mnemonic) {
122-
return new AutoValue_ProtoLangToolchainProvider(
123-
outReplacementFormatFlag,
124-
pluginFormatFlag,
125-
pluginExecutable,
126-
runtime,
127-
providedProtoSources,
128-
protoc,
129-
protocOpts,
130-
progressMessage,
131-
mnemonic);
100+
101+
NestedSetBuilder<ProtoSource> providedProtoSourcesSet = NestedSetBuilder.stableOrder();
102+
providedProtoSources.forEach(providedProtoSourcesSet::add);
103+
NestedSetBuilder<String> protocOptsSet = NestedSetBuilder.stableOrder();
104+
protocOpts.forEach(protocOptsSet::add);
105+
106+
Map<String, Object> m = new LinkedHashMap<>();
107+
m.put("plugin", pluginExecutable == null ? Starlark.NONE : pluginExecutable);
108+
m.put("plugin_format_flag", pluginFormatFlag);
109+
m.put("proto_compiler", protoc == null ? Starlark.NONE : protoc);
110+
m.put(
111+
"provided_proto_sources",
112+
Depset.of(ElementType.of(ProtoSource.class), providedProtoSourcesSet.build()));
113+
m.put("protoc_opts", Depset.of(ElementType.of(ProtoSource.class), protocOptsSet.build()));
114+
m.put("out_replacement_format_flag", outReplacementFormatFlag);
115+
m.put("progress_message", progressMessage);
116+
m.put("mnemonic", mnemonic);
117+
m.put("plugin", pluginExecutable == null ? Starlark.NONE : pluginExecutable);
118+
m.put("runtime", runtime == null ? Starlark.NONE : runtime);
119+
120+
StarlarkProvider.Builder builder =
121+
StarlarkProvider.builder(
122+
Location.fromFileLineColumn(protoc.getExecutable().getFilename(), 0, 0));
123+
builder.setExported(starlarkProtoLangToolchainKey);
124+
125+
return StarlarkInfo.create(builder.build(), m, Location.BUILTIN);
126+
}
127+
128+
private static ImmutableList<ProtoLangToolchainProvider> getToolchains(
129+
RuleContext ruleContext, String attributeName) {
130+
ImmutableList.Builder<ProtoLangToolchainProvider> result = ImmutableList.builder();
131+
for (TransitiveInfoCollection prerequisite : ruleContext.getPrerequisites(attributeName)) {
132+
ProtoLangToolchainProvider toolchain = get(prerequisite);
133+
if (toolchain != null) {
134+
result.add(toolchain);
135+
}
136+
}
137+
return result.build();
138+
}
139+
140+
public static ProtoLangToolchainProvider get(RuleContext ruleContext, String attributeName) {
141+
return getToolchains(ruleContext, attributeName).stream().findFirst().orElse(null);
142+
}
143+
144+
public static ProtoLangToolchainProvider get(TransitiveInfoCollection prerequisite) {
145+
StarlarkInfo provider = (StarlarkInfo) prerequisite.get(starlarkProtoLangToolchainKey);
146+
return wrapStarlarkProviderWithNativeProvider(provider);
147+
}
148+
149+
public static StarlarkInfo getStarlarkProvider(RuleContext ruleContext, String attributeName) {
150+
for (TransitiveInfoCollection prerequisite : ruleContext.getPrerequisites(attributeName)) {
151+
StarlarkInfo provider = (StarlarkInfo) prerequisite.get(starlarkProtoLangToolchainKey);
152+
if (provider != null) {
153+
return provider;
154+
}
155+
}
156+
return null;
157+
}
158+
159+
public static StarlarkInfo getStarlarkProvider(TransitiveInfoCollection prerequisite) {
160+
return (StarlarkInfo) prerequisite.get(starlarkProtoLangToolchainKey);
161+
}
162+
163+
@SuppressWarnings("unchecked")
164+
private static ProtoLangToolchainProvider wrapStarlarkProviderWithNativeProvider(
165+
StarlarkInfo provider) {
166+
if (provider != null) {
167+
try {
168+
return new AutoValue_ProtoLangToolchainProvider(
169+
provider.getValue("out_replacement_format_flag", String.class),
170+
provider.getValue("plugin_format_flag", String.class),
171+
provider.getValue("plugin") instanceof NoneType
172+
? null
173+
: provider.getValue("plugin", FilesToRunProvider.class),
174+
provider.getValue("runtime") instanceof NoneType
175+
? null
176+
: provider.getValue("runtime", TransitiveInfoCollection.class),
177+
ImmutableList.copyOf(
178+
(StarlarkList<ProtoSource>) provider.getValue("provided_proto_sources")),
179+
provider.getValue("proto_compiler", FilesToRunProvider.class),
180+
ImmutableList.copyOf((StarlarkList<String>) provider.getValue("protoc_opts")),
181+
provider.getValue("progress_message", String.class),
182+
provider.getValue("mnemonic", String.class));
183+
} catch (EvalException e) {
184+
return null;
185+
}
186+
}
187+
return null;
132188
}
133189
}

‎src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainRule.java

-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment envi
116116
.exec()
117117
.value(PROTO_COMPILER))
118118
.requiresConfigurationFragments(ProtoConfiguration.class)
119-
.advertiseStarlarkProvider(ProtoLangToolchainProvider.PROVIDER.id())
120119
.removeAttribute("data")
121120
.removeAttribute("deps")
122121
.build();

‎src/main/starlark/builtins_bzl/common/exports.bzl

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ exported_rules = {
5555
"+cc_binary": cc_binary,
5656
"+cc_test": cc_test,
5757
"-cc_library": cc_library,
58-
"-proto_lang_toolchain": proto_lang_toolchain,
58+
"+proto_lang_toolchain": proto_lang_toolchain,
5959
}
6060

6161
# A list of Starlark functions callable from native rules implementation.

‎src/main/starlark/builtins_bzl/common/proto/proto_common.bzl

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
Definition of proto_common module.
1717
"""
1818

19+
load(":common/proto/providers.bzl", "ProtoLangToolchainInfo")
20+
1921
def _create_proto_compile_action(
2022
ctx,
2123
proto_info,
@@ -287,5 +289,5 @@ proto_common_do_not_use = struct(
287289
declare_generated_files = _declare_generated_files,
288290
experimental_should_generate_code = _experimental_should_generate_code,
289291
experimental_filter_sources = _experimental_filter_sources,
290-
ProtoLangToolchainInfo = _builtins.internal.ProtoLangToolchainInfo,
292+
ProtoLangToolchainInfo = ProtoLangToolchainInfo,
291293
)

‎src/test/java/com/google/devtools/build/lib/rules/proto/BUILD

+1-19
Original file line numberDiff line numberDiff line change
@@ -37,30 +37,12 @@ java_test(
3737
name = "ProtoLangToolchainTest",
3838
srcs = ["ProtoLangToolchainTest.java"],
3939
deps = [
40-
"//src/main/java/com/google/devtools/build/lib/analysis:transitive_info_collection",
41-
"//src/main/java/com/google/devtools/build/lib/cmdline",
42-
"//src/main/java/com/google/devtools/build/lib/rules/proto",
43-
"//src/test/java/com/google/devtools/build/lib/analysis/util",
44-
"//src/test/java/com/google/devtools/build/lib/packages:testutil",
45-
"//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
46-
"//third_party:guava",
47-
"//third_party:junit4",
48-
"//third_party:truth",
49-
],
50-
)
51-
52-
java_test(
53-
name = "StarlarkProtoLangToolchainTest",
54-
srcs = ["StarlarkProtoLangToolchainTest.java"],
55-
deps = [
56-
":ProtoLangToolchainTest",
57-
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
5840
"//src/main/java/com/google/devtools/build/lib/analysis:transitive_info_collection",
5941
"//src/main/java/com/google/devtools/build/lib/cmdline",
6042
"//src/main/java/com/google/devtools/build/lib/packages",
6143
"//src/main/java/com/google/devtools/build/lib/rules/proto",
62-
"//src/main/java/net/starlark/java/eval",
6344
"//src/test/java/com/google/devtools/build/lib/analysis/util",
45+
"//src/test/java/com/google/devtools/build/lib/packages:testutil",
6446
"//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
6547
"//third_party:guava",
6648
"//third_party:junit4",

‎src/test/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainTest.java

+65-20
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
2323
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
2424
import com.google.devtools.build.lib.cmdline.Label;
25+
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
26+
import com.google.devtools.build.lib.packages.Provider;
27+
import com.google.devtools.build.lib.packages.StarlarkProvider;
2528
import com.google.devtools.build.lib.packages.util.MockProtoSupport;
2629
import com.google.devtools.build.lib.testutil.TestConstants;
2730
import org.junit.Before;
@@ -32,12 +35,6 @@
3235
/** Unit tests for {@code proto_lang_toolchain}. */
3336
@RunWith(JUnit4.class)
3437
public class ProtoLangToolchainTest extends BuildViewTestCase {
35-
36-
@Before
37-
public void setupStarlarkRule() throws Exception {
38-
setBuildLanguageOptions("--experimental_builtins_injection_override=-proto_lang_toolchain");
39-
}
40-
4138
@Before
4239
public void setUp() throws Exception {
4340
MockProtoSupport.setupWorkspace(scratch);
@@ -46,6 +43,12 @@ public void setUp() throws Exception {
4643
invalidatePackages();
4744
}
4845

46+
Provider.Key getStarlarkProtoLangToolchainInfoKey() throws LabelSyntaxException {
47+
return new StarlarkProvider.Key(
48+
Label.parseAbsolute("@_builtins//:common/proto/providers.bzl", ImmutableMap.of()),
49+
"ProtoLangToolchainInfo");
50+
}
51+
4952
private void validateProtoLangToolchain(ProtoLangToolchainProvider toolchain) throws Exception {
5053
assertThat(toolchain.outReplacementFormatFlag()).isEqualTo("cmd-line:%s");
5154
assertThat(toolchain.pluginFormatFlag()).isEqualTo("--plugin=%s");
@@ -57,14 +60,16 @@ private void validateProtoLangToolchain(ProtoLangToolchainProvider toolchain) th
5760
.isEqualTo(Label.parseAbsolute("//third_party/x:runtime", ImmutableMap.of()));
5861

5962
assertThat(toolchain.protocOpts()).containsExactly("--myflag");
60-
Label protoc = Label.parseAbsoluteUnchecked(ProtoConstants.DEFAULT_PROTOC_LABEL);
61-
assertThat(toolchain.protoc().getExecutable().prettyPrint())
62-
.isEqualTo(protoc.toPathFragment().getPathString());
6363

6464
assertThat(toolchain.progressMessage()).isEqualTo("Progress Message %{label}");
6565
assertThat(toolchain.mnemonic()).isEqualTo("MyMnemonic");
6666
}
6767

68+
private void validateProtoCompiler(ProtoLangToolchainProvider toolchain, Label protoCompiler) {
69+
assertThat(toolchain.protoc().getExecutable().prettyPrint())
70+
.isEqualTo(protoCompiler.toPathFragment().getPathString());
71+
}
72+
6873
@Test
6974
public void protoToolchain() throws Exception {
7075
scratch.file(
@@ -86,15 +91,52 @@ public void protoToolchain() throws Exception {
8691
" plugin_format_flag = '--plugin=%s',",
8792
" plugin = '//third_party/x:plugin',",
8893
" runtime = '//third_party/x:runtime',",
89-
" blacklisted_protos = ['//third_party/x:denied'],",
9094
" progress_message = 'Progress Message %{label}',",
9195
" mnemonic = 'MyMnemonic',",
9296
")");
9397

9498
update(ImmutableList.of("//foo:toolchain"), false, 1, true, new EventBus());
99+
ProtoLangToolchainProvider toolchain =
100+
ProtoLangToolchainProvider.get(getConfiguredTarget("//foo:toolchain"));
101+
Label protoc = Label.parseAbsoluteUnchecked(ProtoConstants.DEFAULT_PROTOC_LABEL);
95102

96-
validateProtoLangToolchain(
97-
getConfiguredTarget("//foo:toolchain").get(ProtoLangToolchainProvider.PROVIDER));
103+
validateProtoLangToolchain(toolchain);
104+
validateProtoCompiler(toolchain, protoc);
105+
}
106+
107+
@Test
108+
public void protoToolchain_setProtoCompiler() throws Exception {
109+
scratch.file(
110+
"third_party/x/BUILD",
111+
"licenses(['unencumbered'])",
112+
"cc_binary(name = 'plugin', srcs = ['plugin.cc'])",
113+
"cc_library(name = 'runtime', srcs = ['runtime.cc'])",
114+
"filegroup(name = 'descriptors', srcs = ['metadata.proto', 'descriptor.proto'])",
115+
"filegroup(name = 'any', srcs = ['any.proto'])",
116+
"proto_library(name = 'denied', srcs = [':descriptors', ':any'])",
117+
"cc_binary(name = 'compiler')");
118+
119+
scratch.file(
120+
"foo/BUILD",
121+
TestConstants.LOAD_PROTO_LANG_TOOLCHAIN,
122+
"licenses(['unencumbered'])",
123+
"proto_lang_toolchain(",
124+
" name = 'toolchain',",
125+
" command_line = 'cmd-line:$(OUT)',",
126+
" plugin_format_flag = '--plugin=%s',",
127+
" plugin = '//third_party/x:plugin',",
128+
" runtime = '//third_party/x:runtime',",
129+
" progress_message = 'Progress Message %{label}',",
130+
" mnemonic = 'MyMnemonic',",
131+
" proto_compiler = '//third_party/x:compiler',",
132+
")");
133+
134+
ProtoLangToolchainProvider toolchain =
135+
ProtoLangToolchainProvider.get(getConfiguredTarget("//foo:toolchain"));
136+
Label protoc = Label.parseAbsoluteUnchecked("//third_party/x:compiler");
137+
138+
validateProtoLangToolchain(toolchain);
139+
validateProtoCompiler(toolchain, protoc);
98140
}
99141

100142
@Test
@@ -117,15 +159,17 @@ public void protoToolchainBlacklistProtoLibraries() throws Exception {
117159
" plugin_format_flag = '--plugin=%s',",
118160
" plugin = '//third_party/x:plugin',",
119161
" runtime = '//third_party/x:runtime',",
120-
" blacklisted_protos = ['//third_party/x:descriptors', '//third_party/x:any'],",
121162
" progress_message = 'Progress Message %{label}',",
122163
" mnemonic = 'MyMnemonic',",
123164
")");
124165

125166
update(ImmutableList.of("//foo:toolchain"), false, 1, true, new EventBus());
167+
ProtoLangToolchainProvider toolchain =
168+
ProtoLangToolchainProvider.get(getConfiguredTarget("//foo:toolchain"));
169+
Label protoc = Label.parseAbsoluteUnchecked(ProtoConstants.DEFAULT_PROTOC_LABEL);
126170

127-
validateProtoLangToolchain(
128-
getConfiguredTarget("//foo:toolchain").get(ProtoLangToolchainProvider.PROVIDER));
171+
validateProtoLangToolchain(toolchain);
172+
validateProtoCompiler(toolchain, protoc);
129173
}
130174

131175
@Test
@@ -148,15 +192,17 @@ public void protoToolchainBlacklistTransitiveProtos() throws Exception {
148192
" plugin_format_flag = '--plugin=%s',",
149193
" plugin = '//third_party/x:plugin',",
150194
" runtime = '//third_party/x:runtime',",
151-
" blacklisted_protos = ['//third_party/x:any'],",
152195
" progress_message = 'Progress Message %{label}',",
153196
" mnemonic = 'MyMnemonic',",
154197
")");
155198

156199
update(ImmutableList.of("//foo:toolchain"), false, 1, true, new EventBus());
200+
ProtoLangToolchainProvider toolchain =
201+
ProtoLangToolchainProvider.get(getConfiguredTarget("//foo:toolchain"));
202+
Label protoc = Label.parseAbsoluteUnchecked(ProtoConstants.DEFAULT_PROTOC_LABEL);
157203

158-
validateProtoLangToolchain(
159-
getConfiguredTarget("//foo:toolchain").get(ProtoLangToolchainProvider.PROVIDER));
204+
validateProtoLangToolchain(toolchain);
205+
validateProtoCompiler(toolchain, protoc);
160206
}
161207

162208
@Test
@@ -170,9 +216,8 @@ public void optionalFieldsAreEmpty() throws Exception {
170216
")");
171217

172218
update(ImmutableList.of("//foo:toolchain"), false, 1, true, new EventBus());
173-
174219
ProtoLangToolchainProvider toolchain =
175-
getConfiguredTarget("//foo:toolchain").get(ProtoLangToolchainProvider.PROVIDER);
220+
ProtoLangToolchainProvider.get(getConfiguredTarget("//foo:toolchain"));
176221

177222
assertThat(toolchain.pluginExecutable()).isNull();
178223
assertThat(toolchain.runtime()).isNull();

‎src/test/java/com/google/devtools/build/lib/rules/proto/StarlarkProtoLangToolchainTest.java

-243
This file was deleted.

0 commit comments

Comments
 (0)
Please sign in to comment.