Structs
Error
struct
#
type Error struct {
Filename string
Pos Position
Verb string
ModPath string
Err error
}
Exclude
struct
#
An Exclude is a single exclude statement.
type Exclude struct {
Mod module.Version
Syntax *Line
}
File
struct
#
A File is the parsed, interpreted form of a go.mod file.
type File struct {
Module *Module
Go *Go
Toolchain *Toolchain
Godebug []*Godebug
Require []*Require
Exclude []*Exclude
Replace []*Replace
Retract []*Retract
Tool []*Tool
Syntax *FileSyntax
}
FileSyntax
struct
#
A FileSyntax represents an entire go.mod file.
type FileSyntax struct {
Name string
Comments
Stmt []Expr
}
Go
struct
#
A Go is the go statement.
type Go struct {
Version string
Syntax *Line
}
Godebug
struct
#
A Godebug is a single godebug key=value statement.
type Godebug struct {
Key string
Value string
Syntax *Line
}
LParen
struct
#
An LParen represents the beginning of a parenthesized line block.
It is a place to store suffix comments.
type LParen struct {
Comments
Pos Position
}
Line
struct
#
A Line is a single line of tokens.
type Line struct {
Comments
Start Position
Token []string
InBlock bool
End Position
}
LineBlock
struct
#
A LineBlock is a factored block of lines, like
require (
"x"
"y"
)
type LineBlock struct {
Comments
Start Position
LParen LParen
Token []string
Line []*Line
RParen RParen
}
Module
struct
#
A Module is the module statement.
type Module struct {
Mod module.Version
Deprecated string
Syntax *Line
}
Position
struct
#
A Position describes an arbitrary source position in a file, including the
file, line, column, and byte offset.
type Position struct {
Line int
LineRune int
Byte int
}
RParen
struct
#
An RParen represents the end of a parenthesized line block.
It is a place to store whole-line (before) comments.
type RParen struct {
Comments
Pos Position
}
Replace
struct
#
A Replace is a single replace statement.
type Replace struct {
Old module.Version
New module.Version
Syntax *Line
}
Require
struct
#
A Require is a single require statement.
type Require struct {
Mod module.Version
Indirect bool
Syntax *Line
}
Retract
struct
#
A Retract is a single retract statement.
type Retract struct {
VersionInterval
Rationale string
Syntax *Line
}
Tool
struct
#
A Tool is a single tool statement.
type Tool struct {
Path string
Syntax *Line
}
Toolchain
struct
#
A Toolchain is the toolchain statement.
type Toolchain struct {
Name string
Syntax *Line
}
Use
struct
#
A Use is a single directory statement.
type Use struct {
Path string
ModulePath string
Syntax *Line
}
VersionInterval
struct
#
A VersionInterval represents a range of versions with upper and lower bounds.
Intervals are closed: both bounds are included. When Low is equal to High,
the interval may refer to a single version ('v1.2.3') or an interval
('[v1.2.3, v1.2.3]'); both have the same representation.
type VersionInterval struct {
Low string
High string
}
WorkFile
struct
#
A WorkFile is the parsed, interpreted form of a go.work file.
type WorkFile struct {
Go *Go
Toolchain *Toolchain
Godebug []*Godebug
Use []*Use
Replace []*Replace
Syntax *FileSyntax
}
input
struct
#
An input represents a single input file being parsed.
type input struct {
filename string
complete []byte
remaining []byte
tokenStart []byte
token token
pos Position
comments []Comment
file *FileSyntax
parseErrors ErrorList
pre []Expr
post []Expr
}
printer
struct
#
A printer collects the state during printing of a file or expression.
type printer struct {
bytes.Buffer
comment []Comment
margin int
}
token
struct
#
type token struct {
kind tokenKind
pos Position
endPos Position
text string
}
Functions
AddExclude
method
#
AddExclude adds a exclude statement to the mod file. Errors if the provided
version is not a canonical version string
func (f *File) AddExclude(path string, vers string) error
AddGoStmt
method
#
func (f *WorkFile) AddGoStmt(version string) error
AddGoStmt
method
#
func (f *File) AddGoStmt(version string) error
AddGodebug
method
#
AddGodebug sets the first godebug line for key to value,
preserving any existing comments for that line and removing all
other godebug lines for key.
If no line currently exists for key, AddGodebug adds a new line
at the end of the last godebug block.
func (f *WorkFile) AddGodebug(key string, value string) error
AddGodebug
method
#
AddGodebug sets the first godebug line for key to value,
preserving any existing comments for that line and removing all
other godebug lines for key.
If no line currently exists for key, AddGodebug adds a new line
at the end of the last godebug block.
func (f *File) AddGodebug(key string, value string) error
AddModuleStmt
method
#
func (f *File) AddModuleStmt(path string) error
AddNewRequire
method
#
AddNewRequire adds a new require line for path at version vers at the end of
the last require block, regardless of any existing require lines for path.
func (f *File) AddNewRequire(path string, vers string, indirect bool)
AddNewUse
method
#
func (f *WorkFile) AddNewUse(diskPath string, modulePath string)
AddReplace
method
#
func (f *WorkFile) AddReplace(oldPath string, oldVers string, newPath string, newVers string) error
AddReplace
method
#
func (f *File) AddReplace(oldPath string, oldVers string, newPath string, newVers string) error
AddRequire
method
#
AddRequire sets the first require line for path to version vers,
preserving any existing comments for that line and removing all
other lines for path.
If no line currently exists for path, AddRequire adds a new line
at the end of the last require block.
func (f *File) AddRequire(path string, vers string) error
AddRetract
method
#
AddRetract adds a retract statement to the mod file. Errors if the provided
version interval does not consist of canonical version strings
func (f *File) AddRetract(vi VersionInterval, rationale string) error
AddTool
method
#
AddTool adds a new tool directive with the given path.
It does nothing if the tool line already exists.
func (f *File) AddTool(path string) error
AddToolchainStmt
method
#
func (f *WorkFile) AddToolchainStmt(name string) error
AddToolchainStmt
method
#
func (f *File) AddToolchainStmt(name string) error
AddUse
method
#
func (f *WorkFile) AddUse(diskPath string, modulePath string) error
AutoQuote
function
#
AutoQuote returns s or, if quoting is required for s to appear in a go.mod,
the quotation of s.
func AutoQuote(s string) string
Cleanup
method
#
Cleanup cleans up the file f after any edit operations.
To avoid quadratic behavior, modifications like [WorkFile.DropRequire]
clear the entry but do not remove it from the slice.
Cleanup cleans out all the cleared entries.
func (f *WorkFile) Cleanup()
Cleanup
method
#
Cleanup cleans up the file syntax x after any edit operations.
To avoid quadratic behavior, (*Line).markRemoved marks the line as dead
by setting line.Token = nil but does not remove it from the slice
in which it appears. After edits have all been indicated,
calling Cleanup cleans out the dead lines.
func (x *FileSyntax) Cleanup()
Cleanup
method
#
Cleanup cleans up the file f after any edit operations.
To avoid quadratic behavior, modifications like [File.DropRequire]
clear the entry but do not remove it from the slice.
Cleanup cleans out all the cleared entries.
func (f *File) Cleanup()
DropExclude
method
#
func (f *File) DropExclude(path string, vers string) error
DropGoStmt
method
#
DropGoStmt deletes the go statement from the file.
func (f *File) DropGoStmt()
DropGoStmt
method
#
DropGoStmt deletes the go statement from the file.
func (f *WorkFile) DropGoStmt()
DropGodebug
method
#
func (f *File) DropGodebug(key string) error
DropGodebug
method
#
func (f *WorkFile) DropGodebug(key string) error
DropReplace
method
#
func (f *File) DropReplace(oldPath string, oldVers string) error
DropReplace
method
#
func (f *WorkFile) DropReplace(oldPath string, oldVers string) error
DropRequire
method
#
func (f *File) DropRequire(path string) error
DropRetract
method
#
func (f *File) DropRetract(vi VersionInterval) error
DropTool
method
#
RemoveTool removes a tool directive with the given path.
It does nothing if no such tool directive exists.
func (f *File) DropTool(path string) error
DropToolchainStmt
method
#
DropToolchainStmt deletes the toolchain statement from the file.
func (f *WorkFile) DropToolchainStmt()
DropToolchainStmt
method
#
DropToolchainStmt deletes the toolchain statement from the file.
func (f *File) DropToolchainStmt()
DropUse
method
#
func (f *WorkFile) DropUse(path string) error
Error
method
#
func (e *Error) Error() string
Error
method
#
func (e ErrorList) Error() string
Error
method
#
Error is called to report an error.
Error does not return: it panics.
func (in *input) Error(s string)
Format
function
#
Format returns a go.mod file as a byte slice, formatted in standard style.
func Format(f *FileSyntax) []byte
Format
method
#
func (f *File) Format() ([]byte, error)
IsDirectoryPath
function
#
IsDirectoryPath reports whether the given path should be interpreted as a directory path.
Just like on the go command line, relative paths starting with a '.' or '..' path component
and rooted paths are directory paths; the rest are module paths.
func IsDirectoryPath(ns string) bool
ModulePath
function
#
ModulePath returns the module path from the gomod file text.
If it cannot find a module path, it returns an empty string.
It is tolerant of unrelated problems in the go.mod file.
func ModulePath(mod []byte) string
MustQuote
function
#
MustQuote reports whether s must be quoted in order to appear as
a single token in a go.mod line.
func MustQuote(s string) bool
Parse
function
#
Parse parses and returns a go.mod file.
file is the name of the file, used in positions and errors.
data is the content of the file.
fix is an optional function that canonicalizes module versions.
If fix is nil, all module versions must be canonical ([module.CanonicalVersion]
must return the same string).
func Parse(file string, data []byte, fix VersionFixer) (*File, error)
ParseLax
function
#
ParseLax is like Parse but ignores unknown statements.
It is used when parsing go.mod files other than the main module,
under the theory that most statement types we add in the future will
only apply in the main module, like exclude and replace,
and so we get better gradual deployments if old go commands
simply ignore those statements when found in go.mod files
in dependencies.
func ParseLax(file string, data []byte, fix VersionFixer) (*File, error)
ParseWork
function
#
ParseWork parses and returns a go.work file.
file is the name of the file, used in positions and errors.
data is the content of the file.
fix is an optional function that canonicalizes module versions.
If fix is nil, all module versions must be canonical ([module.CanonicalVersion]
must return the same string).
func ParseWork(file string, data []byte, fix VersionFixer) (*WorkFile, error)
SetRequire
method
#
SetRequire updates the requirements of f to contain exactly req, preserving
the existing block structure and line comment contents (except for 'indirect'
markings) for the first requirement on each named module path.
The Syntax field is ignored for the requirements in req.
Any requirements not already present in the file are added to the block
containing the last require line.
The requirements in req must specify at most one distinct version for each
module path.
If any existing requirements may be removed, the caller should call
[File.Cleanup] after all edits are complete.
func (f *File) SetRequire(req []*Require)
SetRequireSeparateIndirect
method
#
SetRequireSeparateIndirect updates the requirements of f to contain the given
requirements. Comment contents (except for 'indirect' markings) are retained
from the first existing requirement for each module path. Like SetRequire,
SetRequireSeparateIndirect adds requirements for new paths in req,
updates the version and "// indirect" comment on existing requirements,
and deletes requirements on paths not in req. Existing duplicate requirements
are deleted.
As its name suggests, SetRequireSeparateIndirect puts direct and indirect
requirements into two separate blocks, one containing only direct
requirements, and the other containing only indirect requirements.
SetRequireSeparateIndirect may move requirements between these two blocks
when their indirect markings change. However, SetRequireSeparateIndirect
won't move requirements from other blocks, especially blocks with comments.
If the file initially has one uncommented block of requirements,
SetRequireSeparateIndirect will split it into a direct-only and indirect-only
block. This aids in the transition to separate blocks.
func (f *File) SetRequireSeparateIndirect(req []*Require)
SetUse
method
#
func (f *WorkFile) SetUse(dirs []*Use)
SortBlocks
method
#
func (f *WorkFile) SortBlocks()
SortBlocks
method
#
func (f *File) SortBlocks()
Span
method
#
func (x *CommentBlock) Span() (start Position, end Position)
Span
method
#
func (x *LineBlock) Span() (start Position, end Position)
Span
method
#
func (x *LParen) Span() (start Position, end Position)
Span
method
#
func (x *RParen) Span() (start Position, end Position)
Span
method
#
func (x *FileSyntax) Span() (start Position, end Position)
Span
method
#
func (x *Line) Span() (start Position, end Position)
Unwrap
method
#
func (e *Error) Unwrap() error
add
method
#
add returns the position at the end of s, assuming it starts at p.
func (p Position) add(s string) Position
add
method
#
func (f *WorkFile) add(errs *ErrorList, line *Line, verb string, args []string, fix VersionFixer)
add
method
#
func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, args []string, fix VersionFixer, strict bool)
addLine
method
#
addLine adds a line containing the given tokens to the file.
If the first token of the hint matches the first token of the
line, the new line is added at the end of the block containing hint,
extracting hint into a new block if it is not yet in one.
If the hint is non-nil buts its first token does not match,
the new line is added after the block containing hint
(or hint itself, if not in a block).
If no hint is provided, addLine appends the line to the end of
the last block with a matching first token,
or to the end of the file if no such block exists.
func (x *FileSyntax) addLine(hint Expr, tokens ...string) *Line
addNewGodebug
method
#
addNewGodebug adds a new godebug key=value line at the end
of the last godebug block, regardless of any existing godebug lines for key.
func (f *WorkFile) addNewGodebug(key string, value string)
addNewGodebug
method
#
addNewGodebug adds a new godebug key=value line at the end
of the last godebug block, regardless of any existing godebug lines for key.
func (f *File) addNewGodebug(key string, value string)
addReplace
function
#
func addReplace(syntax *FileSyntax, replace *[]*Replace, oldPath string, oldVers string, newPath string, newVers string) error
checkCanonicalVersion
function
#
checkCanonicalVersion returns a non-nil error if vers is not a canonical
version string or does not match the major version of path.
If path is non-empty, the error text suggests a format with a major version
corresponding to the path.
func checkCanonicalVersion(path string, vers string) error
endToken
method
#
endToken marks the end of an input token.
It records the actual token string in tok.text.
A single trailing newline (LF or CRLF) will be removed from comment tokens.
func (in *input) endToken(kind tokenKind)
eof
method
#
eof reports whether the input has reached end of file.
func (in *input) eof() bool
expr
method
#
func (p *printer) expr(x Expr)
file
method
#
file formats the given file into the print buffer.
func (p *printer) file(f *FileSyntax)
fixRetract
method
#
fixRetract applies fix to each retract directive in f, appending any errors
to errs.
Most versions are fixed as we parse the file, but for retract directives,
the relevant module path is the one specified with the module directive,
and that might appear at the end of the file (or not at all).
func (f *File) fixRetract(fix VersionFixer, errs *ErrorList)
indent
method
#
indent returns the position on the current line, in bytes, 0-indexed.
func (p *printer) indent() int
isEOL
method
#
isEOL returns whether a token terminates a line.
func (k tokenKind) isEOL() bool
isIdent
function
#
isIdent reports whether c is an identifier rune.
We treat most printable runes as identifier runes, except for a handful of
ASCII punctuation characters.
func isIdent(c int) bool
isIndirect
function
#
isIndirect reports whether line has a "// indirect" comment,
meaning it is in go.mod only for its effect on indirect dependencies,
so that it can be dropped entirely once the effective version of the
indirect dependency reaches the given minimum version.
func isIndirect(line *Line) bool
lex
method
#
lex is called from the parser to obtain the next input token.
func (in *input) lex() token
lineExcludeLess
function
#
lineExcludeLess reports whether li should be sorted before lj for lines in
an "exclude" block.
func lineExcludeLess(li *Line, lj *Line) bool
lineLess
function
#
lineLess returns whether li should be sorted before lj. It sorts
lexicographically without assigning any special meaning to tokens.
func lineLess(li *Line, lj *Line) bool
lineRetractLess
function
#
lineRetractLess returns whether li should be sorted before lj for lines in
a "retract" block. It treats each line as a version interval. Single versions
are compared as if they were intervals with the same low and high version.
Intervals are sorted in descending order, first by low version, then by
high version, using semver.Compare.
func lineRetractLess(li *Line, lj *Line) bool
markRemoved
method
#
markRemoved modifies line so that it (and its end-of-line comment, if any)
will be dropped by (*FileSyntax).Cleanup.
func (line *Line) markRemoved()
markRemoved
method
#
func (r *Require) markRemoved()
modulePathMajor
function
#
func modulePathMajor(path string) (string, error)
newInput
function
#
func newInput(filename string, data []byte) *input
newline
method
#
newline ends the current line, flushing end-of-line comments.
func (p *printer) newline()
order
method
#
order walks the expression adding it and its subexpressions to the
preorder and postorder lists.
func (in *input) order(x Expr)
parse
function
#
parse parses the input file.
func parse(file string, data []byte) (f *FileSyntax, err error)
parseDeprecation
function
#
parseDeprecation extracts the text of comments on a "module" directive and
extracts a deprecation message from that.
A deprecation message is contained in a paragraph within a block of comments
that starts with "Deprecated:" (case sensitive). The message runs until the
end of the paragraph and does not include the "Deprecated:" prefix. If the
comment block has multiple paragraphs that start with "Deprecated:",
parseDeprecation returns the message from the first.
func parseDeprecation(block *LineBlock, line *Line) string
parseFile
method
#
func (in *input) parseFile()
parseLine
method
#
func (in *input) parseLine() *Line
parseLineBlock
method
#
func (in *input) parseLineBlock(start Position, token []string, lparen token) *LineBlock
parseReplace
function
#
func parseReplace(filename string, line *Line, verb string, args []string, fix VersionFixer) (*Replace, *Error)
parseStmt
method
#
func (in *input) parseStmt()
parseString
function
#
func parseString(s *string) (string, error)
parseToFile
function
#
func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (parsed *File, err error)
parseVersion
function
#
func parseVersion(verb string, path string, s *string, fix VersionFixer) (string, error)
parseVersionInterval
function
#
func parseVersionInterval(verb string, path string, args *[]string, fix VersionFixer) (VersionInterval, error)
peek
method
#
peek returns the kind of the next token returned by lex.
func (in *input) peek() tokenKind
peekPrefix
method
#
peekPrefix reports whether the remaining input begins with the given prefix.
func (in *input) peekPrefix(prefix string) bool
peekRune
method
#
peekRune returns the next rune in the input without consuming it.
func (in *input) peekRune() int
printf
method
#
printf prints to the buffer.
func (p *printer) printf(format string, args ...interface{})
readRune
method
#
readRune consumes and returns the next rune in the input.
func (in *input) readRune() int
readToken
method
#
readToken lexes the next token from the text and stores it in in.token.
func (in *input) readToken()
removeDups
method
#
removeDups removes duplicate exclude, replace and tool directives.
Earlier exclude and tool directives take priority.
Later replace directives take priority.
require directives are not de-duplicated. That's left up to higher-level
logic (MVS).
retract directives are not de-duplicated since comments are
meaningful, and versions may be retracted multiple times.
func (f *File) removeDups()
removeDups
method
#
removeDups removes duplicate replace directives.
Later replace directives take priority.
require directives are not de-duplicated. That's left up to higher-level
logic (MVS).
retract directives are not de-duplicated since comments are
meaningful, and versions may be retracted multiple times.
func (f *WorkFile) removeDups()
removeDups
function
#
func removeDups(syntax *FileSyntax, exclude *[]*Exclude, replace *[]*Replace, tool *[]*Tool)
setIndirect
method
#
setIndirect sets line to have (or not have) a "// indirect" comment.
func (r *Require) setIndirect(indirect bool)
setVersion
method
#
func (r *Require) setVersion(v string)
startToken
method
#
startToken marks the beginning of the next input token.
It must be followed by a call to endToken, once the token's text has
been consumed using readRune.
func (in *input) startToken()
stringsAdd
function
#
func stringsAdd(x []string, y []string) []string
tokens
method
#
func (p *printer) tokens(tokens []string)
trim
method
#
trim removes trailing spaces and tabs from the current line.
func (p *printer) trim()
updateLine
method
#
func (x *FileSyntax) updateLine(line *Line, tokens ...string)