code: 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}
  }
docs: // Private stuff.
  // load loads a source file and parses the AST tree. Failures are ignored.