astutil

package
v0.39.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 12, 2025 License: BSD-3-Clause Imports: 15 Imported by: 0

Documentation

Overview

Package astutil provides various AST utility functions for gopls.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CloneNode

func CloneNode[T ast.Node](n T) T

CloneNode returns a deep copy of a Node. It omits pointers to ast.{Scope,Object} variables.

func Comments added in v0.38.0

func Comments(file *ast.File, start, end token.Pos) iter.Seq[*ast.Comment]

Comments returns an iterator over the comments overlapping the specified interval.

func CursorValid added in v0.39.0

func CursorValid(cur inspector.Cursor) bool

CursorValid reports whether the cursor is valid.

A valid cursor may yet be the virtual root node, cur.Inspector.Root(), which has no [Cursor.Node].

TODO(adonovan): move to cursorutil package, and move that package into x/tools. Ultimately, make this a method of Cursor. Needs a proposal.

func Deprecation added in v0.30.0

func Deprecation(doc *ast.CommentGroup) string

Deprecation returns the paragraph of the doc comment that starts with the conventional "Deprecation: " marker, as defined by https://go.dev/wiki/Deprecated, or "" if the documented symbol is not deprecated.

func DocComment added in v0.38.0

func DocComment(n ast.Node) *ast.CommentGroup

DocComment returns the doc comment for a node, if any.

func EnclosingFile added in v0.38.0

func EnclosingFile(c inspector.Cursor) *ast.File

EnclosingFile returns the syntax tree for the file enclosing c.

TODO(adonovan): promote this to a method of Cursor.

func Equal added in v0.37.0

func Equal(x, y ast.Node, identical func(x, y *ast.Ident) bool) bool

Equal reports whether two nodes are structurally equal, ignoring fields of type token.Pos, ast.Object, and ast.Scope, and comments.

The operands x and y may be nil. A nil slice is not equal to an empty slice.

The provided function determines whether two identifiers should be considered identical.

func EqualSyntax added in v0.38.0

func EqualSyntax(x, y ast.Expr) bool

EqualSyntax reports whether x and y are equal. Identifiers are considered equal if they are spelled the same. Comments are ignored.

func FlatFields added in v0.37.0

func FlatFields(list *ast.FieldList) iter.Seq2[*ast.Ident, *ast.Field]

FlatFields 'flattens' an ast.FieldList, returning an iterator over each (name, field) combination in the list. For unnamed fields, the identifier is nil.

func Format added in v0.38.0

func Format(fset *token.FileSet, n ast.Node) string

Format returns a string representation of the node n.

func IsChildOf added in v0.38.0

func IsChildOf(cur inspector.Cursor, ek edge.Kind) bool

IsChildOf reports whether cur.ParentEdge is ek.

TODO(adonovan): promote to a method of Cursor.

func NodeContains added in v0.37.0

func NodeContains(n ast.Node, rng Range) bool

NodeContains reports whether the Pos/End range of node n encloses the given range.

It is inclusive of both end points, to allow hovering (etc) when the cursor is immediately after a node.

Like NodeRange, it treats the range of an ast.File as the file's complete extent.

Precondition: n must not be nil.

func NodeContainsPos added in v0.39.0

func NodeContainsPos(n ast.Node, pos token.Pos) bool

NodeContainPos reports whether the Pos/End range of node n encloses the given pos.

Like NodeRange, it treats the range of an ast.File as the file's complete extent.

func PosInStringLiteral added in v0.30.0

func PosInStringLiteral(lit *ast.BasicLit, offset int) (token.Pos, error)

PosInStringLiteral returns the position within a string literal corresponding to the specified byte offset within the logical string that it denotes.

func PreorderStack added in v0.33.0

func PreorderStack(root ast.Node, stack []ast.Node, f func(n ast.Node, stack []ast.Node) bool)

PreorderStack traverses the tree rooted at root, calling f before visiting each node.

Each call to f provides the current node and traversal stack, consisting of the original value of stack appended with all nodes from root to n, excluding n itself. (This design allows calls to PreorderStack to be nested without double counting.)

If f returns false, the traversal skips over that subtree. Unlike ast.Inspect, no second call to f is made after visiting node n. In practice, the second call is nearly always used only to pop the stack, and it is surprisingly tricky to do this correctly; see https://go.dev/issue/73319.

