Version 2.12.0-124.0.dev

Merge commit 'ce74d6e4ed13562f7da754020cdd4bfdec7be1d1' into 'dev'
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
index 79cd384..346847c 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
@@ -1,13 +1,10 @@
-// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
 // This file has been automatically generated. Please do not edit it manually.
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
-//
-// TODO(brianwilkerson) This file is not being generated as advertised, but it
-//  should be generated. Fix the generator to generate this file.
 
 import 'dart:convert' hide JsonDecoder;
 
@@ -96,6 +93,8 @@
 ///   "message": String
 ///   "correction": optional String
 ///   "code": String
+///   "url": optional String
+///   "contextMessages": optional List<DiagnosticMessage>
 ///   "hasFix": optional bool
 /// }
 ///
@@ -113,6 +112,10 @@
 
   String _code;
 
+  String _url;
+
+  List<DiagnosticMessage> _contextMessages;
+
   bool _hasFix;
 
   /// The severity of the error.
@@ -174,37 +177,62 @@
     _code = value;
   }
 
-  /// A hint to indicate to interested clients that this error has an associated
-  /// fix (or fixes). The absence of this field implies there are not known to
-  /// be fixes. Note that since the operation to calculate whether fixes apply
-  /// needs to be performant it is possible that complicated tests will be
-  /// skipped and a false negative returned. For this reason, this attribute
-  /// should be treated as a "hint". Despite the possibility of false negatives,
-  /// no false positives should be returned. If a client sees this flag set they
-  /// can proceed with the confidence that there are in fact associated fixes.
+  /// The URL of a page containing documentation associated with this error.
+  String get url => _url;
+
+  /// The URL of a page containing documentation associated with this error.
+  set url(String value) {
+    _url = value;
+  }
+
+  /// Additional messages associated with this diagnostic that provide context
+  /// to help the user understand the diagnostic.
+  List<DiagnosticMessage> get contextMessages => _contextMessages;
+
+  /// Additional messages associated with this diagnostic that provide context
+  /// to help the user understand the diagnostic.
+  set contextMessages(List<DiagnosticMessage> value) {
+    _contextMessages = value;
+  }
+
+  /// A hint to indicate to interested clients that this error has an
+  /// associated fix (or fixes). The absence of this field implies there are
+  /// not known to be fixes. Note that since the operation to calculate whether
+  /// fixes apply needs to be performant it is possible that complicated tests
+  /// will be skipped and a false negative returned. For this reason, this
+  /// attribute should be treated as a "hint". Despite the possibility of false
+  /// negatives, no false positives should be returned. If a client sees this
+  /// flag set they can proceed with the confidence that there are in fact
+  /// associated fixes.
   bool get hasFix => _hasFix;
 
-  /// A hint to indicate to interested clients that this error has an associated
-  /// fix (or fixes). The absence of this field implies there are not known to
-  /// be fixes. Note that since the operation to calculate whether fixes apply
-  /// needs to be performant it is possible that complicated tests will be
-  /// skipped and a false negative returned. For this reason, this attribute
-  /// should be treated as a "hint". Despite the possibility of false negatives,
-  /// no false positives should be returned. If a client sees this flag set they
-  /// can proceed with the confidence that there are in fact associated fixes.
+  /// A hint to indicate to interested clients that this error has an
+  /// associated fix (or fixes). The absence of this field implies there are
+  /// not known to be fixes. Note that since the operation to calculate whether
+  /// fixes apply needs to be performant it is possible that complicated tests
+  /// will be skipped and a false negative returned. For this reason, this
+  /// attribute should be treated as a "hint". Despite the possibility of false
+  /// negatives, no false positives should be returned. If a client sees this
+  /// flag set they can proceed with the confidence that there are in fact
+  /// associated fixes.
   set hasFix(bool value) {
     _hasFix = value;
   }
 
   AnalysisError(AnalysisErrorSeverity severity, AnalysisErrorType type,
       Location location, String message, String code,
-      {String correction, bool hasFix}) {
+      {String correction,
+      String url,
+      List<DiagnosticMessage> contextMessages,
+      bool hasFix}) {
     this.severity = severity;
     this.type = type;
     this.location = location;
     this.message = message;
     this.correction = correction;
     this.code = code;
+    this.url = url;
+    this.contextMessages = contextMessages;
     this.hasFix = hasFix;
   }
 
@@ -251,12 +279,27 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'code');
       }
+      String url;
+      if (json.containsKey('url')) {
+        url = jsonDecoder.decodeString(jsonPath + '.url', json['url']);
+      }
+      List<DiagnosticMessage> contextMessages;
+      if (json.containsKey('contextMessages')) {
+        contextMessages = jsonDecoder.decodeList(
+            jsonPath + '.contextMessages',
+            json['contextMessages'],
+            (String jsonPath, Object json) =>
+                DiagnosticMessage.fromJson(jsonDecoder, jsonPath, json));
+      }
       bool hasFix;
       if (json.containsKey('hasFix')) {
         hasFix = jsonDecoder.decodeBool(jsonPath + '.hasFix', json['hasFix']);
       }
       return AnalysisError(severity, type, location, message, code,
-          correction: correction, hasFix: hasFix);
+          correction: correction,
+          url: url,
+          contextMessages: contextMessages,
+          hasFix: hasFix);
     } else {
       throw jsonDecoder.mismatch(jsonPath, 'AnalysisError', json);
     }
