Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
go/gcimporter15: update import/export to handle type aliases
- bimport.go is a 1:1 copy of the respective version in the std library: $GOROOT/src/go/internal/gcimporter/bimport.go . - bexport.go is mimicking the respective code in the cmd/compile. - isAlias18/19.go are needed because types.TypeName.IsAlias does not exist before Go 1.9. Tested against Go 1.6, 1.7, 1.8, 1.9 (dev.typealias branch). For golang/go#18130. Change-Id: Ic46c5850923fab2a35d4dc33850f2b0667c30398 Reviewed-on: https://go-review.googlesource.com/35104 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Alan Donovan <adonovan@google.com>
- Loading branch information
Showing
6 changed files
with
209 additions
and
156 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
// Copyright 2016 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. | ||
|
||
// +build go1.9 | ||
|
||
package gcimporter_test | ||
|
||
import ( | ||
"go/ast" | ||
"go/parser" | ||
"go/token" | ||
"go/types" | ||
"testing" | ||
|
||
gcimporter "golang.org/x/tools/go/gcimporter15" | ||
) | ||
|
||
const src = ` | ||
package p | ||
type ( | ||
T0 = int32 | ||
T1 = struct{} | ||
T2 = struct{ T1 } | ||
Invalid = foo // foo is undeclared | ||
) | ||
` | ||
|
||
func checkPkg(t *testing.T, pkg *types.Package, label string) { | ||
T1 := types.NewStruct(nil, nil) | ||
T2 := types.NewStruct([]*types.Var{types.NewField(0, pkg, "T1", T1, true)}, nil) | ||
|
||
for _, test := range []struct { | ||
name string | ||
typ types.Type | ||
}{ | ||
{"T0", types.Typ[types.Int32]}, | ||
{"T1", T1}, | ||
{"T2", T2}, | ||
{"Invalid", types.Typ[types.Invalid]}, | ||
} { | ||
obj := pkg.Scope().Lookup(test.name) | ||
if obj == nil { | ||
t.Errorf("%s: %s not found", label, test.name) | ||
continue | ||
} | ||
tname, _ := obj.(*types.TypeName) | ||
if tname == nil { | ||
t.Errorf("%s: %v not a type name", label, obj) | ||
continue | ||
} | ||
if !tname.IsAlias() { | ||
t.Errorf("%s: %v: not marked as alias", label, tname) | ||
continue | ||
} | ||
if got := tname.Type(); !types.Identical(got, test.typ) { | ||
t.Errorf("%s: %v: got %v; want %v", label, tname, got, test.typ) | ||
} | ||
} | ||
} | ||
|
||
func TestTypeAliases(t *testing.T) { | ||
// parse and typecheck | ||
fset1 := token.NewFileSet() | ||
f, err := parser.ParseFile(fset1, "p.go", src, 0) | ||
if err != nil { | ||
t.Fatal(err) | ||
} | ||
var conf types.Config | ||
pkg1, err := conf.Check("p", fset1, []*ast.File{f}, nil) | ||
if err == nil { | ||
// foo in undeclared in src; we should see an error | ||
t.Fatal("invalid source type-checked without error") | ||
} | ||
if pkg1 == nil { | ||
// despite incorrect src we should see a (partially) type-checked package | ||
t.Fatal("nil package returned") | ||
} | ||
checkPkg(t, pkg1, "export") | ||
|
||
// export | ||
exportdata := gcimporter.BExportData(fset1, pkg1) | ||
|
||
// import | ||
imports := make(map[string]*types.Package) | ||
fset2 := token.NewFileSet() | ||
_, pkg2, err := gcimporter.BImportData(fset2, imports, exportdata, pkg1.Path()) | ||
if err != nil { | ||
t.Fatalf("BImportData(%s): %v", pkg1.Path(), err) | ||
} | ||
checkPkg(t, pkg2, "import") | ||
} |
Oops, something went wrong.