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 }