internal/lsp: add additional error handling for builtin packages

Change-Id: I1a084a47d2f171c6b94bde6fece008cddd547833
Reviewed-on: https://go-review.googlesource.com/c/tools/+/175937
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Cottrell <iancottrell@google.com>
diff --git a/internal/lsp/source/completion_format.go b/internal/lsp/source/completion_format.go
index 046480f..ce6f2f9 100644
--- a/internal/lsp/source/completion_format.go
+++ b/internal/lsp/source/completion_format.go
@@ -110,7 +110,15 @@
 	case *types.Const:
 		item.Kind = ConstantCompletionItem
 	case *types.Builtin:
-		fn := c.view.BuiltinPackage().Scope.Lookup(obj.Name())
+		item.Kind = FunctionCompletionItem
+		builtinPkg := c.view.BuiltinPackage()
+		if builtinPkg == nil || builtinPkg.Scope == nil {
+			break
+		}
+		fn := builtinPkg.Scope.Lookup(obj.Name())
+		if fn == nil {
+			break
+		}
 		decl, ok := fn.Decl.(*ast.FuncDecl)
 		if !ok {
 			break
@@ -119,7 +127,6 @@
 		results, writeResultParens := c.formatFieldList(decl.Type.Results)
 		item.Label, item.Detail = formatFunction(obj.Name(), params, results, writeResultParens)
 		item.Snippet, item.PlaceholderSnippet = c.functionCallSnippets(obj.Name(), params)
-		item.Kind = FunctionCompletionItem
 	case *types.TypeName:
 		if types.IsInterface(obj.Type()) {
 			item.Kind = InterfaceCompletionItem
diff --git a/internal/lsp/source/completion_snippet.go b/internal/lsp/source/completion_snippet.go
index 1f2c153..2ebdbd8 100644
--- a/internal/lsp/source/completion_snippet.go
+++ b/internal/lsp/source/completion_snippet.go
@@ -31,7 +31,7 @@
 		if i >= len(lit.Elts) {
 			return nil, nil
 		}
-		// If the expression is not an identifer, it is not a struct field name.
+		// If the expression is not an identifier, it is not a struct field name.
 		if _, ok := lit.Elts[i].(*ast.Ident); !ok {
 			return nil, nil
 		}