internal/lsp/source: rename "typeInference" to "candidateInference"

This is in preparation for inferring stuff beyond just the expected
candidate type.

Change-Id: I31be9c1e4c82d82b1ff848858042a5edf46594e3
Reviewed-on: https://go-review.googlesource.com/c/tools/+/215340
Run-TryBot: Muir Manders <muir@mnd.rs>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/internal/lsp/source/completion.go b/internal/lsp/source/completion.go
index 6eb56c9..aad01fe 100644
--- a/internal/lsp/source/completion.go
+++ b/internal/lsp/source/completion.go
@@ -159,9 +159,9 @@
 	// surrounding describes the identifier surrounding the position.
 	surrounding *Selection
 
-	// expectedType contains information about the type we expect the completion
-	// candidate to be. It will be the zero value if no information is available.
-	expectedType typeInference
+	// inference contains information we've inferred about ideal
+	// candidates such as the candidate's type.
+	inference candidateInference
 
 	// enclosingFunc contains information about the function enclosing
 	// the position.
@@ -483,7 +483,7 @@
 		c.setSurrounding(ident)
 	}
 
-	c.expectedType = expectedType(c)
+	c.inference = expectedCandidate(c)
 
 	defer c.sortItems()
 
@@ -635,7 +635,7 @@
 }
 
 func (c *completer) wantTypeName() bool {
-	return c.expectedType.typeName.wantTypeName
+	return c.inference.typeName.wantTypeName
 }
 
 // See https://golang.org/issue/36001. Unimported completions are expensive.
@@ -876,8 +876,8 @@
 		}
 	}
 
