func AsUnaryExprOp(x ast.Node, op token.Token) *ast.UnaryExpr {
	e, ok := x.(*ast.UnaryExpr)
	if !ok || e.Op != op {
		return nilUnaryExpr
	}
	return e
}
AsUnaryExprOp is like AsUnaryExpr, but also checks for op token.
package lintutil
import (
	"go/ast"
	"go/token"
)
var (
	nilIdent        = &ast.Ident{}
	nilSelectorExpr = &ast.SelectorExpr{}
	nilUnaryExpr    = &ast.UnaryExpr{}
	nilBinaryExpr   = &ast.BinaryExpr{}
	nilCallExpr     = &ast.CallExpr{}
	nilParenExpr    = &ast.ParenExpr{}
	nilAssignStmt   = &ast.AssignStmt{}
)
func IsNil(x ast.Node) bool {
	switch x := x.(type) {
	case *ast.Ident:
		return x == nilIdent || x == nil
	case *ast.SelectorExpr:
		return x == nilSelectorExpr || x == nil
	case *ast.UnaryExpr:
		return x == nilUnaryExpr || x == nil
	case *ast.BinaryExpr:
		return x == nilBinaryExpr || x == nil
	case *ast.CallExpr:
		return x == nilCallExpr || x == nil
	case *ast.ParenExpr:
		return x == nilParenExpr || x == nil
	case *ast.AssignStmt:
		return x == nilAssignStmt || x == nil
	default:
		return x == nil
	}
}
func AsIdent(x ast.Node) *ast.Ident {
	e, ok := x.(*ast.Ident)
	if !ok {
		return nilIdent
	}
	return e
}
func AsSelectorExpr(x ast.Node) *ast.SelectorExpr {
	e, ok := x.(*ast.SelectorExpr)
	if !ok {
		return nilSelectorExpr
	}
	return e
}
func AsUnaryExpr(x ast.Node) *ast.UnaryExpr {
	e, ok := x.(*ast.UnaryExpr)
	if !ok {
		return nilUnaryExpr
	}
	return e
}