Skip to content

Commit

Permalink
Refactor all use cases of TaggedModifier to use TaggedModifiers
Browse files Browse the repository at this point in the history
Summary:
`TaggedModifiers` tag a list of modifiers with a location rather than a single modifier with a location. Make cfg constructor use `TaggedModifiers` instead of `TaggedModifier` and delete `TaggedModifier`.
This diff also properly updates cfg constructor to work with the new format for `target_modifiers`.

Reviewed By: stepancheg

Differential Revision: D51264311

fbshipit-source-id: 0b82f3428d1eef6e6da9afdbacdc30755f266511
  • Loading branch information
Scott Cao authored and facebook-github-bot committed Nov 14, 2023
1 parent 0d68c15 commit 62cd7a3
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 61 deletions.
63 changes: 30 additions & 33 deletions cfg/experimental/cfg_constructor.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -8,31 +8,33 @@
load(
":common.bzl",
"get_modifier_info",
"json_to_tagged_modifier",
"json_to_tagged_modifiers",
"modifier_to_refs",
"resolve_modifier",
)
load(":name.bzl", "cfg_name")
load(":order.bzl", "CONSTRAINT_SETTING_ORDER", "get_constraint_setting_order")
load(
":types.bzl",
"Modifier", # @unused
"ModifierCliLocation",
"ModifierInfo", # @unused
"TaggedModifier",
"ModifierTargetLocation",
"TaggedModifiers",
)

PostConstraintAnalysisParams = record(
legacy_platform = PlatformInfo | None,
# Merged modifier from PACKAGE, target, and cli modifiers.
merged_modifiers = list[TaggedModifier],
merged_modifiers = list[TaggedModifiers],
)

