anchor.diff:    ExpectedCompletion.specialCompletionString(
         this._entity, this._completionString, this._kind, this._elementKind);
   
  +  String get completion => _completionString ?? _entity.toString();
  +
  +  protocol.ElementKind get elementKind => _elementKind;
  +
  +  protocol.CompletionSuggestionKind get kind => _kind;
  +
  +  int get offset => _entity.offset;
  +
     SyntacticEntity get syntacticEntity => _entity;
  -
  -  String get completion => _completionString ?? _entity.toString();
  -
  -  int get offset => _entity.offset;
  -
  -  protocol.CompletionSuggestionKind get kind => _kind;
  -
  -  protocol.ElementKind get elementKind => _elementKind;
   
     bool matches(protocol.CompletionSuggestion completionSuggestion) {
       if (completionSuggestion.completion == completion) {
  
positive.code: import 'package:analysis_server/src/services/completion/dart/keyword_contributor.dart';
  import 'package:analyzer/dart/ast/ast.dart';
  import 'package:analyzer/dart/ast/syntactic_entity.dart';
  import 'package:analyzer/dart/ast/visitor.dart';
  
  class CompletionMetricVisitor extends RecursiveAstVisitor {
    // TODO(jwren) implement missing visit* methods
  
    final List<ExpectedCompletion> expectedCompletions;
  
    CompletionMetricVisitor() : expectedCompletions = <ExpectedCompletion>[];
  
    safelyRecordKeywordCompletion(SyntacticEntity entity) {
      safelyRecordEntity(entity, kind: protocol.CompletionSuggestionKind.KEYWORD);
    }
  
    safelyRecordEntity(SyntacticEntity entity,
        {protocol.CompletionSuggestionKind kind,
  
negative.code:     safelyRecordKeywordCompletion(node.keyword);
      safelyRecordKeywordCompletion(node.asKeyword);
      return super.visitImportDirective(node);
    }
  
    @override
    visitInstanceCreationExpression(InstanceCreationExpression node) {
      // Here we explicitly do not record 'new' as we don't suggest it in the
      // completion service.
      // https://dart-review.googlesource.com/c/sdk/+/131020
      var keywordStr = node.keyword?.lexeme;
      if (Keyword.CONST.lexeme == keywordStr) {
        safelyRecordKeywordCompletion(node.keyword);
      }
      return super.visitInstanceCreationExpression(node);
    }
  
    @override
    visitIsExpression(IsExpression node) {
      safelyRecordKeywordCompletion(node.isOperator);
      return super.visitIsExpression(node);
    }
  
    @override
    visitLibraryDirective(LibraryDirective node) {
      safelyRecordKeywordCompletion(node.libraryKeyword);
      return super.visitLibraryDirective(node);
    }
  
    @override
    visitListLiteral(ListLiteral node) {
      safelyRecordKeywordCompletion(node.constKeyword);
      return super.visitListLiteral(node);
    }
  
    @override
    visitMethodDeclaration(MethodDeclaration node) {
      safelyRecordKeywordCompletion(node.externalKeyword);
      safelyRecordKeywordCompletion(node.modifierKeyword);
      safelyRecordKeywordCompletion(node.operatorKeyword);
      safelyRecordKeywordCompletion(node.propertyKeyword);
      return super.visitMethodDeclaration(node);
    }
  
    @override
    visitMixinDeclaration(MixinDeclaration node) {
      safelyRecordKeywordCompletion(node.mixinKeyword);
      return super.visitMixinDeclaration(node);
    }
  
    @override
    visitNativeClause(NativeClause node) {
      safelyRecordKeywordCompletion(node.nativeKeyword);
      return super.visitNativeClause(node);
    }
  
    @override
    visitNativeFunctionBody(NativeFunctionBody node) {
      safelyRecordKeywordCompletion(node.nativeKeyword);
      return super.visitNativeFunctionBody(node);
    }
  
    @override
    visitNullLiteral(NullLiteral node) {
      safelyRecordKeywordCompletion(node.literal);
      return super.visitNullLiteral(node);
    }
  
    @override
    visitOnClause(OnClause node) {
      safelyRecordKeywordCompletion(node.onKeyword);
      return super.visitOnClause(node);
    }
  
    @override
    visitPartDirective(PartDirective node) {
      safelyRecordKeywordCompletion(node.partKeyword);
      return super.visitPartDirective(node);
    }
  
    @override
    visitPartOfDirective(PartOfDirective node) {
      safelyRecordKeywordCompletion(node.partKeyword);
      safelyRecordKeywordCompletion(node.ofKeyword);
      return super.visitPartOfDirective(node);
    }
  
    @override
    visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
      safelyRecordKeywordCompletion(node.thisKeyword);
      return super.visitRedirectingConstructorInvocation(node);
    }
  
    @override
    visitRethrowExpression(RethrowExpression node) {
      safelyRecordKeywordCompletion(node.rethrowKeyword);
      return super.visitRethrowExpression(node);
    }
  
    @override
    visitReturnStatement(ReturnStatement node) {
      safelyRecordKeywordCompletion(node.returnKeyword);
      return super.visitReturnStatement(node);
    }
  
    @override
    visitSetOrMapLiteral(SetOrMapLiteral node) {
      safelyRecordKeywordCompletion(node.constKeyword);
      return super.visitSetOrMapLiteral(node);
    }
  
    @override
    visitShowCombinator(ShowCombinator node) {
      safelyRecordKeywordCompletion(node.keyword);
      return super.visitShowCombinator(node);
    }
  
    @override
    visitSimpleFormalParameter(SimpleFormalParameter node) {
      // 'final', 'const' or 'var'
      safelyRecordKeywordCompletion(node.keyword);
      safelyRecordKeywordCompletion(node.covariantKeyword);
      return super.visitSimpleFormalParameter(node);
    }
  
    @override
  