// Offset returns f.Offset(pos), but first checks that the file // contains the pos. // // The definition of "contains" here differs from that of token.File // in order to work around a bug in the parser (issue #57490): during // error recovery, the parser may create syntax nodes whose computed // End position is 1 byte beyond EOF, which would cause // token.File.Offset to panic. The workaround is that this function // accepts a Pos that is exactly 1 byte beyond EOF and maps it to the // EOF offset. func Offset(f *token.File, pos token.Pos) (int, error) { … } // Offsets returns Offset(start) and Offset(end). func Offsets(f *token.File, start, end token.Pos) (int, int, error) { … } // Pos returns f.Pos(offset), but first checks that the offset is // non-negative and not larger than the size of the file. func Pos(f *token.File, offset int) (token.Pos, error) { … } // inRange reports whether file f contains position pos, // according to the invariants of token.File. // // This function is not public because of the ambiguity it would // create w.r.t. the definition of "contains". Use Offset instead. func inRange(f *token.File, pos token.Pos) bool { … } // Position returns the Position for the pos value in the given file. // // p must be NoPos, a valid Pos in the range of f, or exactly 1 byte // beyond the end of f. (See [Offset] for explanation.) // Any other value causes a panic. // // Line directives (//line comments) are ignored. func Position(f *token.File, pos token.Pos) token.Position { … } // Line returns the line number for the given offset in the given file. func Line(f *token.File, pos token.Pos) int { … } // StartPosition converts a start Pos in the FileSet into a Position. // // Call this function only if start represents the start of a token or // parse tree, such as the result of Node.Pos(). If start is the end of // an interval, such as Node.End(), call EndPosition instead, as it // may need the correction described at [Position]. func StartPosition(fset *token.FileSet, start token.Pos) (_ token.Position) { … } // EndPosition converts an end Pos in the FileSet into a Position. // // Call this function only if pos represents the end of // a non-empty interval, such as the result of Node.End(). func EndPosition(fset *token.FileSet, end token.Pos) (_ token.Position) { … }