Update Go and vendor dependencies
This commit is contained in:
+58
-24
@@ -99,50 +99,33 @@ func run(pass *analysis.Pass) (any, error) {
|
||||
case knowledge.DeprecatedNeverUse:
|
||||
report.Report(pass, node,
|
||||
fmt.Sprintf("%s has been deprecated since %s because it shouldn't be used: %s",
|
||||
report.Render(pass, node), formatGoVersion(std.DeprecatedSince), depr.Msg))
|
||||
deprecatedObjName, formatGoVersion(std.DeprecatedSince), depr.Msg))
|
||||
case std.DeprecatedSince, knowledge.DeprecatedUseNoLonger:
|
||||
report.Report(pass, node,
|
||||
fmt.Sprintf("%s has been deprecated since %s: %s",
|
||||
report.Render(pass, node), formatGoVersion(std.DeprecatedSince), depr.Msg))
|
||||
deprecatedObjName, formatGoVersion(std.DeprecatedSince), depr.Msg))
|
||||
default:
|
||||
report.Report(pass, node,
|
||||
fmt.Sprintf("%s has been deprecated since %s and an alternative has been available since %s: %s",
|
||||
report.Render(pass, node), formatGoVersion(std.DeprecatedSince), formatGoVersion(std.AlternativeAvailableSince), depr.Msg))
|
||||
deprecatedObjName, formatGoVersion(std.DeprecatedSince), formatGoVersion(std.AlternativeAvailableSince), depr.Msg))
|
||||
}
|
||||
} else {
|
||||
report.Report(pass, node, fmt.Sprintf("%s is deprecated: %s", report.Render(pass, node), depr.Msg))
|
||||
report.Report(pass, node, fmt.Sprintf("%s is deprecated: %s", deprecatedObjName, depr.Msg))
|
||||
}
|
||||
}
|
||||
|
||||
var tfn types.Object
|
||||
stack := 0
|
||||
fn := func(node ast.Node, push bool) bool {
|
||||
if !push {
|
||||
stack--
|
||||
return false
|
||||
}
|
||||
stack++
|
||||
if stack == 1 {
|
||||
tfn = nil
|
||||
}
|
||||
if fn, ok := node.(*ast.FuncDecl); ok {
|
||||
tfn = pass.TypesInfo.ObjectOf(fn.Name)
|
||||
}
|
||||
|
||||
// FIXME(dh): this misses dot-imported objects
|
||||
sel, ok := node.(*ast.SelectorExpr)
|
||||
if !ok {
|
||||
return true
|
||||
}
|
||||
|
||||
checkIdentObj := func(sel *ast.SelectorExpr) bool {
|
||||
obj := pass.TypesInfo.ObjectOf(sel.Sel)
|
||||
|
||||
if obj_, ok := obj.(*types.Func); ok {
|
||||
obj = obj_.Origin()
|
||||
}
|
||||
if obj.Pkg() == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
if obj.Pkg() == pass.Pkg {
|
||||
// A package is allowed to use its own deprecated objects
|
||||
return true
|
||||
@@ -165,8 +148,59 @@ func run(pass *analysis.Pass) (any, error) {
|
||||
return true
|
||||
}
|
||||
|
||||
node := ast.Node(sel)
|
||||
if pass.TypesInfo.Types[sel.X].IsType() {
|
||||
node = sel.Sel
|
||||
}
|
||||
if depr, ok := deprs.Objects[obj]; ok {
|
||||
handleDeprecation(depr, sel, code.SelectorName(pass, sel), obj.Pkg().Path(), tfn)
|
||||
handleDeprecation(depr, node, code.SelectorName(pass, sel), obj.Pkg().Path(), tfn)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
fn := func(node ast.Node, push bool) bool {
|
||||
if !push {
|
||||
stack--
|
||||
return false
|
||||
}
|
||||
stack++
|
||||
if stack == 1 {
|
||||
tfn = nil
|
||||
}
|
||||
if fn, ok := node.(*ast.FuncDecl); ok {
|
||||
tfn = pass.TypesInfo.ObjectOf(fn.Name)
|
||||
}
|
||||
|
||||
switch v := node.(type) {
|
||||
// FIXME(dh): this misses dot-imported objects
|
||||
case *ast.SelectorExpr:
|
||||
return checkIdentObj(v)
|
||||
|
||||
case *ast.CompositeLit:
|
||||
litType := pass.TypesInfo.Types[v.Type]
|
||||
if !litType.IsType() {
|
||||
// This is probably unreachable.
|
||||
return true
|
||||
}
|
||||
if _, ok := litType.Type.Underlying().(*types.Struct); !ok {
|
||||
// We don't want to look at expressions in map initializers, for
|
||||
// example.
|
||||
return true
|
||||
}
|
||||
for _, elt := range v.Elts {
|
||||
kv, ok := elt.(*ast.KeyValueExpr)
|
||||
if !ok {
|
||||
return true
|
||||
}
|
||||
key, ok := kv.Key.(*ast.Ident)
|
||||
if !ok {
|
||||
// This is probably unreachable, since we're looking at keys
|
||||
// in a struct initializer.
|
||||
return true
|
||||
}
|
||||
sel := &ast.SelectorExpr{X: v.Type, Sel: key}
|
||||
checkIdentObj(sel)
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user