func HasAnnotationRecursive(node dst.Node) bool {
	if HasAnnotation(node) {
		return true
	}
	switch n := node.(type) {
	case *dst.FuncDecl:
		if n.Type != nil && n.Type.Params != nil {
			for _, item := range n.Type.Params.List {
				if HasAnnotationRecursive(item) {
					return true
				}
			}
		}
	case *dst.SelectorExpr:
		return HasAnnotation(n.Sel) || HasAnnotation(n.X)
	case *dst.CallExpr:
		if HasAnnotationRecursive(n.Fun) {
			return true
		}
		for _, arg := range n.Args {
			if HasAnnotation(arg) {
				return true
			}
		}
	}
	return false
}
HasAnnotationRecursive determines whether the given node or one of its children has a
golines annotation on it. It's currently implemented for function declarations, fields,
call expressions, and selector expressions only.
package main
import (
	"fmt"
	"strconv"
	"strings"
	"github.com/dave/dst"
)
const annotationPrefix = "// __golines:shorten:"
func CreateAnnotation(length int) string {
	return fmt.Sprintf(
		"%s%d",
		annotationPrefix,
		length,
	)
}
func IsAnnotation(line string) bool {
	return strings.HasPrefix(
		strings.Trim(line, " \t"),
		annotationPrefix,
	)
}
func HasAnnotation(node dst.Node) bool {
	startDecorations := node.Decorations().Start.All()
	return len(startDecorations) > 0 &&
		IsAnnotation(startDecorations[len(startDecorations)-1])
}