in tools/go-agent/tools/enhancement.go [218:249]
func addPackagePrefixForArgsAndClone(pkg string, tp dst.Expr) dst.Expr {
switch t := tp.(type) {
case *dst.Ident:
if IsBasicDataType(t.Name) {
return dst.Clone(tp).(dst.Expr)
}
// otherwise, add the package prefix
return &dst.SelectorExpr{
X: dst.NewIdent(pkg),
Sel: dst.NewIdent(t.Name),
}
case *dst.StarExpr:
expr := dst.Clone(tp).(*dst.StarExpr)
expr.X = addPackagePrefixForArgsAndClone(pkg, t.X)
return expr
case *dst.Ellipsis:
expr := dst.Clone(tp).(*dst.Ellipsis)
expr.Elt = addPackagePrefixForArgsAndClone(pkg, t.Elt)
return expr
case *dst.SelectorExpr:
exp := dst.Clone(tp).(*dst.SelectorExpr)
// if also contains a package prefix, then it could be reffed a package with same name
// Such as current package name is "grpc", and ref another package named "grpc"
// Usually it's used on a wrapper plugin
if sel, ok := t.X.(*dst.Ident); ok && sel.Name == pkg {
exp.X = dst.NewIdent(OtherPackageRefPrefix + pkg)
}
return exp
default:
return dst.Clone(tp).(dst.Expr)
}
}