func goFileInfo(path, rel string) fileInfo {
	info := fileNameInfo(path)
	fset := token.NewFileSet()
	pf, err := parser.ParseFile(fset, info.path, nil, parser.ImportsOnly|parser.ParseComments)
	if err != nil {
		log.Printf("%s: error reading go file: %v", info.path, err)
		return info
	}

	info.packageName = pf.Name.Name
	if info.isTest && strings.HasSuffix(info.packageName, "_test") {
		info.packageName = info.packageName[:len(info.packageName)-len("_test")]
	}

	for _, decl := range pf.Decls {
		d, ok := decl.(*ast.GenDecl)
		if !ok {
			continue
		}
		for _, dspec := range d.Specs {
			spec, ok := dspec.(*ast.ImportSpec)
			if !ok {
				continue
			}
			quoted := spec.Path.Value
			path, err := strconv.Unquote(quoted)
			if err != nil {
				log.Printf("%s: error reading go file: %v", info.path, err)
				continue
			}

			if path == "C" {
				if info.isTest {
					log.Printf("%s: warning: use of cgo in test not supported", info.path)
				}
				info.isCgo = true
				cg := spec.Doc
				if cg == nil && len(d.Specs) == 1 {
					cg = d.Doc
				}
				if cg != nil {
					if err := saveCgo(&info, rel, cg); err != nil {
						log.Printf("%s: error reading go file: %v", info.path, err)
					}
				}
				continue
			}
			info.imports = append(info.imports, path)
		}
	}

	tags, err := readTags(info.path)
	if err != nil {
		log.Printf("%s: error reading go file: %v", info.path, err)
		return info
	}
	info.tags = tags

	return info
}
func goFileInfo(path, rel string) fileInfo {
	info := fileNameInfo(path)
	fset := token.NewFileSet()
	pf, err := parser.ParseFile(fset, info.path, nil, parser.ImportsOnly|parser.ParseComments)
	if err != nil {
		log.Printf("%s: error reading go file: %v", info.path, err)
		return info
	}

	info.packageName = pf.Name.Name
	if info.isTest && strings.HasSuffix(info.packageName, "_test") {
		info.packageName = info.packageName[:len(info.packageName)-len("_test")]
	}

	for _, decl := range pf.Decls {
		d, ok := decl.(*ast.GenDecl)
		if !ok {
			continue
		}
		for _, dspec := range d.Specs {
			spec, ok := dspec.(*ast.ImportSpec)
			if !ok {
				continue
			}
			quoted := spec.Path.Value
			path, err := strconv.Unquote(quoted)
			if err != nil {
				log.Printf("%s: error reading go file: %v", info.path, err)
				continue
			}

			if path == "C" {
				if info.isTest {
					log.Printf("%s: warning: use of cgo in test not supported", info.path)
				}
				info.isCgo = true
				cg := spec.Doc
				if cg == nil && len(d.Specs) == 1 {
					cg = d.Doc
				}
				if cg != nil {
					if err := saveCgo(&info, rel, cg); err != nil {
						log.Printf("%s: error reading go file: %v", info.path, err)
					}
				}
				continue
			}
			info.imports = append(info.imports, path)
		}
	}

	tags, err := readTags(info.path)
	if err != nil {
		log.Printf("%s: error reading go file: %v", info.path, err)
		return info
	}
	info.tags = tags

	return info
}
func goFileInfo ( path , rel string ) fileInfo { info := fileNameInfo ( path ) fset := token . NewFileSet ( ) pf , err := parser . ParseFile ( fset , info . path , nil , parser . ImportsOnly | parser . ParseComments ) if err != nil { log . Printf ( " " , info . path , err ) return info } info . packageName = pf . Name . Name if info . isTest && strings . HasSuffix ( info . packageName , " " ) { info . packageName = info . packageName [ : len ( info . packageName ) - len ( " " ) ] } for _ , decl := range pf . Decls { d , ok := decl . ( * ast . GenDecl ) if ! ok { continue } for _ , dspec := range d . Specs { spec , ok := dspec . ( * ast . ImportSpec ) if ! ok { continue } quoted := spec . Path . Value path , err := strconv . Unquote ( quoted ) if err != nil { log . Printf ( " " , info . path , err ) continue } if path == " " { if info . isTest { log . Printf ( " " , info . path ) } info . isCgo = true cg := spec . Doc if cg == nil && len ( d . Specs ) == 1 { cg = d . Doc } if cg != nil { if err := saveCgo ( & info , rel , cg ) ; err != nil { log . Printf ( " " , info . path , err ) } } continue } info . imports = append ( info . imports , path ) } } tags , err := readTags ( info . path ) if err != nil { log . Printf ( " " , info . path , err ) return info } info . tags = tags return info }
// goFileInfo returns information about a .go file. It will parse part of the
// file to determine the package name, imports, and build constraints.
// If the file can't be read, an error will be logged, and partial information
// will be returned.
// This function is intended to match go/build.Context.Import.
// TODD(#53): extract canonical import path
goFileInfo returns information about a . go file . It will parse part of the file to determine the package name imports and build constraints . If the file can t be read an error will be logged and partial information will be returned . This function is intended to match go / build . Context . Import . TODD ( #53 ) : extract canonical import path