cue: expose some path utilities

1) allow generating a Selector from an ast.Label
2) allow directly querying whether a Selector is a string or not.

Change-Id: I89a99a8a776949de9f31b1b2b0438578018f4860
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/9241
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/path.go b/cue/path.go
index 21f48f0..9a5074d 100644
--- a/cue/path.go
+++ b/cue/path.go
@@ -39,6 +39,11 @@
 	return sel.sel.String()
 }
 
+// IsString reports whether sel is a regular label type.
+func (sel Selector) IsString() bool {
+	return sel.sel.kind() == adt.StringLabel
+}
+
 type selector interface {
 	String() string
 
@@ -116,7 +121,7 @@
 func toSelectors(expr ast.Expr) []Selector {
 	switch x := expr.(type) {
 	case *ast.Ident:
-		return []Selector{identSelector(x)}
+		return []Selector{Label(x)}
 
 	case *ast.BasicLit:
 		return []Selector{basicLitSelector(x)}
@@ -135,7 +140,7 @@
 
 	case *ast.SelectorExpr:
 		a := toSelectors(x.X)
-		return appendSelector(a, identSelector(x.Sel))
+		return appendSelector(a, Label(x.Sel))
 
 	default:
 		return []Selector{{pathError{
@@ -197,7 +202,8 @@
 	}
 }
 
-func identSelector(label ast.Label) Selector {
+// Label converts an AST label to a Selector.
+func Label(label ast.Label) Selector {
 	switch x := label.(type) {
 	case *ast.Ident:
 		switch s := x.Name; {