aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder/expr.go
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2021-01-20 13:54:53 -0800
committerMatthew Dempsky <mdempsky@google.com>2021-01-20 22:50:16 +0000
commit89ec17be9a28e07f59aaaa9acd1d26f80c55711f (patch)
tree1bc6a02c9fced9d860cbb3308bd099969de7a52d /src/cmd/compile/internal/noder/expr.go
parentfa01ade41e1632dbb8e1b06ff1e6565e8900fb38 (diff)
downloadgo-89ec17be9a28e07f59aaaa9acd1d26f80c55711f.tar.xz
[dev.typeparams] cmd/compile: simplify how irgen handles qualified idents
This CL moves qualified identifier handling into expr0 with other selector expressions, rather than as a completely separate special case handled up front. This has a few benefits: 1. It's marginally simpler/cleaner. 2. It allows extra checking for imported objects that they have the same type that types2 thought they had. 3. For imported, untyped constants, we now instead handle them with the "tv.Value != nil" case. In particular, this ensures that they've always already been coerced to the appropriate concrete type by types2. Change-Id: Ibf44ae6901db36aa5251f70934616e9fcbd1cbc5 Reviewed-on: https://go-review.googlesource.com/c/go/+/285053 Trust: Matthew Dempsky <mdempsky@google.com> Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/noder/expr.go')
-rw-r--r--src/cmd/compile/internal/noder/expr.go16
1 files changed, 7 insertions, 9 deletions
diff --git a/src/cmd/compile/internal/noder/expr.go b/src/cmd/compile/internal/noder/expr.go
index fba6ad2e4b..d5177ead06 100644
--- a/src/cmd/compile/internal/noder/expr.go
+++ b/src/cmd/compile/internal/noder/expr.go
@@ -27,15 +27,6 @@ func (g *irgen) expr(expr syntax.Expr) ir.Node {
return ir.BlankNode
}
- // TODO(mdempsky): Is there a better way to recognize and handle qualified identifiers?
- if expr, ok := expr.(*syntax.SelectorExpr); ok {
- if name, ok := expr.X.(*syntax.Name); ok {
- if _, ok := g.info.Uses[name].(*types2.PkgName); ok {
- return g.use(expr.Sel)
- }
- }
- }
-
tv, ok := g.info.Types[expr]
if !ok {
base.FatalfAt(g.pos(expr), "missing type for %v (%T)", expr, expr)
@@ -89,6 +80,13 @@ func (g *irgen) expr0(typ types2.Type, expr syntax.Expr) ir.Node {
case *syntax.ParenExpr:
return g.expr(expr.X) // skip parens; unneeded after parse+typecheck
case *syntax.SelectorExpr:
+ // Qualified identifier.
+ if name, ok := expr.X.(*syntax.Name); ok {
+ if _, ok := g.info.Uses[name].(*types2.PkgName); ok {
+ return g.use(expr.Sel)
+ }
+ }
+
// TODO(mdempsky/danscales): Use g.info.Selections[expr]
// to resolve field/method selection. See CL 280633.
return ir.NewSelectorExpr(pos, ir.OXDOT, g.expr(expr.X), g.name(expr.Sel))