]> Cypherpunks repositories - gostls13.git/commitdiff
go/doc: collect imports
authorRobert Griesemer <gri@golang.org>
Thu, 19 Jan 2012 03:35:53 +0000 (19:35 -0800)
committerRobert Griesemer <gri@golang.org>
Thu, 19 Jan 2012 03:35:53 +0000 (19:35 -0800)
R=r
CC=golang-dev
https://golang.org/cl/5556051

src/pkg/go/doc/doc.go
src/pkg/go/doc/exports.go
src/pkg/go/doc/reader.go
src/pkg/go/doc/testdata/b.out
src/pkg/go/doc/testdata/template.txt
src/pkg/go/doc/testdata/testing.out

index 66e2937aeb0405107fcde6e190dc335353d9ae13..112d01f78f66fc9887b9d35a3dc3b4df3433d9c9 100644 (file)
@@ -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
index 994bf503b55b1f1062ca21aa918b5a3c13945914..a35b3e2391497aed5ccfba50b17a496acb512270 100644 (file)
@@ -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 {
index 939dd89b00275f0c139d1e31053bb069d88eabea..1a2fad559a63cf29e276a85d5e2eb4d6ed38d1a6 100644 (file)
@@ -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)
index 80e2deb4295eb74edf37103bbac3476f9cf6e69d..c5ad0d0fc83e71565cef62f0c0489734486c363b 100644 (file)
@@ -4,6 +4,9 @@ PACKAGE b
 IMPORTPATH
        testdata/b
 
+IMPORTS
+       a
+
 FILENAMES
        testdata/b.go
 
index b10dfc4b726e6a66525be9c6e22e6f09acfbc215..32e331cdd101e0724e4ad044cf2e271e301b0a4d 100644 (file)
@@ -4,10 +4,10 @@ PACKAGE {{.Name}}
 IMPORTPATH
        {{.ImportPath}}
 
-{{with .Imports}}
-IMPORTS
+{{with .Imports}}IMPORTS
 {{range .}}    {{.}}
-{{end}}{{end}}{{/*
+{{end}}
+{{end}}{{/*
 
 */}}FILENAMES
 {{range .Filenames}}   {{.}}
index 97111993cd0cdc23b29cb26b1ffe664320398dc9..15a90398664c504dab7ecfa89c143e8cc2516ac1 100644 (file)
@@ -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