anchor.diff:      final offset =
           await lineInfo.mapResult((lineInfo) => toOffset(lineInfo, pos));
   
  -    return offset.mapResult((offset) {
  -      if (unit.isError) {
  -        return _getItemsFromPluginsOnly(
  -          completionCapabilities,
  -          clientSupportedCompletionKinds,
  -          lineInfo.result,
  -          path.result,
  -          offset,
  -          token,
  -        );
  -      } else {
  -        return _getItems(
  -          completionCapabilities,
  -          clientSupportedCompletionKinds,
  -          includeSuggestionSets,
  -          unit.result,
  -          offset,
  -          token,
  -        );
  -      }
  +    return offset.mapResult((offset) async {
  +      // For server results we need a valid unit, but if we don't have one
  +      // we shouldn't consider this an error when merging with plugin results.
  +      final serverResultsFuture = unit.isError
  +          ? Future.value(success(const <CompletionItem>[]))
  +          : _getServerItems(
  +              completionCapabilities,
  +              clientSupportedCompletionKinds,
  +              includeSuggestionSets,
  +              unit.result,
  +              offset,
  +              token,
  +            );
  +
  +      final pluginResultsFuture = _getPluginResults(completionCapabilities,
  +          clientSupportedCompletionKinds, lineInfo.result, path.result, offset);
  +
  +      // Await both server + plugin results together to allow async/IO to
  +      // overlap.
  +      final serverAndPluginResults =
  +          await Future.wait([serverResultsFuture, pluginResultsFuture]);
  +      final serverResults = serverAndPluginResults[0];
  +      final pluginResults = serverAndPluginResults[1];
  +
  +      if (serverResults.isError) return serverResults;
  +      if (pluginResults.isError) return pluginResults;
  +
  +      return success(
  +        serverResults.result.followedBy(pluginResults.result).toList(),
  +      );
       });
     }
   
  
positive.code:               item,
                completionRequest.replacementOffset,
                completionRequest.replacementLength,
              ),
            )
            .followedBy(
              _pluginResultsToItems(
                completionCapabilities,
                clientSupportedCompletionKinds,
                unit.lineInfo,
                pluginSuggestions,
              ),
            )
            .toList();
  
negative.code:         includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
        );
  
        final serverSuggestions =
            await contributor.computeSuggestions(completionRequest);
  
        if (token.isCancellationRequested) {
          return cancelled();
  