cue: get rid of internal index type

Change-Id: I0ce4bb9ab8263a1a8a2774ce3cd1ff9de3bbca46
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/9365
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/build.go b/cue/build.go
index 02ef7a6..61f9f81 100644
--- a/cue/build.go
+++ b/cue/build.go
@@ -31,7 +31,7 @@
 //
 // The zero value of a Runtime is ready to use.
 type Runtime struct {
-	idx *index
+	idx *runtime.Runtime
 }
 
 func init() {
@@ -59,7 +59,7 @@
 
 	internal.CoreValue = func(value interface{}) (runtime, vertex interface{}) {
 		if v, ok := value.(Value); ok && v.v != nil {
-			return v.idx.Runtime, v.v
+			return v.idx, v.v
 		}
 		return nil, nil
 	}
@@ -67,7 +67,7 @@
 
 func dummyLoad(token.Pos, string) *build.Instance { return nil }
 
-func (r *Runtime) index() *index {
+func (r *Runtime) index() *runtime.Runtime {
 	if r.idx == nil {
 		r.idx = newIndex()
 	}
@@ -184,35 +184,22 @@
 	})
 }
 
-// index maps conversions from label names to internal codes.
-//
-// All instances belonging to the same package should share this index.
-type index struct {
-	*runtime.Runtime
-}
-
 // NewRuntime creates a *runtime.Runtime with builtins preloaded.
 func NewRuntime() *runtime.Runtime {
 	i := newIndex()
-	i.Runtime.Data = i
-	return i.Runtime
+	return i
 }
 
 // newIndex creates a new index.