@@ -273,6 +316,14 @@
       result['correction'] = correction;
     }
     result['code'] = code;
+    if (url != null) {
+      result['url'] = url;
+    }
+    if (contextMessages != null) {
+      result['contextMessages'] = contextMessages
+          .map((DiagnosticMessage value) => value.toJson())
+          .toList();
+    }
     if (hasFix != null) {
       result['hasFix'] = hasFix;
     }
@@ -291,6 +342,9 @@
           message == other.message &&
           correction == other.correction &&
           code == other.code &&
+          url == other.url &&
+          listEqual(contextMessages, other.contextMessages,
+              (DiagnosticMessage a, DiagnosticMessage b) => a == b) &&
           hasFix == other.hasFix;
     }
     return false;
@@ -305,6 +359,8 @@
     hash = JenkinsSmiHash.combine(hash, message.hashCode);
     hash = JenkinsSmiHash.combine(hash, correction.hashCode);
     hash = JenkinsSmiHash.combine(hash, code.hashCode);
+    hash = JenkinsSmiHash.combine(hash, url.hashCode);
+    hash = JenkinsSmiHash.combine(hash, contextMessages.hashCode);
     hash = JenkinsSmiHash.combine(hash, hasFix.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
@@ -562,7 +618,6 @@
 ///   "hasNamedParameters": optional bool
 ///   "parameterName": optional String
 ///   "parameterType": optional String
-///   "importUri": optional String
 /// }
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -609,8 +664,6 @@
 
   String _parameterType;
 
-  String _importUri;
-
   /// The kind of element being suggested.
   CompletionSuggestionKind get kind => _kind;
 
@@ -720,12 +773,12 @@
     _docComplete = value;
   }
 
-  /// The class that declares the element being suggested. This field is omitted
-  /// if the suggested element is not a member of a class.
+  /// The class that declares the element being suggested. This field is
+  /// omitted if the suggested element is not a member of a class.
   String get declaringType => _declaringType;
 
-  /// The class that declares the element being suggested. This field is omitted
-  /// if the suggested element is not a member of a class.
+  /// The class that declares the element being suggested. This field is
+  /// omitted if the suggested element is not a member of a class.
   set declaringType(String value) {
     _declaringType = value;
   }
@@ -766,14 +819,14 @@
     _element = value;
   }
 
-  /// The return type of the getter, function or method or the type of the field
-  /// being suggested. This field is omitted if the suggested element is not a
-  /// getter, function or method.
+  /// The return type of the getter, function or method or the type of the
+  /// field being suggested. This field is omitted if the suggested element is
+  /// not a getter, function or method.
   String get returnType => _returnType;
 
-  /// The return type of the getter, function or method or the type of the field
-  /// being suggested. This field is omitted if the suggested element is not a
-  /// getter, function or method.
+  /// The return type of the getter, function or method or the type of the
+  /// field being suggested. This field is omitted if the suggested element is
+  /// not a getter, function or method.
   set returnType(String value) {
     _returnType = value;
   }
@@ -842,16 +895,6 @@
     _parameterType = value;
   }
 
-  /// The import to be added if the suggestion is out of scope and needs an
-  /// import to be added to be in scope.
-  String get importUri => _importUri;
-
-  /// The import to be added if the suggestion is out of scope and needs an
-  /// import to be added to be in scope.
-  set importUri(String value) {
-    _importUri = value;
-  }
-
   CompletionSuggestion(
       CompletionSuggestionKind kind,
       int relevance,
@@ -873,8 +916,7 @@
       int requiredParameterCount,
       bool hasNamedParameters,
       String parameterName,
-      String parameterType,
-      String importUri}) {
+      String parameterType}) {
     this.kind = kind;
     this.relevance = relevance;
     this.completion = completion;
@@ -896,7 +938,6 @@
     this.hasNamedParameters = hasNamedParameters;
     this.parameterName = parameterName;
     this.parameterType = parameterType;
-    this.importUri = importUri;
   }
 
   factory CompletionSuggestion.fromJson(
@@ -1026,11 +1067,6 @@
         parameterType = jsonDecoder.decodeString(
             jsonPath + '.parameterType', json['parameterType']);
       }
