|
9 | 9 | "cmd/compile/internal/syntax"
|
10 | 10 | "cmd/compile/internal/types2"
|
11 | 11 | "cmd/internal/src"
|
| 12 | + "internal/godebug" |
12 | 13 | "internal/pkgbits"
|
13 | 14 | )
|
14 | 15 |
|
@@ -409,7 +410,7 @@ func (pr *pkgReader) objIdx(idx pkgbits.Index) (*types2.Package, string) {
|
409 | 410 | case pkgbits.ObjAlias:
|
410 | 411 | pos := r.pos()
|
411 | 412 | typ := r.typ()
|
412 |
| - return types2.NewTypeName(pos, objPkg, objName, typ) |
| 413 | + return newAliasTypeName(pos, objPkg, objName, typ) |
413 | 414 |
|
414 | 415 | case pkgbits.ObjConst:
|
415 | 416 | pos := r.pos()
|
@@ -533,3 +534,18 @@ func (r *reader) ident(marker pkgbits.SyncMarker) (*types2.Package, string) {
|
533 | 534 | r.Sync(marker)
|
534 | 535 | return r.pkg(), r.String()
|
535 | 536 | }
|
| 537 | + |
| 538 | +// newAliasTypeName returns a new TypeName, with a materialized *types2.Alias if supported. |
| 539 | +func newAliasTypeName(pos syntax.Pos, pkg *types2.Package, name string, rhs types2.Type) *types2.TypeName { |
| 540 | + // Copied from x/tools/internal/aliases.NewAlias via |
| 541 | + // GOROOT/src/go/internal/gcimporter/ureader.go. |
| 542 | + if gotypesalias.Value() == "1" { |
| 543 | + tname := types2.NewTypeName(pos, pkg, name, nil) |
| 544 | + _ = types2.NewAlias(tname, rhs) // form TypeName -> Alias cycle |
| 545 | + return tname |
| 546 | + } |
| 547 | + return types2.NewTypeName(pos, pkg, name, rhs) |
| 548 | +} |
| 549 | + |
| 550 | +// gotypesalias controls the use of Alias types. |
| 551 | +var gotypesalias = godebug.New("#gotypesalias") |
0 commit comments