diff --git a/internal/langserver/handlers/command/module_calls.go b/internal/langserver/handlers/command/module_calls.go index a1e5c029..df251a25 100644 --- a/internal/langserver/handlers/command/module_calls.go +++ b/internal/langserver/handlers/command/module_calls.go @@ -129,5 +129,6 @@ func getModuleDocumentationLink(record datadir.ModuleRecord) string { return "" } - return fmt.Sprintf(`https://registry.terraform.io/modules/%s/%s`, record.SourceAddr, record.VersionStr) + shortName := strings.TrimPrefix(record.SourceAddr, "registry.terraform.io/") + return fmt.Sprintf(`https://registry.terraform.io/modules/%s/%s`, shortName, record.VersionStr) } diff --git a/internal/langserver/handlers/command/module_calls_test.go b/internal/langserver/handlers/command/module_calls_test.go index 05ced561..1469ba8b 100644 --- a/internal/langserver/handlers/command/module_calls_test.go +++ b/internal/langserver/handlers/command/module_calls_test.go @@ -87,3 +87,42 @@ func Test_parseModuleRecords(t *testing.T) { }) } } + +// With the release of Terraform 1.1.0 module source addresses are now stored normalized +func Test_parseModuleRecords_v1_1(t *testing.T) { + tests := []struct { + name string + records []datadir.ModuleRecord + want []moduleCall + }{ + { + name: "detects terraform module types", + records: []datadir.ModuleRecord{ + { + Key: "ec2_instances", + SourceAddr: "registry.terraform.io/terraform-aws-modules/ec2-instance/aws", + VersionStr: "2.12.0", + Dir: ".terraform\\modules\\ec2_instances", + }, + }, + want: []moduleCall{ + { + Name: "ec2_instances", + SourceAddr: "registry.terraform.io/terraform-aws-modules/ec2-instance/aws", + Version: "2.12.0", + SourceType: "tfregistry", + DocsLink: "https://registry.terraform.io/modules/terraform-aws-modules/ec2-instance/aws/2.12.0", + DependentModules: []moduleCall{}, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := parseModuleRecords(tt.records) + if diff := cmp.Diff(tt.want, got); diff != "" { + t.Fatalf("module mismatch: %s", diff) + } + }) + } +} diff --git a/internal/terraform/datadir/module_types.go b/internal/terraform/datadir/module_types.go index 68a1111c..c0e95b3e 100644 --- a/internal/terraform/datadir/module_types.go +++ b/internal/terraform/datadir/module_types.go @@ -34,7 +34,9 @@ func (r *ModuleRecord) GetModuleType() ModuleType { // the authorative source: hashicorp/terraform/internal/addrs/module_source.go. // However this works enough for now to identify module types for display in vscode-terraform. // Example: terraform-aws-modules/ec2-instance/aws - if _, err := tfregistry.ParseRawProviderSourceString(r.SourceAddr); err == nil { + _, err := tfregistry.ParseRawProviderSourceString(r.SourceAddr) + // Example: registry.terraform.io/terraform-aws-modules/vpc/aws + if err == nil || strings.HasPrefix(r.SourceAddr, "registry.terraform.io/") { return TFREGISTRY }