go.tools/go/types: move {Type,Object}Of methods from *loader.PackageInfo to *types.Info
LGTM=gri
R=gri
CC=golang-codereviews
https://golang.org/cl/113750044
diff --git a/go/loader/loader.go b/go/loader/loader.go
index 2a15359..e611e7e 100644
--- a/go/loader/loader.go
+++ b/go/loader/loader.go
@@ -258,6 +258,24 @@
AllPackages map[*types.Package]*PackageInfo
}
+// PackageInfo holds the ASTs and facts derived by the type-checker
+// for a single package.
+//
+// Not mutated once exposed via the API.
+//
+type PackageInfo struct {
+ Pkg *types.Package
+ Importable bool // true if 'import "Pkg.Path()"' would resolve to this
+ TransitivelyErrorFree bool // true if Pkg and all its dependencies are free of errors
+ Files []*ast.File // syntax trees for the package's files
+ Errors []error // non-nil if the package had errors
+ types.Info // type-checker deductions.
+
+ checker *types.Checker // transient type-checker state
+}
+
+func (info *PackageInfo) String() string { return info.Pkg.Path() }
+
func (conf *Config) fset() *token.FileSet {
if conf.Fset == nil {
conf.Fset = token.NewFileSet()
diff --git a/go/loader/pkginfo.go b/go/loader/pkginfo.go
deleted file mode 100644
index 564d718..0000000
--- a/go/loader/pkginfo.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2013 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.
-
-package loader
-
-import (
- "fmt"
- "go/ast"
-
- "code.google.com/p/go.tools/go/types"
-)
-
-// PackageInfo holds the ASTs and facts derived by the type-checker
-// for a single package.
-//
-// Not mutated once exposed via the API.
-//
-type PackageInfo struct {
- Pkg *types.Package
- Importable bool // true if 'import "Pkg.Path()"' would resolve to this
- TransitivelyErrorFree bool // true if Pkg and all its dependencies are free of errors
- Files []*ast.File // abstract syntax for the package's files
- Errors []error // non-nil if the package had errors
- types.Info // type-checker deductions.
-
- checker *types.Checker // transient type-checker state
-}
-
-func (info *PackageInfo) String() string {
- return fmt.Sprintf("PackageInfo(%s)", info.Pkg.Path())
-}
-
-// TODO(gri): move the methods below to types.Info.
-
-// TypeOf returns the type of expression e, or nil if not found.
-func (info *PackageInfo) TypeOf(e ast.Expr) types.Type {
- if t, ok := info.Types[e]; ok {
- return t.Type
- }
- // Idents appear only in Defs/Uses, not Types.
- if id, ok := e.(*ast.Ident); ok {
- return info.ObjectOf(id).Type()
- }
- return nil
-}
-
-// ObjectOf returns the type-checker object denoted by the specified
-// id, or nil if not found.
-//
-// If id is an anonymous struct field, ObjectOf returns the field
-// (*types.Var) it uses, not the type (*types.TypeName) it defines.
-//
-func (info *PackageInfo) ObjectOf(id *ast.Ident) types.Object {
- if obj, ok := info.Defs[id]; ok {
- return obj
- }
- return info.Uses[id]
-}
diff --git a/go/types/api.go b/go/types/api.go
index cec106a..01d8928 100644
--- a/go/types/api.go
+++ b/go/types/api.go
@@ -206,6 +206,34 @@
InitOrder []*Initializer
}
+// TypeOf returns the type of expression e, or nil if not found.
+// Precondition: the Types, Uses and Defs maps are populated.
+//
+func (info *Info) TypeOf(e ast.Expr) Type {
+ if t, ok := info.Types[e]; ok {
+ return t.Type
+ }
+ if id, ok := e.(*ast.Ident); ok {
+ return info.ObjectOf(id).Type()
+ }
+ return nil
+}
+
+// ObjectOf returns the object denoted by the specified id,
+// or nil if not found.
+//
+// If id is an anonymous struct field, ObjectOf returns the field (*Var)
+// it uses, not the type (*TypeName) it defines.
+//
+// Precondition: the Uses and Defs maps are populated.
+//
+func (info *Info) ObjectOf(id *ast.Ident) Object {
+ if obj, ok := info.Defs[id]; ok {
+ return obj
+ }
+ return info.Uses[id]
+}
+
// TypeAndValue reports the type and value (for constants)
// of the corresponding expression.
type TypeAndValue struct {