diff --git a/internal/lsp/cache/analysis.go b/internal/lsp/cache/analysis.go
index 9a6478b..a81a0b8 100644
--- a/internal/lsp/cache/analysis.go
+++ b/internal/lsp/cache/analysis.go
@@ -137,7 +137,7 @@
 
 	h := s.view.session.cache.store.Bind(buildActionKey(a, ph), func(ctx context.Context) interface{} {
 		// Analyze dependencies first.
-		results, err := execAll(ctx, fset, deps)
+		results, err := execAll(ctx, deps)
 		if err != nil {
 			return &actionData{
 				err: err,
@@ -174,7 +174,7 @@
 	return fmt.Sprintf("%s@%s", act.analyzer, act.pkg.PkgPath())
 }
 
-func execAll(ctx context.Context, fset *token.FileSet, actions []*actionHandle) (map[*actionHandle]*actionData, error) {
+func execAll(ctx context.Context, actions []*actionHandle) (map[*actionHandle]*actionData, error) {
 	var mu sync.Mutex
 	results := make(map[*actionHandle]*actionData)
 
diff --git a/internal/lsp/cache/errors.go b/internal/lsp/cache/errors.go
index aba5f07..4ea0cf0 100644
--- a/internal/lsp/cache/errors.go
+++ b/internal/lsp/cache/errors.go
@@ -45,7 +45,7 @@
 			spn = parseGoListError(e.Msg)
 
 			// We may not have been able to parse a valid span.
-			if _, err := spanToRange(ctx, pkg, spn); err != nil {
+			if _, err := spanToRange(pkg, spn); err != nil {
 				return &source.Error{
 					URI:     spn.URI(),
 					Message: msg,
@@ -58,7 +58,7 @@
 	case *scanner.Error:
 		msg = e.Msg
 		kind = source.ParseError
-		spn, err = scannerErrorRange(ctx, fset, pkg, e.Pos)
+		spn, err = scannerErrorRange(fset, pkg, e.Pos)
 		if err != nil {
 			event.Error(ctx, "no span for scanner.Error pos", err, tag.Package.Of(pkg.ID()))
 			spn = span.Parse(e.Pos.String())
@@ -71,7 +71,7 @@
 		}
 		msg = e[0].Msg
 		kind = source.ParseError
-		spn, err = scannerErrorRange(ctx, fset, pkg, e[0].Pos)
+		spn, err = scannerErrorRange(fset, pkg, e[0].Pos)
 		if err != nil {
 			event.Error(ctx, "no span for scanner.Error pos", err, tag.Package.Of(pkg.ID()))
 			spn = span.Parse(e[0].Pos.String())
@@ -92,16 +92,16 @@
 		msg = e.Message
 		kind = source.Analysis
 		category = e.Category
-		fixes, err = suggestedFixes(ctx, fset, pkg, e)
+		fixes, err = suggestedFixes(fset, pkg, e)
 		if err != nil {
 			return nil, err
 		}
-		related, err = relatedInformation(ctx, fset, pkg, e)
+		related, err = relatedInformation(fset, pkg, e)
 		if err != nil {
 			return nil, err
 		}
 	}
-	rng, err := spanToRange(ctx, pkg, spn)
+	rng, err := spanToRange(pkg, spn)
 	if err != nil {
 		return nil, err
 	}
@@ -116,7 +116,7 @@
 	}, nil
 }
 
-func suggestedFixes(ctx context.Context, fset *token.FileSet, pkg *pkg, diag *analysis.Diagnostic) ([]source.SuggestedFix, error) {
+func suggestedFixes(fset *token.FileSet, pkg *pkg, diag *analysis.Diagnostic) ([]source.SuggestedFix, error) {
 	var fixes []source.SuggestedFix
 	for _, fix := range diag.SuggestedFixes {
 		edits := make(map[span.URI][]protocol.TextEdit)
@@ -125,7 +125,7 @@
 			if err != nil {
 				return nil, err
 			}
-			rng, err := spanToRange(ctx, pkg, spn)
+			rng, err := spanToRange(pkg, spn)
 			if err != nil {
 				return nil, err
 			}
@@ -142,14 +142,14 @@
 	return fixes, nil
 }
 
-func relatedInformation(ctx context.Context, fset *token.FileSet, pkg *pkg, diag *analysis.Diagnostic) ([]source.RelatedInformation, error) {
+func relatedInformation(fset *token.FileSet, pkg *pkg, diag *analysis.Diagnostic) ([]source.RelatedInformation, error) {
 	var out []source.RelatedInformation
 	for _, related := range diag.Related {
 		spn, err := span.NewRange(fset, related.Pos, related.End).Span()
 		if err != nil {
 			return nil, err
 		}
-		rng, err := spanToRange(ctx, pkg, spn)
+		rng, err := spanToRange(pkg, spn)
 		if err != nil {
 			return nil, err
 		}
@@ -200,7 +200,7 @@
 	}.Span()
 }
 
-func scannerErrorRange(ctx context.Context, fset *token.FileSet, pkg *pkg, posn token.Position) (span.Span, error) {
+func scannerErrorRange(fset *token.FileSet, pkg *pkg, posn token.Position) (span.Span, error) {
 	ph, _, err := source.FindFileInPackage(pkg, span.URIFromPath(posn.Filename))
 	if err != nil {
 		return span.Span{}, err
@@ -219,7 +219,7 @@
 
 // spanToRange converts a span.Span to a protocol.Range,
 // assuming that the span belongs to the package whose diagnostics are being computed.
-func spanToRange(ctx context.Context, pkg *pkg, spn span.Span) (protocol.Range, error) {
+func spanToRange(pkg *pkg, spn span.Span) (protocol.Range, error) {
 	ph, _, err := source.FindFileInPackage(pkg, spn.URI())
 	if err != nil {
 		return protocol.Range{}, err
diff --git a/internal/lsp/cache/load.go b/internal/lsp/cache/load.go
index 7e91753..dab568c 100644
--- a/internal/lsp/cache/load.go
+++ b/internal/lsp/cache/load.go
@@ -114,7 +114,7 @@
 			continue
 		}
 		// Skip test main packages.
-		if isTestMain(ctx, pkg, s.view.gocache) {
+		if isTestMain(pkg, s.view.gocache) {
 			continue
 		}
 		// Set the metadata for this package.
@@ -161,7 +161,7 @@
 	}
 
 	copied := map[packageID]struct{}{
-		id: struct{}{},
+		id: {},
 	}
 	for k, v := range seen {
 		copied[k] = v
@@ -218,7 +218,7 @@
 	return m, nil
 }
 
-func isTestMain(ctx context.Context, pkg *packages.Package, gocache string) bool {
+func isTestMain(pkg *packages.Package, gocache string) bool {
 	// Test mains must have an import path that ends with ".test".
 	if !strings.HasSuffix(pkg.PkgPath, ".test") {
 		return false
diff --git a/internal/lsp/cache/mod.go b/internal/lsp/cache/mod.go
index af4fd8d..1cccaa4 100644
--- a/internal/lsp/cache/mod.go
+++ b/internal/lsp/cache/mod.go
@@ -402,7 +402,7 @@
 				data.missingDeps[req.Mod.Path] = req
 			}
 		}
-		data.parseErrors, data.err = modRequireErrors(ctx, options, data)
+		data.parseErrors, data.err = modRequireErrors(options, data)
 
 		for _, req := range data.missingDeps {
 			if data.unusedDeps[req.Mod.Path] != nil {
@@ -464,7 +464,7 @@
 
 // modRequireErrors extracts the errors that occur on the require directives.
 // It checks for directness issues and unused dependencies.
-func modRequireErrors(ctx context.Context, options source.Options, data *modData) ([]source.Error, error) {
+func modRequireErrors(options source.Options, data *modData) ([]source.Error, error) {
 	var errors []source.Error
 	for dep, req := range data.unusedDeps {
 		if req.Syntax == nil {
@@ -472,7 +472,7 @@
 		}
 		// Handle dependencies that are incorrectly labeled indirect and vice versa.
 		if data.missingDeps[dep] != nil && req.Indirect != data.missingDeps[dep].Indirect {
-			directErr, err := modDirectnessErrors(ctx, options, data, req)
+			directErr, err := modDirectnessErrors(options, data, req)
 			if err != nil {
 				return nil, err
 			}
@@ -484,7 +484,7 @@
 			if err != nil {
 				return nil, err
 			}
-			edits, err := dropDependencyEdits(ctx, options, data, req)
+			edits, err := dropDependencyEdits(options, data, req)
 			if err != nil {
 				return nil, err
 			}
@@ -504,7 +504,7 @@
 }
 
 // modDirectnessErrors extracts errors when a dependency is labeled indirect when it should be direct and vice versa.
-func modDirectnessErrors(ctx context.Context, options source.Options, data *modData, req *modfile.Require) (source.Error, error) {
+func modDirectnessErrors(options source.Options, data *modData, req *modfile.Require) (source.Error, error) {
 	rng, err := rangeFromPositions(data.origfh.Identity().URI, data.origMapper, req.Syntax.Start, req.Syntax.End)
 	if err != nil {
 		return source.Error{}, err
@@ -520,7 +520,7 @@
 				return source.Error{}, err
 			}
 		}
-		edits, err := changeDirectnessEdits(ctx, options, data, req, false)
+		edits, err := changeDirectnessEdits(options, data, req, false)
 		if err != nil {
 			return source.Error{}, err
 		}
@@ -536,7 +536,7 @@
 		}, nil
 	}
 	// If the dependency should be indirect, add the // indirect.
-	edits, err := changeDirectnessEdits(ctx, options, data, req, true)
+	edits, err := changeDirectnessEdits(options, data, req, true)
 	if err != nil {
 		return source.Error{}, err
 	}
@@ -564,7 +564,7 @@
 // 	module t
 //
 // 	go 1.11
-func dropDependencyEdits(ctx context.Context, options source.Options, data *modData, req *modfile.Require) ([]protocol.TextEdit, error) {
+func dropDependencyEdits(options source.Options, data *modData, req *modfile.Require) ([]protocol.TextEdit, error) {
 	if err := data.origParsedFile.DropRequire(req.Mod.Path); err != nil {
 		return nil, err
 	}
@@ -598,7 +598,7 @@
 // 	go 1.11
 //
 // 	require golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee // indirect
-func changeDirectnessEdits(ctx context.Context, options source.Options, data *modData, req *modfile.Require, indirect bool) ([]protocol.TextEdit, error) {
+func changeDirectnessEdits(options source.Options, data *modData, req *modfile.Require, indirect bool) ([]protocol.TextEdit, error) {
 	var newReq []*modfile.Require
 	prevIndirect := false
 	// Change the directness in the matching require statement.
diff --git a/internal/lsp/cache/parse.go b/internal/lsp/cache/parse.go
index 9b52f9e..3c796c9 100644
--- a/internal/lsp/cache/parse.go
+++ b/internal/lsp/cache/parse.go
@@ -307,7 +307,7 @@
 		case *ast.BlockStmt:
 			newSrc = fixMissingCurlies(f, n, parent, tok, src)
 		case *ast.SelectorExpr:
-			newSrc = fixDanglingSelector(f, n, parent, tok, src)
+			newSrc = fixDanglingSelector(n, tok, src)
 		}
 
 		return newSrc == nil
@@ -460,7 +460,7 @@
 // To fix completion at "<>", we insert a real "_" after the "." so the
 // following declaration of "x" can be parsed and type checked
 // normally.
-func fixDanglingSelector(f *ast.File, s *ast.SelectorExpr, parent ast.Node, tok *token.File, src []byte) []byte {
+func fixDanglingSelector(s *ast.SelectorExpr, tok *token.File, src []byte) []byte {
 	if !isPhantomUnderscore(s.Sel, tok, src) {
 		return nil
 	}
diff --git a/internal/lsp/code_action.go b/internal/lsp/code_action.go
index f3dd2c2..75a2cae 100644
--- a/internal/lsp/code_action.go
+++ b/internal/lsp/code_action.go
@@ -111,7 +111,7 @@
 			}
 
 			// Get any actions that might be attributed to missing modules in the go.mod file.
-			actions, err := mod.SuggestedGoFixes(ctx, snapshot, fh, diagnostics)
+			actions, err := mod.SuggestedGoFixes(ctx, snapshot, diagnostics)
 			if err != nil {
 				event.Error(ctx, "quick fixes failed", err, tag.URI.Of(uri))
 			}
diff --git a/internal/lsp/mod/diagnostics.go b/internal/lsp/mod/diagnostics.go
index 16aebe0..d4ad606 100644
--- a/internal/lsp/mod/diagnostics.go
+++ b/internal/lsp/mod/diagnostics.go
@@ -44,7 +44,7 @@
 	}
 
 	reports := map[source.FileIdentity][]source.Diagnostic{
-		realfh.Identity(): []source.Diagnostic{},
+		realfh.Identity(): {},
 	}
 	for _, e := range parseErrors {
 		diag := source.Diagnostic{
@@ -117,7 +117,7 @@
 	return actions
 }
 
-func SuggestedGoFixes(ctx context.Context, snapshot source.Snapshot, gofh source.FileHandle, diags []protocol.Diagnostic) ([]protocol.CodeAction, error) {
+func SuggestedGoFixes(ctx context.Context, snapshot source.Snapshot, diags []protocol.Diagnostic) ([]protocol.CodeAction, error) {
 	// TODO: We will want to support diagnostics for go.mod files even when the -modfile flag is turned off.
 	realURI, tempURI := snapshot.View().ModFiles()
 
diff --git a/internal/lsp/source/completion.go b/internal/lsp/source/completion.go
index 995fd45..7637b3b 100644
--- a/internal/lsp/source/completion.go
+++ b/internal/lsp/source/completion.go
@@ -488,7 +488,7 @@
 		path:                      path,
 		pos:                       pos,
 		seen:                      make(map[types.Object]bool),
-		enclosingFunc:             enclosingFunction(path, rng.Start, pkg.GetTypesInfo()),
+		enclosingFunc:             enclosingFunction(path, pkg.GetTypesInfo()),
 		enclosingCompositeLiteral: enclosingCompositeLiteral(path, rng.Start, pkg.GetTypesInfo()),
 		opts: &completionOptions{
 			matcher:           opts.Matcher,
@@ -953,7 +953,7 @@
 			}
 
 			// Don't use LHS of value spec in RHS.
-			if vs := enclosingValueSpec(c.path, c.pos); vs != nil {
+			if vs := enclosingValueSpec(c.path); vs != nil {
 				for _, ident := range vs.Names {
 					if obj.Pos() == ident.Pos() {
 						continue Names
@@ -1263,7 +1263,7 @@
 
 // enclosingFunction returns the signature and body of the function
 // enclosing the given position.
-func enclosingFunction(path []ast.Node, pos token.Pos, info *types.Info) *funcInfo {
+func enclosingFunction(path []ast.Node, info *types.Info) *funcInfo {
 	for _, node := range path {
 		switch t := node.(type) {
 		case *ast.FuncDecl:
diff --git a/internal/lsp/source/completion_format.go b/internal/lsp/source/completion_format.go
index 00b5ac3..4e3afc8 100644
--- a/internal/lsp/source/completion_format.go
+++ b/internal/lsp/source/completion_format.go
@@ -67,7 +67,7 @@
 			detail = "struct{...}" // for anonymous structs
 		} else if obj.IsField() {
 			var err error
-			detail, err = formatFieldType(c.ctx, c.snapshot, c.pkg, obj, c.qf)
+			detail, err = formatFieldType(c.ctx, c.snapshot, c.pkg, obj)
 			if err != nil {
 				detail = types.TypeString(obj.Type(), c.qf)
 			}
diff --git a/internal/lsp/source/diagnostics.go b/internal/lsp/source/diagnostics.go
index eb6c869..dbf7529 100644
--- a/internal/lsp/source/diagnostics.go
+++ b/internal/lsp/source/diagnostics.go
@@ -210,7 +210,7 @@
 		} else if len(set.typeErrors) > 0 {
 			hasTypeErrors = true
 		}
-		if err := addReports(ctx, snapshot, reports, uri, diags...); err != nil {
+		if err := addReports(snapshot, reports, uri, diags...); err != nil {
 			return false, false, err
 		}
 	}
@@ -302,7 +302,7 @@
 		if onlyDeletions(e.SuggestedFixes) {
 			tags = append(tags, protocol.Unnecessary)
 		}
-		if err := addReports(ctx, snapshot, reports, e.URI, &Diagnostic{
+		if err := addReports(snapshot, reports, e.URI, &Diagnostic{
 			Range:          e.Range,
 			Message:        e.Message,
 			Source:         e.Category,
@@ -329,7 +329,7 @@
 	return nil
 }
 
-func addReports(ctx context.Context, snapshot Snapshot, reports map[FileIdentity][]Diagnostic, uri span.URI, diagnostics ...*Diagnostic) error {
+func addReports(snapshot Snapshot, reports map[FileIdentity][]Diagnostic, uri span.URI, diagnostics ...*Diagnostic) error {
 	if snapshot.View().Ignore(uri) {
 		return nil
 	}
diff --git a/internal/lsp/source/format.go b/internal/lsp/source/format.go
index 643d599..d55ed28 100644
--- a/internal/lsp/source/format.go
+++ b/internal/lsp/source/format.go
@@ -36,7 +36,7 @@
 	// Using format.Node on an AST with errors may result in code being modified.
 	// Attempt to format the source of this file instead.
 	if parseErrors != nil {
-		formatted, err := formatSource(ctx, snapshot, fh)
+		formatted, err := formatSource(ctx, fh)
 		if err != nil {
 			return nil, err
 		}
@@ -56,7 +56,7 @@
 	return computeTextEdits(ctx, snapshot.View(), pgh.File(), m, buf.String())
 }
 
-func formatSource(ctx context.Context, s Snapshot, fh FileHandle) ([]byte, error) {
+func formatSource(ctx context.Context, fh FileHandle) ([]byte, error) {
 	ctx, done := event.StartSpan(ctx, "source.formatSource")
 	defer done()
 
diff --git a/internal/lsp/source/rename.go b/internal/lsp/source/rename.go
index d47a604..6f79e26 100644
--- a/internal/lsp/source/rename.go
+++ b/internal/lsp/source/rename.go
@@ -219,7 +219,7 @@
 
 // docComment returns the doc for an identifier.
 func (r *renamer) docComment(pkg Package, id *ast.Ident) *ast.CommentGroup {
-	_, nodes, _ := pathEnclosingInterval(r.ctx, r.fset, pkg, id.Pos(), id.End())
+	_, nodes, _ := pathEnclosingInterval(r.fset, pkg, id.Pos(), id.End())
 	for _, node := range nodes {
 		switch decl := node.(type) {
 		case *ast.FuncDecl:
@@ -250,7 +250,7 @@
 func (r *renamer) updatePkgName(pkgName *types.PkgName) (*diff.TextEdit, error) {
 	// Modify ImportSpec syntax to add or remove the Name as needed.
 	pkg := r.packages[pkgName.Pkg()]
-	_, path, _ := pathEnclosingInterval(r.ctx, r.fset, pkg, pkgName.Pos(), pkgName.Pos())
+	_, path, _ := pathEnclosingInterval(r.fset, pkg, pkgName.Pos(), pkgName.Pos())
 	if len(path) < 2 {
 		return nil, errors.Errorf("no path enclosing interval for %s", pkgName.Name())
 	}
diff --git a/internal/lsp/source/rename_check.go b/internal/lsp/source/rename_check.go
index 44cc555..8ff2879 100644
--- a/internal/lsp/source/rename_check.go
+++ b/internal/lsp/source/rename_check.go
@@ -7,7 +7,6 @@
 package source
 
 import (
-	"context"
 	"fmt"
 	"go/ast"
 	"go/token"
@@ -193,7 +192,7 @@
 			// Check for super-block conflict.
 			// The name r.to is defined in a superblock.
 			// Is that name referenced from within this block?
-			forEachLexicalRef(r.ctx, pkg, to, func(id *ast.Ident, block *types.Scope) bool {
+			forEachLexicalRef(pkg, to, func(id *ast.Ident, block *types.Scope) bool {
 				_, obj := lexicalLookup(block, from.Name(), id.Pos())
 				if obj == from {
 					// super-block conflict
@@ -211,7 +210,7 @@
 	// Check for sub-block conflict.
 	// Is there an intervening definition of r.to between
 	// the block defining 'from' and some reference to it?
-	forEachLexicalRef(r.ctx, pkg, from, func(id *ast.Ident, block *types.Scope) bool {
+	forEachLexicalRef(pkg, from, func(id *ast.Ident, block *types.Scope) bool {
 		// Find the block that defines the found reference.
 		// It may be an ancestor.
 		fromBlock, _ := lexicalLookup(block, from.Name(), id.Pos())
@@ -283,7 +282,7 @@
 // pkg that is a reference to obj in lexical scope.  block is the
 // lexical block enclosing the reference.  If fn returns false the
 // iteration is terminated and findLexicalRefs returns false.
-func forEachLexicalRef(ctx context.Context, pkg Package, obj types.Object, fn func(id *ast.Ident, block *types.Scope) bool) bool {
+func forEachLexicalRef(pkg Package, obj types.Object, fn func(id *ast.Ident, block *types.Scope) bool) bool {
 	ok := true
 	var stack []ast.Node
 
@@ -386,7 +385,7 @@
 	// go/types offers no easy way to get from a field (or interface
 	// method) to its declaring struct (or interface), so we must
 	// ascend the AST.
-	pkg, path, _ := pathEnclosingInterval(r.ctx, r.fset, r.packages[from.Pkg()], from.Pos(), from.Pos())
+	pkg, path, _ := pathEnclosingInterval(r.fset, r.packages[from.Pkg()], from.Pos(), from.Pos())
 	if pkg == nil || path == nil {
 		return
 	}
@@ -842,7 +841,7 @@
 //
 // The zero value is returned if not found.
 //
-func pathEnclosingInterval(ctx context.Context, fset *token.FileSet, pkg Package, start, end token.Pos) (resPkg Package, path []ast.Node, exact bool) {
+func pathEnclosingInterval(fset *token.FileSet, pkg Package, start, end token.Pos) (resPkg Package, path []ast.Node, exact bool) {
 	var pkgs = []Package{pkg}
 	for _, f := range pkg.GetSyntax() {
 		for _, imp := range f.Imports {
diff --git a/internal/lsp/source/symbols.go b/internal/lsp/source/symbols.go
index dff505d..1a1624d 100644
--- a/internal/lsp/source/symbols.go
+++ b/internal/lsp/source/symbols.go
@@ -36,7 +36,7 @@
 		switch decl := decl.(type) {
 		case *ast.FuncDecl:
 			if obj := info.ObjectOf(decl.Name); obj != nil {
-				fs, err := funcSymbol(ctx, snapshot.View(), pkg, decl, obj, q)
+				fs, err := funcSymbol(snapshot.View(), pkg, decl, obj, q)
 				if err != nil {
 					return nil, err
 				}
@@ -52,7 +52,7 @@
 				switch spec := spec.(type) {
 				case *ast.TypeSpec:
 					if obj := info.ObjectOf(spec.Name); obj != nil {
-						ts, err := typeSymbol(ctx, snapshot.View(), pkg, info, spec, obj, q)
+						ts, err := typeSymbol(snapshot.View(), pkg, info, spec, obj, q)
 						if err != nil {
 							return nil, err
 						}
@@ -62,7 +62,7 @@
 				case *ast.ValueSpec:
 					for _, name := range spec.Names {
 						if obj := info.ObjectOf(name); obj != nil {
-							vs, err := varSymbol(ctx, snapshot.View(), pkg, decl, name, obj, q)
+							vs, err := varSymbol(snapshot.View(), pkg, decl, name, obj, q)
 							if err != nil {
 								return nil, err
 							}
@@ -76,7 +76,7 @@
 	return symbols, nil
 }
 
-func funcSymbol(ctx context.Context, view View, pkg Package, decl *ast.FuncDecl, obj types.Object, q types.Qualifier) (protocol.DocumentSymbol, error) {
+func funcSymbol(view View, pkg Package, decl *ast.FuncDecl, obj types.Object, q types.Qualifier) (protocol.DocumentSymbol, error) {
 	s := protocol.DocumentSymbol{
 		Name: obj.Name(),
 		Kind: protocol.Function,
@@ -112,7 +112,7 @@
 	return s, nil
 }
 
-func typeSymbol(ctx context.Context, view View, pkg Package, info *types.Info, spec *ast.TypeSpec, obj types.Object, q types.Qualifier) (protocol.DocumentSymbol, error) {
+func typeSymbol(view View, pkg Package, info *types.Info, spec *ast.TypeSpec, obj types.Object, q types.Qualifier) (protocol.DocumentSymbol, error) {
 	s := protocol.DocumentSymbol{
 		Name: obj.Name(),
 	}
@@ -238,7 +238,7 @@
 	return nil, nil
 }
 
-func varSymbol(ctx context.Context, view View, pkg Package, decl ast.Node, name *ast.Ident, obj types.Object, q types.Qualifier) (protocol.DocumentSymbol, error) {
+func varSymbol(view View, pkg Package, decl ast.Node, name *ast.Ident, obj types.Object, q types.Qualifier) (protocol.DocumentSymbol, error) {
 	s := protocol.DocumentSymbol{
 		Name: obj.Name(),
 		Kind: protocol.Variable,
diff --git a/internal/lsp/source/util.go b/internal/lsp/source/util.go
index 407169c..16fa1be 100644
--- a/internal/lsp/source/util.go
+++ b/internal/lsp/source/util.go
@@ -458,7 +458,7 @@
 	return nil
 }
 
-func enclosingValueSpec(path []ast.Node, pos token.Pos) *ast.ValueSpec {
+func enclosingValueSpec(path []ast.Node) *ast.ValueSpec {
 	for _, n := range path {
 		if vs, ok := n.(*ast.ValueSpec); ok {
 			return vs
@@ -504,7 +504,7 @@
 	params := make([]string, 0, sig.Params().Len())
 	for i := 0; i < sig.Params().Len(); i++ {
 		el := sig.Params().At(i)
-		typ, err := formatFieldType(ctx, s, pkg, el, qf)
+		typ, err := formatFieldType(ctx, s, pkg, el)
 		if err != nil {
 			typ = types.TypeString(el.Type(), qf)
 		}
@@ -523,7 +523,7 @@
 	return params
 }
 
-func formatFieldType(ctx context.Context, s Snapshot, srcpkg Package, obj types.Object, qf types.Qualifier) (string, error) {
+func formatFieldType(ctx context.Context, s Snapshot, srcpkg Package, obj types.Object) (string, error) {
 	file, pkg, err := findPosInPackage(s.View(), srcpkg, obj.Pos())
 	if err != nil {
 		return "", err
diff --git a/internal/lsp/tests/tests.go b/internal/lsp/tests/tests.go
index efdff59..c4c4834 100644
--- a/internal/lsp/tests/tests.go
+++ b/internal/lsp/tests/tests.go
@@ -1215,7 +1215,7 @@
 	folders := []string{}
 	root = filepath.FromSlash(root)
 	// Get all test directories that are one level deeper than root.
-	if err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
+	if err := filepath.Walk(root, func(path string, info os.FileInfo, _ error) error {
 		if !info.IsDir() {
 			return nil
 		}
diff --git a/internal/lsp/tests/util.go b/internal/lsp/tests/util.go
index 924fbd5..d6864d3 100644
--- a/internal/lsp/tests/util.go
+++ b/internal/lsp/tests/util.go
@@ -66,18 +66,18 @@
 	sort.Slice(want, func(i, j int) bool { return want[i].Name < want[j].Name })
 	sort.Slice(got, func(i, j int) bool { return got[i].Name < got[j].Name })
 	if len(got) != len(want) {
-		return summarizeSymbols(t, -1, want, got, "different lengths got %v want %v", len(got), len(want))
+		return summarizeSymbols(-1, want, got, "different lengths got %v want %v", len(got), len(want))
 	}
 	for i, w := range want {
 		g := got[i]
 		if w.Name != g.Name {
-			return summarizeSymbols(t, i, want, got, "incorrect name got %v want %v", g.Name, w.Name)
+			return summarizeSymbols(i, want, got, "incorrect name got %v want %v", g.Name, w.Name)
 		}
 		if w.Kind != g.Kind {
-			return summarizeSymbols(t, i, want, got, "incorrect kind got %v want %v", g.Kind, w.Kind)
+			return summarizeSymbols(i, want, got, "incorrect kind got %v want %v", g.Kind, w.Kind)
 		}
 		if protocol.CompareRange(w.SelectionRange, g.SelectionRange) != 0 {
-			return summarizeSymbols(t, i, want, got, "incorrect span got %v want %v", g.SelectionRange, w.SelectionRange)
+			return summarizeSymbols(i, want, got, "incorrect span got %v want %v", g.SelectionRange, w.SelectionRange)
 		}
 		if msg := DiffSymbols(t, uri, w.Children, g.Children); msg != "" {
 			return fmt.Sprintf("children of %s: %s", w.Name, msg)
@@ -86,7 +86,7 @@
 	return ""
 }
 
-func summarizeSymbols(t *testing.T, i int, want, got []protocol.DocumentSymbol, reason string, args ...interface{}) string {
+func summarizeSymbols(i int, want, got []protocol.DocumentSymbol, reason string, args ...interface{}) string {
 	msg := &bytes.Buffer{}
 	fmt.Fprint(msg, "document symbols failed")
 	if i >= 0 {
