| # Copyright 2022 Google LLC. All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the License); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| """kt_analysis""" |
| |
| load("//:visibility.bzl", "RULES_KOTLIN") |
| |
| visibility(RULES_KOTLIN) |
| |
| def _get_action(actions, mnemonic): |
| """Get a specific action |
| |
| Args: |
| actions: [List[Action]] |
| mnemonic: [string] Identify the action whose args to search |
| |
| Returns: |
| [Action|None] The arg value, or None if it couldn't be found |
| """ |
| menmonic_actions = [a for a in actions if a.mnemonic == mnemonic] |
| if len(menmonic_actions) == 0: |
| return None |
| elif len(menmonic_actions) > 1: |
| fail("Expected a single '%s' action" % mnemonic) |
| |
| return menmonic_actions[0] |
| |
| def _get_all_args(action, arg_name, style = "trim"): |
| """Gets values for all instances of an arg name from a specific action. |
| |
| Args: |
| action: [Action|None] |
| arg_name: [string] |
| style: ["trim"|"next"|"list"] The style of commandline arg |
| |
| Returns: |
| [list[string]|list[list[string]]|None] The list of matching arg values |
| """ |
| if not action: |
| return [] |
| |
| args = action.argv |
| matches = [(i, a) for (i, a) in enumerate(args) if a.startswith(arg_name)] |
| |
| result = [] |
| for index, arg in matches: |
| if style == "trim": |
| result.append(arg[len(arg_name):]) |
| elif style == "next": |
| result.append(args[index + 1]) |
| elif style == "list": |
| sub_result = [] |
| for i in range(index + 1, len(args)): |
| if args[i].startswith("--"): |
| break |
| sub_result.append(args[i]) |
| result.append(sub_result) |
| else: |
| fail("Unrecognized arg style '%s" % style) |
| |
| return result |
| |
| def _get_arg(action, arg_name, style = "trim"): |
| """Gets values for exactly one instance of an arg name from a specific action. |
| |
| Args: |
| action: [Action|None] |
| arg_name: [string] |
| style: ["trim"|"next"|"list"] The style of commandline arg |
| |
| Returns: |
| [string|list[string]|None] The arg value, or None if it couldn't be found |
| """ |
| results = _get_all_args(action, arg_name, style) |
| |
| if len(results) == 0: |
| return None |
| elif len(results) == 1: |
| return results[0] |
| else: |
| fail("Expected a single '%s' arg" % arg_name) |
| |
| def _check_endswith_test(ctx): |
| name = ctx.label.name |
| for i in range(0, 10): |
| # TODO: Remove support for suffix digits |
| if name.endswith(str(i)): |
| name = name.removesuffix(str(i)) |
| break |
| if name.endswith("_test"): |
| return |
| |
| fail("Analysis test names must end in '_test'") |
| |
| kt_analysis = struct( |
| # go/keep-sorted start |
| DEFAULT_LIST = ["__default__"], |
| check_endswith_test = _check_endswith_test, |
| get_action = _get_action, |
| get_all_args = _get_all_args, |
| get_arg = _get_arg, |
| # go/keep-sorted end |
| ) |