aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2012-01-18 19:35:53 -0800
committerRobert Griesemer <gri@golang.org>2012-01-18 19:35:53 -0800
commitc109705c6f30d568b7c7af8a203bdd69c6fb99af (patch)
tree636540f8109cb3c73750aba79d284de85a18d532
parentf47807a57f9dacab74ebf7e9d86f3dc0dcb933b0 (diff)
downloadgo-c109705c6f30d568b7c7af8a203bdd69c6fb99af.tar.gz
go-c109705c6f30d568b7c7af8a203bdd69c6fb99af.zip
go/doc: collect imports
R=r CC=golang-dev https://golang.org/cl/5556051
-rw-r--r--src/pkg/go/doc/doc.go2
-rw-r--r--src/pkg/go/doc/exports.go3
-rw-r--r--src/pkg/go/doc/reader.go22
-rw-r--r--src/pkg/go/doc/testdata/b.out3
-rw-r--r--src/pkg/go/doc/testdata/template.txt6
-rw-r--r--src/pkg/go/doc/testdata/testing.out12
6 files changed, 44 insertions, 4 deletions
diff --git a/src/pkg/go/doc/doc.go b/src/pkg/go/doc/doc.go
index 66e2937aeb..112d01f78f 100644
--- a/src/pkg/go/doc/doc.go
+++ b/src/pkg/go/doc/doc.go
@@ -15,7 +15,7 @@ type Package struct {
Doc string
Name string
ImportPath string
- Imports []string // TODO(gri) this field is not computed at the moment
+ Imports []string
Filenames []string
Consts []*Value
Types []*Type
diff --git a/src/pkg/go/doc/exports.go b/src/pkg/go/doc/exports.go
index 994bf503b5..a35b3e2391 100644
--- a/src/pkg/go/doc/exports.go
+++ b/src/pkg/go/doc/exports.go
@@ -124,6 +124,9 @@ func (doc *docReader) filterType(tinfo *typeInfo, typ ast.Expr) bool {
func (doc *docReader) filterSpec(spec ast.Spec) bool {
switch s := spec.(type) {
+ case *ast.ImportSpec:
+ // always keep imports so we can collect them
+ return true
case *ast.ValueSpec:
s.Names = filterIdentList(s.Names)
if len(s.Names) > 0 {
diff --git a/src/pkg/go/doc/reader.go b/src/pkg/go/doc/reader.go
index 939dd89b00..1a2fad559a 100644
--- a/src/pkg/go/doc/reader.go
+++ b/src/pkg/go/doc/reader.go
@@ -9,6 +9,7 @@ import (
"go/token"
"regexp"
"sort"
+ "strconv"
)
// ----------------------------------------------------------------------------
@@ -55,6 +56,7 @@ type docReader struct {
doc *ast.CommentGroup // package documentation, if any
pkgName string
mode Mode
+ imports map[string]int
values []*ast.GenDecl // consts and vars
types map[string]*typeInfo
embedded map[string]*typeInfo // embedded types, possibly not exported
@@ -65,6 +67,7 @@ type docReader struct {
func (doc *docReader) init(pkgName string, mode Mode) {
doc.pkgName = pkgName
doc.mode = mode
+ doc.imports = make(map[string]int)
doc.types = make(map[string]*typeInfo)
doc.embedded = make(map[string]*typeInfo)
doc.funcs = make(map[string]*ast.FuncDecl)
@@ -244,6 +247,13 @@ func (doc *docReader) addDecl(decl ast.Decl) {
case *ast.GenDecl:
if len(d.Specs) > 0 {
switch d.Tok {
+ case token.IMPORT:
+ // imports are handled individually
+ for _, spec := range d.Specs {
+ if import_, err := strconv.Unquote(spec.(*ast.ImportSpec).Path.Value); err == nil {
+ doc.imports[import_] = 1
+ }
+ }
case token.CONST, token.VAR:
// constants and variables are always handled as a group
doc.addValue(d)
@@ -346,6 +356,17 @@ func (doc *docReader) addFile(src *ast.File) {
// ----------------------------------------------------------------------------
// Conversion to external representation
+func (doc *docReader) makeImports() []string {
+ list := make([]string, len(doc.imports))
+ i := 0
+ for import_ := range doc.imports {
+ list[i] = import_
+ i++
+ }
+ sort.Strings(list)
+ return list
+}
+
type sortValue []*Value
func (p sortValue) Len() int { return len(p) }
@@ -661,6 +682,7 @@ func (doc *docReader) newDoc(importpath string, filenames []string) *Package {
// doc.funcs and thus must be called before any other
// function consuming those lists
p.Types = doc.makeTypes(doc.types)
+ p.Imports = doc.makeImports()
p.Consts = makeValues(doc.values, token.CONST)
p.Vars = makeValues(doc.values, token.VAR)
p.Funcs = makeFuncs(doc.funcs)
diff --git a/src/pkg/go/doc/testdata/b.out b/src/pkg/go/doc/testdata/b.out
index 80e2deb429..c5ad0d0fc8 100644
--- a/src/pkg/go/doc/testdata/b.out
+++ b/src/pkg/go/doc/testdata/b.out
@@ -4,6 +4,9 @@ PACKAGE b
IMPORTPATH
testdata/b
+IMPORTS
+ a
+
FILENAMES
testdata/b.go
diff --git a/src/pkg/go/doc/testdata/template.txt b/src/pkg/go/doc/testdata/template.txt
index b10dfc4b72..32e331cdd1 100644
--- a/src/pkg/go/doc/testdata/template.txt
+++ b/src/pkg/go/doc/testdata/template.txt
@@ -4,10 +4,10 @@ PACKAGE {{.Name}}
IMPORTPATH
{{.ImportPath}}
-{{with .Imports}}
-IMPORTS
+{{with .Imports}}IMPORTS
{{range .}} {{.}}
-{{end}}{{end}}{{/*
+{{end}}
+{{end}}{{/*
*/}}FILENAMES
{{range .Filenames}} {{.}}
diff --git a/src/pkg/go/doc/testdata/testing.out b/src/pkg/go/doc/testdata/testing.out
index 97111993cd..15a9039866 100644
--- a/src/pkg/go/doc/testdata/testing.out
+++ b/src/pkg/go/doc/testdata/testing.out
@@ -4,6 +4,18 @@ PACKAGE testing
IMPORTPATH
testdata/testing
+IMPORTS
+ bytes
+ flag
+ fmt
+ io
+ os
+ runtime
+ runtime/pprof
+ strconv
+ strings
+ time
+
FILENAMES
testdata/benchmark.go
testdata/example.go