def cfg_constructor_pre_constraint_analysis(
*,
legacy_platform: PlatformInfo | None,
# dict[str, typing.Any] is JSON dictionary form of `TaggedModifier` passed from buck2 core
package_modifiers: list[dict[str, typing.Any]] | None,
target_modifiers: list[dict[str, typing.Any]] | None,
# typing.Any is JSON form of modifier
target_modifiers: list[Modifier] | None,
cli_modifiers: list[str]) -> (list[str], PostConstraintAnalysisParams):
"""
First stage of cfg constructor for modifiers.
Expand All @@ -53,35 +55,28 @@ def cfg_constructor_pre_constraint_analysis(
package_modifiers = package_modifiers or []
target_modifiers = target_modifiers or []

# Convert JSONs back to TaggedModifier
package_modifiers = [json_to_tagged_modifier(modifier_json) for modifier_json in package_modifiers]
target_modifiers = [json_to_tagged_modifier(modifier_json) for modifier_json in target_modifiers]
# Convert JSONs back to TaggedModifiers
package_modifiers = [json_to_tagged_modifiers(modifier_json) for modifier_json in package_modifiers]
merged_modifiers = package_modifiers

# Convert CLI modifiers to `TaggedModifier`
cli_modifiers = [TaggedModifier(modifier = modifier, location = ModifierCliLocation()) for modifier in cli_modifiers]
# Add target modifiers as `TaggedModifiers`
if target_modifiers:
merged_modifiers.append(TaggedModifiers(modifiers = target_modifiers, location = ModifierTargetLocation()))

merged_modifiers = package_modifiers + target_modifiers + cli_modifiers
# Convert CLI modifiers to `TaggedModifier`
if cli_modifiers:
merged_modifiers.append(TaggedModifiers(modifiers = cli_modifiers, location = ModifierCliLocation()))

refs = list(CONSTRAINT_SETTING_ORDER)
for tagged_modifier in merged_modifiers:
refs.extend(modifier_to_refs(tagged_modifier.modifier, tagged_modifier.location))
for tagged_modifiers in merged_modifiers:
for modifier in tagged_modifiers.modifiers:
refs.extend(modifier_to_refs(modifier, tagged_modifiers.location))

return refs, PostConstraintAnalysisParams(
legacy_platform = legacy_platform,
merged_modifiers = merged_modifiers,
)

def _get_constraint_setting_and_modifier_info(
refs: dict[str, ProviderCollection],
tagged_modifier: TaggedModifier,
constraint_setting_order: list[TargetLabel]) -> (TargetLabel, ModifierInfo):
return get_modifier_info(
refs = refs,
modifier = tagged_modifier.modifier,
location = tagged_modifier.location,
constraint_setting_order = constraint_setting_order,
)

def cfg_constructor_post_constraint_analysis(
*,
refs: dict[str, ProviderCollection],
Expand Down Expand Up @@ -116,15 +111,17 @@ def cfg_constructor_post_constraint_analysis(
for constraint_setting, constraint_value_info in params.legacy_platform.configuration.constraints.items():
constraint_setting_to_modifier_infos[constraint_setting] = [constraint_value_info]

for tagged_modifier in params.merged_modifiers:
constraint_setting_label, modifier_info = _get_constraint_setting_and_modifier_info(
refs = refs,
tagged_modifier = tagged_modifier,
constraint_setting_order = constraint_setting_order,
)
modifier_infos = constraint_setting_to_modifier_infos.get(constraint_setting_label) or []
modifier_infos.append(modifier_info)
constraint_setting_to_modifier_infos[constraint_setting_label] = modifier_infos
for tagged_modifiers in params.merged_modifiers:
for modifier in tagged_modifiers.modifiers:
constraint_setting_label, modifier_info = get_modifier_info(
refs = refs,
modifier = modifier,
location = tagged_modifiers.location,
constraint_setting_order = constraint_setting_order,
)
modifier_infos = constraint_setting_to_modifier_infos.get(constraint_setting_label) or []
modifier_infos.append(modifier_info)
constraint_setting_to_modifier_infos[constraint_setting_label] = modifier_infos

cfg = ConfigurationInfo(
constraints = {},
Expand Down
28 changes: 5 additions & 23 deletions cfg/experimental/common.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ load(
"ModifierPackageLocation",
"ModifierSelectInfo",
"ModifierTargetLocation",
"TaggedModifier",
"TaggedModifiers",
)

Expand Down Expand Up @@ -62,16 +61,6 @@ def verify_normalized_modifier(modifier: Modifier):
else:
fail("Found unexpected modifier `{}` type `{}`".format(modifier, type(modifier)))

def get_tagged_modifier(
modifier: Modifier,
location: ModifierLocation) -> TaggedModifier:
verify_normalized_modifier(modifier)

return TaggedModifier(
modifier = modifier,
location = location,
)

def get_tagged_modifiers(
modifiers: list[Modifier],
location: ModifierLocation) -> TaggedModifiers:
Expand Down Expand Up @@ -172,13 +161,6 @@ def modifier_to_refs(modifier: Modifier, location: ModifierLocation) -> list[str
fail("Internal error: Found unexpected modifier `{}` type `{}`".format(modifier, type(modifier)))
return refs

def tagged_modifier_to_json(tagged_modifier: TaggedModifier) -> dict[str, typing.Any]:
return {
"location": _location_to_json(tagged_modifier.location),
"modifier": tagged_modifier.modifier,
"_type": "TaggedModifier",
}

def tagged_modifiers_to_json(tagged_modifiers: TaggedModifiers) -> dict[str, typing.Any]:
return {
"location": _location_to_json(tagged_modifiers.location),
Expand All @@ -195,12 +177,12 @@ def _location_to_json(location: ModifierLocation) -> dict[str, str]:
fail("Internal error: location shouldn't be specified as `{}`".format(type(location)))
fail("Internal error: unknown location `{}` with type `{}`".format(location, type(location)))

def json_to_tagged_modifier(j: dict[str, typing.Any]) -> TaggedModifier:
if j["_type"] != "TaggedModifier":
fail("Internal error: `{}` is not a `TaggedModifier`".format(j))
return TaggedModifier(
def json_to_tagged_modifiers(j: dict[str, typing.Any]) -> TaggedModifiers:
if j["_type"] != "TaggedModifiers":
fail("Internal error: `{}` is not a `TaggedModifiers`".format(j))
return TaggedModifiers(
location = _json_to_location(j["location"]),
modifier = j["modifier"],
modifiers = j["modifiers"],
)

def _json_to_location(j: dict[str, str]) -> ModifierLocation:
Expand Down
5 changes: 0 additions & 5 deletions cfg/experimental/types.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,6 @@ ModifierSelect = dict[str, typing.Any]

Modifier = str | ModifierSelect

TaggedModifier = record(
modifier = Modifier,
location = ModifierLocation,
)

TaggedModifiers = record(
modifiers = list[Modifier],
location = ModifierLocation,
Expand Down

0 comments on commit 62cd7a3

Please sign in to comment.