-      String importUri;
-      if (json.containsKey('importUri')) {
-        importUri = jsonDecoder.decodeString(
-            jsonPath + '.importUri', json['importUri']);
-      }
       return CompletionSuggestion(kind, relevance, completion, selectionOffset,
           selectionLength, isDeprecated, isPotential,
           displayText: displayText,
@@ -1046,8 +1082,7 @@
           requiredParameterCount: requiredParameterCount,
           hasNamedParameters: hasNamedParameters,
           parameterName: parameterName,
-          parameterType: parameterType,
-          importUri: importUri);
+          parameterType: parameterType);
     } else {
       throw jsonDecoder.mismatch(jsonPath, 'CompletionSuggestion', json);
     }
@@ -1105,9 +1140,6 @@
     if (parameterType != null) {
       result['parameterType'] = parameterType;
     }
-    if (importUri != null) {
-      result['importUri'] = importUri;
-    }
     return result;
   }
 
@@ -1140,8 +1172,7 @@
           requiredParameterCount == other.requiredParameterCount &&
           hasNamedParameters == other.hasNamedParameters &&
           parameterName == other.parameterName &&
-          parameterType == other.parameterType &&
-          importUri == other.importUri;
+          parameterType == other.parameterType;
     }
     return false;
   }
@@ -1170,7 +1201,6 @@
     hash = JenkinsSmiHash.combine(hash, hasNamedParameters.hashCode);
     hash = JenkinsSmiHash.combine(hash, parameterName.hashCode);
     hash = JenkinsSmiHash.combine(hash, parameterType.hashCode);
-    hash = JenkinsSmiHash.combine(hash, importUri.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -1210,13 +1240,14 @@
       CompletionSuggestionKind._('IDENTIFIER');
 
   /// The element is being invoked at the completion location. For example,
-  /// 'someMethod' in x.someMethod();. For suggestions of this kind, the element
-  /// attribute is defined and the completion field is the element's identifier.
+  /// 'someMethod' in x.someMethod();. For suggestions of this kind, the
+  /// element attribute is defined and the completion field is the element's
+  /// identifier.
   static const CompletionSuggestionKind INVOCATION =
       CompletionSuggestionKind._('INVOCATION');
 
-  /// A keyword is being suggested. For suggestions of this kind, the completion
-  /// is the keyword.
+  /// A keyword is being suggested. For suggestions of this kind, the
+  /// completion is the keyword.
   static const CompletionSuggestionKind KEYWORD =
       CompletionSuggestionKind._('KEYWORD');
 
@@ -1304,6 +1335,96 @@
   String toJson() => name;
 }
 
