diff --git a/terraform/runner.go b/terraform/runner.go index 48d41c4..020fe75 100644 --- a/terraform/runner.go +++ b/terraform/runner.go @@ -142,6 +142,23 @@ func (r *Runner) GetProviderRefs() (map[string]*ProviderRef, hcl.Diagnostics) { }, }, }, + { + Type: "check", + LabelNames: []string{"name"}, + Body: &hclext.BodySchema{ + Blocks: []hclext.BlockSchema{ + { + Type: "data", + LabelNames: []string{"type", "name"}, + Body: &hclext.BodySchema{ + Attributes: []hclext.AttributeSchema{ + {Name: "provider"}, + }, + }, + }, + }, + }, + }, }, }, &tflint.GetModuleContentOption{ExpandMode: tflint.ExpandModeNone}) if err != nil { @@ -199,6 +216,28 @@ func (r *Runner) GetProviderRefs() (map[string]*ProviderRef, hcl.Diagnostics) { providerRefs[ref.Name] = ref } } + case "check": + for _, data := range block.Body.Blocks { + if attr, exists := data.Body.Attributes["provider"]; exists { + ref, decodeDiags := decodeProviderRef(attr.Expr, data.DefRange) + diags = diags.Extend(decodeDiags) + if decodeDiags.HasErrors() { + continue + } + providerRefs[ref.Name] = ref + } else { + providerName := data.Labels[0] + if under := strings.Index(providerName, "_"); under != -1 { + providerName = providerName[:under] + } + providerRefs[providerName] = &ProviderRef{ + Name: providerName, + DefRange: data.DefRange, + } + } + } + default: + panic("unreachable") } } diff --git a/terraform/runner_test.go b/terraform/runner_test.go index e7bd206..2b5293b 100644 --- a/terraform/runner_test.go +++ b/terraform/runner_test.go @@ -183,6 +183,14 @@ func TestGetProviderRefs(t *testing.T) { { name: "resource", content: ` +resource "google_compute_instance" "main" {}`, + want: map[string]*ProviderRef{ + "google": {Name: "google", DefRange: hcl.Range{Filename: "main.tf", Start: hcl.Pos{Line: 2, Column: 1}, End: hcl.Pos{Line: 2, Column: 42}}}, + }, + }, + { + name: "resource with provider", + content: ` resource "google_compute_instance" "main" { provider = google.europe }`, @@ -193,6 +201,14 @@ resource "google_compute_instance" "main" { { name: "data", content: ` +data "aws_ami" "main" {}`, + want: map[string]*ProviderRef{ + "aws": {Name: "aws", DefRange: hcl.Range{Filename: "main.tf", Start: hcl.Pos{Line: 2, Column: 1}, End: hcl.Pos{Line: 2, Column: 22}}}, + }, + }, + { + name: "data with provider", + content: ` data "aws_ami" "main" { provider = aws.west }`, @@ -222,6 +238,28 @@ module "server" { "aws": {Name: "aws", DefRange: hcl.Range{Filename: "main.tf", Start: hcl.Pos{Line: 2, Column: 1}, End: hcl.Pos{Line: 2, Column: 16}}}, }, }, + { + name: "scoped data", + content: ` +check "my_check" { + data "aws_ami" "main" {} +}`, + want: map[string]*ProviderRef{ + "aws": {Name: "aws", DefRange: hcl.Range{Filename: "main.tf", Start: hcl.Pos{Line: 3, Column: 3}, End: hcl.Pos{Line: 3, Column: 24}}}, + }, + }, + { + name: "scoped data with provider", + content: ` +check "my_check" { + data "aws_ami" "main" { + provider = aws.west + } +}`, + want: map[string]*ProviderRef{ + "aws": {Name: "aws", DefRange: hcl.Range{Filename: "main.tf", Start: hcl.Pos{Line: 3, Column: 3}, End: hcl.Pos{Line: 3, Column: 24}}}, + }, + }, } for _, test := range tests {