go/gcimporter15: implement support for exporting aliases

Tested with 1.6, 1.7, 1.8.

Change-Id: Ib0f751484c360b02aa34c993ce795cb94656705f
Reviewed-on: https://go-review.googlesource.com/32540
Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
Robert Griesemer 2016-11-01 16:56:04 -07:00
parent 5b3db00587
commit a4fe4f6140
7 changed files with 148 additions and 8 deletions

View File

@ -173,6 +173,17 @@ func (p *exporter) pkg(pkg *types.Package, emptypath bool) {
}
func (p *exporter) obj(obj types.Object) {
if orig := original(obj); orig != obj {
if orig == nil {
// invalid alias - don't export for now (issue 17731)
return
}
p.tag(aliasTag)
p.pos(obj)
p.string(obj.Name())
obj = orig
}
switch obj := obj.(type) {
case *types.Const:
p.tag(constTag)

View File

@ -35,14 +35,16 @@ func TestImportTestdataNewExport(t *testing.T) {
return
}
if outFn := compileNewExport(t, "testdata", "exports.go"); outFn != "" {
if outFn := compileNewExport(t, "testdata", testfile); outFn != "" {
defer os.Remove(outFn)
}
if pkg := testPath(t, "./testdata/exports", "."); pkg != nil {
// filename should end with ".go"
filename := testfile[:len(testfile)-3]
if pkg := testPath(t, "./testdata/"+filename, "."); pkg != nil {
// The package's Imports list must include all packages
// explicitly imported by exports.go, plus all packages
// referenced indirectly via exported objects in exports.go.
// explicitly imported by testfile, plus all packages
// referenced indirectly via exported objects in testfile.
want := `[package ast ("go/ast") package token ("go/token")]`
got := fmt.Sprint(pkg.Imports())
if got != want {

View File

@ -137,14 +137,16 @@ func TestImportTestdata(t *testing.T) {
return
}
if outFn := compile(t, "testdata", "exports.go"); outFn != "" {
if outFn := compile(t, "testdata", testfile); outFn != "" {
defer os.Remove(outFn)
}
if pkg := testPath(t, "./testdata/exports", "."); pkg != nil {
// filename should end with ".go"
filename := testfile[:len(testfile)-3]
if pkg := testPath(t, "./testdata/"+filename, "."); pkg != nil {
// The package's Imports list must include all packages
// explicitly imported by exports.go, plus all packages
// referenced indirectly via exported objects in exports.go.
// explicitly imported by testfile, plus all packages
// referenced indirectly via exported objects in testfile.
// With the textual export format, the list may also include
// additional packages that are not strictly required for
// import processing alone (they are exported to err "on

View File

@ -15,3 +15,9 @@ func newAlias(pos token.Pos, pkg *types.Package, name string, orig types.Object)
errorf("unexpected alias in non-Go1.8 export data: %s.%s => %v", pkg.Name(), name, orig)
panic("unreachable")
}
func original(obj types.Object) types.Object {
return obj // don't know about aliases
}
const testfile = "exports17.go"

View File

@ -9,3 +9,13 @@ package gcimporter
import "go/types"
func newAlias => types.NewAlias
// TODO(gri) Consider exporting this functionality from go/types (issue 17730).
func original(obj types.Object) types.Object {
if orig, ok := obj.(*types.Alias); ok {
return orig
}
return obj
}
const testfile = "exports18.go"

109
go/gcimporter15/testdata/exports18.go vendored Normal file
View File

@ -0,0 +1,109 @@
// Copyright 2011 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.
// This file is used to generate an object file which
// serves as test file for gcimporter_test.go.
package exports
import (
"go/ast"
"go/build"
"math"
)
// Issue 3682: Correctly read dotted identifiers from export data.
const init1 = 0
func init() {}
const (
C0 int = 0
C1 = 3.14159265
C2 = 2.718281828i
C3 = -123.456e-789
C4 = +123.456E+789
C5 = 1234i
C6 = "foo\n"
C7 = `bar\n`
)
const (
C8 => math.Pi
)
type (
T1 int
T2 [10]int
T3 []int
T4 *int
T5 chan int
T6a chan<- int
T6b chan (<-chan int)
T6c chan<- (chan int)
T7 <-chan *ast.File
T8 struct{}
T9 struct {
a int
b, c float32
d []string `go:"tag"`
}
T10 struct {
T8
T9
_ *T10
}
T11 map[int]string
T12 interface{}
T13 interface {
m1()
m2(int) float32
}
T14 interface {
T12
T13
m3(x ...struct{}) []T9
}
T15 func()
T16 func(int)
T17 func(x int)
T18 func() float32
T19 func() (x float32)
T20 func(...interface{})
T21 struct{ next *T21 }
T22 struct{ link *T23 }
T23 struct{ link *T22 }
T24 *T24
T25 *T26
T26 *T27
T27 *T25
T28 func(T28) T28
)
type (
T29 => ast.File
T30 => build.Context
)
var (
V0 int
V1 = -991.0
V2 float32 = 1.2
)
var (
V3 => build.Default
)
func F1() {}
func F2(x int) {}
func F3() int { return 0 }
func F4() float32 { return 0 }
func F5(a, b, c int, u, v, w struct{ x, y T1 }, more ...interface{}) (p, q, r chan<- T10)
func (p *T1) M1()
func F6 => math.Sin
func F7 => ast.IsExported
func F8 => build.Import