diff --git a/addrs/parse_ref.go b/addrs/parse_ref.go index bad463ba8..62f244e1a 100644 --- a/addrs/parse_ref.go +++ b/addrs/parse_ref.go @@ -239,6 +239,18 @@ func parseRef(traversal hcl.Traversal) (*Reference, tfdiags.Diagnostics) { Remaining: remain, }, diags + case "template", "lazy", "arg": + // These names are all pre-emptively reserved in the hope of landing + // some version of "template values" or "lazy expressions" feature + // before the next opt-in language edition, but don't yet do anything. + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Reserved symbol name", + Detail: fmt.Sprintf("The symbol name %q is reserved for use in a future Terraform version. If you are using a provider that already uses this as a resource type name, add the prefix \"resource.\" to force interpretation as a resource type name.", root), + Subject: rootRange.Ptr(), + }) + return nil, diags + default: return parseResourceRef(ManagedResourceMode, rootRange, traversal) } diff --git a/addrs/parse_ref_test.go b/addrs/parse_ref_test.go index 660725e53..f7f1949ae 100644 --- a/addrs/parse_ref_test.go +++ b/addrs/parse_ref_test.go @@ -605,6 +605,25 @@ func TestParseRef(t *testing.T) { ``, }, + // We have some names reserved which might be used by a + // still-under-discussion proposal for template values or lazy + // expressions. + { + `template.foo`, + nil, + `The symbol name "template" is reserved for use in a future Terraform version. If you are using a provider that already uses this as a resource type name, add the prefix "resource." to force interpretation as a resource type name.`, + }, + { + `lazy.foo`, + nil, + `The symbol name "lazy" is reserved for use in a future Terraform version. If you are using a provider that already uses this as a resource type name, add the prefix "resource." to force interpretation as a resource type name.`, + }, + { + `arg.foo`, + nil, + `The symbol name "arg" is reserved for use in a future Terraform version. If you are using a provider that already uses this as a resource type name, add the prefix "resource." to force interpretation as a resource type name.`, + }, + // anything else, interpreted as a managed resource reference { `boop_instance.foo`,