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:
parent
16e6df9807
commit
35aec6c7f7
@ -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}
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
{.section PAst}
|
||||||
|
{@}
|
||||||
|
{.end}
|
||||||
{.section PDoc}
|
{.section PDoc}
|
||||||
{.section IsPkg}
|
{.section IsPkg}
|
||||||
PACKAGE
|
PACKAGE
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user