diff --git a/pkg/analysis_server/analysis_options.yaml b/pkg/analysis_server/analysis_options.yaml
index a72e0f7..4cc8715 100644
--- a/pkg/analysis_server/analysis_options.yaml
+++ b/pkg/analysis_server/analysis_options.yaml
@@ -17,7 +17,6 @@
     file_names: ignore
     hash_and_equals: ignore
     implementation_imports: ignore
-    library_private_types_in_public_api: ignore
     non_constant_identifier_names: ignore
     overridden_fields: ignore
     prefer_function_declarations_over_variables: ignore
diff --git a/pkg/analysis_server/benchmark/integration/input_converter.dart b/pkg/analysis_server/benchmark/integration/input_converter.dart
index aec8d14..fd45405 100644
--- a/pkg/analysis_server/benchmark/integration/input_converter.dart
+++ b/pkg/analysis_server/benchmark/integration/input_converter.dart
@@ -284,7 +284,7 @@
   }
 
   @override
-  _InputSink startChunkedConversion(outSink) {
+  Sink<String> startChunkedConversion(outSink) {
     return _InputSink(this, outSink);
   }
 
diff --git a/pkg/analysis_server/lib/src/analytics/google_analytics_manager.dart b/pkg/analysis_server/lib/src/analytics/google_analytics_manager.dart
index 63ca84b..cf3b4b1 100644
--- a/pkg/analysis_server/lib/src/analytics/google_analytics_manager.dart
+++ b/pkg/analysis_server/lib/src/analytics/google_analytics_manager.dart
@@ -16,14 +16,14 @@
 
   /// Data about the current session, or `null` if the [startUp] method has not
   /// been invoked.
-  _SessionData? sessionData;
+  _SessionData? _sessionData;
 
   /// A map from the id of a request to data about the request.
-  Map<String, _ActiveRequestData> activeRequests = {};
+  final Map<String, _ActiveRequestData> _activeRequests = {};
 
   /// A map from the name of a request to data about all such requests that have
   /// been responded to.
-  Map<String, _RequestData> completedRequests = {};
+  final Map<String, _RequestData> _completedRequests = {};
 
   /// Initialize a newly created analytics manager to report to the [analytics]
   /// service.
@@ -47,7 +47,7 @@
 
   @override
   void shutdown() {
-    final sessionData = this.sessionData;
+    final sessionData = _sessionData;
     if (sessionData == null) {
       return;
     }
@@ -65,7 +65,7 @@
       'plugins': '',
     });
     // Send response data.
