github.com/jpreese/tflint@v0.19.2-0.20200908152133-b01686250fb6/rules/terraformrules/terraform_deprecated_index.go (about)

     1  package terraformrules
     2  
     3  import (
     4  	"log"
     5  
     6  	"github.com/hashicorp/hcl/v2"
     7  	"github.com/hashicorp/hcl/v2/hclsyntax"
     8  	"github.com/terraform-linters/tflint/tflint"
     9  )
    10  
    11  // TerraformDeprecatedIndexRule warns about usage of the legacy dot syntax for indexes (foo.0)
    12  type TerraformDeprecatedIndexRule struct{}
    13  
    14  // NewTerraformDeprecatedIndexRule return a new rule
    15  func NewTerraformDeprecatedIndexRule() *TerraformDeprecatedIndexRule {
    16  	return &TerraformDeprecatedIndexRule{}
    17  }
    18  
    19  // Name returns the rule name
    20  func (r *TerraformDeprecatedIndexRule) Name() string {
    21  	return "terraform_deprecated_index"
    22  }
    23  
    24  // Enabled returns whether the rule is enabled by default
    25  func (r *TerraformDeprecatedIndexRule) Enabled() bool {
    26  	return false
    27  }
    28  
    29  // Severity returns the rule severity
    30  func (r *TerraformDeprecatedIndexRule) Severity() string {
    31  	return tflint.WARNING
    32  }
    33  
    34  // Link returns the rule reference link
    35  func (r *TerraformDeprecatedIndexRule) Link() string {
    36  	return tflint.ReferenceLink(r.Name())
    37  }
    38  
    39  // Check walks all expressions and emit issues if deprecated index syntax is found
    40  func (r *TerraformDeprecatedIndexRule) Check(runner *tflint.Runner) error {
    41  	if !runner.TFConfig.Path.IsRoot() {
    42  		// This rule does not evaluate child modules.
    43  		return nil
    44  	}
    45  
    46  	log.Printf("[TRACE] Check `%s` rule for `%s` runner", r.Name(), runner.TFConfigPath())
    47  
    48  	return runner.WalkExpressions(func(expr hcl.Expression) error {
    49  		for _, variable := range expr.Variables() {
    50  			for _, traversal := range variable.SimpleSplit().Rel {
    51  				if traversal, ok := traversal.(hcl.TraverseIndex); ok {
    52  					filename := traversal.SrcRange.Filename
    53  					bytes := traversal.SrcRange.SliceBytes(runner.File(filename).Bytes)
    54  
    55  					tokens, diags := hclsyntax.LexExpression(bytes, filename, traversal.SrcRange.Start)
    56  					if diags.HasErrors() {
    57  						return diags
    58  					}
    59  
    60  					if tokens[0].Type == hclsyntax.TokenDot {
    61  						runner.EmitIssue(
    62  							r,
    63  							"List items should be accessed using square brackets",
    64  							expr.Range(),
    65  						)
    66  					}
    67  				}
    68  			}
    69  		}
    70  
    71  		return nil
    72  	})
    73  }