diff --git a/configs/parser_config.go b/configs/parser_config.go index b4510df18b..e930a093c4 100644 --- a/configs/parser_config.go +++ b/configs/parser_config.go @@ -92,6 +92,15 @@ func (p *Parser) loadConfigFile(path string, override bool) (*File, hcl.Diagnost } } + case "required_providers": + // required_providers should be nested inside a "terraform" block + diags = append(diags, &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid required_providers block", + Detail: "A \"required_providers\" block must be nested inside a \"terraform\" block.", + Subject: block.TypeRange.Ptr(), + }) + case "provider": cfg, cfgDiags := decodeProviderBlock(block) diags = append(diags, cfgDiags...) @@ -193,6 +202,12 @@ var configFileSchema = &hcl.BodySchema{ { Type: "terraform", }, + { + // This one is not really valid, but we include it here so we + // can create a specialized error message hinting the user to + // nest it inside a "terraform" block. + Type: "required_providers", + }, { Type: "provider", LabelNames: []string{"name"}, diff --git a/configs/testdata/error-files/required-providers-toplevel.tf b/configs/testdata/error-files/required-providers-toplevel.tf new file mode 100644 index 0000000000..de1bf12f57 --- /dev/null +++ b/configs/testdata/error-files/required-providers-toplevel.tf @@ -0,0 +1,9 @@ +# A top-level required_providers block is not valid, but we have a specialized +# error for it to hint the user to move it into a terraform block. +required_providers { # ERROR: Invalid required_providers block +} + +# This one is valid, and what the user should rewrite the above to be like. +terraform { + required_providers {} +}