diff options
Diffstat (limited to 'src/cmd/cgo/ast.go')
-rw-r--r-- | src/cmd/cgo/ast.go | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/src/cmd/cgo/ast.go b/src/cmd/cgo/ast.go index 73b7313d6..381e606ef 100644 --- a/src/cmd/cgo/ast.go +++ b/src/cmd/cgo/ast.go @@ -9,7 +9,6 @@ package main import ( "fmt" "go/ast" - "go/doc" "go/parser" "go/scanner" "go/token" @@ -17,7 +16,7 @@ import ( "strings" ) -func parse(name string, flags uint) *ast.File { +func parse(name string, flags parser.Mode) *ast.File { ast1, err := parser.ParseFile(fset, name, nil, flags) if err != nil { if list, ok := err.(scanner.ErrorList); ok { @@ -71,7 +70,7 @@ func (f *File) ReadGo(name string) { } sawC = true if s.Name != nil { - error(s.Path.Pos(), `cannot rename import "C"`) + error_(s.Path.Pos(), `cannot rename import "C"`) } cg := s.Doc if cg == nil && len(d.Specs) == 1 { @@ -79,12 +78,12 @@ func (f *File) ReadGo(name string) { } if cg != nil { f.Preamble += fmt.Sprintf("#line %d %q\n", sourceLine(cg), name) - f.Preamble += doc.CommentText(cg) + "\n" + f.Preamble += cg.Text() + "\n" } } } if !sawC { - error(token.NoPos, `cannot find import "C"`) + error_(token.NoPos, `cannot find import "C"`) } // In ast2, strip the import "C" line. @@ -128,6 +127,7 @@ func (f *File) ReadGo(name string) { f.walk(ast1, "prog", (*File).saveExport) f.walk(ast2, "prog", (*File).saveExport2) + f.Comments = ast1.Comments f.AST = ast2 } @@ -147,9 +147,12 @@ func (f *File) saveRef(x interface{}, context string) { if context == "as2" { context = "expr" } + if context == "embed-type" { + error_(sel.Pos(), "cannot embed C type") + } goname := sel.Sel.Name if goname == "errno" { - error(sel.Pos(), "cannot refer to errno directly; see documentation") + error_(sel.Pos(), "cannot refer to errno directly; see documentation") return } name := f.Name[goname] @@ -186,11 +189,11 @@ func (f *File) saveExport(x interface{}, context string) { name := strings.TrimSpace(string(c.Text[9:])) if name == "" { - error(c.Pos(), "export missing name") + error_(c.Pos(), "export missing name") } if name != n.Name.Name { - error(c.Pos(), "export comment has wrong name %q, want %q", name, n.Name.Name) + error_(c.Pos(), "export comment has wrong name %q, want %q", name, n.Name.Name) } f.ExpFunc = append(f.ExpFunc, &ExpFunc{ @@ -225,14 +228,18 @@ func (f *File) walk(x interface{}, context string, visit func(*File, interface{} // everything else just recurs default: - error(token.NoPos, "unexpected type %T in walk", x, visit) + error_(token.NoPos, "unexpected type %T in walk", x, visit) panic("unexpected type") case nil: // These are ordered and grouped to match ../../pkg/go/ast/ast.go case *ast.Field: - f.walk(&n.Type, "type", visit) + if len(n.Names) == 0 && context == "field" { + f.walk(&n.Type, "embed-type", visit) + } else { + f.walk(&n.Type, "type", visit) + } case *ast.FieldList: for _, field := range n.List { f.walk(field, context, visit) @@ -289,9 +296,9 @@ func (f *File) walk(x interface{}, context string, visit func(*File, interface{} case *ast.StructType: f.walk(n.Fields, "field", visit) case *ast.FuncType: - f.walk(n.Params, "field", visit) + f.walk(n.Params, "param", visit) if n.Results != nil { - f.walk(n.Results, "field", visit) + f.walk(n.Results, "param", visit) } case *ast.InterfaceType: f.walk(n.Methods, "field", visit) @@ -379,7 +386,7 @@ func (f *File) walk(x interface{}, context string, visit func(*File, interface{} f.walk(n.Specs, "spec", visit) case *ast.FuncDecl: if n.Recv != nil { - f.walk(n.Recv, "field", visit) + f.walk(n.Recv, "param", visit) } f.walk(n.Type, "type", visit) if n.Body != nil { |