Functions
Addr
function
#
func Addr(pos src.XPos, x ir.Node) *ir.AddrExpr
Deref
function
#
func Deref(pos src.XPos, typ *types.Type, x ir.Node) *ir.StarExpr
FixValue
function
#
FixValue returns val after converting and truncating it as
appropriate for typ.
func FixValue(typ *types.Type, val constant.Value) constant.Value
Implicit
function
#
Implicit returns n after marking it as Implicit.
func Implicit(n ImplicitNode) ImplicitNode
Import
method
#
func (m *gcimports) Import(path string) (*types2.Package, error)
ImportFrom
method
#
func (m *gcimports) ImportFrom(path string, srcDir string, mode types2.ImportMode) (*types2.Package, error)
LoadPackage
function
#
func LoadPackage(filenames []string)
LookupFunc
function
#
LookupFunc returns the ir.Func for an arbitrary full symbol name if
that function exists in the set of available export data.
This allows lookup of arbitrary functions and methods that aren't otherwise
referenced by the local package and thus haven't been read yet.
TODO(prattmic): Does not handle instantiation of generic types. Currently
profiles don't contain the original type arguments, so we won't be able to
create the runtime dictionaries.
TODO(prattmic): Hit rate of this function is usually fairly low, and errors
are only used when debug logging is enabled. Consider constructing cheaper
errors by default.
func LookupFunc(fullName string) (*ir.Func, error)
MakeWrappers
function
#
MakeWrappers constructs all wrapper methods needed for the target
compilation unit.
func MakeWrappers(target *ir.Package)
Marker
method
#
func (c codeStmt) Marker() pkgbits.SyncMarker
Marker
method
#
func (c codeExpr) Marker() pkgbits.SyncMarker
Marker
method
#
func (c codeDecl) Marker() pkgbits.SyncMarker
Marker
method
#
func (c codeAssign) Marker() pkgbits.SyncMarker
PostLookupCleanup
function
#
PostLookupCleanup performs cleanup operations needed
after a series of calls to LookupFunc, specifically invoking
readBodies to post-process any funcs on the "todoBodies" list
that were added as a result of the lookup operations.
func PostLookupCleanup()
Renameinit
function
#
func Renameinit() *types.Sym
String
method
#
func (p posVar) String() string
Value
method
#
func (c codeAssign) Value() int
Value
method
#
func (c codeExpr) Value() int
Value
method
#
func (c codeDecl) Value() int
Value
method
#
func (c codeStmt) Value() int
Visit
method
#
func (c *declCollector) Visit(n syntax.Node) syntax.Visitor
WriteExports
function
#
func WriteExports(out *bio.Writer)
addBody
method
#
addBody reads a function body reference from the element bitstream,
and associates it with fn.
func (r *reader) addBody(fn *ir.Func, method *types.Sym)
addFingerprint
function
#
addFingerprint reads the linker fingerprint included at the end of
the exportdata.
func addFingerprint(path string, data string) error
addLocal
method
#
func (r *reader) addLocal(name *ir.Name)
addLocal
method
#
addLocal records the declaration of a new local variable.
func (w *writer) addLocal(obj *types2.Var)
addTailCall
function
#
func addTailCall(pos src.XPos, fn *ir.Func, recv ir.Node, method *types.Field)
anyDerived
method
#
anyDerived reports whether any of info's explicit type arguments
are derived types.
func (info objInfo) anyDerived() bool
asPragmaFlag
function
#
func asPragmaFlag(p syntax.Pragma) ir.PragmaFlag
asReader
method
#
func (pri pkgReaderIndex) asReader(k pkgbits.RelocKind, marker pkgbits.SyncMarker) *reader
asWasmExport
function
#
func asWasmExport(p syntax.Pragma) *WasmExport
asWasmImport
function
#
func asWasmImport(p syntax.Pragma) *WasmImport
assert
function
#
func assert(p bool)
assign
method
#
func (w *writer) assign(expr syntax.Expr)
assign
method
#
assign returns an assignee expression. It also reports whether the
returned expression is a newly declared variable.
func (r *reader) assign() (ir.Node, bool)
assignList
method
#
func (r *reader) assignList() ([]*ir.Name, []ir.Node)
assignList
method
#
func (w *writer) assignList(expr syntax.Expr)
assignStmt
method
#
assignStmt writes out an assignment for "lhs = rhs".
func (w *writer) assignStmt(pos poser, lhs0 syntax.Expr, rhs0 syntax.Expr)
block
function
#
func block(stmts []ir.Node) ir.Node
blockStmt
method
#
func (w *writer) blockStmt(stmt *syntax.BlockStmt)
blockStmt
method
#
func (r *reader) blockStmt() []ir.Node
bodyIdx
method
#
bodyIdx returns the index for the given function body (specified by
block), adding it to the export data
func (pw *pkgWriter) bodyIdx(sig *types2.Signature, block *syntax.BlockStmt, dict *writerDict) (idx index, closureVars []posVar)
bodyReaderFor
function
#
bodyReaderFor returns the pkgReaderIndex for reading fn's
serialized IR, and whether one was found.
func bodyReaderFor(fn *ir.Func) (pri pkgReaderIndex, ok bool)
callShaped
method
#
callShaped emits a tail call to r.shapedFn, passing along the
arguments to the current function.
func (r *reader) callShaped(pos src.XPos)
checkEmbed
function
#
func checkEmbed(decl *syntax.VarDecl, haveEmbed bool, withinFunc bool) error
checkFiles
function
#
checkFiles configures and runs the types2 checker on the given
parsed source files and then returns the result.
The map result value indicates which closures are generated from the bodies of range function loops.
func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info, map[*syntax.FuncLit]bool)
checkImportPath
function
#
func checkImportPath(path string, allowSpace bool) error
checkPragmas
method
#
func (pw *pkgWriter) checkPragmas(p syntax.Pragma, allowed ir.PragmaFlag, embedOK bool)
checkUnusedDuringParse
method
#
func (p *noder) checkUnusedDuringParse(pragma *pragmas)
closeAnotherScope
method
#
closeAnotherScope is like closeScope, but it reuses the same mark
position as the last closeScope call. This is useful for "for" and
"if" statements, as their implicit blocks always end at the same
position as an explicit block.
func (r *reader) closeAnotherScope()
closeAnotherScope
method
#
func (w *writer) closeAnotherScope()
closeScope
method
#
func (w *writer) closeScope(pos syntax.Pos)
closeScope
method
#
func (r *reader) closeScope()
collectDecls
method
#
func (pw *pkgWriter) collectDecls(noders []*noder)
compLit
method
#
func (r *reader) compLit() ir.Node
compLit
method
#
func (w *writer) compLit(lit *syntax.CompositeLit)
convRTTI
method
#
convRTTI returns expressions appropriate for populating an
ir.ConvExpr's TypeWord and SrcRType fields, respectively.
func (r *reader) convRTTI(pos src.XPos) (typeWord ir.Node, srcRType ir.Node)
convRTTI
method
#
convRTTI writes information so that the reader can construct
expressions for converting from src to dst.
func (w *writer) convRTTI(src types2.Type, dst types2.Type)
convertExpr
method
#
func (w *writer) convertExpr(dst types2.Type, expr syntax.Expr, implicit bool)
curry
method
#
curry returns a function literal that calls fun with arg0 and
(optionally) arg1, accepting additional arguments to the function
literal as necessary to satisfy fun's signature.
If nilCheck is true and arg0 is an interface value, then it's
checked to be non-nil as an initial step at the point of evaluating
the function literal itself.
func (r *reader) curry(origPos src.XPos, ifaceHack bool, fun ir.Node, arg0 ir.Node, arg1 ir.Node) ir.Node
declStmt
method
#
func (w *writer) declStmt(decl syntax.Decl)
declareParams
method
#
func (w *writer) declareParams(sig *types2.Signature)
declareParams
method
#
func (r *reader) declareParams()
deref2
function
#
deref2 does a single deref of types2 type t, if it is a pointer type.
func deref2(t types2.Type) types2.Type
dictNameOf
method
#
dictNameOf returns the runtime dictionary corresponding to dict.
func (pr *pkgReader) dictNameOf(dict *readerDict) *ir.Name
dictWord
method
#
dictWord returns an expression to return the specified
uintptr-typed word from the dictionary parameter.
func (r *reader) dictWord(pos src.XPos, idx int) ir.Node
distinctVars
method
#
func (w *writer) distinctVars(stmt *syntax.ForStmt) bool
doObj
method
#
doObj writes the RelocObj definition for obj to w, and the
RelocObjExt definition to wext.
func (w *writer) doObj(wext *writer, obj types2.Object) pkgbits.CodeObj
doPkg
method
#
doPkg reads a package definition from the bitstream.
func (r *reader) doPkg() *types.Pkg
doTyp
method
#
func (r *reader) doTyp() *types.Type
end
method
#
func (m *posMap) end(p ender) src.XPos
equals
method
#
equals reports whether info and other represent the same Go object
(i.e., same base object and identical type arguments, if any).
func (info objInfo) equals(other objInfo) bool
error
method
#
error is called concurrently if files are parsed concurrently.
func (p *noder) error(err error)
errorf
method
#
errorf reports a user error about thing p.
func (pw *pkgWriter) errorf(p poser, msg string, args ...interface{})
expandInline
function
#
expandInline reads in an extra copy of IR to populate
fn.Inl.Dcl.
func expandInline(fn *ir.Func, pri pkgReaderIndex)
exportBody
method
#
exportBody exports the given function or method's body, if
appropriate. local indicates whether it's a local function or
method available on a locally declared type. (Due to cross-package
type aliases, a method may be imported, but still available on a
locally declared type.)
func (l *linker) exportBody(obj *ir.Name, local bool)
expr
method
#
expr writes the given expression into the function body bitstream.
func (w *writer) expr(expr syntax.Expr)
expr
method
#
expr reads and returns a typechecked expression.
func (r *reader) expr() (res ir.Node)
exprList
method
#
func (w *writer) exprList(expr syntax.Expr)
exprList
method
#
func (r *reader) exprList() []ir.Node
exprType
method
#
func (r *reader) exprType() ir.Node
exprType
method
#
func (w *writer) exprType(iface types2.Type, typ syntax.Expr)
exprs
method
#
func (r *reader) exprs() []ir.Node
exprs
method
#
func (w *writer) exprs(exprs []syntax.Expr)
fatalf
method
#
fatalf reports an internal compiler error about thing p.
func (pw *pkgWriter) fatalf(p poser, msg string, args ...interface{})
fieldIndex
function
#
fieldIndex returns the index of the struct field named by key.
func fieldIndex(info *types2.Info, str *types2.Struct, key *syntax.Name) int
finishWrapperFunc
function
#
func finishWrapperFunc(fn *ir.Func, target *ir.Package)
forStmt
method
#
func (r *reader) forStmt(label *types.Sym) ir.Node
forStmt
method
#
func (w *writer) forStmt(stmt *syntax.ForStmt)
freePackage
function
#
freePackage ensures the given package is garbage collected.
func freePackage(pkg *types2.Package)
funcBody
method
#
func (pri pkgReaderIndex) funcBody(fn *ir.Func)
funcBody
method
#
funcBody reads a function body definition from the element
bitstream, and populates fn with it.
func (r *reader) funcBody(fn *ir.Func)
funcExt
method
#
func (r *reader) funcExt(name *ir.Name, method *types.Sym)
funcExt
method
#
func (w *writer) funcExt(obj *types2.Func)
funcInst
method
#
funcInst reads an instantiated function reference, and returns
three (possibly nil) expressions related to it:
baseFn is always non-nil: it's either a function of the appropriate
type already, or it has an extra dictionary parameter as the first
parameter.
If dictPtr is non-nil, then it's a dictionary argument that must be
passed as the first argument to baseFn.
If wrapperFn is non-nil, then it's either the same as baseFn (if
dictPtr is nil), or it's semantically equivalent to currying baseFn
to pass dictPtr. (wrapperFn is nil when dictPtr is an expression
that needs to be computed dynamically.)
For callers that are creating a call to the returned function, it's
best to emit a call to baseFn, and include dictPtr in the arguments
list as appropriate.
For callers that want to return the function without invoking it,
they may return wrapperFn if it's non-nil; but otherwise, they need
to create their own wrapper.
func (r *reader) funcInst(pos src.XPos) (wrapperFn ir.Node, baseFn ir.Node, dictPtr ir.Node)
funcInst
method
#
funcInst writes a reference to an instantiated function.
func (w *writer) funcInst(obj *types2.Func, targs *types2.TypeList)
funcLit
method
#
func (w *writer) funcLit(expr *syntax.FuncLit)
funcLit
method
#
func (r *reader) funcLit() ir.Node
hasCycle
method
#
hasCycle reports whether typ is part of an anonymous interface cycle.
func (f *cycleFinder) hasCycle(typ *types2.Interface) bool
hasFallthrough
function
#
hasFallthrough reports whether stmts ends in a fallthrough
statement.
func hasFallthrough(stmts []syntax.Stmt) bool
hasImplicitTypeParams
method
#
hasImplicitTypeParams reports whether obj is a defined type with
implicit type parameters (e.g., declared within a generic function
or method).
func (pw *pkgWriter) hasImplicitTypeParams(obj *types2.TypeName) bool
hasTypeParams
method
#
func (dict *readerDict) hasTypeParams() bool
hasTypeParams
method
#
func (r *reader) hasTypeParams() bool
idealType
function
#
func idealType(tv syntax.TypeAndValue) types2.Type
ifStmt
method
#
func (r *reader) ifStmt() ir.Node
ifStmt
method
#
func (w *writer) ifStmt(stmt *syntax.IfStmt)
implicitConvExpr
method
#
implicitConvExpr is like expr, but if dst is non-nil and different
from expr's type, then an implicit conversion operation is inserted
at expr's position.
func (w *writer) implicitConvExpr(dst types2.Type, expr syntax.Expr)
importedDef
method
#
importedDef reports whether r is reading from an imported and
non-generic element.
If a type was found in an imported package, then we can assume that
package (or one of its transitive dependencies) already generated
method wrappers for it.
Exception: If we're instantiating an imported generic type or
function, we might be instantiating it with type arguments not
previously seen before.
TODO(mdempsky): Distinguish when a generic function or type was
instantiated in an imported package so that we can add types to
haveWrapperTypes instead.
func (r *reader) importedDef() bool
initDefn
method
#
initDefn marks the given names as declared by defn and populates
its Init field with ODCL nodes. It then reports whether any names
were so declared, which can be used to initialize defn.Def.
func (r *reader) initDefn(defn ir.InitNode, names []*ir.Name) bool
inlClosureFunc
method
#
inlClosureFunc constructs a new closure function, but correctly
handles inlining.
func (r *reader) inlClosureFunc(origPos src.XPos, sig *types.Type, why ir.Op) *ir.Func
inlPos
method
#
inlPos returns the inlining-adjusted src.XPos corresponding to
xpos, which must be a non-inlined position. When not inlining, this
is just xpos.
func (r *reader) inlPos(xpos src.XPos) src.XPos
inlPosBase
method
#
inlPosBase returns the inlining-adjusted src.PosBase corresponding
to oldBase, which must be a non-inlined position. When not
inlining, this is just oldBase.
func (r *reader) inlPosBase(oldBase *src.PosBase) *src.PosBase
inlReturn
method
#
inlReturn returns a statement that can substitute for the given
return statement when inlining.
func (r *reader) inlReturn(ret *ir.ReturnStmt, retvars []*ir.Name) *ir.BlockStmt
interfaceType
method
#
func (w *writer) interfaceType(typ *types2.Interface)
interfaceType
method
#
func (r *reader) interfaceType() *types.Type
isBuiltin
method
#
isBuiltin reports whether expr is a (possibly parenthesized)
referenced to the specified built-in function.
func (pw *pkgWriter) isBuiltin(expr syntax.Expr, builtin string) bool
isCgoGeneratedFile
function
#
isCgoGeneratedFile reports whether pos is in a file
generated by cgo, which is to say a file with name
beginning with "_cgo_". Such files are allowed to
contain cgo directives, and for security reasons
(primarily misuse of linker flags), other files are not.
See golang.org/issue/23672.
Note that cmd/go ignores files whose names start with underscore,
so the only _cgo_ files we will see from cmd/go are generated by cgo.
It's easy to bypass this check by calling the compiler directly;
we only protect against uses by cmd/go.
func isCgoGeneratedFile(pos syntax.Pos) bool
isDefinedType
function
#
isDefinedType reports whether obj is a defined type.
func isDefinedType(obj types2.Object) bool
isDriveLetter
function
#
func isDriveLetter(b byte) bool
isGlobal
function
#
isGlobal reports whether obj was declared at package scope.
Caveat: blank objects are not declared.
func isGlobal(obj types2.Object) bool
isInterface
function
#
isInterface reports whether typ is known to be an interface type.
If typ is a type parameter, then isInterface reports an internal
compiler error instead.
func isInterface(typ types2.Type) bool
isNil
function
#
isNil reports whether expr is a (possibly parenthesized) reference
to the predeclared nil value.
func isNil(p *pkgWriter, expr syntax.Expr) bool
isNotInHeap
function
#
isNotInHeap reports whether typ is or contains an element of type
internal/runtime/sys.NotInHeap.
func isNotInHeap(typ types2.Type) bool
isPkgQual
function
#
isPkgQual reports whether the given selector expression is a
package-qualified identifier.
func isPkgQual(info *types2.Info, sel *syntax.SelectorExpr) bool
isPtrTo
function
#
isPtrTo reports whether from is the type *to.
func isPtrTo(from types2.Type, to types2.Type) bool
isQuoted
function
#
func isQuoted(s string) bool
isSpace
function
#
func isSpace(c rune) bool
isTuple
function
#
isTuple reports whether typ is a tuple type.
func isTuple(typ types2.Type) bool
isTypeParam
function
#
func isTypeParam(t types2.Type) bool
isUntyped
function
#
isUntyped reports whether typ is an untyped type.
func isUntyped(typ types2.Type) bool
islocalname
function
#
is this path a local name? begins with ./ or ../ or /
func islocalname(name string) bool
itab
method
#
func (w *writer) itab(typ types2.Type, iface types2.Type)
itab
method
#
itab returns a (typ, iface) pair of types.
typRType and ifaceRType are expressions that evaluate to the
*runtime._type for typ and iface, respectively.
If typ is a concrete type and iface is a non-empty interface type,
then itab is an expression that evaluates to the *runtime.itab for
the pair. Otherwise, itab is nil.
func (r *reader) itab(pos src.XPos) (typ *types.Type, typRType ir.Node, iface *types.Type, ifaceRType ir.Node, itab ir.Node)
itabIdx
method
#
itabIdx returns the index where the given encoded type pair's
*runtime.itab value appears within this dictionary's itabs section,
adding it if necessary.
func (dict *writerDict) itabIdx(typInfo typeInfo, ifaceInfo typeInfo) int
itabsOffset
method
#
itabsOffset returns the offset of the runtime dictionary's itabs
section, in words.
func (dict *readerDict) itabsOffset() int
label
method
#
func (r *reader) label() *types.Sym
label
method
#
func (w *writer) label(label *syntax.Name)
lastFieldType
function
#
func lastFieldType(fields []*syntax.Field) syntax.Expr
lastNonEmptyStmt
function
#
lastNonEmptyStmt returns the last non-empty statement in list, if
any.
func lastNonEmptyStmt(stmts []syntax.Stmt) syntax.Stmt
linkname
method
#
func (w *writer) linkname(obj types2.Object)
linkname
method
#
func (l *linker) linkname(w *pkgbits.Encoder, name *ir.Name)
linkname
method
#
func (r *reader) linkname(name *ir.Name)
localIdent
method
#
func (r *reader) localIdent() *types.Sym
localIdent
method
#
localIdent writes the name of a locally declared object (i.e.,
objects that can only be accessed by non-qualified name, within the
context of a particular function).
func (w *writer) localIdent(obj types2.Object)
lookupFunction
function
#
func lookupFunction(pkg *types.Pkg, symName string) (*ir.Func, error)
lookupMethod
function
#
func lookupMethod(pkg *types.Pkg, symName string) (*ir.Func, error)
lookupObj
function
#
lookupObj returns the object that expr refers to, if any. If expr
is an explicit instantiation of a generic object, then the instance
object is returned as well.
func lookupObj(p *pkgWriter, expr syntax.Expr) (obj types2.Object, inst types2.Instance)
lsymIdx
method
#
func (l *linker) lsymIdx(w *pkgbits.Encoder, linkname string, lsym *obj.LSym) bool
makeSrcPosBase
method
#
makeSrcPosBase translates from a *syntax.PosBase to a *src.PosBase.
func (m *posMap) makeSrcPosBase(b0 *syntax.PosBase) *src.PosBase
makeXPos
method
#
func (m *posMap) makeXPos(pos syntax.Pos) src.XPos
mangle
method
#
func (dict *readerDict) mangle(sym *types.Sym) *types.Sym
maybeTypeAndValue
method
#
func (pw *pkgWriter) maybeTypeAndValue(x syntax.Expr) (syntax.TypeAndValue, bool)
method
method
#
func (w *writer) method(wext *writer, meth *types2.Func)
method
method
#
func (r *reader) method(rext *reader) *types.Field
methodExpr
method
#
methodExpr writes out a reference to the method selected by
expr. sel should be the corresponding types2.Selection, and recv
the type produced after any implicit addressing, dereferencing, and
field selection. (Note: recv might differ from sel.Obj()'s receiver
parameter in the case of interface types, and is needed for
handling type parameter methods.)
func (w *writer) methodExpr(expr *syntax.SelectorExpr, recv types2.Type, sel *types2.Selection)
methodExpr
method
#
methodExpr reads a method expression reference, and returns three
(possibly nil) expressions related to it:
baseFn is always non-nil: it's either a function of the appropriate
type already, or it has an extra dictionary parameter as the second
parameter (i.e., immediately after the promoted receiver
parameter).
If dictPtr is non-nil, then it's a dictionary argument that must be
passed as the second argument to baseFn.
If wrapperFn is non-nil, then it's either the same as baseFn (if
dictPtr is nil), or it's semantically equivalent to currying baseFn
to pass dictPtr. (wrapperFn is nil when dictPtr is an expression
that needs to be computed dynamically.)
For callers that are creating a call to the returned method, it's
best to emit a call to baseFn, and include dictPtr in the arguments
list as appropriate.
For callers that want to return a method expression without
invoking it, they may return wrapperFn if it's non-nil; but
otherwise, they need to create their own wrapper.
func (r *reader) methodExpr() (wrapperFn ir.Node, baseFn ir.Node, dictPtr ir.Node)
methodExprWrap
method
#
methodExprWrap returns a function literal that changes method's
first parameter's type to recv, and uses implicits/deref/addr to
select the appropriate receiver parameter to pass to method.
func (r *reader) methodExprWrap(origPos src.XPos, recv *types.Type, implicits []int, deref bool, addr bool, method ir.Node, dictPtr ir.Node) ir.Node
methodWrapper
function
#
func methodWrapper(derefs int, tbase *types.Type, method *types.Field, target *ir.Package)
multiExpr
method
#
multiExpr writes a sequence of expressions, where the i'th value is
implicitly converted to dstType(i). It also handles when exprs is a
single, multi-valued expression (e.g., the multi-valued argument in
an f(g()) call, or the RHS operand in a comma-ok assignment).
func (w *writer) multiExpr(pos poser, dstType func(int) types2.Type, exprs []syntax.Expr)
multiExpr
method
#
func (r *reader) multiExpr() []ir.Node
namedType
method
#
namedType writes a use of the given named type into the bitstream.
func (w *writer) namedType(obj *types2.TypeName, targs *types2.TypeList)
namesAsExpr
function
#
namesAsExpr returns a list of names as a syntax.Expr.
func namesAsExpr(names []*syntax.Name) syntax.Expr
needWrapper
method
#
needWrapper records that wrapper methods may be needed at link
time.
func (r *reader) needWrapper(typ *types.Type)
newPkgReader
function
#
func newPkgReader(pr pkgbits.PkgDecoder) *pkgReader
newPkgWriter
function
#
newPkgWriter returns an initialized pkgWriter for the specified
package.
func newPkgWriter(m posMap, pkg *types2.Package, info *types2.Info, otherInfo map[*syntax.FuncLit]bool) *pkgWriter
newReader
method
#
func (pr *pkgReader) newReader(k pkgbits.RelocKind, idx index, marker pkgbits.SyncMarker) *reader
newWrapperFunc
function
#
func newWrapperFunc(pos src.XPos, sym *types.Sym, wrapper *types.Type, method *types.Field) *ir.Func
newWrapperType
function
#
newWrapperType returns a copy of the given signature type, but with
the receiver parameter type substituted with recvType.
If recvType is nil, newWrapperType returns a signature
without a receiver parameter.
func newWrapperType(recvType *types.Type, method *types.Field) *types.Type
newWriter
method
#
func (pw *pkgWriter) newWriter(k pkgbits.RelocKind, marker pkgbits.SyncMarker) *writer
numWords
method
#
numWords returns the total number of words that comprise dict's
runtime dictionary variable.
func (dict *readerDict) numWords() int64
obj
method
#
obj writes a use of the given object into the bitstream.
If obj is a generic object, then explicits are the explicit type
arguments used to instantiate it (i.e., used to substitute the
object's own declared type parameters).
func (w *writer) obj(obj types2.Object, explicits *types2.TypeList)
obj
method
#
obj reads an instantiated object reference from the bitstream.
func (r *reader) obj() ir.Node
objDict
method
#
objDict writes the dictionary needed for reading the given object.
func (w *writer) objDict(obj types2.Object, dict *writerDict)
objDictIdx
method
#
objDictIdx reads and returns the specified object dictionary.
func (pr *pkgReader) objDictIdx(sym *types.Sym, idx index, implicits []*types.Type, explicits []*types.Type, shaped bool) (*readerDict, error)
objDictName
method
#
func (pr *pkgReader) objDictName(idx index, implicits []*types.Type, explicits []*types.Type) *ir.Name
objIdx
method
#
objIdx returns the specified object, instantiated with the given
type arguments, if any.
If shaped is true, then the shaped variant of the object is returned
instead.
func (pr *pkgReader) objIdx(idx index, implicits []*types.Type, explicits []*types.Type, shaped bool) ir.Node
objIdx
method
#
objIdx returns the index for the given Object, adding it to the
export data as needed.
func (pw *pkgWriter) objIdx(obj types2.Object) index
objIdxMayFail
method
#
objIdxMayFail is equivalent to objIdx, but returns an error rather than
failing the build if this object requires type arguments and the incorrect
number of type arguments were passed.
Other sources of internal failure (such as duplicate definitions) still fail
the build.
func (pr *pkgReader) objIdxMayFail(idx index, implicits []*types.Type, explicits []*types.Type, shaped bool) (ir.Node, error)
objInfo
method
#
objInfo writes a use of the given encoded object into the
bitstream.
func (w *writer) objInfo(info objInfo)
objInfo
method
#
objInfo reads an instantiated object reference from the bitstream
and returns the encoded reference to it, without instantiating it.
func (r *reader) objInfo() objInfo
objInstIdx
method
#
objInstIdx returns the encoded, instantiated object. If shaped is
true, then the shaped variant of the object is returned instead.
func (pr *pkgReader) objInstIdx(info objInfo, dict *readerDict, shaped bool) ir.Node
objInstIdx
method
#
objInstIdx returns the indices for an object and a corresponding
list of type arguments used to instantiate it, adding them to the
export data as needed.
func (pw *pkgWriter) objInstIdx(obj types2.Object, explicits *types2.TypeList, dict *writerDict) objInfo
objTypeParams
function
#
objTypeParams returns the type parameters on the given object.
func objTypeParams(obj types2.Object) *types2.TypeParamList
op
method
#
func (r *reader) op() ir.Op
op
method
#
op writes an Op into the bitstream.
func (w *writer) op(op ir.Op)
openPackage
function
#
func openPackage(path string) (*os.File, error)
openScope
method
#
func (w *writer) openScope(pos syntax.Pos)
openScope
method
#
func (r *reader) openScope()
optExpr
method
#
func (r *reader) optExpr() ir.Node
optExpr
method
#
func (w *writer) optExpr(expr syntax.Expr)
optLabel
method
#
func (r *reader) optLabel() *types.Sym
optLabel
method
#
func (w *writer) optLabel(label *syntax.Name)
origPos
method
#
origPos reads a position from the bitstream, and returns both the
original raw position and an inlining-adjusted position.
func (r *reader) origPos() (origPos src.XPos, inlPos src.XPos)
param
method
#
func (r *reader) param() *types.Field
param
method
#
func (w *writer) param(param *types2.Var)
params
method
#
func (r *reader) params() []*types.Field
params
method
#
func (w *writer) params(typ *types2.Tuple)
parseGoEmbed
function
#
parseGoEmbed parses the text following "//go:embed" to extract the glob patterns.
It accepts unquoted space-separated patterns as well as double-quoted and back-quoted Go strings.
go/build/read.go also processes these strings and contains similar logic.
func parseGoEmbed(args string) ([]string, error)
pkg
method
#
pkg writes a use of the given Package into the element bitstream.
func (w *writer) pkg(pkg *types2.Package)
pkg
method
#
pkg reads a package reference from the bitstream.
func (r *reader) pkg() *types.Pkg
pkgDecl
method
#
func (w *writer) pkgDecl(decl syntax.Decl)
pkgDecls
method
#
func (r *reader) pkgDecls(target *ir.Package)
pkgIdx
method
#
pkgIdx returns the specified package from the export data, reading
it first if needed.
func (pr *pkgReader) pkgIdx(idx index) *types.Pkg
pkgIdx
method
#
pkgIdx returns the index for the given package, adding it to the
package export data if needed.
func (pw *pkgWriter) pkgIdx(pkg *types2.Package) index
pkgInit
method
#
func (r *reader) pkgInit(self *types.Pkg, target *ir.Package)
pkgInit
method
#
func (w *writer) pkgInit(noders []*noder)
pkgInitOrder
method
#
pkgInitOrder creates a synthetic init function to handle any
package-scope initialization statements.
func (r *reader) pkgInitOrder(target *ir.Package)
pkgInitOrder
method
#
func (w *writer) pkgInitOrder()
pkgObjs
method
#
func (r *reader) pkgObjs(target *ir.Package) []*ir.Name
pkgObjs
method
#
func (w *writer) pkgObjs(names ...*syntax.Name)
pkgRef
method
#
func (w *writer) pkgRef(idx index)
pos
method
#
func (m *posMap) pos(p poser) src.XPos
pos
method
#
pos writes the position of p into the element bitstream.
func (w *writer) pos(p poser)
pos
method
#
pos reads a position from the bitstream.
func (r *reader) pos() src.XPos
pos0
method
#
func (r *reader) pos0() src.Pos
posBase
method
#
posBase writes a reference to the given PosBase into the element
bitstream.
func (w *writer) posBase(b *syntax.PosBase)
posBase
method
#
posBase reads a position base from the bitstream.
func (r *reader) posBase() *src.PosBase
posBaseIdx
method
#
posBaseIdx returns the specified position base, reading it first if
needed.
func (pr *pkgReader) posBaseIdx(idx index) *src.PosBase
posBaseIdx
method
#
posBaseIdx returns the index for the given PosBase.
func (pw *pkgWriter) posBaseIdx(b *syntax.PosBase) index
pragcgo
method
#
pragcgo is called concurrently if files are parsed concurrently.
func (p *noder) pragcgo(pos syntax.Pos, text string)
pragma
method
#
pragma is called concurrently if files are parsed concurrently.
func (p *noder) pragma(pos syntax.Pos, blankLine bool, text string, old syntax.Pragma) syntax.Pragma
pragmaFields
function
#
pragmaFields is similar to strings.FieldsFunc(s, isSpace)
but does not split when inside double quoted regions and always
splits before the start and after the end of a double quoted region.
pragmaFields does not recognize escaped quotes. If a quote in s is not
closed the part after the opening quote will not be returned as a field.
func pragmaFields(s string) []string
pragmaFlag
method
#
func (l *linker) pragmaFlag(w *pkgbits.Encoder, pragma ir.PragmaFlag)
pragmaFlag
method
#
func (w *writer) pragmaFlag(p ir.PragmaFlag)
pragmaFlag
function
#
func pragmaFlag(verb string) ir.PragmaFlag
pragmaFlag
method
#
func (r *reader) pragmaFlag() ir.PragmaFlag
qualifiedIdent
method
#
qualifiedIdent writes out the name of an object declared at package
scope. (For now, it's also used to refer to local defined types.)
func (w *writer) qualifiedIdent(obj types2.Object)
qualifiedIdent
method
#
func (r *reader) qualifiedIdent() (pkg *types.Pkg, sym *types.Sym)
readBodies
function
#
readBodies iteratively expands all pending dictionaries and
function bodies.
If duringInlining is true, then the inline.InlineDecls is called as
necessary on instantiations of imported generic functions, so their
inlining costs can be computed.
func readBodies(target *ir.Package, duringInlining bool)
readExportData
function
#
readExportData returns the contents of GC-created unified export data.
func readExportData(f *os.File) (data string, err error)
readImportFile
function
#
readImportFile reads the import file for the given package path and
returns its types.Pkg representation. If packages is non-nil, the
types2.Package representation is also returned.
func readImportFile(path string, target *ir.Package, env *types2.Context, packages map[string]*types2.Package) (pkg1 *types.Pkg, pkg2 *types2.Package, err error)
readPackage
function
#
readPackage reads package export data from pr to populate
importpkg.
localStub indicates whether pr is reading the stub export data for
the local package, as opposed to relocated export data for an
import.
func readPackage(pr *pkgReader, importpkg *types.Pkg, localStub bool)
recvBase
function
#
recvBase returns the base type for the given receiver parameter.
func recvBase(recv *types2.Var) *types2.Named
recvExpr
method
#
recvExpr writes out expr.X, but handles any implicit addressing,
dereferencing, and field selections appropriate for the method
selection.
func (w *writer) recvExpr(expr *syntax.SelectorExpr, sel *types2.Selection) types2.Type
relocAll
method
#
relocAll ensures that all elements specified by pr and relocs are
copied into the output export data file, and returns the
corresponding indices in the output.
func (l *linker) relocAll(pr *pkgReader, relocs []pkgbits.RelocEnt) []pkgbits.RelocEnt
relocCommon
method
#
relocCommon copies the specified element from pr into w,
recursively relocating any referenced elements as well.
func (l *linker) relocCommon(pr *pkgReader, w *pkgbits.Encoder, k pkgbits.RelocKind, idx index)
relocFuncExt
method
#
func (l *linker) relocFuncExt(w *pkgbits.Encoder, name *ir.Name)
relocIdx
method
#
relocIdx ensures a single element is copied into the output export
data file, and returns the corresponding index in the output.
func (l *linker) relocIdx(pr *pkgReader, k pkgbits.RelocKind, idx index) index
relocObj
method
#
relocObj copies the specified object from pr into the output export
data file, rewriting its compiler-private extension data (e.g.,
adding inlining cost and escape analysis results for functions).
func (l *linker) relocObj(pr *pkgReader, idx index) index
relocPkg
method
#
relocPkg copies the specified package from pr into the output
export data file, rewriting its import path to match how it was
imported.
TODO(mdempsky): Since CL 391014, we already have the compilation
unit's import path, so there should be no need to rewrite packages
anymore.
func (l *linker) relocPkg(pr *pkgReader, idx index) index
relocString
method
#
relocString copies the specified string from pr into the output
export data file, deduplicating it against other strings.
func (l *linker) relocString(pr *pkgReader, idx index) index
relocTypeExt
method
#
func (l *linker) relocTypeExt(w *pkgbits.Encoder, name *ir.Name)
relocVarExt
method
#
func (l *linker) relocVarExt(w *pkgbits.Encoder, name *ir.Name)
resolveImportPath
function
#
resolveImportPath resolves an import path as it appears in a Go
source file to the package's full path.
func resolveImportPath(path string) (string, error)
rttiWord
method
#
rttiWord is like dictWord, but converts it to *byte (the type used
internally to represent *runtime._type and *runtime.itab).
func (r *reader) rttiWord(pos src.XPos, idx int) ir.Node
rtype
method
#
rtype writes information so that the reader can construct an
expression of type *runtime._type representing typ.
func (w *writer) rtype(typ types2.Type)
rtype
method
#
rtype reads a type reference from the element bitstream, and
returns an expression of type *runtime._type representing that
type.
func (r *reader) rtype(pos src.XPos) ir.Node
rtype0
method
#
func (r *reader) rtype0(pos src.XPos) (typ *types.Type, rtype ir.Node)
rtypeIdx
method
#
rtypeIdx returns the index where the given encoded type's
*runtime._type value appears within this dictionary's rtypes
section, adding it if necessary.
func (dict *writerDict) rtypeIdx(newInfo typeInfo) int
rtypeInfo
method
#
func (w *writer) rtypeInfo(info typeInfo)
rtypesOffset
method
#
rtypesOffset returns the offset of the runtime dictionary's rtypes
section, in words.
func (dict *readerDict) rtypesOffset() int
safeArg
function
#
safeArg reports whether arg is a "safe" command-line argument,
meaning that when it appears in a command-line, it probably
doesn't have some special meaning other than its own name.
This is copied from SafeArg in cmd/go/internal/load/pkg.go.
func safeArg(name string) bool
selectStmt
method
#
func (r *reader) selectStmt(label *types.Sym) ir.Node
selectStmt
method
#
func (w *writer) selectStmt(stmt *syntax.SelectStmt)
selector
method
#
func (r *reader) selector() *types.Sym
selector
method
#
selector writes the name of a field or method (i.e., objects that
can only be accessed using selector expressions).
func (w *writer) selector(obj types2.Object)
selectorIdx
method
#
func (pw *pkgWriter) selectorIdx(obj types2.Object) selectorInfo
selectorInfo
method
#
func (w *writer) selectorInfo(info selectorInfo)
setBasePos
function
#
func setBasePos(pos src.XPos)
setType
function
#
func setType(n ir.Node, typ *types.Type)
setValue
function
#
func setValue(name *ir.Name, val constant.Value)
shapeSig
function
#
shapeSig returns a copy of fn's signature, except adding a
dictionary parameter and promoting the receiver parameter (if any)
to a normal parameter.
The parameter types.Fields are all copied too, so their Nname
fields can be initialized for use by the shape function.
func shapeSig(fn *ir.Func, dict *readerDict) *types.Type
shapedMethodExpr
function
#
shapedMethodExpr returns the specified method on the given shaped
type.
func shapedMethodExpr(pos src.XPos, obj *ir.Name, sym *types.Sym) *ir.SelectorExpr
shapify
function
#
shapify returns the shape type for targ.
If basic is true, then the type argument is used to instantiate a
type parameter whose constraint is a basic interface.
func shapify(targ *types.Type, basic bool) *types.Type
signature
method
#
func (r *reader) signature(recv *types.Field) *types.Type
signature
method
#
func (w *writer) signature(sig *types2.Signature)
sliceElem
function
#
func sliceElem(typ types2.Type) types2.Type
splitAlias
function
#
splitAlias is like splitNamed, but for an alias type.
func splitAlias(typ *types2.Alias) (*types2.TypeName, *types2.TypeList)
splitNamed
function
#
splitNamed decomposes a use of a defined type into its original
type definition and the type arguments used to instantiate it.
func splitNamed(typ *types2.Named) (*types2.TypeName, *types2.TypeList)
staticBool
method
#
staticBool analyzes a boolean expression and reports whether it's
always true (positive result), always false (negative result), or
unknown (zero).
It also simplifies the expression while preserving semantics, if
possible.
func (pw *pkgWriter) staticBool(ep *syntax.Expr) int
stmt
method
#
func (r *reader) stmt() ir.Node
stmt
method
#
stmt writes the given statement into the function body bitstream.
func (w *writer) stmt(stmt syntax.Stmt)
stmt1
method
#
func (w *writer) stmt1(stmt syntax.Stmt)
stmt1
method
#
func (r *reader) stmt1(tag codeStmt, out *ir.Nodes) ir.Node
stmts
method
#
func (r *reader) stmts() ir.Nodes
stmts
method
#
func (w *writer) stmts(stmts []syntax.Stmt)
structType
method
#
func (w *writer) structType(typ *types2.Struct)
structType
method
#
func (r *reader) structType() *types.Type
subdictIdx
method
#
subdictIdx returns the index where the given encoded object's
runtime dictionary appears within this dictionary's subdictionary
section, adding it if necessary.
func (dict *writerDict) subdictIdx(newInfo objInfo) int
subdictsOffset
method
#
subdictsOffset returns the offset of the runtime dictionary's
subdictionary section, in words.
func (dict *readerDict) subdictsOffset() int
switchStmt
method
#
func (r *reader) switchStmt(label *types.Sym) ir.Node
switchStmt
method
#
func (w *writer) switchStmt(stmt *syntax.SwitchStmt)
syntheticArgs
method
#
syntheticArgs returns the recvs and params arguments passed to the
current function.
func (r *reader) syntheticArgs() ir.Nodes
syntheticBody
method
#
syntheticBody adds a synthetic body to r.curfn if appropriate, and
reports whether it did.
func (r *reader) syntheticBody(pos src.XPos) bool
syntheticClosure
method
#
syntheticClosure constructs a synthetic function literal for
currying dictionary arguments. origPos is the position used for the
closure, which must be a non-inlined position. typ is the function
literal's signature type.
captures is a list of expressions that need to be evaluated at the
point of function literal evaluation and captured by the function
literal. If ifaceHack is true and captures[1] is an interface type,
it's checked to be non-nil after evaluation.
addBody is a callback function to populate the function body. The
list of captured values passed back has the captured variables for
use within the function literal, corresponding to the expressions
in captures.
func (r *reader) syntheticClosure(origPos src.XPos, typ *types.Type, ifaceHack bool, captures ir.Nodes, addBody func(pos src.XPos, r *reader, captured []ir.Node)) ir.Node
syntheticSig
function
#
syntheticSig duplicates and returns the params and results lists
for sig, but renaming anonymous parameters so they can be assigned
ir.Names.
func syntheticSig(sig *types.Type) (params []*types.Field, results []*types.Field)
syntheticTailCall
method
#
syntheticTailCall emits a tail call to fn, passing the given
arguments list.
func (r *reader) syntheticTailCall(pos src.XPos, fn ir.Node, args ir.Nodes)
temp
method
#
temp returns a new autotemp of the specified type.
func (r *reader) temp(pos src.XPos, typ *types.Type) *ir.Name
tempCopy
method
#
tempCopy declares and returns a new autotemp initialized to the
value of expr.
func (r *reader) tempCopy(pos src.XPos, expr ir.Node, init *ir.Nodes) *ir.Name
terminates
method
#
terminates reports whether stmt terminates normal control flow
(i.e., does not merely advance to the following statement).
func (pw *pkgWriter) terminates(stmt syntax.Stmt) bool
trimFilename
function
#
trimFilename returns the "trimmed" filename of b, which is the
absolute filename after applying -trimpath processing. This
filename form is suitable for use in object files and export data.
If b's filename has already been trimmed (i.e., because it was read
in from an imported package's export data), then the filename is
returned unchanged.
func trimFilename(b *syntax.PosBase) string
typ
method
#
typ writes a use of the given type into the bitstream.
func (w *writer) typ(typ types2.Type)
typ
method
#
func (r *reader) typ() *types.Type
typIdx
method
#
typIdx returns the index where the export data description of type
can be read back in. If no such index exists yet, it's created.
typIdx also reports whether typ is a derived type; that is, whether
its identity depends on type parameters.
func (pw *pkgWriter) typIdx(typ types2.Type, dict *writerDict) typeInfo
typIdx
method
#
typIdx returns the specified type. If info specifies a derived
type, it's resolved within the given dictionary. If wrapped is
true, then method wrappers will be generated, if appropriate.
func (pr *pkgReader) typIdx(info typeInfo, dict *readerDict, wrapped bool) *types.Type
typInfo
method
#
func (r *reader) typInfo() typeInfo
typInfo
method
#
typInfo writes a use of the given type (specified as a typeInfo
instead) into the bitstream.
func (w *writer) typInfo(info typeInfo)
typListIdx
method
#
typListIdx returns a list of the specified types, resolving derived
types within the given dictionary.
func (pr *pkgReader) typListIdx(infos []typeInfo, dict *readerDict) []*types.Type
typWrapped
method
#
typWrapped is like typ, but allows suppressing generation of
unnecessary wrappers as a compile-time optimization.
func (r *reader) typWrapped(wrapped bool) *types.Type
typeAndValue
method
#
func (pw *pkgWriter) typeAndValue(x syntax.Expr) syntax.TypeAndValue
typeExprEndPos
function
#
typeExprEndPos returns the position that noder would leave base.Pos
after parsing the given type expression.
Deprecated: This function exists to emulate position semantics from
Go 1.17, necessary for compatibility with the backend DWARF
generation logic that assigns variables to their appropriate scope.
func typeExprEndPos(expr0 syntax.Expr) syntax.Pos
typeExt
method
#
func (w *writer) typeExt(obj *types2.TypeName)
typeExt
method
#
func (r *reader) typeExt(name *ir.Name)
typeOf
method
#
typeOf returns the Type of the given value expression.
func (pw *pkgWriter) typeOf(expr syntax.Expr) types2.Type
typeParamIndex
method
#
typeParamIndex returns the index of the given type parameter within
the dictionary. This may differ from typ.Index() when there are
implicit type parameters due to defined types declared within a
generic function or method.
func (dict *writerDict) typeParamIndex(typ *types2.TypeParam) int
typeParamMethodExprIdx
method
#
typeParamMethodExprIdx returns the index where the given encoded
method expression function pointer appears within this dictionary's
type parameters method expressions section, adding it if necessary.
func (dict *writerDict) typeParamMethodExprIdx(typeParamIdx int, methodInfo selectorInfo) int
typeParamMethodExprsOffset
method
#
typeParamMethodExprsOffset returns the offset of the runtime
dictionary's type parameter method expressions section, in words.
func (dict *readerDict) typeParamMethodExprsOffset() int
typeParamNames
method
#
func (r *reader) typeParamNames()
typeParamNames
method
#
func (w *writer) typeParamNames(tparams *types2.TypeParamList)
typed
function
#
typed returns n after setting its type to typ.
func typed(typ *types.Type, n ir.Node) ir.Node
unexpected
method
#
unexpected reports a fatal error about a thing of unexpected
dynamic type.
func (pw *pkgWriter) unexpected(what string, p poser)
unified
function
#
unified constructs the local package's Internal Representation (IR)
from its syntax tree (AST).
The pipeline contains 2 steps:
1. Generate the export data "stub".
2. Generate the IR from the export data above.
The package data "stub" at step (1) contains everything from the local package,
but nothing that has been imported. When we're actually writing out export data
to the output files (see writeNewExport), we run the "linker", which:
- Updates compiler extensions data (e.g. inlining cost, escape analysis results).
- Handles re-exporting any transitive dependencies.
- Prunes out any unnecessary details (e.g. non-inlineable functions, because any
downstream importers only care about inlinable functions).
The source files are typechecked twice: once before writing the export data
using types2, and again after reading the export data using gc/typecheck.
The duplication of work will go away once we only use the types2 type checker,
removing the gc/typecheck step. For now, it is kept because:
- It reduces the engineering costs in maintaining a fork of typecheck
(e.g. no need to backport fixes like CL 327651).
- It makes it easier to pass toolstash -cmp.
- Historically, we would always re-run the typechecker after importing a package,
even though we know the imported data is valid. It's not ideal, but it's
not causing any problems either.
- gc/typecheck is still in charge of some transformations, such as rewriting
multi-valued function calls or transforming ir.OINDEX to ir.OINDEXMAP.
Using the syntax tree with types2, which has a complete representation of generics,
the unified IR has the full typed AST needed for introspection during step (1).
In other words, we have all the necessary information to build the generic IR form
(see writer.captureVars for an example).
func unified(m posMap, noders []*noder)
unifiedHaveInlineBody
function
#
unifiedHaveInlineBody reports whether we have the function body for
fn, so we can inline it.
func unifiedHaveInlineBody(fn *ir.Func) bool
unifiedInlineCall
function
#
unifiedInlineCall implements inline.NewInline by re-reading the function
body from its Unified IR export data.
func unifiedInlineCall(callerfn *ir.Func, call *ir.CallExpr, fn *ir.Func, inlIndex int) *ir.InlinedCallExpr
unionType
method
#
func (r *reader) unionType() *types.Type
unionType
method
#
func (w *writer) unionType(typ *types2.Union)
useLocal
method
#
func (r *reader) useLocal() *ir.Name
useLocal
method
#
useLocal writes a reference to the given local or free variable
into the bitstream.
func (w *writer) useLocal(pos syntax.Pos, obj *types2.Var)
usedLocals
function
#
usedLocals returns a set of local variables that are used within body.
func usedLocals(body []ir.Node) ir.NameSet
varDictIndex
method
#
varDictIndex populates name.DictIndex if name is a derived type.
func (r *reader) varDictIndex(name *ir.Name)
varDictIndex
method
#
varDictIndex writes out information for populating DictIndex for
the ir.Name that will represent obj.
func (w *writer) varDictIndex(obj *types2.Var)
varExt
method
#
func (w *writer) varExt(obj *types2.Var)
varExt
method
#
func (r *reader) varExt(name *ir.Name)
varType
method
#
varType returns the type of dict's runtime dictionary variable.
func (dict *readerDict) varType() *types.Type
visit
method
#
visit recursively walks typ0 to check any referenced interface types.
func (f *cycleFinder) visit(typ0 types2.Type) bool
withTParams
method
#
func (c *declCollector) withTParams(obj types2.Object) *declCollector
wrapMethodValue
function
#
func wrapMethodValue(recvType *types.Type, method *types.Field, target *ir.Package, needed bool)
wrapType
function
#
func wrapType(typ *types.Type, target *ir.Package, seen map[string]*types.Type, needed bool)
writePkgStub
function
#
writePkgStub type checks the given parsed source files,
writes an export data package stub representing them,
and returns the result.
func writePkgStub(m posMap, noders []*noder) string
writeUnifiedExport
function
#
writeUnifiedExport writes to `out` the finalized, self-contained
Unified IR export data file for the current compilation unit.
func writeUnifiedExport(out io.Writer)