Skip to content

Commit b28e531

Browse files
committed
Add preserve_ordering parameter into to_starlark
1 parent e2acc45 commit b28e531

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

swiftpkg/internal/bzl_selects.bzl

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,16 @@ _noop_kind_handler = _new_kind_handler(
133133
transform = lambda v: v,
134134
)
135135

136-
def _to_starlark(values, kind_handlers = {}):
136+
def _to_starlark(values, kind_handlers = {}, preserve_ordering = False):
137137
"""Converts the provied values into Starlark using the information in the \
138138
kind handlers.
139139
140140
Args:
141141
values: A `list` of values that are processed and added to the output.
142142
kind_handlers: A `dict` of king handler `struct` values
143143
(`bzl_selects.new_kind_handler`).
144+
preserve_ordering: A `bool` for keeping the processing as lists instead of
145+
sets that deduplicate entries.
144146
145147
Returns:
146148
A `struct` as returned by `starlark_codegen.new_expr`.
@@ -152,40 +154,45 @@ def _to_starlark(values, kind_handlers = {}):
152154
# dict whose keys are the conditions and the value is the value for the
153155
# condition.
154156
selects_by_kind = {}
155-
no_condition_results = sets.make()
157+
no_condition_results = []
158+
159+
def process_list(input):
160+
if preserve_ordering:
161+
return input
162+
return sets.to_list(sets.make(input))
156163

157164
for v in values:
158165
v_type = type(v)
159166
if v_type != "struct":
160167
if v_type == "list":
161-
no_condition_results = sets.union(no_condition_results, sets.make(v))
168+
no_condition_results.extend(v)
162169
else:
163-
sets.insert(no_condition_results, v)
170+
no_condition_results.append(v)
164171
continue
165172

166173
# We are assuming that the select will always result in a list.
167174
# Hence, we wrap the transformed value in a list.
168175
kind_handler = kind_handlers.get(v.kind, _noop_kind_handler)
169-
tvs_set = sets.make(lists.flatten(kind_handler.transform(v.value)))
176+
tvs_set = lists.flatten(kind_handler.transform(v.value))
170177
if v.condition != None:
171178
# Collect all of the values associted with a condition.
172179
select_dict = selects_by_kind.get(v.kind, {})
173-
condition_values = select_dict.get(v.condition, sets.make())
174-
condition_values = sets.union(condition_values, tvs_set)
180+
condition_values = sets.to_list(select_dict.get(v.condition, sets.make()))
181+
condition_values = condition_values.extend(tvs_set)
175182
select_dict[v.condition] = condition_values
176183
selects_by_kind[v.kind] = select_dict
177184
else:
178-
no_condition_results = sets.union(no_condition_results, tvs_set)
185+
no_condition_results.extend(tvs_set)
179186

180187
expr_members = []
181-
if sets.length(no_condition_results) > 0:
182-
expr_members.append(sets.to_list(no_condition_results))
188+
if len(no_condition_results) > 0:
189+
expr_members.append(process_list(no_condition_results))
183190
for (kind, select_dict) in selects_by_kind.items():
184191
if len(expr_members) > 0:
185192
expr_members.append(scg.new_op("+"))
186193
sorted_keys = sorted(select_dict.keys())
187194
new_select_dict = {
188-
k: sets.to_list(select_dict[k])
195+
k: process_list(select_dict[k])
189196
for k in sorted_keys
190197
}
191198
kind_handler = kind_handlers.get(kind, _noop_kind_handler)

swiftpkg/internal/swiftpkg_build_files.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def _swift_target_build_file(pkg_ctx, target):
106106
if len(defines) > 0:
107107
attrs["defines"] = bzl_selects.to_starlark(defines)
108108
if len(copts) > 0:
109-
attrs["copts"] = bzl_selects.to_starlark(copts)
109+
attrs["copts"] = bzl_selects.to_starlark(copts, preserve_ordering = True)
110110

111111
res_build_file = _handle_target_resources(
112112
pkg_ctx,

0 commit comments

Comments
 (0)