Skip to content

Commit

Permalink
Add lang.ReferencesInExpr
Browse files Browse the repository at this point in the history
  • Loading branch information
wata727 committed Aug 18, 2022
1 parent 2d14952 commit 5188017
Show file tree
Hide file tree
Showing 21 changed files with 1,513 additions and 0 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module github.com/terraform-linters/tflint-plugin-sdk
go 1.19

require (
github.com/go-test/deep v1.0.3
github.com/google/go-cmp v0.5.8
github.com/hashicorp/go-hclog v1.2.2
github.com/hashicorp/go-plugin v1.4.4
Expand Down
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
Expand Down
3 changes: 3 additions & 0 deletions terraform/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Packages for Terraform Language

TODO
12 changes: 12 additions & 0 deletions terraform/addrs/count_attr.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package addrs

// CountAttr is the address of an attribute of the "count" object in
// the interpolation scope, like "count.index".
type CountAttr struct {
referenceable
Name string
}

func (ca CountAttr) String() string {
return "count." + ca.Name
}
3 changes: 3 additions & 0 deletions terraform/addrs/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package addrs

// TODO
12 changes: 12 additions & 0 deletions terraform/addrs/for_each_attr.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package addrs

// ForEachAttr is the address of an attribute referencing the current "for_each" object in
// the interpolation scope, addressed using the "each" keyword, ex. "each.key" and "each.value"
type ForEachAttr struct {
referenceable
Name string
}

func (f ForEachAttr) String() string {
return "each." + f.Name
}
11 changes: 11 additions & 0 deletions terraform/addrs/input_variable.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package addrs

// InputVariable is the address of an input variable.
type InputVariable struct {
referenceable
Name string
}

func (v InputVariable) String() string {
return "var." + v.Name
}
95 changes: 95 additions & 0 deletions terraform/addrs/instance_key.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package addrs

import (
"fmt"

"github.com/zclconf/go-cty/cty"
"github.com/zclconf/go-cty/cty/gocty"
)

// InstanceKey represents the key of an instance within an object that
// contains multiple instances due to using "count" or "for_each" arguments
// in configuration.
//
// IntKey and StringKey are the two implementations of this type. No other
// implementations are allowed. The single instance of an object that _isn't_
// using "count" or "for_each" is represented by NoKey, which is a nil
// InstanceKey.
type InstanceKey interface {
instanceKeySigil()
String() string

// Value returns the cty.Value of the appropriate type for the InstanceKey
// value.
Value() cty.Value
}

// ParseInstanceKey returns the instance key corresponding to the given value,
// which must be known and non-null.
//
// If an unknown or null value is provided then this function will panic. This
// function is intended to deal with the values that would naturally be found
// in a hcl.TraverseIndex, which (when parsed from source, at least) can never
// contain unknown or null values.
func ParseInstanceKey(key cty.Value) (InstanceKey, error) {
switch key.Type() {
case cty.String:
return StringKey(key.AsString()), nil
case cty.Number:
var idx int
err := gocty.FromCtyValue(key, &idx)
return IntKey(idx), err
default:
return NoKey, fmt.Errorf("either a string or an integer is required")
}
}

// NoKey represents the absense of an InstanceKey, for the single instance
// of a configuration object that does not use "count" or "for_each" at all.
var NoKey InstanceKey

// IntKey is the InstanceKey representation representing integer indices, as
// used when the "count" argument is specified or if for_each is used with
// a sequence type.
type IntKey int

func (k IntKey) instanceKeySigil() {
}

func (k IntKey) String() string {
return fmt.Sprintf("[%d]", int(k))
}

func (k IntKey) Value() cty.Value {
return cty.NumberIntVal(int64(k))
}

// StringKey is the InstanceKey representation representing string indices, as
// used when the "for_each" argument is specified with a map or object type.
type StringKey string

func (k StringKey) instanceKeySigil() {
}

func (k StringKey) String() string {
// FIXME: This isn't _quite_ right because Go's quoted string syntax is
// slightly different than HCL's, but we'll accept it for now.
return fmt.Sprintf("[%q]", string(k))
}

func (k StringKey) Value() cty.Value {
return cty.StringVal(string(k))
}

// InstanceKeyType represents the different types of instance key that are
// supported. Usually it is sufficient to simply type-assert an InstanceKey
// value to either IntKey or StringKey, but this type and its values can be
// used to represent the types themselves, rather than specific values
// of those types.
type InstanceKeyType rune

const (
NoKeyType InstanceKeyType = 0
IntKeyType InstanceKeyType = 'I'
StringKeyType InstanceKeyType = 'S'
)
11 changes: 11 additions & 0 deletions terraform/addrs/local_value.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package addrs

// LocalValue is the address of a local value.
type LocalValue struct {
referenceable
Name string
}

func (v LocalValue) String() string {
return "local." + v.Name
}
44 changes: 44 additions & 0 deletions terraform/addrs/module_call.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package addrs

import (
"fmt"
)

// ModuleCall is the address of a call from the current module to a child
// module.
type ModuleCall struct {
referenceable
Name string
}

func (c ModuleCall) String() string {
return "module." + c.Name
}

// ModuleCallInstance is the address of one instance of a module created from
// a module call, which might create multiple instances using "count" or
// "for_each" arguments.
type ModuleCallInstance struct {
referenceable
Call ModuleCall
Key InstanceKey
}

func (c ModuleCallInstance) String() string {
if c.Key == NoKey {
return c.Call.String()
}
return fmt.Sprintf("module.%s%s", c.Call.Name, c.Key)
}

// ModuleCallInstanceOutput is the address of a particular named output produced by
// an instance of a module call.
type ModuleCallInstanceOutput struct {
referenceable
Call ModuleCallInstance
Name string
}

func (co ModuleCallInstanceOutput) String() string {
return fmt.Sprintf("%s.%s", co.Call.String(), co.Name)
}
Loading

0 comments on commit 5188017

Please sign in to comment.