2024-02-17 21:23:35 +03:00
|
|
|
// Copyright 2024 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 typesinternal
|
|
|
|
|
|
|
|
import (
|
|
|
|
"go/types"
|
|
|
|
|
|
|
|
"golang.org/x/tools/internal/aliases"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ReceiverNamed returns the named type (if any) associated with the
|
|
|
|
// type of recv, which may be of the form N or *N, or aliases thereof.
|
|
|
|
// It also reports whether a Pointer was present.
|
|
|
|
func ReceiverNamed(recv *types.Var) (isPtr bool, named *types.Named) {
|
|
|
|
t := recv.Type()
|
|
|
|
if ptr, ok := aliases.Unalias(t).(*types.Pointer); ok {
|
|
|
|
isPtr = true
|
|
|
|
t = ptr.Elem()
|
|
|
|
}
|
|
|
|
named, _ = aliases.Unalias(t).(*types.Named)
|
|
|
|
return
|
|
|
|
}
|
2024-02-20 20:53:47 +03:00
|
|
|
|
|
|
|
// Unpointer returns T given *T or an alias thereof.
|
|
|
|
// For all other types it is the identity function.
|
|
|
|
// It does not look at underlying types.
|
|
|
|
// The result may be an alias.
|
|
|
|
//
|
|
|
|
// Use this function to strip off the optional pointer on a receiver
|
|
|
|
// in a field or method selection, without losing the named type
|
|
|
|
// (which is needed to compute the method set).
|
|
|
|
//
|
|
|
|
// See also [typeparams.MustDeref], which removes one level of
|
|
|
|
// indirection from the type, regardless of named types (analogous to
|
|
|
|
// a LOAD instruction).
|
|
|
|
func Unpointer(t types.Type) types.Type {
|
|
|
|
if ptr, ok := aliases.Unalias(t).(*types.Pointer); ok {
|
|
|
|
return ptr.Elem()
|
|
|
|
}
|
|
|
|
return t
|
|
|
|
}
|