TODO(adonovan): replace with ast.PreorderStack when go1.25 is assured.

func PurgeFuncBodies added in v0.37.0

func PurgeFuncBodies(src []byte) []byte

PurgeFuncBodies returns a copy of src in which the contents of each outermost {...} region except struct and interface types have been deleted. This reduces the amount of work required to parse the top-level declarations.

PurgeFuncBodies does not preserve newlines or position information. Also, if the input is invalid, parsing the output of PurgeFuncBodies may result in a different tree due to its effects on parser error recovery.

func Select added in v0.39.0

func Select(curFile inspector.Cursor, start, end token.Pos) (_enclosing, _start, _end inspector.Cursor, _ error)

Select returns the syntax nodes identified by a user's text selection. It returns three nodes: the innermost node that wholly encloses the selection; and the first and last nodes that are wholly enclosed by the selection.

For example, given this selection:

{ f(); g(); /* comment */ }
  ~~~~~~~~~~~

Select returns the enclosing BlockStmt, the f() CallExpr, and the g() CallExpr.

Callers that require exactly one syntax tree (e.g. just f() or just g()) should check that the returned start and end nodes are identical.

This function is intended to be called early in the handling of a user's request, since it is tolerant of sloppy selection including extraneous whitespace and comments. Use it in new code instead of PathEnclosingInterval. When the exact extent of a node is known, use [Cursor.FindByPos] instead.

func UnpackRecv added in v0.37.0

func UnpackRecv(rtyp ast.Expr) (ptr bool, rname *ast.Ident, tparams []*ast.Ident)

UnpackRecv unpacks a receiver type expression, reporting whether it is a pointer receiver, along with the type name identifier and any receiver type parameter identifiers.

Copied (with modifications) from go/types.

Types

type Directive added in v0.31.0

type Directive struct {
	Pos  token.Pos // of preceding "//"
	Tool string
	Name string
	Args string // may contain internal spaces
}

A directive is a comment line with special meaning to the Go toolchain or another tool. It has the form:

//tool:name args

The "tool:" portion is missing for the three directives named line, extern, and export.

See https://go.dev/doc/comment#Syntax for details of Go comment syntax and https://pkg.go.dev/cmd/compile#hdr-Compiler_Directives for details of directives used by the Go compiler.

func Directives added in v0.31.0

func Directives(g *ast.CommentGroup) (res []*Directive)

Directives returns the directives within the comment.

type Range added in v0.39.0

type Range struct{ Start, EndPos token.Pos }

Range is a Pos interval. It implements [analysis.Range] and ast.Node.

func NodeRange added in v0.39.0

func NodeRange(n ast.Node) Range

NodeRange returns the extent of node n as a Range.

For unfortunate historical reasons, the Pos/End extent of an ast.File runs from the start of its package declaration---excluding copyright comments, build tags, and package documentation---to the end of its last declaration, excluding any trailing comments. So, as a special case, if n is an ast.File, NodeContains uses n.FileStart <= pos && pos <= n.FileEnd to report whether the position lies anywhere within the file.

func RangeInStringLiteral added in v0.30.0

func RangeInStringLiteral(lit *ast.BasicLit, start, end int) (Range, error)

RangeInStringLiteral calculates the positional range within a string literal corresponding to the specified start and end byte offsets within the logical string.

func RangeOf added in v0.39.0

func RangeOf(start, end token.Pos) Range

RangeOf constructs a Range.

RangeOf exists to pacify the "unkeyed literal" (composites) vet check. It would be nice if there were a way for a type to add itself to the allowlist.

func (Range) Contains added in v0.39.0

func (r Range) Contains(rng Range) bool

Contains reports whether the range (inclusive of both end points) includes the specified range.

func (Range) ContainsPos added in v0.39.0

func (r Range) ContainsPos(pos token.Pos) bool

ContainsPos reports whether the range (inclusive of both end points) includes the specified position.

func (Range) End added in v0.39.0

func (r Range) End() token.Pos

func (Range) IsValid added in v0.39.0

func (r Range) IsValid() bool

IsValid reports whether the range is valid.

func (Range) Pos added in v0.39.0

func (r Range) Pos() token.Pos

Directories

Path Synopsis
Package free defines utilities for computing the free variables of a syntax tree without type information.
Package free defines utilities for computing the free variables of a syntax tree without type information.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL