package gcimporter
import (
)
type pkgReader struct {
pkgbits.PkgDecoder
fake fakeFileSet
ctxt *types.Context
imports map[string]*types.Package
posBases []string
pkgs []*types.Package
typs []types.Type
laterFns []func()
laterFors map[types.Type]int
ifaces []*types.Interface
}
func ( *pkgReader) ( func()) {
.laterFns = append(.laterFns, )
}
type derivedInfo struct {
idx pkgbits.Index
needed bool
}
type typeInfo struct {
idx pkgbits.Index
derived bool
}
func ( *token.FileSet, map[string]*types.Package, []byte, string) ( int, *types.Package, error) {
:= string()
= [:strings.LastIndex(, "\n$$\n")]
:= pkgbits.NewPkgDecoder(, )
= readUnifiedPackage(, nil, , )
return
}
func ( *pkgReader) ( types.Type, func()) {
if .laterFors == nil {
.laterFors = make(map[types.Type]int)
}
.laterFors[] = len(.laterFns)
.laterFns = append(.laterFns, )
}
func ( *token.FileSet, *types.Context, map[string]*types.Package, pkgbits.PkgDecoder) *types.Package {
:= pkgReader{
PkgDecoder: ,
fake: fakeFileSet{
fset: ,
files: make(map[string]*fileInfo),
},
ctxt: ,
imports: ,
posBases: make([]string, .NumElems(pkgbits.RelocPosBase)),
pkgs: make([]*types.Package, .NumElems(pkgbits.RelocPkg)),
typs: make([]types.Type, .NumElems(pkgbits.RelocType)),
}
defer .fake.setLines()
:= .newReader(pkgbits.RelocMeta, pkgbits.PublicRootIdx, pkgbits.SyncPublic)
:= .pkg()
.Bool()
for , := 0, .Len(); < ; ++ {
.Sync(pkgbits.SyncObject)
assert(!.Bool())
.p.objIdx(.Reloc(pkgbits.RelocObj))
assert(.Len() == 0)
}
.Sync(pkgbits.SyncEOF)
for , := range .laterFns {
()
}
for , := range .ifaces {
.Complete()
}
.MarkComplete()
return
}
type reader struct {
pkgbits.Decoder
p *pkgReader
dict *readerDict
}
type readerDict struct {
bounds []typeInfo
tparams []*types.TypeParam
derived []derivedInfo
derivedTypes []types.Type
}
func ( *pkgReader) ( pkgbits.RelocKind, pkgbits.Index, pkgbits.SyncMarker) *reader {
return &reader{
Decoder: .NewDecoder(, , ),
p: ,
}
}
func ( *pkgReader) ( pkgbits.RelocKind, pkgbits.Index, pkgbits.SyncMarker) *reader {
return &reader{
Decoder: .TempDecoder(, , ),
p: ,
}
}
func ( *pkgReader) ( *reader) {
.RetireDecoder(&.Decoder)
}
func ( *reader) () token.Pos {
.Sync(pkgbits.SyncPos)
if !.Bool() {
return token.NoPos
}
:= .posBase()
:= .Uint()
:= .Uint()
return .p.fake.pos(, int(), int())
}
func ( *reader) () string {
return .p.posBaseIdx(.Reloc(pkgbits.RelocPosBase))
}
func ( *pkgReader) ( pkgbits.Index) string {
if := .posBases[]; != "" {
return
}
var string
{
:= .tempReader(pkgbits.RelocPosBase, , pkgbits.SyncPosBase)
= .String()
if .Bool() {
} else {
:= .pos()
:= .Uint()
:= .Uint()
_, _, _ = , ,
}
.retireReader()
}
:=
.posBases[] =
return
}
func ( *reader) () *types.Package {
.Sync(pkgbits.SyncPkg)
return .p.pkgIdx(.Reloc(pkgbits.RelocPkg))
}
func ( *pkgReader) ( pkgbits.Index) *types.Package {
if := .pkgs[]; != nil {
return
}
:= .newReader(pkgbits.RelocPkg, , pkgbits.SyncPkgDef).doPkg()
.pkgs[] =
return
}
func ( *reader) () *types.Package {
:= .String()
switch {
case "":
= .p.PkgPath()
case "builtin":
return nil
case "unsafe":
return types.Unsafe
}
if := .p.imports[]; != nil {
return
}
:= .String()
:= types.NewPackage(, )
.p.imports[] =
:= make([]*types.Package, .Len())
for := range {
[] = .pkg()
}
.SetImports(flattenImports())
return
}
func ( []*types.Package) []*types.Package {
var []*types.Package
:= make(map[*types.Package]struct{})
for , := range {
if , := []; {
continue
}
[] = struct{}{}
= append(, )
for , := range .Imports() {
if , := []; {
continue
}
[] = struct{}{}
= append(, )
}
}
return
}
func ( *reader) () types.Type {
return .p.typIdx(.typInfo(), .dict)
}
func ( *reader) () typeInfo {
.Sync(pkgbits.SyncType)
if .Bool() {
return typeInfo{idx: pkgbits.Index(.Len()), derived: true}
}
return typeInfo{idx: .Reloc(pkgbits.RelocType), derived: false}
}
func ( *pkgReader) ( typeInfo, *readerDict) types.Type {
:= .idx
var *types.Type
if .derived {
= &.derivedTypes[]
= .derived[].idx
} else {
= &.typs[]
}
if := *; != nil {
return
}
var types.Type
{
:= .tempReader(pkgbits.RelocType, , pkgbits.SyncTypeIdx)
.dict =
= .doTyp()
assert( != nil)
.retireReader()
}
if := *; != nil {
return
}
* =
return
}
func ( *reader) () ( types.Type) {
switch := pkgbits.CodeType(.Code(pkgbits.SyncType)); {
default:
errorf("unhandled type tag: %v", )
panic("unreachable")
case pkgbits.TypeBasic:
return types.Typ[.Len()]
case pkgbits.TypeNamed:
, := .obj()
:= .(*types.TypeName)
if len() != 0 {
, := types.Instantiate(.p.ctxt, .Type(), , false)
return
}
return .Type()
case pkgbits.TypeTypeParam:
return .dict.tparams[.Len()]
case pkgbits.TypeArray:
:= int64(.Uint64())
return types.NewArray(.typ(), )
case pkgbits.TypeChan:
:= types.ChanDir(.Len())
return types.NewChan(, .typ())
case pkgbits.TypeMap:
return types.NewMap(.typ(), .typ())
case pkgbits.TypePointer:
return types.NewPointer(.typ())
case pkgbits.TypeSignature:
return .signature(nil, nil, nil)
case pkgbits.TypeSlice:
return types.NewSlice(.typ())
case pkgbits.TypeStruct:
return .structType()
case pkgbits.TypeInterface:
return .interfaceType()
case pkgbits.TypeUnion:
return .unionType()
}
}
func ( *reader) () *types.Struct {
:= make([]*types.Var, .Len())
var []string
for := range {
:= .pos()
, := .selector()
:= .typ()
:= .String()
:= .Bool()
[] = types.NewField(, , , , )
if != "" {
for len() < {
= append(, "")
}
= append(, )
}
}
return types.NewStruct(, )
}
func ( *reader) () *types.Union {
:= make([]*types.Term, .Len())
for := range {
[] = types.NewTerm(.Bool(), .typ())
}
return types.NewUnion()
}
func ( *reader) () *types.Interface {
:= make([]*types.Func, .Len())
:= make([]types.Type, .Len())
:= len() == 0 && len() == 1 && .Bool()
for := range {
:= .pos()
, := .selector()
:= .signature(nil, nil, nil)
[] = types.NewFunc(, , , )
}
for := range {
[] = .typ()
}
:= types.NewInterfaceType(, )
if {
.MarkImplicit()
}
.p.ifaces = append(.p.ifaces, )
return
}
func ( *reader) ( *types.Var, , []*types.TypeParam) *types.Signature {
.Sync(pkgbits.SyncSignature)
:= .params()
:= .params()
:= .Bool()
return types.NewSignatureType(, , , , , )
}
func ( *reader) () *types.Tuple {
.Sync(pkgbits.SyncParams)
:= make([]*types.Var, .Len())
for := range {
[] = .param()
}
return types.NewTuple(...)
}
func ( *reader) () *types.Var {
.Sync(pkgbits.SyncParam)
:= .pos()
, := .localIdent()
:= .typ()
return types.NewParam(, , , )
}
func ( *reader) () (types.Object, []types.Type) {
.Sync(pkgbits.SyncObject)
assert(!.Bool())
, := .p.objIdx(.Reloc(pkgbits.RelocObj))
:= pkgScope().Lookup()
:= make([]types.Type, .Len())
for := range {
[] = .typ()
}
return ,
}
func ( *pkgReader) ( pkgbits.Index) (*types.Package, string) {
var *types.Package
var string
var pkgbits.CodeObj
{
:= .tempReader(pkgbits.RelocName, , pkgbits.SyncObject1)
, = .qualifiedIdent()
assert( != "")
= pkgbits.CodeObj(.Code(pkgbits.SyncCodeObj))
.retireReader()
}
if == pkgbits.ObjStub {
assert( == nil || == types.Unsafe)
return ,
}
if , := splitVargenSuffix(); != "" {
return ,
}
if .Scope().Lookup() == nil {
:= .objDictIdx()
:= .newReader(pkgbits.RelocObj, , pkgbits.SyncObject1)
.dict =
:= func( types.Object) {
.Scope().Insert()
}
switch {
default:
panic("weird")
case pkgbits.ObjAlias:
:= .pos()
:= .typ()
(types.NewTypeName(, , , ))
case pkgbits.ObjConst:
:= .pos()
:= .typ()
:= .Value()
(types.NewConst(, , , , ))
case pkgbits.ObjFunc:
:= .pos()
:= .typeParamNames()
:= .signature(nil, nil, )
(types.NewFunc(, , , ))
case pkgbits.ObjType:
:= .pos()
:= types.NewTypeName(, , , nil)
:= types.NewNamed(, nil, nil)
()
.SetTypeParams(.typeParamNames())
:= func( types.Type) {
if , := .(*types.Interface); && .NumExplicitMethods() != 0 {
:= make([]*types.Func, .NumExplicitMethods())
for := range {
:= .ExplicitMethod()
:= .Type().(*types.Signature)
:= types.NewVar(.Pos(), .Pkg(), "", )
[] = types.NewFunc(.Pos(), .Pkg(), .Name(), types.NewSignature(, .Params(), .Results(), .Variadic()))
}
:= make([]types.Type, .NumEmbeddeds())
for := range {
[] = .EmbeddedType()
}
:= types.NewInterfaceType(, )
.p.ifaces = append(.p.ifaces, )
=
}
.SetUnderlying()
}
:= .typ()
if := .Underlying(); != nil {
()
} else {
:= .p
.laterFor(, func() {
delete(.laterFors, )
if , := .laterFors[]; {
:= .laterFns[]
.laterFns[] = func() {}
()
}
(.Underlying())
})
}
for , := 0, .Len(); < ; ++ {
.AddMethod(.method())
}
case pkgbits.ObjVar:
:= .pos()
:= .typ()
(types.NewVar(, , , ))
}
}
return ,
}
func ( *pkgReader) ( pkgbits.Index) *readerDict {
var readerDict
{
:= .tempReader(pkgbits.RelocObjDict, , pkgbits.SyncObject1)
if := .Len(); != 0 {
errorf("unexpected object with %v implicit type parameter(s)", )
}
.bounds = make([]typeInfo, .Len())
for := range .bounds {
.bounds[] = .typInfo()
}
.derived = make([]derivedInfo, .Len())
.derivedTypes = make([]types.Type, len(.derived))
for := range .derived {
.derived[] = derivedInfo{.Reloc(pkgbits.RelocType), .Bool()}
}
.retireReader()
}
return &
}
func ( *reader) () []*types.TypeParam {
.Sync(pkgbits.SyncTypeParamNames)
if len(.dict.bounds) == 0 {
return nil
}
.dict.tparams = make([]*types.TypeParam, len(.dict.bounds))
for := range .dict.bounds {
:= .pos()
, := .localIdent()
:= types.NewTypeName(, , , nil)
.dict.tparams[] = types.NewTypeParam(, nil)
}
:= make([]types.Type, len(.dict.bounds))
for , := range .dict.bounds {
[] = .p.typIdx(, .dict)
}
:= .dict.tparams
.p.later(func() {
for , := range {
[].SetConstraint()
}
})
return .dict.tparams
}
func ( *reader) () *types.Func {
.Sync(pkgbits.SyncMethod)
:= .pos()
, := .selector()
:= .typeParamNames()
:= .signature(.param(), , nil)
_ = .pos()
return types.NewFunc(, , , )
}
func ( *reader) () (*types.Package, string) { return .ident(pkgbits.SyncSym) }
func ( *reader) () (*types.Package, string) { return .ident(pkgbits.SyncLocalIdent) }
func ( *reader) () (*types.Package, string) { return .ident(pkgbits.SyncSelector) }
func ( *reader) ( pkgbits.SyncMarker) (*types.Package, string) {
.Sync()
return .pkg(), .String()
}
func ( *types.Package) *types.Scope {
if != nil {
return .Scope()
}
return types.Universe
}