From 9b6935e013dccdfb98c4adc25ced77d0e9a9a09b Mon Sep 17 00:00:00 2001 From: Alex Humesky Date: Wed, 28 Jul 2021 21:09:22 -0400 Subject: Prepare databinding integration for moving the DatabindingV2Provider attributes class_infos and setter_stores from lists to depsets. (#38) See https://github.com/bazelbuild/bazel/commit/876d48defe325aa6fbe471a9e209c2a740585fd5 https://github.com/bazelbuild/bazel/issues/11497#issuecomment-881698675 https://github.com/bazelbuild/bazel/issues/12780 --- rules/data_binding.bzl | 24 ++++++++++++++++++------ rules/utils.bzl | 9 +++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/rules/data_binding.bzl b/rules/data_binding.bzl index 70df90f..21e2003 100644 --- a/rules/data_binding.bzl +++ b/rules/data_binding.bzl @@ -66,15 +66,27 @@ def _gen_sources(ctx, output_dir, java_package, deps, layout_info, data_binding_ args.add("-zipSourceOutput", "true") args.add("-useAndroidX", "false") - class_infos = [] - for info in deps: - class_infos.extend(info.class_infos) + if deps: + if type(deps[0].class_infos) == "depset": + class_infos = depset(transitive = [info.class_infos for info in deps]) + inputs = depset(direct = [layout_info], transitive = [class_infos]) + elif type(deps[0].class_infos) == "list": + class_infos = [] + for info in deps: + class_infos.extend(info.class_infos) + inputs = class_infos + [layout_info] + else: + fail("Expected list or depset. Got %s" % type(deps[0].class_infos)) + else: + class_infos = [] + inputs = [layout_info] + args.add_all(class_infos, before_each = "-dependencyClassInfoList") ctx.actions.run( executable = data_binding_exec, arguments = ["GEN_BASE_CLASSES", args], - inputs = class_infos + [layout_info], + inputs = inputs, outputs = [class_info, srcjar], mnemonic = "GenerateDataBindingBaseClasses", progress_message = ( @@ -91,8 +103,8 @@ def _setup_dependent_lib_artifacts(ctx, output_dir, deps): for info in deps: # Yes, DataBinding requires depsets iterations. for artifact in (info.transitive_br_files.to_list() + - info.setter_stores + - info.class_infos): + _utils.list_or_depset_to_list(info.setter_stores) + + _utils.list_or_depset_to_list(info.class_infos)): # short_path might contain a parent directory reference if the # databinding artifact is from an external repository (e.g. an aar # from Maven). If that's the case, just remove the parent directory diff --git a/rules/utils.bzl b/rules/utils.bzl index 5bd764e..d796371 100644 --- a/rules/utils.bzl +++ b/rules/utils.bzl @@ -195,6 +195,14 @@ def _only(collection): _error("Expected one element, has %s." % len(collection)) return _first(collection) +def _list_or_depset_to_list(list_or_depset): + if type(list_or_depset) == "list": + return list_or_depset + elif type(list_or_depset) == "depset": + return list_or_depset.to_list() + else: + return _error("Expected a list or a depset. Got %s" % type(list_or_depset)) + def _copy_file(ctx, src, dest): if src.is_directory or dest.is_directory: fail("Cannot use copy_file with directories") @@ -444,6 +452,7 @@ utils = struct( sanitize_string = _sanitize_string, sanitize_java_package = _sanitize_java_package, hex = _hex, + list_or_depset_to_list = _list_or_depset_to_list, ) log = struct( -- cgit v1.2.3