mirror of https://github.com/golang/go.git
59 lines
1.6 KiB
Go
59 lines
1.6 KiB
Go
// Copyright 2022 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Package embeddirective defines an Analyzer that validates import for //go:embed directive.
|
|
package embeddirective
|
|
|
|
import (
|
|
"go/ast"
|
|
"strings"
|
|
|
|
"golang.org/x/tools/go/analysis"
|
|
)
|
|
|
|
const Doc = `check for //go:embed directive import
|
|
|
|
This analyzer checks that the embed package is imported when source code contains //go:embed comment directives.
|
|
The embed package must be imported for //go:embed directives to function.import _ "embed".`
|
|
|
|
var Analyzer = &analysis.Analyzer{
|
|
Name: "embed",
|
|
Doc: Doc,
|
|
Requires: []*analysis.Analyzer{},
|
|
Run: run,
|
|
RunDespiteErrors: true,
|
|
}
|
|
|
|
func run(pass *analysis.Pass) (interface{}, error) {
|
|
for _, f := range pass.Files {
|
|
com := hasEmbedDirectiveComment(f)
|
|
if com != nil {
|
|
assertEmbedImport(pass, com, f)
|
|
}
|
|
}
|
|
return nil, nil
|
|
}
|
|
|
|
// Check if the comment contains //go:embed directive.
|
|
func hasEmbedDirectiveComment(f *ast.File) *ast.Comment {
|
|
for _, cg := range f.Comments {
|
|
for _, c := range cg.List {
|
|
if strings.HasPrefix(c.Text, "//go:embed ") {
|
|
return c
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Verifies that "embed" import exists for //go:embed directive.
|
|
func assertEmbedImport(pass *analysis.Pass, com *ast.Comment, f *ast.File) {
|
|
for _, imp := range f.Imports {
|
|
if "\"embed\"" == imp.Path.Value {
|
|
return
|
|
}
|
|
}
|
|
pass.Report(analysis.Diagnostic{Pos: com.Pos(), End: com.Pos() + 10, Message: "The \"embed\" package must be imported when using go:embed directives."})
|
|
}
|