diff --git a/internal/langserver/handlers/command/validate.go b/internal/langserver/handlers/command/validate.go index f3b00ae45..e27afadce 100644 --- a/internal/langserver/handlers/command/validate.go +++ b/internal/langserver/handlers/command/validate.go @@ -68,7 +68,7 @@ func (h *CmdHandler) TerraformValidateHandler(ctx context.Context, args cmd.Comm validateDiags := diagnostics.HCLDiagsFromJSON(jsonDiags) diags.EmptyRootDiagnostic() diags.Append("terraform validate", validateDiags) - diags.Append("HCL", mod.ModuleDiagnostics.AsMap()) + diags.Append("HCL", mod.ModuleDiagnostics.AutoloadedOnly().AsMap()) diags.Append("HCL", mod.VarsDiagnostics.AutoloadedOnly().AsMap()) notifier.PublishHCLDiags(ctx, mod.Path, diags) diff --git a/internal/langserver/handlers/hooks_module.go b/internal/langserver/handlers/hooks_module.go index d6fa15981..c49ea21fa 100644 --- a/internal/langserver/handlers/hooks_module.go +++ b/internal/langserver/handlers/hooks_module.go @@ -128,7 +128,7 @@ func updateDiagnostics(dNotifier *diagnostics.Notifier) notifier.Hook { defer dNotifier.PublishHCLDiags(ctx, mod.Path, diags) if mod != nil { - diags.Append("HCL", mod.ModuleDiagnostics.AsMap()) + diags.Append("HCL", mod.ModuleDiagnostics.AutoloadedOnly().AsMap()) diags.Append("HCL", mod.VarsDiagnostics.AutoloadedOnly().AsMap()) } } diff --git a/internal/terraform/ast/ast_test.go b/internal/terraform/ast/ast_test.go index 9faed3f4a..ad70671d7 100644 --- a/internal/terraform/ast/ast_test.go +++ b/internal/terraform/ast/ast_test.go @@ -37,3 +37,32 @@ func TestVarsDiags_autoloadedOnly(t *testing.T) { t.Fatalf("unexpected diagnostics: %s", diff) } } + +func TestModuleDiags_autoloadedOnly(t *testing.T) { + md := ModDiagsFromMap(map[string]hcl.Diagnostics{ + "alpha.tf": {}, + "beta.tf": { + { + Severity: hcl.DiagError, + Summary: "Test error", + Detail: "Test description", + }, + }, + ".hidden.tf": {}, + }) + diags := md.AutoloadedOnly().AsMap() + expectedDiags := map[string]hcl.Diagnostics{ + "alpha.tf": {}, + "beta.tf": { + { + Severity: hcl.DiagError, + Summary: "Test error", + Detail: "Test description", + }, + }, + } + + if diff := cmp.Diff(expectedDiags, diags, ctydebug.CmpOptions); diff != "" { + t.Fatalf("unexpected diagnostics: %s", diff) + } +} diff --git a/internal/terraform/ast/module.go b/internal/terraform/ast/module.go index 4d6da63bd..59d7ebf44 100644 --- a/internal/terraform/ast/module.go +++ b/internal/terraform/ast/module.go @@ -16,18 +16,18 @@ func (mf ModFilename) IsJSON() bool { return strings.HasSuffix(string(mf), ".json") } -func IsModuleFilename(name string) bool { - if isIgnoredFile(name) { - // See https://github.com/hashicorp/terraform/blob/d35bc05/internal/configs/parser_config_dir.go#L107 - return false - } +func (mf ModFilename) IsIgnored() bool { + return isIgnoredFile(string(mf)) +} +func IsModuleFilename(name string) bool { return strings.HasSuffix(name, ".tf") || strings.HasSuffix(name, ".tf.json") } // isIgnoredFile returns true if the given filename (which must not have a // directory path ahead of it) should be ignored as e.g. an editor swap file. +// See https://github.com/hashicorp/terraform/blob/d35bc05/internal/configs/parser_config_dir.go#L107 func isIgnoredFile(name string) bool { return strings.HasPrefix(name, ".") || // Unix-like hidden files strings.HasSuffix(name, "~") || // vim @@ -62,6 +62,16 @@ func ModDiagsFromMap(m map[string]hcl.Diagnostics) ModDiags { return mf } +func (md ModDiags) AutoloadedOnly() ModDiags { + diags := make(ModDiags) + for name, f := range md { + if !name.IsIgnored() { + diags[name] = f + } + } + return diags +} + func (md ModDiags) AsMap() map[string]hcl.Diagnostics { m := make(map[string]hcl.Diagnostics, len(md)) for name, diags := range md { diff --git a/internal/terraform/ast/variables.go b/internal/terraform/ast/variables.go index af0197903..278a9aba4 100644 --- a/internal/terraform/ast/variables.go +++ b/internal/terraform/ast/variables.go @@ -69,16 +69,6 @@ func (vd VarsDiags) AutoloadedOnly() VarsDiags { return diags } -func (vd VarsDiags) ForFile(name VarsFilename) VarsDiags { - diags := make(VarsDiags) - for fName, f := range vd { - if fName == name { - diags[fName] = f - } - } - return diags -} - func (vd VarsDiags) AsMap() map[string]hcl.Diagnostics { m := make(map[string]hcl.Diagnostics, len(vd)) for name, diags := range vd { diff --git a/internal/terraform/parser/module_test.go b/internal/terraform/parser/module_test.go index ac087ce12..36cb042d7 100644 --- a/internal/terraform/parser/module_test.go +++ b/internal/terraform/parser/module_test.go @@ -37,10 +37,12 @@ func TestParseModuleFiles(t *testing.T) { { "valid-mod-files-with-extra-items", map[string]struct{}{ - "main.tf": {}, + ".hidden.tf": {}, + "main.tf": {}, }, map[string]hcl.Diagnostics{ - "main.tf": nil, + ".hidden.tf": nil, + "main.tf": nil, }, }, {