From 7ac861d5e6bc393a329769878ab49babad2d66cc Mon Sep 17 00:00:00 2001 From: Ansgar Mertens Date: Thu, 22 Aug 2024 12:31:54 +0200 Subject: [PATCH 1/3] feat: Support provider defined functions in stacks --- .../features/stacks/decoder/path_reader.go | 7 +++- .../stacks/decoder/stack_functions.go | 35 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 internal/features/stacks/decoder/stack_functions.go diff --git a/internal/features/stacks/decoder/path_reader.go b/internal/features/stacks/decoder/path_reader.go index 6e9472a54..f383280ba 100644 --- a/internal/features/stacks/decoder/path_reader.go +++ b/internal/features/stacks/decoder/path_reader.go @@ -98,12 +98,17 @@ func stackPathContext(record *state.StackRecord, stateReader CombinedReader) (*d return nil, err } + functions, err := functionsForStack(record, version, stateReader) + if err != nil { + return nil, err + } + pathCtx := &decoder.PathContext{ Schema: mergedSchema, ReferenceOrigins: make(reference.Origins, 0), ReferenceTargets: make(reference.Targets, 0), Files: make(map[string]*hcl.File, 0), - Functions: mustFunctionsForVersion(version), + Functions: functions, Validators: stackValidators, } diff --git a/internal/features/stacks/decoder/stack_functions.go b/internal/features/stacks/decoder/stack_functions.go new file mode 100644 index 000000000..c0a389cd1 --- /dev/null +++ b/internal/features/stacks/decoder/stack_functions.go @@ -0,0 +1,35 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package decoder + +import ( + "github.com/hashicorp/go-version" + "github.com/hashicorp/hcl-lang/schema" + "github.com/hashicorp/terraform-ls/internal/features/stacks/state" + tfaddr "github.com/hashicorp/terraform-registry-address" + tfmod "github.com/hashicorp/terraform-schema/module" + tfschema "github.com/hashicorp/terraform-schema/schema" +) + +func functionsForStack(record *state.StackRecord, version *version.Version, stateReader CombinedReader) (map[string]schema.FunctionSignature, error) { + fm := tfschema.NewFunctionsMerger(mustFunctionsForVersion(version)) + fm.SetTerraformVersion(version) + fm.SetStateReader(stateReader) + + // We have to create the provider requirements and references based on the types the functions merger expects + providerRequirements := make(tfmod.ProviderRequirements, len(record.Meta.ProviderRequirements)) + providerReferences := make(map[tfmod.ProviderRef]tfaddr.Provider, len(record.Meta.ProviderRequirements)) + for localName, req := range record.Meta.ProviderRequirements { + providerRequirements[req.Source] = req.VersionConstraints + providerReferences[tfmod.ProviderRef{LocalName: localName}] = req.Source + } + + mMeta := &tfmod.Meta{ + Path: record.Path(), + ProviderRequirements: providerRequirements, + ProviderReferences: providerReferences, + } + + return fm.FunctionsForModule(mMeta) +} From 8d7ee3ccb83428d1c383a21f9b9b70d33eda6fb4 Mon Sep 17 00:00:00 2001 From: Ansgar Mertens Date: Thu, 22 Aug 2024 12:34:17 +0200 Subject: [PATCH 2/3] chore: add changie entry --- .changes/unreleased/ENHANCEMENTS-20240822-123409.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changes/unreleased/ENHANCEMENTS-20240822-123409.yaml diff --git a/.changes/unreleased/ENHANCEMENTS-20240822-123409.yaml b/.changes/unreleased/ENHANCEMENTS-20240822-123409.yaml new file mode 100644 index 000000000..54e7a1f7a --- /dev/null +++ b/.changes/unreleased/ENHANCEMENTS-20240822-123409.yaml @@ -0,0 +1,6 @@ +kind: ENHANCEMENTS +body: Support provider defined functions in stacks configuration +time: 2024-08-22T12:34:09.71462+02:00 +custom: + Issue: "1804" + Repository: terraform-ls From 9e43d2950224ecc1ffd78e9f2730efd63f96417f Mon Sep 17 00:00:00 2001 From: Ansgar Mertens Date: Mon, 26 Aug 2024 15:25:06 +0200 Subject: [PATCH 3/3] Bump terraform-schema to `4f99bab` --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6a8d4387c..5a1c57597 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/hashicorp/terraform-exec v0.21.0 github.com/hashicorp/terraform-json v0.22.1 github.com/hashicorp/terraform-registry-address v0.2.3 - github.com/hashicorp/terraform-schema v0.0.0-20240822075240-1800e4ce193c + github.com/hashicorp/terraform-schema v0.0.0-20240826132342-4f99bab76318 github.com/mcuadros/go-defaults v1.2.0 github.com/mh-cbon/go-fmt-fail v0.0.0-20160815164508-67765b3fbcb5 github.com/mitchellh/cli v1.1.5 diff --git a/go.sum b/go.sum index d0cc5fd74..442ba8d1a 100644 --- a/go.sum +++ b/go.sum @@ -229,8 +229,8 @@ github.com/hashicorp/terraform-json v0.22.1 h1:xft84GZR0QzjPVWs4lRUwvTcPnegqlyS7 github.com/hashicorp/terraform-json v0.22.1/go.mod h1:JbWSQCLFSXFFhg42T7l9iJwdGXBYV8fmmD6o/ML4p3A= github.com/hashicorp/terraform-registry-address v0.2.3 h1:2TAiKJ1A3MAkZlH1YI/aTVcLZRu7JseiXNRHbOAyoTI= github.com/hashicorp/terraform-registry-address v0.2.3/go.mod h1:lFHA76T8jfQteVfT7caREqguFrW3c4MFSPhZB7HHgUM= -github.com/hashicorp/terraform-schema v0.0.0-20240822075240-1800e4ce193c h1:yyO3IXjZd0R1muo2yDp5x/9oYkv4w5OviH3QK/9H5F8= -github.com/hashicorp/terraform-schema v0.0.0-20240822075240-1800e4ce193c/go.mod h1:Tc8mlcXI3ulpnC1/Ho4O5DeivcXGfezj0U+igIDE3iA= +github.com/hashicorp/terraform-schema v0.0.0-20240826132342-4f99bab76318 h1:uvRBiaf+0qM3c6u/AjOmKsvdtEsSKlmty8PJ9ukEnsY= +github.com/hashicorp/terraform-schema v0.0.0-20240826132342-4f99bab76318/go.mod h1:Tc8mlcXI3ulpnC1/Ho4O5DeivcXGfezj0U+igIDE3iA= github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ= github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc= github.com/hexops/autogold v1.3.1 h1:YgxF9OHWbEIUjhDbpnLhgVsjUDsiHDTyDfy2lrfdlzo=