stack/source.go
func (c *cache) load(fileName string) {
	if _, ok := c.parsed[fileName]; ok {
		return
	}
	c.parsed[fileName] = nil
	if !strings.HasSuffix(fileName, ".go") {
		// Ignore C and assembly.
		c.files[fileName] = nil
		return
	}
	log.Printf("load(%s)", fileName)
	if _, ok := c.files[fileName]; !ok {
		var err error
		if c.files[fileName], err = ioutil.ReadFile(fileName); err != nil {
			log.Printf("Failed to read %s: %s", fileName, err)
			c.files[fileName] = nil
			return
		}
	}
	fset := token.NewFileSet()
	src := c.files[fileName]
	parsed, err := parser.ParseFile(fset, fileName, src, 0)
	if err != nil {
		log.Printf("Failed to parse %s: %s", fileName, err)
		return
	}
	// Convert the line number into raw file offset.
	offsets := []int{0, 0}
	start := 0
	for l := 1; start < len(src); l++ {
		start += bytes.IndexByte(src[start:], '\n') + 1
		offsets = append(offsets, start)
	}
	c.parsed[fileName] = &parsedFile{offsets, parsed}
}
func (c *cache) load(fileName string) {
	if _, ok := c.parsed[fileName]; ok {
		return
	}
	c.parsed[fileName] = nil
	if !strings.HasSuffix(fileName, ".go") {
		// Ignore C and assembly.
		c.files[fileName] = nil
		return
	}
	log.Printf("load(%s)", fileName)
	if _, ok := c.files[fileName]; !ok {
		var err error
		if c.files[fileName], err = ioutil.ReadFile(fileName); err != nil {
			log.Printf("Failed to read %s: %s", fileName, err)
			c.files[fileName] = nil
			return
		}
	}
	fset := token.NewFileSet()
	src := c.files[fileName]
	parsed, err := parser.ParseFile(fset, fileName, src, 0)
	if err != nil {
		log.Printf("Failed to parse %s: %s", fileName, err)
		return
	}
	// Convert the line number into raw file offset.
	offsets := []int{0, 0}
	start := 0
	for l := 1; start < len(src); l++ {
		start += bytes.IndexByte(src[start:], '\n') + 1
		offsets = append(offsets, start)
	}
	c.parsed[fileName] = &parsedFile{offsets, parsed}
}
func ( c * cache ) load ( fileName string ) { if _ , ok := c . parsed [ fileName ] ; ok { return } c . parsed [ fileName ] = nil if ! strings . HasSuffix ( fileName , " " ) { // Ignore C and assembly. c . files [ fileName ] = nil return } log . Printf ( " " , fileName ) if _ , ok := c . files [ fileName ] ; ! ok { var err error if c . files [ fileName ] , err = ioutil . ReadFile ( fileName ) ; err != nil { log . Printf ( " " , fileName , err ) c . files [ fileName ] = nil return } } fset := token . NewFileSet ( ) src := c . files [ fileName ] parsed , err := parser . ParseFile ( fset , fileName , src , 0 ) if err != nil { log . Printf ( " " , fileName , err ) return } // Convert the line number into raw file offset. offsets := [ ] int { 0 , 0 } start := 0 for l := 1 ; start < len ( src ) ; l ++ { start += bytes . IndexByte ( src [ start : ] , '\n' ) + 1 offsets = append ( offsets , start ) } c . parsed [ fileName ] = & parsedFile { offsets , parsed } }
// Private stuff.
// load loads a source file and parses the AST tree. Failures are ignored.
Private stuff . load loads a source file and parses the AST tree . Failures are ignored .