Documentation
¶
Overview ¶
Package build implements parsing and printing of BUILD files.
Index ¶
- Constants
- Variables
- func EditChildren(v Expr, f func(x Expr, stk []Expr) Expr)
- func Format(f *File) []byte
- func FormatString(x Expr) string
- func FormatWithRewriter(w *Rewriter, f *File) []byte
- func FormatWithoutRewriting(f *File) []byte
- func GetParamName(param Expr) (name, op string)
- func GetTypes(t Expr) []string
- func IsCorrectEscaping(value string) bool
- func IsMultiLine(param Expr) bool
- func Rewrite(f *File)
- func SortLoadArgs(load *LoadStmt) bool
- func SortStringList(x Expr)
- func Strings(expr Expr) []string
- func Unquote(quoted string) (s string, triple bool, err error)
- func Walk(v Expr, f func(x Expr, stk []Expr))
- func WalkInterruptable(v Expr, f func(x Expr, stk []Expr) error)
- func WalkOnce(v Expr, f func(x *Expr))
- func WalkPointers(v Expr, f func(x *Expr, stk []Expr))
- func WalkStatements(v Expr, f func(x Expr, stk []Expr) error)
- type AssignExpr
- type BinaryExpr
- type BranchStmt
- type CallExpr
- type Comment
- type CommentBlock
- type Comments
- type Comprehension
- type ConditionalExpr
- type DefStmt
- type DictExpr
- type DotExpr
- type End
- type Expr
- type File
- func Parse(filename string, data []byte) (*File, error)
- func ParseBuild(filename string, data []byte) (*File, error)
- func ParseBzl(filename string, data []byte) (*File, error)
- func ParseDefault(filename string, data []byte) (*File, error)
- func ParseModule(filename string, data []byte) (*File, error)
- func ParseWorkspace(filename string, data []byte) (*File, error)
- func (f *File) CanonicalPath() string
- func (f *File) Copy() Expr
- func (f *File) DelRules(kind, name string) int
- func (f *File) DisplayPath() string
- func (f *File) Rule(call *CallExpr) *Rule
- func (f *File) RuleAt(linenum int) *Rule
- func (f *File) RuleNamed(name string) *Rule
- func (f *File) Rules(kind string) []*Rule
- func (f *File) Span() (start, end Position)
- type FileType
- type ForClause
- type ForStmt
- type Function
- type Ident
- type IfClause
- type IfStmt
- type IndexExpr
- type KeyValueExpr
- type LambdaExpr
- type ListExpr
- type LiteralExpr
- type LoadStmt
- type ParenExpr
- type ParseError
- type Position
- type ReturnStmt
- type Rewriter
- type Rule
- func (r *Rule) Attr(key string) Expr
- func (r *Rule) AttrDefn(key string) *AssignExpr
- func (r *Rule) AttrKeys() []string
- func (r *Rule) AttrLiteral(key string) string
- func (r *Rule) AttrString(key string) string
- func (r *Rule) AttrStrings(key string) []string
- func (r *Rule) DelAttr(key string) Expr
- func (r *Rule) ExplicitName() string
- func (r *Rule) Kind() string
- func (r *Rule) Name() string
- func (r *Rule) SetAttr(key string, val Expr)
- func (r *Rule) SetKind(kind string)
- type SetExpr
- type SliceExpr
- type StopTraversalError
- type StringExpr
- type TupleExpr
- type TypedIdent
- type UnaryExpr
Constants ¶
const ShiftInstead = 57379
Variables ¶
var AllowSort []string
AllowSort allows sorting of these lists even with sorting otherwise disabled (for debugging).
var DisableRewrites []string
DisableRewrites disables certain rewrites (for debugging).
Functions ¶
func EditChildren ¶
EditChildren is similar to Edit but doesn't visit the initial node, instead goes directly to its children.
func FormatString ¶
FormatString returns the string form of the given expression.
func FormatWithRewriter ¶
FormatWithRewriter rewites the file with custom rewriter and returns the formatted form of it
func FormatWithoutRewriting ¶
FormatWithoutRewriting returns the formatted form of the given Starlark file. This function is mostly useful for tests only, please consider using `Format` instead.
func GetParamName ¶
GetParamName extracts the param name from an item of function params.
func GetTypes ¶
GetTypes returns the list of types defined by the a given expression. Examples:
List[tuple[bool, int]] should return [List, Tuple, bool, int] str should return str
func IsCorrectEscaping ¶
IsCorrectEscaping reports whether a string doesn't contain any incorrectly escaped sequences such as "\a".
func IsMultiLine ¶
IsMultiLine returns whether an Expr is multiline or not.
func SortLoadArgs ¶
SortLoadArgs sorts a load statement arguments (lexicographically, but positional first)
func SortStringList ¶
func SortStringList(x Expr)
SortStringList sorts x, a list of strings. The list is broken by non-strings and by blank lines and comments into chunks. Each chunk is sorted in place.
func Strings ¶
Strings returns expr as a []string. If expr is not a list of string literals, Strings returns a nil slice instead. If expr is an empty list of string literals, returns a non-nil empty slice. (this allows differentiating between these two cases)
func Unquote ¶
Unquote unquotes the quoted string, returning the actual string value, whether the original was triple-quoted, and an error describing invalid input.
func Walk ¶
Walk walks the expression tree v, calling f on all subexpressions in a preorder traversal.
The stk argument is the stack of expressions in the recursion above x, from outermost to innermost.
func WalkInterruptable ¶
WalkInterruptable is the same as Walk but allows traversal to be interrupted.
func WalkPointers ¶
WalkPointers is the same as Walk but calls the callback function with pointers to nodes.
Types ¶
type AssignExpr ¶
type AssignExpr struct {
Comments
// LHS is the left hand side operation. For example, if the expression is
// "default_visibility = [:foo]", the LHS is the Ident "default_visibility".
LHS Expr
// OpPos is the position of the Op.
OpPos Position
// Op is the operation of the expression. For example, if the expression
// is "default_visibility = [:foo]", the Op is "="".
Op string
// LineBreak is whether there is a linebreak between Op and RHS.
LineBreak bool
// RHS is the right hand side operation. For example, if the expression is
// "default_visibility = [":foo"]", the RHS is the ListExpr [":foo"].
RHS Expr
}
An AssignExpr represents a binary expression with `=`: LHS = RHS.
func (*AssignExpr) Copy ¶
func (x *AssignExpr) Copy() Expr
Copy creates and returns a non-deep copy of AssignExpr
func (*AssignExpr) Span ¶
func (x *AssignExpr) Span() (start, end Position)
Span returns the start and end positions of the node
type BinaryExpr ¶
type BinaryExpr struct {
Comments
X Expr
OpStart Position
Op string
LineBreak bool // insert line break between Op and Y
Y Expr
}
A BinaryExpr represents a binary expression: X Op Y.
func (*BinaryExpr) Copy ¶
func (x *BinaryExpr) Copy() Expr
Copy creates and returns a non-deep copy of BinaryExpr
func (*BinaryExpr) Span ¶
func (x *BinaryExpr) Span() (start, end Position)
Span returns the start and end positions of the node
type BranchStmt ¶
BranchStmt represents a `pass`, `break`, or `continue` statement.
func (*BranchStmt) Copy ¶
func (x *BranchStmt) Copy() Expr
Copy creates and returns a non-deep copy of BranchStmt
func (*BranchStmt) Span ¶
func (x *BranchStmt) Span() (start, end Position)
Span returns the start and end positions of the node
type CallExpr ¶
type CallExpr struct {
Comments
X Expr
ListStart Position // position of (
List []Expr
End // position of )
ForceCompact bool // force compact (non-multiline) form when printing
ForceMultiLine bool // force multiline form when printing
}
A CallExpr represents a function call expression: X(List).
type CommentBlock ¶
A CommentBlock represents a top-level block of comments separate from any rule.
func (*CommentBlock) Copy ¶
func (x *CommentBlock) Copy() Expr
Copy creates and returns a non-deep copy of CommentBlock
func (*CommentBlock) Span ¶
func (x *CommentBlock) Span() (start, end Position)
Span returns the start and end positions of the node
type Comments ¶
type Comments struct {
Before []Comment // whole-line comments before this expression
Suffix []Comment // end-of-line comments after this expression
// For top-level expressions only, After lists whole-line
// comments following the expression.
After []Comment
}
Comments collects the comments associated with an expression.
type Comprehension ¶
type Comprehension struct {
Comments
Curly bool // curly braces (as opposed to square brackets)
Lbrack Position
Body Expr
Clauses []Expr // = *ForClause | *IfClause
ForceMultiLine bool // split expression across multiple lines
End
}
A Comprehension represents a list comprehension expression: [X for ... if ...].
func (*Comprehension) Copy ¶
func (x *Comprehension) Copy() Expr
Copy creates and returns a non-deep copy of Comprehension
func (*Comprehension) Span ¶
func (x *Comprehension) Span() (start, end Position)
Span returns the start and end positions of the node
type ConditionalExpr ¶
type ConditionalExpr struct {
Comments
Then Expr
IfStart Position
Test Expr
ElseStart Position
Else Expr
}
ConditionalExpr represents the conditional: X if TEST else ELSE.
func (*ConditionalExpr) Copy ¶
func (x *ConditionalExpr) Copy() Expr
Copy creates and returns a non-deep copy of ConditionalExpr
func (*ConditionalExpr) Span ¶
func (x *ConditionalExpr) Span() (start, end Position)
Span returns the start and end position of the expression, excluding leading or trailing comments. Span returns the start and end positions of the node
type DefStmt ¶
type DefStmt struct {
Comments
Function
Name string
ColonPos Position // position of the ":"
ForceCompact bool // force compact (non-multiline) form when printing the arguments
ForceMultiLine bool // force multiline form when printing the arguments
Type Expr // type annotation
}
A DefStmt represents a function definition expression: def foo(List):.
func (*DefStmt) HeaderSpan ¶
HeaderSpan returns the span of the function header `def f(...):`
type DictExpr ¶
type DictExpr struct {
Comments
Start Position
List []*KeyValueExpr
End
ForceMultiLine bool // force multiline form when printing
}
A DictExpr represents a dictionary literal: { List }.
type DotExpr ¶
A DotExpr represents a field selector: X.Name.
type End ¶
An End represents the end of a parenthesized or bracketed expression. It is a place to hang comments.
type Expr ¶
type Expr interface {
// Span returns the start and end position of the expression,
// excluding leading or trailing comments.
Span() (start, end Position)
// Comment returns the comments attached to the expression.
// This method would normally be named 'Comments' but that
// would interfere with embedding a type of the same name.
Comment() *Comments
// Copy returns a non-deep copy of the node. Can be useful if
// the actual node type is hidden by the Expr interface and
// not relevant.
Copy() Expr
}
An Expr represents an input element.
type File ¶
type File struct {
Path string // absolute file path
Pkg string // optional; the package of the file (always forward slashes)
Label string // optional; file path relative to the package name (always forward slashes)
WorkspaceRoot string // optional; path to the directory containing the WORKSPACE file
Type FileType
Comments
Stmt []Expr
}
A File represents an entire BUILD or .bzl file.
func Parse ¶
Parse parses the input data and returns the corresponding parse tree.
Uses the filename to detect the formatting type (build, workspace, or default) and calls ParseBuild, ParseWorkspace, or ParseDefault correspondingly.
func ParseBuild ¶
ParseBuild parses a file, marks it as a BUILD file and returns the corresponding parse tree.
The filename is used only for generating error messages.
func ParseBzl ¶
ParseBzl parses a file, marks it as a .bzl file and returns the corresponding parse tree.
The filename is used only for generating error messages.
func ParseDefault ¶
ParseDefault parses a file, marks it as a generic Starlark file and returns the corresponding parse tree.
The filename is used only for generating error messages.
func ParseModule ¶
ParseModule parses a file, marks it as a MODULE.bazel file and returns the corresponding parse tree.
The filename is used only for generating error messages.
func ParseWorkspace ¶
ParseWorkspace parses a file, marks it as a WORKSPACE file and returns the corresponding parse tree.
The filename is used only for generating error messages.
func (*File) CanonicalPath ¶
CanonicalPath returns the path of a file relative to the workspace root with forward slashes only
func (*File) DelRules ¶
DelRules removes rules with the given kind and name from the file. An empty kind matches all kinds; an empty name matches all names. It returns the number of rules that were deleted.
func (*File) DisplayPath ¶
DisplayPath returns the filename if it's not empty, "<stdin>" otherwise
func (*File) RuleAt ¶
RuleAt returns the rule in the file that starts at the specified line, or null if no such rule.
func (*File) RuleNamed ¶
RuleNamed returns the rule in the file that has the specified name, or null if no such rule.
type FileType ¶
type FileType int
FileType represents a type of a file (default (for .bzl files), BUILD, or WORKSPACE). Certain formatting or refactoring rules can be applied to several file types, so they support bitwise operations: `type1 | type2` can represent a scope (e.g. BUILD and WORKSPACE files) and `scope & fileType` can be used to check whether a file type belongs to a scope.
const ( // TypeDefault represents general Starlark files TypeDefault FileType = 1 << iota // TypeBuild represents BUILD files TypeBuild // TypeWorkspace represents WORKSPACE files TypeWorkspace // TypeBzl represents .bzl files TypeBzl // TypeModule represents MODULE.bazel and *.MODULE.bazel files TypeModule )
type ForClause ¶
A ForClause represents a for clause in a list comprehension: for Var in Expr.
type ForStmt ¶
type ForStmt struct {
Comments
Function
For Position // position of for
Vars Expr
X Expr
Body []Expr
}
A ForStmt represents a for loop block: for x in range(10):.
type Function ¶
type Function struct {
Comments
StartPos Position // position of DEF or LAMBDA token
Params []Expr
Body []Expr
}
A Function represents the common parts of LambdaExpr and DefStmt
type Ident ¶
An Ident represents an identifier.
func GetParamIdent ¶
GetParamIdent extracts the param identifier from an item of function params.
type IfClause ¶
An IfClause represents an if clause in a list comprehension: if Cond.
type IfStmt ¶
type IfStmt struct {
Comments
If Position // position of if
Cond Expr
True []Expr
ElsePos End // position of else or elif
False []Expr // optional
}
An IfStmt represents an if-else block: if x: ... else: ... . `elif`s are treated as a chain of `IfStmt`s.
type IndexExpr ¶
An IndexExpr represents an index expression: X[Y].
type KeyValueExpr ¶
A KeyValueExpr represents a dictionary entry: Key: Value.
func (*KeyValueExpr) Copy ¶
func (x *KeyValueExpr) Copy() Expr
Copy creates and returns a non-deep copy of KeyValueExpr
func (*KeyValueExpr) Span ¶
func (x *KeyValueExpr) Span() (start, end Position)
Span returns the start and end positions of the node
type LambdaExpr ¶
A LambdaExpr represents a lambda expression: lambda Var: Expr.
func (*LambdaExpr) Copy ¶
func (x *LambdaExpr) Copy() Expr
Copy creates and returns a non-deep copy of LambdaExpr
func (*LambdaExpr) Span ¶
func (x *LambdaExpr) Span() (start, end Position)
Span returns the start and end positions of the node
type ListExpr ¶
type ListExpr struct {
Comments
Start Position
List []Expr
End
ForceMultiLine bool // force multiline form when printing
}
A ListExpr represents a list literal: [ List ].
type LiteralExpr ¶
A LiteralExpr represents a literal number.
func (*LiteralExpr) Copy ¶
func (x *LiteralExpr) Copy() Expr
Copy creates and returns a non-deep copy of LiteralExpr
func (*LiteralExpr) Span ¶
func (x *LiteralExpr) Span() (start, end Position)
Span returns the start and end positions of the node
type LoadStmt ¶
type LoadStmt struct {
Comments
Load Position
Module *StringExpr
From []*Ident // name defined in loading module
To []*Ident // name in loaded module
Rparen End
ForceCompact bool // force compact (non-multiline) form when printing
}
A LoadStmt loads another module and binds names from it: load(Module, "x", y="foo").
The AST is slightly unfaithful to the concrete syntax here because Skylark's load statement, so that it can be implemented in Python, binds some names (like y above) with an identifier and some (like x) without. For consistency we create fake identifiers for all the strings.
type ParenExpr ¶
type ParenExpr struct {
Comments
Start Position
X Expr
End
ForceMultiLine bool // insert line break after opening ( and before closing )
}
A ParenExpr represents a parenthesized expression: (X).
type ParseError ¶
ParseError contains information about the error encountered during parsing.
func (ParseError) Error ¶
func (e ParseError) Error() string
Error returns a string representation of the parse error.
type Position ¶
type Position struct {
Line int // line in input (starting at 1)
LineRune int // rune in line (starting at 1)
Byte int // byte in input (starting at 0)
}
A Position describes the position between two bytes of input.
type ReturnStmt ¶
A ReturnStmt represents a return statement: return f(x).
func (*ReturnStmt) Copy ¶
func (x *ReturnStmt) Copy() Expr
Copy creates and returns a non-deep copy of ReturnStmt
func (*ReturnStmt) Span ¶
func (x *ReturnStmt) Span() (start, end Position)
Span returns the start and end positions of the node
type Rewriter ¶
type Rewriter struct {
RewriteSet []string
IsLabelArg map[string]bool
LabelDenyList map[string]bool
IsSortableListArg map[string]bool
SortableDenylist map[string]bool
SortableAllowlist map[string]bool
NamePriority map[string]int
StripLabelLeadingSlashes bool
ShortenAbsoluteLabelsToRelative bool
}
Rewriter controls the rewrites to be applied.
If non-nil, the rewrites with the specified names will be run. If nil, a default set of rewrites will be used that is determined by the type (BUILD vs default starlark) of the file being rewritten.
type Rule ¶
type Rule struct {
Call *CallExpr
ImplicitName string // The name which should be used if the name attribute is not set. See the comment on File.implicitRuleName.
}
A Rule represents a single BUILD rule.
func (*Rule) Attr ¶
Attr returns the value of the rule's attribute with the given key (such as "name" or "deps"). If the rule has no such attribute, Attr returns nil.
func (*Rule) AttrDefn ¶
func (r *Rule) AttrDefn(key string) *AssignExpr
AttrDefn returns the AssignExpr defining the rule's attribute with the given key. If the rule has no such attribute, AttrDefn returns nil.
func (*Rule) AttrLiteral ¶
AttrLiteral returns the literal form of the rule's attribute with the given key (such as "cc_api_version"), only when that value is an identifier or number. If the rule has no such attribute or the attribute is not an identifier or number, AttrLiteral returns "".
func (*Rule) AttrString ¶
AttrString returns the value of the rule's attribute with the given key (such as "name"), as a string. If the rule has no such attribute or the attribute has a non-string value, Attr returns the empty string.
func (*Rule) AttrStrings ¶
AttrStrings returns the value of the rule's attribute with the given key (such as "srcs"), as a []string. If the rule has no such attribute or the attribute is not a list of strings, AttrStrings returns a nil slice.
func (*Rule) DelAttr ¶
DelAttr deletes the rule's attribute with the named key. It returns the old value of the attribute, or nil if the attribute was not found.
func (*Rule) ExplicitName ¶
ExplicitName returns the rule's target name if it's explicitly provided as a string value, "" otherwise.
func (*Rule) Kind ¶
Kind returns the rule's kind (such as "go_library"). The kind of the rule may be given by a literal or it may be a sequence of dot expressions that begins with a literal, if the call expression does not conform to either of these forms, an empty string will be returned
func (*Rule) Name ¶
Name returns the rule's target name. If the rule has no explicit target name, Name returns the implicit name if there is one, else the empty string.
type SetExpr ¶
type SetExpr struct {
Comments
Start Position
List []Expr
End
ForceMultiLine bool // force multiline form when printing
}
A SetExpr represents a set literal: { List }.
type SliceExpr ¶
type SliceExpr struct {
Comments
X Expr
SliceStart Position
From Expr
FirstColon Position
To Expr
SecondColon Position
Step Expr
End Position
}
A SliceExpr represents a slice expression: expr[from:to] or expr[from:to:step] .
type StopTraversalError ¶
type StopTraversalError struct{}
StopTraversalError is a special error that tells the walker to not traverse further and visit child nodes of the current node.
func (*StopTraversalError) Error ¶
func (m *StopTraversalError) Error() string
type StringExpr ¶
type StringExpr struct {
Comments
Start Position
Value string // string value (decoded)
TripleQuote bool // triple quote output
End Position
// To allow specific formatting of string literals,
// at least within our requirements, record the
// preferred form of Value. This field is a hint:
// it is only used if it is a valid quoted form for Value.
Token string
}
A StringExpr represents a single literal string.
func (*StringExpr) Copy ¶
func (x *StringExpr) Copy() Expr
Copy creates and returns a non-deep copy of StringExpr
func (*StringExpr) Span ¶
func (x *StringExpr) Span() (start, end Position)
Span returns the start and end positions of the node
type TupleExpr ¶
type TupleExpr struct {
Comments
NoBrackets bool // true if a tuple has no brackets, e.g. `a, b = x`
Start Position
List []Expr
End
ForceCompact bool // force compact (non-multiline) form when printing
ForceMultiLine bool // force multiline form when printing
}
A TupleExpr represents a tuple literal: (List)
type TypedIdent ¶
An TypedIdent represents an identifier with type annotation: "foo: int".
func (*TypedIdent) Copy ¶
func (x *TypedIdent) Copy() Expr
Copy creates and returns a non-deep copy of TypedIdent
func (*TypedIdent) Span ¶
func (x *TypedIdent) Span() (start, end Position)
Span returns the start and end positions of the node