mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.typeparams] cmd/compile: simplify type alias handling for export
Currently the exporter uses types.IsDotAlias(n.Sym()) to recognize that n is a type alias, but IsDotAlias is actually meant for recognizing aliases introduced by dot imports. Translated to go/types, the current logic amounts recognizing type aliases as if by: var n *types.TypeName typ, ok := n.Pkg().Scope().Lookup(n.Name()).Type().(*types.Named) isAlias := !ok || typ.Obj().Pkg() != n.Pkg() || typ.Obj().Name() != n.Name() But we can instead just check n.Alias() (eqv. n.IsAlias() in go/types). In addition to being much simpler, this is also actually correct for recognizing function-scoped type declarations (though we don't currently support those anyway, nor would they go through this exact code path). To avoid possible future misuse of IsDotAlias, this CL also inlines its trivial definition into its only call site. Passes toolstash -cmp, also w/ -gcflags=all=-G=3. Change-Id: I7c6283f4b58d5311aa683f8229bbf62f8bab2ff9 Reviewed-on: https://go-review.googlesource.com/c/go/+/320613 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Matthew Dempsky <mdempsky@google.com> Trust: Dan Scales <danscales@google.com> Reviewed-by: Dan Scales <danscales@google.com>
This commit is contained in:
parent
140cd7c1d3
commit
f3fc8b5779
6 changed files with 4 additions and 18 deletions
|
|
@ -104,13 +104,7 @@ func (g *irgen) typeDecl(out *ir.Nodes, decl *syntax.TypeDecl) {
|
||||||
if decl.Alias {
|
if decl.Alias {
|
||||||
name, _ := g.def(decl.Name)
|
name, _ := g.def(decl.Name)
|
||||||
g.pragmaFlags(decl.Pragma, 0)
|
g.pragmaFlags(decl.Pragma, 0)
|
||||||
|
assert(name.Alias()) // should be set by irgen.obj
|
||||||
// TODO(mdempsky): This matches how typecheckdef marks aliases for
|
|
||||||
// export, but this won't generalize to exporting function-scoped
|
|
||||||
// type aliases. We should maybe just use n.Alias() instead.
|
|
||||||
if ir.CurFunc == nil {
|
|
||||||
name.Sym().Def = ir.TypeNode(name.Type())
|
|
||||||
}
|
|
||||||
|
|
||||||
out.Append(ir.NewDecl(g.pos(decl), ir.ODCLTYPE, name))
|
out.Append(ir.NewDecl(g.pos(decl), ir.ODCLTYPE, name))
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -431,7 +431,7 @@ func clearImports() {
|
||||||
s.Def = nil
|
s.Def = nil
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if types.IsDotAlias(s) {
|
if s.Def != nil && s.Def.Sym() != s {
|
||||||
// throw away top-level name left over
|
// throw away top-level name left over
|
||||||
// from previous import . "x"
|
// from previous import . "x"
|
||||||
// We'll report errors after type checking in CheckDotImports.
|
// We'll report errors after type checking in CheckDotImports.
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,7 @@ func (g *irgen) obj(obj types2.Object) *ir.Name {
|
||||||
case *types2.TypeName:
|
case *types2.TypeName:
|
||||||
if obj.IsAlias() {
|
if obj.IsAlias() {
|
||||||
name = g.objCommon(pos, ir.OTYPE, g.sym(obj), class, g.typ(obj.Type()))
|
name = g.objCommon(pos, ir.OTYPE, g.sym(obj), class, g.typ(obj.Type()))
|
||||||
|
name.SetAlias(true)
|
||||||
} else {
|
} else {
|
||||||
name = ir.NewDeclNameAt(pos, ir.OTYPE, g.sym(obj))
|
name = ir.NewDeclNameAt(pos, ir.OTYPE, g.sym(obj))
|
||||||
g.objFinish(name, class, types.NewNamed(name))
|
g.objFinish(name, class, types.NewNamed(name))
|
||||||
|
|
|
||||||
|
|
@ -479,7 +479,7 @@ func (p *iexporter) doDecl(n *ir.Name) {
|
||||||
w.constExt(n)
|
w.constExt(n)
|
||||||
|
|
||||||
case ir.OTYPE:
|
case ir.OTYPE:
|
||||||
if types.IsDotAlias(n.Sym()) {
|
if n.Alias() {
|
||||||
// Alias.
|
// Alias.
|
||||||
w.tag('A')
|
w.tag('A')
|
||||||
w.pos(n.Pos())
|
w.pos(n.Pos())
|
||||||
|
|
|
||||||
|
|
@ -1889,11 +1889,6 @@ func typecheckdef(n *ir.Name) {
|
||||||
n.SetDiag(true)
|
n.SetDiag(true)
|
||||||
goto ret
|
goto ret
|
||||||
}
|
}
|
||||||
// For package-level type aliases, set n.Sym.Def so we can identify
|
|
||||||
// it as a type alias during export. See also #31959.
|
|
||||||
if n.Curfn == nil {
|
|
||||||
n.Sym().Def = n.Ntype
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -137,7 +137,3 @@ func CleanroomDo(f func()) {
|
||||||
f()
|
f()
|
||||||
pkgMap = saved
|
pkgMap = saved
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsDotAlias(sym *Sym) bool {
|
|
||||||
return sym.Def != nil && sym.Def.Sym() != sym
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue