diff --git a/hcl2/hcl2.lark b/hcl2/hcl2.lark index abfac2ab..eefcd24b 100644 --- a/hcl2/hcl2.lark +++ b/hcl2/hcl2.lark @@ -27,6 +27,7 @@ expr_term : "(" _NEW_LINE_OR_COMMENT* expression _NEW_LINE_OR_COMMENT? ")" | index_expr_term | get_attr_expr_term | identifier + | provider_function_call | heredoc_template | heredoc_template_trim | attr_splat_expr_term @@ -57,6 +58,8 @@ heredoc_template_trim : /<<-(?P[a-zA-Z][a-zA-Z0-9._-]+)\n(?:.|\n)+ function_call : identifier "(" _NEW_LINE_OR_COMMENT* arguments? _NEW_LINE_OR_COMMENT? ")" arguments : (expression (_NEW_LINE_OR_COMMENT* "," _NEW_LINE_OR_COMMENT* expression)* ("," | "...")? _NEW_LINE_OR_COMMENT*) +colons: "::" +provider_function_call: identifier colons identifier colons identifier "(" _NEW_LINE_OR_COMMENT? arguments? _NEW_LINE_OR_COMMENT? ")" index_expr_term : expr_term index get_attr_expr_term : expr_term get_attr attr_splat_expr_term : expr_term attr_splat diff --git a/hcl2/transformer.py b/hcl2/transformer.py index 76d57c1f..efdb5902 100644 --- a/hcl2/transformer.py +++ b/hcl2/transformer.py @@ -6,7 +6,7 @@ from typing import Any, TYPE_CHECKING from lark import Transformer, Token -from lark.visitors import v_args +from lark.visitors import v_args, Discard if TYPE_CHECKING: from lark.tree import Meta @@ -107,6 +107,14 @@ def function_call(self, args: list) -> str: def arguments(self, args: list) -> list: return args + def provider_function_call(self, args: list) -> str: + args = self.strip_new_line_tokens(args) + args_str = "" + if len(args) > 5: + args_str = ", ".join([str(arg) for arg in args[5] if arg is not Discard]) + provider_func = "::".join([args[0], args[2], args[4]]) + return f"{provider_func}({args_str})" + @v_args(meta=True) def block(self, meta: Meta, args: list) -> dict[str, Any]: args = self.strip_new_line_tokens(args) diff --git a/test/helpers/terraform-config-json/provider_function.json b/test/helpers/terraform-config-json/provider_function.json new file mode 100644 index 00000000..a84b286b --- /dev/null +++ b/test/helpers/terraform-config-json/provider_function.json @@ -0,0 +1,10 @@ +{ + "locals": [ + { + "name2": ["${provider::test2::test(\"a\")}"], + "name3": ["${test(\"a\")}"], + "__end_line__": 4, + "__start_line__": 1 + } + ] +} diff --git a/test/helpers/terraform-config/provider_function.tf b/test/helpers/terraform-config/provider_function.tf new file mode 100644 index 00000000..299c9874 --- /dev/null +++ b/test/helpers/terraform-config/provider_function.tf @@ -0,0 +1,4 @@ +locals { + name2 = provider::test2::test("a") + name3 = test("a") +} \ No newline at end of file