diff --git a/hcl2/reconstructor.py b/hcl2/reconstructor.py index 2a9ca708..40cee197 100644 --- a/hcl2/reconstructor.py +++ b/hcl2/reconstructor.py @@ -164,6 +164,10 @@ def _should_add_space_before( elif isinstance(current_node, Tree): rule_name = current_node.data + # Space after binary operator tokens before a tree node (e.g. && !foo) + if self._last_token_name in self._binary_op_types: + return True + if parent_rule_name == BlockRule.lark_name(): # Add space between multiple string/identifier labels in blocks if rule_name in [ diff --git a/test/integration/hcl2_original/smoke.tf b/test/integration/hcl2_original/smoke.tf index e2cb9bb8..3e10e856 100644 --- a/test/integration/hcl2_original/smoke.tf +++ b/test/integration/hcl2_original/smoke.tf @@ -65,6 +65,16 @@ block multiline_binary_ops { } } +block binary_op_before_unary { + dedup_keys_layer7 = { + for k, v in local.action_keys_layer7 : + k => v + if !contains(keys(local.dedup_keys_layer8), k) + && !contains(keys(local.dedup_keys_layer9), k) + && !contains(keys(local.dedup_keys_layer10), k) + } +} + block { route53_forwarding_rule_shares = { for forwarding_rule_key in keys(var.route53_resolver_forwarding_rule_shares) : diff --git a/test/integration/hcl2_reconstructed/smoke.tf b/test/integration/hcl2_reconstructed/smoke.tf index 54b3286c..29beb3ac 100644 --- a/test/integration/hcl2_reconstructed/smoke.tf +++ b/test/integration/hcl2_reconstructed/smoke.tf @@ -53,6 +53,15 @@ block multiline_binary_ops { } +block binary_op_before_unary { + dedup_keys_layer7 = { + for k, v in local.action_keys_layer7 : + k => v + if !contains(keys(local.dedup_keys_layer8), k) && !contains(keys(local.dedup_keys_layer9), k) && !contains(keys(local.dedup_keys_layer10), k) + } +} + + block { route53_forwarding_rule_shares = { for forwarding_rule_key in keys(var.route53_resolver_forwarding_rule_shares) : diff --git a/test/integration/json_reserialized/smoke.json b/test/integration/json_reserialized/smoke.json index ec003473..a2382778 100644 --- a/test/integration/json_reserialized/smoke.json +++ b/test/integration/json_reserialized/smoke.json @@ -60,6 +60,12 @@ "__is_block__": true } }, + { + "binary_op_before_unary": { + "dedup_keys_layer7": "${{for k, v in local.action_keys_layer7 : k => v if !contains(keys(local.dedup_keys_layer8), k) && !contains(keys(local.dedup_keys_layer9), k) && !contains(keys(local.dedup_keys_layer10), k)}}", + "__is_block__": true + } + }, { "route53_forwarding_rule_shares": "${{for forwarding_rule_key in keys(var.route53_resolver_forwarding_rule_shares) : \"${forwarding_rule_key}\" => {aws_account_ids = [for account_name in var.route53_resolver_forwarding_rule_shares[forwarding_rule_key].aws_account_names : module.remote_state_subaccounts.map[account_name].outputs[\"aws_account_id\"]]}... if substr(bucket_name, 0, 1) == \"l\"}}", "__is_block__": true diff --git a/test/integration/json_serialized/smoke.json b/test/integration/json_serialized/smoke.json index ec003473..a2382778 100644 --- a/test/integration/json_serialized/smoke.json +++ b/test/integration/json_serialized/smoke.json @@ -60,6 +60,12 @@ "__is_block__": true } }, + { + "binary_op_before_unary": { + "dedup_keys_layer7": "${{for k, v in local.action_keys_layer7 : k => v if !contains(keys(local.dedup_keys_layer8), k) && !contains(keys(local.dedup_keys_layer9), k) && !contains(keys(local.dedup_keys_layer10), k)}}", + "__is_block__": true + } + }, { "route53_forwarding_rule_shares": "${{for forwarding_rule_key in keys(var.route53_resolver_forwarding_rule_shares) : \"${forwarding_rule_key}\" => {aws_account_ids = [for account_name in var.route53_resolver_forwarding_rule_shares[forwarding_rule_key].aws_account_names : module.remote_state_subaccounts.map[account_name].outputs[\"aws_account_id\"]]}... if substr(bucket_name, 0, 1) == \"l\"}}", "__is_block__": true