Skip to content

Commit 52b1b74

Browse files
katrecopybara-github
authored andcommitted
Use a dummy toolchain context for rules that don't have one.
Fixes #12610. Closes #13162. PiperOrigin-RevId: 361545255
1 parent 2dea9d1 commit 52b1b74

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
import com.google.devtools.build.lib.shell.ShellUtils;
7777
import com.google.devtools.build.lib.shell.ShellUtils.TokenizationException;
7878
import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
79+
import com.google.devtools.build.lib.starlarkbuildapi.platform.ToolchainContextApi;
7980
import com.google.devtools.build.lib.vfs.PathFragment;
8081
import java.util.ArrayList;
8182
import java.util.Collection;
@@ -701,9 +702,24 @@ public Dict<String, String> var() throws EvalException {
701702
}
702703

703704
@Override
704-
public ResolvedToolchainContext toolchains() throws EvalException {
705+
public ToolchainContextApi toolchains() throws EvalException {
705706
checkMutable("toolchains");
706-
return ruleContext.getToolchainContext();
707+
ResolvedToolchainContext toolchainContext = ruleContext.getToolchainContext();
708+
if (toolchainContext == null) {
709+
// Starlark rules are easier if this cannot be null, so return a no-op value instead.
710+
return new ToolchainContextApi() {
711+
@Override
712+
public Object getIndex(StarlarkSemantics semantics, Object key) {
713+
return Starlark.NONE;
714+
}
715+
716+
@Override
717+
public boolean containsKey(StarlarkSemantics semantics, Object key) {
718+
return false;
719+
}
720+
};
721+
}
722+
return toolchainContext;
707723
}
708724

709725
@Override

src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3123,4 +3123,29 @@ public void testBuildFilePath() throws Exception {
31233123
Object result = ev.eval("ruleContext.build_file_path");
31243124
assertThat(result).isEqualTo("bar/BUILD");
31253125
}
3126+
3127+
@Test
3128+
public void testNoToolchainContext() throws Exception {
3129+
// Build setting rules do not have a toolchain context, as they are part of the configuration.
3130+
scratch.file(
3131+
"test/BUILD",
3132+
"load(':rule.bzl', 'sample_setting')",
3133+
"toolchain_type(name = 'toolchain_type')",
3134+
"sample_setting(",
3135+
" name = 'test',",
3136+
" build_setting_default = True,",
3137+
")");
3138+
scratch.file(
3139+
"test/rule.bzl",
3140+
"def _sample_impl(ctx):",
3141+
" info = ctx.toolchains['//:toolchain_type']",
3142+
" if info != None:",
3143+
" fail('Toolchain should be empty')",
3144+
"sample_setting = rule(",
3145+
" implementation = _sample_impl,",
3146+
" build_setting = config.bool(flag = True),",
3147+
")");
3148+
getConfiguredTarget("//test:test");
3149+
assertNoEvents();
3150+
}
31263151
}

0 commit comments

Comments
 (0)