diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintCollection.java index 0ebb273e56c215..5c2cabf9375bc3 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintCollection.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintCollection.java @@ -233,7 +233,12 @@ public Sequence constraintSettings() { @Override public Object getIndex(StarlarkSemantics semantics, Object key) throws EvalException { - return get(convertKey(key)); + ConstraintSettingInfo constraintSettingInfo = convertKey(key); + Object result = get(constraintSettingInfo); + if (result == null) { + return Starlark.NONE; + } + return result; } @Override diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java index 1e33cff784eb01..1e6a355b22bea8 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java @@ -30,6 +30,7 @@ import net.starlark.java.eval.Starlark; import net.starlark.java.eval.StarlarkSemantics; import net.starlark.java.eval.StarlarkThread; +import net.starlark.java.eval.StarlarkValue; /** * An implementation of ToolchainContextApi that can better handle converting strings into Labels. @@ -99,7 +100,7 @@ private Label transformKey(StarlarkThread starlarkThread, Object key) throws Eva } @Override - public ToolchainInfo getIndex( + public StarlarkValue getIndex( StarlarkThread starlarkThread, StarlarkSemantics semantics, Object key) throws EvalException { Label toolchainTypeLabel = transformKey(starlarkThread, key); @@ -116,7 +117,11 @@ public ToolchainInfo getIndex( .map(Label::toString) .collect(joining(", "))); } - return toolchainContext().forToolchainType(toolchainTypeLabel); + ToolchainInfo toolchainInfo = toolchainContext().forToolchainType(toolchainTypeLabel); + if (toolchainInfo == null) { + return Starlark.NONE; + } + return toolchainInfo; } @Override diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainContextApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainContextApi.java index f98f7d03c379bb..25cad749973ef0 100644 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainContextApi.java +++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainContextApi.java @@ -26,5 +26,6 @@ doc = "Holds toolchains available for a particular exec group. Toolchain targets are accessed by" + " indexing with the toolchain type, as in" - + " context[\"//pkg:my_toolchain_type\"].") + + " ctx.toolchains[\"//pkg:my_toolchain_type\"]. If the toolchain was" + + " optional and no toolchain was resolved, this will return None.") public interface ToolchainContextApi extends StarlarkValue, StarlarkIndexable.Threaded {} diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java index 94248b99579d2e..10bbd77bed0d0e 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java @@ -33,7 +33,9 @@ import com.google.devtools.build.skyframe.EvaluationResult; import com.google.devtools.build.skyframe.SkyKey; import javax.annotation.Nullable; +import net.starlark.java.eval.EvalException; import net.starlark.java.eval.Printer; +import net.starlark.java.eval.Starlark; import net.starlark.java.eval.StarlarkSemantics; import org.junit.Before; import org.junit.Test; @@ -244,7 +246,6 @@ public T get(BuiltinProvider provider) { @Nullable @Override public Info get(Provider.Key providerKey) { - return null; } @@ -252,8 +253,8 @@ public Info get(Provider.Key providerKey) { public void repr(Printer printer) {} @Override - public Object getIndex(StarlarkSemantics semantics, Object key) { - return null; + public Object getIndex(StarlarkSemantics semantics, Object key) throws EvalException { + throw Starlark.errorf("Unknown key '%s'", key); } @Override