-func newIndex() *index {
-	r := runtime.New()
-	i := &index{
-		Runtime: r,
-	}
-	r.Data = i
-	return i
+func newIndex() *runtime.Runtime {
+	return runtime.New()
 }
 
 func isBuiltin(s string) bool {
 	return runtime.SharedRuntime.IsBuiltinPackage(s)
 }
 
-func loadInstance(idx *index, p *build.Instance) *Instance {
-	v, _ := idx.Runtime.Build(p)
+func loadInstance(idx *runtime.Runtime, p *build.Instance) *Instance {
+	v, _ := idx.Build(p)
 	return getImportFromBuild(idx, p, v)
 }
diff --git a/cue/build_test.go b/cue/build_test.go
index ccaeca8..85de8c8 100644
--- a/cue/build_test.go
+++ b/cue/build_test.go
@@ -200,7 +200,7 @@
 				got = err.Error()
 			} else {
 				cfg := &debug.Config{Compact: true}
-				got = debug.NodeString(insts[0].index.Runtime, insts[0].Value().v, cfg)
+				got = debug.NodeString(insts[0].index, insts[0].Value().v, cfg)
 			}
 			if got != tc.emit {
 				t.Errorf("\n got: %s\nwant: %s", got, tc.emit)
diff --git a/cue/context.go b/cue/context.go
index df444a1..6122fc4 100644
--- a/cue/context.go
+++ b/cue/context.go
@@ -18,14 +18,15 @@
 	"cuelang.org/go/internal/core/adt"
 	"cuelang.org/go/internal/core/debug"
 	"cuelang.org/go/internal/core/eval"
+	"cuelang.org/go/internal/core/runtime"
 )
 
 // newContext returns a new evaluation context.
-func newContext(idx *index) *adt.OpContext {
+func newContext(idx *runtime.Runtime) *adt.OpContext {
 	if idx == nil {
 		return nil
 	}
-	return eval.NewContext(idx.Runtime, nil)
+	return eval.NewContext(idx, nil)
 }
 
 func debugStr(ctx *adt.OpContext, v adt.Node) string {
diff --git a/cue/errors.go b/cue/errors.go
index 94c4b29..f1a8030 100644
--- a/cue/errors.go
+++ b/cue/errors.go
@@ -18,6 +18,7 @@
 	"cuelang.org/go/cue/errors"
 	"cuelang.org/go/cue/token"
 	"cuelang.org/go/internal/core/adt"
+	"cuelang.org/go/internal/core/runtime"
 )
 
 func (v Value) toErr(b *adt.Bottom) (err errors.Error) {
@@ -94,7 +95,7 @@
 	Err:  errors.Newf(token.NoPos, "undefined value"),
 }
 
-func mkErr(idx *index, src adt.Node, args ...interface{}) *adt.Bottom {
+func mkErr(idx *runtime.Runtime, src adt.Node, args ...interface{}) *adt.Bottom {
 	var e *adt.Bottom
 	var code adt.ErrorCode = -1
 outer:
diff --git a/cue/go.go b/cue/go.go
index 1d6717c..c0d5a63 100644
--- a/cue/go.go
+++ b/cue/go.go
@@ -24,7 +24,7 @@
 func init() {
 	internal.FromGoValue = func(runtime, x interface{}, nilIsTop bool) interface{} {
 		r := runtime.(*Runtime)
-		ctx := eval.NewContext(r.index().Runtime, nil)
+		ctx := eval.NewContext(r.index(), nil)
 		v := convert.GoValueToValue(ctx, x, nilIsTop)
 		n := adt.ToVertex(v)
 		return Value{r.idx, n}
@@ -32,7 +32,7 @@
 
 	internal.FromGoType = func(runtime, x interface{}) interface{} {
 		r := runtime.(*Runtime)
-		ctx := eval.NewContext(r.index().Runtime, nil)
+		ctx := eval.NewContext(r.index(), nil)
 		expr, err := convert.GoTypeToExpr(ctx, x)
 		if err != nil {
 			expr = &adt.Bottom{Err: err}
diff --git a/cue/instance.go b/cue/instance.go
index 907e8f5..cae1f9a 100644
--- a/cue/instance.go
+++ b/cue/instance.go
@@ -23,12 +23,13 @@
 	"cuelang.org/go/internal/core/compile"
 	"cuelang.org/go/internal/core/convert"
 	"cuelang.org/go/internal/core/eval"
+	"cuelang.org/go/internal/core/runtime"
 )
 
 // An Instance defines a single configuration based on a collection of
 // underlying CUE files.
 type Instance struct {
-	index *index
+	index *runtime.Runtime
 
 	root *adt.Vertex
 
@@ -45,28 +46,27 @@
 	// complete bool // for cycle detection
 }
 
-func addInst(x *index, p *Instance) *Instance {
+func addInst(x *runtime.Runtime, p *Instance) *Instance {
 	if p.inst == nil {
 		p.inst = &build.Instance{
 			ImportPath: p.ImportPath,
 			PkgName:    p.PkgName,
 		}
 	}
-	// fmt.Println(p.ImportPath, "XXX")
 	x.AddInst(p.ImportPath, p.root, p.inst)
 	x.SetBuildData(p.inst, p)
 	p.index = x
 	return p
 }
 
-func lookupInstance(x *index, p *build.Instance) *Instance {
+func lookupInstance(x *runtime.Runtime, p *build.Instance) *Instance {
 	if x, ok := x.BuildData(p); ok {
 		return x.(*Instance)
 	}
 	return nil
 }
 
-func getImportFromBuild(x *index, p *build.Instance, v *adt.Vertex) *Instance {
+func getImportFromBuild(x *runtime.Runtime, p *build.Instance, v *adt.Vertex) *Instance {
 	inst := lookupInstance(x, p)
 
 	if inst != nil {
@@ -91,7 +91,7 @@
 	return inst
 }
 
-func getImportFromNode(x *index, v *adt.Vertex) *Instance {
+func getImportFromNode(x *runtime.Runtime, v *adt.Vertex) *Instance {
 	p := x.GetInstanceFromNode(v)
 	if p == nil {
 		return nil
@@ -100,7 +100,7 @@
 	return getImportFromBuild(x, p, v)
 }
 
-func getImportFromPath(x *index, id string) *Instance {
+func getImportFromPath(x *runtime.Runtime, id string) *Instance {
 	node, _ := x.LoadImport(id)
 	if node == nil {
 		return nil
@@ -135,7 +135,7 @@
 }
 
 // newInstance creates a new instance. Use Insert to populate the instance.
-func newInstance(x *index, p *build.Instance, v *adt.Vertex) *Instance {
+func newInstance(x *runtime.Runtime, p *build.Instance, v *adt.Vertex) *Instance {
 	// TODO: associate root source with structLit.
 	inst := &Instance{
 		root: v,
@@ -316,7 +316,7 @@
 	p.Complete()
 
 	idx := inst.index
-	r := inst.index.Runtime
+	r := inst.index
 
 	rErr := r.ResolveFiles(p)
 
@@ -411,7 +411,7 @@
 			u.AddConjunct(c)
 		}
 	} else {
-		ctx := eval.NewContext(inst.index.Runtime, nil)
+		ctx := eval.NewContext(inst.index, nil)
 		expr := convert.GoValueToExpr(ctx, true, x)
 		u.AddConjunct(adt.MakeRootConjunct(nil, expr))
 		u.Finalize(ctx)
diff --git a/cue/marshal.go b/cue/marshal.go
index 47e319b..f4f0c6b 100644
--- a/cue/marshal.go
+++ b/cue/marshal.go
@@ -140,7 +140,7 @@
 			return p
 		}
 		// TODO: support exporting instance
-		file, _ := export.Def(r.idx.Runtime, i.inst.ID(), i.root)
+		file, _ := export.Def(r.idx, i.inst.ID(), i.root)
 		imports := []string{}
 		file.VisitImports(func(i *ast.ImportDecl) {
 			for _, spec := range i.Specs {
diff --git a/cue/query.go b/cue/query.go
index d2829b6..a4cec1f 100644
--- a/cue/query.go
+++ b/cue/query.go
@@ -63,7 +63,7 @@
 
 outer:
 	for _, sel := range p.path {
-		f := sel.sel.feature(v.idx.Runtime)
+		f := sel.sel.feature(v.idx)
 		for _, a := range n.Arcs {
 			if a.Label == f {
 				n = a
diff --git a/cue/types.go b/cue/types.go
index e2a5b18..1d1d844 100644
--- a/cue/types.go
+++ b/cue/types.go
@@ -213,7 +213,7 @@
 //
 type Iterator struct {
 	val   Value
-	idx   *index
+	idx   *runtime.Runtime
 	ctx   *adt.OpContext
 	arcs  []field
 	p     int
@@ -551,7 +551,7 @@
 			}
 			a = append(a, label)
 		default:
-			a = append(a, f.SelectorString(v.idx.Runtime))
+			a = append(a, f.SelectorString(v.idx))
 		}
 	}
 	return a
@@ -560,7 +560,7 @@
 // Value holds any value, which may be a Boolean, Error, List, Null, Number,
 // Struct, or String.
 type Value struct {
-	idx *index
+	idx *runtime.Runtime
 	v   *adt.Vertex
 }
 
@@ -575,7 +575,7 @@
 	return makeValue(v.idx, node)
 }
 
-func newVertexRoot(idx *index, ctx *adt.OpContext, x *adt.Vertex) Value {
+func newVertexRoot(idx *runtime.Runtime, ctx *adt.OpContext, x *adt.Vertex) Value {
 	if ctx != nil {
 		// This is indicative of an zero Value. In some cases this is called
 		// with an error value.
@@ -586,7 +586,7 @@
 	return makeValue(idx, x)
 }
 
-func newValueRoot(idx *index, ctx *adt.OpContext, x adt.Expr) Value {
+func newValueRoot(idx *runtime.Runtime, ctx *adt.OpContext, x adt.Expr) Value {
 	if n, ok := x.(*adt.Vertex); ok {
 		return newVertexRoot(idx, ctx, n)
 	}
@@ -629,13 +629,12 @@
 //
 // For internal use only.
 func MakeValue(ctx *adt.OpContext, v adt.Value) Value {
-	runtime := ctx.Impl().(*runtime.Runtime)
-	index := runtime.Data.(*index)
+	index := ctx.Impl().(*runtime.Runtime)
 
 	return newValueRoot(index, newContext(index), v)
 }
 
-func makeValue(idx *index, v *adt.Vertex) Value {
+func makeValue(idx *runtime.Runtime, v *adt.Vertex) Value {
 	if v.Status() == 0 || v.BaseValue == nil {
 		panic(fmt.Sprintf("not properly initialized (state: %v, value: %T)",
 			v.Status(), v.BaseValue))
@@ -969,7 +968,7 @@
 	if o.concrete || o.final {
 		// inst = v.instance()
 		var expr ast.Expr
-		expr, err = p.Value(v.idx.Runtime, pkgID, v.v)
+		expr, err = p.Value(v.idx, pkgID, v.v)
 		if err != nil {
 			return bad(`"cuelang.org/go/internal/core/export".Value`, err)
 		}
@@ -981,7 +980,7 @@
 		}
 		// return expr
 	} else {
-		f, err = p.Def(v.idx.Runtime, pkgID, v.v)
+		f, err = p.Def(v.idx, pkgID, v.v)
 		if err != nil {
 			return bad(`"cuelang.org/go/internal/core/export".Def`, err)
 		}
@@ -1491,10 +1490,10 @@
 			a[i] = Selector{indexSelector(f)}
 
 		case adt.DefinitionLabel, adt.HiddenDefinitionLabel, adt.HiddenLabel:
-			a[i] = Selector{definitionSelector(f.SelectorString(v.idx.Runtime))}
+			a[i] = Selector{definitionSelector(f.SelectorString(v.idx))}
 
 		case adt.StringLabel:
-			a[i] = Selector{stringSelector(f.StringValue(v.idx.Runtime))}
+			a[i] = Selector{stringSelector(f.StringValue(v.idx))}
 		}
 	}
 	return Path{path: a}
@@ -1824,7 +1823,7 @@
 	case state.Flag('+'):
 		_, _ = io.WriteString(state, ctx.Str(v.v))
 	default:
-		n, _ := export.Raw.Expr(v.idx.Runtime, v.instance().ID(), v.v)
+		n, _ := export.Raw.Expr(v.idx, v.instance().ID(), v.v)
 		b, _ := format.Node(n)
 		_, _ = state.Write(b)
 	}
@@ -1852,7 +1851,7 @@
 	return reference(v.idx, ctx, c.Env, c.Expr())
 }
 
-func reference(rt *index, c *adt.OpContext, env *adt.Environment, r adt.Expr) (inst *Instance, path []string) {
+func reference(rt *runtime.Runtime, c *adt.OpContext, env *adt.Environment, r adt.Expr) (inst *Instance, path []string) {
 	ctx := c
 	defer ctx.PopState(ctx.PushState(env, r.Source()))
 
@@ -1900,7 +1899,7 @@
 	return inst, path
 }
 
-func mkPath(ctx *index, a []string, v *adt.Vertex) (inst *Instance, path []string) {
+func mkPath(ctx *runtime.Runtime, a []string, v *adt.Vertex) (inst *Instance, path []string) {
 	if v.Parent == nil {
 		return getImportFromNode(ctx, v), a
 	}
@@ -2390,7 +2389,7 @@
 					a.AddConjunct(adt.MakeRootConjunct(env, n.Val))
 					b.AddConjunct(adt.MakeRootConjunct(env, disjunct.Val))
 
-					ctx := eval.NewContext(v.idx.Runtime, nil)
+					ctx := eval.NewContext(v.idx, nil)
 					ctx.Unify(&a, adt.Finalized)
 					ctx.Unify(&b, adt.Finalized)
 					if allowed(ctx, v.v, &b) != nil {
@@ -2434,7 +2433,7 @@
 		a = append(a, remakeValue(v, env, x.X))
 		// A string selector is quoted.
 		a = append(a, remakeValue(v, env, &adt.String{
-			Str: x.Sel.SelectorString(v.idx.Runtime),
+			Str: x.Sel.SelectorString(v.idx),
 		}))
 		op = SelectorOp
 
diff --git a/internal/core/runtime/runtime.go b/internal/core/runtime/runtime.go
index cc67bce..0f303be 100644
--- a/internal/core/runtime/runtime.go
+++ b/internal/core/runtime/runtime.go
@@ -22,9 +22,6 @@
 type Runtime struct {
 	index *index
 
-	// Data holds the legacy index strut. It is for transitional purposes only.
-	Data interface{}
-
 	loaded map[*build.Instance]interface{}
 }