1
0
mirror of https://github.com/golang/go synced 2024-11-25 09:17:57 -07:00

godoc: provide mode which shows exported interface in "source form"

- on the commandline: godoc -x big
- in a webpage: provide form parameter ?m=src

Known issues:
- Positioning of comments incorrect in several cases. Separate CL.
- Need a link/menu to switch between different modes of presentation
  in the web view.

R=rsc
CC=golang-dev
https://golang.org/cl/376041
This commit is contained in:
Robert Griesemer 2010-03-10 15:22:22 -08:00
parent 16e6df9807
commit 35aec6c7f7
4 changed files with 37 additions and 16 deletions

View File

@ -4,6 +4,11 @@
license that can be found in the LICENSE file. license that can be found in the LICENSE file.
--> -->
{.section PAst}
<pre>
{@|html}
</pre>
{.end}
{.section PDoc} {.section PDoc}
<!-- PackageName is printed as title by the top-level template --> <!-- PackageName is printed as title by the top-level template -->
{.section IsPkg} {.section IsPkg}

View File

@ -1,3 +1,6 @@
{.section PAst}
{@}
{.end}
{.section PDoc} {.section PDoc}
{.section IsPkg} {.section IsPkg}
PACKAGE PACKAGE

View File

@ -1087,8 +1087,9 @@ const fakePkgName = "documentation"
type PageInfo struct { type PageInfo struct {
Dirname string // directory containing the package Dirname string // directory containing the package
PDoc *doc.PackageDoc // nil if no package found PAst *ast.File // nil if no AST with package exports
Dirs *DirList // nil if no directory information found PDoc *doc.PackageDoc // nil if no package documentation
Dirs *DirList // nil if no directory information
IsPkg bool // false if this is not documenting a real package IsPkg bool // false if this is not documenting a real package
} }
@ -1100,12 +1101,15 @@ type httpHandler struct {
} }
// getPageInfo returns the PageInfo for a package directory dirname. If // getPageInfo returns the PageInfo for a package directory dirname. If the
// the parameter try is true, no errors are logged if getPageInfo fails. // parameter genAST is set, an AST containing only the package exports is
// If there is no corresponding package in the directory, PageInfo.PDoc // computed (PageInfo.PAst), otherwise package documentation (PageInfo.Doc)
// is nil. If there are no subdirectories, PageInfo.Dirs is nil. // is extracted from the AST. If the parameter try is set, no errors are
// logged if getPageInfo fails. If there is no corresponding package in the
// directory, PageInfo.PDoc and PageInfo.PExp are nil. If there are no sub-
// directories, PageInfo.Dirs is nil.
// //
func (h *httpHandler) getPageInfo(dirname, relpath string, try bool) PageInfo { func (h *httpHandler) getPageInfo(dirname, relpath string, genAST, try bool) PageInfo {
// filter function to select the desired .go files // filter function to select the desired .go files
filter := func(d *os.Dir) bool { filter := func(d *os.Dir) bool {
// If we are looking at cmd documentation, only accept // If we are looking at cmd documentation, only accept
@ -1141,11 +1145,16 @@ func (h *httpHandler) getPageInfo(dirname, relpath string, try bool) PageInfo {
} }
// compute package documentation // compute package documentation
var past *ast.File
var pdoc *doc.PackageDoc var pdoc *doc.PackageDoc
if pkg != nil { if pkg != nil {
ast.PackageExports(pkg) ast.PackageExports(pkg)
if genAST {
past = ast.MergePackageFiles(pkg)
} else {
pdoc = doc.NewPackageDoc(pkg, pathutil.Clean(relpath)) // no trailing '/' in importpath pdoc = doc.NewPackageDoc(pkg, pathutil.Clean(relpath)) // no trailing '/' in importpath
} }
}
// get directory information // get directory information
var dir *Directory var dir *Directory
@ -1163,7 +1172,7 @@ func (h *httpHandler) getPageInfo(dirname, relpath string, try bool) PageInfo {
dir = newDirectory(dirname, 1) dir = newDirectory(dirname, 1)
} }
return PageInfo{dirname, pdoc, dir.listing(true), h.isPkg} return PageInfo{dirname, past, pdoc, dir.listing(true), h.isPkg}
} }
@ -1174,7 +1183,7 @@ func (h *httpHandler) ServeHTTP(c *http.Conn, r *http.Request) {
relpath := r.URL.Path[len(h.pattern):] relpath := r.URL.Path[len(h.pattern):]
abspath := absolutePath(relpath, h.fsRoot) abspath := absolutePath(relpath, h.fsRoot)
info := h.getPageInfo(abspath, relpath, false) info := h.getPageInfo(abspath, relpath, r.FormValue("m") == "src", false)
if r.FormValue("f") == "text" { if r.FormValue("f") == "text" {
contents := applyTemplate(packageText, "packageText", info) contents := applyTemplate(packageText, "packageText", info)
@ -1183,7 +1192,10 @@ func (h *httpHandler) ServeHTTP(c *http.Conn, r *http.Request) {
} }
var title string var title string
if info.PDoc != nil { switch {
case info.PAst != nil:
title = "Package " + info.PAst.Name.Name()
case info.PDoc != nil:
switch { switch {
case h.isPkg: case h.isPkg:
title = "Package " + info.PDoc.PackageName title = "Package " + info.PDoc.PackageName
@ -1194,7 +1206,7 @@ func (h *httpHandler) ServeHTTP(c *http.Conn, r *http.Request) {
default: default:
title = "Command " + info.PDoc.PackageName title = "Command " + info.PDoc.PackageName
} }
} else { default:
title = "Directory " + relativePath(info.Dirname) title = "Directory " + relativePath(info.Dirname)
} }

View File

@ -48,6 +48,7 @@ var (
// layout control // layout control
html = flag.Bool("html", false, "print HTML in command-line mode") html = flag.Bool("html", false, "print HTML in command-line mode")
genAST = flag.Bool("x", false, "print exported source in command-line mode")
) )
@ -240,14 +241,14 @@ func main() {
relpath = relativePath(path) relpath = relativePath(path)
} }
info := pkgHandler.getPageInfo(abspath, relpath, true) info := pkgHandler.getPageInfo(abspath, relpath, *genAST, true)
if info.PDoc == nil && info.Dirs == nil { if info.PAst == nil && info.PDoc == nil && info.Dirs == nil {
// try again, this time assume it's a command // try again, this time assume it's a command
if len(path) > 0 && path[0] != '/' { if len(path) > 0 && path[0] != '/' {
abspath = absolutePath(path, cmdHandler.fsRoot) abspath = absolutePath(path, cmdHandler.fsRoot)
} }
info = cmdHandler.getPageInfo(abspath, relpath, false) info = cmdHandler.getPageInfo(abspath, relpath, false, false)
} }
if info.PDoc != nil && flag.NArg() > 1 { if info.PDoc != nil && flag.NArg() > 1 {