Source File
label.go
Belonging Package
golang.org/x/tools/internal/event/label
// Copyright 2019 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 label
import (
)
// Key is used as the identity of a Label.
// Keys are intended to be compared by pointer only, the name should be unique
// for communicating with external systems, but it is not required or enforced.
type Key interface {
// Name returns the key name.
Name() string
// Description returns a string that can be used to describe the value.
Description() string
// Format is used in formatting to append the value of the label to the
// supplied buffer.
// The formatter may use the supplied buf as a scratch area to avoid
// allocations.
Format(w io.Writer, buf []byte, l Label)
}
// Label holds a key and value pair.
// It is normally used when passing around lists of labels.
type Label struct {
key Key
packed uint64
untyped interface{}
}
// Map is the interface to a collection of Labels indexed by key.
type Map interface {
// Find returns the label that matches the supplied key.
Find(key Key) Label
}
// List is the interface to something that provides an iterable
// list of labels.
// Iteration should start from 0 and continue until Valid returns false.
type List interface {
// Valid returns true if the index is within range for the list.
// It does not imply the label at that index will itself be valid.
Valid(index int) bool
// Label returns the label at the given index.
Label(index int) Label
}
// list implements LabelList for a list of Labels.
type list struct {
labels []Label
}
// filter wraps a LabelList filtering out specific labels.
type filter struct {
keys []Key
underlying List
}
// listMap implements LabelMap for a simple list of labels.
type listMap struct {
labels []Label
}
// mapChain implements LabelMap for a list of underlying LabelMap.
type mapChain struct {
maps []Map
}
// OfValue creates a new label from the key and value.
// This method is for implementing new key types, label creation should
// normally be done with the Of method of the key.
func ( Key, interface{}) Label { return Label{key: , untyped: } }
// UnpackValue assumes the label was built using LabelOfValue and returns the value
// that was passed to that constructor.
// This method is for implementing new key types, for type safety normal
// access should be done with the From method of the key.
func ( Label) () interface{} { return .untyped }
// Of64 creates a new label from a key and a uint64. This is often
// used for non uint64 values that can be packed into a uint64.
// This method is for implementing new key types, label creation should
// normally be done with the Of method of the key.
func ( Key, uint64) Label { return Label{key: , packed: } }
// Unpack64 assumes the label was built using LabelOf64 and returns the value that
// was passed to that constructor.
// This method is for implementing new key types, for type safety normal
// access should be done with the From method of the key.
func ( Label) () uint64 { return .packed }
type stringptr unsafe.Pointer
// OfString creates a new label from a key and a string.
// This method is for implementing new key types, label creation should
// normally be done with the Of method of the key.
func ( Key, string) Label {
:= (*reflect.StringHeader)(unsafe.Pointer(&))
return Label{
key: ,
packed: uint64(.Len),
untyped: stringptr(.Data),
}
}
// UnpackString assumes the label was built using LabelOfString and returns the
// value that was passed to that constructor.
// This method is for implementing new key types, for type safety normal
// access should be done with the From method of the key.
func ( Label) () string {
var string
:= (*reflect.StringHeader)(unsafe.Pointer(&))
.Data = uintptr(.untyped.(stringptr))
.Len = int(.packed)
return
}
// Valid returns true if the Label is a valid one (it has a key).
func ( Label) () bool { return .key != nil }
// Key returns the key of this Label.
func ( Label) () Key { return .key }
// Format is used for debug printing of labels.
func ( Label) ( fmt.State, rune) {
if !.Valid() {
io.WriteString(, `nil`)
return
}
io.WriteString(, .Key().Name())
io.WriteString(, "=")
var [128]byte
.Key().Format(, [:0], )
}
func ( *list) ( int) bool {
return >= 0 && < len(.labels)
}
func ( *list) ( int) Label {
return .labels[]
}
func ( *filter) ( int) bool {
return .underlying.Valid()
}
func ( *filter) ( int) Label {
:= .underlying.Label()
for , := range .keys {
if .Key() == {
return Label{}
}
}
return
}
func ( listMap) ( Key) Label {
for , := range .labels {
if .Key() == {
return
}
}
return Label{}
}
func ( mapChain) ( Key) Label {
for , := range .maps {
:= .Find()
if .Valid() {
return
}
}
return Label{}
}
var emptyList = &list{}
func ( ...Label) List {
if len() == 0 {
return emptyList
}
return &list{labels: }
}
func ( List, ...Key) List {
if len() == 0 {
return
}
return &filter{keys: , underlying: }
}
func ( ...Label) Map {
return listMap{labels: }
}
func ( ...Map) Map {
var []Map
for , := range {
if != nil {
= append(, )
}
}
if len() == 1 {
return [0]
}
return mapChain{maps: }
}
The pages are generated with Golds v0.4.9. (GOOS=linux GOARCH=amd64)