From 555fafe5a21747e01395a24ad9a3f93460c2f9b9 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Tue, 4 Dec 2018 12:02:32 -0500 Subject: [PATCH] go/internal/gccgoimporter: update package to match std lib version This CL updates the importer to match the original code in the std lib but for the necessary changes to make the code work in x/tools and with older versions of the std lib. Notably, it brings over changes from: https://go-review.googlesource.com/c/152378 Change-Id: Icaa05303a05a226c710b5923d8574f255651fe47 Reviewed-on: https://go-review.googlesource.com/c/152577 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- go/internal/gccgoimporter/importer_test.go | 1 + go/internal/gccgoimporter/parser.go | 8 ++++++++ go/internal/gccgoimporter/testdata/nointerface.go | 12 ++++++++++++ go/internal/gccgoimporter/testdata/nointerface.gox | 8 ++++++++ 4 files changed, 29 insertions(+) create mode 100644 go/internal/gccgoimporter/testdata/nointerface.go create mode 100644 go/internal/gccgoimporter/testdata/nointerface.gox diff --git a/go/internal/gccgoimporter/importer_test.go b/go/internal/gccgoimporter/importer_test.go index 28645094ef..0123736b1c 100644 --- a/go/internal/gccgoimporter/importer_test.go +++ b/go/internal/gccgoimporter/importer_test.go @@ -92,6 +92,7 @@ var importerTests = [...]importerTest{ {pkgpath: "escapeinfo", name: "NewT", want: "func NewT(data []byte) *T"}, {pkgpath: "issue27856", name: "M", want: "type M struct{E F}"}, {pkgpath: "v1reflect", name: "Type", want: "type Type interface{Align() int; AssignableTo(u Type) bool; Bits() int; ChanDir() ChanDir; Elem() Type; Field(i int) StructField; FieldAlign() int; FieldByIndex(index []int) StructField; FieldByName(name string) (StructField, bool); FieldByNameFunc(match func(string) bool) (StructField, bool); Implements(u Type) bool; In(i int) Type; IsVariadic() bool; Key() Type; Kind() Kind; Len() int; Method(int) Method; MethodByName(string) (Method, bool); Name() string; NumField() int; NumIn() int; NumMethod() int; NumOut() int; Out(i int) Type; PkgPath() string; Size() uintptr; String() string; common() *commonType; rawString() string; runtimeType() *runtimeType; uncommon() *uncommonType}"}, + {pkgpath: "nointerface", name: "I", want: "type I int"}, } func TestGoxImporter(t *testing.T) { diff --git a/go/internal/gccgoimporter/parser.go b/go/internal/gccgoimporter/parser.go index 308428865e..285860706d 100644 --- a/go/internal/gccgoimporter/parser.go +++ b/go/internal/gccgoimporter/parser.go @@ -545,6 +545,14 @@ func (p *parser) parseNamedType(nlist []int) types.Type { // collect associated methods for p.tok == scanner.Ident { p.expectKeyword("func") + if p.tok == '/' { + // Skip a /*nointerface*/ comment. + p.expect('/') + p.expect('*') + p.expect(scanner.Ident) + p.expect('*') + p.expect('/') + } p.expect('(') receiver, _ := p.parseParam(pkg) p.expect(')') diff --git a/go/internal/gccgoimporter/testdata/nointerface.go b/go/internal/gccgoimporter/testdata/nointerface.go new file mode 100644 index 0000000000..6a545f2493 --- /dev/null +++ b/go/internal/gccgoimporter/testdata/nointerface.go @@ -0,0 +1,12 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package nointerface + +type I int + +//go:nointerface +func (p *I) Get() int { return int(*p) } + +func (p *I) Set(v int) { *p = I(v) } diff --git a/go/internal/gccgoimporter/testdata/nointerface.gox b/go/internal/gccgoimporter/testdata/nointerface.gox new file mode 100644 index 0000000000..7b73d179e3 --- /dev/null +++ b/go/internal/gccgoimporter/testdata/nointerface.gox @@ -0,0 +1,8 @@ +v3; +package nointerface +pkgpath nointerface +types 3 2 133 17 +type 1 "I" + func /*nointerface*/ (p ) Get () + func (p ) Set (v ) +type 2 *