internal/lsp: run packages.Load only if imports are added or changed

Previously, we would reload if a user's import list decreased or simply
changed order. This is not necessary. Now, we only re-run if a new import
needs to be loaded.

Updates golang/go#35388

Change-Id: I47874afe773dddb835ac27b18895e7a082950dc7
Reviewed-on: https://go-review.googlesource.com/c/tools/+/209057
Reviewed-by: Heschi Kreinick <heschi@google.com>
diff --git a/internal/lsp/cache/load.go b/internal/lsp/cache/load.go
index 8fe6963..8de495a 100644
--- a/internal/lsp/cache/load.go
+++ b/internal/lsp/cache/load.go
@@ -96,13 +96,17 @@
 	if original.Name.Name != current.Name.Name {
 		return true
 	}
-	// If the package's imports have changed, re-run `go list`.
-	if len(original.Imports) != len(current.Imports) {
+	// If the package's imports have increased, definitely re-run `go list`.
+	if len(original.Imports) < len(current.Imports) {
 		return true
 	}
-	for i, importSpec := range original.Imports {
-		// TODO: Handle the case where the imports have just been re-ordered.
-		if importSpec.Path.Value != current.Imports[i].Path.Value {
+	importSet := make(map[string]struct{})
+	for _, importSpec := range original.Imports {
+		importSet[importSpec.Path.Value] = struct{}{}
+	}
+	// If any of the current imports were not in the original imports.
+	for _, importSpec := range current.Imports {
+		if _, ok := importSet[importSpec.Path.Value]; !ok {
 			return true
 		}
 	}