if r.p.exportVersion < iexportVersionGenerics {
errorf("unexpected type param type")
}
- // Type parameter indices are lazily "allocated".
- // There's no need to export them anymore.
- // TODO change the export format accordingly
- _ = int(r.int64())
name0, sub := parseSubscript(name)
tn := types2.NewTypeName(pos, r.currPkg, name0, nil)
t := (*types2.Checker)(nil).NewTypeParam(tn, nil)
// A typeparam has a name, and has a type bound rather
// than an underlying type.
w.pos(n.Pos())
- w.int64(int64(n.Type().Index()))
w.typ(n.Type().Bound())
break
}
// this types2-to-types1 translation.
return sym.Def.(*ir.Name)
}
- index := int(r.int64())
- t := types.NewTypeParam(sym, index)
+ // The typeparam index is set at the point where the containing type
+ // param list is imported.
+ t := types.NewTypeParam(sym, 0)
// Nname needed to save the pos.
nname := ir.NewDeclNameAt(pos, ir.OTYPE, sym)
sym.Def = nname
ts := make([]*types.Type, n)
for i := range ts {
ts[i] = r.typ()
+ if ts[i].IsTypeParam() {
+ ts[i].SetIndex(i)
+ }
}
return ts
}
fs := make([]*types.Field, n)
for i := range fs {
typ := r.typ()
+ typ.SetIndex(i)
fs[i] = types.NewField(typ.Pos(), typ.Sym(), typ)
}
return fs
return t.Extra.(*Typeparam).index
}
+// SetIndex sets the index of the type param within its param list.
+func (t *Type) SetIndex(i int) {
+ t.wantEtype(TTYPEPARAM)
+ t.Extra.(*Typeparam).index = i
+}
+
// SetBound sets the bound of a typeparam.
func (t *Type) SetBound(bound *Type) {
t.wantEtype(TTYPEPARAM)