type importReader … var bom … func newImportReader(name string, r io.Reader) *importReader { … } func isIdent(c byte) bool { … } var errSyntax … var errNUL … // syntaxError records a syntax error, but only if an I/O error has not already been recorded. func (r *importReader) syntaxError() { … } // readByte reads the next byte from the input, saves it in buf, and returns it. // If an error occurs, readByte records the error in r.err and returns 0. func (r *importReader) readByte() byte { … } // readByteNoBuf is like readByte but doesn't buffer the byte. // It exhausts r.buf before reading from r.b. func (r *importReader) readByteNoBuf() byte { … } // peekByte returns the next byte from the input reader but does not advance beyond it. // If skipSpace is set, peekByte skips leading spaces and comments. func (r *importReader) peekByte(skipSpace bool) byte { … } // nextByte is like peekByte but advances beyond the returned byte. func (r *importReader) nextByte(skipSpace bool) byte { … } var goEmbed … // findEmbed advances the input reader to the next //go:embed comment. // It reports whether it found a comment. // (Otherwise it found an error or EOF.) func (r *importReader) findEmbed(first bool) bool { … } // readKeyword reads the given keyword from the input. // If the keyword is not present, readKeyword records a syntax error. func (r *importReader) readKeyword(kw string) { … } // readIdent reads an identifier from the input. // If an identifier is not present, readIdent records a syntax error. func (r *importReader) readIdent() { … } // readString reads a quoted string literal from the input. // If an identifier is not present, readString records a syntax error. func (r *importReader) readString() { … } // readImport reads an import clause - optional identifier followed by quoted string - // from the input. func (r *importReader) readImport() { … } // readComments is like io.ReadAll, except that it only reads the leading // block of comments in the file. // // readComments should be an internal detail, // but widely used packages access it using linkname. // Notable members of the hall of shame include: // - github.com/bazelbuild/bazel-gazelle // // Do not remove or change the type signature. // See go.dev/issue/67401. // //go:linkname readComments func readComments(f io.Reader) ([]byte, error) { … } // readGoInfo expects a Go file as input and reads the file up to and including the import section. // It records what it learned in *info. // If info.fset is non-nil, readGoInfo parses the file and sets info.parsed, info.parseErr, // info.imports and info.embeds. // // It only returns an error if there are problems reading the file, // not for syntax errors in the file itself. func readGoInfo(f io.Reader, info *fileInfo) error { … } // isValidImport checks if the import is a valid import using the more strict // checks allowed by the implementation restriction in https://go.dev/ref/spec#Import_declarations. // It was ported from the function of the same name that was removed from the // parser in CL 424855, when the parser stopped doing these checks. func isValidImport(s string) bool { … } // parseGoEmbed parses the text following "//go:embed" to extract the glob patterns. // It accepts unquoted space-separated patterns as well as double-quoted and back-quoted Go strings. // This is based on a similar function in cmd/compile/internal/gc/noder.go; // this version calculates position information as well. func parseGoEmbed(args string, pos token.Position) ([]fileEmbed, error) { … }