-    for (var data in completedRequests.values) {
+    for (var data in _completedRequests.values) {
       analytics.sendEvent('language_server', 'request', parameters: {
         'latency': data.latencyTimes.toAnalyticsString(),
         'name': data.method,
@@ -82,14 +82,14 @@
 
   @override
   void startedRequest({required Request request, required DateTime startTime}) {
-    activeRequests[request.id] = _ActiveRequestData(
+    _activeRequests[request.id] = _ActiveRequestData(
         request.method, request.clientRequestTime, startTime);
   }
 
   @override
   void startedRequestMessage(
       {required RequestMessage request, required DateTime startTime}) {
-    activeRequests[request.id.asString] = _ActiveRequestData(
+    _activeRequests[request.id.asString] = _ActiveRequestData(
         request.method.toString(), request.clientRequestTime, startTime);
   }
 
@@ -100,7 +100,7 @@
       required String clientId,
       required String? clientVersion,
       required String sdkVersion}) {
-    sessionData = _SessionData(
+    _sessionData = _SessionData(
         startTime: time,
         commandLineArguments: arguments.join(' '),
         clientId: clientId,
@@ -111,7 +111,7 @@
   /// Record that the request with the given [id] was responded to at the given
   /// [sendTime].
   void _recordResponseData(String id, DateTime sendTime) {
-    var data = activeRequests.remove(id);
+    var data = _activeRequests.remove(id);
     if (data == null) {
       return;
     }
@@ -120,7 +120,7 @@
     var clientRequestTime = data.clientRequestTime;
     var startTime = data.startTime.millisecondsSinceEpoch;
 
-    var requestData = completedRequests.putIfAbsent(
+    var requestData = _completedRequests.putIfAbsent(
         requestName, () => _RequestData(requestName));
 
     if (clientRequestTime != null) {
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index dc3afe6..bf2d198 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -210,7 +210,7 @@
   ///
   /// This is used when a new build is requested to cancel any in-progress
   /// rebuild and wait for it to terminate before starting the next.
-  final _CancellingTaskQueue currentContextRebuild = _CancellingTaskQueue();
+  final _CancellingTaskQueue _currentContextRebuild = _CancellingTaskQueue();
 
   ContextManagerImpl(
       this.resourceProvider,
@@ -579,7 +579,7 @@
       callbacks.afterContextsCreated();
     }
 
-    return currentContextRebuild.queue(performContextRebuildGuarded);
+    return _currentContextRebuild.queue(performContextRebuildGuarded);
   }
 
   /// Clean up and destroy the context associated with the given folder.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
index 27198de..59cf2cc 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
@@ -32,6 +32,9 @@
       TypeDefinitionParams.jsonHandler;
 
   @override
+  // The private type in the return type is dictated by the signature of the
+  // super-method and the class's super-class.
+  // ignore: library_private_types_in_public_api
   Future<ErrorOr<_LocationsOrLinks>> handle(TypeDefinitionParams params,
       MessageInfo message, CancellationToken token) async {
     if (!isDartDocument(params.textDocument)) {
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
index 7dc3e98..7c4e7ef 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
@@ -843,6 +843,8 @@
 
   /// A table mapping the id's of requests to the functions used to handle the
   /// response to those requests.
+  @visibleForTesting
+  // ignore: library_private_types_in_public_api
   Map<String, _PendingRequest> pendingRequests = <String, _PendingRequest>{};
 
   /// A boolean indicating whether the plugin is compatible with the version of
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index e7df797..9028362 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -30,7 +30,7 @@
   /// The [_VisibilityTracker] tracks the set of elements already added in the
   /// completion list, this object helps prevents suggesting elements that have
   /// been shadowed by local declarations.
-  _VisibilityTracker visibilityTracker = _VisibilityTracker();
+  final _VisibilityTracker _visibilityTracker = _VisibilityTracker();
 
   LocalReferenceContributor(super.request, super.builder);
 
@@ -68,7 +68,7 @@
           try {
             builder.laterReplacesEarlier = false;
             var localVisitor = _LocalVisitor(
-                request, builder, visibilityTracker,
+                request, builder, _visibilityTracker,
                 suggestLocalFields: suggestLocalFields);
             localVisitor.visit(node);
           } finally {
@@ -100,7 +100,7 @@
     if (!isFunctionalArgument) {
       for (var accessor in type.accessors) {
         if (!accessor.isStatic) {
-          if (visibilityTracker._isVisible(accessor.declaration)) {
+          if (_visibilityTracker._isVisible(accessor.declaration)) {
             if (accessor.isGetter) {
               if (opType.includeReturnValueSuggestions) {
                 memberBuilder.addSuggestionForAccessor(
@@ -120,7 +120,7 @@
     }
     for (var method in type.methods) {
       if (!method.isStatic) {
-        if (visibilityTracker._isVisible(method.declaration)) {
+        if (_visibilityTracker._isVisible(method.declaration)) {
           if (!method.returnType.isVoid) {
             if (opType.includeReturnValueSuggestions) {
               memberBuilder.addSuggestionForMethod(
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 021701c..b93535a 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -47,104 +47,6 @@
   CompletionSuggestion build();
 }
 
-/// The implementation of [CompletionSuggestionBuilder] that is based on
-/// [ElementCompletionData] and location specific information.
-class CompletionSuggestionBuilderImpl implements CompletionSuggestionBuilder {
-  final ElementCompletionData element;
-
-  @override
-  final CompletionSuggestionKind kind;
-
-  @override
-  final int relevance;
-
-  final String? completionOverride;
-  final String? libraryUriStr;
-  final bool isNotImported;
-
-  CompletionSuggestionBuilderImpl({
-    required this.element,
-    required this.kind,
-    required this.completionOverride,
-    required this.relevance,
-    required this.libraryUriStr,
-    required this.isNotImported,
-  });
-
-  @override
-  String get completion => completionOverride ?? element.completion;
-
-  /// TODO(scheglov) implement better key for not-yet-imported
-  @override
-  String get key {
-    var key = completion;
-    if (element.element.kind == protocol.ElementKind.CONSTRUCTOR) {
-      key = '$key()';
-    }
-    return key;
-  }
-
-  @override
-  String get textToMatch => completion;
-
-  @override
-  CompletionSuggestion build() {
-    return CompletionSuggestion(
-      kind,
-      relevance,
-      completion,
-      completion.length /*selectionOffset*/,
-      0 /*selectionLength*/,
-      element.isDeprecated,
-      false /*isPotential*/,
-      element: element.element,
-      docSummary: element.documentation?.summary,
-      docComplete: element.documentation?.full,
-      declaringType: element.declaringType,
-      returnType: element.returnType,
-      requiredParameterCount: element.requiredParameterCount,
-      hasNamedParameters: element.hasNamedParameters,
-      parameterNames: element.parameterNames,
-      parameterTypes: element.parameterTypes,
-      defaultArgumentListString: element.defaultArgumentList?.text,
-      defaultArgumentListTextRanges: element.defaultArgumentList?.ranges,
-      libraryUri: libraryUriStr,
-      isNotImported: isNotImported ? true : null,
-    );
-  }
-}
-
-/// Information about an [Element] that does not depend on the location where
-/// this element is suggested. For some often used elements, such as classes,
-/// it might be cached, so created only once.
-class ElementCompletionData {
-  final String completion;
-  final bool isDeprecated;
-  final String? declaringType;
-  final String? returnType;
-  final List<String>? parameterNames;
-  final List<String>? parameterTypes;
-  final int? requiredParameterCount;
-  final bool? hasNamedParameters;
-  CompletionDefaultArgumentList? defaultArgumentList;
-  final _ElementDocumentation? documentation;
-  final protocol.Element element;
-
-  ElementCompletionData({
-    required this.completion,
-    required this.isDeprecated,
-    required this.declaringType,
-    required this.returnType,
-    required this.parameterNames,
-    required this.parameterTypes,
-    required this.requiredParameterCount,
-    required this.hasNamedParameters,
-    required this.defaultArgumentList,
-    required this.documentation,
-    required this.element,
-  });
-}
-
 /// This class provides suggestions based upon the visible instance members in
 /// an interface type.
 class MemberSuggestionBuilder {
@@ -1308,7 +1210,7 @@
       completion = '$prefix.$completion';
     }
 
-    return CompletionSuggestionBuilderImpl(
+    return _CompletionSuggestionBuilderImpl(
       element: elementData,
       kind: kind,
       completionOverride: completion,
@@ -1319,7 +1221,7 @@
   }
 
   /// The non-caching implementation of [_getElementCompletionData].
-  ElementCompletionData? _createElementCompletionData(Element element) {
+  _ElementCompletionData? _createElementCompletionData(Element element) {
     // Do not include operators in suggestions.
     if (element is ExecutableElement && element.isOperator) {
       return null;
@@ -1372,7 +1274,7 @@
           element, requiredParameters, namedParameters);
     }
 
-    return ElementCompletionData(
+    return _ElementCompletionData(
       completion: completion,
       isDeprecated: element.hasOrInheritsDeprecated,
       declaringType: declaringType,
@@ -1417,10 +1319,10 @@
     return null;
   }
 
-  /// Return [ElementCompletionData] for the [element], or `null` if the
+  /// Return [_ElementCompletionData] for the [element], or `null` if the
   /// element cannot be suggested for completion.
-  ElementCompletionData? _getElementCompletionData(Element element) {
-    ElementCompletionData? result;
+  _ElementCompletionData? _getElementCompletionData(Element element) {
+    _ElementCompletionData? result;
 
     var hasCompletionData = element.ifTypeOrNull<HasCompletionData>();
     if (hasCompletionData != null) {
@@ -1545,6 +1447,7 @@
 /// [CompletionSuggestionBuilder] that is based on a [CompletionSuggestion].
 class ValueCompletionSuggestionBuilder implements CompletionSuggestionBuilder {
   final CompletionSuggestion _suggestion;
+
   final String? _textToMatchOverride;
 
   ValueCompletionSuggestionBuilder(
@@ -1573,6 +1476,104 @@
   }
 }
 
+/// The implementation of [CompletionSuggestionBuilder] that is based on
+/// [ElementCompletionData] and location specific information.
+class _CompletionSuggestionBuilderImpl implements CompletionSuggestionBuilder {
+  final _ElementCompletionData element;
+
+  @override
+  final CompletionSuggestionKind kind;
+
+  @override
+  final int relevance;
+
+  final String? completionOverride;
+  final String? libraryUriStr;
+  final bool isNotImported;
+
+  _CompletionSuggestionBuilderImpl({
+    required this.element,
+    required this.kind,
+    required this.completionOverride,
+    required this.relevance,
+    required this.libraryUriStr,
+    required this.isNotImported,
+  });
+
+  @override
+  String get completion => completionOverride ?? element.completion;
+
+  /// TODO(scheglov) implement better key for not-yet-imported
+  @override
+  String get key {
+    var key = completion;
+    if (element.element.kind == protocol.ElementKind.CONSTRUCTOR) {
+      key = '$key()';
+    }
+    return key;
+  }
+
+  @override
+  String get textToMatch => completion;
+
+  @override
+  CompletionSuggestion build() {
+    return CompletionSuggestion(
+      kind,
+      relevance,
+      completion,
+      completion.length /*selectionOffset*/,
+      0 /*selectionLength*/,
+      element.isDeprecated,
+      false /*isPotential*/,
+      element: element.element,
+      docSummary: element.documentation?.summary,
+      docComplete: element.documentation?.full,
+      declaringType: element.declaringType,
+      returnType: element.returnType,
+      requiredParameterCount: element.requiredParameterCount,
+      hasNamedParameters: element.hasNamedParameters,
+      parameterNames: element.parameterNames,
+      parameterTypes: element.parameterTypes,
+      defaultArgumentListString: element.defaultArgumentList?.text,
+      defaultArgumentListTextRanges: element.defaultArgumentList?.ranges,
+      libraryUri: libraryUriStr,
+      isNotImported: isNotImported ? true : null,
+    );
+  }
+}
+
+/// Information about an [Element] that does not depend on the location where
+/// this element is suggested. For some often used elements, such as classes,
+/// it might be cached, so created only once.
+class _ElementCompletionData {
+  final String completion;
+  final bool isDeprecated;
+  final String? declaringType;
+  final String? returnType;
+  final List<String>? parameterNames;
+  final List<String>? parameterTypes;
+  final int? requiredParameterCount;
+  final bool? hasNamedParameters;
+  CompletionDefaultArgumentList? defaultArgumentList;
+  final _ElementDocumentation? documentation;
+  final protocol.Element element;
+
+  _ElementCompletionData({
+    required this.completion,
+    required this.isDeprecated,
+    required this.declaringType,
+    required this.returnType,
+    required this.parameterNames,
+    required this.parameterTypes,
+    required this.requiredParameterCount,
+    required this.hasNamedParameters,
+    required this.defaultArgumentList,
+    required this.documentation,
+    required this.element,
+  });
+}
+
 class _ElementDocumentation {
   final String full;
   final String? summary;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
index 14b09df..a77eb43 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
@@ -25,8 +25,6 @@
   @override
   bool canBeAppliedToFile;
 
-  CreateMethod(this._kind, this.canBeAppliedInBulk, this.canBeAppliedToFile);
-
   /// Initialize a newly created instance that will create either an equals
   /// (operator =) or `hashCode` method based on the existing other half of the
   /// pair.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.dart
index 821cd87..be0d3d3 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.dart
@@ -11,11 +11,11 @@
 
 class ReplaceWithNullAware extends CorrectionProducer {
   /// The kind of correction to be made.
-  final _CorrectionKind correctionKind;
+  final _CorrectionKind _correctionKind;
 
-  ReplaceWithNullAware.inChain() : correctionKind = _CorrectionKind.inChain;
+  ReplaceWithNullAware.inChain() : _correctionKind = _CorrectionKind.inChain;
 
-  ReplaceWithNullAware.single() : correctionKind = _CorrectionKind.single;
+  ReplaceWithNullAware.single() : _correctionKind = _CorrectionKind.single;
 
   @override
   // NNBD makes this obsolete in the "chain" application; for the "single"
@@ -34,9 +34,9 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    if (correctionKind == _CorrectionKind.inChain) {
+    if (_correctionKind == _CorrectionKind.inChain) {
       await _computeInChain(builder);
-    } else if (correctionKind == _CorrectionKind.single) {
+    } else if (_correctionKind == _CorrectionKind.single) {
       await _computeSingle(builder);
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/sort_constructor_first.dart b/pkg/analysis_server/lib/src/services/correction/dart/sort_constructor_first.dart
index f0a7e65..26c80f4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/sort_constructor_first.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/sort_constructor_first.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/utilities/extensions/ast.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -32,7 +33,7 @@
 
     await builder.addDartFileEdit(file, (builder) {
       var deletionRange = range.endEnd(
-        constructor.beginToken.previous!,
+        constructor.firstNonCommentToken.previous!,
         constructor.endToken,
       );
 
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
index 1631742..1180800 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
@@ -34,6 +34,9 @@
       : assert(index >= 0);
 
   @override
+  // The private type of the [data] parameter is dictated by the signature of
+  // the super-method and the class's super-class.
+  // ignore: library_private_types_in_public_api
   void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
     if (data is _TypeArgumentData) {
       _applyToTypeArguments(builder, fix, data);
@@ -45,6 +48,9 @@
   }
 
   @override
+  // The private return type is dictated by the signature of the super-method
+  // and the class's super-class.
+  // ignore: library_private_types_in_public_api
   _Data? validate(DataDrivenFix fix) {
     var node = fix.node;
     var context = TemplateContext.forInvocation(node, fix.utils);
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_fragment_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_fragment_parser.dart
index 3b561ca..e363d14 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_fragment_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_fragment_parser.dart
@@ -22,9 +22,9 @@
   int delta = 0;
 
   /// The tokens being parsed.
-  late List<_Token> tokens;
+  late List<_Token> _tokens;
 
-  /// The index in the [tokens] of the next token to be consumed.
+  /// The index in the [_tokens] of the next token to be consumed.
   int currentIndex = 0;
 
   /// Initialize a newly created parser to report errors to the [errorReporter].
@@ -33,12 +33,12 @@
 
   /// Return the current token, or `null` if the end of the tokens has been
   /// reached.
-  _Token? get currentToken =>
-      currentIndex < tokens.length ? tokens[currentIndex] : null;
+  _Token? get _currentToken =>
+      currentIndex < _tokens.length ? _tokens[currentIndex] : null;
 
   /// Advance to the next token.
   void advance() {
-    if (currentIndex < tokens.length) {
+    if (currentIndex < _tokens.length) {
       currentIndex++;
     }
   }
@@ -56,7 +56,7 @@
       // The error has already been reported.
       return null;
     }
-    tokens = scannedTokens;
+    _tokens = scannedTokens;
     currentIndex = 0;
     var accessors = <Accessor>[];
     var accessor = _parseAccessor();
@@ -64,8 +64,8 @@
       return accessors;
     }
     accessors.add(accessor);
-    while (currentIndex < tokens.length) {
-      var token = currentToken;
+    while (currentIndex < _tokens.length) {
+      var token = _currentToken;
       if (token == null) {
         return accessors;
       }
@@ -98,11 +98,11 @@
       // The error has already been reported.
       return null;
     }
-    tokens = scannedTokens;
+    _tokens = scannedTokens;
     currentIndex = 0;
     var expression = _parseLogicalAndExpression();
-    if (currentIndex < tokens.length) {
-      var token = tokens[currentIndex];
+    if (currentIndex < _tokens.length) {
+      var token = _tokens[currentIndex];
       errorReporter.reportErrorForOffset(TransformSetErrorCode.unexpectedToken,
           token.offset + delta, token.length, [token.kind.displayName]);
       return null;
@@ -128,12 +128,12 @@
       return buffer.toString();
     }
 
-    var token = currentToken;
+    var token = _currentToken;
     if (token == null) {
       var offset = 0;
       var length = 0;
-      if (tokens.isNotEmpty) {
-        var last = tokens.last;
+      if (_tokens.isNotEmpty) {
+        var last = _tokens.last;
         offset = last.offset;
         length = last.length;
       }
@@ -231,10 +231,10 @@
     if (expression == null) {
       return null;
     }
-    if (currentIndex >= tokens.length) {
+    if (currentIndex >= _tokens.length) {
       return expression;
     }
-    var kind = currentToken?.kind;
+    var kind = _currentToken?.kind;
     if (kind == _TokenKind.equal || kind == _TokenKind.notEqual) {
       advance();
       var operator =
@@ -257,11 +257,11 @@
     if (leftOperand == null) {
       return null;
     }
-    if (currentIndex >= tokens.length) {
+    if (currentIndex >= _tokens.length) {
       return leftOperand;
     }
     var expression = leftOperand;
-    var kind = currentToken?.kind;
+    var kind = _currentToken?.kind;
     while (kind == _TokenKind.and) {
       advance();
       var rightOperand = _parseEqualityExpression();
@@ -269,10 +269,10 @@
         return null;
       }
       expression = BinaryExpression(expression, Operator.and, rightOperand);
-      if (currentIndex >= tokens.length) {
+      if (currentIndex >= _tokens.length) {
         return expression;
       }
-      kind = currentToken?.kind;
+      kind = _currentToken?.kind;
     }
     return expression;
   }
@@ -282,7 +282,7 @@
   /// <primaryExpression> ::=
   ///   <identifier> | <string>
   Expression? _parsePrimaryExpression() {
-    var token = currentToken;
+    var token = _currentToken;
     if (token != null) {
       var kind = token.kind;
       if (kind == _TokenKind.identifier) {
@@ -308,8 +308,8 @@
     int offset;
     int length;
     if (token == null) {
-      if (tokens.isNotEmpty) {
-        token = tokens[tokens.length - 1];
+      if (_tokens.isNotEmpty) {
+        token = _tokens[_tokens.length - 1];
         offset = token.offset + delta;
         length = token.length;
       } else {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
index 7b052fa..a916ae6 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
@@ -53,6 +53,9 @@
       : assert(modifications.isNotEmpty);
 
   @override
+  // The private type of the [data] parameter is dictated by the signature of
+  // the super-method and the class's super-class.
+  // ignore: library_private_types_in_public_api
   void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
     var argumentList = data.argumentList;
     var invocation = argumentList.parent;
@@ -229,6 +232,9 @@
   }
 
   @override
+  // The private return type is dictated by the signature of the super-method
+  // and the class's super-class.
+  // ignore: library_private_types_in_public_api
   _Data? validate(DataDrivenFix fix) {
     var node = fix.node;
     var parent = node.parent;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
index c825366..cb0fd92 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
@@ -18,6 +18,9 @@
   Rename({required this.newName});
 
   @override
+  // The private type of the [data] parameter is dictated by the signature of
+  // the super-method and the class's super-class.
+  // ignore: library_private_types_in_public_api
   void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
     var nameNode = data.nameNode;
     if (fix.element.isConstructor) {
@@ -68,6 +71,9 @@
   }
 
   @override
+  // The private return type is dictated by the signature of the super-method
+  // and the class's super-class.
+  // ignore: library_private_types_in_public_api
   _Data? validate(DataDrivenFix fix) {
     var node = fix.node;
     if (node is SimpleIdentifier) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
index 19ca94a..7522efe 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
@@ -23,6 +23,9 @@
   RenameParameter({required this.newName, required this.oldName});
 
   @override
+  // The private type of the [data] parameter is dictated by the signature of
+  // the super-method and the class's super-class.
+  // ignore: library_private_types_in_public_api
   void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
     if (data is _InvocationData) {
       builder.addSimpleReplacement(range.node(data.nameNode), newName);
@@ -62,6 +65,9 @@
   }
 
   @override
+  // The private return type is dictated by the signature of the super-method
+  // and the class's super-class.
+  // ignore: library_private_types_in_public_api
   _Data validate(DataDrivenFix fix) {
     var node = fix.node;
     if (node is SimpleIdentifier) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart
index 961632b..d690c0b 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart
@@ -21,12 +21,18 @@
   ReplacedBy({required this.newElement});
 
   @override
+  // The private type of the [data] parameter is dictated by the signature of
+  // the super-method and the class's super-class.
+  // ignore: library_private_types_in_public_api
   void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
     var referenceRange = data.referenceRange;
     builder.addSimpleReplacement(referenceRange, _referenceTo(newElement));
   }
 
   @override
+  // The private return type is dictated by the signature of the super-method
+  // and the class's super-class.
+  // ignore: library_private_types_in_public_api
   _Data? validate(DataDrivenFix fix) {
     var node = fix.node;
     if (node is SimpleIdentifier) {
diff --git a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
index f3abafa..4a34d27 100644
--- a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
@@ -84,7 +84,7 @@
         hasLibraryDirective = true;
       }
       if (directive is UriBasedDirective) {
-        var priority = getDirectivePriority(directive);
+        var priority = _getDirectivePriority(directive);
         if (priority != null) {
           var offset = directive.offset;
           var end = directive.end;
@@ -274,36 +274,6 @@
     code = beforeDirectives + directivesCode + afterDirectives;
   }
 
-  static _DirectivePriority? getDirectivePriority(UriBasedDirective directive) {
-    var uriContent = directive.uri.stringValue ?? '';
-    if (directive is ImportDirective) {
-      if (uriContent.startsWith('dart:')) {
-        return _DirectivePriority.IMPORT_SDK;
-      } else if (uriContent.startsWith('package:')) {
-        return _DirectivePriority.IMPORT_PKG;
-      } else if (uriContent.contains('://')) {
-        return _DirectivePriority.IMPORT_OTHER;
-      } else {
-        return _DirectivePriority.IMPORT_REL;
-      }
-    }
-    if (directive is ExportDirective) {
-      if (uriContent.startsWith('dart:')) {
-        return _DirectivePriority.EXPORT_SDK;
-      } else if (uriContent.startsWith('package:')) {
-        return _DirectivePriority.EXPORT_PKG;
-      } else if (uriContent.contains('://')) {
-        return _DirectivePriority.EXPORT_OTHER;
-      } else {
-        return _DirectivePriority.EXPORT_REL;
-      }
-    }
-    if (directive is PartDirective) {
-      return _DirectivePriority.PART;
-    }
-    return null;
-  }
-
   /// Return the EOL to use for [code].
   static String getEOL(String code) {
     if (code.contains('\r\n')) {
@@ -386,6 +356,37 @@
     return null;
   }
 
+  static _DirectivePriority? _getDirectivePriority(
+      UriBasedDirective directive) {
+    var uriContent = directive.uri.stringValue ?? '';
+    if (directive is ImportDirective) {
+      if (uriContent.startsWith('dart:')) {
+        return _DirectivePriority.IMPORT_SDK;
+      } else if (uriContent.startsWith('package:')) {
+        return _DirectivePriority.IMPORT_PKG;
+      } else if (uriContent.contains('://')) {
+        return _DirectivePriority.IMPORT_OTHER;
+      } else {
+        return _DirectivePriority.IMPORT_REL;
+      }
+    }
+    if (directive is ExportDirective) {
+      if (uriContent.startsWith('dart:')) {
+        return _DirectivePriority.EXPORT_SDK;
+      } else if (uriContent.startsWith('package:')) {
+        return _DirectivePriority.EXPORT_PKG;
+      } else if (uriContent.contains('://')) {
+        return _DirectivePriority.EXPORT_OTHER;
+      } else {
+        return _DirectivePriority.EXPORT_REL;
+      }
+    }
+    if (directive is PartDirective) {
+      return _DirectivePriority.PART;
+    }
+    return null;
+  }
+
   /// Returns whether this token is a '// ignore:' comment (but not an
   /// '// ignore_for_file:' comment).
   static bool _isIgnoreComment(Token token) =>
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/ast.dart b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
index b92d957..84e8908 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
@@ -7,6 +7,17 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 
+extension AnnotatedNodeExtensions on AnnotatedNode {
+  /// Return the first token in this node that is not a comment.
+  Token get firstNonCommentToken {
+    final metadata = this.metadata;
+    if (metadata.isEmpty) {
+      return firstTokenAfterCommentAndMetadata;
+    }
+    return metadata.beginToken!;
+  }
+}
+
 extension AstNodeExtensions on AstNode {
   /// Return the [IfStatement] associated with `this`.
   IfStatement? get enclosingIfStatement {
diff --git a/pkg/analysis_server/native/cJSON b/pkg/analysis_server/native/cJSON
new file mode 160000
index 0000000..b45f48e
--- /dev/null
+++ b/pkg/analysis_server/native/cJSON
@@ -0,0 +1 @@
+Subproject commit b45f48e600671feade0b6bd65d1c69de7899f2be
diff --git a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
index 1acfef1..3c5a3a8 100644
--- a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
+++ b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
@@ -21,39 +21,6 @@
 
 @reflectiveTest
 class SemanticTokensTest extends AbstractLspAnalysisServerTest {
-  /// Decode tokens according to the LSP spec and pair with relevant file contents.
-  List<_Token> decodeSemanticTokens(String content, SemanticTokens tokens) {
-    final contentLines = content.split('\n').map((line) => '$line\n').toList();
-    final results = <_Token>[];
-
-    var lastLine = 0;
-    var lastColumn = 0;
-    for (var i = 0; i < tokens.data.length; i += 5) {
-      final lineDelta = tokens.data[i];
-      final columnDelta = tokens.data[i + 1];
-      final length = tokens.data[i + 2];
-      final tokenTypeIndex = tokens.data[i + 3];
-      final modifierBitmask = tokens.data[i + 4];
-
-      // Calculate the actual line/col from the deltas.
-      final line = lastLine + lineDelta;
-      final column = lineDelta == 0 ? lastColumn + columnDelta : columnDelta;
-
-      final tokenContent =
-          contentLines[line].substring(column, column + length);
-      results.add(_Token(
-        tokenContent,
-        semanticTokenLegend.typeForIndex(tokenTypeIndex),
-        semanticTokenLegend.modifiersForBitmask(modifierBitmask),
-      ));
-
-      lastLine = line;
-      lastColumn = column;
-    }
-
-    return results;
-  }
-
   Future<void> test_annotation() async {
     final content = '''
     import 'other_file.dart' as other;
@@ -152,7 +119,7 @@
     await openFile(otherFileUri, withoutMarkers(otherContent));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(
       // Only check the first expectedStart.length items since the test code
       // is mostly unrelated to the annotations.
@@ -185,7 +152,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -255,7 +222,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -316,7 +283,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -402,7 +369,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -482,7 +449,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -530,7 +497,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -572,7 +539,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -592,7 +559,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -623,7 +590,7 @@
     configureTestPlugin(notification: pluginResult.toNotification());
 
     final tokens = await getSemanticTokens(pluginAnalyzedFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -664,7 +631,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
 
     // Remove the tokens between the two expected sets.
     decoded.removeRange(expected1.length, decoded.length - expected2.length);
@@ -720,7 +687,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -737,7 +704,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -752,7 +719,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -774,7 +741,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -808,7 +775,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -865,7 +832,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -903,7 +870,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -939,7 +906,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -966,7 +933,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -991,7 +958,7 @@
 
     final tokens =
         await getSemanticTokensRange(mainFileUri, rangeFromMarkers(content));
-    final decoded = decodeSemanticTokens(withoutMarkers(content), tokens);
+    final decoded = _decodeSemanticTokens(withoutMarkers(content), tokens);
     expect(decoded, equals(expected));
   }
 
@@ -1020,7 +987,7 @@
 
     final tokens =
         await getSemanticTokensRange(mainFileUri, rangeFromMarkers(content));
-    final decoded = decodeSemanticTokens(withoutMarkers(content), tokens);
+    final decoded = _decodeSemanticTokens(withoutMarkers(content), tokens);
     expect(decoded, equals(expected));
   }
 
@@ -1050,7 +1017,7 @@
 
     final tokens =
         await getSemanticTokensRange(mainFileUri, rangeFromMarkers(content));
-    final decoded = decodeSemanticTokens(withoutMarkers(content), tokens);
+    final decoded = _decodeSemanticTokens(withoutMarkers(content), tokens);
     expect(decoded, equals(expected));
   }
 
@@ -1122,7 +1089,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -1178,7 +1145,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -1248,7 +1215,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
 
@@ -1292,9 +1259,42 @@
     await openFile(mainFileUri, withoutMarkers(content));
 
     final tokens = await getSemanticTokens(mainFileUri);
-    final decoded = decodeSemanticTokens(content, tokens);
+    final decoded = _decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
+
+  /// Decode tokens according to the LSP spec and pair with relevant file contents.
+  List<_Token> _decodeSemanticTokens(String content, SemanticTokens tokens) {
+    final contentLines = content.split('\n').map((line) => '$line\n').toList();
+    final results = <_Token>[];
+
+    var lastLine = 0;
+    var lastColumn = 0;
+    for (var i = 0; i < tokens.data.length; i += 5) {
+      final lineDelta = tokens.data[i];
+      final columnDelta = tokens.data[i + 1];
+      final length = tokens.data[i + 2];
+      final tokenTypeIndex = tokens.data[i + 3];
+      final modifierBitmask = tokens.data[i + 4];
+
+      // Calculate the actual line/col from the deltas.
+      final line = lastLine + lineDelta;
+      final column = lineDelta == 0 ? lastColumn + columnDelta : columnDelta;
+
+      final tokenContent =
+          contentLines[line].substring(column, column + length);
+      results.add(_Token(
+        tokenContent,
+        semanticTokenLegend.typeForIndex(tokenTypeIndex),
+        semanticTokenLegend.modifiersForBitmask(modifierBitmask),
+      ));
+
+      lastLine = line;
+      lastColumn = column;
+    }
+
+    return results;
+  }
 }
 
 class _Token {
diff --git a/pkg/analysis_server/test/search/abstract_search_domain.dart b/pkg/analysis_server/test/search/abstract_search_domain.dart
index 85ffa59..70b5071 100644
--- a/pkg/analysis_server/test/search/abstract_search_domain.dart
+++ b/pkg/analysis_server/test/search/abstract_search_domain.dart
@@ -12,7 +12,7 @@
 import '../analysis_server_base.dart';
 
 class AbstractSearchDomainTest extends PubPackageAnalysisServerTest {
-  final Map<String, _ResultSet> resultSets = {};
+  final Map<String, _ResultSet> _resultSets = {};
   String? searchId;
   List<SearchResult> results = <SearchResult>[];
   late SearchResult result;
@@ -68,10 +68,10 @@
     if (notification.event == SEARCH_NOTIFICATION_RESULTS) {
       var params = SearchResultsParams.fromNotification(notification);
       var id = params.id;
-      var resultSet = resultSets[id];
+      var resultSet = _resultSets[id];
       if (resultSet == null) {
         resultSet = _ResultSet(id);
-        resultSets[id] = resultSet;
+        _resultSets[id] = resultSet;
       }
       resultSet.results.addAll(params.results);
       resultSet.done = params.isLast;
@@ -85,7 +85,7 @@
   }
 
   Future waitForSearchResults() {
-    var resultSet = resultSets[searchId];
+    var resultSet = _resultSets[searchId];
     if (resultSet != null && resultSet.done) {
       results = resultSet.results;
       return Future.value();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/sort_constructor_first_test.dart b/pkg/analysis_server/test/src/services/correction/fix/sort_constructor_first_test.dart
index c6a9dc9..db02f56 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/sort_constructor_first_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/sort_constructor_first_test.dart
@@ -80,10 +80,6 @@
   @override
   String get lintCode => LintNames.sort_constructors_first;
 
-  @FailingTest(
-    reason: 'The beginToken is the comment, which has no previous token.',
-    issue: 'https://github.com/dart-lang/sdk/issues/48966',
-  )
   Future<void> test_hasComment() async {
     await resolveTestCode('''
 class A {
@@ -101,10 +97,6 @@
 ''');
   }
 
-  @FailingTest(
-    reason: 'The beginToken is the comment, which has no previous token.',
-    issue: 'https://github.com/dart-lang/sdk/issues/48966',
-  )
   Future<void> test_hasComment_hasMetadata_afterComment() async {
     await resolveTestCode('''
 const a = 0;
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart b/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart
index ad666a8..00e636e 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart
@@ -39,7 +39,7 @@
   var options = CompletionMetricsOptions(result);
   var stopwatch = Stopwatch()..start();
   var client = _AnalysisServerClient(Directory(_sdk.sdkPath), targets);
-  CompletionClientMetricsComputer(rootPath, options, client).computeMetrics();
+  _CompletionClientMetricsComputer(rootPath, options, client).computeMetrics();
   stopwatch.stop();
 
   var duration = Duration(milliseconds: stopwatch.elapsedMilliseconds);
@@ -128,95 +128,6 @@
   return validateDir(parser, result.rest[0]);
 }
 
-class CompletionClientMetricsComputer extends CompletionMetricsComputer {
-  final _AnalysisServerClient client;
-
-  final CompletionMetrics targetMetric = CompletionMetrics();
-
-  final metrics = CompletionMetrics();
-
-  CompletionClientMetricsComputer(super.rootPath, super.options, this.client);
-
-  @override
-  Future<void> applyOverlay(
-    AnalysisContext context,
-    String filePath,
-    ExpectedCompletion expectedCompletion,
-  ) async {
-    if (options.overlay != OverlayMode.none) {
-      final overlayContent = CompletionMetricsComputer.getOverlayContent(
-        resolvedUnitResult.content,
-        expectedCompletion,
-        options.overlay,
-        options.prefixLength,
-      );
-
-      provider.setOverlay(
-        filePath,
-        content: overlayContent,
-        modificationStamp: overlayModificationStamp++,
-      );
-      await client.addOverlay(filePath, overlayContent);
-    }
-  }
-
-  @override
-  Future<void> computeMetrics() async {
-    await client.start();
-    await super.computeMetrics();
-    await client.shutdown();
-
-    // A row containing the name, median, p90, and p95 scores in [computer].
-    List<String> m9095Row(PercentileComputer computer) => [
-          computer.name,
-          computer.median.toString(),
-          computer.p90.toString(),
-          computer.p95.toString(),
-        ];
-
-    var table = [
-      ['', 'median', 'p90', 'p95'],
-      m9095Row(metrics.totalPercentileComputer),
-      m9095Row(metrics.requestResponsePercentileComputer),
-      m9095Row(metrics.decodePercentileComputer),
-      m9095Row(metrics.deserializePercentileComputer),
-    ];
-
-    rightJustifyColumns(table, range(1, table[0].length));
-    printTable(table);
-  }
-
-  @override
-  Future<void> computeSuggestionsAndMetrics(
-    ExpectedCompletion expectedCompletion,
-    AnalysisContext context,
-    DocumentationCache documentationCache,
-  ) async {
-    var stopwatch = Stopwatch()..start();
-    var suggestionsData = await client.requestCompletion(
-        expectedCompletion.filePath, expectedCompletion.offset, 1000);
-    stopwatch.stop();
-    var metadata = suggestionsData.metadata;
-
-    metrics.totalPercentileComputer.addValue(stopwatch.elapsedMilliseconds);
-    metrics.requestResponsePercentileComputer
-        .addValue(metadata.requestResponseDuration);
-    metrics.decodePercentileComputer.addValue(metadata.decodeDuration);
-    metrics.deserializePercentileComputer
-        .addValue(metadata.deserializeDuration);
-  }
-
-  @override
-  Future<void> removeOverlay(String filePath) async {
-    if (options.overlay != OverlayMode.none) {
-      await client.removeOverlay(filePath);
-    }
-  }
-
-  @override
-  void setupForResolution(AnalysisContext context) {}
-}
-
 class CompletionMetrics {
   /// A percentile computer which tracks the total time to create and send a
   /// completion request, and receive and decode a completion response, using
@@ -533,6 +444,95 @@
   }
 }
 
+class _CompletionClientMetricsComputer extends CompletionMetricsComputer {
+  final _AnalysisServerClient client;
+
+  final CompletionMetrics targetMetric = CompletionMetrics();
+
+  final metrics = CompletionMetrics();
+
+  _CompletionClientMetricsComputer(super.rootPath, super.options, this.client);
+
+  @override
+  Future<void> applyOverlay(
+    AnalysisContext context,
+    String filePath,
+    ExpectedCompletion expectedCompletion,
+  ) async {
+    if (options.overlay != OverlayMode.none) {
+      final overlayContent = CompletionMetricsComputer.getOverlayContent(
+        resolvedUnitResult.content,
+        expectedCompletion,
+        options.overlay,
+        options.prefixLength,
+      );
+
+      provider.setOverlay(
+        filePath,
+        content: overlayContent,
+        modificationStamp: overlayModificationStamp++,
+      );
+      await client.addOverlay(filePath, overlayContent);
+    }
+  }
+
+  @override
+  Future<void> computeMetrics() async {
+    await client.start();
+    await super.computeMetrics();
+    await client.shutdown();
+
+    // A row containing the name, median, p90, and p95 scores in [computer].
+    List<String> m9095Row(PercentileComputer computer) => [
+          computer.name,
+          computer.median.toString(),
+          computer.p90.toString(),
+          computer.p95.toString(),
+        ];
+
+    var table = [
+      ['', 'median', 'p90', 'p95'],
+      m9095Row(metrics.totalPercentileComputer),
+      m9095Row(metrics.requestResponsePercentileComputer),
+      m9095Row(metrics.decodePercentileComputer),
+      m9095Row(metrics.deserializePercentileComputer),
+    ];
+
+    rightJustifyColumns(table, range(1, table[0].length));
+    printTable(table);
+  }
+
+  @override
+  Future<void> computeSuggestionsAndMetrics(
+    ExpectedCompletion expectedCompletion,
+    AnalysisContext context,
+    DocumentationCache documentationCache,
+  ) async {
+    var stopwatch = Stopwatch()..start();
+    var suggestionsData = await client.requestCompletion(
+        expectedCompletion.filePath, expectedCompletion.offset, 1000);
+    stopwatch.stop();
+    var metadata = suggestionsData.metadata;
+
+    metrics.totalPercentileComputer.addValue(stopwatch.elapsedMilliseconds);
+    metrics.requestResponsePercentileComputer
+        .addValue(metadata.requestResponseDuration);
+    metrics.decodePercentileComputer.addValue(metadata.decodeDuration);
+    metrics.deserializePercentileComputer
+        .addValue(metadata.deserializeDuration);
+  }
+
+  @override
+  Future<void> removeOverlay(String filePath) async {
+    if (options.overlay != OverlayMode.none) {
+      await client.removeOverlay(filePath);
+    }
+  }
+
+  @override
+  void setupForResolution(AnalysisContext context) {}
+}
+
 class _RequestError {
   // This is copied from package:dartdev/src/analysis_server.dart.
 
diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
index 34b7f53..c13b51a 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
@@ -146,7 +146,7 @@
   Map<int, int> tokenDistances = {};
 
   /// A table mapping percentage data names to the percentage data collected.
-  Map<String, _PercentageData> percentageData = {};
+  final Map<String, _PercentageData> _percentageData = {};
 
   /// Initialize a newly created set of relevance data to be empty.
   RelevanceData();
@@ -189,7 +189,7 @@
   /// found. If [wasPositive] is `true` then the data point is a positive data
   /// point.
   void recordPercentage(String name, bool wasPositive) {
-    var data = percentageData.putIfAbsent(name, () => _PercentageData());
+    var data = _percentageData.putIfAbsent(name, () => _PercentageData());
     data.addDataPoint(wasPositive);
   }
 
@@ -1903,7 +1903,7 @@
     sink.writeln();
     _writeCounts(sink, data.simpleCounts);
     sink.writeln();
-    _writePercentageData(sink, data.percentageData);
+    _writePercentageData(sink, data._percentageData);
     sink.writeln();
     _writeSideBySide(sink, [data.byTokenType, data.byElementKind],
         ['Token Types', 'Element Kinds']);
diff --git a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
index a50093b..419ffe5 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
@@ -174,7 +174,7 @@
 /// An object that records the data used to compute the tables.
 class RelevanceData {
   /// A table mapping element kinds and keywords to counts by context.
-  Map<String, Map<_Kind, int>> byKind = {};
+  final Map<String, Map<_Kind, int>> _byKind = {};
 
   /// Initialize a newly created set of relevance data to be empty.
   RelevanceData();
@@ -184,7 +184,7 @@
   RelevanceData.fromJson(String encoded) {
     var map = json.decode(encoded) as Map<String, dynamic>;
     for (var contextEntry in map.entries) {
-      var contextMap = byKind.putIfAbsent(contextEntry.key, () => {});
+      var contextMap = _byKind.putIfAbsent(contextEntry.key, () => {});
       for (var kindEntry
           in (contextEntry.value as Map<String, dynamic>).entries) {
         _Kind kind;
@@ -204,8 +204,8 @@
   /// Add the data from the given relevance [data] to this set of relevance
   /// data.
   void addData(RelevanceData data) {
-    for (var contextEntry in data.byKind.entries) {
-      var contextMap = byKind.putIfAbsent(contextEntry.key, () => {});
+    for (var contextEntry in data._byKind.entries) {
+      var contextMap = _byKind.putIfAbsent(contextEntry.key, () => {});
       for (var kindEntry in contextEntry.value.entries) {
         var kind = kindEntry.key;
         contextMap[kind] = (contextMap[kind] ?? 0) + kindEntry.value;
@@ -216,14 +216,14 @@
   /// Record that an element of the given [kind] was found in the given
   /// [context].
   void recordElementKind(String context, ElementKind kind) {
-    var contextMap = byKind.putIfAbsent(context, () => {});
+    var contextMap = _byKind.putIfAbsent(context, () => {});
     var key = _ElementKind(kind);
     contextMap[key] = (contextMap[key] ?? 0) + 1;
   }
 
   /// Record that the given [keyword] was found in the given [context].
   void recordKeyword(String context, Keyword keyword) {
-    var contextMap = byKind.putIfAbsent(context, () => {});
+    var contextMap = _byKind.putIfAbsent(context, () => {});
     var key = _Keyword(keyword);
     contextMap[key] = (contextMap[key] ?? 0) + 1;
   }
@@ -231,7 +231,7 @@
   /// Convert this data to a JSON encoded format.
   String toJson() {
     var map = <String, Map<String, String>>{};
-    for (var contextEntry in byKind.entries) {
+    for (var contextEntry in _byKind.entries) {
       var kindMap = <String, String>{};
       for (var kindEntry in contextEntry.value.entries) {
         kindMap[kindEntry.key.uniqueKey] = kindEntry.value.toString();
@@ -1525,7 +1525,7 @@
 const defaultElementKindRelevance = {
 ''');
 
-    var byKind = data.byKind;
+    var byKind = data._byKind;
     var entries = byKind.entries.toList()
       ..sort((first, second) => first.key.compareTo(second.key));
     for (var entry in entries) {
@@ -1601,7 +1601,7 @@
 const defaultKeywordRelevance = {
 ''');
 
-    var byKind = data.byKind;
+    var byKind = data._byKind;
     var entries = byKind.entries.toList()
       ..sort((first, second) => first.key.compareTo(second.key));
     for (var entry in entries) {
diff --git a/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart b/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
index 1ea7024..151faef 100644
--- a/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
+++ b/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
@@ -11,13 +11,13 @@
 final GeneratedFile clientTarget = GeneratedFile(
     '../analysis_server_client/lib/src/protocol/protocol_constants.dart',
     (String pkgPath) async {
-  var visitor = CodegenVisitor(readApi(pkgPath));
+  var visitor = _CodegenVisitor(readApi(pkgPath));
   return visitor.collectCode(visitor.visitApi);
 });
 
 final GeneratedFile serverTarget = GeneratedFile(
     'lib/protocol/protocol_constants.dart', (String pkgPath) async {
-  var visitor = CodegenVisitor(readApi(pkgPath));
+  var visitor = _CodegenVisitor(readApi(pkgPath));
   return visitor.collectCode(visitor.visitApi);
 });
 
@@ -53,8 +53,8 @@
 
 /// A visitor that produces Dart code defining constants associated with the
 /// API.
-class CodegenVisitor extends DartCodegenVisitor with CodeGenerator {
-  CodegenVisitor(super.api) {
+class _CodegenVisitor extends DartCodegenVisitor with CodeGenerator {
+  _CodegenVisitor(super.api) {
     codeGeneratorSettings.commentLineLength = 79;
     codeGeneratorSettings.docCommentStartMarker = null;
     codeGeneratorSettings.docCommentLineLeader = '/// ';
diff --git a/tools/VERSION b/tools/VERSION
index 0355602..8edebc2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 143
+PRERELEASE 144
 PRERELEASE_PATCH 0
\ No newline at end of file
