michajlo | cab889d | 2020-02-20 17:48:36 -0800 | [diff] [blame] | 1 | // Copyright 2020 The Bazel Authors. All rights reserved. |
| 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
| 15 | package com.google.devtools.build.lib.packages; |
| 16 | |
Googler | 31c51b9 | 2023-05-12 09:38:54 -0700 | [diff] [blame] | 17 | import java.util.Map; |
Googler | 0511bb4 | 2023-05-17 14:34:51 -0700 | [diff] [blame] | 18 | import net.starlark.java.annot.Param; |
| 19 | import net.starlark.java.annot.StarlarkMethod; |
adonovan | 450c7ad | 2020-09-14 13:00:21 -0700 | [diff] [blame] | 20 | import net.starlark.java.eval.EvalException; |
Googler | 31c51b9 | 2023-05-12 09:38:54 -0700 | [diff] [blame] | 21 | import net.starlark.java.eval.Starlark; |
Googler | 31c51b9 | 2023-05-12 09:38:54 -0700 | [diff] [blame] | 22 | import net.starlark.java.eval.StarlarkThread; |
michajlo | cab889d | 2020-02-20 17:48:36 -0800 | [diff] [blame] | 23 | |
Googler | 31c51b9 | 2023-05-12 09:38:54 -0700 | [diff] [blame] | 24 | /** |
Googler | 0511bb4 | 2023-05-17 14:34:51 -0700 | [diff] [blame] | 25 | * Utility class encapsulating the standard definition of the {@code package()} function of BUILD |
| 26 | * files. |
Googler | 31c51b9 | 2023-05-12 09:38:54 -0700 | [diff] [blame] | 27 | */ |
| 28 | public class PackageCallable { |
michajlo | cab889d | 2020-02-20 17:48:36 -0800 | [diff] [blame] | 29 | |
Googler | 0511bb4 | 2023-05-17 14:34:51 -0700 | [diff] [blame] | 30 | protected PackageCallable() {} |
| 31 | |
| 32 | public static final PackageCallable INSTANCE = new PackageCallable(); |
| 33 | |
| 34 | @StarlarkMethod( |
| 35 | name = "package", |
| 36 | documented = false, // documented in docgen/templates/be/functions.vm |
| 37 | extraKeywords = @Param(name = "kwargs", defaultValue = "{}"), |
| 38 | useStarlarkThread = true) |
| 39 | public Object packageCallable(Map<String, Object> kwargs, StarlarkThread thread) |
| 40 | throws EvalException { |
Googler | 57e4ff5 | 2024-07-03 08:20:48 -0700 | [diff] [blame] | 41 | Package.Builder pkgBuilder = Package.Builder.fromOrFailAllowBuildOnly(thread, "package()"); |
Googler | 0511bb4 | 2023-05-17 14:34:51 -0700 | [diff] [blame] | 42 | if (pkgBuilder.isPackageFunctionUsed()) { |
| 43 | throw new EvalException("'package' can only be used once per BUILD file"); |
| 44 | } |
| 45 | pkgBuilder.setPackageFunctionUsed(); |
| 46 | |
| 47 | if (kwargs.isEmpty()) { |
| 48 | throw new EvalException("at least one argument must be given to the 'package' function"); |
| 49 | } |
| 50 | |
Googler | 1f18b19 | 2023-06-12 12:23:56 -0700 | [diff] [blame] | 51 | PackageArgs.Builder pkgArgsBuilder = PackageArgs.builder(); |
Googler | 0511bb4 | 2023-05-17 14:34:51 -0700 | [diff] [blame] | 52 | for (Map.Entry<String, Object> kwarg : kwargs.entrySet()) { |
| 53 | String name = kwarg.getKey(); |
| 54 | Object rawValue = kwarg.getValue(); |
Googler | 1f18b19 | 2023-06-12 12:23:56 -0700 | [diff] [blame] | 55 | processParam(name, rawValue, pkgBuilder, pkgArgsBuilder); |
Googler | 0511bb4 | 2023-05-17 14:34:51 -0700 | [diff] [blame] | 56 | } |
Googler | 1f18b19 | 2023-06-12 12:23:56 -0700 | [diff] [blame] | 57 | pkgBuilder.mergePackageArgsFrom(pkgArgsBuilder); |
Googler | 0511bb4 | 2023-05-17 14:34:51 -0700 | [diff] [blame] | 58 | return Starlark.NONE; |
| 59 | } |
michajlo | cab889d | 2020-02-20 17:48:36 -0800 | [diff] [blame] | 60 | |
Googler | 31c51b9 | 2023-05-12 09:38:54 -0700 | [diff] [blame] | 61 | /** |
Googler | 0511bb4 | 2023-05-17 14:34:51 -0700 | [diff] [blame] | 62 | * Handles one parameter. Subclasses can add new parameters by overriding this method and falling |
| 63 | * back on the super method when the parameter does not match. |
Googler | 31c51b9 | 2023-05-12 09:38:54 -0700 | [diff] [blame] | 64 | */ |
Googler | 0511bb4 | 2023-05-17 14:34:51 -0700 | [diff] [blame] | 65 | protected void processParam( |
Googler | 1f18b19 | 2023-06-12 12:23:56 -0700 | [diff] [blame] | 66 | String name, Object rawValue, Package.Builder pkgBuilder, PackageArgs.Builder pkgArgsBuilder) |
Googler | 0511bb4 | 2023-05-17 14:34:51 -0700 | [diff] [blame] | 67 | throws EvalException { |
Googler | e8184e0 | 2023-08-30 08:35:42 -0700 | [diff] [blame] | 68 | |
Googler | 1f18b19 | 2023-06-12 12:23:56 -0700 | [diff] [blame] | 69 | PackageArgs.processParam( |
| 70 | name, |
| 71 | rawValue, |
| 72 | "package() argument '" + name + "'", |
| 73 | pkgBuilder.getLabelConverter(), |
| 74 | pkgArgsBuilder); |
michajlo | cab889d | 2020-02-20 17:48:36 -0800 | [diff] [blame] | 75 | } |
| 76 | } |