| // Copyright 2021 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. |
| |
| //go:build !typeparams |
| // +build !typeparams |
| |
| package types |
| |
| import "go/ast" |
| |
| // Info holds result type information for a type-checked package. |
| // Only the information for which a map is provided is collected. |
| // If the package has type errors, the collected information may |
| // be incomplete. |
| type Info struct { |
| // Types maps expressions to their types, and for constant |
| // expressions, also their values. Invalid expressions are |
| // omitted. |
| // |
| // For (possibly parenthesized) identifiers denoting built-in |
| // functions, the recorded signatures are call-site specific: |
| // if the call result is not a constant, the recorded type is |
| // an argument-specific signature. Otherwise, the recorded type |
| // is invalid. |
| // |
| // The Types map does not record the type of every identifier, |
| // only those that appear where an arbitrary expression is |
| // permitted. For instance, the identifier f in a selector |
| // expression x.f is found only in the Selections map, the |
| // identifier z in a variable declaration 'var z int' is found |
| // only in the Defs map, and identifiers denoting packages in |
| // qualified identifiers are collected in the Uses map. |
| Types map[ast.Expr]TypeAndValue |
| |
| // Defs maps identifiers to the objects they define (including |
| // package names, dots "." of dot-imports, and blank "_" identifiers). |
| // For identifiers that do not denote objects (e.g., the package name |
| // in package clauses, or symbolic variables t in t := x.(type) of |
| // type switch headers), the corresponding objects are nil. |
| // |
| // For an embedded field, Defs returns the field *Var it defines. |
| // |
| // Invariant: Defs[id] == nil || Defs[id].Pos() == id.Pos() |
| Defs map[*ast.Ident]Object |
| |
| // Uses maps identifiers to the objects they denote. |
| // |
| // For an embedded field, Uses returns the *TypeName it denotes. |
| // |
| // Invariant: Uses[id].Pos() != id.Pos() |
| Uses map[*ast.Ident]Object |
| |
| // Implicits maps nodes to their implicitly declared objects, if any. |
| // The following node and object types may appear: |
| // |
| // node declared object |
| // |
| // *ast.ImportSpec *PkgName for imports without renames |
| // *ast.CaseClause type-specific *Var for each type switch case clause (incl. default) |
| // *ast.Field anonymous parameter *Var (incl. unnamed results) |
| // |
| Implicits map[ast.Node]Object |
| |
| // Selections maps selector expressions (excluding qualified identifiers) |
| // to their corresponding selections. |
| Selections map[*ast.SelectorExpr]*Selection |
| |
| // Scopes maps ast.Nodes to the scopes they define. Package scopes are not |
| // associated with a specific node but with all files belonging to a package. |
| // Thus, the package scope can be found in the type-checked Package object. |
| // Scopes nest, with the Universe scope being the outermost scope, enclosing |
| // the package scope, which contains (one or more) files scopes, which enclose |
| // function scopes which in turn enclose statement and function literal scopes. |
| // Note that even though package-level functions are declared in the package |
| // scope, the function scopes are embedded in the file scope of the file |
| // containing the function declaration. |
| // |
| // The following node types may appear in Scopes: |
| // |
| // *ast.File |
| // *ast.FuncType |
| // *ast.BlockStmt |
| // *ast.IfStmt |
| // *ast.SwitchStmt |
| // *ast.TypeSwitchStmt |
| // *ast.CaseClause |
| // *ast.CommClause |
| // *ast.ForStmt |
| // *ast.RangeStmt |
| // |
| Scopes map[ast.Node]*Scope |
| |
| // InitOrder is the list of package-level initializers in the order in which |
| // they must be executed. Initializers referring to variables related by an |
| // initialization dependency appear in topological order, the others appear |
| // in source order. Variables without an initialization expression do not |
| // appear in this list. |
| InitOrder []*Initializer |
| } |
| |
| func getInferred(info *Info) map[ast.Expr]_Inferred { |
| return nil |
| } |