You've already forked opentelemetry-go
mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2025-11-23 22:34:47 +02:00
59 lines
1.6 KiB
Go
59 lines
1.6 KiB
Go
// Copyright The OpenTelemetry Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Package decls provides a set of functions to parse and analyze Go source
|
|
// code and get the declarations within it.
|
|
package decls // import "go.opentelemetry.io/otel/internal/tools/semconvkit/decls"
|
|
|
|
import (
|
|
"go/ast"
|
|
"go/parser"
|
|
"go/token"
|
|
"strings"
|
|
)
|
|
|
|
// GetNames parses the Go source code in the specified package path and returns
|
|
// the names extracted from the declarations using the provided parser
|
|
// function.
|
|
//
|
|
// The names are returned as a map where the keys are the names fully
|
|
// lowercased form of the name and the values are the original format of the
|
|
// name.
|
|
func GetNames(pkgPath string, f Parser) (Names, error) {
|
|
fset := token.NewFileSet()
|
|
pkgs, err := parser.ParseDir(fset, pkgPath, nil, 0)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
out := make(Names)
|
|
for _, pkg := range pkgs {
|
|
for _, file := range pkg.Files {
|
|
for _, decl := range file.Decls {
|
|
for _, name := range f(decl) {
|
|
out[NewCanonicalName(name)] = Name(name)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return out, nil
|
|
}
|
|
|
|
// Parser is a function type that takes an [ast.Decl] and returns a slice of
|
|
// parsed string identifiers.
|
|
type Parser func(ast.Decl) []string
|
|
|
|
// CanonicalName is the canonical form of a name (lowercase).
|
|
type CanonicalName string
|
|
|
|
// NewCanonicalName returns name as a [CanonicalName].
|
|
func NewCanonicalName(name string) CanonicalName {
|
|
return CanonicalName(strings.ToLower(name))
|
|
}
|
|
|
|
// Name is the original form of a name (case-sensitive).
|
|
type Name string
|
|
|
|
// Names is a map of canonical names to their original names.
|
|
type Names map[CanonicalName]Name
|