-	if c.expectedType.objType != nil {
-		if named, _ := deref(c.expectedType.objType).(*types.Named); named != nil {
+	if c.inference.objType != nil {
+		if named, _ := deref(c.inference.objType).(*types.Named); named != nil {
 			// If we expected a named type, check the type's package for
 			// completion items. This is useful when the current file hasn't
 			// imported the type's package yet.
@@ -956,12 +956,12 @@
 		}
 	}
 
-	if c.expectedType.objType != nil {
+	if c.inference.objType != nil {
 		// If we have an expected type and it is _not_ a named type, see
 		// if an object literal makes a good candidate. For example, if
 		// our expected type is "[]int", this will add a candidate of
 		// "[]int{}".
-		t := deref(c.expectedType.objType)
+		t := deref(c.inference.objType)
 		if _, named := t.(*types.Named); !named {
 			c.literal(t, nil)
 		}
@@ -1244,9 +1244,9 @@
 	kindString
 )
 
-// typeInference holds information we have inferred about a type that can be
+// candidateInference holds information we have inferred about a type that can be
 // used at the current position.
-type typeInference struct {
+type candidateInference struct {
 	// objType is the desired type of an object used at the query position.
 	objType types.Type
 
@@ -1286,9 +1286,9 @@
 	wantComparable bool
 }
 
-// expectedType returns information about the expected type for an expression at
-// the query position.
-func expectedType(c *completer) (inf typeInference) {
+// expectedCandidate returns information about the expected candidate
+// for an expression at the query position.
+func expectedCandidate(c *completer) (inf candidateInference) {
 	inf.typeName = expectTypeName(c)
 
 	if c.enclosingCompositeLiteral != nil {
@@ -1484,8 +1484,8 @@
 
 // applyTypeModifiers applies the list of type modifiers to a type.
 // It returns nil if the modifiers could not be applied.
-func (ti typeInference) applyTypeModifiers(typ types.Type, addressable bool) types.Type {
-	for _, mod := range ti.modifiers {
+func (ci candidateInference) applyTypeModifiers(typ types.Type, addressable bool) types.Type {
+	for _, mod := range ci.modifiers {
 		switch mod.mod {
 		case star:
 			// For every "*" indirection operator, remove a pointer layer
@@ -1517,8 +1517,8 @@
 }
 
 // applyTypeNameModifiers applies the list of type modifiers to a type name.
-func (ti typeInference) applyTypeNameModifiers(typ types.Type) types.Type {
-	for _, mod := range ti.typeName.modifiers {
+func (ci candidateInference) applyTypeNameModifiers(typ types.Type) types.Type {
+	for _, mod := range ci.typeName.modifiers {
 		switch mod.mod {
 		case star:
 			// For every "*" indicator, add a pointer layer to type name.
@@ -1534,8 +1534,9 @@
 
 // matchesVariadic returns true if we are completing a variadic
 // parameter and candType is a compatible slice type.
-func (ti typeInference) matchesVariadic(candType types.Type) bool {
-	return ti.variadic && types.AssignableTo(ti.objType, candType)
+func (ci candidateInference) matchesVariadic(candType types.Type) bool {
+	return ci.variadic && types.AssignableTo(ci.objType, candType)
+
 }
 
 // findSwitchStmt returns an *ast.CaseClause's corresponding *ast.SwitchStmt or
@@ -1707,15 +1708,15 @@
 		if expType == nil {
 			// If we don't expect a specific type, check if we expect a particular
 			// kind of object (map, slice, etc).
-			if c.expectedType.objKind > 0 {
-				return c.expectedType.objKind&candKind(candType) > 0
+			if c.inference.objKind > 0 {
+				return c.inference.objKind&candKind(candType) > 0
 			}
 
 			return false
 		}
 
 		// Take into account any type modifiers on the expected type.
-		candType = c.expectedType.applyTypeModifiers(candType, cand.addressable)
+		candType = c.inference.applyTypeModifiers(candType, cand.addressable)
 		if candType == nil {
 			return false
 		}
@@ -1747,7 +1748,7 @@
 		return types.AssignableTo(candType, expType)
 	}
 
-	if typeMatches(c.expectedType.objType, candType) {
+	if typeMatches(c.inference.objType, candType) {
 		// If obj's type matches, we don't want to expand to an invocation of obj.
 		cand.expandFuncCall = false
 		return true
@@ -1755,7 +1756,7 @@
 
 	// Try using a function's return type as its type.
 	if sig, ok := candType.Underlying().(*types.Signature); ok && sig.Results().Len() == 1 {
-		if typeMatches(c.expectedType.objType, sig.Results().At(0).Type()) {
+		if typeMatches(c.inference.objType, sig.Results().At(0).Type()) {
 			// If obj's return value matches the expected type, we need to invoke obj
 			// in the completion.
 			cand.expandFuncCall = true
@@ -1765,13 +1766,13 @@
 
 	// When completing the variadic parameter, if the expected type is
 	// []T then check candType against T.
-	if c.expectedType.variadic {
-		if slice, ok := c.expectedType.objType.(*types.Slice); ok && typeMatches(slice.Elem(), candType) {
+	if c.inference.variadic {
+		if slice, ok := c.inference.objType.(*types.Slice); ok && typeMatches(slice.Elem(), candType) {
 			return true
 		}
 	}
 
-	if c.expectedType.convertibleTo != nil && types.ConvertibleTo(candType, c.expectedType.convertibleTo) {
+	if c.inference.convertibleTo != nil && types.ConvertibleTo(candType, c.inference.convertibleTo) {
 		return true
 	}
 
@@ -1792,9 +1793,9 @@
 
 	typeMatches := func(candType types.Type) bool {
 		// Take into account any type name modifier prefixes.
-		candType = c.expectedType.applyTypeNameModifiers(candType)
+		candType = c.inference.applyTypeNameModifiers(candType)
 
-		if from := c.expectedType.typeName.assertableFrom; from != nil {
+		if from := c.inference.typeName.assertableFrom; from != nil {
 			// Don't suggest the starting type in type assertions. For example,
 			// if "foo" is an io.Writer, don't suggest "foo.(io.Writer)".
 			if types.Identical(from, candType) {
@@ -1808,7 +1809,7 @@
 			}
 		}
 
-		if c.expectedType.typeName.wantComparable && !types.Comparable(candType) {
+		if c.inference.typeName.wantComparable && !types.Comparable(candType) {
 			return false
 		}
 
@@ -1818,8 +1819,8 @@
 		//   foo = []i<>
 		//
 		// Where our expected type is "[]int", and we expect a type name.
-		if c.expectedType.objType != nil {
-			return types.AssignableTo(candType, c.expectedType.objType)
+		if c.inference.objType != nil {
+			return types.AssignableTo(candType, c.inference.objType)
 		}
 
 		// Default to saying any type name is a match.
diff --git a/internal/lsp/source/completion_format.go b/internal/lsp/source/completion_format.go
index a7a8d6c..36f382c 100644
--- a/internal/lsp/source/completion_format.go
+++ b/internal/lsp/source/completion_format.go
@@ -53,7 +53,7 @@
 		detail = "func" + formatFunction(params, results, writeParens)
 
 		// Add variadic "..." if we are using a function result to fill in a variadic parameter.
-		if sig.Results().Len() == 1 && c.expectedType.matchesVariadic(sig.Results().At(0).Type()) {
+		if sig.Results().Len() == 1 && c.inference.matchesVariadic(sig.Results().At(0).Type()) {
 			snip.WriteText("...")
 		}
 	}
@@ -88,7 +88,7 @@
 		}
 
 		// Add variadic "..." if we are using a variable to fill in a variadic parameter.
-		if c.expectedType.matchesVariadic(obj.Type()) {
+		if c.inference.matchesVariadic(obj.Type()) {
 			snip = &snippet.Builder{}
 			snip.WriteText(insert + "...")
 		}
diff --git a/internal/lsp/source/completion_literal.go b/internal/lsp/source/completion_literal.go
index f7bdc39..0a3a442 100644
--- a/internal/lsp/source/completion_literal.go
+++ b/internal/lsp/source/completion_literal.go
@@ -24,12 +24,12 @@
 		return
 	}
 
-	expType := c.expectedType.objType
+	expType := c.inference.objType
 
-	if c.expectedType.variadic {
+	if c.inference.variadic {
 		// Don't offer literal slice candidates for variadic arguments.
 		// For example, don't offer "[]interface{}{}" in "fmt.Print(<>)".
-		if c.expectedType.matchesVariadic(literalType) {
+		if c.inference.matchesVariadic(literalType) {
 			return
 		}