+/// DiagnosticMessage
+///
+/// {
+///   "message": String
+///   "location": Location
+/// }
+///
+/// Clients may not extend, implement or mix-in this class.
+class DiagnosticMessage implements HasToJson {
+  String _message;
+
+  Location _location;
+
+  /// The message to be displayed to the user.
+  String get message => _message;
+
+  /// The message to be displayed to the user.
+  set message(String value) {
+    assert(value != null);
+    _message = value;
+  }
+
+  /// The location associated with or referenced by the message. Clients should
+  /// provide the ability to navigate to the location.
+  Location get location => _location;
+
+  /// The location associated with or referenced by the message. Clients should
+  /// provide the ability to navigate to the location.
+  set location(Location value) {
+    assert(value != null);
+    _location = value;
+  }
+
+  DiagnosticMessage(String message, Location location) {
+    this.message = message;
+    this.location = location;
+  }
+
+  factory DiagnosticMessage.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    json ??= {};
+    if (json is Map) {
+      String message;
+      if (json.containsKey('message')) {
+        message =
+            jsonDecoder.decodeString(jsonPath + '.message', json['message']);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, 'message');
+      }
+      Location location;
+      if (json.containsKey('location')) {
+        location = Location.fromJson(
+            jsonDecoder, jsonPath + '.location', json['location']);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, 'location');
+      }
+      return DiagnosticMessage(message, location);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, 'DiagnosticMessage', json);
+    }
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var result = <String, dynamic>{};
+    result['message'] = message;
+    result['location'] = location.toJson();
+    return result;
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is DiagnosticMessage) {
+      return message == other.message && location == other.location;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = JenkinsSmiHash.combine(hash, location.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
 /// Element
 ///
 /// {
@@ -1423,14 +1544,14 @@
     _parameters = value;
   }
 
-  /// The return type of the element. If the element is not a method or function
-  /// this field will not be defined. If the element does not have a declared
-  /// return type, this field will contain an empty string.
+  /// The return type of the element. If the element is not a method or
+  /// function this field will not be defined. If the element does not have a
+  /// declared return type, this field will contain an empty string.
   String get returnType => _returnType;
 
-  /// The return type of the element. If the element is not a method or function
-  /// this field will not be defined. If the element does not have a declared
-  /// return type, this field will contain an empty string.
+  /// The return type of the element. If the element is not a method or
+  /// function this field will not be defined. If the element does not have a
+  /// declared return type, this field will contain an empty string.
   set returnType(String value) {
     _returnType = value;
   }
@@ -1581,6 +1702,7 @@
 ///   CONSTRUCTOR_INVOCATION
 ///   ENUM
 ///   ENUM_CONSTANT
+///   EXTENSION
 ///   FIELD
 ///   FILE
 ///   FUNCTION
@@ -1619,6 +1741,8 @@
 
   static const ElementKind ENUM_CONSTANT = ElementKind._('ENUM_CONSTANT');
 
+  static const ElementKind EXTENSION = ElementKind._('EXTENSION');
+
   static const ElementKind FIELD = ElementKind._('FIELD');
 
   static const ElementKind FILE = ElementKind._('FILE');
@@ -1669,6 +1793,7 @@
     CONSTRUCTOR_INVOCATION,
     ENUM,
     ENUM_CONSTANT,
+    EXTENSION,
     FIELD,
     FILE,
     FUNCTION,
@@ -1711,6 +1836,8 @@
         return ENUM;
       case 'ENUM_CONSTANT':
         return ENUM_CONSTANT;
+      case 'EXTENSION':
+        return EXTENSION;
       case 'FIELD':
         return FIELD;
       case 'FILE':
@@ -1775,6 +1902,7 @@
 ///
 /// enum {
 ///   ANNOTATIONS
+///   BLOCK
 ///   CLASS_BODY
 ///   DIRECTIVES
 ///   DOCUMENTATION_COMMENT
@@ -1788,6 +1916,8 @@
 class FoldingKind implements Enum {
   static const FoldingKind ANNOTATIONS = FoldingKind._('ANNOTATIONS');
 
+  static const FoldingKind BLOCK = FoldingKind._('BLOCK');
+
   static const FoldingKind CLASS_BODY = FoldingKind._('CLASS_BODY');
 
   static const FoldingKind DIRECTIVES = FoldingKind._('DIRECTIVES');
@@ -1806,6 +1936,7 @@
   /// A list containing all of the enum values that are defined.
   static const List<FoldingKind> VALUES = <FoldingKind>[
     ANNOTATIONS,
+    BLOCK,
     CLASS_BODY,
     DIRECTIVES,
     DOCUMENTATION_COMMENT,
@@ -1824,6 +1955,8 @@
     switch (name) {
       case 'ANNOTATIONS':
         return ANNOTATIONS;
+      case 'BLOCK':
+        return BLOCK;
       case 'CLASS_BODY':
         return CLASS_BODY;
       case 'DIRECTIVES':
@@ -2182,23 +2315,19 @@
   static const HighlightRegionType DIRECTIVE =
       HighlightRegionType._('DIRECTIVE');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType DYNAMIC_TYPE =
       HighlightRegionType._('DYNAMIC_TYPE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_LOCAL_VARIABLE_DECLARATION =
       HighlightRegionType._('DYNAMIC_LOCAL_VARIABLE_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_LOCAL_VARIABLE_REFERENCE =
       HighlightRegionType._('DYNAMIC_LOCAL_VARIABLE_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_PARAMETER_DECLARATION =
       HighlightRegionType._('DYNAMIC_PARAMETER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_PARAMETER_REFERENCE =
       HighlightRegionType._('DYNAMIC_PARAMETER_REFERENCE');
 
@@ -2207,24 +2336,24 @@
   static const HighlightRegionType ENUM_CONSTANT =
       HighlightRegionType._('ENUM_CONSTANT');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType FIELD = HighlightRegionType._('FIELD');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType FIELD_STATIC =
       HighlightRegionType._('FIELD_STATIC');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType FUNCTION = HighlightRegionType._('FUNCTION');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType FUNCTION_DECLARATION =
       HighlightRegionType._('FUNCTION_DECLARATION');
 
   static const HighlightRegionType FUNCTION_TYPE_ALIAS =
       HighlightRegionType._('FUNCTION_TYPE_ALIAS');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType GETTER_DECLARATION =
       HighlightRegionType._('GETTER_DECLARATION');
 
@@ -2234,39 +2363,30 @@
   static const HighlightRegionType IMPORT_PREFIX =
       HighlightRegionType._('IMPORT_PREFIX');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_FIELD_DECLARATION =
       HighlightRegionType._('INSTANCE_FIELD_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_FIELD_REFERENCE =
       HighlightRegionType._('INSTANCE_FIELD_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_GETTER_DECLARATION =
       HighlightRegionType._('INSTANCE_GETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_GETTER_REFERENCE =
       HighlightRegionType._('INSTANCE_GETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_METHOD_DECLARATION =
       HighlightRegionType._('INSTANCE_METHOD_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_METHOD_REFERENCE =
       HighlightRegionType._('INSTANCE_METHOD_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_SETTER_DECLARATION =
       HighlightRegionType._('INSTANCE_SETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_SETTER_REFERENCE =
       HighlightRegionType._('INSTANCE_SETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INVALID_STRING_ESCAPE =
       HighlightRegionType._('INVALID_STRING_ESCAPE');
 
@@ -2274,7 +2394,6 @@
 
   static const HighlightRegionType LABEL = HighlightRegionType._('LABEL');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType LIBRARY_NAME =
       HighlightRegionType._('LIBRARY_NAME');
 
@@ -2296,113 +2415,94 @@
   static const HighlightRegionType LITERAL_STRING =
       HighlightRegionType._('LITERAL_STRING');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType LOCAL_FUNCTION_DECLARATION =
       HighlightRegionType._('LOCAL_FUNCTION_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType LOCAL_FUNCTION_REFERENCE =
       HighlightRegionType._('LOCAL_FUNCTION_REFERENCE');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType LOCAL_VARIABLE =
       HighlightRegionType._('LOCAL_VARIABLE');
 
   static const HighlightRegionType LOCAL_VARIABLE_DECLARATION =
       HighlightRegionType._('LOCAL_VARIABLE_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType LOCAL_VARIABLE_REFERENCE =
       HighlightRegionType._('LOCAL_VARIABLE_REFERENCE');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType METHOD = HighlightRegionType._('METHOD');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType METHOD_DECLARATION =
       HighlightRegionType._('METHOD_DECLARATION');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType METHOD_DECLARATION_STATIC =
       HighlightRegionType._('METHOD_DECLARATION_STATIC');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType METHOD_STATIC =
       HighlightRegionType._('METHOD_STATIC');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType PARAMETER =
       HighlightRegionType._('PARAMETER');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType SETTER_DECLARATION =
       HighlightRegionType._('SETTER_DECLARATION');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType TOP_LEVEL_VARIABLE =
       HighlightRegionType._('TOP_LEVEL_VARIABLE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType PARAMETER_DECLARATION =
       HighlightRegionType._('PARAMETER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType PARAMETER_REFERENCE =
       HighlightRegionType._('PARAMETER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_FIELD_DECLARATION =
       HighlightRegionType._('STATIC_FIELD_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_GETTER_DECLARATION =
       HighlightRegionType._('STATIC_GETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_GETTER_REFERENCE =
       HighlightRegionType._('STATIC_GETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_METHOD_DECLARATION =
       HighlightRegionType._('STATIC_METHOD_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_METHOD_REFERENCE =
       HighlightRegionType._('STATIC_METHOD_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_SETTER_DECLARATION =
       HighlightRegionType._('STATIC_SETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_SETTER_REFERENCE =
       HighlightRegionType._('STATIC_SETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_FUNCTION_DECLARATION =
       HighlightRegionType._('TOP_LEVEL_FUNCTION_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_FUNCTION_REFERENCE =
       HighlightRegionType._('TOP_LEVEL_FUNCTION_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_GETTER_DECLARATION =
       HighlightRegionType._('TOP_LEVEL_GETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_GETTER_REFERENCE =
       HighlightRegionType._('TOP_LEVEL_GETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_SETTER_DECLARATION =
       HighlightRegionType._('TOP_LEVEL_SETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_SETTER_REFERENCE =
       HighlightRegionType._('TOP_LEVEL_SETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_VARIABLE_DECLARATION =
       HighlightRegionType._('TOP_LEVEL_VARIABLE_DECLARATION');
 
@@ -2412,11 +2512,9 @@
   static const HighlightRegionType TYPE_PARAMETER =
       HighlightRegionType._('TYPE_PARAMETER');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType UNRESOLVED_INSTANCE_MEMBER_REFERENCE =
       HighlightRegionType._('UNRESOLVED_INSTANCE_MEMBER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType VALID_STRING_ESCAPE =
       HighlightRegionType._('VALID_STRING_ESCAPE');
 
@@ -2857,13 +2955,13 @@
     _signature = value;
   }
 
-  /// The corpus of source code this KytheVName belongs to. Loosely, a corpus is
-  /// a collection of related files, such as the contents of a given source
+  /// The corpus of source code this KytheVName belongs to. Loosely, a corpus
+  /// is a collection of related files, such as the contents of a given source
   /// repository.
   String get corpus => _corpus;
 
-  /// The corpus of source code this KytheVName belongs to. Loosely, a corpus is
-  /// a collection of related files, such as the contents of a given source
+  /// The corpus of source code this KytheVName belongs to. Loosely, a corpus
+  /// is a collection of related files, such as the contents of a given source
   /// repository.
   set corpus(String value) {
     assert(value != null);
@@ -3476,14 +3574,14 @@
     _length = value;
   }
 
-  /// The indexes of the targets (in the enclosing navigation response) to which
-  /// the given region is bound. By opening the target, clients can implement
-  /// one form of navigation. This list cannot be empty.
+  /// The indexes of the targets (in the enclosing navigation response) to
+  /// which the given region is bound. By opening the target, clients can
+  /// implement one form of navigation. This list cannot be empty.
   List<int> get targets => _targets;
 
-  /// The indexes of the targets (in the enclosing navigation response) to which
-  /// the given region is bound. By opening the target, clients can implement
-  /// one form of navigation. This list cannot be empty.
+  /// The indexes of the targets (in the enclosing navigation response) to
+  /// which the given region is bound. By opening the target, clients can
+  /// implement one form of navigation. This list cannot be empty.
   set targets(List<int> value) {
     assert(value != null);
     _targets = value;
@@ -3565,6 +3663,8 @@
 ///   "length": int
 ///   "startLine": int
 ///   "startColumn": int
+///   "codeOffset": optional int
+///   "codeLength": optional int
 /// }
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -3581,6 +3681,10 @@
 
   int _startColumn;
 
+  int _codeOffset;
+
+  int _codeLength;
+
   /// The kind of the element.
   ElementKind get kind => _kind;
 
@@ -3601,54 +3705,73 @@
     _fileIndex = value;
   }
 
-  /// The offset of the region to which the user can navigate.
+  /// The offset of the name of the target to which the user can navigate.
   int get offset => _offset;
 
-  /// The offset of the region to which the user can navigate.
+  /// The offset of the name of the target to which the user can navigate.
   set offset(int value) {
     assert(value != null);
     _offset = value;
   }
 
-  /// The length of the region to which the user can navigate.
+  /// The length of the name of the target to which the user can navigate.
   int get length => _length;
 
-  /// The length of the region to which the user can navigate.
+  /// The length of the name of the target to which the user can navigate.
   set length(int value) {
     assert(value != null);
     _length = value;
   }
 
   /// The one-based index of the line containing the first character of the
-  /// region.
+  /// name of the target.
   int get startLine => _startLine;
 
   /// The one-based index of the line containing the first character of the
-  /// region.
+  /// name of the target.
   set startLine(int value) {
     assert(value != null);
     _startLine = value;
   }
 
   /// The one-based index of the column containing the first character of the
-  /// region.
+  /// name of the target.
   int get startColumn => _startColumn;
 
   /// The one-based index of the column containing the first character of the
-  /// region.
+  /// name of the target.
   set startColumn(int value) {
     assert(value != null);
     _startColumn = value;
   }
 
+  /// The offset of the target code to which the user can navigate.
+  int get codeOffset => _codeOffset;
+
+  /// The offset of the target code to which the user can navigate.
+  set codeOffset(int value) {
+    _codeOffset = value;
+  }
+
+  /// The length of the target code to which the user can navigate.
+  int get codeLength => _codeLength;
+
+  /// The length of the target code to which the user can navigate.
+  set codeLength(int value) {
+    _codeLength = value;
+  }
+
   NavigationTarget(ElementKind kind, int fileIndex, int offset, int length,
-      int startLine, int startColumn) {
+      int startLine, int startColumn,
+      {int codeOffset, int codeLength}) {
     this.kind = kind;
     this.fileIndex = fileIndex;
     this.offset = offset;
     this.length = length;
     this.startLine = startLine;
     this.startColumn = startColumn;
+    this.codeOffset = codeOffset;
+    this.codeLength = codeLength;
   }
 
   factory NavigationTarget.fromJson(
@@ -3695,8 +3818,19 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'startColumn');
       }
+      int codeOffset;
+      if (json.containsKey('codeOffset')) {
+        codeOffset =
+            jsonDecoder.decodeInt(jsonPath + '.codeOffset', json['codeOffset']);
+      }
+      int codeLength;
+      if (json.containsKey('codeLength')) {
+        codeLength =
+            jsonDecoder.decodeInt(jsonPath + '.codeLength', json['codeLength']);
+      }
       return NavigationTarget(
-          kind, fileIndex, offset, length, startLine, startColumn);
+          kind, fileIndex, offset, length, startLine, startColumn,
+          codeOffset: codeOffset, codeLength: codeLength);
     } else {
       throw jsonDecoder.mismatch(jsonPath, 'NavigationTarget', json);
     }
@@ -3711,6 +3845,12 @@
     result['length'] = length;
     result['startLine'] = startLine;
     result['startColumn'] = startColumn;
+    if (codeOffset != null) {
+      result['codeOffset'] = codeOffset;
+    }
+    if (codeLength != null) {
+      result['codeLength'] = codeLength;
+    }
     return result;
   }
 
@@ -3725,7 +3865,9 @@
           offset == other.offset &&
           length == other.length &&
           startLine == other.startLine &&
-          startColumn == other.startColumn;
+          startColumn == other.startColumn &&
+          codeOffset == other.codeOffset &&
+          codeLength == other.codeLength;
     }
     return false;
   }
@@ -3739,6 +3881,8 @@
     hash = JenkinsSmiHash.combine(hash, length.hashCode);
     hash = JenkinsSmiHash.combine(hash, startLine.hashCode);
     hash = JenkinsSmiHash.combine(hash, startColumn.hashCode);
+    hash = JenkinsSmiHash.combine(hash, codeOffset.hashCode);
+    hash = JenkinsSmiHash.combine(hash, codeLength.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -3889,15 +4033,15 @@
   }
 
   /// The offset of the first character of the element. This is different than
-  /// the offset in the Element, which is the offset of the name of the element.
-  /// It can be used, for example, to map locations in the file back to an
-  /// outline.
+  /// the offset in the Element, which is the offset of the name of the
+  /// element. It can be used, for example, to map locations in the file back
+  /// to an outline.
   int get offset => _offset;
 
   /// The offset of the first character of the element. This is different than
-  /// the offset in the Element, which is the offset of the name of the element.
-  /// It can be used, for example, to map locations in the file back to an
-  /// outline.
+  /// the offset in the Element, which is the offset of the name of the
+  /// element. It can be used, for example, to map locations in the file back
+  /// to an outline.
   set offset(int value) {
     assert(value != null);
     _offset = value;
@@ -4187,27 +4331,34 @@
 /// ParameterKind
 ///
 /// enum {
-///   NAMED
-///   OPTIONAL
-///   REQUIRED
+///   OPTIONAL_NAMED
+///   OPTIONAL_POSITIONAL
+///   REQUIRED_NAMED
+///   REQUIRED_POSITIONAL
 /// }
 ///
 /// Clients may not extend, implement or mix-in this class.
 class ParameterKind implements Enum {
-  /// A named parameter.
-  static const ParameterKind NAMED = ParameterKind._('NAMED');
+  /// An optional named parameter.
+  static const ParameterKind OPTIONAL_NAMED = ParameterKind._('OPTIONAL_NAMED');
 
-  /// An optional parameter.
-  static const ParameterKind OPTIONAL = ParameterKind._('OPTIONAL');
+  /// An optional positional parameter.
+  static const ParameterKind OPTIONAL_POSITIONAL =
+      ParameterKind._('OPTIONAL_POSITIONAL');
 
-  /// A required parameter.
-  static const ParameterKind REQUIRED = ParameterKind._('REQUIRED');
+  /// A required named parameter.
+  static const ParameterKind REQUIRED_NAMED = ParameterKind._('REQUIRED_NAMED');
+
+  /// A required positional parameter.
+  static const ParameterKind REQUIRED_POSITIONAL =
+      ParameterKind._('REQUIRED_POSITIONAL');
 
   /// A list containing all of the enum values that are defined.
   static const List<ParameterKind> VALUES = <ParameterKind>[
-    NAMED,
-    OPTIONAL,
-    REQUIRED
+    OPTIONAL_NAMED,
+    OPTIONAL_POSITIONAL,
+    REQUIRED_NAMED,
+    REQUIRED_POSITIONAL
   ];
 
   @override
@@ -4217,12 +4368,14 @@
 
   factory ParameterKind(String name) {
     switch (name) {
-      case 'NAMED':
-        return NAMED;
-      case 'OPTIONAL':
-        return OPTIONAL;
-      case 'REQUIRED':
-        return REQUIRED;
+      case 'OPTIONAL_NAMED':
+        return OPTIONAL_NAMED;
+      case 'OPTIONAL_POSITIONAL':
+        return OPTIONAL_POSITIONAL;
+      case 'REQUIRED_NAMED':
+        return REQUIRED_NAMED;
+      case 'REQUIRED_POSITIONAL':
+        return REQUIRED_POSITIONAL;
     }
     throw Exception('Illegal enum value: $name');
   }
@@ -4690,13 +4843,13 @@
   }
 
   /// The location of the problem being represented. This field is omitted
-  /// unless there is a specific location associated with the problem (such as a
-  /// location where an element being renamed will be shadowed).
+  /// unless there is a specific location associated with the problem (such as
+  /// a location where an element being renamed will be shadowed).
   Location get location => _location;
 
   /// The location of the problem being represented. This field is omitted
-  /// unless there is a specific location associated with the problem (such as a
-  /// location where an element being renamed will be shadowed).
+  /// unless there is a specific location associated with the problem (such as
+  /// a location where an element being renamed will be shadowed).
   set location(Location value) {
     _location = value;
   }
@@ -4786,10 +4939,10 @@
   static const RefactoringProblemSeverity INFO =
       RefactoringProblemSeverity._('INFO');
 
-  /// A minor code problem. For example names of local variables should be camel
-  /// case and start with a lower case letter. Staring the name of a variable
-  /// with an upper case is OK from the language point of view, but it is nice
-  /// to warn the user.
+  /// A minor code problem. For example names of local variables should be
+  /// camel case and start with a lower case letter. Staring the name of a
+  /// variable with an upper case is OK from the language point of view, but it
+  /// is nice to warn the user.
   static const RefactoringProblemSeverity WARNING =
       RefactoringProblemSeverity._('WARNING');
 
@@ -5120,8 +5273,8 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class SourceEdit implements HasToJson {
-  /// Get the result of applying a set of [edits] to the given [code]. Edits are
-  /// applied in the order they appear in [edits].
+  /// Get the result of applying a set of [edits] to the given [code]. Edits
+  /// are applied in the order they appear in [edits].
   static String applySequence(String code, Iterable<SourceEdit> edits) =>
       applySequenceOfEdits(code, edits);
 
@@ -5292,16 +5445,16 @@
 
   /// The modification stamp of the file at the moment when the change was
   /// created, in milliseconds since the "Unix epoch". Will be -1 if the file
-  /// did not exist and should be created. The client may use this field to make
-  /// sure that the file was not changed since then, so it is safe to apply the
-  /// change.
+  /// did not exist and should be created. The client may use this field to
+  /// make sure that the file was not changed since then, so it is safe to
+  /// apply the change.
   int get fileStamp => _fileStamp;
 
   /// The modification stamp of the file at the moment when the change was
   /// created, in milliseconds since the "Unix epoch". Will be -1 if the file
-  /// did not exist and should be created. The client may use this field to make
-  /// sure that the file was not changed since then, so it is safe to apply the
-  /// change.
+  /// did not exist and should be created. The client may use this field to
+  /// make sure that the file was not changed since then, so it is safe to
+  /// apply the change.
   set fileStamp(int value) {
     assert(value != null);
     _fileStamp = value;
diff --git a/pkg/analyzer_plugin/tool/spec/codegen_protocol_common.dart b/pkg/analyzer_plugin/tool/spec/codegen_protocol_common.dart
index 099eb1d..a872b10 100644
--- a/pkg/analyzer_plugin/tool/spec/codegen_protocol_common.dart
+++ b/pkg/analyzer_plugin/tool/spec/codegen_protocol_common.dart
@@ -10,7 +10,16 @@
 import 'from_html.dart';
 import 'implied_types.dart';
 
-GeneratedFile target(bool responseRequiresRequestTime) =>
+GeneratedFile clientTarget(bool responseRequiresRequestTime) => GeneratedFile(
+        '../analysis_server_client/lib/src/protocol/protocol_common.dart',
+        (String pkgPath) async {
+      var visitor = CodegenCommonVisitor(
+          path.basename(pkgPath), responseRequiresRequestTime, readApi(pkgPath),
+          forClient: true);
+      return visitor.collectCode(visitor.visitApi);
+    });
+
+GeneratedFile pluginTarget(bool responseRequiresRequestTime) =>
     GeneratedFile('lib/protocol/protocol_common.dart', (String pkgPath) async {
       var visitor = CodegenCommonVisitor(path.basename(pkgPath),
           responseRequiresRequestTime, readApi(pkgPath));
@@ -20,21 +29,34 @@
 /// A visitor that produces Dart code defining the common types associated with
 /// the API.
 class CodegenCommonVisitor extends CodegenProtocolVisitor {
+  final bool forClient;
+
   /// Initialize a newly created visitor to generate code in the package with
   /// the given [packageName] corresponding to the types in the given [api] that
   /// are common to multiple protocols.
   CodegenCommonVisitor(
-      String packageName, bool responseRequiresRequestTime, Api api)
+      String packageName, bool responseRequiresRequestTime, Api api,
+      {this.forClient = false})
       : super(packageName, responseRequiresRequestTime, api);
 
   @override
   void emitImports() {
     writeln("import 'dart:convert' hide JsonDecoder;");
     writeln();
-    writeln("import 'package:analyzer/src/generated/utilities_general.dart';");
-    writeln("import 'package:$packageName/protocol/protocol.dart';");
-    writeln(
-        "import 'package:$packageName/src/protocol/protocol_internal.dart';");
+    if (forClient) {
+      writeln(
+          "import 'package:analysis_server_client/src/protocol/protocol_util.dart';");
+      writeln(
+          "import 'package:analysis_server_client/src/protocol/protocol_base.dart';");
+      writeln(
+          "import 'package:analysis_server_client/src/protocol/protocol_internal.dart';");
+    } else {
+      writeln(
+          "import 'package:analyzer/src/generated/utilities_general.dart';");
+      writeln("import 'package:$packageName/protocol/protocol.dart';");
+      writeln(
+          "import 'package:$packageName/src/protocol/protocol_internal.dart';");
+    }
   }
 
   @override
diff --git a/pkg/analyzer_plugin/tool/spec/generate_all.dart b/pkg/analyzer_plugin/tool/spec/generate_all.dart
index 5375f42..6507475 100644
--- a/pkg/analyzer_plugin/tool/spec/generate_all.dart
+++ b/pkg/analyzer_plugin/tool/spec/generate_all.dart
@@ -27,7 +27,8 @@
   targets.add(codegen_dart_protocol.target(true));
   targets.add(codegen_inttest_methods.target);
   targets.add(codegen_matchers.target);
-  targets.add(codegen_protocol_common.target(true));
+  targets.add(codegen_protocol_common.pluginTarget(true));
+  targets.add(codegen_protocol_common.clientTarget(true));
   targets.add(codegen_protocol_constants.target);
   targets.add(to_html.target);
   return targets;
diff --git a/tools/VERSION b/tools/VERSION
index 418f729..9d17a5f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 123
+PRERELEASE 124
 PRERELEASE_PATCH 0
\ No newline at end of file