diff --git a/lib/compiler/implementation/lib/web.dart b/lib/compiler/implementation/lib/web.dart
new file mode 100644
index 0000000..a75db7b
--- /dev/null
+++ b/lib/compiler/implementation/lib/web.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2012, 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.
+
+#library("web");
+
+String htmlEscape(String text) {
+  throw "Unimplemented: web::htmlEscape(String).";
+}
diff --git a/lib/compiler/implementation/lib/web.dartp b/lib/compiler/implementation/lib/web.dartp
new file mode 100644
index 0000000..c3ba2ad
--- /dev/null
+++ b/lib/compiler/implementation/lib/web.dartp
@@ -0,0 +1,13 @@
+// Copyright (c) 2012, 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.
+
+// Patch file for dart:web
+
+/*patch*/ String htmlEscape(String text) {
+  return text.replaceAll("&", "&amp;")
+             .replaceAll("<", "&lt;")
+             .replaceAll(">", "&gt;")
+             .replaceAll('"', "&quot;")
+             .replaceAll("'", "&apos;");  // Different from original.
+}
diff --git a/lib/dom/templates/html/dartium/factoryprovider__Elements.darttemplate b/lib/dom/templates/html/dartium/factoryprovider__Elements.darttemplate
new file mode 100644
index 0000000..8fe27e5
--- /dev/null
+++ b/lib/dom/templates/html/dartium/factoryprovider__Elements.darttemplate
@@ -0,0 +1,7 @@
+// Copyright (c) 2012, 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.
+
+class _Elements {
+
+$!FACTORY_METHODS}
diff --git a/lib/dom/templates/html/dartium/impl_EventTarget.darttemplate b/lib/dom/templates/html/dartium/impl_EventTarget.darttemplate
new file mode 100644
index 0000000..1b4a00d
--- /dev/null
+++ b/lib/dom/templates/html/dartium/impl_EventTarget.darttemplate
@@ -0,0 +1,106 @@
+// Copyright (c) 2012, 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.
+
+class _EventsImpl implements Events {
+  // TODO(podivilov): add type.
+  final _ptr;
+
+  final Map<String, EventListenerList> _listenerMap;
+
+  _EventsImpl(this._ptr) : _listenerMap = <EventListenerList>{};
+
+  EventListenerList operator [](String type) {
+    return _listenerMap.putIfAbsent(type,
+      () => new _EventListenerListImpl(_ptr, type));
+  }
+}
+
+class _EventListenerWrapper {
+  final EventListener raw;
+  final Function wrapped;
+  final bool useCapture;
+  _EventListenerWrapper(this.raw, this.wrapped, this.useCapture);
+}
+
+class _EventListenerListImpl implements EventListenerList {
+  // TODO(podivilov): add type.
+  final _ptr;
+  final String _type;
+  List<_EventListenerWrapper> _wrappers;
+
+  _EventListenerListImpl(this._ptr, this._type) :
+    // TODO(jacobr): switch to <_EventListenerWrapper>[] when the VM allow it.
+    _wrappers = new List<_EventListenerWrapper>();
+
+  EventListenerList add(EventListener listener, [bool useCapture = false]) {
+    _add(listener, useCapture);
+    return this;
+  }
+
+  EventListenerList remove(EventListener listener, [bool useCapture = false]) {
+    _remove(listener, useCapture);
+    return this;
+  }
+
+  bool dispatch(Event evt) {
+    // TODO(jacobr): what is the correct behavior here. We could alternately
+    // force the event to have the expected type.
+    assert(evt.type == _type);
+    return _ptr.$dom_dispatchEvent(evt);
+  }
+
+  void _add(EventListener listener, bool useCapture) {
+    _ptr.$dom_addEventListener(_type,
+                          _findOrAddWrapper(listener, useCapture),
+                          useCapture);
+  }
+
+  void _remove(EventListener listener, bool useCapture) {
+    Function wrapper = _removeWrapper(listener, useCapture);
+    if (wrapper !== null) {
+      _ptr.$dom_removeEventListener(_type, wrapper, useCapture);
+    }
+  }
+
+  Function _removeWrapper(EventListener listener, bool useCapture) {
+    if (_wrappers === null) {
+      return null;
+    }
+    for (int i = 0; i < _wrappers.length; i++) {
+      _EventListenerWrapper wrapper = _wrappers[i];
+      if (wrapper.raw === listener && wrapper.useCapture == useCapture) {
+        // Order doesn't matter so we swap with the last element instead of
+        // performing a more expensive remove from the middle of the list.
+        if (i + 1 != _wrappers.length) {
+          _wrappers[i] = _wrappers.removeLast();
+        } else {
+          _wrappers.removeLast();
+        }
+        return wrapper.wrapped;
+      }
+    }
+    return null;
+  }
+
+  Function _findOrAddWrapper(EventListener listener, bool useCapture) {
+    if (_wrappers === null) {
+      _wrappers = <_EventListenerWrapper>[];
+    } else {
+      for (_EventListenerWrapper wrapper in _wrappers) {
+        if (wrapper.raw === listener && wrapper.useCapture == useCapture) {
+          return wrapper.wrapped;
+        }
+      }
+    }
+    final wrapped = (e) { listener(e); };
+    _wrappers.add(new _EventListenerWrapper(listener, wrapped, useCapture));
+    return wrapped;
+  }
+}
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+/*
+$!MEMBERS
+*/
+}
diff --git a/lib/dom/templates/html/frog/factoryprovider__Elements.darttemplate b/lib/dom/templates/html/frog/factoryprovider__Elements.darttemplate
new file mode 100644
index 0000000..8fe27e5
--- /dev/null
+++ b/lib/dom/templates/html/frog/factoryprovider__Elements.darttemplate
@@ -0,0 +1,7 @@
+// Copyright (c) 2012, 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.
+
+class _Elements {
+
+$!FACTORY_METHODS}
diff --git a/lib/dom/templates/html/frog/impl_EventTarget.darttemplate b/lib/dom/templates/html/frog/impl_EventTarget.darttemplate
new file mode 100644
index 0000000..893f3d2
--- /dev/null
+++ b/lib/dom/templates/html/frog/impl_EventTarget.darttemplate
@@ -0,0 +1,61 @@
+// Copyright (c) 2012, 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.
+
+class _EventsImpl implements Events {
+  /* Raw event target. */
+  // TODO(jacobr): it would be nice if we could specify this as
+  // _EventTargetImpl or EventTarget
+  final Dynamic _ptr;
+
+  _EventsImpl(this._ptr);
+
+  _EventListenerListImpl operator [](String type) {
+    return new _EventListenerListImpl(_ptr, type);
+  }
+}
+
+class _EventListenerListImpl implements EventListenerList {
+  
+  // TODO(jacobr): make this _EventTargetImpl
+  final Dynamic _ptr;
+  final String _type;
+
+  _EventListenerListImpl(this._ptr, this._type);
+
+  // TODO(jacobr): implement equals.
+
+  _EventListenerListImpl add(EventListener listener,
+      [bool useCapture = false]) {
+    _add(listener, useCapture);
+    return this;
+  }
+
+  _EventListenerListImpl remove(EventListener listener,
+      [bool useCapture = false]) {
+    _remove(listener, useCapture);
+    return this;
+  }
+
+  bool dispatch(Event evt) {
+    // TODO(jacobr): what is the correct behavior here. We could alternately
+    // force the event to have the expected type.
+    assert(evt.type == _type);
+    return _ptr.$dom_dispatchEvent(evt);
+  }
+
+  void _add(EventListener listener, bool useCapture) {
+    _ptr.$dom_addEventListener(_type, listener, useCapture);
+  }
+
+  void _remove(EventListener listener, bool useCapture) {
+    _ptr.$dom_removeEventListener(_type, listener, useCapture);
+  }
+}
+
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+
+  Events get on() => new _EventsImpl(this);
+$!MEMBERS
+}
diff --git a/pkg/analyzer_experimental/bin/coverage.dart b/pkg/analyzer_experimental/bin/coverage.dart
index 1db17e2..87be02e 100644
--- a/pkg/analyzer_experimental/bin/coverage.dart
+++ b/pkg/analyzer_experimental/bin/coverage.dart
@@ -4,89 +4,19 @@
 
 library runtime.coverage;
 
-import 'dart:io';
+import "package:logging/logging.dart" as log;
 
-import 'package:args/args.dart' show ArgParser, ArgResults;
-
-import 'package:analyzer_experimental/src/services/runtime/log.dart' as log;
-import 'package:analyzer_experimental/src/services/runtime/coverage/coverage_impl.dart';
+import 'package:analyzer_experimental/src/services/runtime/coverage_impl.dart';
 
 
 main() {
-  ArgResults options;
-  try {
-    options = _argParser.parse(new Options().arguments);
-  } on FormatException catch (e) {
-    print(e.message);
-    print('Run "coverage --help" to see available options.');
-    exit(ERROR);
-  }
-
-  if (options['help']) {
-    printUsage();
-    return;
-  }
-
-  // No script to run.
-  if (options.rest.isEmpty) {
-    printUsage('<No script to run specified>');
-    exit(ERROR);
-  }
-
-  // More than one script specified.
-  if (options.rest.length != 1) {
-    print('<Only one script should be specified>');
-    exit(ERROR);
-  }
-
-  var scriptPath = options.rest[0];
-
-  // Validate that script file exists.
-  if (!new File(scriptPath).existsSync()) {
-    print('<File "$scriptPath" does not exist>');
-    exit(ERROR);
-  }
-
-  // Prepare output file path.
-  var outPath = options['out'];
-  if (outPath == null) {
-    printUsage('No --out specified.');
-    exit(ERROR);
-  }
-
-  // Configure logigng.
-  log.everything();
-  log.toConsole();
-
-  // Run script.
-  runServerApplication(scriptPath, outPath);
-}
-
-
-final ArgParser _argParser = new ArgParser()
-    ..addFlag('help', negatable: false, help: 'Print this usage information.')
-    ..addOption(
-        'level',
-        help: 'The level of the coverage.',
-        allowed: ['method', 'block', 'statement'],
-        defaultsTo: 'statement')
-    ..addOption('out', help: 'The output file with statistics.')
-    ..addOption(
-        'port',
-        help: 'The port to run server on, if 0 select any.',
-        defaultsTo: '0');
-
-
-printUsage([var description = 'Code coverage tool for Dart.']) {
-  var buffer = new StringBuffer();
-  var usage = _argParser.getUsage();
-  buffer.write(
-      '$description\n\n'
-      'Usage: coverage [options] <script>\n\n'
-      '$usage\n\n');
-  print(buffer.toString());
-}
-
-
-/// General error code.
-const ERROR = 1;
+  var logger = log.Logger.root;
+  logger.level = log.Level.ALL;
+  logger.onRecord.listen((log.LogRecord record) {
+    String levelString = record.level.toString();
+    while (levelString.length < 6) levelString += ' ';
+    print('${record.time}: ${levelString} ${record.message}');
+  });
+  // TODO(scheglov) get script from options
+  new CoverageServer('/Users/scheglov/dart/Test/bin').start();
+}
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/options.dart b/pkg/analyzer_experimental/lib/options.dart
index cb63502..83d5585 100644
--- a/pkg/analyzer_experimental/lib/options.dart
+++ b/pkg/analyzer_experimental/lib/options.dart
@@ -251,6 +251,7 @@
       }
     }
 
+    print(filtered);
     return filtered;
   }
 
diff --git a/pkg/analyzer_experimental/lib/src/analyzer_impl.dart b/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
index 4e46d61..5d8fc4c 100644
--- a/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
@@ -81,6 +81,7 @@
       } else {
         packageDirectory = getPackageDirectoryFor(sourceFile);
       }
+      print('packageDirectory: ${packageDirectory.getPath()}');
       if (packageDirectory != null) {
         resolvers.add(new PackageUriResolver([packageDirectory]));
       }
diff --git a/pkg/analyzer_experimental/lib/src/generated/ast.dart b/pkg/analyzer_experimental/lib/src/generated/ast.dart
index 6b7d525..0adebba 100644
--- a/pkg/analyzer_experimental/lib/src/generated/ast.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/ast.dart
@@ -11,25 +11,25 @@
 import 'utilities_dart.dart';
 import 'element.dart';
 /**
- * The abstract class `ASTNode` defines the behavior common to all nodes in the AST structure
+ * The abstract class {@code ASTNode} defines the behavior common to all nodes in the AST structure
  * for a Dart program.
  * @coverage dart.engine.ast
  */
 abstract class ASTNode {
 
   /**
-   * The parent of the node, or `null` if the node is the root of an AST structure.
+   * The parent of the node, or {@code null} if the node is the root of an AST structure.
    */
   ASTNode _parent;
 
   /**
-   * A table mapping the names of properties to their values, or `null` if this node does not
+   * A table mapping the names of properties to their values, or {@code null} if this node does not
    * have any properties associated with it.
    */
   Map<String, Object> _propertyMap;
 
   /**
-   * A comparator that can be used to sort AST nodes in lexical order. In other words,`compare` will return a negative value if the offset of the first node is less than the
+   * A comparator that can be used to sort AST nodes in lexical order. In other words,{@code compare} will return a negative value if the offset of the first node is less than the
    * offset of the second node, zero (0) if the nodes have the same offset, and a positive value if
    * if the offset of the first node is greater than the offset of the second node.
    */
@@ -43,7 +43,7 @@
   accept(ASTVisitor visitor);
 
   /**
-   * @return the [ASTNode] of given [Class] which is [ASTNode] itself, or one of
+   * @return the {@link ASTNode} of given {@link Class} which is {@link ASTNode} itself, or one of
    * its parents.
    */
   ASTNode getAncestor(Type enclosingClass) {
@@ -63,7 +63,7 @@
 
   /**
    * Return the offset of the character immediately following the last character of this node's
-   * source range. This is equivalent to `node.getOffset() + node.getLength()`. For a
+   * source range. This is equivalent to {@code node.getOffset() + node.getLength()}. For a
    * compilation unit this will be equal to the length of the unit's source. For synthetic nodes
    * this will be equivalent to the node's offset (because the length is zero (0) by definition).
    * @return the offset of the character just past the node's source range
@@ -104,16 +104,16 @@
   }
 
   /**
-   * Return this node's parent node, or `null` if this node is the root of an AST structure.
-   *
+   * Return this node's parent node, or {@code null} if this node is the root of an AST structure.
+   * <p>
    * Note that the relationship between an AST node and its parent node may change over the lifetime
    * of a node.
-   * @return the parent of this node, or `null` if none
+   * @return the parent of this node, or {@code null} if none
    */
   ASTNode get parent => _parent;
 
   /**
-   * Return the value of the property with the given name, or `null` if this node does not
+   * Return the value of the property with the given name, or {@code null} if this node does not
    * have a property with the given name.
    * @return the value of the property with the given name
    */
@@ -140,15 +140,15 @@
   }
 
   /**
-   * Return `true` if this node is a synthetic node. A synthetic node is a node that was
+   * Return {@code true} if this node is a synthetic node. A synthetic node is a node that was
    * introduced by the parser in order to recover from an error in the code. Synthetic nodes always
-   * have a length of zero (`0`).
-   * @return `true` if this node is a synthetic node
+   * have a length of zero ({@code 0}).
+   * @return {@code true} if this node is a synthetic node
    */
-  bool get isSynthetic => false;
+  bool isSynthetic() => false;
 
   /**
-   * Set the value of the property with the given name to the given value. If the value is`null`, the property will effectively be removed.
+   * Set the value of the property with the given name to the given value. If the value is{@code null}, the property will effectively be removed.
    * @param propertyName the name of the property whose value is to be set
    * @param propertyValue the new value of the property
    */
@@ -201,7 +201,7 @@
   }
 
   /**
-   * If the given child is not `null`, use the given visitor to visit it.
+   * If the given child is not {@code null}, use the given visitor to visit it.
    * @param child the child to be visited
    * @param visitor the visitor that will be used to visit the child
    */
@@ -222,7 +222,7 @@
   final int hashCode = ++_hashCodeGenerator;
 }
 /**
- * The interface `ASTVisitor` defines the behavior of objects that can be used to visit an AST
+ * The interface {@code ASTVisitor} defines the behavior of objects that can be used to visit an AST
  * structure.
  * @coverage dart.engine.ast
  */
@@ -330,13 +330,13 @@
   R visitWithClause(WithClause node);
 }
 /**
- * Instances of the class `AdjacentStrings` represents two or more string literals that are
+ * Instances of the class {@code AdjacentStrings} represents two or more string literals that are
  * implicitly concatenated because of being adjacent (separated only by whitespace).
- *
+ * <p>
  * While the grammar only allows adjacent strings when all of the strings are of the same kind
  * (single line or multi-line), this class doesn't enforce that restriction.
  * <pre>
- * adjacentStrings ::=[StringLiteral string] [StringLiteral string]+
+ * adjacentStrings ::={@link StringLiteral string} {@link StringLiteral string}+
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -380,14 +380,14 @@
   }
 }
 /**
- * The abstract class `AnnotatedNode` defines the behavior of nodes that can be annotated with
+ * The abstract class {@code AnnotatedNode} defines the behavior of nodes that can be annotated with
  * both a comment and metadata.
  * @coverage dart.engine.ast
  */
 abstract class AnnotatedNode extends ASTNode {
 
   /**
-   * The documentation comment associated with this node, or `null` if this node does not have
+   * The documentation comment associated with this node, or {@code null} if this node does not have
    * a documentation comment associated with it.
    */
   Comment _comment;
@@ -433,7 +433,7 @@
   }
 
   /**
-   * Return the documentation comment associated with this node, or `null` if this node does
+   * Return the documentation comment associated with this node, or {@code null} if this node does
    * not have a documentation comment associated with it.
    * @return the documentation comment associated with this node
    */
@@ -479,8 +479,8 @@
   Token get firstTokenAfterCommentAndMetadata;
 
   /**
-   * Return `true` if the comment is lexically before any annotations.
-   * @return `true` if the comment is lexically before any annotations
+   * Return {@code true} if the comment is lexically before any annotations.
+   * @return {@code true} if the comment is lexically before any annotations
    */
   bool commentIsBeforeAnnotations() {
     if (_comment == null || _metadata.isEmpty) {
@@ -506,13 +506,13 @@
   }
 }
 /**
- * Instances of the class `Annotation` represent an annotation that can be associated with an
+ * Instances of the class {@code Annotation} represent an annotation that can be associated with an
  * AST node.
  * <pre>
  * metadata ::=
  * annotation
  * annotation ::=
- * '@' [Identifier qualified] ('.' [SimpleIdentifier identifier])? [ArgumentList arguments]?
+ * '@' {@link Identifier qualified} ('.' {@link SimpleIdentifier identifier})? {@link ArgumentList arguments}?
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -530,19 +530,19 @@
   Identifier _name;
 
   /**
-   * The period before the constructor name, or `null` if this annotation is not the
+   * The period before the constructor name, or {@code null} if this annotation is not the
    * invocation of a named constructor.
    */
   Token _period;
 
   /**
-   * The name of the constructor being invoked, or `null` if this annotation is not the
+   * The name of the constructor being invoked, or {@code null} if this annotation is not the
    * invocation of a named constructor.
    */
   SimpleIdentifier _constructorName;
 
   /**
-   * The arguments to the constructor being invoked, or `null` if this annotation is not the
+   * The arguments to the constructor being invoked, or {@code null} if this annotation is not the
    * invocation of a constructor.
    */
   ArgumentList _arguments;
@@ -552,11 +552,11 @@
    * @param atSign the at sign that introduced the annotation
    * @param name the name of the class defining the constructor that is being invoked or the name of
    * the field that is being referenced
-   * @param period the period before the constructor name, or `null` if this annotation is not
+   * @param period the period before the constructor name, or {@code null} if this annotation is not
    * the invocation of a named constructor
-   * @param constructorName the name of the constructor being invoked, or `null` if this
+   * @param constructorName the name of the constructor being invoked, or {@code null} if this
    * annotation is not the invocation of a named constructor
-   * @param arguments the arguments to the constructor being invoked, or `null` if this
+   * @param arguments the arguments to the constructor being invoked, or {@code null} if this
    * annotation is not the invocation of a constructor
    */
   Annotation.full(Token atSign, Identifier name, Token period, SimpleIdentifier constructorName, ArgumentList arguments) {
@@ -572,18 +572,18 @@
    * @param atSign the at sign that introduced the annotation
    * @param name the name of the class defining the constructor that is being invoked or the name of
    * the field that is being referenced
-   * @param period the period before the constructor name, or `null` if this annotation is not
+   * @param period the period before the constructor name, or {@code null} if this annotation is not
    * the invocation of a named constructor
-   * @param constructorName the name of the constructor being invoked, or `null` if this
+   * @param constructorName the name of the constructor being invoked, or {@code null} if this
    * annotation is not the invocation of a named constructor
-   * @param arguments the arguments to the constructor being invoked, or `null` if this
+   * @param arguments the arguments to the constructor being invoked, or {@code null} if this
    * annotation is not the invocation of a constructor
    */
   Annotation({Token atSign, Identifier name, Token period, SimpleIdentifier constructorName, ArgumentList arguments}) : this.full(atSign, name, period, constructorName, arguments);
   accept(ASTVisitor visitor) => visitor.visitAnnotation(this);
 
   /**
-   * Return the arguments to the constructor being invoked, or `null` if this annotation is
+   * Return the arguments to the constructor being invoked, or {@code null} if this annotation is
    * not the invocation of a constructor.
    * @return the arguments to the constructor being invoked
    */
@@ -597,14 +597,14 @@
   Token get beginToken => _atSign;
 
   /**
-   * Return the name of the constructor being invoked, or `null` if this annotation is not the
+   * Return the name of the constructor being invoked, or {@code null} if this annotation is not the
    * invocation of a named constructor.
    * @return the name of the constructor being invoked
    */
   SimpleIdentifier get constructorName => _constructorName;
 
   /**
-   * Return the element associated with this annotation, or `null` if the AST structure has
+   * Return the element associated with this annotation, or {@code null} if the AST structure has
    * not been resolved or if this annotation could not be resolved.
    * @return the element associated with this annotation
    */
@@ -633,7 +633,7 @@
   Identifier get name => _name;
 
   /**
-   * Return the period before the constructor name, or `null` if this annotation is not the
+   * Return the period before the constructor name, or {@code null} if this annotation is not the
    * invocation of a named constructor.
    * @return the period before the constructor name
    */
@@ -686,10 +686,10 @@
   }
 }
 /**
- * Instances of the class `ArgumentDefinitionTest` represent an argument definition test.
+ * Instances of the class {@code ArgumentDefinitionTest} represent an argument definition test.
  * <pre>
  * argumentDefinitionTest ::=
- * '?' [SimpleIdentifier identifier]</pre>
+ * '?' {@link SimpleIdentifier identifier}</pre>
  * @coverage dart.engine.ast
  */
 class ArgumentDefinitionTest extends Expression {
@@ -756,13 +756,13 @@
   }
 }
 /**
- * Instances of the class `ArgumentList` represent a list of arguments in the invocation of a
+ * Instances of the class {@code ArgumentList} represent a list of arguments in the invocation of a
  * executable element: a function, method, or constructor.
  * <pre>
  * argumentList ::=
  * '(' arguments? ')'
- * arguments ::=[NamedExpression namedArgument] (',' [NamedExpression namedArgument])
- * | [Expression expressionList] (',' [NamedExpression namedArgument])
+ * arguments ::={@link NamedExpression namedArgument} (',' {@link NamedExpression namedArgument})
+ * | {@link Expression expressionList} (',' {@link NamedExpression namedArgument})
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -785,18 +785,18 @@
 
   /**
    * An array containing the elements representing the parameters corresponding to each of the
-   * arguments in this list, or `null` if the AST has not been resolved or if the function or
+   * arguments in this list, or {@code null} if the AST has not been resolved or if the function or
    * method being invoked could not be determined based on static type information. The array must
-   * be the same length as the number of arguments, but can contain `null` entries if a given
+   * be the same length as the number of arguments, but can contain {@code null} entries if a given
    * argument does not correspond to a formal parameter.
    */
   List<ParameterElement> _correspondingStaticParameters;
 
   /**
    * An array containing the elements representing the parameters corresponding to each of the
-   * arguments in this list, or `null` if the AST has not been resolved or if the function or
+   * arguments in this list, or {@code null} if the AST has not been resolved or if the function or
    * method being invoked could not be determined based on propagated type information. The array
-   * must be the same length as the number of arguments, but can contain `null` entries if a
+   * must be the same length as the number of arguments, but can contain {@code null} entries if a
    * given argument does not correspond to a formal parameter.
    */
   List<ParameterElement> _correspondingPropagatedParameters;
@@ -848,7 +848,7 @@
   /**
    * Set the parameter elements corresponding to each of the arguments in this list to the given
    * array of parameters. The array of parameters must be the same length as the number of
-   * arguments, but can contain `null` entries if a given argument does not correspond to a
+   * arguments, but can contain {@code null} entries if a given argument does not correspond to a
    * formal parameter.
    * @param parameters the parameter elements corresponding to the arguments
    */
@@ -862,7 +862,7 @@
   /**
    * Set the parameter elements corresponding to each of the arguments in this list to the given
    * array of parameters. The array of parameters must be the same length as the number of
-   * arguments, but can contain `null` entries if a given argument does not correspond to a
+   * arguments, but can contain {@code null} entries if a given argument does not correspond to a
    * formal parameter.
    * @param parameters the parameter elements corresponding to the arguments
    */
@@ -897,9 +897,9 @@
    * the function being invoked is known based on propagated type information, and the expression
    * corresponds to one of the parameters of the function being invoked, then return the parameter
    * element representing the parameter to which the value of the given expression will be bound.
-   * Otherwise, return `null`.
-   *
-   * This method is only intended to be used by [Expression#getParameterElement].
+   * Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getParameterElement()}.
    * @param expression the expression corresponding to the parameter to be returned
    * @return the parameter element representing the parameter to which the value of the expression
    * will be bound
@@ -920,9 +920,9 @@
    * the function being invoked is known based on static type information, and the expression
    * corresponds to one of the parameters of the function being invoked, then return the parameter
    * element representing the parameter to which the value of the given expression will be bound.
-   * Otherwise, return `null`.
-   *
-   * This method is only intended to be used by [Expression#getStaticParameterElement].
+   * Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getStaticParameterElement()}.
    * @param expression the expression corresponding to the parameter to be returned
    * @return the parameter element representing the parameter to which the value of the expression
    * will be bound
@@ -939,9 +939,9 @@
   }
 }
 /**
- * Instances of the class `AsExpression` represent an 'as' expression.
+ * Instances of the class {@code AsExpression} represent an 'as' expression.
  * <pre>
- * asExpression ::=[Expression expression] 'as' [TypeName type]</pre>
+ * asExpression ::={@link Expression expression} 'as' {@link TypeName type}</pre>
  * @coverage dart.engine.ast
  */
 class AsExpression extends Expression {
@@ -1031,10 +1031,10 @@
   }
 }
 /**
- * Instances of the class `AssertStatement` represent an assert statement.
+ * Instances of the class {@code AssertStatement} represent an assert statement.
  * <pre>
  * assertStatement ::=
- * 'assert' '(' [Expression conditionalExpression] ')' ';'
+ * 'assert' '(' {@link Expression conditionalExpression} ')' ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -1051,7 +1051,7 @@
   Token _leftParenthesis;
 
   /**
-   * The condition that is being asserted to be `true`.
+   * The condition that is being asserted to be {@code true}.
    */
   Expression _condition;
 
@@ -1069,7 +1069,7 @@
    * Initialize a newly created assert statement.
    * @param keyword the token representing the 'assert' keyword
    * @param leftParenthesis the left parenthesis
-   * @param condition the condition that is being asserted to be `true`
+   * @param condition the condition that is being asserted to be {@code true}
    * @param rightParenthesis the right parenthesis
    * @param semicolon the semicolon terminating the statement
    */
@@ -1085,7 +1085,7 @@
    * Initialize a newly created assert statement.
    * @param keyword the token representing the 'assert' keyword
    * @param leftParenthesis the left parenthesis
-   * @param condition the condition that is being asserted to be `true`
+   * @param condition the condition that is being asserted to be {@code true}
    * @param rightParenthesis the right parenthesis
    * @param semicolon the semicolon terminating the statement
    */
@@ -1094,8 +1094,8 @@
   Token get beginToken => _keyword;
 
   /**
-   * Return the condition that is being asserted to be `true`.
-   * @return the condition that is being asserted to be `true`
+   * Return the condition that is being asserted to be {@code true}.
+   * @return the condition that is being asserted to be {@code true}
    */
   Expression get condition => _condition;
   Token get endToken => _semicolon;
@@ -1125,8 +1125,8 @@
   Token get semicolon => _semicolon;
 
   /**
-   * Set the condition that is being asserted to be `true` to the given expression.
-   * @param the condition that is being asserted to be `true`
+   * Set the condition that is being asserted to be {@code true} to the given expression.
+   * @param the condition that is being asserted to be {@code true}
    */
   void set condition(Expression condition2) {
     this._condition = becomeParentOf(condition2);
@@ -1168,9 +1168,9 @@
   }
 }
 /**
- * Instances of the class `AssignmentExpression` represent an assignment expression.
+ * Instances of the class {@code AssignmentExpression} represent an assignment expression.
  * <pre>
- * assignmentExpression ::=[Expression leftHandSide] [Token operator] [Expression rightHandSide]</pre>
+ * assignmentExpression ::={@link Expression leftHandSide} {@link Token operator} {@link Expression rightHandSide}</pre>
  * @coverage dart.engine.ast
  */
 class AssignmentExpression extends Expression {
@@ -1191,13 +1191,13 @@
   Expression _rightHandSide;
 
   /**
-   * The element associated with the operator based on the static type of the left-hand-side, or`null` if the AST structure has not been resolved, if the operator is not a compound
+   * The element associated with the operator based on the static type of the left-hand-side, or{@code null} if the AST structure has not been resolved, if the operator is not a compound
    * operator, or if the operator could not be resolved.
    */
   MethodElement _staticElement;
 
   /**
-   * The element associated with the operator based on the propagated type of the left-hand-side, or`null` if the AST structure has not been resolved, if the operator is not a compound
+   * The element associated with the operator based on the propagated type of the left-hand-side, or{@code null} if the AST structure has not been resolved, if the operator is not a compound
    * operator, or if the operator could not be resolved.
    */
   MethodElement _propagatedElement;
@@ -1226,7 +1226,7 @@
 
   /**
    * Return the element associated with the operator based on the propagated type of the
-   * left-hand-side, or `null` if the AST structure has not been resolved, if the operator is
+   * left-hand-side, or {@code null} if the AST structure has not been resolved, if the operator is
    * not a compound operator, or if the operator could not be resolved. One example of the latter
    * case is an operator that is not defined for the type of the left-hand operand.
    * @return the element associated with the operator
@@ -1254,7 +1254,7 @@
 
   /**
    * Return the element associated with the operator based on the static type of the left-hand-side,
-   * or `null` if the AST structure has not been resolved, if the operator is not a compound
+   * or {@code null} if the AST structure has not been resolved, if the operator is not a compound
    * operator, or if the operator could not be resolved. One example of the latter case is an
    * operator that is not defined for the type of the left-hand operand.
    * @return the element associated with the operator
@@ -1308,9 +1308,9 @@
   }
 }
 /**
- * Instances of the class `BinaryExpression` represent a binary (infix) expression.
+ * Instances of the class {@code BinaryExpression} represent a binary (infix) expression.
  * <pre>
- * binaryExpression ::=[Expression leftOperand] [Token operator] [Expression rightOperand]</pre>
+ * binaryExpression ::={@link Expression leftOperand} {@link Token operator} {@link Expression rightOperand}</pre>
  * @coverage dart.engine.ast
  */
 class BinaryExpression extends Expression {
@@ -1331,13 +1331,13 @@
   Expression _rightOperand;
 
   /**
-   * The element associated with the operator based on the static type of the left operand, or`null` if the AST structure has not been resolved, if the operator is not user definable,
+   * The element associated with the operator based on the static type of the left operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _staticElement;
 
   /**
-   * The element associated with the operator based on the propagated type of the left operand, or`null` if the AST structure has not been resolved, if the operator is not user definable,
+   * The element associated with the operator based on the propagated type of the left operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _propagatedElement;
@@ -1366,7 +1366,7 @@
 
   /**
    * Return the element associated with the operator based on the propagated type of the left
-   * operand, or `null` if the AST structure has not been resolved, if the operator is not
+   * operand, or {@code null} if the AST structure has not been resolved, if the operator is not
    * user definable, or if the operator could not be resolved. One example of the latter case is an
    * operator that is not defined for the type of the left-hand operand.
    * @return the element associated with the operator
@@ -1394,7 +1394,7 @@
 
   /**
    * Return the element associated with the operator based on the static type of the left operand,
-   * or `null` if the AST structure has not been resolved, if the operator is not user
+   * or {@code null} if the AST structure has not been resolved, if the operator is not user
    * definable, or if the operator could not be resolved. One example of the latter case is an
    * operator that is not defined for the type of the left operand.
    * @return the element associated with the operator
@@ -1450,9 +1450,9 @@
   /**
    * If the AST structure has been resolved, and the function being invoked is known based on
    * propagated type information, then return the parameter element representing the parameter to
-   * which the value of the right operand will be bound. Otherwise, return `null`.
-   *
-   * This method is only intended to be used by [Expression#getParameterElement].
+   * which the value of the right operand will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getParameterElement()}.
    * @return the parameter element representing the parameter to which the value of the right
    * operand will be bound
    */
@@ -1470,9 +1470,9 @@
   /**
    * If the AST structure has been resolved, and the function being invoked is known based on static
    * type information, then return the parameter element representing the parameter to which the
-   * value of the right operand will be bound. Otherwise, return `null`.
-   *
-   * This method is only intended to be used by [Expression#getStaticParameterElement].
+   * value of the right operand will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getStaticParameterElement()}.
    * @return the parameter element representing the parameter to which the value of the right
    * operand will be bound
    */
@@ -1488,7 +1488,7 @@
   }
 }
 /**
- * Instances of the class `Block` represent a sequence of statements.
+ * Instances of the class {@code Block} represent a sequence of statements.
  * <pre>
  * block ::=
  * '{' statement* '}'
@@ -1574,10 +1574,10 @@
   }
 }
 /**
- * Instances of the class `BlockFunctionBody` represent a function body that consists of a
+ * Instances of the class {@code BlockFunctionBody} represent a function body that consists of a
  * block of statements.
  * <pre>
- * blockFunctionBody ::=[Block block]</pre>
+ * blockFunctionBody ::={@link Block block}</pre>
  * @coverage dart.engine.ast
  */
 class BlockFunctionBody extends FunctionBody {
@@ -1622,7 +1622,7 @@
   }
 }
 /**
- * Instances of the class `BooleanLiteral` represent a boolean literal expression.
+ * Instances of the class {@code BooleanLiteral} represent a boolean literal expression.
  * <pre>
  * booleanLiteral ::=
  * 'false' | 'true'
@@ -1672,7 +1672,7 @@
    * @return the value of the literal
    */
   bool get value => _value;
-  bool get isSynthetic => _literal.isSynthetic;
+  bool isSynthetic() => _literal.isSynthetic();
 
   /**
    * Set the token representing the literal to the given token.
@@ -1693,10 +1693,10 @@
   }
 }
 /**
- * Instances of the class `BreakStatement` represent a break statement.
+ * Instances of the class {@code BreakStatement} represent a break statement.
  * <pre>
  * breakStatement ::=
- * 'break' [SimpleIdentifier label]? ';'
+ * 'break' {@link SimpleIdentifier label}? ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -1708,7 +1708,7 @@
   Token _keyword;
 
   /**
-   * The label associated with the statement, or `null` if there is no label.
+   * The label associated with the statement, or {@code null} if there is no label.
    */
   SimpleIdentifier _label;
 
@@ -1747,7 +1747,7 @@
   Token get keyword => _keyword;
 
   /**
-   * Return the label associated with the statement, or `null` if there is no label.
+   * Return the label associated with the statement, or {@code null} if there is no label.
    * @return the label associated with the statement
    */
   SimpleIdentifier get label => _label;
@@ -1786,11 +1786,11 @@
   }
 }
 /**
- * Instances of the class `CascadeExpression` represent a sequence of cascaded expressions:
+ * Instances of the class {@code CascadeExpression} represent a sequence of cascaded expressions:
  * expressions that share a common target. There are three kinds of expressions that can be used in
- * a cascade expression: [IndexExpression], [MethodInvocation] and[PropertyAccess].
+ * a cascade expression: {@link IndexExpression}, {@link MethodInvocation} and{@link PropertyAccess}.
  * <pre>
- * cascadeExpression ::=[Expression conditionalExpression] cascadeSection
+ * cascadeExpression ::={@link Expression conditionalExpression} cascadeSection
  * cascadeSection ::=
  * '..'  (cascadeSelector arguments*) (assignableSelector arguments*)* (assignmentOperator expressionWithoutCascade)?
  * cascadeSelector ::=
@@ -1857,29 +1857,29 @@
   }
 }
 /**
- * Instances of the class `CatchClause` represent a catch clause within a try statement.
+ * Instances of the class {@code CatchClause} represent a catch clause within a try statement.
  * <pre>
  * onPart ::=
- * catchPart [Block block]| 'on' type catchPart? [Block block]catchPart ::=
- * 'catch' '(' [SimpleIdentifier exceptionParameter] (',' [SimpleIdentifier stackTraceParameter])? ')'
+ * catchPart {@link Block block}| 'on' type catchPart? {@link Block block}catchPart ::=
+ * 'catch' '(' {@link SimpleIdentifier exceptionParameter} (',' {@link SimpleIdentifier stackTraceParameter})? ')'
  * </pre>
  * @coverage dart.engine.ast
  */
 class CatchClause extends ASTNode {
 
   /**
-   * The token representing the 'on' keyword, or `null` if there is no 'on' keyword.
+   * The token representing the 'on' keyword, or {@code null} if there is no 'on' keyword.
    */
   Token _onKeyword;
 
   /**
-   * The type of exceptions caught by this catch clause, or `null` if this catch clause
+   * The type of exceptions caught by this catch clause, or {@code null} if this catch clause
    * catches every type of exception.
    */
   TypeName _exceptionType;
 
   /**
-   * The token representing the 'catch' keyword, or `null` if there is no 'catch' keyword.
+   * The token representing the 'catch' keyword, or {@code null} if there is no 'catch' keyword.
    */
   Token _catchKeyword;
 
@@ -1965,7 +1965,7 @@
   Block get body => _body;
 
   /**
-   * Return the token representing the 'catch' keyword, or `null` if there is no 'catch'
+   * Return the token representing the 'catch' keyword, or {@code null} if there is no 'catch'
    * keyword.
    * @return the token representing the 'catch' keyword
    */
@@ -1985,7 +1985,7 @@
   SimpleIdentifier get exceptionParameter => _exceptionParameter;
 
   /**
-   * Return the type of exceptions caught by this catch clause, or `null` if this catch clause
+   * Return the type of exceptions caught by this catch clause, or {@code null} if this catch clause
    * catches every type of exception.
    * @return the type of exceptions caught by this catch clause
    */
@@ -1998,7 +1998,7 @@
   Token get leftParenthesis => _leftParenthesis;
 
   /**
-   * Return the token representing the 'on' keyword, or `null` if there is no 'on' keyword.
+   * Return the token representing the 'on' keyword, or {@code null} if there is no 'on' keyword.
    * @return the token representing the 'on' keyword
    */
   Token get onKeyword => _onKeyword;
@@ -2096,19 +2096,19 @@
   }
 }
 /**
- * Instances of the class `ClassDeclaration` represent the declaration of a class.
+ * Instances of the class {@code ClassDeclaration} represent the declaration of a class.
  * <pre>
  * classDeclaration ::=
- * 'abstract'? 'class' [SimpleIdentifier name] [TypeParameterList typeParameterList]?
- * ([ExtendsClause extendsClause] [WithClause withClause]?)?[ImplementsClause implementsClause]?
- * '{' [ClassMember classMember]* '}'
+ * 'abstract'? 'class' {@link SimpleIdentifier name} {@link TypeParameterList typeParameterList}?
+ * ({@link ExtendsClause extendsClause} {@link WithClause withClause}?)?{@link ImplementsClause implementsClause}?
+ * '{' {@link ClassMember classMember}* '}'
  * </pre>
  * @coverage dart.engine.ast
  */
 class ClassDeclaration extends CompilationUnitMember {
 
   /**
-   * The 'abstract' keyword, or `null` if the keyword was absent.
+   * The 'abstract' keyword, or {@code null} if the keyword was absent.
    */
   Token _abstractKeyword;
 
@@ -2123,23 +2123,23 @@
   SimpleIdentifier _name;
 
   /**
-   * The type parameters for the class, or `null` if the class does not have any type
+   * The type parameters for the class, or {@code null} if the class does not have any type
    * parameters.
    */
   TypeParameterList _typeParameters;
 
   /**
-   * The extends clause for the class, or `null` if the class does not extend any other class.
+   * The extends clause for the class, or {@code null} if the class does not extend any other class.
    */
   ExtendsClause _extendsClause;
 
   /**
-   * The with clause for the class, or `null` if the class does not have a with clause.
+   * The with clause for the class, or {@code null} if the class does not have a with clause.
    */
   WithClause _withClause;
 
   /**
-   * The implements clause for the class, or `null` if the class does not implement any
+   * The implements clause for the class, or {@code null} if the class does not implement any
    * interfaces.
    */
   ImplementsClause _implementsClause;
@@ -2163,7 +2163,7 @@
    * Initialize a newly created class declaration.
    * @param comment the documentation comment associated with this class
    * @param metadata the annotations associated with this class
-   * @param abstractKeyword the 'abstract' keyword, or `null` if the keyword was absent
+   * @param abstractKeyword the 'abstract' keyword, or {@code null} if the keyword was absent
    * @param classKeyword the token representing the 'class' keyword
    * @param name the name of the class being declared
    * @param typeParameters the type parameters for the class
@@ -2192,7 +2192,7 @@
    * Initialize a newly created class declaration.
    * @param comment the documentation comment associated with this class
    * @param metadata the annotations associated with this class
-   * @param abstractKeyword the 'abstract' keyword, or `null` if the keyword was absent
+   * @param abstractKeyword the 'abstract' keyword, or {@code null} if the keyword was absent
    * @param classKeyword the token representing the 'class' keyword
    * @param name the name of the class being declared
    * @param typeParameters the type parameters for the class
@@ -2207,7 +2207,7 @@
   accept(ASTVisitor visitor) => visitor.visitClassDeclaration(this);
 
   /**
-   * Return the 'abstract' keyword, or `null` if the keyword was absent.
+   * Return the 'abstract' keyword, or {@code null} if the keyword was absent.
    * @return the 'abstract' keyword
    */
   Token get abstractKeyword => _abstractKeyword;
@@ -2221,14 +2221,14 @@
   Token get endToken => _rightBracket;
 
   /**
-   * Return the extends clause for this class, or `null` if the class does not extend any
+   * Return the extends clause for this class, or {@code null} if the class does not extend any
    * other class.
    * @return the extends clause for this class
    */
   ExtendsClause get extendsClause => _extendsClause;
 
   /**
-   * Return the implements clause for the class, or `null` if the class does not implement any
+   * Return the implements clause for the class, or {@code null} if the class does not implement any
    * interfaces.
    * @return the implements clause for the class
    */
@@ -2259,14 +2259,14 @@
   Token get rightBracket => _rightBracket;
 
   /**
-   * Return the type parameters for the class, or `null` if the class does not have any type
+   * Return the type parameters for the class, or {@code null} if the class does not have any type
    * parameters.
    * @return the type parameters for the class
    */
   TypeParameterList get typeParameters => _typeParameters;
 
   /**
-   * Return the with clause for the class, or `null` if the class does not have a with clause.
+   * Return the with clause for the class, or {@code null} if the class does not have a with clause.
    * @return the with clause for the class
    */
   WithClause get withClause => _withClause;
@@ -2359,7 +2359,7 @@
   }
 }
 /**
- * The abstract class `ClassMember` defines the behavior common to nodes that declare a name
+ * The abstract class {@code ClassMember} defines the behavior common to nodes that declare a name
  * within the scope of a class.
  * @coverage dart.engine.ast
  */
@@ -2381,10 +2381,10 @@
   ClassMember({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
 }
 /**
- * Instances of the class `ClassTypeAlias` represent a class type alias.
+ * Instances of the class {@code ClassTypeAlias} represent a class type alias.
  * <pre>
- * classTypeAlias ::=[SimpleIdentifier identifier] [TypeParameterList typeParameters]? '=' 'abstract'? mixinApplication
- * mixinApplication ::=[TypeName superclass] [WithClause withClause] [ImplementsClause implementsClause]? ';'
+ * classTypeAlias ::={@link SimpleIdentifier identifier} {@link TypeParameterList typeParameters}? '=' 'abstract'? mixinApplication
+ * mixinApplication ::={@link TypeName superclass} {@link WithClause withClause} {@link ImplementsClause implementsClause}? ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -2396,7 +2396,7 @@
   SimpleIdentifier _name;
 
   /**
-   * The type parameters for the class, or `null` if the class does not have any type
+   * The type parameters for the class, or {@code null} if the class does not have any type
    * parameters.
    */
   TypeParameterList _typeParameters;
@@ -2407,7 +2407,7 @@
   Token _equals;
 
   /**
-   * The token for the 'abstract' keyword, or `null` if this is not defining an abstract
+   * The token for the 'abstract' keyword, or {@code null} if this is not defining an abstract
    * class.
    */
   Token _abstractKeyword;
@@ -2423,7 +2423,7 @@
   WithClause _withClause;
 
   /**
-   * The implements clause for this class, or `null` if there is no implements clause.
+   * The implements clause for this class, or {@code null} if there is no implements clause.
    */
   ImplementsClause _implementsClause;
 
@@ -2469,7 +2469,7 @@
   accept(ASTVisitor visitor) => visitor.visitClassTypeAlias(this);
 
   /**
-   * Return the token for the 'abstract' keyword, or `null` if this is not defining an
+   * Return the token for the 'abstract' keyword, or {@code null} if this is not defining an
    * abstract class.
    * @return the token for the 'abstract' keyword
    */
@@ -2483,7 +2483,7 @@
   Token get equals => _equals;
 
   /**
-   * Return the implements clause for this class, or `null` if there is no implements clause.
+   * Return the implements clause for this class, or {@code null} if there is no implements clause.
    * @return the implements clause for this class
    */
   ImplementsClause get implementsClause => _implementsClause;
@@ -2501,7 +2501,7 @@
   TypeName get superclass => _superclass;
 
   /**
-   * Return the type parameters for the class, or `null` if the class does not have any type
+   * Return the type parameters for the class, or {@code null} if the class does not have any type
    * parameters.
    * @return the type parameters for the class
    */
@@ -2578,10 +2578,10 @@
   }
 }
 /**
- * Instances of the class `Combinator` represent the combinator associated with an import
+ * Instances of the class {@code Combinator} represent the combinator associated with an import
  * directive.
  * <pre>
- * combinator ::=[HideCombinator hideCombinator]| [ShowCombinator showCombinator]</pre>
+ * combinator ::={@link HideCombinator hideCombinator}| {@link ShowCombinator showCombinator}</pre>
  * @coverage dart.engine.ast
  */
 abstract class Combinator extends ASTNode {
@@ -2625,7 +2625,7 @@
   }
 }
 /**
- * Instances of the class `Comment` represent a comment within the source code.
+ * Instances of the class {@code Comment} represent a comment within the source code.
  * <pre>
  * comment ::=
  * endOfLineComment
@@ -2636,7 +2636,7 @@
  * blockComment ::=
  * '/ *' CHARACTER* '&#42;/'
  * documentationComment ::=
- * '/ **' (CHARACTER | [CommentReference commentReference])* '&#42;/'
+ * '/ **' (CHARACTER | {@link CommentReference commentReference})* '&#42;/'
  * | ('///' (CHARACTER - EOL)* EOL)+
  * </pre>
  * @coverage dart.engine.ast
@@ -2725,28 +2725,28 @@
   List<Token> get tokens => _tokens;
 
   /**
-   * Return `true` if this is a block comment.
-   * @return `true` if this is a block comment
+   * Return {@code true} if this is a block comment.
+   * @return {@code true} if this is a block comment
    */
-  bool get isBlock => identical(_type, CommentType.BLOCK);
+  bool isBlock() => identical(_type, CommentType.BLOCK);
 
   /**
-   * Return `true` if this is a documentation comment.
-   * @return `true` if this is a documentation comment
+   * Return {@code true} if this is a documentation comment.
+   * @return {@code true} if this is a documentation comment
    */
-  bool get isDocumentation => identical(_type, CommentType.DOCUMENTATION);
+  bool isDocumentation() => identical(_type, CommentType.DOCUMENTATION);
 
   /**
-   * Return `true` if this is an end-of-line comment.
-   * @return `true` if this is an end-of-line comment
+   * Return {@code true} if this is an end-of-line comment.
+   * @return {@code true} if this is an end-of-line comment
    */
-  bool get isEndOfLine => identical(_type, CommentType.END_OF_LINE);
+  bool isEndOfLine() => identical(_type, CommentType.END_OF_LINE);
   void visitChildren(ASTVisitor<Object> visitor) {
     _references.accept(visitor);
   }
 }
 /**
- * The enumeration `CommentType` encodes all the different types of comments that are
+ * The enumeration {@code CommentType} encodes all the different types of comments that are
  * recognized by the parser.
  */
 class CommentType implements Comparable<CommentType> {
@@ -2779,18 +2779,18 @@
   String toString() => name;
 }
 /**
- * Instances of the class `CommentReference` represent a reference to a Dart element that is
+ * Instances of the class {@code CommentReference} represent a reference to a Dart element that is
  * found within a documentation comment.
  * <pre>
  * commentReference ::=
- * '\[' 'new'? [Identifier identifier] '\]'
+ * '\[' 'new'? {@link Identifier identifier} '\]'
  * </pre>
  * @coverage dart.engine.ast
  */
 class CommentReference extends ASTNode {
 
   /**
-   * The token representing the 'new' keyword, or `null` if there was no 'new' keyword.
+   * The token representing the 'new' keyword, or {@code null} if there was no 'new' keyword.
    */
   Token _newKeyword;
 
@@ -2826,7 +2826,7 @@
   Identifier get identifier => _identifier;
 
   /**
-   * Return the token representing the 'new' keyword, or `null` if there was no 'new' keyword.
+   * Return the token representing the 'new' keyword, or {@code null} if there was no 'new' keyword.
    * @return the token representing the 'new' keyword
    */
   Token get newKeyword => _newKeyword;
@@ -2851,8 +2851,8 @@
   }
 }
 /**
- * Instances of the class `CompilationUnit` represent a compilation unit.
- *
+ * Instances of the class {@code CompilationUnit} represent a compilation unit.
+ * <p>
  * While the grammar restricts the order of the directives and declarations within a compilation
  * unit, this class does not enforce those restrictions. In particular, the children of a
  * compilation unit will be visited in lexical order even if lexical order does not conform to the
@@ -2860,7 +2860,7 @@
  * <pre>
  * compilationUnit ::=
  * directives declarations
- * directives ::=[ScriptTag scriptTag]? [LibraryDirective libraryDirective]? namespaceDirective* [PartDirective partDirective]| [PartOfDirective partOfDirective]namespaceDirective ::=[ImportDirective importDirective]| [ExportDirective exportDirective]declarations ::=[CompilationUnitMember compilationUnitMember]</pre>
+ * directives ::={@link ScriptTag scriptTag}? {@link LibraryDirective libraryDirective}? namespaceDirective* {@link PartDirective partDirective}| {@link PartOfDirective partOfDirective}namespaceDirective ::={@link ImportDirective importDirective}| {@link ExportDirective exportDirective}declarations ::={@link CompilationUnitMember compilationUnitMember}</pre>
  * @coverage dart.engine.ast
  */
 class CompilationUnit extends ASTNode {
@@ -2871,7 +2871,7 @@
   Token _beginToken;
 
   /**
-   * The script tag at the beginning of the compilation unit, or `null` if there is no script
+   * The script tag at the beginning of the compilation unit, or {@code null} if there is no script
    * tag in this compilation unit.
    */
   ScriptTag _scriptTag;
@@ -2888,18 +2888,18 @@
 
   /**
    * The last token in the token stream that was parsed to form this compilation unit. This token
-   * should always have a type of [TokenType.EOF].
+   * should always have a type of {@link TokenType.EOF}.
    */
   Token _endToken;
 
   /**
-   * The element associated with this compilation unit, or `null` if the AST structure has not
+   * The element associated with this compilation unit, or {@code null} if the AST structure has not
    * been resolved.
    */
   CompilationUnitElement _element;
 
   /**
-   * The [LineInfo] for this [CompilationUnit].
+   * The {@link LineInfo} for this {@link CompilationUnit}.
    */
   LineInfo _lineInfo;
 
@@ -2956,7 +2956,7 @@
   NodeList<Directive> get directives => _directives;
 
   /**
-   * Return the element associated with this compilation unit, or `null` if the AST structure
+   * Return the element associated with this compilation unit, or {@code null} if the AST structure
    * has not been resolved.
    * @return the element associated with this compilation unit
    */
@@ -2965,8 +2965,8 @@
 
   /**
    * Return an array containing all of the errors associated with the receiver. If the receiver has
-   * not been resolved, then return `null`.
-   * @return an array of errors (contains no `null`s) or `null` if the receiver has not
+   * not been resolved, then return {@code null}.
+   * @return an array of errors (contains no {@code null}s) or {@code null} if the receiver has not
    * been resolved
    */
   List<AnalysisError> get errors {
@@ -2992,28 +2992,28 @@
   }
 
   /**
-   * Get the [LineInfo] object for this compilation unit.
-   * @return the associated [LineInfo]
+   * Get the {@link LineInfo} object for this compilation unit.
+   * @return the associated {@link LineInfo}
    */
   LineInfo get lineInfo => _lineInfo;
   int get offset => 0;
 
   /**
    * Return an array containing all of the parsing errors associated with the receiver.
-   * @return an array of errors (not `null`, contains no `null`s).
+   * @return an array of errors (not {@code null}, contains no {@code null}s).
    */
   List<AnalysisError> get parsingErrors => _parsingErrors;
 
   /**
    * Return an array containing all of the resolution errors associated with the receiver. If the
-   * receiver has not been resolved, then return `null`.
-   * @return an array of errors (contains no `null`s) or `null` if the receiver has not
+   * receiver has not been resolved, then return {@code null}.
+   * @return an array of errors (contains no {@code null}s) or {@code null} if the receiver has not
    * been resolved
    */
   List<AnalysisError> get resolutionErrors => _resolutionErrors;
 
   /**
-   * Return the script tag at the beginning of the compilation unit, or `null` if there is no
+   * Return the script tag at the beginning of the compilation unit, or {@code null} if there is no
    * script tag in this compilation unit.
    * @return the script tag at the beginning of the compilation unit
    */
@@ -3028,7 +3028,7 @@
   }
 
   /**
-   * Set the [LineInfo] object for this compilation unit.
+   * Set the {@link LineInfo} object for this compilation unit.
    * @param errors LineInfo to associate with this compilation unit
    */
   void set lineInfo(LineInfo lineInfo2) {
@@ -3037,8 +3037,8 @@
 
   /**
    * Called to cache the parsing errors when the unit is parsed.
-   * @param errors an array of parsing errors, if `null` is passed, the error array is set to
-   * an empty array, [AnalysisError#NO_ERRORS]
+   * @param errors an array of parsing errors, if {@code null} is passed, the error array is set to
+   * an empty array, {@link AnalysisError#NO_ERRORS}
    */
   void set parsingErrors(List<AnalysisError> errors) {
     _parsingErrors = errors == null ? AnalysisError.NO_ERRORS : errors;
@@ -3046,8 +3046,8 @@
 
   /**
    * Called to cache the resolution errors when the unit is resolved.
-   * @param errors an array of resolution errors, if `null` is passed, the error array is set
-   * to an empty array, [AnalysisError#NO_ERRORS]
+   * @param errors an array of resolution errors, if {@code null} is passed, the error array is set
+   * to an empty array, {@link AnalysisError#NO_ERRORS}
    */
   void set resolutionErrors(List<AnalysisError> errors) {
     _resolutionErrors = errors == null ? AnalysisError.NO_ERRORS : errors;
@@ -3073,8 +3073,8 @@
   }
 
   /**
-   * Return `true` if all of the directives are lexically before any declarations.
-   * @return `true` if all of the directives are lexically before any declarations
+   * Return {@code true} if all of the directives are lexically before any declarations.
+   * @return {@code true} if all of the directives are lexically before any declarations
    */
   bool directivesAreBeforeDeclarations() {
     if (_directives.isEmpty || _declarations.isEmpty) {
@@ -3101,10 +3101,10 @@
   }
 }
 /**
- * Instances of the class `CompilationUnitMember` defines the behavior common to nodes that
+ * Instances of the class {@code CompilationUnitMember} defines the behavior common to nodes that
  * declare a name within the scope of a compilation unit.
  * <pre>
- * compilationUnitMember ::=[ClassDeclaration classDeclaration]| [TypeAlias typeAlias]| [FunctionDeclaration functionDeclaration]| [MethodDeclaration getOrSetDeclaration]| [VariableDeclaration constantsDeclaration]| [VariableDeclaration variablesDeclaration]</pre>
+ * compilationUnitMember ::={@link ClassDeclaration classDeclaration}| {@link TypeAlias typeAlias}| {@link FunctionDeclaration functionDeclaration}| {@link MethodDeclaration getOrSetDeclaration}| {@link VariableDeclaration constantsDeclaration}| {@link VariableDeclaration variablesDeclaration}</pre>
  * @coverage dart.engine.ast
  */
 abstract class CompilationUnitMember extends Declaration {
@@ -3125,9 +3125,9 @@
   CompilationUnitMember({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
 }
 /**
- * Instances of the class `ConditionalExpression` represent a conditional expression.
+ * Instances of the class {@code ConditionalExpression} represent a conditional expression.
  * <pre>
- * conditionalExpression ::=[Expression condition] '?' [Expression thenExpression] ':' [Expression elseExpression]</pre>
+ * conditionalExpression ::={@link Expression condition} '?' {@link Expression thenExpression} ':' {@link Expression elseExpression}</pre>
  * @coverage dart.engine.ast
  */
 class ConditionalExpression extends Expression {
@@ -3143,7 +3143,7 @@
   Token _question;
 
   /**
-   * The expression that is executed if the condition evaluates to `true`.
+   * The expression that is executed if the condition evaluates to {@code true}.
    */
   Expression _thenExpression;
 
@@ -3153,7 +3153,7 @@
   Token _colon;
 
   /**
-   * The expression that is executed if the condition evaluates to `false`.
+   * The expression that is executed if the condition evaluates to {@code false}.
    */
   Expression _elseExpression;
 
@@ -3161,9 +3161,9 @@
    * Initialize a newly created conditional expression.
    * @param condition the condition used to determine which expression is executed next
    * @param question the token used to separate the condition from the then expression
-   * @param thenExpression the expression that is executed if the condition evaluates to`true`
+   * @param thenExpression the expression that is executed if the condition evaluates to{@code true}
    * @param colon the token used to separate the then expression from the else expression
-   * @param elseExpression the expression that is executed if the condition evaluates to`false`
+   * @param elseExpression the expression that is executed if the condition evaluates to{@code false}
    */
   ConditionalExpression.full(Expression condition, Token question, Expression thenExpression, Token colon, Expression elseExpression) {
     this._condition = becomeParentOf(condition);
@@ -3177,9 +3177,9 @@
    * Initialize a newly created conditional expression.
    * @param condition the condition used to determine which expression is executed next
    * @param question the token used to separate the condition from the then expression
-   * @param thenExpression the expression that is executed if the condition evaluates to`true`
+   * @param thenExpression the expression that is executed if the condition evaluates to{@code true}
    * @param colon the token used to separate the then expression from the else expression
-   * @param elseExpression the expression that is executed if the condition evaluates to`false`
+   * @param elseExpression the expression that is executed if the condition evaluates to{@code false}
    */
   ConditionalExpression({Expression condition, Token question, Expression thenExpression, Token colon, Expression elseExpression}) : this.full(condition, question, thenExpression, colon, elseExpression);
   accept(ASTVisitor visitor) => visitor.visitConditionalExpression(this);
@@ -3198,8 +3198,8 @@
   Expression get condition => _condition;
 
   /**
-   * Return the expression that is executed if the condition evaluates to `false`.
-   * @return the expression that is executed if the condition evaluates to `false`
+   * Return the expression that is executed if the condition evaluates to {@code false}.
+   * @return the expression that is executed if the condition evaluates to {@code false}
    */
   Expression get elseExpression => _elseExpression;
   Token get endToken => _elseExpression.endToken;
@@ -3211,8 +3211,8 @@
   Token get question => _question;
 
   /**
-   * Return the expression that is executed if the condition evaluates to `true`.
-   * @return the expression that is executed if the condition evaluates to `true`
+   * Return the expression that is executed if the condition evaluates to {@code true}.
+   * @return the expression that is executed if the condition evaluates to {@code true}
    */
   Expression get thenExpression => _thenExpression;
 
@@ -3234,9 +3234,9 @@
   }
 
   /**
-   * Set the expression that is executed if the condition evaluates to `false` to the given
+   * Set the expression that is executed if the condition evaluates to {@code false} to the given
    * expression.
-   * @param expression the expression that is executed if the condition evaluates to `false`
+   * @param expression the expression that is executed if the condition evaluates to {@code false}
    */
   void set elseExpression(Expression expression) {
     _elseExpression = becomeParentOf(expression);
@@ -3251,9 +3251,9 @@
   }
 
   /**
-   * Set the expression that is executed if the condition evaluates to `true` to the given
+   * Set the expression that is executed if the condition evaluates to {@code true} to the given
    * expression.
-   * @param expression the expression that is executed if the condition evaluates to `true`
+   * @param expression the expression that is executed if the condition evaluates to {@code true}
    */
   void set thenExpression(Expression expression) {
     _thenExpression = becomeParentOf(expression);
@@ -3265,37 +3265,37 @@
   }
 }
 /**
- * Instances of the class `ConstructorDeclaration` represent a constructor declaration.
+ * Instances of the class {@code ConstructorDeclaration} represent a constructor declaration.
  * <pre>
  * constructorDeclaration ::=
- * constructorSignature [FunctionBody body]?
- * | constructorName formalParameterList ':' 'this' ('.' [SimpleIdentifier name])? arguments
+ * constructorSignature {@link FunctionBody body}?
+ * | constructorName formalParameterList ':' 'this' ('.' {@link SimpleIdentifier name})? arguments
  * constructorSignature ::=
  * 'external'? constructorName formalParameterList initializerList?
  * | 'external'? 'factory' factoryName formalParameterList initializerList?
  * | 'external'? 'const'  constructorName formalParameterList initializerList?
- * constructorName ::=[SimpleIdentifier returnType] ('.' [SimpleIdentifier name])?
- * factoryName ::=[Identifier returnType] ('.' [SimpleIdentifier name])?
+ * constructorName ::={@link SimpleIdentifier returnType} ('.' {@link SimpleIdentifier name})?
+ * factoryName ::={@link Identifier returnType} ('.' {@link SimpleIdentifier name})?
  * initializerList ::=
- * ':' [ConstructorInitializer initializer] (',' [ConstructorInitializer initializer])
+ * ':' {@link ConstructorInitializer initializer} (',' {@link ConstructorInitializer initializer})
  * </pre>
  * @coverage dart.engine.ast
  */
 class ConstructorDeclaration extends ClassMember {
 
   /**
-   * The token for the 'external' keyword, or `null` if the constructor is not external.
+   * The token for the 'external' keyword, or {@code null} if the constructor is not external.
    */
   Token _externalKeyword;
 
   /**
-   * The token for the 'const' keyword, or `null` if the constructor is not a const
+   * The token for the 'const' keyword, or {@code null} if the constructor is not a const
    * constructor.
    */
   Token _constKeyword;
 
   /**
-   * The token for the 'factory' keyword, or `null` if the constructor is not a factory
+   * The token for the 'factory' keyword, or {@code null} if the constructor is not a factory
    * constructor.
    */
   Token _factoryKeyword;
@@ -3307,18 +3307,18 @@
   Identifier _returnType;
 
   /**
-   * The token for the period before the constructor name, or `null` if the constructor being
+   * The token for the period before the constructor name, or {@code null} if the constructor being
    * declared is unnamed.
    */
   Token _period;
 
   /**
-   * The name of the constructor, or `null` if the constructor being declared is unnamed.
+   * The name of the constructor, or {@code null} if the constructor being declared is unnamed.
    */
   SimpleIdentifier _name;
 
   /**
-   * The element associated with this constructor, or `null` if the AST structure has not been
+   * The element associated with this constructor, or {@code null} if the AST structure has not been
    * resolved or if this constructor could not be resolved.
    */
   ConstructorElement _element;
@@ -3329,7 +3329,7 @@
   FormalParameterList _parameters;
 
   /**
-   * The token for the separator (colon or equals) before the initializers, or `null` if there
+   * The token for the separator (colon or equals) before the initializers, or {@code null} if there
    * are no initializers.
    */
   Token _separator;
@@ -3340,13 +3340,13 @@
   NodeList<ConstructorInitializer> _initializers;
 
   /**
-   * The name of the constructor to which this constructor will be redirected, or `null` if
+   * The name of the constructor to which this constructor will be redirected, or {@code null} if
    * this is not a redirecting factory constructor.
    */
   ConstructorName _redirectedConstructor;
 
   /**
-   * The body of the constructor, or `null` if the constructor does not have a body.
+   * The body of the constructor, or {@code null} if the constructor does not have a body.
    */
   FunctionBody _body;
 
@@ -3403,7 +3403,7 @@
   accept(ASTVisitor visitor) => visitor.visitConstructorDeclaration(this);
 
   /**
-   * Return the body of the constructor, or `null` if the constructor does not have a body.
+   * Return the body of the constructor, or {@code null} if the constructor does not have a body.
    * @return the body of the constructor
    */
   FunctionBody get body => _body;
@@ -3424,7 +3424,7 @@
   }
 
   /**
-   * Return the token for the 'external' keyword, or `null` if the constructor is not
+   * Return the token for the 'external' keyword, or {@code null} if the constructor is not
    * external.
    * @return the token for the 'external' keyword
    */
@@ -3443,7 +3443,7 @@
   NodeList<ConstructorInitializer> get initializers => _initializers;
 
   /**
-   * Return the name of the constructor, or `null` if the constructor being declared is
+   * Return the name of the constructor, or {@code null} if the constructor being declared is
    * unnamed.
    * @return the name of the constructor
    */
@@ -3456,14 +3456,14 @@
   FormalParameterList get parameters => _parameters;
 
   /**
-   * Return the token for the period before the constructor name, or `null` if the constructor
+   * Return the token for the period before the constructor name, or {@code null} if the constructor
    * being declared is unnamed.
    * @return the token for the period before the constructor name
    */
   Token get period => _period;
 
   /**
-   * Return the name of the constructor to which this constructor will be redirected, or`null` if this is not a redirecting factory constructor.
+   * Return the name of the constructor to which this constructor will be redirected, or{@code null} if this is not a redirecting factory constructor.
    * @return the name of the constructor to which this constructor will be redirected
    */
   ConstructorName get redirectedConstructor => _redirectedConstructor;
@@ -3477,7 +3477,7 @@
   Identifier get returnType => _returnType;
 
   /**
-   * Return the token for the separator (colon or equals) before the initializers, or `null`if there are no initializers.
+   * Return the token for the separator (colon or equals) before the initializers, or {@code null}if there are no initializers.
    * @return the token for the separator (colon or equals) before the initializers
    */
   Token get separator => _separator;
@@ -3589,8 +3589,8 @@
   }
 
   /**
-   * Return the left-most of the given tokens, or `null` if there are no tokens given or if
-   * all of the given tokens are `null`.
+   * Return the left-most of the given tokens, or {@code null} if there are no tokens given or if
+   * all of the given tokens are {@code null}.
    * @param tokens the tokens being compared to find the left-most token
    * @return the left-most of the given tokens
    */
@@ -3606,22 +3606,22 @@
   }
 }
 /**
- * Instances of the class `ConstructorFieldInitializer` represent the initialization of a
+ * Instances of the class {@code ConstructorFieldInitializer} represent the initialization of a
  * field within a constructor's initialization list.
  * <pre>
  * fieldInitializer ::=
- * ('this' '.')? [SimpleIdentifier fieldName] '=' [Expression conditionalExpression cascadeSection*]</pre>
+ * ('this' '.')? {@link SimpleIdentifier fieldName} '=' {@link Expression conditionalExpression cascadeSection*}</pre>
  * @coverage dart.engine.ast
  */
 class ConstructorFieldInitializer extends ConstructorInitializer {
 
   /**
-   * The token for the 'this' keyword, or `null` if there is no 'this' keyword.
+   * The token for the 'this' keyword, or {@code null} if there is no 'this' keyword.
    */
   Token _keyword;
 
   /**
-   * The token for the period after the 'this' keyword, or `null` if there is no 'this'
+   * The token for the period after the 'this' keyword, or {@code null} if there is no 'this'
    * keyword.
    */
   Token _period;
@@ -3696,13 +3696,13 @@
   SimpleIdentifier get fieldName => _fieldName;
 
   /**
-   * Return the token for the 'this' keyword, or `null` if there is no 'this' keyword.
+   * Return the token for the 'this' keyword, or {@code null} if there is no 'this' keyword.
    * @return the token for the 'this' keyword
    */
   Token get keyword => _keyword;
 
   /**
-   * Return the token for the period after the 'this' keyword, or `null` if there is no 'this'
+   * Return the token for the period after the 'this' keyword, or {@code null} if there is no 'this'
    * keyword.
    * @return the token for the period after the 'this' keyword
    */
@@ -3754,16 +3754,16 @@
   }
 }
 /**
- * Instances of the class `ConstructorInitializer` defines the behavior of nodes that can
+ * Instances of the class {@code ConstructorInitializer} defines the behavior of nodes that can
  * occur in the initializer list of a constructor declaration.
  * <pre>
- * constructorInitializer ::=[SuperConstructorInvocation superInvocation]| [ConstructorFieldInitializer fieldInitializer]</pre>
+ * constructorInitializer ::={@link SuperConstructorInvocation superInvocation}| {@link ConstructorFieldInitializer fieldInitializer}</pre>
  * @coverage dart.engine.ast
  */
 abstract class ConstructorInitializer extends ASTNode {
 }
 /**
- * Instances of the class `ConstructorName` represent the name of the constructor.
+ * Instances of the class {@code ConstructorName} represent the name of the constructor.
  * <pre>
  * constructorName:
  * type ('.' identifier)?
@@ -3778,25 +3778,25 @@
   TypeName _type;
 
   /**
-   * The token for the period before the constructor name, or `null` if the specified
+   * The token for the period before the constructor name, or {@code null} if the specified
    * constructor is the unnamed constructor.
    */
   Token _period;
 
   /**
-   * The name of the constructor, or `null` if the specified constructor is the unnamed
+   * The name of the constructor, or {@code null} if the specified constructor is the unnamed
    * constructor.
    */
   SimpleIdentifier _name;
 
   /**
-   * The element associated with this constructor name based on static type information, or`null` if the AST structure has not been resolved or if this constructor name could not
+   * The element associated with this constructor name based on static type information, or{@code null} if the AST structure has not been resolved or if this constructor name could not
    * be resolved.
    */
   ConstructorElement _staticElement;
 
   /**
-   * The element associated with this constructor name based on propagated type information, or`null` if the AST structure has not been resolved or if this constructor name could not
+   * The element associated with this constructor name based on propagated type information, or{@code null} if the AST structure has not been resolved or if this constructor name could not
    * be resolved.
    */
   ConstructorElement _propagatedElement;
@@ -3825,7 +3825,7 @@
 
   /**
    * Return the element associated with this constructor name based on propagated type information,
-   * or `null` if the AST structure has not been resolved or if this constructor name could
+   * or {@code null} if the AST structure has not been resolved or if this constructor name could
    * not be resolved.
    * @return the element associated with this constructor name
    */
@@ -3838,21 +3838,21 @@
   }
 
   /**
-   * Return the name of the constructor, or `null` if the specified constructor is the unnamed
+   * Return the name of the constructor, or {@code null} if the specified constructor is the unnamed
    * constructor.
    * @return the name of the constructor
    */
   SimpleIdentifier get name => _name;
 
   /**
-   * Return the token for the period before the constructor name, or `null` if the specified
+   * Return the token for the period before the constructor name, or {@code null} if the specified
    * constructor is the unnamed constructor.
    * @return the token for the period before the constructor name
    */
   Token get period => _period;
 
   /**
-   * Return the element associated with this constructor name based on static type information, or`null` if the AST structure has not been resolved or if this constructor name could not
+   * Return the element associated with this constructor name based on static type information, or{@code null} if the AST structure has not been resolved or if this constructor name could not
    * be resolved.
    * @return the element associated with this constructor name
    */
@@ -3911,10 +3911,10 @@
   }
 }
 /**
- * Instances of the class `ContinueStatement` represent a continue statement.
+ * Instances of the class {@code ContinueStatement} represent a continue statement.
  * <pre>
  * continueStatement ::=
- * 'continue' [SimpleIdentifier label]? ';'
+ * 'continue' {@link SimpleIdentifier label}? ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -3926,7 +3926,7 @@
   Token _keyword;
 
   /**
-   * The label associated with the statement, or `null` if there is no label.
+   * The label associated with the statement, or {@code null} if there is no label.
    */
   SimpleIdentifier _label;
 
@@ -3965,7 +3965,7 @@
   Token get keyword => _keyword;
 
   /**
-   * Return the label associated with the statement, or `null` if there is no label.
+   * Return the label associated with the statement, or {@code null} if there is no label.
    * @return the label associated with the statement
    */
   SimpleIdentifier get label => _label;
@@ -4004,7 +4004,7 @@
   }
 }
 /**
- * The abstract class `Declaration` defines the behavior common to nodes that represent the
+ * The abstract class {@code Declaration} defines the behavior common to nodes that represent the
  * declaration of a name. Each declared name is visible within a name scope.
  * @coverage dart.engine.ast
  */
@@ -4026,30 +4026,30 @@
   Declaration({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
 
   /**
-   * Return the element associated with this declaration, or `null` if either this node
+   * Return the element associated with this declaration, or {@code null} if either this node
    * corresponds to a list of declarations or if the AST structure has not been resolved.
    * @return the element associated with this declaration
    */
   Element get element;
 }
 /**
- * Instances of the class `DeclaredIdentifier` represent the declaration of a single
+ * Instances of the class {@code DeclaredIdentifier} represent the declaration of a single
  * identifier.
  * <pre>
  * declaredIdentifier ::=
- * ([Annotation metadata] finalConstVarOrType [SimpleIdentifier identifier]</pre>
+ * ({@link Annotation metadata} finalConstVarOrType {@link SimpleIdentifier identifier}</pre>
  * @coverage dart.engine.ast
  */
 class DeclaredIdentifier extends Declaration {
 
   /**
-   * The token representing either the 'final', 'const' or 'var' keyword, or `null` if no
+   * The token representing either the 'final', 'const' or 'var' keyword, or {@code null} if no
    * keyword was used.
    */
   Token _keyword;
 
   /**
-   * The name of the declared type of the parameter, or `null` if the parameter does not have
+   * The name of the declared type of the parameter, or {@code null} if the parameter does not have
    * a declared type.
    */
   TypeName _type;
@@ -4105,25 +4105,25 @@
   Token get keyword => _keyword;
 
   /**
-   * Return the name of the declared type of the parameter, or `null` if the parameter does
+   * Return the name of the declared type of the parameter, or {@code null} if the parameter does
    * not have a declared type.
    * @return the name of the declared type of the parameter
    */
   TypeName get type => _type;
 
   /**
-   * Return `true` if this variable was declared with the 'const' modifier.
-   * @return `true` if this variable was declared with the 'const' modifier
+   * Return {@code true} if this variable was declared with the 'const' modifier.
+   * @return {@code true} if this variable was declared with the 'const' modifier
    */
-  bool get isConst => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
+  bool isConst() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
 
   /**
-   * Return `true` if this variable was declared with the 'final' modifier. Variables that are
-   * declared with the 'const' modifier will return `false` even though they are implicitly
+   * Return {@code true} if this variable was declared with the 'final' modifier. Variables that are
+   * declared with the 'const' modifier will return {@code false} even though they are implicitly
    * final.
-   * @return `true` if this variable was declared with the 'final' modifier
+   * @return {@code true} if this variable was declared with the 'final' modifier
    */
-  bool get isFinal => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
+  bool isFinal() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
 
   /**
    * Set the token representing either the 'final', 'const' or 'var' keyword to the given token.
@@ -4155,12 +4155,12 @@
   }
 }
 /**
- * Instances of the class `DefaultFormalParameter` represent a formal parameter with a default
+ * Instances of the class {@code DefaultFormalParameter} represent a formal parameter with a default
  * value. There are two kinds of parameters that are both represented by this class: named formal
  * parameters and positional formal parameters.
  * <pre>
- * defaultFormalParameter ::=[NormalFormalParameter normalFormalParameter] ('=' [Expression defaultValue])?
- * defaultNamedParameter ::=[NormalFormalParameter normalFormalParameter] (':' [Expression defaultValue])?
+ * defaultFormalParameter ::={@link NormalFormalParameter normalFormalParameter} ('=' {@link Expression defaultValue})?
+ * defaultNamedParameter ::={@link NormalFormalParameter normalFormalParameter} (':' {@link Expression defaultValue})?
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -4177,13 +4177,13 @@
   ParameterKind _kind;
 
   /**
-   * The token separating the parameter from the default value, or `null` if there is no
+   * The token separating the parameter from the default value, or {@code null} if there is no
    * default value.
    */
   Token _separator;
 
   /**
-   * The expression computing the default value for the parameter, or `null` if there is no
+   * The expression computing the default value for the parameter, or {@code null} if there is no
    * default value.
    */
   Expression _defaultValue;
@@ -4214,7 +4214,7 @@
   Token get beginToken => _parameter.beginToken;
 
   /**
-   * Return the expression computing the default value for the parameter, or `null` if there
+   * Return the expression computing the default value for the parameter, or {@code null} if there
    * is no default value.
    * @return the expression computing the default value for the parameter
    */
@@ -4235,25 +4235,25 @@
   NormalFormalParameter get parameter => _parameter;
 
   /**
-   * Return the token separating the parameter from the default value, or `null` if there is
+   * Return the token separating the parameter from the default value, or {@code null} if there is
    * no default value.
    * @return the token separating the parameter from the default value
    */
   Token get separator => _separator;
 
   /**
-   * Return `true` if this parameter was declared with the 'const' modifier.
-   * @return `true` if this parameter was declared with the 'const' modifier
+   * Return {@code true} if this parameter was declared with the 'const' modifier.
+   * @return {@code true} if this parameter was declared with the 'const' modifier
    */
-  bool get isConst => _parameter != null && _parameter.isConst;
+  bool isConst() => _parameter != null && _parameter.isConst();
 
   /**
-   * Return `true` if this parameter was declared with the 'final' modifier. Parameters that
-   * are declared with the 'const' modifier will return `false` even though they are
+   * Return {@code true} if this parameter was declared with the 'final' modifier. Parameters that
+   * are declared with the 'const' modifier will return {@code false} even though they are
    * implicitly final.
-   * @return `true` if this parameter was declared with the 'final' modifier
+   * @return {@code true} if this parameter was declared with the 'final' modifier
    */
-  bool get isFinal => _parameter != null && _parameter.isFinal;
+  bool isFinal() => _parameter != null && _parameter.isFinal();
 
   /**
    * Set the expression computing the default value for the parameter to the given expression.
@@ -4292,16 +4292,16 @@
   }
 }
 /**
- * The abstract class `Directive` defines the behavior common to nodes that represent a
+ * The abstract class {@code Directive} defines the behavior common to nodes that represent a
  * directive.
  * <pre>
- * directive ::=[ExportDirective exportDirective]| [ImportDirective importDirective]| [LibraryDirective libraryDirective]| [PartDirective partDirective]| [PartOfDirective partOfDirective]</pre>
+ * directive ::={@link ExportDirective exportDirective}| {@link ImportDirective importDirective}| {@link LibraryDirective libraryDirective}| {@link PartDirective partDirective}| {@link PartOfDirective partOfDirective}</pre>
  * @coverage dart.engine.ast
  */
 abstract class Directive extends AnnotatedNode {
 
   /**
-   * The element associated with this directive, or `null` if the AST structure has not been
+   * The element associated with this directive, or {@code null} if the AST structure has not been
    * resolved or if this directive could not be resolved.
    */
   Element _element;
@@ -4322,7 +4322,7 @@
   Directive({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
 
   /**
-   * Return the element associated with this directive, or `null` if the AST structure has not
+   * Return the element associated with this directive, or {@code null} if the AST structure has not
    * been resolved or if this directive could not be resolved. Examples of the latter case include a
    * directive that contains an invalid URL or a URL that does not exist.
    * @return the element associated with this directive
@@ -4345,10 +4345,10 @@
   }
 }
 /**
- * Instances of the class `DoStatement` represent a do statement.
+ * Instances of the class {@code DoStatement} represent a do statement.
  * <pre>
  * doStatement ::=
- * 'do' [Statement body] 'while' '(' [Expression condition] ')' ';'
+ * 'do' {@link Statement body} 'while' '(' {@link Expression condition} ')' ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -4527,7 +4527,7 @@
   }
 }
 /**
- * Instances of the class `DoubleLiteral` represent a floating point literal expression.
+ * Instances of the class {@code DoubleLiteral} represent a floating point literal expression.
  * <pre>
  * doubleLiteral ::=
  * decimalDigit+ ('.' decimalDigit*)? exponent?
@@ -4600,7 +4600,7 @@
   }
 }
 /**
- * Instances of the class `EmptyFunctionBody` represent an empty function body, which can only
+ * Instances of the class {@code EmptyFunctionBody} represent an empty function body, which can only
  * appear in constructors or abstract methods.
  * <pre>
  * emptyFunctionBody ::=
@@ -4650,7 +4650,7 @@
   }
 }
 /**
- * Instances of the class `EmptyStatement` represent an empty statement.
+ * Instances of the class {@code EmptyStatement} represent an empty statement.
  * <pre>
  * emptyStatement ::=
  * ';'
@@ -4708,9 +4708,9 @@
   EphemeralIdentifier({ASTNode parent, int location}) : this.full(parent, location);
 }
 /**
- * Instances of the class `ExportDirective` represent an export directive.
+ * Instances of the class {@code ExportDirective} represent an export directive.
  * <pre>
- * exportDirective ::=[Annotation metadata] 'export' [StringLiteral libraryUri] [Combinator combinator]* ';'
+ * exportDirective ::={@link Annotation metadata} 'export' {@link StringLiteral libraryUri} {@link Combinator combinator}* ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -4752,22 +4752,22 @@
   }
 }
 /**
- * Instances of the class `Expression` defines the behavior common to nodes that represent an
+ * Instances of the class {@code Expression} defines the behavior common to nodes that represent an
  * expression.
  * <pre>
- * expression ::=[AssignmentExpression assignmentExpression]| [ConditionalExpression conditionalExpression] cascadeSection
- * | [ThrowExpression throwExpression]</pre>
+ * expression ::={@link AssignmentExpression assignmentExpression}| {@link ConditionalExpression conditionalExpression} cascadeSection
+ * | {@link ThrowExpression throwExpression}</pre>
  * @coverage dart.engine.ast
  */
 abstract class Expression extends ASTNode {
 
   /**
-   * The static type of this expression, or `null` if the AST structure has not been resolved.
+   * The static type of this expression, or {@code null} if the AST structure has not been resolved.
    */
   Type2 _staticType;
 
   /**
-   * The propagated type of this expression, or `null` if type propagation has not been
+   * The propagated type of this expression, or {@code null} if type propagation has not been
    * performed on the AST structure.
    */
   Type2 _propagatedType;
@@ -4777,7 +4777,7 @@
    * and the function being invoked is known based on propagated type information, and this
    * expression corresponds to one of the parameters of the function being invoked, then return the
    * parameter element representing the parameter to which the value of this expression will be
-   * bound. Otherwise, return `null`.
+   * bound. Otherwise, return {@code null}.
    * @return the parameter element representing the parameter to which the value of this expression
    * will be bound
    */
@@ -4804,7 +4804,7 @@
   }
 
   /**
-   * Return the propagated type of this expression, or `null` if type propagation has not been
+   * Return the propagated type of this expression, or {@code null} if type propagation has not been
    * performed on the AST structure.
    * @return the propagated type of this expression
    */
@@ -4815,7 +4815,7 @@
    * and the function being invoked is known based on static type information, and this expression
    * corresponds to one of the parameters of the function being invoked, then return the parameter
    * element representing the parameter to which the value of this expression will be bound.
-   * Otherwise, return `null`.
+   * Otherwise, return {@code null}.
    * @return the parameter element representing the parameter to which the value of this expression
    * will be bound
    */
@@ -4842,17 +4842,17 @@
   }
 
   /**
-   * Return the static type of this expression, or `null` if the AST structure has not been
+   * Return the static type of this expression, or {@code null} if the AST structure has not been
    * resolved.
    * @return the static type of this expression
    */
   Type2 get staticType => _staticType;
 
   /**
-   * Return `true` if this expression is syntactically valid for the LHS of an[AssignmentExpression assignment expression].
-   * @return `true` if this expression matches the `assignableExpression` production
+   * Return {@code true} if this expression is syntactically valid for the LHS of an{@link AssignmentExpression assignment expression}.
+   * @return {@code true} if this expression matches the {@code assignableExpression} production
    */
-  bool get isAssignable => false;
+  bool isAssignable() => false;
 
   /**
    * Set the propagated type of this expression to the given type.
@@ -4871,11 +4871,11 @@
   }
 }
 /**
- * Instances of the class `ExpressionFunctionBody` represent a function body consisting of a
+ * Instances of the class {@code ExpressionFunctionBody} represent a function body consisting of a
  * single expression.
  * <pre>
  * expressionFunctionBody ::=
- * '=>' [Expression expression] ';'
+ * '=>' {@link Expression expression} ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -4973,9 +4973,9 @@
   }
 }
 /**
- * Instances of the class `ExpressionStatement` wrap an expression as a statement.
+ * Instances of the class {@code ExpressionStatement} wrap an expression as a statement.
  * <pre>
- * expressionStatement ::=[Expression expression]? ';'
+ * expressionStatement ::={@link Expression expression}? ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -4987,7 +4987,7 @@
   Expression _expression;
 
   /**
-   * The semicolon terminating the statement, or `null` if the expression is a function
+   * The semicolon terminating the statement, or {@code null} if the expression is a function
    * expression and isn't followed by a semicolon.
    */
   Token _semicolon;
@@ -5028,7 +5028,7 @@
    * @return the semicolon terminating the statement
    */
   Token get semicolon => _semicolon;
-  bool get isSynthetic => _expression.isSynthetic && _semicolon.isSynthetic;
+  bool isSynthetic() => _expression.isSynthetic() && _semicolon.isSynthetic();
 
   /**
    * Set the expression that comprises the statement to the given expression.
@@ -5050,11 +5050,11 @@
   }
 }
 /**
- * Instances of the class `ExtendsClause` represent the "extends" clause in a class
+ * Instances of the class {@code ExtendsClause} represent the "extends" clause in a class
  * declaration.
  * <pre>
  * extendsClause ::=
- * 'extends' [TypeName superclass]</pre>
+ * 'extends' {@link TypeName superclass}</pre>
  * @coverage dart.engine.ast
  */
 class ExtendsClause extends ASTNode {
@@ -5121,18 +5121,18 @@
   }
 }
 /**
- * Instances of the class `FieldDeclaration` represent the declaration of one or more fields
+ * Instances of the class {@code FieldDeclaration} represent the declaration of one or more fields
  * of the same type.
  * <pre>
  * fieldDeclaration ::=
- * 'static'? [VariableDeclarationList fieldList] ';'
+ * 'static'? {@link VariableDeclarationList fieldList} ';'
  * </pre>
  * @coverage dart.engine.ast
  */
 class FieldDeclaration extends ClassMember {
 
   /**
-   * The token representing the 'static' keyword, or `null` if the fields are not static.
+   * The token representing the 'static' keyword, or {@code null} if the fields are not static.
    */
   Token _keyword;
 
@@ -5180,7 +5180,7 @@
   VariableDeclarationList get fields => _fieldList;
 
   /**
-   * Return the token representing the 'static' keyword, or `null` if the fields are not
+   * Return the token representing the 'static' keyword, or {@code null} if the fields are not
    * static.
    * @return the token representing the 'static' keyword
    */
@@ -5193,10 +5193,10 @@
   Token get semicolon => _semicolon;
 
   /**
-   * Return `true` if the fields are static.
-   * @return `true` if the fields are declared to be static
+   * Return {@code true} if the fields are static.
+   * @return {@code true} if the fields are declared to be static
    */
-  bool get isStatic => _keyword != null;
+  bool isStatic() => _keyword != null;
 
   /**
    * Set the fields being declared to the given list of variables.
@@ -5233,22 +5233,22 @@
   }
 }
 /**
- * Instances of the class `FieldFormalParameter` represent a field formal parameter.
+ * Instances of the class {@code FieldFormalParameter} represent a field formal parameter.
  * <pre>
  * fieldFormalParameter ::=
- * ('final' [TypeName type] | 'const' [TypeName type] | 'var' | [TypeName type])? 'this' '.' [SimpleIdentifier identifier]</pre>
+ * ('final' {@link TypeName type} | 'const' {@link TypeName type} | 'var' | {@link TypeName type})? 'this' '.' {@link SimpleIdentifier identifier}</pre>
  * @coverage dart.engine.ast
  */
 class FieldFormalParameter extends NormalFormalParameter {
 
   /**
-   * The token representing either the 'final', 'const' or 'var' keyword, or `null` if no
+   * The token representing either the 'final', 'const' or 'var' keyword, or {@code null} if no
    * keyword was used.
    */
   Token _keyword;
 
   /**
-   * The name of the declared type of the parameter, or `null` if the parameter does not have
+   * The name of the declared type of the parameter, or {@code null} if the parameter does not have
    * a declared type.
    */
   TypeName _type;
@@ -5321,13 +5321,13 @@
   Token get thisToken => _thisToken;
 
   /**
-   * Return the name of the declared type of the parameter, or `null` if the parameter does
+   * Return the name of the declared type of the parameter, or {@code null} if the parameter does
    * not have a declared type.
    * @return the name of the declared type of the parameter
    */
   TypeName get type => _type;
-  bool get isConst => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
-  bool get isFinal => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
+  bool isConst() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
+  bool isFinal() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
 
   /**
    * Set the token representing either the 'final', 'const' or 'var' keyword to the given token.
@@ -5367,10 +5367,10 @@
   }
 }
 /**
- * Instances of the class `ForEachStatement` represent a for-each statement.
+ * Instances of the class {@code ForEachStatement} represent a for-each statement.
  * <pre>
  * forEachStatement ::=
- * 'for' '(' [SimpleFormalParameter loopParameter] 'in' [Expression iterator] ')' [Block body]</pre>
+ * 'for' '(' {@link SimpleFormalParameter loopParameter} 'in' {@link Expression iterator} ')' {@link Block body}</pre>
  * @coverage dart.engine.ast
  */
 class ForEachStatement extends Statement {
@@ -5547,12 +5547,12 @@
   }
 }
 /**
- * Instances of the class `ForStatement` represent a for statement.
+ * Instances of the class {@code ForStatement} represent a for statement.
  * <pre>
  * forStatement ::=
- * 'for' '(' forLoopParts ')' [Statement statement]forLoopParts ::=
- * forInitializerStatement ';' [Expression expression]? ';' [Expression expressionList]?
- * forInitializerStatement ::=[DefaultFormalParameter initializedVariableDeclaration]| [Expression expression]?
+ * 'for' '(' forLoopParts ')' {@link Statement statement}forLoopParts ::=
+ * forInitializerStatement ';' {@link Expression expression}? ';' {@link Expression expressionList}?
+ * forInitializerStatement ::={@link DefaultFormalParameter initializedVariableDeclaration}| {@link Expression expression}?
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -5569,14 +5569,14 @@
   Token _leftParenthesis;
 
   /**
-   * The declaration of the loop variables, or `null` if there are no variables. Note that a
+   * The declaration of the loop variables, or {@code null} if there are no variables. Note that a
    * for statement cannot have both a variable list and an initialization expression, but can
    * validly have neither.
    */
   VariableDeclarationList _variableList;
 
   /**
-   * The initialization expression, or `null` if there is no initialization expression. Note
+   * The initialization expression, or {@code null} if there is no initialization expression. Note
    * that a for statement cannot have both a variable list and an initialization expression, but can
    * validly have neither.
    */
@@ -5676,7 +5676,7 @@
   Token get forKeyword => _forKeyword;
 
   /**
-   * Return the initialization expression, or `null` if there is no initialization expression.
+   * Return the initialization expression, or {@code null} if there is no initialization expression.
    * @return the initialization expression
    */
   Expression get initialization => _initialization;
@@ -5712,8 +5712,8 @@
   NodeList<Expression> get updaters => _updaters;
 
   /**
-   * Return the declaration of the loop variables, or `null` if there are no variables.
-   * @return the declaration of the loop variables, or `null` if there are no variables
+   * Return the declaration of the loop variables, or {@code null} if there are no variables.
+   * @return the declaration of the loop variables, or {@code null} if there are no variables
    */
   VariableDeclarationList get variables => _variableList;
 
@@ -5797,16 +5797,16 @@
   }
 }
 /**
- * The abstract class `FormalParameter` defines the behavior of objects representing a
+ * The abstract class {@code FormalParameter} defines the behavior of objects representing a
  * parameter to a function.
  * <pre>
- * formalParameter ::=[NormalFormalParameter normalFormalParameter]| [DefaultFormalParameter namedFormalParameter]| [DefaultFormalParameter optionalFormalParameter]</pre>
+ * formalParameter ::={@link NormalFormalParameter normalFormalParameter}| {@link DefaultFormalParameter namedFormalParameter}| {@link DefaultFormalParameter optionalFormalParameter}</pre>
  * @coverage dart.engine.ast
  */
 abstract class FormalParameter extends ASTNode {
 
   /**
-   * Return the element representing this parameter, or `null` if this parameter has not been
+   * Return the element representing this parameter, or {@code null} if this parameter has not been
    * resolved.
    * @return the element representing this parameter
    */
@@ -5831,9 +5831,9 @@
   ParameterKind get kind;
 }
 /**
- * Instances of the class `FormalParameterList` represent the formal parameter list of a
+ * Instances of the class {@code FormalParameterList} represent the formal parameter list of a
  * method declaration, function declaration, or function type alias.
- *
+ * <p>
  * While the grammar requires all optional formal parameters to follow all of the normal formal
  * parameters and at most one grouping of optional formal parameters, this class does not enforce
  * those constraints. All parameters are flattened into a single list, which can have any or all
@@ -5843,14 +5843,14 @@
  * '(' ')'
  * | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
  * | '(' optionalFormalParameters ')'
- * normalFormalParameters ::=[NormalFormalParameter normalFormalParameter] (',' [NormalFormalParameter normalFormalParameter])
+ * normalFormalParameters ::={@link NormalFormalParameter normalFormalParameter} (',' {@link NormalFormalParameter normalFormalParameter})
  * optionalFormalParameters ::=
  * optionalPositionalFormalParameters
  * | namedFormalParameters
  * optionalPositionalFormalParameters ::=
- * '\[' [DefaultFormalParameter positionalFormalParameter] (',' [DefaultFormalParameter positionalFormalParameter])* '\]'
+ * '\[' {@link DefaultFormalParameter positionalFormalParameter} (',' {@link DefaultFormalParameter positionalFormalParameter})* '\]'
  * namedFormalParameters ::=
- * '{' [DefaultFormalParameter namedFormalParameter] (',' [DefaultFormalParameter namedFormalParameter])* '}'
+ * '{' {@link DefaultFormalParameter namedFormalParameter} (',' {@link DefaultFormalParameter namedFormalParameter})* '}'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -5912,7 +5912,7 @@
 
   /**
    * Return an array containing the elements representing the parameters in this list. The array
-   * will contain `null`s if the parameters in this list have not been resolved.
+   * will contain {@code null}s if the parameters in this list have not been resolved.
    * @return the elements representing the parameters in this list
    */
   List<ParameterElement> get elements {
@@ -5997,44 +5997,44 @@
   }
 }
 /**
- * The abstract class `FunctionBody` defines the behavior common to objects representing the
+ * The abstract class {@code FunctionBody} defines the behavior common to objects representing the
  * body of a function or method.
  * <pre>
- * functionBody ::=[BlockFunctionBody blockFunctionBody]| [EmptyFunctionBody emptyFunctionBody]| [ExpressionFunctionBody expressionFunctionBody]</pre>
+ * functionBody ::={@link BlockFunctionBody blockFunctionBody}| {@link EmptyFunctionBody emptyFunctionBody}| {@link ExpressionFunctionBody expressionFunctionBody}</pre>
  * @coverage dart.engine.ast
  */
 abstract class FunctionBody extends ASTNode {
 }
 /**
- * Instances of the class `FunctionDeclaration` wrap a [FunctionExpression function
- * expression] as a top-level declaration.
+ * Instances of the class {@code FunctionDeclaration} wrap a {@link FunctionExpression function
+ * expression} as a top-level declaration.
  * <pre>
  * functionDeclaration ::=
  * 'external' functionSignature
- * | functionSignature [FunctionBody functionBody]functionSignature ::=[Type returnType]? ('get' | 'set')? [SimpleIdentifier functionName] [FormalParameterList formalParameterList]</pre>
+ * | functionSignature {@link FunctionBody functionBody}functionSignature ::={@link Type returnType}? ('get' | 'set')? {@link SimpleIdentifier functionName} {@link FormalParameterList formalParameterList}</pre>
  * @coverage dart.engine.ast
  */
 class FunctionDeclaration extends CompilationUnitMember {
 
   /**
-   * The token representing the 'external' keyword, or `null` if this is not an external
+   * The token representing the 'external' keyword, or {@code null} if this is not an external
    * function.
    */
   Token _externalKeyword;
 
   /**
-   * The return type of the function, or `null` if no return type was declared.
+   * The return type of the function, or {@code null} if no return type was declared.
    */
   TypeName _returnType;
 
   /**
-   * The token representing the 'get' or 'set' keyword, or `null` if this is a function
+   * The token representing the 'get' or 'set' keyword, or {@code null} if this is a function
    * declaration rather than a property declaration.
    */
   Token _propertyKeyword;
 
   /**
-   * The name of the function, or `null` if the function is not named.
+   * The name of the function, or {@code null} if the function is not named.
    */
   SimpleIdentifier _name;
 
@@ -6077,7 +6077,7 @@
   Token get endToken => _functionExpression.endToken;
 
   /**
-   * Return the token representing the 'external' keyword, or `null` if this is not an
+   * Return the token representing the 'external' keyword, or {@code null} if this is not an
    * external function.
    * @return the token representing the 'external' keyword
    */
@@ -6090,35 +6090,35 @@
   FunctionExpression get functionExpression => _functionExpression;
 
   /**
-   * Return the name of the function, or `null` if the function is not named.
+   * Return the name of the function, or {@code null} if the function is not named.
    * @return the name of the function
    */
   SimpleIdentifier get name => _name;
 
   /**
-   * Return the token representing the 'get' or 'set' keyword, or `null` if this is a function
+   * Return the token representing the 'get' or 'set' keyword, or {@code null} if this is a function
    * declaration rather than a property declaration.
    * @return the token representing the 'get' or 'set' keyword
    */
   Token get propertyKeyword => _propertyKeyword;
 
   /**
-   * Return the return type of the function, or `null` if no return type was declared.
+   * Return the return type of the function, or {@code null} if no return type was declared.
    * @return the return type of the function
    */
   TypeName get returnType => _returnType;
 
   /**
-   * Return `true` if this function declares a getter.
-   * @return `true` if this function declares a getter
+   * Return {@code true} if this function declares a getter.
+   * @return {@code true} if this function declares a getter
    */
-  bool get isGetter => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.GET);
+  bool isGetter() => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.GET);
 
   /**
-   * Return `true` if this function declares a setter.
-   * @return `true` if this function declares a setter
+   * Return {@code true} if this function declares a setter.
+   * @return {@code true} if this function declares a setter
    */
-  bool get isSetter => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.SET);
+  bool isSetter() => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.SET);
 
   /**
    * Set the token representing the 'external' keyword to the given token.
@@ -6180,7 +6180,7 @@
   }
 }
 /**
- * Instances of the class `FunctionDeclarationStatement` wrap a [FunctionDeclarationfunction declaration] as a statement.
+ * Instances of the class {@code FunctionDeclarationStatement} wrap a {@link FunctionDeclarationfunction declaration} as a statement.
  * @coverage dart.engine.ast
  */
 class FunctionDeclarationStatement extends Statement {
@@ -6225,9 +6225,9 @@
   }
 }
 /**
- * Instances of the class `FunctionExpression` represent a function expression.
+ * Instances of the class {@code FunctionExpression} represent a function expression.
  * <pre>
- * functionExpression ::=[FormalParameterList formalParameterList] [FunctionBody functionBody]</pre>
+ * functionExpression ::={@link FormalParameterList formalParameterList} {@link FunctionBody functionBody}</pre>
  * @coverage dart.engine.ast
  */
 class FunctionExpression extends Expression {
@@ -6238,12 +6238,12 @@
   FormalParameterList _parameters;
 
   /**
-   * The body of the function, or `null` if this is an external function.
+   * The body of the function, or {@code null} if this is an external function.
    */
   FunctionBody _body;
 
   /**
-   * The element associated with the function, or `null` if the AST structure has not been
+   * The element associated with the function, or {@code null} if the AST structure has not been
    * resolved.
    */
   ExecutableElement _element;
@@ -6275,13 +6275,13 @@
   }
 
   /**
-   * Return the body of the function, or `null` if this is an external function.
+   * Return the body of the function, or {@code null} if this is an external function.
    * @return the body of the function
    */
   FunctionBody get body => _body;
 
   /**
-   * Return the element associated with this function, or `null` if the AST structure has not
+   * Return the element associated with this function, or {@code null} if the AST structure has not
    * been resolved.
    * @return the element associated with this function
    */
@@ -6330,12 +6330,12 @@
   }
 }
 /**
- * Instances of the class `FunctionExpressionInvocation` represent the invocation of a
+ * Instances of the class {@code FunctionExpressionInvocation} represent the invocation of a
  * function resulting from evaluating an expression. Invocations of methods and other forms of
- * functions are represented by [MethodInvocation method invocation] nodes. Invocations of
- * getters and setters are represented by either [PrefixedIdentifier prefixed identifier] or[PropertyAccess property access] nodes.
+ * functions are represented by {@link MethodInvocation method invocation} nodes. Invocations of
+ * getters and setters are represented by either {@link PrefixedIdentifier prefixed identifier} or{@link PropertyAccess property access} nodes.
  * <pre>
- * functionExpressionInvoction ::=[Expression function] [ArgumentList argumentList]</pre>
+ * functionExpressionInvoction ::={@link Expression function} {@link ArgumentList argumentList}</pre>
  * @coverage dart.engine.ast
  */
 class FunctionExpressionInvocation extends Expression {
@@ -6351,12 +6351,12 @@
   ArgumentList _argumentList;
 
   /**
-   * The element associated with the function being invoked based on static type information, or`null` if the AST structure has not been resolved or the function could not be resolved.
+   * The element associated with the function being invoked based on static type information, or{@code null} if the AST structure has not been resolved or the function could not be resolved.
    */
   ExecutableElement _staticElement;
 
   /**
-   * The element associated with the function being invoked based on propagated type information, or`null` if the AST structure has not been resolved or the function could not be resolved.
+   * The element associated with the function being invoked based on propagated type information, or{@code null} if the AST structure has not been resolved or the function could not be resolved.
    */
   ExecutableElement _propagatedElement;
 
@@ -6387,7 +6387,7 @@
 
   /**
    * Return the element associated with the function being invoked based on propagated type
-   * information, or `null` if the AST structure has not been resolved or the function could
+   * information, or {@code null} if the AST structure has not been resolved or the function could
    * not be resolved. One common example of the latter case is an expression whose value can change
    * over time.
    * @return the element associated with the function being invoked
@@ -6403,7 +6403,7 @@
 
   /**
    * Return the element associated with the function being invoked based on static type information,
-   * or `null` if the AST structure has not been resolved or the function could not be
+   * or {@code null} if the AST structure has not been resolved or the function could not be
    * resolved. One common example of the latter case is an expression whose value can change over
    * time.
    * @return the element associated with the function
@@ -6449,17 +6449,17 @@
   }
 }
 /**
- * Instances of the class `FunctionTypeAlias` represent a function type alias.
+ * Instances of the class {@code FunctionTypeAlias} represent a function type alias.
  * <pre>
  * functionTypeAlias ::=
- * functionPrefix [TypeParameterList typeParameterList]? [FormalParameterList formalParameterList] ';'
- * functionPrefix ::=[TypeName returnType]? [SimpleIdentifier name]</pre>
+ * functionPrefix {@link TypeParameterList typeParameterList}? {@link FormalParameterList formalParameterList} ';'
+ * functionPrefix ::={@link TypeName returnType}? {@link SimpleIdentifier name}</pre>
  * @coverage dart.engine.ast
  */
 class FunctionTypeAlias extends TypeAlias {
 
   /**
-   * The name of the return type of the function type being defined, or `null` if no return
+   * The name of the return type of the function type being defined, or {@code null} if no return
    * type was given.
    */
   TypeName _returnType;
@@ -6470,7 +6470,7 @@
   SimpleIdentifier _name;
 
   /**
-   * The type parameters for the function type, or `null` if the function type does not have
+   * The type parameters for the function type, or {@code null} if the function type does not have
    * any type parameters.
    */
   TypeParameterList _typeParameters;
@@ -6526,14 +6526,14 @@
   FormalParameterList get parameters => _parameters;
 
   /**
-   * Return the name of the return type of the function type being defined, or `null` if no
+   * Return the name of the return type of the function type being defined, or {@code null} if no
    * return type was given.
    * @return the name of the return type of the function type being defined
    */
   TypeName get returnType => _returnType;
 
   /**
-   * Return the type parameters for the function type, or `null` if the function type does not
+   * Return the type parameters for the function type, or {@code null} if the function type does not
    * have any type parameters.
    * @return the type parameters for the function type
    */
@@ -6579,16 +6579,16 @@
   }
 }
 /**
- * Instances of the class `FunctionTypedFormalParameter` represent a function-typed formal
+ * Instances of the class {@code FunctionTypedFormalParameter} represent a function-typed formal
  * parameter.
  * <pre>
- * functionSignature ::=[TypeName returnType]? [SimpleIdentifier identifier] [FormalParameterList formalParameterList]</pre>
+ * functionSignature ::={@link TypeName returnType}? {@link SimpleIdentifier identifier} {@link FormalParameterList formalParameterList}</pre>
  * @coverage dart.engine.ast
  */
 class FunctionTypedFormalParameter extends NormalFormalParameter {
 
   /**
-   * The return type of the function, or `null` if the function does not have a return type.
+   * The return type of the function, or {@code null} if the function does not have a return type.
    */
   TypeName _returnType;
 
@@ -6601,7 +6601,7 @@
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
    * @param metadata the annotations associated with this parameter
-   * @param returnType the return type of the function, or `null` if the function does not
+   * @param returnType the return type of the function, or {@code null} if the function does not
    * have a return type
    * @param identifier the name of the function-typed parameter
    * @param parameters the parameters of the function-typed parameter
@@ -6615,7 +6615,7 @@
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
    * @param metadata the annotations associated with this parameter
-   * @param returnType the return type of the function, or `null` if the function does not
+   * @param returnType the return type of the function, or {@code null} if the function does not
    * have a return type
    * @param identifier the name of the function-typed parameter
    * @param parameters the parameters of the function-typed parameter
@@ -6637,13 +6637,13 @@
   FormalParameterList get parameters => _parameters;
 
   /**
-   * Return the return type of the function, or `null` if the function does not have a return
+   * Return the return type of the function, or {@code null} if the function does not have a return
    * type.
    * @return the return type of the function
    */
   TypeName get returnType => _returnType;
-  bool get isConst => false;
-  bool get isFinal => false;
+  bool isConst() => false;
+  bool isFinal() => false;
 
   /**
    * Set the parameters of the function-typed parameter to the given parameters.
@@ -6668,11 +6668,11 @@
   }
 }
 /**
- * Instances of the class `HideCombinator` represent a combinator that restricts the names
+ * Instances of the class {@code HideCombinator} represent a combinator that restricts the names
  * being imported to those that are not in a given list.
  * <pre>
  * hideCombinator ::=
- * 'hide' [SimpleIdentifier identifier] (',' [SimpleIdentifier identifier])
+ * 'hide' {@link SimpleIdentifier identifier} (',' {@link SimpleIdentifier identifier})
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -6712,24 +6712,24 @@
   }
 }
 /**
- * The abstract class `Identifier` defines the behavior common to nodes that represent an
+ * The abstract class {@code Identifier} defines the behavior common to nodes that represent an
  * identifier.
  * <pre>
- * identifier ::=[SimpleIdentifier simpleIdentifier]| [PrefixedIdentifier prefixedIdentifier]</pre>
+ * identifier ::={@link SimpleIdentifier simpleIdentifier}| {@link PrefixedIdentifier prefixedIdentifier}</pre>
  * @coverage dart.engine.ast
  */
 abstract class Identifier extends Expression {
 
   /**
-   * Return `true` if the given name is visible only within the library in which it is
+   * Return {@code true} if the given name is visible only within the library in which it is
    * declared.
    * @param name the name being tested
-   * @return `true` if the given name is private
+   * @return {@code true} if the given name is private
    */
   static bool isPrivateName(String name) => name.startsWith("_");
 
   /**
-   * Return the element associated with this identifier based on propagated type information, or`null` if the AST structure has not been resolved or if this identifier could not be
+   * Return the element associated with this identifier based on propagated type information, or{@code null} if the AST structure has not been resolved or if this identifier could not be
    * resolved. One example of the latter case is an identifier that is not defined within the scope
    * in which it appears.
    * @return the element associated with this identifier
@@ -6743,19 +6743,19 @@
   String get name;
 
   /**
-   * Return the element associated with this identifier based on static type information, or`null` if the AST structure has not been resolved or if this identifier could not be
+   * Return the element associated with this identifier based on static type information, or{@code null} if the AST structure has not been resolved or if this identifier could not be
    * resolved. One example of the latter case is an identifier that is not defined within the scope
    * in which it appears
    * @return the element associated with the operator
    */
   Element get staticElement;
-  bool get isAssignable => true;
+  bool isAssignable() => true;
 }
 /**
- * Instances of the class `IfStatement` represent an if statement.
+ * Instances of the class {@code IfStatement} represent an if statement.
  * <pre>
  * ifStatement ::=
- * 'if' '(' [Expression expression] ')' [Statement thenStatement] ('else' [Statement elseStatement])?
+ * 'if' '(' {@link Expression expression} ')' {@link Statement thenStatement} ('else' {@link Statement elseStatement})?
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -6782,7 +6782,7 @@
   Token _rightParenthesis;
 
   /**
-   * The statement that is executed if the condition evaluates to `true`.
+   * The statement that is executed if the condition evaluates to {@code true}.
    */
   Statement _thenStatement;
 
@@ -6792,7 +6792,7 @@
   Token _elseKeyword;
 
   /**
-   * The statement that is executed if the condition evaluates to `false`, or `null` if
+   * The statement that is executed if the condition evaluates to {@code false}, or {@code null} if
    * there is no else statement.
    */
   Statement _elseStatement;
@@ -6803,9 +6803,9 @@
    * @param leftParenthesis the left parenthesis
    * @param condition the condition used to determine which of the statements is executed next
    * @param rightParenthesis the right parenthesis
-   * @param thenStatement the statement that is executed if the condition evaluates to `true`
+   * @param thenStatement the statement that is executed if the condition evaluates to {@code true}
    * @param elseKeyword the token representing the 'else' keyword
-   * @param elseStatement the statement that is executed if the condition evaluates to `false`
+   * @param elseStatement the statement that is executed if the condition evaluates to {@code false}
    */
   IfStatement.full(Token ifKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement thenStatement, Token elseKeyword, Statement elseStatement) {
     this._ifKeyword = ifKeyword;
@@ -6823,9 +6823,9 @@
    * @param leftParenthesis the left parenthesis
    * @param condition the condition used to determine which of the statements is executed next
    * @param rightParenthesis the right parenthesis
-   * @param thenStatement the statement that is executed if the condition evaluates to `true`
+   * @param thenStatement the statement that is executed if the condition evaluates to {@code true}
    * @param elseKeyword the token representing the 'else' keyword
-   * @param elseStatement the statement that is executed if the condition evaluates to `false`
+   * @param elseStatement the statement that is executed if the condition evaluates to {@code false}
    */
   IfStatement({Token ifKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement thenStatement, Token elseKeyword, Statement elseStatement}) : this.full(ifKeyword, leftParenthesis, condition, rightParenthesis, thenStatement, elseKeyword, elseStatement);
   accept(ASTVisitor visitor) => visitor.visitIfStatement(this);
@@ -6844,8 +6844,8 @@
   Token get elseKeyword => _elseKeyword;
 
   /**
-   * Return the statement that is executed if the condition evaluates to `false`, or`null` if there is no else statement.
-   * @return the statement that is executed if the condition evaluates to `false`
+   * Return the statement that is executed if the condition evaluates to {@code false}, or{@code null} if there is no else statement.
+   * @return the statement that is executed if the condition evaluates to {@code false}
    */
   Statement get elseStatement => _elseStatement;
   Token get endToken {
@@ -6874,8 +6874,8 @@
   Token get rightParenthesis => _rightParenthesis;
 
   /**
-   * Return the statement that is executed if the condition evaluates to `true`.
-   * @return the statement that is executed if the condition evaluates to `true`
+   * Return the statement that is executed if the condition evaluates to {@code true}.
+   * @return the statement that is executed if the condition evaluates to {@code true}
    */
   Statement get thenStatement => _thenStatement;
 
@@ -6897,9 +6897,9 @@
   }
 
   /**
-   * Set the statement that is executed if the condition evaluates to `false` to the given
+   * Set the statement that is executed if the condition evaluates to {@code false} to the given
    * statement.
-   * @param statement the statement that is executed if the condition evaluates to `false`
+   * @param statement the statement that is executed if the condition evaluates to {@code false}
    */
   void set elseStatement(Statement statement) {
     _elseStatement = becomeParentOf(statement);
@@ -6930,9 +6930,9 @@
   }
 
   /**
-   * Set the statement that is executed if the condition evaluates to `true` to the given
+   * Set the statement that is executed if the condition evaluates to {@code true} to the given
    * statement.
-   * @param statement the statement that is executed if the condition evaluates to `true`
+   * @param statement the statement that is executed if the condition evaluates to {@code true}
    */
   void set thenStatement(Statement statement) {
     _thenStatement = becomeParentOf(statement);
@@ -6944,11 +6944,11 @@
   }
 }
 /**
- * Instances of the class `ImplementsClause` represent the "implements" clause in an class
+ * Instances of the class {@code ImplementsClause} represent the "implements" clause in an class
  * declaration.
  * <pre>
  * implementsClause ::=
- * 'implements' [TypeName superclass] (',' [TypeName superclass])
+ * 'implements' {@link TypeName superclass} (',' {@link TypeName superclass})
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -7009,21 +7009,21 @@
   }
 }
 /**
- * Instances of the class `ImportDirective` represent an import directive.
+ * Instances of the class {@code ImportDirective} represent an import directive.
  * <pre>
- * importDirective ::=[Annotation metadata] 'import' [StringLiteral libraryUri] ('as' identifier)? [Combinator combinator]* ';'
+ * importDirective ::={@link Annotation metadata} 'import' {@link StringLiteral libraryUri} ('as' identifier)? {@link Combinator combinator}* ';'
  * </pre>
  * @coverage dart.engine.ast
  */
 class ImportDirective extends NamespaceDirective {
 
   /**
-   * The token representing the 'as' token, or `null` if the imported names are not prefixed.
+   * The token representing the 'as' token, or {@code null} if the imported names are not prefixed.
    */
   Token _asToken;
 
   /**
-   * The prefix to be used with the imported names, or `null` if the imported names are not
+   * The prefix to be used with the imported names, or {@code null} if the imported names are not
    * prefixed.
    */
   SimpleIdentifier _prefix;
@@ -7059,14 +7059,14 @@
   accept(ASTVisitor visitor) => visitor.visitImportDirective(this);
 
   /**
-   * Return the token representing the 'as' token, or `null` if the imported names are not
+   * Return the token representing the 'as' token, or {@code null} if the imported names are not
    * prefixed.
    * @return the token representing the 'as' token
    */
   Token get asToken => _asToken;
 
   /**
-   * Return the prefix to be used with the imported names, or `null` if the imported names are
+   * Return the prefix to be used with the imported names, or {@code null} if the imported names are
    * not prefixed.
    * @return the prefix to be used with the imported names
    */
@@ -7101,22 +7101,22 @@
   }
 }
 /**
- * Instances of the class `IndexExpression` represent an index expression.
+ * Instances of the class {@code IndexExpression} represent an index expression.
  * <pre>
- * indexExpression ::=[Expression target] '\[' [Expression index] '\]'
+ * indexExpression ::={@link Expression target} '\[' {@link Expression index} '\]'
  * </pre>
  * @coverage dart.engine.ast
  */
 class IndexExpression extends Expression {
 
   /**
-   * The expression used to compute the object being indexed, or `null` if this index
+   * The expression used to compute the object being indexed, or {@code null} if this index
    * expression is part of a cascade expression.
    */
   Expression _target;
 
   /**
-   * The period ("..") before a cascaded index expression, or `null` if this index expression
+   * The period ("..") before a cascaded index expression, or {@code null} if this index expression
    * is not part of a cascade expression.
    */
   Token _period;
@@ -7137,13 +7137,13 @@
   Token _rightBracket;
 
   /**
-   * The element associated with the operator based on the static type of the target, or`null` if the AST structure has not been resolved or if the operator could not be
+   * The element associated with the operator based on the static type of the target, or{@code null} if the AST structure has not been resolved or if the operator could not be
    * resolved.
    */
   MethodElement _staticElement;
 
   /**
-   * The element associated with the operator based on the propagated type of the target, or`null` if the AST structure has not been resolved or if the operator could not be
+   * The element associated with the operator based on the propagated type of the target, or{@code null} if the AST structure has not been resolved or if the operator could not be
    * resolved.
    */
   MethodElement _propagatedElement;
@@ -7202,7 +7202,7 @@
   accept(ASTVisitor visitor) => visitor.visitIndexExpression(this);
 
   /**
-   * Return the expression used to compute the object being indexed, or `null` if this index
+   * Return the expression used to compute the object being indexed, or {@code null} if this index
    * expression is part of a cascade expression.
    * @return the expression used to compute the object being indexed
    * @see #getRealTarget()
@@ -7216,7 +7216,7 @@
   }
 
   /**
-   * Return the element associated with the operator based on the propagated type of the target, or`null` if the AST structure has not been resolved or if the operator could not be
+   * Return the element associated with the operator based on the propagated type of the target, or{@code null} if the AST structure has not been resolved or if the operator could not be
    * resolved. One example of the latter case is an operator that is not defined for the type of the
    * target.
    * @return the element associated with this operator
@@ -7237,7 +7237,7 @@
   Token get leftBracket => _leftBracket;
 
   /**
-   * Return the period ("..") before a cascaded index expression, or `null` if this index
+   * Return the period ("..") before a cascaded index expression, or {@code null} if this index
    * expression is not part of a cascade expression.
    * @return the period ("..") before a cascaded index expression
    */
@@ -7245,14 +7245,14 @@
 
   /**
    * Return the expression used to compute the object being indexed. If this index expression is not
-   * part of a cascade expression, then this is the same as [getArray]. If this index
+   * part of a cascade expression, then this is the same as {@link #getArray()}. If this index
    * expression is part of a cascade expression, then the target expression stored with the cascade
    * expression is returned.
    * @return the expression used to compute the object being indexed
    * @see #getArray()
    */
   Expression get realTarget {
-    if (isCascaded) {
+    if (isCascaded()) {
       ASTNode ancestor = parent;
       while (ancestor is! CascadeExpression) {
         if (ancestor == null) {
@@ -7272,7 +7272,7 @@
   Token get rightBracket => _rightBracket;
 
   /**
-   * Return the element associated with the operator based on the static type of the target, or`null` if the AST structure has not been resolved or if the operator could not be
+   * Return the element associated with the operator based on the static type of the target, or{@code null} if the AST structure has not been resolved or if the operator could not be
    * resolved. One example of the latter case is an operator that is not defined for the type of the
    * target.
    * @return the element associated with the operator
@@ -7280,11 +7280,11 @@
   MethodElement get staticElement => _staticElement;
 
   /**
-   * Return `true` if this expression is computing a right-hand value.
-   *
-   * Note that [inGetterContext] and [inSetterContext] are not opposites, nor are
-   * they mutually exclusive. In other words, it is possible for both methods to return `true`when invoked on the same node.
-   * @return `true` if this expression is in a context where the operator '\[\]' will be invoked
+   * Return {@code true} if this expression is computing a right-hand value.
+   * <p>
+   * Note that {@link #inGetterContext()} and {@link #inSetterContext()} are not opposites, nor are
+   * they mutually exclusive. In other words, it is possible for both methods to return {@code true}when invoked on the same node.
+   * @return {@code true} if this expression is in a context where the operator '\[\]' will be invoked
    */
   bool inGetterContext() {
     ASTNode parent = this.parent;
@@ -7298,17 +7298,17 @@
   }
 
   /**
-   * Return `true` if this expression is computing a left-hand value.
-   *
-   * Note that [inGetterContext] and [inSetterContext] are not opposites, nor are
-   * they mutually exclusive. In other words, it is possible for both methods to return `true`when invoked on the same node.
-   * @return `true` if this expression is in a context where the operator '\[\]=' will be
+   * Return {@code true} if this expression is computing a left-hand value.
+   * <p>
+   * Note that {@link #inGetterContext()} and {@link #inSetterContext()} are not opposites, nor are
+   * they mutually exclusive. In other words, it is possible for both methods to return {@code true}when invoked on the same node.
+   * @return {@code true} if this expression is in a context where the operator '\[\]=' will be
    * invoked
    */
   bool inSetterContext() {
     ASTNode parent = this.parent;
     if (parent is PrefixExpression) {
-      return ((parent as PrefixExpression)).operator.type.isIncrementOperator;
+      return ((parent as PrefixExpression)).operator.type.isIncrementOperator();
     } else if (parent is PostfixExpression) {
       return true;
     } else if (parent is AssignmentExpression) {
@@ -7316,14 +7316,14 @@
     }
     return false;
   }
-  bool get isAssignable => true;
+  bool isAssignable() => true;
 
   /**
-   * Return `true` if this expression is cascaded. If it is, then the target of this
-   * expression is not stored locally but is stored in the nearest ancestor that is a[CascadeExpression].
-   * @return `true` if this expression is cascaded
+   * Return {@code true} if this expression is cascaded. If it is, then the target of this
+   * expression is not stored locally but is stored in the nearest ancestor that is a{@link CascadeExpression}.
+   * @return {@code true} if this expression is cascaded
    */
-  bool get isCascaded => _period != null;
+  bool isCascaded() => _period != null;
 
   /**
    * Set the expression used to compute the object being indexed to the given expression.
@@ -7390,9 +7390,9 @@
   /**
    * If the AST structure has been resolved, and the function being invoked is known based on
    * propagated type information, then return the parameter element representing the parameter to
-   * which the value of the index expression will be bound. Otherwise, return `null`.
-   *
-   * This method is only intended to be used by [Expression#getParameterElement].
+   * which the value of the index expression will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getParameterElement()}.
    * @return the parameter element representing the parameter to which the value of the index
    * expression will be bound
    */
@@ -7410,9 +7410,9 @@
   /**
    * If the AST structure has been resolved, and the function being invoked is known based on static
    * type information, then return the parameter element representing the parameter to which the
-   * value of the index expression will be bound. Otherwise, return `null`.
-   *
-   * This method is only intended to be used by [Expression#getStaticParameterElement].
+   * value of the index expression will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getStaticParameterElement()}.
    * @return the parameter element representing the parameter to which the value of the index
    * expression will be bound
    */
@@ -7428,11 +7428,11 @@
   }
 }
 /**
- * Instances of the class `InstanceCreationExpression` represent an instance creation
+ * Instances of the class {@code InstanceCreationExpression} represent an instance creation
  * expression.
  * <pre>
  * newExpression ::=
- * ('new' | 'const') [TypeName type] ('.' [SimpleIdentifier identifier])? [ArgumentList argumentList]</pre>
+ * ('new' | 'const') {@link TypeName type} ('.' {@link SimpleIdentifier identifier})? {@link ArgumentList argumentList}</pre>
  * @coverage dart.engine.ast
  */
 class InstanceCreationExpression extends Expression {
@@ -7453,12 +7453,12 @@
   ArgumentList _argumentList;
 
   /**
-   * The element associated with the constructor based on static type information, or `null`if the AST structure has not been resolved or if the constructor could not be resolved.
+   * The element associated with the constructor based on static type information, or {@code null}if the AST structure has not been resolved or if the constructor could not be resolved.
    */
   ConstructorElement _staticElement;
 
   /**
-   * The element associated with the constructor based on propagated type information, or`null` if the AST structure has not been resolved or if the constructor could not be
+   * The element associated with the constructor based on propagated type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    */
   ConstructorElement _propagatedElement;
@@ -7498,7 +7498,7 @@
   ConstructorName get constructorName => _constructorName;
 
   /**
-   * Return the element associated with the constructor based on propagated type information, or`null` if the AST structure has not been resolved or if the constructor could not be
+   * Return the element associated with the constructor based on propagated type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    * @return the element associated with the constructor
    */
@@ -7512,17 +7512,17 @@
   Token get keyword => _keyword;
 
   /**
-   * Return the element associated with the constructor based on static type information, or`null` if the AST structure has not been resolved or if the constructor could not be
+   * Return the element associated with the constructor based on static type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    * @return the element associated with the constructor
    */
   ConstructorElement get staticElement => _staticElement;
 
   /**
-   * Return `true` if this creation expression is used to invoke a constant constructor.
-   * @return `true` if this creation expression is used to invoke a constant constructor
+   * Return {@code true} if this creation expression is used to invoke a constant constructor.
+   * @return {@code true} if this creation expression is used to invoke a constant constructor
    */
-  bool get isConst => _keyword is KeywordToken && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
+  bool isConst() => _keyword is KeywordToken && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
 
   /**
    * Set the list of arguments to the constructor to the given list.
@@ -7571,7 +7571,7 @@
   }
 }
 /**
- * Instances of the class `IntegerLiteral` represent an integer literal expression.
+ * Instances of the class {@code IntegerLiteral} represent an integer literal expression.
  * <pre>
  * integerLiteral ::=
  * decimalIntegerLiteral
@@ -7647,19 +7647,19 @@
   }
 }
 /**
- * The abstract class `InterpolationElement` defines the behavior common to elements within a[StringInterpolation string interpolation].
+ * The abstract class {@code InterpolationElement} defines the behavior common to elements within a{@link StringInterpolation string interpolation}.
  * <pre>
- * interpolationElement ::=[InterpolationExpression interpolationExpression]| [InterpolationString interpolationString]</pre>
+ * interpolationElement ::={@link InterpolationExpression interpolationExpression}| {@link InterpolationString interpolationString}</pre>
  * @coverage dart.engine.ast
  */
 abstract class InterpolationElement extends ASTNode {
 }
 /**
- * Instances of the class `InterpolationExpression` represent an expression embedded in a
+ * Instances of the class {@code InterpolationExpression} represent an expression embedded in a
  * string interpolation.
  * <pre>
  * interpolationExpression ::=
- * '$' [SimpleIdentifier identifier]| '$' '{' [Expression expression] '}'
+ * '$' {@link SimpleIdentifier identifier}| '$' '{' {@link Expression expression} '}'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -7677,7 +7677,7 @@
   Expression _expression;
 
   /**
-   * The right curly bracket, or `null` if the expression is an identifier without brackets.
+   * The right curly bracket, or {@code null} if the expression is an identifier without brackets.
    */
   Token _rightBracket;
 
@@ -7756,7 +7756,7 @@
   }
 }
 /**
- * Instances of the class `InterpolationString` represent a non-empty substring of an
+ * Instances of the class {@code InterpolationString} represent a non-empty substring of an
  * interpolated string.
  * <pre>
  * interpolationString ::=
@@ -7827,9 +7827,9 @@
   }
 }
 /**
- * Instances of the class `IsExpression` represent an is expression.
+ * Instances of the class {@code IsExpression} represent an is expression.
  * <pre>
- * isExpression ::=[Expression expression] 'is' '!'? [TypeName type]</pre>
+ * isExpression ::={@link Expression expression} 'is' '!'? {@link TypeName type}</pre>
  * @coverage dart.engine.ast
  */
 class IsExpression extends Expression {
@@ -7845,7 +7845,7 @@
   Token _isOperator;
 
   /**
-   * The not operator, or `null` if the sense of the test is not negated.
+   * The not operator, or {@code null} if the sense of the test is not negated.
    */
   Token _notOperator;
 
@@ -7858,7 +7858,7 @@
    * Initialize a newly created is expression.
    * @param expression the expression used to compute the value whose type is being tested
    * @param isOperator the is operator
-   * @param notOperator the not operator, or `null` if the sense of the test is not negated
+   * @param notOperator the not operator, or {@code null} if the sense of the test is not negated
    * @param type the name of the type being tested for
    */
   IsExpression.full(Expression expression, Token isOperator, Token notOperator, TypeName type) {
@@ -7872,7 +7872,7 @@
    * Initialize a newly created is expression.
    * @param expression the expression used to compute the value whose type is being tested
    * @param isOperator the is operator
-   * @param notOperator the not operator, or `null` if the sense of the test is not negated
+   * @param notOperator the not operator, or {@code null} if the sense of the test is not negated
    * @param type the name of the type being tested for
    */
   IsExpression({Expression expression, Token isOperator, Token notOperator, TypeName type}) : this.full(expression, isOperator, notOperator, type);
@@ -7942,9 +7942,9 @@
   }
 }
 /**
- * Instances of the class `Label` represent a label.
+ * Instances of the class {@code Label} represent a label.
  * <pre>
- * label ::=[SimpleIdentifier label] ':'
+ * label ::={@link SimpleIdentifier label} ':'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -8012,10 +8012,10 @@
   }
 }
 /**
- * Instances of the class `LabeledStatement` represent a statement that has a label associated
+ * Instances of the class {@code LabeledStatement} represent a statement that has a label associated
  * with them.
  * <pre>
- * labeledStatement ::=[Label label]+ [Statement statement]</pre>
+ * labeledStatement ::={@link Label label}+ {@link Statement statement}</pre>
  * @coverage dart.engine.ast
  */
 class LabeledStatement extends Statement {
@@ -8081,9 +8081,9 @@
   }
 }
 /**
- * Instances of the class `LibraryDirective` represent a library directive.
+ * Instances of the class {@code LibraryDirective} represent a library directive.
  * <pre>
- * libraryDirective ::=[Annotation metadata] 'library' [Identifier name] ';'
+ * libraryDirective ::={@link Annotation metadata} 'library' {@link Identifier name} ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -8179,9 +8179,9 @@
   Token get firstTokenAfterCommentAndMetadata => _libraryToken;
 }
 /**
- * Instances of the class `LibraryIdentifier` represent the identifier for a library.
+ * Instances of the class {@code LibraryIdentifier} represent the identifier for a library.
  * <pre>
- * libraryIdentifier ::=[SimpleIdentifier component] ('.' [SimpleIdentifier component])
+ * libraryIdentifier ::={@link SimpleIdentifier component} ('.' {@link SimpleIdentifier component})
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -8235,10 +8235,10 @@
   }
 }
 /**
- * Instances of the class `ListLiteral` represent a list literal.
+ * Instances of the class {@code ListLiteral} represent a list literal.
  * <pre>
  * listLiteral ::=
- * 'const'? ('<' [TypeName type] '>')? '\[' ([Expression expressionList] ','?)? '\]'
+ * 'const'? ('<' {@link TypeName type} '>')? '\[' ({@link Expression expressionList} ','?)? '\]'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -8262,7 +8262,7 @@
   /**
    * Initialize a newly created list literal.
    * @param modifier the const modifier associated with this literal
-   * @param typeArguments the type argument associated with this literal, or `null` if no type
+   * @param typeArguments the type argument associated with this literal, or {@code null} if no type
    * arguments were declared
    * @param leftBracket the left square bracket
    * @param elements the expressions used to compute the elements of the list
@@ -8278,7 +8278,7 @@
   /**
    * Initialize a newly created list literal.
    * @param modifier the const modifier associated with this literal
-   * @param typeArguments the type argument associated with this literal, or `null` if no type
+   * @param typeArguments the type argument associated with this literal, or {@code null} if no type
    * arguments were declared
    * @param leftBracket the left square bracket
    * @param elements the expressions used to compute the elements of the list
@@ -8338,19 +8338,19 @@
   }
 }
 /**
- * The abstract class `Literal` defines the behavior common to nodes that represent a literal
+ * The abstract class {@code Literal} defines the behavior common to nodes that represent a literal
  * expression.
  * <pre>
- * literal ::=[BooleanLiteral booleanLiteral]| [DoubleLiteral doubleLiteral]| [IntegerLiteral integerLiteral]| [ListLiteral listLiteral]| [MapLiteral mapLiteral]| [NullLiteral nullLiteral]| [StringLiteral stringLiteral]</pre>
+ * literal ::={@link BooleanLiteral booleanLiteral}| {@link DoubleLiteral doubleLiteral}| {@link IntegerLiteral integerLiteral}| {@link ListLiteral listLiteral}| {@link MapLiteral mapLiteral}| {@link NullLiteral nullLiteral}| {@link StringLiteral stringLiteral}</pre>
  * @coverage dart.engine.ast
  */
 abstract class Literal extends Expression {
 }
 /**
- * Instances of the class `MapLiteral` represent a literal map.
+ * Instances of the class {@code MapLiteral} represent a literal map.
  * <pre>
  * mapLiteral ::=
- * 'const'? ('<' [TypeName type] (',' [TypeName type])* '>')? '{' ([MapLiteralEntry entry] (',' [MapLiteralEntry entry])* ','?)? '}'
+ * 'const'? ('<' {@link TypeName type} (',' {@link TypeName type})* '>')? '{' ({@link MapLiteralEntry entry} (',' {@link MapLiteralEntry entry})* ','?)? '}'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -8374,7 +8374,7 @@
   /**
    * Initialize a newly created map literal.
    * @param modifier the const modifier associated with this literal
-   * @param typeArguments the type argument associated with this literal, or `null` if no type
+   * @param typeArguments the type argument associated with this literal, or {@code null} if no type
    * arguments were declared
    * @param leftBracket the left curly bracket
    * @param entries the entries in the map
@@ -8390,7 +8390,7 @@
   /**
    * Initialize a newly created map literal.
    * @param modifier the const modifier associated with this literal
-   * @param typeArguments the type argument associated with this literal, or `null` if no type
+   * @param typeArguments the type argument associated with this literal, or {@code null} if no type
    * arguments were declared
    * @param leftBracket the left curly bracket
    * @param entries the entries in the map
@@ -8450,10 +8450,10 @@
   }
 }
 /**
- * Instances of the class `MapLiteralEntry` represent a single key/value pair in a map
+ * Instances of the class {@code MapLiteralEntry} represent a single key/value pair in a map
  * literal.
  * <pre>
- * mapLiteralEntry ::=[Expression key] ':' [Expression value]</pre>
+ * mapLiteralEntry ::={@link Expression key} ':' {@link Expression value}</pre>
  * @coverage dart.engine.ast
  */
 class MapLiteralEntry extends ASTNode {
@@ -8545,39 +8545,39 @@
   }
 }
 /**
- * Instances of the class `MethodDeclaration` represent a method declaration.
+ * Instances of the class {@code MethodDeclaration} represent a method declaration.
  * <pre>
  * methodDeclaration ::=
- * methodSignature [FunctionBody body]methodSignature ::=
- * 'external'? ('abstract' | 'static')? [Type returnType]? ('get' | 'set')? methodName[FormalParameterList formalParameterList]methodName ::=[SimpleIdentifier name]| 'operator' [SimpleIdentifier operator]</pre>
+ * methodSignature {@link FunctionBody body}methodSignature ::=
+ * 'external'? ('abstract' | 'static')? {@link Type returnType}? ('get' | 'set')? methodName{@link FormalParameterList formalParameterList}methodName ::={@link SimpleIdentifier name}| 'operator' {@link SimpleIdentifier operator}</pre>
  * @coverage dart.engine.ast
  */
 class MethodDeclaration extends ClassMember {
 
   /**
-   * The token for the 'external' keyword, or `null` if the constructor is not external.
+   * The token for the 'external' keyword, or {@code null} if the constructor is not external.
    */
   Token _externalKeyword;
 
   /**
-   * The token representing the 'abstract' or 'static' keyword, or `null` if neither modifier
+   * The token representing the 'abstract' or 'static' keyword, or {@code null} if neither modifier
    * was specified.
    */
   Token _modifierKeyword;
 
   /**
-   * The return type of the method, or `null` if no return type was declared.
+   * The return type of the method, or {@code null} if no return type was declared.
    */
   TypeName _returnType;
 
   /**
-   * The token representing the 'get' or 'set' keyword, or `null` if this is a method
+   * The token representing the 'get' or 'set' keyword, or {@code null} if this is a method
    * declaration rather than a property declaration.
    */
   Token _propertyKeyword;
 
   /**
-   * The token representing the 'operator' keyword, or `null` if this method does not declare
+   * The token representing the 'operator' keyword, or {@code null} if this method does not declare
    * an operator.
    */
   Token _operatorKeyword;
@@ -8588,7 +8588,7 @@
   SimpleIdentifier _name;
 
   /**
-   * The parameters associated with the method, or `null` if this method declares a getter.
+   * The parameters associated with the method, or {@code null} if this method declares a getter.
    */
   FormalParameterList _parameters;
 
@@ -8607,7 +8607,7 @@
    * @param propertyKeyword the token representing the 'get' or 'set' keyword
    * @param operatorKeyword the token representing the 'operator' keyword
    * @param name the name of the method
-   * @param parameters the parameters associated with the method, or `null` if this method
+   * @param parameters the parameters associated with the method, or {@code null} if this method
    * declares a getter
    * @param body the body of the method
    */
@@ -8632,7 +8632,7 @@
    * @param propertyKeyword the token representing the 'get' or 'set' keyword
    * @param operatorKeyword the token representing the 'operator' keyword
    * @param name the name of the method
-   * @param parameters the parameters associated with the method, or `null` if this method
+   * @param parameters the parameters associated with the method, or {@code null} if this method
    * declares a getter
    * @param body the body of the method
    */
@@ -8646,9 +8646,9 @@
   FunctionBody get body => _body;
 
   /**
-   * Return the element associated with this method, or `null` if the AST structure has not
-   * been resolved. The element can either be a [MethodElement], if this represents the
-   * declaration of a normal method, or a [PropertyAccessorElement] if this represents the
+   * Return the element associated with this method, or {@code null} if the AST structure has not
+   * been resolved. The element can either be a {@link MethodElement}, if this represents the
+   * declaration of a normal method, or a {@link PropertyAccessorElement} if this represents the
    * declaration of either a getter or a setter.
    * @return the element associated with this method
    */
@@ -8656,14 +8656,14 @@
   Token get endToken => _body.endToken;
 
   /**
-   * Return the token for the 'external' keyword, or `null` if the constructor is not
+   * Return the token for the 'external' keyword, or {@code null} if the constructor is not
    * external.
    * @return the token for the 'external' keyword
    */
   Token get externalKeyword => _externalKeyword;
 
   /**
-   * Return the token representing the 'abstract' or 'static' keyword, or `null` if neither
+   * Return the token representing the 'abstract' or 'static' keyword, or {@code null} if neither
    * modifier was specified.
    * @return the token representing the 'abstract' or 'static' keyword
    */
@@ -8676,61 +8676,61 @@
   SimpleIdentifier get name => _name;
 
   /**
-   * Return the token representing the 'operator' keyword, or `null` if this method does not
+   * Return the token representing the 'operator' keyword, or {@code null} if this method does not
    * declare an operator.
    * @return the token representing the 'operator' keyword
    */
   Token get operatorKeyword => _operatorKeyword;
 
   /**
-   * Return the parameters associated with the method, or `null` if this method declares a
+   * Return the parameters associated with the method, or {@code null} if this method declares a
    * getter.
    * @return the parameters associated with the method
    */
   FormalParameterList get parameters => _parameters;
 
   /**
-   * Return the token representing the 'get' or 'set' keyword, or `null` if this is a method
+   * Return the token representing the 'get' or 'set' keyword, or {@code null} if this is a method
    * declaration rather than a property declaration.
    * @return the token representing the 'get' or 'set' keyword
    */
   Token get propertyKeyword => _propertyKeyword;
 
   /**
-   * Return the return type of the method, or `null` if no return type was declared.
+   * Return the return type of the method, or {@code null} if no return type was declared.
    * @return the return type of the method
    */
   TypeName get returnType => _returnType;
 
   /**
-   * Return `true` if this method is declared to be an abstract method.
-   * @return `true` if this method is declared to be an abstract method
+   * Return {@code true} if this method is declared to be an abstract method.
+   * @return {@code true} if this method is declared to be an abstract method
    */
-  bool get isAbstract => _externalKeyword == null && (_body is EmptyFunctionBody);
+  bool isAbstract() => _externalKeyword == null && (_body is EmptyFunctionBody);
 
   /**
-   * Return `true` if this method declares a getter.
-   * @return `true` if this method declares a getter
+   * Return {@code true} if this method declares a getter.
+   * @return {@code true} if this method declares a getter
    */
-  bool get isGetter => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.GET);
+  bool isGetter() => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.GET);
 
   /**
-   * Return `true` if this method declares an operator.
-   * @return `true` if this method declares an operator
+   * Return {@code true} if this method declares an operator.
+   * @return {@code true} if this method declares an operator
    */
-  bool get isOperator => _operatorKeyword != null;
+  bool isOperator() => _operatorKeyword != null;
 
   /**
-   * Return `true` if this method declares a setter.
-   * @return `true` if this method declares a setter
+   * Return {@code true} if this method declares a setter.
+   * @return {@code true} if this method declares a setter
    */
-  bool get isSetter => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.SET);
+  bool isSetter() => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.SET);
 
   /**
-   * Return `true` if this method is declared to be a static method.
-   * @return `true` if this method is declared to be a static method
+   * Return {@code true} if this method is declared to be a static method.
+   * @return {@code true} if this method is declared to be a static method
    */
-  bool get isStatic => _modifierKeyword != null && identical(((_modifierKeyword as KeywordToken)).keyword, Keyword.STATIC);
+  bool isStatic() => _modifierKeyword != null && identical(((_modifierKeyword as KeywordToken)).keyword, Keyword.STATIC);
 
   /**
    * Set the body of the method to the given function body.
@@ -8816,24 +8816,24 @@
   }
 }
 /**
- * Instances of the class `MethodInvocation` represent the invocation of either a function or
- * a method. Invocations of functions resulting from evaluating an expression are represented by[FunctionExpressionInvocation function expression invocation] nodes. Invocations of getters
- * and setters are represented by either [PrefixedIdentifier prefixed identifier] or[PropertyAccess property access] nodes.
+ * Instances of the class {@code MethodInvocation} represent the invocation of either a function or
+ * a method. Invocations of functions resulting from evaluating an expression are represented by{@link FunctionExpressionInvocation function expression invocation} nodes. Invocations of getters
+ * and setters are represented by either {@link PrefixedIdentifier prefixed identifier} or{@link PropertyAccess property access} nodes.
  * <pre>
  * methodInvoction ::=
- * ([Expression target] '.')? [SimpleIdentifier methodName] [ArgumentList argumentList]</pre>
+ * ({@link Expression target} '.')? {@link SimpleIdentifier methodName} {@link ArgumentList argumentList}</pre>
  * @coverage dart.engine.ast
  */
 class MethodInvocation extends Expression {
 
   /**
-   * The expression producing the object on which the method is defined, or `null` if there is
-   * no target (that is, the target is implicitly `this`).
+   * The expression producing the object on which the method is defined, or {@code null} if there is
+   * no target (that is, the target is implicitly {@code this}).
    */
   Expression _target;
 
   /**
-   * The period that separates the target from the method name, or `null` if there is no
+   * The period that separates the target from the method name, or {@code null} if there is no
    * target.
    */
   Token _period;
@@ -8894,7 +8894,7 @@
   SimpleIdentifier get methodName => _methodName;
 
   /**
-   * Return the period that separates the target from the method name, or `null` if there is
+   * Return the period that separates the target from the method name, or {@code null} if there is
    * no target.
    * @return the period that separates the target from the method name
    */
@@ -8902,14 +8902,14 @@
 
   /**
    * Return the expression used to compute the receiver of the invocation. If this invocation is not
-   * part of a cascade expression, then this is the same as [getTarget]. If this invocation
+   * part of a cascade expression, then this is the same as {@link #getTarget()}. If this invocation
    * is part of a cascade expression, then the target stored with the cascade expression is
    * returned.
    * @return the expression used to compute the receiver of the invocation
    * @see #getTarget()
    */
   Expression get realTarget {
-    if (isCascaded) {
+    if (isCascaded()) {
       ASTNode ancestor = parent;
       while (ancestor is! CascadeExpression) {
         if (ancestor == null) {
@@ -8923,8 +8923,8 @@
   }
 
   /**
-   * Return the expression producing the object on which the method is defined, or `null` if
-   * there is no target (that is, the target is implicitly `this`) or if this method
+   * Return the expression producing the object on which the method is defined, or {@code null} if
+   * there is no target (that is, the target is implicitly {@code this}) or if this method
    * invocation is part of a cascade expression.
    * @return the expression producing the object on which the method is defined
    * @see #getRealTarget()
@@ -8932,11 +8932,11 @@
   Expression get target => _target;
 
   /**
-   * Return `true` if this expression is cascaded. If it is, then the target of this
-   * expression is not stored locally but is stored in the nearest ancestor that is a[CascadeExpression].
-   * @return `true` if this expression is cascaded
+   * Return {@code true} if this expression is cascaded. If it is, then the target of this
+   * expression is not stored locally but is stored in the nearest ancestor that is a{@link CascadeExpression}.
+   * @return {@code true} if this expression is cascaded
    */
-  bool get isCascaded => _period != null && identical(_period.type, TokenType.PERIOD_PERIOD);
+  bool isCascaded() => _period != null && identical(_period.type, TokenType.PERIOD_PERIOD);
 
   /**
    * Set the list of arguments to the method to the given list.
@@ -8976,10 +8976,10 @@
   }
 }
 /**
- * Instances of the class `NamedExpression` represent an expression that has a name associated
+ * Instances of the class {@code NamedExpression} represent an expression that has a name associated
  * with it. They are used in method invocations when there are named parameters.
  * <pre>
- * namedExpression ::=[Label name] [Expression expression]</pre>
+ * namedExpression ::={@link Label name} {@link Expression expression}</pre>
  * @coverage dart.engine.ast
  */
 class NamedExpression extends Expression {
@@ -9014,7 +9014,7 @@
   Token get beginToken => _name.beginToken;
 
   /**
-   * Return the element representing the parameter being named by this expression, or `null`if the AST structure has not been resolved or if there is no parameter with the same name as
+   * Return the element representing the parameter being named by this expression, or {@code null}if the AST structure has not been resolved or if there is no parameter with the same name as
    * this expression.
    * @return the element representing the parameter being named by this expression
    */
@@ -9060,10 +9060,10 @@
   }
 }
 /**
- * The abstract class `NamespaceDirective` defines the behavior common to nodes that represent
+ * The abstract class {@code NamespaceDirective} defines the behavior common to nodes that represent
  * a directive that impacts the namespace of a library.
  * <pre>
- * directive ::=[ExportDirective exportDirective]| [ImportDirective importDirective]</pre>
+ * directive ::={@link ExportDirective exportDirective}| {@link ImportDirective importDirective}</pre>
  * @coverage dart.engine.ast
  */
 abstract class NamespaceDirective extends UriBasedDirective {
@@ -9143,11 +9143,11 @@
   Token get firstTokenAfterCommentAndMetadata => _keyword;
 }
 /**
- * Instances of the class `NativeFunctionBody` represent a function body that consists of a
+ * Instances of the class {@code NativeFunctionBody} represent a function body that consists of a
  * native keyword followed by a string literal.
  * <pre>
  * nativeFunctionBody ::=
- * 'native' [SimpleStringLiteral simpleStringLiteral] ';'
+ * 'native' {@link SimpleStringLiteral simpleStringLiteral} ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -9215,16 +9215,16 @@
   }
 }
 /**
- * The abstract class `NormalFormalParameter` defines the behavior common to formal parameters
+ * The abstract class {@code NormalFormalParameter} defines the behavior common to formal parameters
  * that are required (are not optional).
  * <pre>
- * normalFormalParameter ::=[FunctionTypedFormalParameter functionSignature]| [FieldFormalParameter fieldFormalParameter]| [SimpleFormalParameter simpleFormalParameter]</pre>
+ * normalFormalParameter ::={@link FunctionTypedFormalParameter functionSignature}| {@link FieldFormalParameter fieldFormalParameter}| {@link SimpleFormalParameter simpleFormalParameter}</pre>
  * @coverage dart.engine.ast
  */
 abstract class NormalFormalParameter extends FormalParameter {
 
   /**
-   * The documentation comment associated with this parameter, or `null` if this parameter
+   * The documentation comment associated with this parameter, or {@code null} if this parameter
    * does not have a documentation comment associated with it.
    */
   Comment _comment;
@@ -9261,7 +9261,7 @@
   NormalFormalParameter({Comment comment, List<Annotation> metadata, SimpleIdentifier identifier}) : this.full(comment, metadata, identifier);
 
   /**
-   * Return the documentation comment associated with this parameter, or `null` if this
+   * Return the documentation comment associated with this parameter, or {@code null} if this
    * parameter does not have a documentation comment associated with it.
    * @return the documentation comment associated with this parameter
    */
@@ -9282,18 +9282,18 @@
   NodeList<Annotation> get metadata => _metadata;
 
   /**
-   * Return `true` if this parameter was declared with the 'const' modifier.
-   * @return `true` if this parameter was declared with the 'const' modifier
+   * Return {@code true} if this parameter was declared with the 'const' modifier.
+   * @return {@code true} if this parameter was declared with the 'const' modifier
    */
-  bool get isConst;
+  bool isConst();
 
   /**
-   * Return `true` if this parameter was declared with the 'final' modifier. Parameters that
-   * are declared with the 'const' modifier will return `false` even though they are
+   * Return {@code true} if this parameter was declared with the 'final' modifier. Parameters that
+   * are declared with the 'const' modifier will return {@code false} even though they are
    * implicitly final.
-   * @return `true` if this parameter was declared with the 'final' modifier
+   * @return {@code true} if this parameter was declared with the 'final' modifier
    */
-  bool get isFinal;
+  bool isFinal();
 
   /**
    * Set the documentation comment associated with this parameter to the given comment
@@ -9322,8 +9322,8 @@
   }
 
   /**
-   * Return `true` if the comment is lexically before any annotations.
-   * @return `true` if the comment is lexically before any annotations
+   * Return {@code true} if the comment is lexically before any annotations.
+   * @return {@code true} if the comment is lexically before any annotations
    */
   bool commentIsBeforeAnnotations() {
     if (_comment == null || _metadata.isEmpty) {
@@ -9349,7 +9349,7 @@
   }
 }
 /**
- * Instances of the class `NullLiteral` represent a null literal expression.
+ * Instances of the class {@code NullLiteral} represent a null literal expression.
  * <pre>
  * nullLiteral ::=
  * 'null'
@@ -9397,10 +9397,10 @@
   }
 }
 /**
- * Instances of the class `ParenthesizedExpression` represent a parenthesized expression.
+ * Instances of the class {@code ParenthesizedExpression} represent a parenthesized expression.
  * <pre>
  * parenthesizedExpression ::=
- * '(' [Expression expression] ')'
+ * '(' {@link Expression expression} ')'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -9490,9 +9490,9 @@
   }
 }
 /**
- * Instances of the class `PartDirective` represent a part directive.
+ * Instances of the class {@code PartDirective} represent a part directive.
  * <pre>
- * partDirective ::=[Annotation metadata] 'part' [StringLiteral partUri] ';'
+ * partDirective ::={@link Annotation metadata} 'part' {@link StringLiteral partUri} ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -9565,9 +9565,9 @@
   Token get firstTokenAfterCommentAndMetadata => _partToken;
 }
 /**
- * Instances of the class `PartOfDirective` represent a part-of directive.
+ * Instances of the class {@code PartOfDirective} represent a part-of directive.
  * <pre>
- * partOfDirective ::=[Annotation metadata] 'part' 'of' [Identifier libraryName] ';'
+ * partOfDirective ::={@link Annotation metadata} 'part' 'of' {@link Identifier libraryName} ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -9685,9 +9685,9 @@
   Token get firstTokenAfterCommentAndMetadata => _partToken;
 }
 /**
- * Instances of the class `PostfixExpression` represent a postfix unary expression.
+ * Instances of the class {@code PostfixExpression} represent a postfix unary expression.
  * <pre>
- * postfixExpression ::=[Expression operand] [Token operator]</pre>
+ * postfixExpression ::={@link Expression operand} {@link Token operator}</pre>
  * @coverage dart.engine.ast
  */
 class PostfixExpression extends Expression {
@@ -9703,13 +9703,13 @@
   Token _operator;
 
   /**
-   * The element associated with this the operator based on the propagated type of the operand, or`null` if the AST structure has not been resolved, if the operator is not user definable,
+   * The element associated with this the operator based on the propagated type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _propagatedElement;
 
   /**
-   * The element associated with the operator based on the static type of the operand, or`null` if the AST structure has not been resolved, if the operator is not user definable,
+   * The element associated with the operator based on the static type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _staticElement;
@@ -9734,7 +9734,7 @@
   Token get beginToken => _operand.beginToken;
 
   /**
-   * Return the element associated with the operator based on the propagated type of the operand, or`null` if the AST structure has not been resolved, if the operator is not user definable,
+   * Return the element associated with the operator based on the propagated type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved. One example of the latter case is an operator that is
    * not defined for the type of the operand.
    * @return the element associated with the operator
@@ -9755,7 +9755,7 @@
   Token get operator => _operator;
 
   /**
-   * Return the element associated with the operator based on the static type of the operand, or`null` if the AST structure has not been resolved, if the operator is not user definable,
+   * Return the element associated with the operator based on the static type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved. One example of the latter case is an operator that is
    * not defined for the type of the operand.
    * @return the element associated with the operator
@@ -9802,9 +9802,9 @@
   /**
    * If the AST structure has been resolved, and the function being invoked is known based on
    * propagated type information, then return the parameter element representing the parameter to
-   * which the value of the operand will be bound. Otherwise, return `null`.
-   *
-   * This method is only intended to be used by [Expression#getParameterElement].
+   * which the value of the operand will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getParameterElement()}.
    * @return the parameter element representing the parameter to which the value of the right
    * operand will be bound
    */
@@ -9822,9 +9822,9 @@
   /**
    * If the AST structure has been resolved, and the function being invoked is known based on static
    * type information, then return the parameter element representing the parameter to which the
-   * value of the operand will be bound. Otherwise, return `null`.
-   *
-   * This method is only intended to be used by [Expression#getStaticParameterElement].
+   * value of the operand will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getStaticParameterElement()}.
    * @return the parameter element representing the parameter to which the value of the right
    * operand will be bound
    */
@@ -9840,9 +9840,9 @@
   }
 }
 /**
- * Instances of the class `PrefixExpression` represent a prefix unary expression.
+ * Instances of the class {@code PrefixExpression} represent a prefix unary expression.
  * <pre>
- * prefixExpression ::=[Token operator] [Expression operand]</pre>
+ * prefixExpression ::={@link Token operator} {@link Expression operand}</pre>
  * @coverage dart.engine.ast
  */
 class PrefixExpression extends Expression {
@@ -9858,13 +9858,13 @@
   Expression _operand;
 
   /**
-   * The element associated with the operator based on the static type of the operand, or`null` if the AST structure has not been resolved, if the operator is not user definable,
+   * The element associated with the operator based on the static type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _staticElement;
 
   /**
-   * The element associated with the operator based on the propagated type of the operand, or`null` if the AST structure has not been resolved, if the operator is not user definable,
+   * The element associated with the operator based on the propagated type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _propagatedElement;
@@ -9889,7 +9889,7 @@
   Token get beginToken => _operator;
 
   /**
-   * Return the element associated with the operator based on the propagated type of the operand, or`null` if the AST structure has not been resolved, if the operator is not user definable,
+   * Return the element associated with the operator based on the propagated type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved. One example of the latter case is an operator that is
    * not defined for the type of the operand.
    * @return the element associated with the operator
@@ -9910,7 +9910,7 @@
   Token get operator => _operator;
 
   /**
-   * Return the element associated with the operator based on the static type of the operand, or`null` if the AST structure has not been resolved, if the operator is not user definable,
+   * Return the element associated with the operator based on the static type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved. One example of the latter case is an operator that is
    * not defined for the type of the operand.
    * @return the element associated with the operator
@@ -9957,9 +9957,9 @@
   /**
    * If the AST structure has been resolved, and the function being invoked is known based on
    * propagated type information, then return the parameter element representing the parameter to
-   * which the value of the operand will be bound. Otherwise, return `null`.
-   *
-   * This method is only intended to be used by [Expression#getParameterElement].
+   * which the value of the operand will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getParameterElement()}.
    * @return the parameter element representing the parameter to which the value of the right
    * operand will be bound
    */
@@ -9977,9 +9977,9 @@
   /**
    * If the AST structure has been resolved, and the function being invoked is known based on static
    * type information, then return the parameter element representing the parameter to which the
-   * value of the operand will be bound. Otherwise, return `null`.
-   *
-   * This method is only intended to be used by [Expression#getStaticParameterElement].
+   * value of the operand will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getStaticParameterElement()}.
    * @return the parameter element representing the parameter to which the value of the right
    * operand will be bound
    */
@@ -9995,11 +9995,11 @@
   }
 }
 /**
- * Instances of the class `PrefixedIdentifier` represent either an identifier that is prefixed
+ * Instances of the class {@code PrefixedIdentifier} represent either an identifier that is prefixed
  * or an access to an object property where the target of the property access is a simple
  * identifier.
  * <pre>
- * prefixedIdentifier ::=[SimpleIdentifier prefix] '.' [SimpleIdentifier identifier]</pre>
+ * prefixedIdentifier ::={@link SimpleIdentifier prefix} '.' {@link SimpleIdentifier identifier}</pre>
  * @coverage dart.engine.ast
  */
 class PrefixedIdentifier extends Identifier {
@@ -10103,12 +10103,12 @@
   }
 }
 /**
- * Instances of the class `PropertyAccess` represent the access of a property of an object.
- *
- * Note, however, that accesses to properties of objects can also be represented as[PrefixedIdentifier prefixed identifier] nodes in cases where the target is also a simple
+ * Instances of the class {@code PropertyAccess} represent the access of a property of an object.
+ * <p>
+ * Note, however, that accesses to properties of objects can also be represented as{@link PrefixedIdentifier prefixed identifier} nodes in cases where the target is also a simple
  * identifier.
  * <pre>
- * propertyAccess ::=[Expression target] '.' [SimpleIdentifier propertyName]</pre>
+ * propertyAccess ::={@link Expression target} '.' {@link SimpleIdentifier propertyName}</pre>
  * @coverage dart.engine.ast
  */
 class PropertyAccess extends Expression {
@@ -10170,14 +10170,14 @@
 
   /**
    * Return the expression used to compute the receiver of the invocation. If this invocation is not
-   * part of a cascade expression, then this is the same as [getTarget]. If this invocation
+   * part of a cascade expression, then this is the same as {@link #getTarget()}. If this invocation
    * is part of a cascade expression, then the target stored with the cascade expression is
    * returned.
    * @return the expression used to compute the receiver of the invocation
    * @see #getTarget()
    */
   Expression get realTarget {
-    if (isCascaded) {
+    if (isCascaded()) {
       ASTNode ancestor = parent;
       while (ancestor is! CascadeExpression) {
         if (ancestor == null) {
@@ -10191,19 +10191,19 @@
   }
 
   /**
-   * Return the expression computing the object defining the property being accessed, or`null` if this property access is part of a cascade expression.
+   * Return the expression computing the object defining the property being accessed, or{@code null} if this property access is part of a cascade expression.
    * @return the expression computing the object defining the property being accessed
    * @see #getRealTarget()
    */
   Expression get target => _target;
-  bool get isAssignable => true;
+  bool isAssignable() => true;
 
   /**
-   * Return `true` if this expression is cascaded. If it is, then the target of this
-   * expression is not stored locally but is stored in the nearest ancestor that is a[CascadeExpression].
-   * @return `true` if this expression is cascaded
+   * Return {@code true} if this expression is cascaded. If it is, then the target of this
+   * expression is not stored locally but is stored in the nearest ancestor that is a{@link CascadeExpression}.
+   * @return {@code true} if this expression is cascaded
    */
-  bool get isCascaded => _operator != null && identical(_operator.type, TokenType.PERIOD_PERIOD);
+  bool isCascaded() => _operator != null && identical(_operator.type, TokenType.PERIOD_PERIOD);
 
   /**
    * Set the property access operator to the given token.
@@ -10235,7 +10235,7 @@
   }
 }
 /**
- * Instances of the class `RedirectingConstructorInvocation` represent the invocation of a
+ * Instances of the class {@code RedirectingConstructorInvocation} represent the invocation of a
  * another constructor in the same class from within a constructor's initialization list.
  * <pre>
  * redirectingConstructorInvocation ::=
@@ -10251,12 +10251,12 @@
   Token _keyword;
 
   /**
-   * The token for the period before the name of the constructor that is being invoked, or`null` if the unnamed constructor is being invoked.
+   * The token for the period before the name of the constructor that is being invoked, or{@code null} if the unnamed constructor is being invoked.
    */
   Token _period;
 
   /**
-   * The name of the constructor that is being invoked, or `null` if the unnamed constructor
+   * The name of the constructor that is being invoked, or {@code null} if the unnamed constructor
    * is being invoked.
    */
   SimpleIdentifier _constructorName;
@@ -10267,12 +10267,12 @@
   ArgumentList _argumentList;
 
   /**
-   * The element associated with the constructor based on static type information, or `null`if the AST structure has not been resolved or if the constructor could not be resolved.
+   * The element associated with the constructor based on static type information, or {@code null}if the AST structure has not been resolved or if the constructor could not be resolved.
    */
   ConstructorElement _staticElement;
 
   /**
-   * The element associated with the constructor based on propagated type information, or`null` if the AST structure has not been resolved or if the constructor could not be
+   * The element associated with the constructor based on propagated type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    */
   ConstructorElement _propagatedElement;
@@ -10311,14 +10311,14 @@
   Token get beginToken => _keyword;
 
   /**
-   * Return the name of the constructor that is being invoked, or `null` if the unnamed
+   * Return the name of the constructor that is being invoked, or {@code null} if the unnamed
    * constructor is being invoked.
    * @return the name of the constructor that is being invoked
    */
   SimpleIdentifier get constructorName => _constructorName;
 
   /**
-   * Return the element associated with the constructor based on propagated type information, or`null` if the AST structure has not been resolved or if the constructor could not be
+   * Return the element associated with the constructor based on propagated type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    * @return the element associated with the super constructor
    */
@@ -10332,13 +10332,13 @@
   Token get keyword => _keyword;
 
   /**
-   * Return the token for the period before the name of the constructor that is being invoked, or`null` if the unnamed constructor is being invoked.
+   * Return the token for the period before the name of the constructor that is being invoked, or{@code null} if the unnamed constructor is being invoked.
    * @return the token for the period before the name of the constructor that is being invoked
    */
   Token get period => _period;
 
   /**
-   * Return the element associated with the constructor based on static type information, or`null` if the AST structure has not been resolved or if the constructor could not be
+   * Return the element associated with the constructor based on static type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    * @return the element associated with the constructor
    */
@@ -10400,7 +10400,7 @@
   }
 }
 /**
- * Instances of the class `RethrowExpression` represent a rethrow expression.
+ * Instances of the class {@code RethrowExpression} represent a rethrow expression.
  * <pre>
  * rethrowExpression ::=
  * 'rethrow'
@@ -10448,10 +10448,10 @@
   }
 }
 /**
- * Instances of the class `ReturnStatement` represent a return statement.
+ * Instances of the class {@code ReturnStatement} represent a return statement.
  * <pre>
  * returnStatement ::=
- * 'return' [Expression expression]? ';'
+ * 'return' {@link Expression expression}? ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -10463,7 +10463,7 @@
   Token _keyword;
 
   /**
-   * The expression computing the value to be returned, or `null` if no explicit value was
+   * The expression computing the value to be returned, or {@code null} if no explicit value was
    * provided.
    */
   Expression _expression;
@@ -10497,7 +10497,7 @@
   Token get endToken => _semicolon;
 
   /**
-   * Return the expression computing the value to be returned, or `null` if no explicit value
+   * Return the expression computing the value to be returned, or {@code null} if no explicit value
    * was provided.
    * @return the expression computing the value to be returned
    */
@@ -10543,7 +10543,7 @@
   }
 }
 /**
- * Instances of the class `ScriptTag` represent the script tag that can optionally occur at
+ * Instances of the class {@code ScriptTag} represent the script tag that can optionally occur at
  * the beginning of a compilation unit.
  * <pre>
  * scriptTag ::=
@@ -10592,11 +10592,11 @@
   }
 }
 /**
- * Instances of the class `ShowCombinator` represent a combinator that restricts the names
+ * Instances of the class {@code ShowCombinator} represent a combinator that restricts the names
  * being imported to those in a given list.
  * <pre>
  * showCombinator ::=
- * 'show' [SimpleIdentifier identifier] (',' [SimpleIdentifier identifier])
+ * 'show' {@link SimpleIdentifier identifier} (',' {@link SimpleIdentifier identifier})
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -10636,22 +10636,22 @@
   }
 }
 /**
- * Instances of the class `SimpleFormalParameter` represent a simple formal parameter.
+ * Instances of the class {@code SimpleFormalParameter} represent a simple formal parameter.
  * <pre>
  * simpleFormalParameter ::=
- * ('final' [TypeName type] | 'var' | [TypeName type])? [SimpleIdentifier identifier]</pre>
+ * ('final' {@link TypeName type} | 'var' | {@link TypeName type})? {@link SimpleIdentifier identifier}</pre>
  * @coverage dart.engine.ast
  */
 class SimpleFormalParameter extends NormalFormalParameter {
 
   /**
-   * The token representing either the 'final', 'const' or 'var' keyword, or `null` if no
+   * The token representing either the 'final', 'const' or 'var' keyword, or {@code null} if no
    * keyword was used.
    */
   Token _keyword;
 
   /**
-   * The name of the declared type of the parameter, or `null` if the parameter does not have
+   * The name of the declared type of the parameter, or {@code null} if the parameter does not have
    * a declared type.
    */
   TypeName _type;
@@ -10696,13 +10696,13 @@
   Token get keyword => _keyword;
 
   /**
-   * Return the name of the declared type of the parameter, or `null` if the parameter does
+   * Return the name of the declared type of the parameter, or {@code null} if the parameter does
    * not have a declared type.
    * @return the name of the declared type of the parameter
    */
   TypeName get type => _type;
-  bool get isConst => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
-  bool get isFinal => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
+  bool isConst() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
+  bool isFinal() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
 
   /**
    * Set the token representing either the 'final', 'const' or 'var' keyword to the given token.
@@ -10726,7 +10726,7 @@
   }
 }
 /**
- * Instances of the class `SimpleIdentifier` represent a simple identifier.
+ * Instances of the class {@code SimpleIdentifier} represent a simple identifier.
  * <pre>
  * simpleIdentifier ::=
  * initialCharacter internalCharacter
@@ -10743,12 +10743,12 @@
   Token _token;
 
   /**
-   * The element associated with this identifier based on static type information, or `null`if the AST structure has not been resolved or if this identifier could not be resolved.
+   * The element associated with this identifier based on static type information, or {@code null}if the AST structure has not been resolved or if this identifier could not be resolved.
    */
   Element _staticElement;
 
   /**
-   * The element associated with this identifier based on propagated type information, or`null` if the AST structure has not been resolved or if this identifier could not be
+   * The element associated with this identifier based on propagated type information, or{@code null} if the AST structure has not been resolved or if this identifier could not be
    * resolved.
    */
   Element _propagatedElement;
@@ -10780,8 +10780,8 @@
   Token get token => _token;
 
   /**
-   * Return `true` if this identifier is the name being declared in a declaration.
-   * @return `true` if this identifier is the name being declared in a declaration
+   * Return {@code true} if this identifier is the name being declared in a declaration.
+   * @return {@code true} if this identifier is the name being declared in a declaration
    */
   bool inDeclarationContext() {
     ASTNode parent = this.parent;
@@ -10813,11 +10813,11 @@
   }
 
   /**
-   * Return `true` if this expression is computing a right-hand value.
-   *
-   * Note that [inGetterContext] and [inSetterContext] are not opposites, nor are
-   * they mutually exclusive. In other words, it is possible for both methods to return `true`when invoked on the same node.
-   * @return `true` if this expression is in a context where a getter will be invoked
+   * Return {@code true} if this expression is computing a right-hand value.
+   * <p>
+   * Note that {@link #inGetterContext()} and {@link #inSetterContext()} are not opposites, nor are
+   * they mutually exclusive. In other words, it is possible for both methods to return {@code true}when invoked on the same node.
+   * @return {@code true} if this expression is in a context where a getter will be invoked
    */
   bool inGetterContext() {
     ASTNode parent = this.parent;
@@ -10850,11 +10850,11 @@
   }
 
   /**
-   * Return `true` if this expression is computing a left-hand value.
-   *
-   * Note that [inGetterContext] and [inSetterContext] are not opposites, nor are
-   * they mutually exclusive. In other words, it is possible for both methods to return `true`when invoked on the same node.
-   * @return `true` if this expression is in a context where a setter will be invoked
+   * Return {@code true} if this expression is computing a left-hand value.
+   * <p>
+   * Note that {@link #inGetterContext()} and {@link #inSetterContext()} are not opposites, nor are
+   * they mutually exclusive. In other words, it is possible for both methods to return {@code true}when invoked on the same node.
+   * @return {@code true} if this expression is in a context where a setter will be invoked
    */
   bool inSetterContext() {
     ASTNode parent = this.parent;
@@ -10875,7 +10875,7 @@
       target = access;
     }
     if (parent is PrefixExpression) {
-      return ((parent as PrefixExpression)).operator.type.isIncrementOperator;
+      return ((parent as PrefixExpression)).operator.type.isIncrementOperator();
     } else if (parent is PostfixExpression) {
       return true;
     } else if (parent is AssignmentExpression) {
@@ -10883,7 +10883,7 @@
     }
     return false;
   }
-  bool get isSynthetic => _token.isSynthetic;
+  bool isSynthetic() => _token.isSynthetic();
 
   /**
    * Set the element associated with this identifier based on propagated type information to the
@@ -10914,7 +10914,7 @@
   }
 }
 /**
- * Instances of the class `SimpleStringLiteral` represent a string literal expression that
+ * Instances of the class {@code SimpleStringLiteral} represent a string literal expression that
  * does not contain any interpolations.
  * <pre>
  * simpleStringLiteral ::=
@@ -10979,10 +10979,10 @@
   String get value => _value;
 
   /**
-   * Return `true` if this string literal is a multi-line string.
-   * @return `true` if this string literal is a multi-line string
+   * Return {@code true} if this string literal is a multi-line string.
+   * @return {@code true} if this string literal is a multi-line string
    */
-  bool get isMultiline {
+  bool isMultiline() {
     if (_value.length < 6) {
       return false;
     }
@@ -10990,11 +10990,11 @@
   }
 
   /**
-   * Return `true` if this string literal is a raw string.
-   * @return `true` if this string literal is a raw string
+   * Return {@code true} if this string literal is a raw string.
+   * @return {@code true} if this string literal is a raw string
    */
-  bool get isRaw => _value.codeUnitAt(0) == 0x40;
-  bool get isSynthetic => _literal.isSynthetic;
+  bool isRaw() => _value.codeUnitAt(0) == 0x40;
+  bool isSynthetic() => _literal.isSynthetic();
 
   /**
    * Set the token representing the literal to the given token.
@@ -11018,20 +11018,20 @@
   }
 }
 /**
- * Instances of the class `Statement` defines the behavior common to nodes that represent a
+ * Instances of the class {@code Statement} defines the behavior common to nodes that represent a
  * statement.
  * <pre>
- * statement ::=[Block block]| [VariableDeclarationStatement initializedVariableDeclaration ';']| [ForStatement forStatement]| [ForEachStatement forEachStatement]| [WhileStatement whileStatement]| [DoStatement doStatement]| [SwitchStatement switchStatement]| [IfStatement ifStatement]| [TryStatement tryStatement]| [BreakStatement breakStatement]| [ContinueStatement continueStatement]| [ReturnStatement returnStatement]| [ExpressionStatement expressionStatement]| [FunctionDeclarationStatement functionSignature functionBody]</pre>
+ * statement ::={@link Block block}| {@link VariableDeclarationStatement initializedVariableDeclaration ';'}| {@link ForStatement forStatement}| {@link ForEachStatement forEachStatement}| {@link WhileStatement whileStatement}| {@link DoStatement doStatement}| {@link SwitchStatement switchStatement}| {@link IfStatement ifStatement}| {@link TryStatement tryStatement}| {@link BreakStatement breakStatement}| {@link ContinueStatement continueStatement}| {@link ReturnStatement returnStatement}| {@link ExpressionStatement expressionStatement}| {@link FunctionDeclarationStatement functionSignature functionBody}</pre>
  * @coverage dart.engine.ast
  */
 abstract class Statement extends ASTNode {
 }
 /**
- * Instances of the class `StringInterpolation` represent a string interpolation literal.
+ * Instances of the class {@code StringInterpolation} represent a string interpolation literal.
  * <pre>
  * stringInterpolation ::=
- * ''' [InterpolationElement interpolationElement]* '''
- * | '"' [InterpolationElement interpolationElement]* '"'
+ * ''' {@link InterpolationElement interpolationElement}* '''
+ * | '"' {@link InterpolationElement interpolationElement}* '"'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -11073,15 +11073,15 @@
   }
 }
 /**
- * Instances of the class `StringLiteral` represent a string literal expression.
+ * Instances of the class {@code StringLiteral} represent a string literal expression.
  * <pre>
- * stringLiteral ::=[SimpleStringLiteral simpleStringLiteral]| [AdjacentStrings adjacentStrings]| [StringInterpolation stringInterpolation]</pre>
+ * stringLiteral ::={@link SimpleStringLiteral simpleStringLiteral}| {@link AdjacentStrings adjacentStrings}| {@link StringInterpolation stringInterpolation}</pre>
  * @coverage dart.engine.ast
  */
 abstract class StringLiteral extends Literal {
 
   /**
-   * Return the value of the string literal, or `null` if the string is not a constant string
+   * Return the value of the string literal, or {@code null} if the string is not a constant string
    * without any string interpolation.
    * @return the value of the string literal
    */
@@ -11104,11 +11104,11 @@
   void appendStringValue(JavaStringBuilder builder);
 }
 /**
- * Instances of the class `SuperConstructorInvocation` represent the invocation of a
+ * Instances of the class {@code SuperConstructorInvocation} represent the invocation of a
  * superclass' constructor from within a constructor's initialization list.
  * <pre>
  * superInvocation ::=
- * 'super' ('.' [SimpleIdentifier name])? [ArgumentList argumentList]</pre>
+ * 'super' ('.' {@link SimpleIdentifier name})? {@link ArgumentList argumentList}</pre>
  * @coverage dart.engine.ast
  */
 class SuperConstructorInvocation extends ConstructorInitializer {
@@ -11119,12 +11119,12 @@
   Token _keyword;
 
   /**
-   * The token for the period before the name of the constructor that is being invoked, or`null` if the unnamed constructor is being invoked.
+   * The token for the period before the name of the constructor that is being invoked, or{@code null} if the unnamed constructor is being invoked.
    */
   Token _period;
 
   /**
-   * The name of the constructor that is being invoked, or `null` if the unnamed constructor
+   * The name of the constructor that is being invoked, or {@code null} if the unnamed constructor
    * is being invoked.
    */
   SimpleIdentifier _constructorName;
@@ -11135,12 +11135,12 @@
   ArgumentList _argumentList;
 
   /**
-   * The element associated with the constructor based on static type information, or `null`if the AST structure has not been resolved or if the constructor could not be resolved.
+   * The element associated with the constructor based on static type information, or {@code null}if the AST structure has not been resolved or if the constructor could not be resolved.
    */
   ConstructorElement _staticElement;
 
   /**
-   * The element associated with the constructor based on propagated type information, or `null` if the AST structure has not been
+   * The element associated with the constructor based on propagated type information, or {@code null} if the AST structure has not been
    * resolved or if the constructor could not be resolved.
    */
   ConstructorElement _propagatedElement;
@@ -11179,14 +11179,14 @@
   Token get beginToken => _keyword;
 
   /**
-   * Return the name of the constructor that is being invoked, or `null` if the unnamed
+   * Return the name of the constructor that is being invoked, or {@code null} if the unnamed
    * constructor is being invoked.
    * @return the name of the constructor that is being invoked
    */
   SimpleIdentifier get constructorName => _constructorName;
 
   /**
-   * Return the element associated with the constructor based on propagated type information, or`null` if the AST structure has not been resolved or if the constructor could not be
+   * Return the element associated with the constructor based on propagated type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    * @return the element associated with the super constructor
    */
@@ -11200,13 +11200,13 @@
   Token get keyword => _keyword;
 
   /**
-   * Return the token for the period before the name of the constructor that is being invoked, or`null` if the unnamed constructor is being invoked.
+   * Return the token for the period before the name of the constructor that is being invoked, or{@code null} if the unnamed constructor is being invoked.
    * @return the token for the period before the name of the constructor that is being invoked
    */
   Token get period => _period;
 
   /**
-   * Return the element associated with the constructor based on static type information, or`null` if the AST structure has not been resolved or if the constructor could not be
+   * Return the element associated with the constructor based on static type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    * @return the element associated with the constructor
    */
@@ -11268,7 +11268,7 @@
   }
 }
 /**
- * Instances of the class `SuperExpression` represent a super expression.
+ * Instances of the class {@code SuperExpression} represent a super expression.
  * <pre>
  * superExpression ::=
  * 'super'
@@ -11316,9 +11316,9 @@
   }
 }
 /**
- * Instances of the class `SwitchCase` represent the case in a switch statement.
+ * Instances of the class {@code SwitchCase} represent the case in a switch statement.
  * <pre>
- * switchCase ::=[SimpleIdentifier label]* 'case' [Expression expression] ':' [Statement statement]</pre>
+ * switchCase ::={@link SimpleIdentifier label}* 'case' {@link Expression expression} ':' {@link Statement statement}</pre>
  * @coverage dart.engine.ast
  */
 class SwitchCase extends SwitchMember {
@@ -11371,9 +11371,9 @@
   }
 }
 /**
- * Instances of the class `SwitchDefault` represent the default case in a switch statement.
+ * Instances of the class {@code SwitchDefault} represent the default case in a switch statement.
  * <pre>
- * switchDefault ::=[SimpleIdentifier label]* 'default' ':' [Statement statement]</pre>
+ * switchDefault ::={@link SimpleIdentifier label}* 'default' ':' {@link Statement statement}</pre>
  * @coverage dart.engine.ast
  */
 class SwitchDefault extends SwitchMember {
@@ -11403,7 +11403,7 @@
   }
 }
 /**
- * The abstract class `SwitchMember` defines the behavior common to objects representing
+ * The abstract class {@code SwitchMember} defines the behavior common to objects representing
  * elements within a switch statement.
  * <pre>
  * switchMember ::=
@@ -11512,10 +11512,10 @@
   }
 }
 /**
- * Instances of the class `SwitchStatement` represent a switch statement.
+ * Instances of the class {@code SwitchStatement} represent a switch statement.
  * <pre>
  * switchStatement ::=
- * 'switch' '(' [Expression expression] ')' '{' [SwitchCase switchCase]* [SwitchDefault defaultCase]? '}'
+ * 'switch' '(' {@link Expression expression} ')' '{' {@link SwitchCase switchCase}* {@link SwitchDefault defaultCase}? '}'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -11688,7 +11688,7 @@
   }
 }
 /**
- * Instances of the class `ThisExpression` represent a this expression.
+ * Instances of the class {@code ThisExpression} represent a this expression.
  * <pre>
  * thisExpression ::=
  * 'this'
@@ -11736,10 +11736,10 @@
   }
 }
 /**
- * Instances of the class `ThrowExpression` represent a throw expression.
+ * Instances of the class {@code ThrowExpression} represent a throw expression.
  * <pre>
  * throwExpression ::=
- * 'throw' [Expression expression]</pre>
+ * 'throw' {@link Expression expression}</pre>
  * @coverage dart.engine.ast
  */
 class ThrowExpression extends Expression {
@@ -11811,7 +11811,7 @@
   }
 }
 /**
- * Instances of the class `TopLevelVariableDeclaration` represent the declaration of one or
+ * Instances of the class {@code TopLevelVariableDeclaration} represent the declaration of one or
  * more top-level variables of the same type.
  * <pre>
  * topLevelVariableDeclaration ::=
@@ -11890,12 +11890,12 @@
   Token get firstTokenAfterCommentAndMetadata => _variableList.beginToken;
 }
 /**
- * Instances of the class `TryStatement` represent a try statement.
+ * Instances of the class {@code TryStatement} represent a try statement.
  * <pre>
  * tryStatement ::=
- * 'try' [Block block] ([CatchClause catchClause]+ finallyClause? | finallyClause)
+ * 'try' {@link Block block} ({@link CatchClause catchClause}+ finallyClause? | finallyClause)
  * finallyClause ::=
- * 'finally' [Block block]</pre>
+ * 'finally' {@link Block block}</pre>
  * @coverage dart.engine.ast
  */
 class TryStatement extends Statement {
@@ -11916,13 +11916,13 @@
   NodeList<CatchClause> _catchClauses;
 
   /**
-   * The token representing the 'finally' keyword, or `null` if the statement does not contain
+   * The token representing the 'finally' keyword, or {@code null} if the statement does not contain
    * a finally clause.
    */
   Token _finallyKeyword;
 
   /**
-   * The finally clause contained in the try statement, or `null` if the statement does not
+   * The finally clause contained in the try statement, or {@code null} if the statement does not
    * contain a finally clause.
    */
   Block _finallyClause;
@@ -11979,14 +11979,14 @@
   }
 
   /**
-   * Return the finally clause contained in the try statement, or `null` if the statement does
+   * Return the finally clause contained in the try statement, or {@code null} if the statement does
    * not contain a finally clause.
    * @return the finally clause contained in the try statement
    */
   Block get finallyClause => _finallyClause;
 
   /**
-   * Return the token representing the 'finally' keyword, or `null` if the statement does not
+   * Return the token representing the 'finally' keyword, or {@code null} if the statement does not
    * contain a finally clause.
    * @return the token representing the 'finally' keyword
    */
@@ -12036,7 +12036,7 @@
   }
 }
 /**
- * The abstract class `TypeAlias` defines the behavior common to declarations of type aliases.
+ * The abstract class {@code TypeAlias} defines the behavior common to declarations of type aliases.
  * <pre>
  * typeAlias ::=
  * 'typedef' typeAliasBody
@@ -12110,7 +12110,7 @@
   Token get firstTokenAfterCommentAndMetadata => _keyword;
 }
 /**
- * Instances of the class `TypeArgumentList` represent a list of type arguments.
+ * Instances of the class {@code TypeArgumentList} represent a list of type arguments.
  * <pre>
  * typeArguments ::=
  * '<' typeName (',' typeName)* '>'
@@ -12196,10 +12196,10 @@
   }
 }
 /**
- * Instances of the class `TypeName` represent the name of a type, which can optionally
+ * Instances of the class {@code TypeName} represent the name of a type, which can optionally
  * include type arguments.
  * <pre>
- * typeName ::=[Identifier identifier] typeArguments?
+ * typeName ::={@link Identifier identifier} typeArguments?
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -12211,19 +12211,19 @@
   Identifier _name;
 
   /**
-   * The type arguments associated with the type, or `null` if there are no type arguments.
+   * The type arguments associated with the type, or {@code null} if there are no type arguments.
    */
   TypeArgumentList _typeArguments;
 
   /**
-   * The type being named, or `null` if the AST structure has not been resolved.
+   * The type being named, or {@code null} if the AST structure has not been resolved.
    */
   Type2 _type;
 
   /**
    * Initialize a newly created type name.
    * @param name the name of the type
-   * @param typeArguments the type arguments associated with the type, or `null` if there are
+   * @param typeArguments the type arguments associated with the type, or {@code null} if there are
    * no type arguments
    */
   TypeName.full(Identifier name, TypeArgumentList typeArguments) {
@@ -12234,7 +12234,7 @@
   /**
    * Initialize a newly created type name.
    * @param name the name of the type
-   * @param typeArguments the type arguments associated with the type, or `null` if there are
+   * @param typeArguments the type arguments associated with the type, or {@code null} if there are
    * no type arguments
    */
   TypeName({Identifier name, TypeArgumentList typeArguments}) : this.full(name, typeArguments);
@@ -12254,18 +12254,18 @@
   Identifier get name => _name;
 
   /**
-   * Return the type being named, or `null` if the AST structure has not been resolved.
+   * Return the type being named, or {@code null} if the AST structure has not been resolved.
    * @return the type being named
    */
   Type2 get type => _type;
 
   /**
-   * Return the type arguments associated with the type, or `null` if there are no type
+   * Return the type arguments associated with the type, or {@code null} if there are no type
    * arguments.
    * @return the type arguments associated with the type
    */
   TypeArgumentList get typeArguments => _typeArguments;
-  bool get isSynthetic => _name.isSynthetic && _typeArguments == null;
+  bool isSynthetic() => _name.isSynthetic() && _typeArguments == null;
 
   /**
    * Set the name of the type to the given identifier.
@@ -12296,9 +12296,9 @@
   }
 }
 /**
- * Instances of the class `TypeParameter` represent a type parameter.
+ * Instances of the class {@code TypeParameter} represent a type parameter.
  * <pre>
- * typeParameter ::=[SimpleIdentifier name] ('extends' [TypeName bound])?
+ * typeParameter ::={@link SimpleIdentifier name} ('extends' {@link TypeName bound})?
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -12310,13 +12310,13 @@
   SimpleIdentifier _name;
 
   /**
-   * The token representing the 'extends' keyword, or `null` if there was no explicit upper
+   * The token representing the 'extends' keyword, or {@code null} if there was no explicit upper
    * bound.
    */
   Token _keyword;
 
   /**
-   * The name of the upper bound for legal arguments, or `null` if there was no explicit upper
+   * The name of the upper bound for legal arguments, or {@code null} if there was no explicit upper
    * bound.
    */
   TypeName _bound;
@@ -12347,7 +12347,7 @@
   accept(ASTVisitor visitor) => visitor.visitTypeParameter(this);
 
   /**
-   * Return the name of the upper bound for legal arguments, or `null` if there was no
+   * Return the name of the upper bound for legal arguments, or {@code null} if there was no
    * explicit upper bound.
    * @return the name of the upper bound for legal arguments
    */
@@ -12403,10 +12403,10 @@
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 }
 /**
- * Instances of the class `TypeParameterList` represent type parameters within a declaration.
+ * Instances of the class {@code TypeParameterList} represent type parameters within a declaration.
  * <pre>
  * typeParameterList ::=
- * '<' [TypeParameter typeParameter] (',' [TypeParameter typeParameter])* '>'
+ * '<' {@link TypeParameter typeParameter} (',' {@link TypeParameter typeParameter})* '>'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -12473,22 +12473,22 @@
   }
 }
 /**
- * The abstract class `TypedLiteral` defines the behavior common to literals that have a type
+ * The abstract class {@code TypedLiteral} defines the behavior common to literals that have a type
  * associated with them.
  * <pre>
- * listLiteral ::=[ListLiteral listLiteral]| [MapLiteral mapLiteral]</pre>
+ * listLiteral ::={@link ListLiteral listLiteral}| {@link MapLiteral mapLiteral}</pre>
  * @coverage dart.engine.ast
  */
 abstract class TypedLiteral extends Literal {
 
   /**
-   * The const modifier associated with this literal, or `null` if the literal is not a
+   * The const modifier associated with this literal, or {@code null} if the literal is not a
    * constant.
    */
   Token _modifier;
 
   /**
-   * The type argument associated with this literal, or `null` if no type arguments were
+   * The type argument associated with this literal, or {@code null} if no type arguments were
    * declared.
    */
   TypeArgumentList _typeArguments;
@@ -12496,7 +12496,7 @@
   /**
    * Initialize a newly created typed literal.
    * @param modifier the const modifier associated with this literal
-   * @param typeArguments the type argument associated with this literal, or `null` if no type
+   * @param typeArguments the type argument associated with this literal, or {@code null} if no type
    * arguments were declared
    */
   TypedLiteral.full(Token modifier, TypeArgumentList typeArguments) {
@@ -12507,7 +12507,7 @@
   /**
    * Initialize a newly created typed literal.
    * @param modifier the const modifier associated with this literal
-   * @param typeArguments the type argument associated with this literal, or `null` if no type
+   * @param typeArguments the type argument associated with this literal, or {@code null} if no type
    * arguments were declared
    */
   TypedLiteral({Token modifier, TypeArgumentList typeArguments}) : this.full(modifier, typeArguments);
@@ -12519,7 +12519,7 @@
   Token get modifier => _modifier;
 
   /**
-   * Return the type argument associated with this literal, or `null` if no type arguments
+   * Return the type argument associated with this literal, or {@code null} if no type arguments
    * were declared.
    * @return the type argument associated with this literal
    */
@@ -12545,10 +12545,10 @@
   }
 }
 /**
- * The abstract class `UriBasedDirective` defines the behavior common to nodes that represent
+ * The abstract class {@code UriBasedDirective} defines the behavior common to nodes that represent
  * a directive that references a URI.
  * <pre>
- * uriBasedDirective ::=[ExportDirective exportDirective]| [ImportDirective importDirective]| [PartDirective partDirective]</pre>
+ * uriBasedDirective ::={@link ExportDirective exportDirective}| {@link ImportDirective importDirective}| {@link PartDirective partDirective}</pre>
  * @coverage dart.engine.ast
  */
 abstract class UriBasedDirective extends Directive {
@@ -12583,7 +12583,7 @@
   StringLiteral get uri => _uri;
 
   /**
-   * Return the element associated with the URI of this directive, or `null` if the AST
+   * Return the element associated with the URI of this directive, or {@code null} if the AST
    * structure has not been resolved or if this URI could not be resolved. Examples of the latter
    * case include a directive that contains an invalid URL or a URL that does not exist.
    * @return the element associated with this directive
@@ -12603,10 +12603,10 @@
   }
 }
 /**
- * Instances of the class `VariableDeclaration` represent an identifier that has an initial
- * value associated with it. Instances of this class are always children of the class[VariableDeclarationList].
+ * Instances of the class {@code VariableDeclaration} represent an identifier that has an initial
+ * value associated with it. Instances of this class are always children of the class{@link VariableDeclarationList}.
  * <pre>
- * variableDeclaration ::=[SimpleIdentifier identifier] ('=' [Expression initialValue])?
+ * variableDeclaration ::={@link SimpleIdentifier identifier} ('=' {@link Expression initialValue})?
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -12618,13 +12618,13 @@
   SimpleIdentifier _name;
 
   /**
-   * The equal sign separating the variable name from the initial value, or `null` if the
+   * The equal sign separating the variable name from the initial value, or {@code null} if the
    * initial value was not specified.
    */
   Token _equals;
 
   /**
-   * The expression used to compute the initial value for the variable, or `null` if the
+   * The expression used to compute the initial value for the variable, or {@code null} if the
    * initial value was not specified.
    */
   Expression _initializer;
@@ -12679,14 +12679,14 @@
   }
 
   /**
-   * Return the equal sign separating the variable name from the initial value, or `null` if
+   * Return the equal sign separating the variable name from the initial value, or {@code null} if
    * the initial value was not specified.
    * @return the equal sign separating the variable name from the initial value
    */
   Token get equals => _equals;
 
   /**
-   * Return the expression used to compute the initial value for the variable, or `null` if
+   * Return the expression used to compute the initial value for the variable, or {@code null} if
    * the initial value was not specified.
    * @return the expression used to compute the initial value for the variable
    */
@@ -12699,23 +12699,23 @@
   SimpleIdentifier get name => _name;
 
   /**
-   * Return `true` if this variable was declared with the 'const' modifier.
-   * @return `true` if this variable was declared with the 'const' modifier
+   * Return {@code true} if this variable was declared with the 'const' modifier.
+   * @return {@code true} if this variable was declared with the 'const' modifier
    */
-  bool get isConst {
+  bool isConst() {
     ASTNode parent = this.parent;
-    return parent is VariableDeclarationList && ((parent as VariableDeclarationList)).isConst;
+    return parent is VariableDeclarationList && ((parent as VariableDeclarationList)).isConst();
   }
 
   /**
-   * Return `true` if this variable was declared with the 'final' modifier. Variables that are
-   * declared with the 'const' modifier will return `false` even though they are implicitly
+   * Return {@code true} if this variable was declared with the 'final' modifier. Variables that are
+   * declared with the 'const' modifier will return {@code false} even though they are implicitly
    * final.
-   * @return `true` if this variable was declared with the 'final' modifier
+   * @return {@code true} if this variable was declared with the 'final' modifier
    */
-  bool get isFinal {
+  bool isFinal() {
     ASTNode parent = this.parent;
-    return parent is VariableDeclarationList && ((parent as VariableDeclarationList)).isFinal;
+    return parent is VariableDeclarationList && ((parent as VariableDeclarationList)).isFinal();
   }
 
   /**
@@ -12749,28 +12749,28 @@
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 }
 /**
- * Instances of the class `VariableDeclarationList` represent the declaration of one or more
+ * Instances of the class {@code VariableDeclarationList} represent the declaration of one or more
  * variables of the same type.
  * <pre>
  * variableDeclarationList ::=
- * finalConstVarOrType [VariableDeclaration variableDeclaration] (',' [VariableDeclaration variableDeclaration])
+ * finalConstVarOrType {@link VariableDeclaration variableDeclaration} (',' {@link VariableDeclaration variableDeclaration})
  * finalConstVarOrType ::=
- * | 'final' [TypeName type]?
- * | 'const' [TypeName type]?
+ * | 'final' {@link TypeName type}?
+ * | 'const' {@link TypeName type}?
  * | 'var'
- * | [TypeName type]</pre>
+ * | {@link TypeName type}</pre>
  * @coverage dart.engine.ast
  */
 class VariableDeclarationList extends AnnotatedNode {
 
   /**
-   * The token representing the 'final', 'const' or 'var' keyword, or `null` if no keyword was
+   * The token representing the 'final', 'const' or 'var' keyword, or {@code null} if no keyword was
    * included.
    */
   Token _keyword;
 
   /**
-   * The type of the variables being declared, or `null` if no type was provided.
+   * The type of the variables being declared, or {@code null} if no type was provided.
    */
   TypeName _type;
 
@@ -12807,14 +12807,14 @@
   Token get endToken => _variables.endToken;
 
   /**
-   * Return the token representing the 'final', 'const' or 'var' keyword, or `null` if no
+   * Return the token representing the 'final', 'const' or 'var' keyword, or {@code null} if no
    * keyword was included.
    * @return the token representing the 'final', 'const' or 'var' keyword
    */
   Token get keyword => _keyword;
 
   /**
-   * Return the type of the variables being declared, or `null` if no type was provided.
+   * Return the type of the variables being declared, or {@code null} if no type was provided.
    * @return the type of the variables being declared
    */
   TypeName get type => _type;
@@ -12826,18 +12826,18 @@
   NodeList<VariableDeclaration> get variables => _variables;
 
   /**
-   * Return `true` if the variables in this list were declared with the 'const' modifier.
-   * @return `true` if the variables in this list were declared with the 'const' modifier
+   * Return {@code true} if the variables in this list were declared with the 'const' modifier.
+   * @return {@code true} if the variables in this list were declared with the 'const' modifier
    */
-  bool get isConst => _keyword is KeywordToken && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
+  bool isConst() => _keyword is KeywordToken && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
 
   /**
-   * Return `true` if the variables in this list were declared with the 'final' modifier.
-   * Variables that are declared with the 'const' modifier will return `false` even though
+   * Return {@code true} if the variables in this list were declared with the 'final' modifier.
+   * Variables that are declared with the 'const' modifier will return {@code false} even though
    * they are implicitly final.
-   * @return `true` if the variables in this list were declared with the 'final' modifier
+   * @return {@code true} if the variables in this list were declared with the 'final' modifier
    */
-  bool get isFinal => _keyword is KeywordToken && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
+  bool isFinal() => _keyword is KeywordToken && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
 
   /**
    * Set the token representing the 'final', 'const' or 'var' keyword to the given token.
@@ -12868,10 +12868,10 @@
   }
 }
 /**
- * Instances of the class `VariableDeclarationStatement` represent a list of variables that
+ * Instances of the class {@code VariableDeclarationStatement} represent a list of variables that
  * are being declared in a context where a statement is required.
  * <pre>
- * variableDeclarationStatement ::=[VariableDeclarationList variableList] ';'
+ * variableDeclarationStatement ::={@link VariableDeclarationList variableList} ';'
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -12939,10 +12939,10 @@
   }
 }
 /**
- * Instances of the class `WhileStatement` represent a while statement.
+ * Instances of the class {@code WhileStatement} represent a while statement.
  * <pre>
  * whileStatement ::=
- * 'while' '(' [Expression condition] ')' [Statement body]</pre>
+ * 'while' '(' {@link Expression condition} ')' {@link Statement body}</pre>
  * @coverage dart.engine.ast
  */
 class WhileStatement extends Statement {
@@ -13077,10 +13077,10 @@
   }
 }
 /**
- * Instances of the class `WithClause` represent the with clause in a class declaration.
+ * Instances of the class {@code WithClause} represent the with clause in a class declaration.
  * <pre>
  * withClause ::=
- * 'with' [TypeName mixin] (',' [TypeName mixin])
+ * 'with' {@link TypeName mixin} (',' {@link TypeName mixin})
  * </pre>
  * @coverage dart.engine.ast
  */
@@ -13141,9 +13141,9 @@
   }
 }
 /**
- * Instances of the class `BreadthFirstVisitor` implement an AST visitor that will recursively
- * visit all of the nodes in an AST structure, similar to [GeneralizingASTVisitor]. This
- * visitor uses a breadth-first ordering rather than the depth-first ordering of[GeneralizingASTVisitor].
+ * Instances of the class {@code BreadthFirstVisitor} implement an AST visitor that will recursively
+ * visit all of the nodes in an AST structure, similar to {@link GeneralizingASTVisitor}. This
+ * visitor uses a breadth-first ordering rather than the depth-first ordering of{@link GeneralizingASTVisitor}.
  * @coverage dart.engine.ast
  */
 class BreadthFirstVisitor<R> extends GeneralizingASTVisitor<R> {
@@ -13151,7 +13151,7 @@
   GeneralizingASTVisitor<Object> _childVisitor;
 
   /**
-   * Visit all nodes in the tree starting at the given `root` node, in depth-first order.
+   * Visit all nodes in the tree starting at the given {@code root} node, in depth-first order.
    * @param root the root of the ASTNode tree
    */
   void visitAllNodes(ASTNode root) {
@@ -13178,32 +13178,32 @@
   }
 }
 /**
- * Instances of the class `ConstantEvaluator` evaluate constant expressions to produce their
+ * Instances of the class {@code ConstantEvaluator} evaluate constant expressions to produce their
  * compile-time value. According to the Dart Language Specification: <blockquote> A constant
  * expression is one of the following:
- *
- * * A literal number.
- * * A literal boolean.
- * * A literal string where any interpolated expression is a compile-time constant that evaluates
- * to a numeric, string or boolean value or to `null`.
- * * `null`.
- * * A reference to a static constant variable.
- * * An identifier expression that denotes a constant variable, a class or a type variable.
- * * A constant constructor invocation.
- * * A constant list literal.
- * * A constant map literal.
- * * A simple or qualified identifier denoting a top-level function or a static method.
- * * A parenthesized expression `(e)` where `e` is a constant expression.
- * * An expression of one of the forms `identical(e1, e2)`, `e1 == e2`,`e1 != e2` where `e1` and `e2` are constant expressions that evaluate to a
- * numeric, string or boolean value or to `null`.
- * * An expression of one of the forms `!e`, `e1 && e2` or `e1 || e2`, where`e`, `e1` and `e2` are constant expressions that evaluate to a boolean value or
- * to `null`.
- * * An expression of one of the forms `~e`, `e1 ^ e2`, `e1 & e2`,`e1 | e2`, `e1 >> e2` or `e1 << e2`, where `e`, `e1` and `e2`are constant expressions that evaluate to an integer value or to `null`.
- * * An expression of one of the forms `-e`, `e1 + e2`, `e1 - e2`,`e1 * e2`, `e1 / e2`, `e1 ~/ e2`, `e1 > e2`, `e1 < e2`,`e1 >= e2`, `e1 <= e2` or `e1 % e2`, where `e`, `e1` and `e2`are constant expressions that evaluate to a numeric value or to `null`.
- *
- * </blockquote> The values returned by instances of this class are therefore `null` and
- * instances of the classes `Boolean`, `BigInteger`, `Double`, `String`, and`DartObject`.
- *
+ * <ul>
+ * <li>A literal number.</li>
+ * <li>A literal boolean.</li>
+ * <li>A literal string where any interpolated expression is a compile-time constant that evaluates
+ * to a numeric, string or boolean value or to {@code null}.</li>
+ * <li>{@code null}.</li>
+ * <li>A reference to a static constant variable.</li>
+ * <li>An identifier expression that denotes a constant variable, a class or a type variable.</li>
+ * <li>A constant constructor invocation.</li>
+ * <li>A constant list literal.</li>
+ * <li>A constant map literal.</li>
+ * <li>A simple or qualified identifier denoting a top-level function or a static method.</li>
+ * <li>A parenthesized expression {@code (e)} where {@code e} is a constant expression.</li>
+ * <li>An expression of one of the forms {@code identical(e1, e2)}, {@code e1 == e2},{@code e1 != e2} where {@code e1} and {@code e2} are constant expressions that evaluate to a
+ * numeric, string or boolean value or to {@code null}.</li>
+ * <li>An expression of one of the forms {@code !e}, {@code e1 && e2} or {@code e1 || e2}, where{@code e}, {@code e1} and {@code e2} are constant expressions that evaluate to a boolean value or
+ * to {@code null}.</li>
+ * <li>An expression of one of the forms {@code ~e}, {@code e1 ^ e2}, {@code e1 & e2},{@code e1 | e2}, {@code e1 >> e2} or {@code e1 << e2}, where {@code e}, {@code e1} and {@code e2}are constant expressions that evaluate to an integer value or to {@code null}.</li>
+ * <li>An expression of one of the forms {@code -e}, {@code e1 + e2}, {@code e1 - e2},{@code e1 * e2}, {@code e1 / e2}, {@code e1 ~/ e2}, {@code e1 > e2}, {@code e1 < e2},{@code e1 >= e2}, {@code e1 <= e2} or {@code e1 % e2}, where {@code e}, {@code e1} and {@code e2}are constant expressions that evaluate to a numeric value or to {@code null}.</li>
+ * </ul>
+ * </blockquote> The values returned by instances of this class are therefore {@code null} and
+ * instances of the classes {@code Boolean}, {@code BigInteger}, {@code Double}, {@code String}, and{@code DartObject}.
+ * <p>
  * In addition, this class defines several values that can be returned to indicate various
  * conditions encountered during evaluation. These are documented with the static field that define
  * those values.
@@ -13449,23 +13449,23 @@
   Object getConstantValue(Element element) {
     if (element is FieldElement) {
       FieldElement field = element as FieldElement;
-      if (field.isStatic && field.isConst) {
+      if (field.isStatic() && field.isConst()) {
       }
     }
     return NOT_A_CONSTANT;
   }
 }
 /**
- * Instances of the class `ElementLocator` locate the [Element Dart model element]associated with a given [ASTNode AST node].
+ * Instances of the class {@code ElementLocator} locate the {@link Element Dart model element}associated with a given {@link ASTNode AST node}.
  * @coverage dart.engine.ast
  */
 class ElementLocator {
 
   /**
-   * Locate the [Element Dart model element] associated with the given [ASTNode AST
-   * node].
-   * @param node the node (not `null`)
-   * @return the associated element, or `null` if none is found
+   * Locate the {@link Element Dart model element} associated with the given {@link ASTNode AST
+   * node}.
+   * @param node the node (not {@code null})
+   * @return the associated element, or {@code null} if none is found
    */
   static Element locate(ASTNode node) {
     ElementLocator_ElementMapper mapper = new ElementLocator_ElementMapper();
@@ -13527,15 +13527,15 @@
   Element visitVariableDeclaration(VariableDeclaration node) => node.element;
 }
 /**
- * Instances of the class `GeneralizingASTVisitor` implement an AST visitor that will
- * recursively visit all of the nodes in an AST structure (like instances of the class[RecursiveASTVisitor]). In addition, when a node of a specific type is visited not only
+ * Instances of the class {@code GeneralizingASTVisitor} implement an AST visitor that will
+ * recursively visit all of the nodes in an AST structure (like instances of the class{@link RecursiveASTVisitor}). In addition, when a node of a specific type is visited not only
  * will the visit method for that specific type of node be invoked, but additional methods for the
  * superclasses of that node will also be invoked. For example, using an instance of this class to
- * visit a [Block] will cause the method [visitBlock] to be invoked but will
- * also cause the methods [visitStatement] and [visitNode] to be
+ * visit a {@link Block} will cause the method {@link #visitBlock(Block)} to be invoked but will
+ * also cause the methods {@link #visitStatement(Statement)} and {@link #visitNode(ASTNode)} to be
  * subsequently invoked. This allows visitors to be written that visit all statements without
- * needing to override the visit method for each of the specific subclasses of [Statement].
- *
+ * needing to override the visit method for each of the specific subclasses of {@link Statement}.
+ * <p>
  * Subclasses that override a visit method must either invoke the overridden visit method or
  * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
  * for superclasses of the node to not be invoked and will cause the children of the visited node to
@@ -13671,9 +13671,9 @@
   R visitWithClause(WithClause node) => visitNode(node);
 }
 /**
- * Instances of the class `NodeLocator` locate the [ASTNode AST node] associated with a
+ * Instances of the class {@code NodeLocator} locate the {@link ASTNode AST node} associated with a
  * source range, given the AST structure built from the source. More specifically, they will return
- * the [ASTNode AST node] with the shortest length whose source range completely encompasses
+ * the {@link ASTNode AST node} with the shortest length whose source range completely encompasses
  * the specified range.
  * @coverage dart.engine.ast
  */
@@ -13690,13 +13690,13 @@
   int _endOffset = 0;
 
   /**
-   * The element that was found that corresponds to the given source range, or `null` if there
+   * The element that was found that corresponds to the given source range, or {@code null} if there
    * is no such element.
    */
   ASTNode _foundNode;
 
   /**
-   * Initialize a newly created locator to locate one or more [ASTNode AST nodes] by locating
+   * Initialize a newly created locator to locate one or more {@link ASTNode AST nodes} by locating
    * the node within an AST structure that corresponds to the given offset in the source.
    * @param offset the offset used to identify the node
    */
@@ -13708,7 +13708,7 @@
   }
 
   /**
-   * Initialize a newly created locator to locate one or more [ASTNode AST nodes] by locating
+   * Initialize a newly created locator to locate one or more {@link ASTNode AST nodes} by locating
    * the node within an AST structure that corresponds to the given range of characters in the
    * source.
    * @param start the start offset of the range used to identify the node
@@ -13723,15 +13723,15 @@
   }
 
   /**
-   * Return the node that was found that corresponds to the given source range, or `null` if
+   * Return the node that was found that corresponds to the given source range, or {@code null} if
    * there is no such node.
    * @return the node that was found
    */
   ASTNode get foundNode => _foundNode;
 
   /**
-   * Search within the given AST node for an identifier representing a [DartElement Dart
-   * element] in the specified source range. Return the element that was found, or `null` if
+   * Search within the given AST node for an identifier representing a {@link DartElement Dart
+   * element} in the specified source range. Return the element that was found, or {@code null} if
    * no element was found.
    * @param node the AST node within which to search
    * @return the element that was found
@@ -13770,17 +13770,17 @@
   }
 }
 /**
- * Instances of the class `NodeFoundException` are used to cancel visiting after a node has
+ * Instances of the class {@code NodeFoundException} are used to cancel visiting after a node has
  * been found.
  */
 class NodeLocator_NodeFoundException extends RuntimeException {
   static int _serialVersionUID = 1;
 }
 /**
- * Instances of the class `RecursiveASTVisitor` implement an AST visitor that will recursively
+ * Instances of the class {@code RecursiveASTVisitor} implement an AST visitor that will recursively
  * visit all of the nodes in an AST structure. For example, using an instance of this class to visit
- * a [Block] will also cause all of the statements in the block to be visited.
- *
+ * a {@link Block} will also cause all of the statements in the block to be visited.
+ * <p>
  * Subclasses that override a visit method must either invoke the overridden visit method or must
  * explicitly ask the visited node to visit its children. Failure to do so will cause the children
  * of the visited node to not be visited.
@@ -14193,7 +14193,7 @@
   }
 }
 /**
- * Instances of the class `SimpleASTVisitor` implement an AST visitor that will do nothing
+ * Instances of the class {@code SimpleASTVisitor} implement an AST visitor that will do nothing
  * when visiting an AST node. It is intended to be a superclass for classes that use the visitor
  * pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a whole
  * structure) and that only need to visit a small number of node types.
@@ -14303,7 +14303,7 @@
   R visitWithClause(WithClause node) => null;
 }
 /**
- * Instances of the class `ToSourceVisitor` write a source representation of a visited AST
+ * Instances of the class {@code ToSourceVisitor} write a source representation of a visited AST
  * node (and all of it's children) to a writer.
  * @coverage dart.engine.ast
  */
@@ -14680,7 +14680,7 @@
     return null;
   }
   Object visitIndexExpression(IndexExpression node) {
-    if (node.isCascaded) {
+    if (node.isCascaded()) {
       _writer.print("..");
     } else {
       visit(node.array);
@@ -14780,14 +14780,14 @@
     visit5(node.propertyKeyword, " ");
     visit5(node.operatorKeyword, " ");
     visit(node.name);
-    if (!node.isGetter) {
+    if (!node.isGetter()) {
       visit(node.parameters);
     }
     visit4(" ", node.body);
     return null;
   }
   Object visitMethodInvocation(MethodInvocation node) {
-    if (node.isCascaded) {
+    if (node.isCascaded()) {
       _writer.print("..");
     } else {
       visit2(node.target, ".");
@@ -14846,7 +14846,7 @@
     return null;
   }
   Object visitPropertyAccess(PropertyAccess node) {
-    if (node.isCascaded) {
+    if (node.isCascaded()) {
       _writer.print("..");
     } else {
       visit(node.target);
@@ -15017,7 +15017,7 @@
   }
 
   /**
-   * Safely visit the given node, printing the suffix after the node if it is non-`null`.
+   * Safely visit the given node, printing the suffix after the node if it is non-{@code null}.
    * @param suffix the suffix to be printed if there is a node to visit
    * @param node the node to be visited
    */
@@ -15029,7 +15029,7 @@
   }
 
   /**
-   * Safely visit the given node, printing the prefix before the node if it is non-`null`.
+   * Safely visit the given node, printing the prefix before the node if it is non-{@code null}.
    * @param prefix the prefix to be printed if there is a node to visit
    * @param node the node to be visited
    */
@@ -15053,7 +15053,7 @@
   }
 
   /**
-   * Safely visit the given node, printing the suffix after the node if it is non-`null`.
+   * Safely visit the given node, printing the suffix after the node if it is non-{@code null}.
    * @param suffix the suffix to be printed if there is a node to visit
    * @param node the node to be visited
    */
@@ -15133,7 +15133,7 @@
   }
 }
 /**
- * Instances of the class `ASTCloner` implement an object that will clone any AST structure
+ * Instances of the class {@code ASTCloner} implement an object that will clone any AST structure
  * that it visits. The cloner will only clone the structure, it will not preserve any resolution
  * results or properties associated with the nodes.
  */
@@ -15155,9 +15155,9 @@
   ClassDeclaration visitClassDeclaration(ClassDeclaration node) => new ClassDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), node.abstractKeyword, node.classKeyword, clone2(node.name), clone2(node.typeParameters), clone2(node.extendsClause), clone2(node.withClause), clone2(node.implementsClause), node.leftBracket, clone3(node.members), node.rightBracket);
   ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias.full(clone2(node.documentationComment), clone3(node.metadata), node.keyword, clone2(node.name), clone2(node.typeParameters), node.equals, node.abstractKeyword, clone2(node.superclass), clone2(node.withClause), clone2(node.implementsClause), node.semicolon);
   Comment visitComment(Comment node) {
-    if (node.isDocumentation) {
+    if (node.isDocumentation()) {
       return Comment.createDocumentationComment2(node.tokens, clone3(node.references));
-    } else if (node.isBlock) {
+    } else if (node.isBlock()) {
       return Comment.createBlockComment(node.tokens);
     }
     return Comment.createEndOfLineComment(node.tokens);
@@ -15277,7 +15277,7 @@
  * Traverse the AST from initial child node to successive parents, building a collection of local
  * variable and parameter names visible to the initial child node. In case of name shadowing, the
  * first name seen is the most specific one so names are not redefined.
- *
+ * <p>
  * Completion test code coverage is 95%. The two basic blocks that are not executed cannot be
  * executed. They are included for future reference.
  * @coverage com.google.dart.engine.services.completion
diff --git a/pkg/analyzer_experimental/lib/src/generated/constant.dart b/pkg/analyzer_experimental/lib/src/generated/constant.dart
index 294d22c..2b39d59 100644
--- a/pkg/analyzer_experimental/lib/src/generated/constant.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/constant.dart
@@ -9,32 +9,32 @@
 import 'element.dart';
 import 'engine.dart' show AnalysisEngine;
 /**
- * Instances of the class `ConstantEvaluator` evaluate constant expressions to produce their
+ * Instances of the class {@code ConstantEvaluator} evaluate constant expressions to produce their
  * compile-time value. According to the Dart Language Specification: <blockquote> A constant
  * expression is one of the following:
- *
- * * A literal number.
- * * A literal boolean.
- * * A literal string where any interpolated expression is a compile-time constant that evaluates
- * to a numeric, string or boolean value or to `null`.
- * * `null`.
- * * A reference to a static constant variable.
- * * An identifier expression that denotes a constant variable, a class or a type variable.
- * * A constant constructor invocation.
- * * A constant list literal.
- * * A constant map literal.
- * * A simple or qualified identifier denoting a top-level function or a static method.
- * * A parenthesized expression `(e)` where `e` is a constant expression.
- * * An expression of one of the forms `identical(e1, e2)`, `e1 == e2`,`e1 != e2` where `e1` and `e2` are constant expressions that evaluate to a
- * numeric, string or boolean value or to `null`.
- * * An expression of one of the forms `!e`, `e1 && e2` or `e1 || e2`, where`e`, `e1` and `e2` are constant expressions that evaluate to a boolean value or
- * to `null`.
- * * An expression of one of the forms `~e`, `e1 ^ e2`, `e1 & e2`,`e1 | e2`, `e1 >> e2` or `e1 << e2`, where `e`, `e1` and `e2`are constant expressions that evaluate to an integer value or to `null`.
- * * An expression of one of the forms `-e`, `e1 + e2`, `e1 - e2`,`e1 * e2`, `e1 / e2`, `e1 ~/ e2`, `e1 > e2`, `e1 < e2`,`e1 >= e2`, `e1 <= e2` or `e1 % e2`, where `e`, `e1` and `e2`are constant expressions that evaluate to a numeric value or to `null`.
- *
- * </blockquote> The values returned by instances of this class are therefore `null` and
- * instances of the classes `Boolean`, `BigInteger`, `Double`, `String`, and`DartObject`.
- *
+ * <ul>
+ * <li>A literal number.</li>
+ * <li>A literal boolean.</li>
+ * <li>A literal string where any interpolated expression is a compile-time constant that evaluates
+ * to a numeric, string or boolean value or to {@code null}.</li>
+ * <li>{@code null}.</li>
+ * <li>A reference to a static constant variable.</li>
+ * <li>An identifier expression that denotes a constant variable, a class or a type variable.</li>
+ * <li>A constant constructor invocation.</li>
+ * <li>A constant list literal.</li>
+ * <li>A constant map literal.</li>
+ * <li>A simple or qualified identifier denoting a top-level function or a static method.</li>
+ * <li>A parenthesized expression {@code (e)} where {@code e} is a constant expression.</li>
+ * <li>An expression of one of the forms {@code identical(e1, e2)}, {@code e1 == e2},{@code e1 != e2} where {@code e1} and {@code e2} are constant expressions that evaluate to a
+ * numeric, string or boolean value or to {@code null}.</li>
+ * <li>An expression of one of the forms {@code !e}, {@code e1 && e2} or {@code e1 || e2}, where{@code e}, {@code e1} and {@code e2} are constant expressions that evaluate to a boolean value or
+ * to {@code null}.</li>
+ * <li>An expression of one of the forms {@code ~e}, {@code e1 ^ e2}, {@code e1 & e2},{@code e1 | e2}, {@code e1 >> e2} or {@code e1 << e2}, where {@code e}, {@code e1} and {@code e2}are constant expressions that evaluate to an integer value or to {@code null}.</li>
+ * <li>An expression of one of the forms {@code -e}, {@code e1 + e2}, {@code e1 - e2},{@code e1 * e2}, {@code e1 / e2}, {@code e1 ~/ e2}, {@code e1 > e2}, {@code e1 < e2},{@code e1 >= e2}, {@code e1 <= e2} or {@code e1 % e2}, where {@code e}, {@code e1} and {@code e2}are constant expressions that evaluate to a numeric value or to {@code null}.</li>
+ * </ul>
+ * </blockquote> The values returned by instances of this class are therefore {@code null} and
+ * instances of the classes {@code Boolean}, {@code BigInteger}, {@code Double}, {@code String}, and{@code DartObject}.
+ * <p>
  * In addition, this class defines several values that can be returned to indicate various
  * conditions encountered during evaluation. These are documented with the static field that define
  * those values.
@@ -67,7 +67,7 @@
   }
 }
 /**
- * Instances of the class `EvaluationResult` represent the result of attempting to evaluate an
+ * Instances of the class {@code EvaluationResult} represent the result of attempting to evaluate an
  * expression.
  */
 class EvaluationResult {
@@ -100,7 +100,7 @@
 
   /**
    * Initialize a newly created result object with the given state. Clients should use one of the
-   * factory methods: [forErrors] and [forValue].
+   * factory methods: {@link #forErrors(AnalysisError\[\])} and {@link #forValue(Object)}.
    * @param value the value of the expression
    * @param errors the errors that should be reported for the expression(s) that were evaluated
    */
@@ -118,21 +118,21 @@
   List<AnalysisError> get errors => _errors == null ? AnalysisError.NO_ERRORS : _errors;
 
   /**
-   * Return the value of the expression, or `null` if the expression evaluated to `null`or if the expression could not be evaluated, either because it was not a compile-time constant
+   * Return the value of the expression, or {@code null} if the expression evaluated to {@code null}or if the expression could not be evaluated, either because it was not a compile-time constant
    * expression or because it would throw an exception when evaluated.
    * @return the value of the expression
    */
   Object get value => _value;
 
   /**
-   * Return `true` if the expression is a compile-time constant expression that would not
+   * Return {@code true} if the expression is a compile-time constant expression that would not
    * throw an exception when evaluated.
-   * @return `true` if the expression is a valid compile-time constant expression
+   * @return {@code true} if the expression is a valid compile-time constant expression
    */
-  bool get isValid => _errors == null;
+  bool isValid() => _errors == null;
 }
 /**
- * Instances of the class `ConstantFinder` are used to traverse the AST structures of all of
+ * Instances of the class {@code ConstantFinder} are used to traverse the AST structures of all of
  * the compilation units being resolved and build a table mapping constant variable elements to the
  * declarations of those variables.
  */
@@ -151,7 +151,7 @@
   Object visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     Expression initializer = node.initializer;
-    if (initializer != null && node.isConst) {
+    if (initializer != null && node.isConst()) {
       VariableElement element = node.element;
       if (element != null) {
         _variableMap[element] = node;
@@ -161,10 +161,10 @@
   }
 }
 /**
- * Instances of the class `ConstantValueComputer` compute the values of constant variables in
+ * Instances of the class {@code ConstantValueComputer} compute the values of constant variables in
  * one or more compilation units. The expected usage pattern is for the compilation units to be
- * added to this computer using the method [add] and then for the method[computeValues] to invoked exactly once. Any use of an instance after invoking the
- * method [computeValues] will result in unpredictable behavior.
+ * added to this computer using the method {@link #add(CompilationUnit)} and then for the method{@link #computeValues()} to invoked exactly once. Any use of an instance after invoking the
+ * method {@link #computeValues()} will result in unpredictable behavior.
  */
 class ConstantValueComputer {
 
@@ -204,13 +204,13 @@
       _referenceGraph.addNode(element);
       entry.getValue().initializer.accept(referenceFinder);
     }
-    while (!_referenceGraph.isEmpty) {
+    while (!_referenceGraph.isEmpty()) {
       VariableElement element = _referenceGraph.removeSink();
       while (element != null) {
         computeValueFor(element);
         element = _referenceGraph.removeSink();
       }
-      if (!_referenceGraph.isEmpty) {
+      if (!_referenceGraph.isEmpty()) {
         List<VariableElement> variablesInCycle = _referenceGraph.findCycle();
         if (variablesInCycle == null) {
           AnalysisEngine.instance.logger.logError("Exiting constant value computer with ${_referenceGraph.nodeCount} variables that are neither sinks no in a cycle");
@@ -256,29 +256,29 @@
   }
 }
 /**
- * Instances of the class `ConstantVisitor` evaluate constant expressions to produce their
+ * Instances of the class {@code ConstantVisitor} evaluate constant expressions to produce their
  * compile-time value. According to the Dart Language Specification: <blockquote> A constant
  * expression is one of the following:
- *
- * * A literal number.
- * * A literal boolean.
- * * A literal string where any interpolated expression is a compile-time constant that evaluates
- * to a numeric, string or boolean value or to `null`.
- * * `null`.
- * * A reference to a static constant variable.
- * * An identifier expression that denotes a constant variable, a class or a type variable.
- * * A constant constructor invocation.
- * * A constant list literal.
- * * A constant map literal.
- * * A simple or qualified identifier denoting a top-level function or a static method.
- * * A parenthesized expression `(e)` where `e` is a constant expression.
- * * An expression of one of the forms `identical(e1, e2)`, `e1 == e2`,`e1 != e2` where `e1` and `e2` are constant expressions that evaluate to a
- * numeric, string or boolean value or to `null`.
- * * An expression of one of the forms `!e`, `e1 && e2` or `e1 || e2`, where`e`, `e1` and `e2` are constant expressions that evaluate to a boolean value or
- * to `null`.
- * * An expression of one of the forms `~e`, `e1 ^ e2`, `e1 & e2`,`e1 | e2`, `e1 >> e2` or `e1 << e2`, where `e`, `e1` and `e2`are constant expressions that evaluate to an integer value or to `null`.
- * * An expression of one of the forms `-e`, `e1 + e2`, `e1 - e2`,`e1 * e2`, `e1 / e2`, `e1 ~/ e2`, `e1 > e2`, `e1 < e2`,`e1 >= e2`, `e1 <= e2` or `e1 % e2`, where `e`, `e1` and `e2`are constant expressions that evaluate to a numeric value or to `null`.
- *
+ * <ul>
+ * <li>A literal number.</li>
+ * <li>A literal boolean.</li>
+ * <li>A literal string where any interpolated expression is a compile-time constant that evaluates
+ * to a numeric, string or boolean value or to {@code null}.</li>
+ * <li>{@code null}.</li>
+ * <li>A reference to a static constant variable.</li>
+ * <li>An identifier expression that denotes a constant variable, a class or a type variable.</li>
+ * <li>A constant constructor invocation.</li>
+ * <li>A constant list literal.</li>
+ * <li>A constant map literal.</li>
+ * <li>A simple or qualified identifier denoting a top-level function or a static method.</li>
+ * <li>A parenthesized expression {@code (e)} where {@code e} is a constant expression.</li>
+ * <li>An expression of one of the forms {@code identical(e1, e2)}, {@code e1 == e2},{@code e1 != e2} where {@code e1} and {@code e2} are constant expressions that evaluate to a
+ * numeric, string or boolean value or to {@code null}.</li>
+ * <li>An expression of one of the forms {@code !e}, {@code e1 && e2} or {@code e1 || e2}, where{@code e}, {@code e1} and {@code e2} are constant expressions that evaluate to a boolean value or
+ * to {@code null}.</li>
+ * <li>An expression of one of the forms {@code ~e}, {@code e1 ^ e2}, {@code e1 & e2},{@code e1 | e2}, {@code e1 >> e2} or {@code e1 << e2}, where {@code e}, {@code e1} and {@code e2}are constant expressions that evaluate to an integer value or to {@code null}.</li>
+ * <li>An expression of one of the forms {@code -e}, {@code e1 + e2}, {@code e1 - e2},{@code e1 * e2}, {@code e1 / e2}, {@code e1 ~/ e2}, {@code e1 > e2}, {@code e1 < e2},{@code e1 >= e2}, {@code e1 <= e2} or {@code e1 % e2}, where {@code e}, {@code e1} and {@code e2}are constant expressions that evaluate to a numeric value or to {@code null}.</li>
+ * </ul>
  * </blockquote>
  */
 class ConstantVisitor extends GeneralizingASTVisitor<EvaluationResultImpl> {
@@ -298,7 +298,7 @@
     EvaluationResultImpl rightResult = node.rightOperand.accept(this);
     TokenType operatorType = node.operator.type;
     if (operatorType != TokenType.BANG_EQ && operatorType != TokenType.EQ_EQ) {
-      if (leftResult is ValidResult && ((leftResult as ValidResult)).isNull || rightResult is ValidResult && ((rightResult as ValidResult)).isNull) {
+      if (leftResult is ValidResult && ((leftResult as ValidResult)).isNull() || rightResult is ValidResult && ((rightResult as ValidResult)).isNull()) {
         return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
       }
     }
@@ -350,7 +350,7 @@
   EvaluationResultImpl visitDoubleLiteral(DoubleLiteral node) => new ValidResult(node.value);
   EvaluationResultImpl visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorElement constructor = node.element;
-    if (constructor != null && constructor.isConst) {
+    if (constructor != null && constructor.isConst()) {
       node.argumentList.accept(this);
       return ValidResult.RESULT_OBJECT;
     }
@@ -399,7 +399,7 @@
           Element enclosingElement = function.enclosingElement;
           if (enclosingElement is CompilationUnitElement) {
             LibraryElement library = ((enclosingElement as CompilationUnitElement)).library;
-            if (library.isDartCore) {
+            if (library.isDartCore()) {
               EvaluationResultImpl leftArgument = arguments[0].accept(this);
               EvaluationResultImpl rightArgument = arguments[1].accept(this);
               return leftArgument.equalEqual(node, rightArgument);
@@ -416,7 +416,7 @@
   EvaluationResultImpl visitPrefixedIdentifier(PrefixedIdentifier node) => getConstantValue(node, node.element);
   EvaluationResultImpl visitPrefixExpression(PrefixExpression node) {
     EvaluationResultImpl operand = node.operand.accept(this);
-    if (operand is ValidResult && ((operand as ValidResult)).isNull) {
+    if (operand is ValidResult && ((operand as ValidResult)).isNull()) {
       return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
     }
     while (true) {
@@ -479,7 +479,7 @@
 
   /**
    * Return the union of the errors encoded in the given results.
-   * @param leftResult the first set of errors, or `null` if there was no previous collection
+   * @param leftResult the first set of errors, or {@code null} if there was no previous collection
    * of errors
    * @param rightResult the errors to be added to the collection, or a valid result if there are no
    * errors to be added
@@ -497,7 +497,7 @@
   }
 }
 /**
- * Instances of the class `DirectedGraph` implement a directed graph in which the nodes are
+ * Instances of the class {@code DirectedGraph} implement a directed graph in which the nodes are
  * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an
  * edge from any node to any other node, including itself, but will not represent multiple edges
  * between the same pair of nodes.
@@ -543,7 +543,7 @@
   }
 
   /**
-   * Return a list of nodes that form a cycle, or `null` if there are no cycles in this graph.
+   * Return a list of nodes that form a cycle, or {@code null} if there are no cycles in this graph.
    * @return a list of nodes that form a cycle
    */
   List<N> findCycle() => null;
@@ -570,10 +570,10 @@
   }
 
   /**
-   * Return `true` if this graph is empty.
-   * @return `true` if this graph is empty
+   * Return {@code true} if this graph is empty.
+   * @return {@code true} if this graph is empty
    */
-  bool get isEmpty => _edges.isEmpty;
+  bool isEmpty() => _edges.isEmpty;
 
   /**
    * Remove all of the given nodes from this graph. As a consequence, any edges for which those
@@ -592,7 +592,7 @@
    * the same (neither node will either be added or removed).
    * @param head the node at the head of the edge
    * @param tail the node at the tail of the edge
-   * @return `true` if the graph was modified as a result of this operation
+   * @return {@code true} if the graph was modified as a result of this operation
    */
   void removeEdge(N head, N tail) {
     Set<N> tails = _edges[head];
@@ -616,7 +616,7 @@
   /**
    * Find one node (referred to as a sink node) that has no outgoing edges (that is, for which there
    * are no edges that have that node as the head of the edge) and remove it from this graph. Return
-   * the node that was removed, or `null` if there are no such nodes either because the graph
+   * the node that was removed, or {@code null} if there are no such nodes either because the graph
    * is empty or because every node in the graph has at least one outgoing edge. As a consequence of
    * removing the node from the graph any edges for which that node was a tail will also be removed.
    * @return the sink node that was removed
@@ -632,7 +632,7 @@
 
   /**
    * Return one node that has no outgoing edges (that is, for which there are no edges that have
-   * that node as the head of the edge), or `null` if there are no such nodes.
+   * that node as the head of the edge), or {@code null} if there are no such nodes.
    * @return a sink node
    */
   N findSink() {
@@ -643,7 +643,7 @@
   }
 }
 /**
- * Instances of the class `ErrorResult` represent the result of evaluating an expression that
+ * Instances of the class {@code ErrorResult} represent the result of evaluating an expression that
  * is not a valid compile time constant.
  */
 class ErrorResult extends EvaluationResultImpl {
@@ -687,7 +687,6 @@
   EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateError(node, this);
   EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideError(node, this);
   EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualError(node, this);
-  bool equalValues(EvaluationResultImpl result) => false;
   List<ErrorResult_ErrorData> get errorData => _errors;
   EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanError(node, this);
   EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualError(node, this);
@@ -782,7 +781,7 @@
   ASTNode get node => _node;
 }
 /**
- * Instances of the class `InternalResult` represent the result of attempting to evaluate a
+ * Instances of the class {@code InternalResult} represent the result of attempting to evaluate a
  * expression.
  */
 abstract class EvaluationResultImpl {
@@ -794,7 +793,6 @@
   EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand);
   EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand);
   EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand);
-  bool equalValues(EvaluationResultImpl result);
   EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand);
   EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand);
   EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand);
@@ -853,7 +851,7 @@
   EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand);
 }
 /**
- * Instances of the class `ReferenceFinder` add reference information for a given variable to
+ * Instances of the class {@code ReferenceFinder} add reference information for a given variable to
  * the bi-directional mapping used to order the evaluation of constants.
  */
 class ReferenceFinder extends RecursiveASTVisitor<Object> {
@@ -887,7 +885,7 @@
     }
     if (element is VariableElement) {
       VariableElement variable = element as VariableElement;
-      if (variable.isConst) {
+      if (variable.isConst()) {
         _referenceGraph.addEdge(_source, variable);
       }
     }
@@ -895,7 +893,7 @@
   }
 }
 /**
- * Instances of the class `ValidResult` represent the result of attempting to evaluate a valid
+ * Instances of the class {@code ValidResult} represent the result of attempting to evaluate a valid
  * compile time constant expression.
  */
 class ValidResult extends EvaluationResultImpl {
@@ -918,7 +916,7 @@
   static ValidResult RESULT_INT = new ValidResult(null);
 
   /**
-   * A result object representing the `null` value.
+   * A result object representing the {@code null} value.
    */
   static ValidResult RESULT_NULL = new ValidResult(null);
 
@@ -966,7 +964,7 @@
   EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToValid(node, this);
   EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndValid(node, this);
   EvaluationResultImpl bitNot(Expression node) {
-    if (isSomeInt) {
+    if (isSomeInt()) {
       return RESULT_INT;
     }
     if (_value == null) {
@@ -981,7 +979,6 @@
   EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateValid(node, this);
   EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideValid(node, this);
   EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualValid(node, this);
-  bool equalValues(EvaluationResultImpl result) => identical(equalEqual(null, result), RESULT_TRUE);
   Object get value => _value;
   EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanValid(node, this);
   EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualValid(node, this);
@@ -990,7 +987,7 @@
   EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualValid(node, this);
   EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndValid(node, this);
   EvaluationResultImpl logicalNot(Expression node) {
-    if (isSomeBool) {
+    if (isSomeBool()) {
       return RESULT_BOOL;
     }
     if (_value == null) {
@@ -1003,7 +1000,7 @@
   EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrValid(node, this);
   EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusValid(node, this);
   EvaluationResultImpl negated(Expression node) {
-    if (isSomeNum) {
+    if (isSomeNum()) {
       return RESULT_INT;
     }
     if (_value == null) {
@@ -1042,8 +1039,8 @@
   }
   EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeNum || leftOperand2.isSomeNum) {
-      if (isAnyNum && leftOperand2.isAnyNum) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
         return RESULT_NUM;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1074,8 +1071,8 @@
   }
   EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeInt || leftOperand2.isSomeInt) {
-      if (isAnyInt && leftOperand2.isAnyInt) {
+    if (isSomeInt() || leftOperand2.isSomeInt()) {
+      if (isAnyInt() && leftOperand2.isAnyInt()) {
         return RESULT_INT;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
@@ -1098,8 +1095,8 @@
   }
   EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeInt || leftOperand2.isSomeInt) {
-      if (isAnyInt && leftOperand2.isAnyInt) {
+    if (isSomeInt() || leftOperand2.isSomeInt()) {
+      if (isAnyInt() && leftOperand2.isAnyInt()) {
         return RESULT_INT;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
@@ -1122,8 +1119,8 @@
   }
   EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeInt || leftOperand2.isSomeInt) {
-      if (isAnyInt && leftOperand2.isAnyInt) {
+    if (isSomeInt() || leftOperand2.isSomeInt()) {
+      if (isAnyInt() && leftOperand2.isAnyInt()) {
         return RESULT_INT;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
@@ -1154,8 +1151,8 @@
   }
   EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeNum || leftOperand2.isSomeNum) {
-      if (isAnyNum && leftOperand2.isAnyNum) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
         return RESULT_NUM;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1186,7 +1183,7 @@
   EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand) {
     if (node is BinaryExpression) {
-      if (!isAnyNullBoolNumString || !leftOperand.isAnyNullBoolNumString) {
+      if (!isAnyNullBoolNumString() || !leftOperand.isAnyNullBoolNumString()) {
         return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
       }
     }
@@ -1223,8 +1220,8 @@
   EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeNum || leftOperand2.isSomeNum) {
-      if (isAnyNum && leftOperand2.isAnyNum) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
         return RESULT_BOOL;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1250,8 +1247,8 @@
     return error(node);
   }
   EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeNum || leftOperand2.isSomeNum) {
-      if (isAnyNum && leftOperand2.isAnyNum) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
         return RESULT_BOOL;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1278,8 +1275,8 @@
   }
   EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeNum || leftOperand2.isSomeNum) {
-      if (isAnyNum && leftOperand2.isAnyNum) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
         return RESULT_INT;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1313,8 +1310,8 @@
   EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeNum || leftOperand2.isSomeNum) {
-      if (isAnyNum && leftOperand2.isAnyNum) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
         return RESULT_BOOL;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1340,8 +1337,8 @@
     return error(node);
   }
   EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeNum || leftOperand2.isSomeNum) {
-      if (isAnyNum && leftOperand2.isAnyNum) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
         return RESULT_BOOL;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1368,8 +1365,8 @@
   }
   EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOperand) {
-    if (isSomeBool || leftOperand.isSomeBool) {
-      if (isAnyBool && leftOperand.isAnyBool) {
+    if (isSomeBool() || leftOperand.isSomeBool()) {
+      if (isAnyBool() && leftOperand.isAnyBool()) {
         return RESULT_BOOL;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
@@ -1385,8 +1382,8 @@
   }
   EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOperand) {
-    if (isSomeBool || leftOperand.isSomeBool) {
-      if (isAnyBool && leftOperand.isAnyBool) {
+    if (isSomeBool() || leftOperand.isSomeBool()) {
+      if (isAnyBool() && leftOperand.isAnyBool()) {
         return RESULT_BOOL;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
@@ -1399,8 +1396,8 @@
   }
   EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeNum || leftOperand2.isSomeNum) {
-      if (isAnyNum && leftOperand2.isAnyNum) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
         return RESULT_NUM;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1427,7 +1424,7 @@
   }
   EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOperand) {
-    if (!isAnyNullBoolNumString || !leftOperand.isAnyNullBoolNumString) {
+    if (!isAnyNullBoolNumString() || !leftOperand.isAnyNullBoolNumString()) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
     }
     Object leftValue = leftOperand.value;
@@ -1462,8 +1459,8 @@
   }
   EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeNum || leftOperand2.isSomeNum) {
-      if (isAnyNum && leftOperand2.isAnyNum) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
         return RESULT_NUM;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1493,8 +1490,8 @@
   }
   EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeInt || leftOperand2.isSomeInt) {
-      if (isAnyInt && leftOperand2.isAnyInt) {
+    if (isSomeInt() || leftOperand2.isSomeInt()) {
+      if (isAnyInt() && leftOperand2.isAnyInt()) {
         return RESULT_INT;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
@@ -1517,8 +1514,8 @@
   }
   EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeInt || leftOperand2.isSomeInt) {
-      if (isAnyInt && leftOperand2.isAnyInt) {
+    if (isSomeInt() || leftOperand2.isSomeInt()) {
+      if (isAnyInt() && leftOperand2.isAnyInt()) {
         return RESULT_INT;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
@@ -1541,8 +1538,8 @@
   }
   EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand2) {
-    if (isSomeNum || leftOperand2.isSomeNum) {
-      if (isAnyNum && leftOperand2.isAnyNum) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
         return RESULT_NUM;
       }
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1567,7 +1564,7 @@
     }
     return error(node);
   }
-  bool get isNull => identical(this, RESULT_NULL);
+  bool isNull() => identical(this, RESULT_NULL);
 
   /**
    * Return the result of applying boolean conversion to the given value.
@@ -1598,37 +1595,37 @@
   /**
    * Checks if this result has type "bool", with known or unknown value.
    */
-  bool get isAnyBool => isSomeBool || identical(this, RESULT_TRUE) || identical(this, RESULT_FALSE);
+  bool isAnyBool() => isSomeBool() || identical(this, RESULT_TRUE) || identical(this, RESULT_FALSE);
 
   /**
    * Checks if this result has type "int", with known or unknown value.
    */
-  bool get isAnyInt => identical(this, RESULT_INT) || _value is int;
+  bool isAnyInt() => identical(this, RESULT_INT) || _value is int;
 
   /**
-   * Checks if this result has one of the types - "bool", "num" or "string"; or may be `null`.
+   * Checks if this result has one of the types - "bool", "num" or "string"; or may be {@code null}.
    */
-  bool get isAnyNullBoolNumString => isNull || isAnyBool || isAnyNum || _value is String;
+  bool isAnyNullBoolNumString() => isNull() || isAnyBool() || isAnyNum() || _value is String;
 
   /**
    * Checks if this result has type "num", with known or unknown value.
    */
-  bool get isAnyNum => isSomeNum || _value is num;
+  bool isAnyNum() => isSomeNum() || _value is num;
 
   /**
    * Checks if this result has type "bool", exact value of which we don't know.
    */
-  bool get isSomeBool => identical(this, RESULT_BOOL);
+  bool isSomeBool() => identical(this, RESULT_BOOL);
 
   /**
    * Checks if this result has type "int", exact value of which we don't know.
    */
-  bool get isSomeInt => identical(this, RESULT_INT);
+  bool isSomeInt() => identical(this, RESULT_INT);
 
   /**
    * Checks if this result has type "num" (or "int"), exact value of which we don't know.
    */
-  bool get isSomeNum => identical(this, RESULT_DYNAMIC) || identical(this, RESULT_INT) || identical(this, RESULT_NUM);
+  bool isSomeNum() => identical(this, RESULT_DYNAMIC) || identical(this, RESULT_INT) || identical(this, RESULT_NUM);
   double toDouble(int value) => value.toDouble();
 
   /**
diff --git a/pkg/analyzer_experimental/lib/src/generated/element.dart b/pkg/analyzer_experimental/lib/src/generated/element.dart
index af56601..5cc4a23 100644
--- a/pkg/analyzer_experimental/lib/src/generated/element.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/element.dart
@@ -13,7 +13,7 @@
 import 'constant.dart' show EvaluationResultImpl;
 import 'utilities_dart.dart';
 /**
- * The interface `ClassElement` defines the behavior of elements that represent a class.
+ * The interface {@code ClassElement} defines the behavior of elements that represent a class.
  * @coverage dart.engine.element
  */
 abstract class ClassElement implements Element {
@@ -45,7 +45,7 @@
 
   /**
    * Return the element representing the getter with the given name that is declared in this class,
-   * or `null` if this class does not declare a getter with the given name.
+   * or {@code null} if this class does not declare a getter with the given name.
    * @param getterName the name of the getter to be returned
    * @return the getter declared in this class with the given name
    */
@@ -53,7 +53,7 @@
 
   /**
    * Return an array containing all of the interfaces that are implemented by this class.
-   *
+   * <p>
    * <b>Note:</b> Because the element model represents the state of the code, it is possible for it
    * to be semantically invalid. In particular, it is not safe to assume that the inheritance
    * structure of a class does not contain a cycle. Clients that traverse the inheritance structure
@@ -64,7 +64,7 @@
 
   /**
    * Return the element representing the method with the given name that is declared in this class,
-   * or `null` if this class does not declare a method with the given name.
+   * or {@code null} if this class does not declare a method with the given name.
    * @param methodName the name of the method to be returned
    * @return the method declared in this class with the given name
    */
@@ -79,7 +79,7 @@
   /**
    * Return an array containing all of the mixins that are applied to the class being extended in
    * order to derive the superclass of this class.
-   *
+   * <p>
    * <b>Note:</b> Because the element model represents the state of the code, it is possible for it
    * to be semantically invalid. In particular, it is not safe to assume that the inheritance
    * structure of a class does not contain a cycle. Clients that traverse the inheritance structure
@@ -89,7 +89,7 @@
   List<InterfaceType> get mixins;
 
   /**
-   * Return the named constructor declared in this class with the given name, or `null` if
+   * Return the named constructor declared in this class with the given name, or {@code null} if
    * this class does not declare a named constructor with the given name.
    * @param name the name of the constructor to be returned
    * @return the element representing the specified constructor
@@ -98,17 +98,17 @@
 
   /**
    * Return the element representing the setter with the given name that is declared in this class,
-   * or `null` if this class does not declare a setter with the given name.
+   * or {@code null} if this class does not declare a setter with the given name.
    * @param setterName the name of the getter to be returned
    * @return the setter declared in this class with the given name
    */
   PropertyAccessorElement getSetter(String setterName);
 
   /**
-   * Return the superclass of this class, or `null` if the class represents the class
-   * 'Object'. All other classes will have a non-`null` superclass. If the superclass was not
+   * Return the superclass of this class, or {@code null} if the class represents the class
+   * 'Object'. All other classes will have a non-{@code null} superclass. If the superclass was not
    * explicitly declared then the implicit superclass 'Object' will be returned.
-   *
+   * <p>
    * <b>Note:</b> Because the element model represents the state of the code, it is possible for it
    * to be semantically invalid. In particular, it is not safe to assume that the inheritance
    * structure of a class does not contain a cycle. Clients that traverse the inheritance structure
@@ -130,7 +130,7 @@
   List<TypeVariableElement> get typeVariables;
 
   /**
-   * Return the unnamed constructor declared in this class, or `null` if this class does not
+   * Return the unnamed constructor declared in this class, or {@code null} if this class does not
    * declare an unnamed constructor but does declare named constructors. The returned constructor
    * will be synthetic if this class does not declare any constructors, in which case it will
    * represent the default constructor for the class.
@@ -139,61 +139,55 @@
   ConstructorElement get unnamedConstructor;
 
   /**
-   * Return `true` if this class has (implicit or explicit) default constructor.
-   * @return `true` if this class has (implicit or explicit) default constructor
-   */
-  bool hasDefaultConstructor();
-
-  /**
-   * Return `true` if this class or its superclass declares a non-final instance field.
-   * @return `true` if this class or its superclass declares a non-final instance field
+   * Return {@code true} if this class or its superclass declares a non-final instance field.
+   * @return {@code true} if this class or its superclass declares a non-final instance field
    */
   bool hasNonFinalField();
 
   /**
-   * Return `true` if this class has reference to super (so, for example, cannot be used as a
+   * Return {@code true} if this class has reference to super (so, for example, cannot be used as a
    * mixin).
-   * @return `true` if this class has reference to super
+   * @return {@code true} if this class has reference to super
    */
   bool hasReferenceToSuper();
 
   /**
-   * Return `true` if this class is abstract. A class is abstract if it has an explicit`abstract` modifier. Note, that this definition of <i>abstract</i> is different from
+   * Return {@code true} if this class is abstract. A class is abstract if it has an explicit{@code abstract} modifier. Note, that this definition of <i>abstract</i> is different from
    * <i>has unimplemented members</i>.
-   * @return `true` if this class is abstract
+   * @return {@code true} if this class is abstract
    */
-  bool get isAbstract;
+  bool isAbstract();
 
   /**
-   * Return `true` if this class is defined by a typedef construct.
-   * @return `true` if this class is defined by a typedef construct
+   * Return {@code true} if this class is defined by a typedef construct.
+   * @return {@code true} if this class is defined by a typedef construct
    */
-  bool get isTypedef;
+  bool isTypedef();
 
   /**
-   * Return `true` if this class can validly be used as a mixin when defining another class.
+   * Return {@code true} if this class can validly be used as a mixin when defining another class.
    * The behavior of this method is defined by the Dart Language Specification in section 9:
    * <blockquote>It is a compile-time error if a declared or derived mixin refers to super. It is a
    * compile-time error if a declared or derived mixin explicitly declares a constructor. It is a
    * compile-time error if a mixin is derived from a class whose superclass is not
    * Object.</blockquote>
-   * @return `true` if this class can validly be used as a mixin
+   * @return {@code true} if this class can validly be used as a mixin
    */
-  bool get isValidMixin;
+  bool isValidMixin();
 
   /**
    * Return the element representing the getter that results from looking up the given getter in
-   * this class with respect to the given library, or `null` if the look up fails. The
+   * this class with respect to the given library, or {@code null} if the look up fails. The
    * behavior of this method is defined by the Dart Language Specification in section 12.15.1:
    * <blockquote>The result of looking up getter (respectively setter) <i>m</i> in class <i>C</i>
    * with respect to library <i>L</i> is:
-   *
-   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * <ul>
+   * <li>If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
    * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
    * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
    * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
-   * Otherwise, we say that the lookup has failed.
-   *
+   * Otherwise, we say that the lookup has failed.</li>
+   * </ul>
    * </blockquote>
    * @param getterName the name of the getter being looked up
    * @param library the library with respect to which the lookup is being performed
@@ -204,16 +198,16 @@
 
   /**
    * Return the element representing the method that results from looking up the given method in
-   * this class with respect to the given library, or `null` if the look up fails. The
+   * this class with respect to the given library, or {@code null} if the look up fails. The
    * behavior of this method is defined by the Dart Language Specification in section 12.15.1:
    * <blockquote> The result of looking up method <i>m</i> in class <i>C</i> with respect to library
    * <i>L</i> is:
-   *
-   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
+   * <ul>
+   * <li>If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
    * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
    * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
-   * to <i>L</i>. Otherwise, we say that the lookup has failed.
-   *
+   * to <i>L</i>. Otherwise, we say that the lookup has failed.</li>
+   * </ul>
    * </blockquote>
    * @param methodName the name of the method being looked up
    * @param library the library with respect to which the lookup is being performed
@@ -224,17 +218,17 @@
 
   /**
    * Return the element representing the setter that results from looking up the given setter in
-   * this class with respect to the given library, or `null` if the look up fails. The
+   * this class with respect to the given library, or {@code null} if the look up fails. The
    * behavior of this method is defined by the Dart Language Specification in section 12.16:
    * <blockquote> The result of looking up getter (respectively setter) <i>m</i> in class <i>C</i>
    * with respect to library <i>L</i> is:
-   *
-   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * <ul>
+   * <li>If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
    * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
    * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
    * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
-   * Otherwise, we say that the lookup has failed.
-   *
+   * Otherwise, we say that the lookup has failed.</li>
+   * </ul>
    * </blockquote>
    * @param setterName the name of the setter being looked up
    * @param library the library with respect to which the lookup is being performed
@@ -244,8 +238,8 @@
   PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library);
 }
 /**
- * The interface `ClassMemberElement` defines the behavior of elements that are contained
- * within a [ClassElement].
+ * The interface {@code ClassMemberElement} defines the behavior of elements that are contained
+ * within a {@link ClassElement}.
  */
 abstract class ClassMemberElement implements Element {
 
@@ -256,7 +250,7 @@
   ClassElement get enclosingElement;
 }
 /**
- * The interface `CompilationUnitElement` defines the behavior of elements representing a
+ * The interface {@code CompilationUnitElement} defines the behavior of elements representing a
  * compilation unit.
  * @coverage dart.engine.element
  */
@@ -294,7 +288,7 @@
   List<TopLevelVariableElement> get topLevelVariables;
 
   /**
-   * Return the class defined in this compilation unit that has the given name, or `null` if
+   * Return the class defined in this compilation unit that has the given name, or {@code null} if
    * this compilation unit does not define a class with the given name.
    * @param className the name of the class to be returned
    * @return the class with the given name that is defined in this compilation unit
@@ -308,7 +302,7 @@
   List<ClassElement> get types;
 }
 /**
- * The interface `ConstructorElement` defines the behavior of elements representing a
+ * The interface {@code ConstructorElement} defines the behavior of elements representing a
  * constructor or a factory method defined within a type.
  * @coverage dart.engine.element
  */
@@ -321,40 +315,33 @@
   ConstructorElement get redirectedConstructor;
 
   /**
-   * Return `true` if this constructor is a const constructor.
-   * @return `true` if this constructor is a const constructor
+   * Return {@code true} if this constructor is a const constructor.
+   * @return {@code true} if this constructor is a const constructor
    */
-  bool get isConst;
+  bool isConst();
 
   /**
-   * Return `true` if this constructor can be used as a default constructor - unnamed and has
-   * no required parameters.
-   * @return `true` if this constructor can be used as a default constructor.
+   * Return {@code true} if this constructor represents a factory constructor.
+   * @return {@code true} if this constructor represents a factory constructor
    */
-  bool get isDefaultConstructor;
-
-  /**
-   * Return `true` if this constructor represents a factory constructor.
-   * @return `true` if this constructor represents a factory constructor
-   */
-  bool get isFactory;
+  bool isFactory();
 }
 /**
- * The interface `Element` defines the behavior common to all of the elements in the element
+ * The interface {@code Element} defines the behavior common to all of the elements in the element
  * model. Generally speaking, the element model is a semantic model of the program that represents
  * things that are declared with a name and hence can be referenced elsewhere in the code.
- *
+ * <p>
  * There are two exceptions to the general case. First, there are elements in the element model that
  * are created for the convenience of various kinds of analysis but that do not have any
  * corresponding declaration within the source code. Such elements are marked as being
  * <i>synthetic</i>. Examples of synthetic elements include
- *
- * * default constructors in classes that do not define any explicit constructors,
- * * getters and setters that are induced by explicit field declarations,
- * * fields that are induced by explicit declarations of getters and setters, and
- * * functions representing the initialization expression for a variable.
- *
- *
+ * <ul>
+ * <li>default constructors in classes that do not define any explicit constructors,
+ * <li>getters and setters that are induced by explicit field declarations,
+ * <li>fields that are induced by explicit declarations of getters and setters, and
+ * <li>functions representing the initialization expression for a variable.
+ * </ul>
+ * <p>
  * Second, there are elements in the element model that do not have a name. These correspond to
  * unnamed functions and exist in order to more accurately represent the semantic structure of the
  * program.
@@ -377,7 +364,7 @@
 
   /**
    * Return the documentation comment for this element as it appears in the original source
-   * (complete with the beginning and ending delimiters), or `null` if this element does not
+   * (complete with the beginning and ending delimiters), or {@code null} if this element does not
    * have a documentation comment associated with it. This can be a long-running operation if the
    * information needed to access the comment is not cached.
    * @return this element's documentation comment
@@ -387,7 +374,7 @@
   String computeDocumentationComment();
 
   /**
-   * Return the element of the given class that most immediately encloses this element, or`null` if there is no enclosing element of the given class.
+   * Return the element of the given class that most immediately encloses this element, or{@code null} if there is no enclosing element of the given class.
    * @param elementClass the class of the element to be returned
    * @return the element that encloses this element
    */
@@ -400,16 +387,16 @@
   AnalysisContext get context;
 
   /**
-   * Return the display name of this element, or `null` if this element does not have a name.
-   *
+   * Return the display name of this element, or {@code null} if this element does not have a name.
+   * <p>
    * In most cases the name and the display name are the same. Differences though are cases such as
-   * setters where the name of some setter `set f(x)` is `f=`, instead of `f`.
+   * setters where the name of some setter {@code set f(x)} is {@code f=}, instead of {@code f}.
    * @return the display name of this element
    */
   String get displayName;
 
   /**
-   * Return the element that either physically or logically encloses this element. This will be`null` if this element is a library because libraries are the top-level elements in the
+   * Return the element that either physically or logically encloses this element. This will be{@code null} if this element is a library because libraries are the top-level elements in the
    * model.
    * @return the element that encloses this element
    */
@@ -423,7 +410,7 @@
 
   /**
    * Return the library that contains this element. This will be the element itself if it is a
-   * library element. This will be `null` if this element is an HTML file because HTML files
+   * library element. This will be {@code null} if this element is an HTML file because HTML files
    * are not contained in libraries.
    * @return the library that contains this element
    */
@@ -443,43 +430,43 @@
   List<ElementAnnotation> get metadata;
 
   /**
-   * Return the name of this element, or `null` if this element does not have a name.
+   * Return the name of this element, or {@code null} if this element does not have a name.
    * @return the name of this element
    */
   String get name;
 
   /**
    * Return the offset of the name of this element in the file that contains the declaration of this
-   * element, or `-1` if this element is synthetic, does not have a name, or otherwise does
+   * element, or {@code -1} if this element is synthetic, does not have a name, or otherwise does
    * not have an offset.
    * @return the offset of the name of this element
    */
   int get nameOffset;
 
   /**
-   * Return the source that contains this element, or `null` if this element is not contained
+   * Return the source that contains this element, or {@code null} if this element is not contained
    * in a source.
    * @return the source that contains this element
    */
   Source get source;
 
   /**
-   * Return `true` if this element, assuming that it is within scope, is accessible to code in
+   * Return {@code true} if this element, assuming that it is within scope, is accessible to code in
    * the given library. This is defined by the Dart Language Specification in section 3.2:
    * <blockquote> A declaration <i>m</i> is accessible to library <i>L</i> if <i>m</i> is declared
    * in <i>L</i> or if <i>m</i> is public. </blockquote>
    * @param library the library in which a possible reference to this element would occur
-   * @return `true` if this element is accessible to code in the given library
+   * @return {@code true} if this element is accessible to code in the given library
    */
   bool isAccessibleIn(LibraryElement library);
 
   /**
-   * Return `true` if this element is synthetic. A synthetic element is an element that is not
+   * Return {@code true} if this element is synthetic. A synthetic element is an element that is not
    * represented in the source code explicitly, but is implied by the source code, such as the
    * default constructor for a class that does not explicitly define any constructors.
-   * @return `true` if this element is synthetic
+   * @return {@code true} if this element is synthetic
    */
-  bool get isSynthetic;
+  bool isSynthetic();
 
   /**
    * Use the given visitor to visit all of the children of this element. There is no guarantee of
@@ -489,7 +476,7 @@
   void visitChildren(ElementVisitor<Object> visitor);
 }
 /**
- * The interface `ElementAnnotation` defines the behavior of objects representing a single
+ * The interface {@code ElementAnnotation} defines the behavior of objects representing a single
  * annotation associated with an element.
  * @coverage dart.engine.element
  */
@@ -503,7 +490,7 @@
   Element get element;
 }
 /**
- * The enumeration `ElementKind` defines the various kinds of elements in the element model.
+ * The enumeration {@code ElementKind} defines the various kinds of elements in the element model.
  * @coverage dart.engine.element
  */
 class ElementKind implements Comparable<ElementKind> {
@@ -541,7 +528,7 @@
   final int ordinal;
 
   /**
-   * Return the kind of the given element, or [ERROR] if the element is `null`. This is
+   * Return the kind of the given element, or {@link #ERROR} if the element is {@code null}. This is
    * a utility method that can reduce the need for null checks in other places.
    * @param element the element whose kind is to be returned
    * @return the kind of the given element
@@ -568,7 +555,7 @@
 
   /**
    * Return the name displayed in the UI for this kind of element.
-   * @return the name of this [ElementKind] to display in UI.
+   * @return the name of this {@link ElementKind} to display in UI.
    */
   String get displayName => _displayName;
   int compareTo(ElementKind other) => ordinal - other.ordinal;
@@ -576,7 +563,7 @@
   String toString() => name;
 }
 /**
- * The interface `ElementLocation` defines the behavior of objects that represent the location
+ * The interface {@code ElementLocation} defines the behavior of objects that represent the location
  * of an element within the element model.
  * @coverage dart.engine.element
  */
@@ -590,7 +577,7 @@
   String get encoding;
 }
 /**
- * The interface `ElementVisitor` defines the behavior of objects that can be used to visit an
+ * The interface {@code ElementVisitor} defines the behavior of objects that can be used to visit an
  * element structure.
  * @coverage dart.engine.element
  */
@@ -619,7 +606,7 @@
   R visitTypeVariableElement(TypeVariableElement element);
 }
 /**
- * The interface `EmbeddedHtmlScriptElement` defines the behavior of elements representing a
+ * The interface {@code EmbeddedHtmlScriptElement} defines the behavior of elements representing a
  * script tag in an HTML file having content that defines a Dart library.
  * @coverage dart.engine.element
  */
@@ -627,12 +614,12 @@
 
   /**
    * Return the library element defined by the content of the script tag.
-   * @return the library element (not `null`)
+   * @return the library element (not {@code null})
    */
   LibraryElement get scriptLibrary;
 }
 /**
- * The interface `ExecutableElement` defines the behavior of elements representing an
+ * The interface {@code ExecutableElement} defines the behavior of elements representing an
  * executable object, including functions, methods, constructors, getters, and setters.
  * @coverage dart.engine.element
  */
@@ -663,34 +650,28 @@
   List<ParameterElement> get parameters;
 
   /**
-   * Return the return type defined by this executable element.
-   * @return the return type defined by this executable element
-   */
-  Type2 get returnType;
-
-  /**
    * Return the type of function defined by this executable element.
    * @return the type of function defined by this executable element
    */
   FunctionType get type;
 
   /**
-   * Return `true` if this executable element is an operator. The test may be based on the
+   * Return {@code true} if this executable element is an operator. The test may be based on the
    * name of the executable element, in which case the result will be correct when the name is
    * legal.
-   * @return `true` if this executable element is an operator
+   * @return {@code true} if this executable element is an operator
    */
-  bool get isOperator;
+  bool isOperator();
 
   /**
-   * Return `true` if this element is a static element. A static element is an element that is
+   * Return {@code true} if this element is a static element. A static element is an element that is
    * not associated with a particular instance, but rather with an entire library or class.
-   * @return `true` if this executable element is a static element
+   * @return {@code true} if this executable element is a static element
    */
-  bool get isStatic;
+  bool isStatic();
 }
 /**
- * The interface `ExportElement` defines the behavior of objects representing information
+ * The interface {@code ExportElement} defines the behavior of objects representing information
  * about a single export directive within a library.
  * @coverage dart.engine.element
  */
@@ -715,49 +696,49 @@
   LibraryElement get exportedLibrary;
 }
 /**
- * The interface `ExternalHtmlScriptElement` defines the behavior of elements representing a
- * script tag in an HTML file having a `source` attribute that references a Dart library
+ * The interface {@code ExternalHtmlScriptElement} defines the behavior of elements representing a
+ * script tag in an HTML file having a {@code source} attribute that references a Dart library
  * source file.
  * @coverage dart.engine.element
  */
 abstract class ExternalHtmlScriptElement implements HtmlScriptElement {
 
   /**
-   * Return the source referenced by this element, or `null` if this element does not
+   * Return the source referenced by this element, or {@code null} if this element does not
    * reference a Dart library source file.
    * @return the source for the external Dart library
    */
   Source get scriptSource;
 }
 /**
- * The interface `FieldElement` defines the behavior of elements representing a field defined
+ * The interface {@code FieldElement} defines the behavior of elements representing a field defined
  * within a type.
  * @coverage dart.engine.element
  */
 abstract class FieldElement implements ClassMemberElement, PropertyInducingElement {
 }
 /**
- * The interface `FieldFormalParameterElement` defines the behavior of elements representing a
+ * The interface {@code FieldFormalParameterElement} defines the behavior of elements representing a
  * field formal parameter defined within a constructor element.
  */
 abstract class FieldFormalParameterElement implements ParameterElement {
 
   /**
-   * Return the field element associated with this field formal parameter, or `null` if the
+   * Return the field element associated with this field formal parameter, or {@code null} if the
    * parameter references a field that doesn't exist.
    * @return the field element associated with this field formal parameter
    */
   FieldElement get field;
 }
 /**
- * The interface `FunctionElement` defines the behavior of elements representing a function.
+ * The interface {@code FunctionElement} defines the behavior of elements representing a function.
  * @coverage dart.engine.element
  */
 abstract class FunctionElement implements ExecutableElement, LocalElement {
 }
 /**
- * The interface `FunctionTypeAliasElement` defines the behavior of elements representing a
- * function type alias (`typedef`).
+ * The interface {@code FunctionTypeAliasElement} defines the behavior of elements representing a
+ * function type alias ({@code typedef}).
  * @coverage dart.engine.element
  */
 abstract class FunctionTypeAliasElement implements Element {
@@ -775,12 +756,6 @@
   List<ParameterElement> get parameters;
 
   /**
-   * Return the return type defined by this type alias.
-   * @return the return type defined by this type alias
-   */
-  Type2 get returnType;
-
-  /**
    * Return the type of function defined by this type alias.
    * @return the type of function defined by this type alias
    */
@@ -793,7 +768,7 @@
   List<TypeVariableElement> get typeVariables;
 }
 /**
- * The interface `HideElementCombinator` defines the behavior of combinators that cause some
+ * The interface {@code HideElementCombinator} defines the behavior of combinators that cause some
  * of the names in a namespace to be hidden when being imported.
  * @coverage dart.engine.element
  */
@@ -807,7 +782,7 @@
   List<String> get hiddenNames;
 }
 /**
- * The interface `HtmlElement` defines the behavior of elements representing an HTML file.
+ * The interface {@code HtmlElement} defines the behavior of elements representing an HTML file.
  * @coverage dart.engine.element
  */
 abstract class HtmlElement implements Element {
@@ -816,12 +791,12 @@
    * Return an array containing all of the script elements contained in the HTML file. This includes
    * scripts with libraries that are defined by the content of a script tag as well as libraries
    * that are referenced in the {@core source} attribute of a script tag.
-   * @return the script elements in the HTML file (not `null`, contains no `null`s)
+   * @return the script elements in the HTML file (not {@code null}, contains no {@code null}s)
    */
   List<HtmlScriptElement> get scripts;
 }
 /**
- * The interface `HtmlScriptElement` defines the behavior of elements representing a script
+ * The interface {@code HtmlScriptElement} defines the behavior of elements representing a script
  * tag in an HTML file.
  * @see EmbeddedHtmlScriptElement
  * @see ExternalHtmlScriptElement
@@ -830,7 +805,7 @@
 abstract class HtmlScriptElement implements Element {
 }
 /**
- * The interface `ImportElement` defines the behavior of objects representing information
+ * The interface {@code ImportElement} defines the behavior of objects representing information
  * about a single import directive within a library.
  * @coverage dart.engine.element
  */
@@ -855,14 +830,14 @@
   LibraryElement get importedLibrary;
 
   /**
-   * Return the prefix that was specified as part of the import directive, or `null` if there
+   * Return the prefix that was specified as part of the import directive, or {@code null} if there
    * was no prefix specified.
    * @return the prefix that was specified as part of the import directive
    */
   PrefixElement get prefix;
 }
 /**
- * The interface `LabelElement` defines the behavior of elements representing a label
+ * The interface {@code LabelElement} defines the behavior of elements representing a label
  * associated with a statement.
  * @coverage dart.engine.element
  */
@@ -875,7 +850,7 @@
   ExecutableElement get enclosingElement;
 }
 /**
- * The interface `LibraryElement` defines the behavior of elements representing a library.
+ * The interface {@code LibraryElement} defines the behavior of elements representing a library.
  * @coverage dart.engine.element
  */
 abstract class LibraryElement implements Element {
@@ -887,8 +862,8 @@
   CompilationUnitElement get definingCompilationUnit;
 
   /**
-   * Return the entry point for this library, or `null` if this library does not have an entry
-   * point. The entry point is defined to be a zero argument top-level function whose name is`main`.
+   * Return the entry point for this library, or {@code null} if this library does not have an entry
+   * point. The entry point is defined to be a zero argument top-level function whose name is{@code main}.
    * @return the entry point for this library
    */
   FunctionElement get entryPoint;
@@ -908,7 +883,7 @@
   /**
    * Return an array containing all of the libraries that are imported into this library. This
    * includes all of the libraries that are imported using a prefix (also available through the
-   * prefixes returned by [getPrefixes]) and those that are imported without a prefix.
+   * prefixes returned by {@link #getPrefixes()}) and those that are imported without a prefix.
    * @return an array containing all of the libraries that are imported into this library
    */
   List<LibraryElement> get importedLibraries;
@@ -921,20 +896,20 @@
 
   /**
    * Return an array containing all of the compilation units that are included in this library using
-   * a `part` directive. This does not include the defining compilation unit that contains the`part` directives.
+   * a {@code part} directive. This does not include the defining compilation unit that contains the{@code part} directives.
    * @return the compilation units that are included in this library
    */
   List<CompilationUnitElement> get parts;
 
   /**
-   * Return an array containing elements for each of the prefixes used to `import` libraries
-   * into this library. Each prefix can be used in more than one `import` directive.
-   * @return the prefixes used to `import` libraries into this library
+   * Return an array containing elements for each of the prefixes used to {@code import} libraries
+   * into this library. Each prefix can be used in more than one {@code import} directive.
+   * @return the prefixes used to {@code import} libraries into this library
    */
   List<PrefixElement> get prefixes;
 
   /**
-   * Return the class defined in this library that has the given name, or `null` if this
+   * Return the class defined in this library that has the given name, or {@code null} if this
    * library does not define a class with the given name.
    * @param className the name of the class to be returned
    * @return the class with the given name that is defined in this library
@@ -942,73 +917,73 @@
   ClassElement getType(String className);
 
   /**
-   * Answer `true` if this library is an application that can be run in the browser.
-   * @return `true` if this library is an application that can be run in the browser
+   * Answer {@code true} if this library is an application that can be run in the browser.
+   * @return {@code true} if this library is an application that can be run in the browser
    */
-  bool get isBrowserApplication;
+  bool isBrowserApplication();
 
   /**
-   * Return `true` if this library is the dart:core library.
-   * @return `true` if this library is the dart:core library
+   * Return {@code true} if this library is the dart:core library.
+   * @return {@code true} if this library is the dart:core library
    */
-  bool get isDartCore;
+  bool isDartCore();
 
   /**
-   * Return `true` if this library is up to date with respect to the given time stamp. If any
+   * Return {@code true} if this library is up to date with respect to the given time stamp. If any
    * transitively referenced Source is newer than the time stamp, this method returns false.
    * @param timeStamp the time stamp to compare against
-   * @return `true` if this library is up to date with respect to the given time stamp
+   * @return {@code true} if this library is up to date with respect to the given time stamp
    */
   bool isUpToDate2(int timeStamp);
 }
 /**
- * The interface `LocalElement` defines the behavior of elements that can be (but are not
- * required to be) defined within a method or function (an [ExecutableElement]).
+ * The interface {@code LocalElement} defines the behavior of elements that can be (but are not
+ * required to be) defined within a method or function (an {@link ExecutableElement}).
  * @coverage dart.engine.element
  */
 abstract class LocalElement implements Element {
 
   /**
    * Return a source range that covers the approximate portion of the source in which the name of
-   * this element is visible, or `null` if there is no single range of characters within which
+   * this element is visible, or {@code null} if there is no single range of characters within which
    * the element name is visible.
-   *
-   * * For a local variable, this includes everything from the end of the variable's initializer
-   * to the end of the block that encloses the variable declaration.
-   * * For a parameter, this includes the body of the method or function that declares the
-   * parameter.
-   * * For a local function, this includes everything from the beginning of the function's body to
-   * the end of the block that encloses the function declaration.
-   * * For top-level functions, `null` will be returned because they are potentially visible
-   * in multiple sources.
-   *
+   * <ul>
+   * <li>For a local variable, this includes everything from the end of the variable's initializer
+   * to the end of the block that encloses the variable declaration.</li>
+   * <li>For a parameter, this includes the body of the method or function that declares the
+   * parameter.</li>
+   * <li>For a local function, this includes everything from the beginning of the function's body to
+   * the end of the block that encloses the function declaration.</li>
+   * <li>For top-level functions, {@code null} will be returned because they are potentially visible
+   * in multiple sources.</li>
+   * </ul>
    * @return the range of characters in which the name of this element is visible
    */
   SourceRange get visibleRange;
 }
 /**
- * The interface `LocalVariableElement` defines the behavior common to elements that represent
+ * The interface {@code LocalVariableElement} defines the behavior common to elements that represent
  * a local variable.
  * @coverage dart.engine.element
  */
 abstract class LocalVariableElement implements LocalElement, VariableElement {
 }
 /**
- * The interface `MethodElement` defines the behavior of elements that represent a method
+ * The interface {@code MethodElement} defines the behavior of elements that represent a method
  * defined within a type.
  * @coverage dart.engine.element
  */
 abstract class MethodElement implements ClassMemberElement, ExecutableElement {
 
   /**
-   * Return `true` if this method is abstract. Methods are abstract if they are not external
+   * Return {@code true} if this method is abstract. Methods are abstract if they are not external
    * and have no body.
-   * @return `true` if this method is abstract
+   * @return {@code true} if this method is abstract
    */
-  bool get isAbstract;
+  bool isAbstract();
 }
 /**
- * The interface `MultiplyDefinedElement` defines the behavior of pseudo-elements that
+ * The interface {@code MultiplyDefinedElement} defines the behavior of pseudo-elements that
  * represent multiple elements defined within a single scope that have the same name. This situation
  * is not allowed by the language, so objects implementing this interface always represent an error.
  * As a result, most of the normal operations on elements do not make sense and will return useless
@@ -1025,7 +1000,7 @@
   List<Element> get conflictingElements;
 }
 /**
- * The interface `NamespaceCombinator` defines the behavior common to objects that control how
+ * The interface {@code NamespaceCombinator} defines the behavior common to objects that control how
  * namespaces are combined.
  * @coverage dart.engine.element
  */
@@ -1037,7 +1012,7 @@
   static final List<NamespaceCombinator> EMPTY_ARRAY = new List<NamespaceCombinator>(0);
 }
 /**
- * The interface `ParameterElement` defines the behavior of elements representing a parameter
+ * The interface {@code ParameterElement} defines the behavior of elements representing a parameter
  * defined within an executable element.
  * @coverage dart.engine.element
  */
@@ -1045,7 +1020,7 @@
 
   /**
    * Return a source range that covers the portion of the source in which the default value for this
-   * parameter is specified, or `null` if there is no default value.
+   * parameter is specified, or {@code null} if there is no default value.
    * @return the range of characters in which the default value of this parameter is specified
    */
   SourceRange get defaultValueRange;
@@ -1064,13 +1039,13 @@
   List<ParameterElement> get parameters;
 
   /**
-   * Return `true` if this parameter is an initializing formal parameter.
-   * @return `true` if this parameter is an initializing formal parameter
+   * Return {@code true} if this parameter is an initializing formal parameter.
+   * @return {@code true} if this parameter is an initializing formal parameter
    */
-  bool get isInitializingFormal;
+  bool isInitializingFormal();
 }
 /**
- * The interface `PrefixElement` defines the behavior common to elements that represent a
+ * The interface {@code PrefixElement} defines the behavior common to elements that represent a
  * prefix used to import one or more libraries into another library.
  * @coverage dart.engine.element
  */
@@ -1089,25 +1064,25 @@
   List<LibraryElement> get importedLibraries;
 }
 /**
- * The interface `PropertyAccessorElement` defines the behavior of elements representing a
+ * The interface {@code PropertyAccessorElement} defines the behavior of elements representing a
  * getter or a setter. Note that explicitly defined property accessors implicitly define a synthetic
  * field. Symmetrically, synthetic accessors are implicitly created for explicitly defined fields.
  * The following rules apply:
- *
- * * Every explicit field is represented by a non-synthetic [FieldElement].
- * * Every explicit field induces a getter and possibly a setter, both of which are represented by
- * synthetic [PropertyAccessorElement]s.
- * * Every explicit getter or setter is represented by a non-synthetic[PropertyAccessorElement].
- * * Every explicit getter or setter (or pair thereof if they have the same name) induces a field
- * that is represented by a synthetic [FieldElement].
- *
+ * <ul>
+ * <li>Every explicit field is represented by a non-synthetic {@link FieldElement}.
+ * <li>Every explicit field induces a getter and possibly a setter, both of which are represented by
+ * synthetic {@link PropertyAccessorElement}s.
+ * <li>Every explicit getter or setter is represented by a non-synthetic{@link PropertyAccessorElement}.
+ * <li>Every explicit getter or setter (or pair thereof if they have the same name) induces a field
+ * that is represented by a synthetic {@link FieldElement}.
+ * </ul>
  * @coverage dart.engine.element
  */
 abstract class PropertyAccessorElement implements ExecutableElement {
 
   /**
    * Return the accessor representing the getter that corresponds to (has the same name as) this
-   * setter, or `null` if this accessor is not a setter or if there is no corresponding
+   * setter, or {@code null} if this accessor is not a setter or if there is no corresponding
    * getter.
    * @return the getter that corresponds to this setter
    */
@@ -1115,7 +1090,7 @@
 
   /**
    * Return the accessor representing the setter that corresponds to (has the same name as) this
-   * getter, or `null` if this accessor is not a getter or if there is no corresponding
+   * getter, or {@code null} if this accessor is not a getter or if there is no corresponding
    * setter.
    * @return the setter that corresponds to this getter
    */
@@ -1129,38 +1104,38 @@
   PropertyInducingElement get variable;
 
   /**
-   * Return `true` if this accessor is abstract. Accessors are abstract if they are not
+   * Return {@code true} if this accessor is abstract. Accessors are abstract if they are not
    * external and have no body.
-   * @return `true` if this accessor is abstract
+   * @return {@code true} if this accessor is abstract
    */
-  bool get isAbstract;
+  bool isAbstract();
 
   /**
-   * Return `true` if this accessor represents a getter.
-   * @return `true` if this accessor represents a getter
+   * Return {@code true} if this accessor represents a getter.
+   * @return {@code true} if this accessor represents a getter
    */
-  bool get isGetter;
+  bool isGetter();
 
   /**
-   * Return `true` if this accessor represents a setter.
-   * @return `true` if this accessor represents a setter
+   * Return {@code true} if this accessor represents a setter.
+   * @return {@code true} if this accessor represents a setter
    */
-  bool get isSetter;
+  bool isSetter();
 }
 /**
- * The interface `PropertyInducingElement` defines the behavior of elements representing a
+ * The interface {@code PropertyInducingElement} defines the behavior of elements representing a
  * variable that has an associated getter and possibly a setter. Note that explicitly defined
- * variables implicitly define a synthetic getter and that non-`final` explicitly defined
+ * variables implicitly define a synthetic getter and that non-{@code final} explicitly defined
  * variables implicitly define a synthetic setter. Symmetrically, synthetic fields are implicitly
  * created for explicitly defined getters and setters. The following rules apply:
- *
- * * Every explicit variable is represented by a non-synthetic [PropertyInducingElement].
- * * Every explicit variable induces a getter and possibly a setter, both of which are represented
- * by synthetic [PropertyAccessorElement]s.
- * * Every explicit getter or setter is represented by a non-synthetic[PropertyAccessorElement].
- * * Every explicit getter or setter (or pair thereof if they have the same name) induces a
- * variable that is represented by a synthetic [PropertyInducingElement].
- *
+ * <ul>
+ * <li>Every explicit variable is represented by a non-synthetic {@link PropertyInducingElement}.
+ * <li>Every explicit variable induces a getter and possibly a setter, both of which are represented
+ * by synthetic {@link PropertyAccessorElement}s.
+ * <li>Every explicit getter or setter is represented by a non-synthetic{@link PropertyAccessorElement}.
+ * <li>Every explicit getter or setter (or pair thereof if they have the same name) induces a
+ * variable that is represented by a synthetic {@link PropertyInducingElement}.
+ * </ul>
  * @coverage dart.engine.element
  */
 abstract class PropertyInducingElement implements VariableElement {
@@ -1173,8 +1148,8 @@
   PropertyAccessorElement get getter;
 
   /**
-   * Return the setter associated with this variable, or `null` if the variable is effectively`final` and therefore does not have a setter associated with it. (This can happen either
-   * because the variable is explicitly defined as being `final` or because the variable is
+   * Return the setter associated with this variable, or {@code null} if the variable is effectively{@code final} and therefore does not have a setter associated with it. (This can happen either
+   * because the variable is explicitly defined as being {@code final} or because the variable is
    * induced by an explicit getter that does not have a corresponding setter.) If this variable was
    * explicitly defined (is not synthetic) then the setter associated with it will be synthetic.
    * @return the setter associated with this variable
@@ -1182,14 +1157,14 @@
   PropertyAccessorElement get setter;
 
   /**
-   * Return `true` if this element is a static element. A static element is an element that is
+   * Return {@code true} if this element is a static element. A static element is an element that is
    * not associated with a particular instance, but rather with an entire library or class.
-   * @return `true` if this executable element is a static element
+   * @return {@code true} if this executable element is a static element
    */
-  bool get isStatic;
+  bool isStatic();
 }
 /**
- * The interface `ShowElementCombinator` defines the behavior of combinators that cause some
+ * The interface {@code ShowElementCombinator} defines the behavior of combinators that cause some
  * of the names in a namespace to be visible (and the rest hidden) when being imported.
  * @coverage dart.engine.element
  */
@@ -1203,21 +1178,21 @@
   List<String> get shownNames;
 }
 /**
- * The interface `TopLevelVariableElement` defines the behavior of elements representing a
+ * The interface {@code TopLevelVariableElement} defines the behavior of elements representing a
  * top-level variable.
  * @coverage dart.engine.element
  */
 abstract class TopLevelVariableElement implements PropertyInducingElement {
 }
 /**
- * The interface `TypeVariableElement` defines the behavior of elements representing a type
+ * The interface {@code TypeVariableElement} defines the behavior of elements representing a type
  * variable.
  * @coverage dart.engine.element
  */
 abstract class TypeVariableElement implements Element {
 
   /**
-   * Return the type representing the bound associated with this variable, or `null` if this
+   * Return the type representing the bound associated with this variable, or {@code null} if this
    * variable does not have an explicit bound.
    * @return the type representing the bound associated with this variable
    */
@@ -1230,7 +1205,7 @@
   TypeVariableType get type;
 }
 /**
- * The interface `UndefinedElement` defines the behavior of pseudo-elements that represent
+ * The interface {@code UndefinedElement} defines the behavior of pseudo-elements that represent
  * names that are undefined. This situation is not allowed by the language, so objects implementing
  * this interface always represent an error. As a result, most of the normal operations on elements
  * do not make sense and will return useless results.
@@ -1239,27 +1214,27 @@
 abstract class UndefinedElement implements Element {
 }
 /**
- * The interface `UriReferencedElement` defines the behavior of objects included into a
+ * The interface {@code UriReferencedElement} defines the behavior of objects included into a
  * library using some URI.
  * @coverage dart.engine.element
  */
 abstract class UriReferencedElement implements Element {
 
   /**
-   * Return the URI that is used to include this element into the enclosing library, or `null`if this is the defining compilation unit of a library.
+   * Return the URI that is used to include this element into the enclosing library, or {@code null}if this is the defining compilation unit of a library.
    * @return the URI that is used to include this element into the enclosing library
    */
   String get uri;
 }
 /**
- * The interface `VariableElement` defines the behavior common to elements that represent a
+ * The interface {@code VariableElement} defines the behavior common to elements that represent a
  * variable.
  * @coverage dart.engine.element
  */
 abstract class VariableElement implements Element {
 
   /**
-   * Return a synthetic function representing this variable's initializer, or `null` if this
+   * Return a synthetic function representing this variable's initializer, or {@code null} if this
    * variable does not have an initializer. The function will have no parameters. The return type of
    * the function will be the compile-time type of the initialization expression.
    * @return a synthetic function representing this variable's initializer
@@ -1267,41 +1242,41 @@
   FunctionElement get initializer;
 
   /**
-   * Return the declared type of this variable, or `null` if the variable did not have a
+   * Return the declared type of this variable, or {@code null} if the variable did not have a
    * declared type (such as if it was declared using the keyword 'var').
    * @return the declared type of this variable
    */
   Type2 get type;
 
   /**
-   * Return `true` if this variable was declared with the 'const' modifier.
-   * @return `true` if this variable was declared with the 'const' modifier
+   * Return {@code true} if this variable was declared with the 'const' modifier.
+   * @return {@code true} if this variable was declared with the 'const' modifier
    */
-  bool get isConst;
+  bool isConst();
 
   /**
-   * Return `true` if this variable was declared with the 'final' modifier. Variables that are
-   * declared with the 'const' modifier will return `false` even though they are implicitly
+   * Return {@code true} if this variable was declared with the 'final' modifier. Variables that are
+   * declared with the 'const' modifier will return {@code false} even though they are implicitly
    * final.
-   * @return `true` if this variable was declared with the 'final' modifier
+   * @return {@code true} if this variable was declared with the 'final' modifier
    */
-  bool get isFinal;
+  bool isFinal();
 }
 /**
- * Instances of the class `GeneralizingElementVisitor` implement an element visitor that will
- * recursively visit all of the elements in an element model (like instances of the class[RecursiveElementVisitor]). In addition, when an element of a specific type is visited not
+ * Instances of the class {@code GeneralizingElementVisitor} implement an element visitor that will
+ * recursively visit all of the elements in an element model (like instances of the class{@link RecursiveElementVisitor}). In addition, when an element of a specific type is visited not
  * only will the visit method for that specific type of element be invoked, but additional methods
  * for the supertypes of that element will also be invoked. For example, using an instance of this
- * class to visit a [MethodElement] will cause the method[visitMethodElement] to be invoked but will also cause the methods[visitExecutableElement] and [visitElement] to be
+ * class to visit a {@link MethodElement} will cause the method{@link #visitMethodElement(MethodElement)} to be invoked but will also cause the methods{@link #visitExecutableElement(ExecutableElement)} and {@link #visitElement(Element)} to be
  * subsequently invoked. This allows visitors to be written that visit all executable elements
- * without needing to override the visit method for each of the specific subclasses of[ExecutableElement].
- *
+ * without needing to override the visit method for each of the specific subclasses of{@link ExecutableElement}.
+ * <p>
  * Note, however, that unlike many visitors, element visitors visit objects based on the interfaces
  * implemented by those elements. Because interfaces form a graph structure rather than a tree
  * structure the way classes do, and because it is generally undesirable for an object to be visited
  * more than once, this class flattens the interface graph into a pseudo-tree. In particular, this
  * class treats elements as if the element types were structured in the following way:
- *
+ * <p>
  * <pre>
  * Element
  * ClassElement
@@ -1331,7 +1306,7 @@
  * ParameterElement
  * FieldFormalParameterElement
  * </pre>
- *
+ * <p>
  * Subclasses that override a visit method must either invoke the overridden visit method or
  * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
  * for superclasses of the element to not be invoked and will cause the children of the visited node
@@ -1381,11 +1356,11 @@
   R visitVariableElement(VariableElement element) => visitElement(element);
 }
 /**
- * Instances of the class `RecursiveElementVisitor` implement an element visitor that will
+ * Instances of the class {@code RecursiveElementVisitor} implement an element visitor that will
  * recursively visit all of the element in an element model. For example, using an instance of this
- * class to visit a [CompilationUnitElement] will also cause all of the types in the
+ * class to visit a {@link CompilationUnitElement} will also cause all of the types in the
  * compilation unit to be visited.
- *
+ * <p>
  * Subclasses that override a visit method must either invoke the overridden visit method or must
  * explicitly ask the visited element to visit its children. Failure to do so will cause the
  * children of the visited element to not be visited.
@@ -1482,7 +1457,7 @@
   }
 }
 /**
- * Instances of the class `SimpleElementVisitor` implement an element visitor that will do
+ * Instances of the class {@code SimpleElementVisitor} implement an element visitor that will do
  * nothing when visiting an element. It is intended to be a superclass for classes that use the
  * visitor pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a
  * whole structure) and that only need to visit a small number of element types.
@@ -1513,7 +1488,7 @@
   R visitTypeVariableElement(TypeVariableElement element) => null;
 }
 /**
- * Instances of the class `ClassElementImpl` implement a `ClassElement`.
+ * Instances of the class {@code ClassElementImpl} implement a {@code ClassElement}.
  * @coverage dart.engine.element
  */
 class ClassElementImpl extends ElementImpl implements ClassElement {
@@ -1550,7 +1525,7 @@
   List<MethodElement> _methods = MethodElementImpl.EMPTY_ARRAY;
 
   /**
-   * The superclass of the class, or `null` if the class does not have an explicit superclass.
+   * The superclass of the class, or {@code null} if the class does not have an explicit superclass.
    */
   InterfaceType _supertype;
 
@@ -1613,10 +1588,10 @@
   List<ConstructorElement> get constructors => _constructors;
 
   /**
-   * Given some name, this returns the [FieldElement] with the matching name, if there is no
-   * such field, then `null` is returned.
+   * Given some name, this returns the {@link FieldElement} with the matching name, if there is no
+   * such field, then {@code null} is returned.
    * @param name some name to lookup a field element with
-   * @return the matching field element, or `null` if no such element was found
+   * @return the matching field element, or {@code null} if no such element was found
    */
   FieldElement getField(String name2) {
     for (FieldElement fieldElement in _fields) {
@@ -1629,7 +1604,7 @@
   List<FieldElement> get fields => _fields;
   PropertyAccessorElement getGetter(String getterName) {
     for (PropertyAccessorElement accessor in _accessors) {
-      if (accessor.isGetter && accessor.name == getterName) {
+      if (accessor.isGetter() && accessor.name == getterName) {
         return accessor;
       }
     }
@@ -1661,7 +1636,7 @@
       setterName += '=';
     }
     for (PropertyAccessorElement accessor in _accessors) {
-      if (accessor.isSetter && accessor.name == setterName) {
+      if (accessor.isSetter() && accessor.name == setterName) {
         return accessor;
       }
     }
@@ -1679,14 +1654,6 @@
     }
     return null;
   }
-  bool hasDefaultConstructor() {
-    for (ConstructorElement constructor in constructors) {
-      if (constructor.isDefaultConstructor) {
-        return true;
-      }
-    }
-    return false;
-  }
   bool hasNonFinalField() {
     List<ClassElement> classesToVisit = new List<ClassElement>();
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
@@ -1695,7 +1662,7 @@
       ClassElement currentElement = classesToVisit.removeAt(0);
       if (javaSetAdd(visitedClasses, currentElement)) {
         for (FieldElement field in currentElement.fields) {
-          if (!field.isFinal && !field.isConst && !field.isStatic && !field.isSynthetic) {
+          if (!field.isFinal() && !field.isConst() && !field.isStatic() && !field.isSynthetic()) {
             return true;
           }
         }
@@ -1715,9 +1682,9 @@
     return false;
   }
   bool hasReferenceToSuper() => hasModifier(Modifier.REFERENCES_SUPER);
-  bool get isAbstract => hasModifier(Modifier.ABSTRACT);
-  bool get isTypedef => hasModifier(Modifier.TYPEDEF);
-  bool get isValidMixin => hasModifier(Modifier.MIXIN);
+  bool isAbstract() => hasModifier(Modifier.ABSTRACT);
+  bool isTypedef() => hasModifier(Modifier.TYPEDEF);
+  bool isValidMixin() => hasModifier(Modifier.MIXIN);
   PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
     ClassElement currentElement = this;
@@ -1799,7 +1766,7 @@
 
   /**
    * Set whether this class is abstract to correspond to the given value.
-   * @param isAbstract `true` if the class is abstract
+   * @param isAbstract {@code true} if the class is abstract
    */
   void set abstract(bool isAbstract) {
     setModifier(Modifier.ABSTRACT, isAbstract);
@@ -1840,7 +1807,7 @@
 
   /**
    * Set whether this class references 'super' to the given value.
-   * @param isReferencedSuper `true` references 'super'
+   * @param isReferencedSuper {@code true} references 'super'
    */
   void set hasReferenceToSuper2(bool isReferencedSuper) {
     setModifier(Modifier.REFERENCES_SUPER, isReferencedSuper);
@@ -1892,7 +1859,7 @@
 
   /**
    * Set whether this class is defined by a typedef construct to correspond to the given value.
-   * @param isTypedef `true` if the class is defined by a typedef construct
+   * @param isTypedef {@code true} if the class is defined by a typedef construct
    */
   void set typedef(bool isTypedef) {
     setModifier(Modifier.TYPEDEF, isTypedef);
@@ -1911,7 +1878,7 @@
 
   /**
    * Set whether this class is a valid mixin to correspond to the given value.
-   * @param isValidMixin `true` if this class can be used as a mixin
+   * @param isValidMixin {@code true} if this class can be used as a mixin
    */
   void set validMixin(bool isValidMixin) {
     setModifier(Modifier.MIXIN, isValidMixin);
@@ -1973,7 +1940,7 @@
   }
 }
 /**
- * Instances of the class `CompilationUnitElementImpl` implement a[CompilationUnitElement].
+ * Instances of the class {@code CompilationUnitElementImpl} implement a{@link CompilationUnitElement}.
  * @coverage dart.engine.element
  */
 class CompilationUnitElementImpl extends ElementImpl implements CompilationUnitElement {
@@ -2015,7 +1982,7 @@
   List<ClassElement> _types = ClassElementImpl.EMPTY_ARRAY;
 
   /**
-   * The URI that is specified by the "part" directive in the enclosing library, or `null` if
+   * The URI that is specified by the "part" directive in the enclosing library, or {@code null} if
    * this is the defining compilation unit of a library.
    */
   String _uri;
@@ -2164,7 +2131,7 @@
   }
 }
 /**
- * Instances of the class `ConstFieldElementImpl` implement a `FieldElement` for a
+ * Instances of the class {@code ConstFieldElementImpl} implement a {@code FieldElement} for a
  * 'const' field that has an initializer.
  */
 class ConstFieldElementImpl extends FieldElementImpl {
@@ -2186,7 +2153,7 @@
   }
 }
 /**
- * Instances of the class `ConstLocalVariableElementImpl` implement a`LocalVariableElement` for a local 'const' variable that has an initializer.
+ * Instances of the class {@code ConstLocalVariableElementImpl} implement a{@code LocalVariableElement} for a local 'const' variable that has an initializer.
  * @coverage dart.engine.element
  */
 class ConstLocalVariableElementImpl extends LocalVariableElementImpl {
@@ -2208,7 +2175,30 @@
   }
 }
 /**
- * Instances of the class `ConstTopLevelVariableElementImpl` implement a`TopLevelVariableElement` for a top-level 'const' variable that has an initializer.
+ * Instances of the class {@code ConstParameterElementImpl} implement a {@code ParameterElement} for
+ * a 'const' parameter that has an initializer.
+ * @coverage dart.engine.element
+ */
+class ConstParameterElementImpl extends ParameterElementImpl {
+
+  /**
+   * The result of evaluating this variable's initializer.
+   */
+  EvaluationResultImpl _result;
+
+  /**
+   * Initialize a newly created parameter element to have the given name.
+   * @param name the name of this element
+   */
+  ConstParameterElementImpl(Identifier name) : super(name) {
+  }
+  EvaluationResultImpl get evaluationResult => _result;
+  void set evaluationResult(EvaluationResultImpl result2) {
+    this._result = result2;
+  }
+}
+/**
+ * Instances of the class {@code ConstTopLevelVariableElementImpl} implement a{@code TopLevelVariableElement} for a top-level 'const' variable that has an initializer.
  */
 class ConstTopLevelVariableElementImpl extends TopLevelVariableElementImpl {
 
@@ -2229,7 +2219,7 @@
   }
 }
 /**
- * Instances of the class `ConstructorElementImpl` implement a `ConstructorElement`.
+ * Instances of the class {@code ConstructorElementImpl} implement a {@code ConstructorElement}.
  * @coverage dart.engine.element
  */
 class ConstructorElementImpl extends ExecutableElementImpl implements ConstructorElement {
@@ -2254,25 +2244,13 @@
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
   ElementKind get kind => ElementKind.CONSTRUCTOR;
   ConstructorElement get redirectedConstructor => _redirectedConstructor;
-  bool get isConst => hasModifier(Modifier.CONST);
-  bool get isDefaultConstructor {
-    String name = this.name;
-    if (name != null && name.length != 0) {
-      return false;
-    }
-    for (ParameterElement parameter in parameters) {
-      if (identical(parameter.parameterKind, ParameterKind.REQUIRED)) {
-        return false;
-      }
-    }
-    return true;
-  }
-  bool get isFactory => hasModifier(Modifier.FACTORY);
-  bool get isStatic => false;
+  bool isConst() => hasModifier(Modifier.CONST);
+  bool isFactory() => hasModifier(Modifier.FACTORY);
+  bool isStatic() => false;
 
   /**
    * Set whether this constructor represents a 'const' constructor to the given value.
-   * @param isConst `true` if this constructor represents a 'const' constructor
+   * @param isConst {@code true} if this constructor represents a 'const' constructor
    */
   void set const2(bool isConst) {
     setModifier(Modifier.CONST, isConst);
@@ -2280,7 +2258,7 @@
 
   /**
    * Set whether this constructor represents a factory method to the given value.
-   * @param isFactory `true` if this constructor represents a factory method
+   * @param isFactory {@code true} if this constructor represents a factory method
    */
   void set factory(bool isFactory) {
     setModifier(Modifier.FACTORY, isFactory);
@@ -2304,52 +2282,8 @@
   }
 }
 /**
- * Instances of the class `DefaultFieldFormalParameterElementImpl` implement a`FieldFormalParameterElementImpl` for parameters that have an initializer.
- * @coverage dart.engine.element
- */
-class DefaultFieldFormalParameterElementImpl extends FieldFormalParameterElementImpl {
-
-  /**
-   * The result of evaluating this variable's initializer.
-   */
-  EvaluationResultImpl _result;
-
-  /**
-   * Initialize a newly created parameter element to have the given name.
-   * @param name the name of this element
-   */
-  DefaultFieldFormalParameterElementImpl(Identifier name) : super(name) {
-  }
-  EvaluationResultImpl get evaluationResult => _result;
-  void set evaluationResult(EvaluationResultImpl result2) {
-    this._result = result2;
-  }
-}
-/**
- * Instances of the class `DefaultParameterElementImpl` implement a `ParameterElement`for parameters that have an initializer.
- * @coverage dart.engine.element
- */
-class DefaultParameterElementImpl extends ParameterElementImpl {
-
-  /**
-   * The result of evaluating this variable's initializer.
-   */
-  EvaluationResultImpl _result;
-
-  /**
-   * Initialize a newly created parameter element to have the given name.
-   * @param name the name of this element
-   */
-  DefaultParameterElementImpl(Identifier name) : super(name) {
-  }
-  EvaluationResultImpl get evaluationResult => _result;
-  void set evaluationResult(EvaluationResultImpl result2) {
-    this._result = result2;
-  }
-}
-/**
- * Instances of the class `DynamicElementImpl` represent the synthetic element representing
- * the declaration of the type `dynamic`.
+ * Instances of the class {@code DynamicElementImpl} represent the synthetic element representing
+ * the declaration of the type {@code dynamic}.
  * @coverage dart.engine.element
  */
 class DynamicElementImpl extends ElementImpl {
@@ -2368,7 +2302,7 @@
   /**
    * Initialize a newly created instance of this class. Instances of this class should <b>not</b> be
    * created except as part of creating the type associated with this element. The single instance
-   * of this class should be accessed through the method [getInstance].
+   * of this class should be accessed through the method {@link #getInstance()}.
    */
   DynamicElementImpl() : super.con2(Keyword.DYNAMIC.syntax, -1) {
     setModifier(Modifier.SYNTHETIC, true);
@@ -2391,7 +2325,7 @@
   }
 }
 /**
- * Instances of the class `ElementAnnotationImpl` implement an [ElementAnnotation].
+ * Instances of the class {@code ElementAnnotationImpl} implement an {@link ElementAnnotation}.
  * @coverage dart.engine.element
  */
 class ElementAnnotationImpl implements ElementAnnotation {
@@ -2418,14 +2352,14 @@
   String toString() => "@${_element.toString()}";
 }
 /**
- * The abstract class `ElementImpl` implements the behavior common to objects that implement
- * an [Element].
+ * The abstract class {@code ElementImpl} implements the behavior common to objects that implement
+ * an {@link Element}.
  * @coverage dart.engine.element
  */
 abstract class ElementImpl implements Element {
 
   /**
-   * The enclosing element of this element, or `null` if this element is at the root of the
+   * The enclosing element of this element, or {@code null} if this element is at the root of the
    * element structure.
    */
   ElementImpl _enclosingElement;
@@ -2461,10 +2395,10 @@
    * @param name the name of this element
    */
   ElementImpl.con1(Identifier name2) {
-    _jtd_constructor_195_impl(name2);
+    _jtd_constructor_194_impl(name2);
   }
-  _jtd_constructor_195_impl(Identifier name2) {
-    _jtd_constructor_196_impl(name2 == null ? "" : name2.name, name2 == null ? -1 : name2.offset);
+  _jtd_constructor_194_impl(Identifier name2) {
+    _jtd_constructor_195_impl(name2 == null ? "" : name2.name, name2 == null ? -1 : name2.offset);
   }
 
   /**
@@ -2474,9 +2408,9 @@
    * declaration of this element
    */
   ElementImpl.con2(String name2, int nameOffset2) {
-    _jtd_constructor_196_impl(name2, nameOffset2);
+    _jtd_constructor_195_impl(name2, nameOffset2);
   }
-  _jtd_constructor_196_impl(String name2, int nameOffset2) {
+  _jtd_constructor_195_impl(String name2, int nameOffset2) {
     this._name = StringUtilities.intern(name2);
     this._nameOffset = nameOffset2;
   }
@@ -2497,7 +2431,7 @@
   }
 
   /**
-   * Return the child of this element that is uniquely identified by the given identifier, or`null` if there is no such child.
+   * Return the child of this element that is uniquely identified by the given identifier, or{@code null} if there is no such child.
    * @param identifier the identifier used to select a child
    * @return the child of this element with the given identifier
    */
@@ -2533,7 +2467,7 @@
     }
     return true;
   }
-  bool get isSynthetic => hasModifier(Modifier.SYNTHETIC);
+  bool isSynthetic() => hasModifier(Modifier.SYNTHETIC);
 
   /**
    * Set the metadata associate with this element to the given array of annotations.
@@ -2555,7 +2489,7 @@
 
   /**
    * Set whether this element is synthetic to correspond to the given value.
-   * @param isSynthetic `true` if the element is synthetic
+   * @param isSynthetic {@code true} if the element is synthetic
    */
   void set synthetic(bool isSynthetic) {
     setModifier(Modifier.SYNTHETIC, isSynthetic);
@@ -2590,14 +2524,14 @@
   String get identifier => name;
 
   /**
-   * Return `true` if this element has the given modifier associated with it.
+   * Return {@code true} if this element has the given modifier associated with it.
    * @param modifier the modifier being tested for
-   * @return `true` if this element has the given modifier associated with it
+   * @return {@code true} if this element has the given modifier associated with it
    */
   bool hasModifier(Modifier modifier) => _modifiers != null && _modifiers.contains(modifier);
 
   /**
-   * If the given child is not `null`, use the given visitor to visit it.
+   * If the given child is not {@code null}, use the given visitor to visit it.
    * @param child the child to be visited
    * @param visitor the visitor to be used to visit the child
    */
@@ -2632,7 +2566,7 @@
    * Set whether the given modifier is associated with this element to correspond to the given
    * value.
    * @param modifier the modifier to be set
-   * @param value `true` if the modifier is to be associated with this element
+   * @param value {@code true} if the modifier is to be associated with this element
    */
   void setModifier(Modifier modifier, bool value) {
     if (value) {
@@ -2651,7 +2585,7 @@
   }
 }
 /**
- * Instances of the class `ElementLocationImpl` implement an [ElementLocation].
+ * Instances of the class {@code ElementLocationImpl} implement an {@link ElementLocation}.
  * @coverage dart.engine.element
  */
 class ElementLocationImpl implements ElementLocation {
@@ -2671,9 +2605,9 @@
    * @param element the element whose location is being represented
    */
   ElementLocationImpl.con1(Element element) {
-    _jtd_constructor_197_impl(element);
+    _jtd_constructor_196_impl(element);
   }
-  _jtd_constructor_197_impl(Element element) {
+  _jtd_constructor_196_impl(Element element) {
     List<String> components = new List<String>();
     Element ancestor = element;
     while (ancestor != null) {
@@ -2688,9 +2622,9 @@
    * @param encoding the encoded form of a location
    */
   ElementLocationImpl.con2(String encoding) {
-    _jtd_constructor_198_impl(encoding);
+    _jtd_constructor_197_impl(encoding);
   }
-  _jtd_constructor_198_impl(String encoding) {
+  _jtd_constructor_197_impl(String encoding) {
     this._components = decode(encoding);
   }
   bool operator ==(Object object) {
@@ -2785,11 +2719,11 @@
   }
 
   /**
-   * Return `true` if the given components, when interpreted to be encoded sources with a
+   * Return {@code true} if the given components, when interpreted to be encoded sources with a
    * leading source type indicator, are equal when the source type's are ignored.
    * @param left the left component being compared
    * @param right the right component being compared
-   * @return `true` if the given components are equal when the source type's are ignored
+   * @return {@code true} if the given components are equal when the source type's are ignored
    */
   bool equalSourceComponents(String left, String right) {
     if (left == null) {
@@ -2804,7 +2738,7 @@
   }
 }
 /**
- * Instances of the class `EmbeddedHtmlScriptElementImpl` implement an[EmbeddedHtmlScriptElement].
+ * Instances of the class {@code EmbeddedHtmlScriptElementImpl} implement an{@link EmbeddedHtmlScriptElement}.
  * @coverage dart.engine.element
  */
 class EmbeddedHtmlScriptElementImpl extends HtmlScriptElementImpl implements EmbeddedHtmlScriptElement {
@@ -2816,7 +2750,7 @@
 
   /**
    * Initialize a newly created script element to have the specified tag name and offset.
-   * @param node the XML node from which this element is derived (not `null`)
+   * @param node the XML node from which this element is derived (not {@code null})
    */
   EmbeddedHtmlScriptElementImpl(XmlTagNode node) : super(node) {
   }
@@ -2826,7 +2760,7 @@
 
   /**
    * Set the script library defined by the script tag's content.
-   * @param scriptLibrary the library or `null` if none
+   * @param scriptLibrary the library or {@code null} if none
    */
   void set scriptLibrary(LibraryElementImpl scriptLibrary2) {
     scriptLibrary2.enclosingElement = this;
@@ -2837,7 +2771,7 @@
   }
 }
 /**
- * The abstract class `ExecutableElementImpl` implements the behavior common to`ExecutableElement`s.
+ * The abstract class {@code ExecutableElementImpl} implements the behavior common to{@code ExecutableElement}s.
  * @coverage dart.engine.element
  */
 abstract class ExecutableElementImpl extends ElementImpl implements ExecutableElement {
@@ -2863,11 +2797,6 @@
   List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
 
   /**
-   * The return type defined by this executable element.
-   */
-  Type2 _returnType;
-
-  /**
    * The type of function defined by this executable element.
    */
   FunctionType _type;
@@ -2882,9 +2811,9 @@
    * @param name the name of this element
    */
   ExecutableElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_200_impl(name);
+    _jtd_constructor_199_impl(name);
   }
-  _jtd_constructor_200_impl(Identifier name) {
+  _jtd_constructor_199_impl(Identifier name) {
   }
 
   /**
@@ -2894,9 +2823,9 @@
    * declaration of this element
    */
   ExecutableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_201_impl(name, nameOffset);
+    _jtd_constructor_200_impl(name, nameOffset);
   }
-  _jtd_constructor_201_impl(String name, int nameOffset) {
+  _jtd_constructor_200_impl(String name, int nameOffset) {
   }
   ElementImpl getChild(String identifier2) {
     for (ExecutableElement function in _functions) {
@@ -2925,9 +2854,8 @@
   List<LabelElement> get labels => _labels;
   List<LocalVariableElement> get localVariables => _localVariables;
   List<ParameterElement> get parameters => _parameters;
-  Type2 get returnType => _returnType;
   FunctionType get type => _type;
-  bool get isOperator => false;
+  bool isOperator() => false;
 
   /**
    * Set the functions defined within this executable element to the given functions.
@@ -2974,14 +2902,6 @@
   }
 
   /**
-   * Set the return type defined by this executable element.
-   * @param returnType the return type defined by this executable element
-   */
-  void set returnType(Type2 returnType2) {
-    this._returnType = returnType2;
-  }
-
-  /**
    * Set the type of function defined by this executable element to the given type.
    * @param type the type of function defined by this executable element
    */
@@ -3012,7 +2932,7 @@
   }
 }
 /**
- * Instances of the class `ExportElementImpl` implement an [ExportElement].
+ * Instances of the class {@code ExportElementImpl} implement an {@link ExportElement}.
  * @coverage dart.engine.element
  */
 class ExportElementImpl extends ElementImpl implements ExportElement {
@@ -3076,19 +2996,19 @@
   String get identifier => _exportedLibrary.name;
 }
 /**
- * Instances of the class `ExternalHtmlScriptElementImpl` implement an[ExternalHtmlScriptElement].
+ * Instances of the class {@code ExternalHtmlScriptElementImpl} implement an{@link ExternalHtmlScriptElement}.
  * @coverage dart.engine.element
  */
 class ExternalHtmlScriptElementImpl extends HtmlScriptElementImpl implements ExternalHtmlScriptElement {
 
   /**
-   * The source specified in the `source` attribute or `null` if unspecified.
+   * The source specified in the {@code source} attribute or {@code null} if unspecified.
    */
   Source _scriptSource;
 
   /**
    * Initialize a newly created script element to have the specified tag name and offset.
-   * @param node the XML node from which this element is derived (not `null`)
+   * @param node the XML node from which this element is derived (not {@code null})
    */
   ExternalHtmlScriptElementImpl(XmlTagNode node) : super(node) {
   }
@@ -3097,15 +3017,15 @@
   Source get scriptSource => _scriptSource;
 
   /**
-   * Set the source specified in the `source` attribute.
-   * @param scriptSource the script source or `null` if unspecified
+   * Set the source specified in the {@code source} attribute.
+   * @param scriptSource the script source or {@code null} if unspecified
    */
   void set scriptSource(Source scriptSource2) {
     this._scriptSource = scriptSource2;
   }
 }
 /**
- * Instances of the class `FieldElementImpl` implement a `FieldElement`.
+ * Instances of the class {@code FieldElementImpl} implement a {@code FieldElement}.
  * @coverage dart.engine.element
  */
 class FieldElementImpl extends PropertyInducingElementImpl implements FieldElement {
@@ -3120,9 +3040,9 @@
    * @param name the name of this element
    */
   FieldElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_204_impl(name);
+    _jtd_constructor_203_impl(name);
   }
-  _jtd_constructor_204_impl(Identifier name) {
+  _jtd_constructor_203_impl(Identifier name) {
   }
 
   /**
@@ -3130,25 +3050,25 @@
    * @param name the name of this element
    */
   FieldElementImpl.con2(String name) : super.con2(name) {
-    _jtd_constructor_205_impl(name);
+    _jtd_constructor_204_impl(name);
   }
-  _jtd_constructor_205_impl(String name) {
+  _jtd_constructor_204_impl(String name) {
   }
   accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
   ElementKind get kind => ElementKind.FIELD;
-  bool get isStatic => hasModifier(Modifier.STATIC);
+  bool isStatic() => hasModifier(Modifier.STATIC);
 
   /**
    * Set whether this field is static to correspond to the given value.
-   * @param isStatic `true` if the field is static
+   * @param isStatic {@code true} if the field is static
    */
   void set static(bool isStatic) {
     setModifier(Modifier.STATIC, isStatic);
   }
 }
 /**
- * Instances of the class `FieldFormalParameterElementImpl` extend[ParameterElementImpl] to provide the additional information of the [FieldElement]associated with the parameter.
+ * Instances of the class {@code FieldFormalParameterElementImpl} extend{@link ParameterElementImpl} to provide the additional information of the {@link FieldElement}associated with the parameter.
  * @coverage dart.engine.element
  */
 class FieldFormalParameterElementImpl extends ParameterElementImpl implements FieldFormalParameterElement {
@@ -3166,7 +3086,7 @@
   }
   accept(ElementVisitor visitor) => visitor.visitFieldFormalParameterElement(this);
   FieldElement get field => _field;
-  bool get isInitializingFormal => true;
+  bool isInitializingFormal() => true;
 
   /**
    * Set the field element associated with this field formal parameter to the given element.
@@ -3177,7 +3097,7 @@
   }
 }
 /**
- * Instances of the class `FunctionElementImpl` implement a `FunctionElement`.
+ * Instances of the class {@code FunctionElementImpl} implement a {@code FunctionElement}.
  * @coverage dart.engine.element
  */
 class FunctionElementImpl extends ExecutableElementImpl implements FunctionElement {
@@ -3188,7 +3108,7 @@
   int _visibleRangeOffset = 0;
 
   /**
-   * The length of the visible range for this element, or `-1` if this element does not have a
+   * The length of the visible range for this element, or {@code -1} if this element does not have a
    * visible range.
    */
   int _visibleRangeLength = -1;
@@ -3202,9 +3122,9 @@
    * Initialize a newly created synthetic function element.
    */
   FunctionElementImpl() : super.con2("", -1) {
-    _jtd_constructor_207_impl();
+    _jtd_constructor_206_impl();
   }
-  _jtd_constructor_207_impl() {
+  _jtd_constructor_206_impl() {
     synthetic = true;
   }
 
@@ -3213,9 +3133,9 @@
    * @param name the name of this element
    */
   FunctionElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_208_impl(name);
+    _jtd_constructor_207_impl(name);
   }
-  _jtd_constructor_208_impl(Identifier name) {
+  _jtd_constructor_207_impl(Identifier name) {
   }
 
   /**
@@ -3225,9 +3145,9 @@
    * declaration of this element
    */
   FunctionElementImpl.con2(int nameOffset) : super.con2("", nameOffset) {
-    _jtd_constructor_209_impl(nameOffset);
+    _jtd_constructor_208_impl(nameOffset);
   }
-  _jtd_constructor_209_impl(int nameOffset) {
+  _jtd_constructor_208_impl(int nameOffset) {
   }
   accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
   String get identifier => "${name}@${nameOffset}";
@@ -3238,13 +3158,13 @@
     }
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
-  bool get isStatic => enclosingElement is CompilationUnitElement;
+  bool isStatic() => enclosingElement is CompilationUnitElement;
 
   /**
    * Set the visible range for this element to the range starting at the given offset with the given
    * length.
    * @param offset the offset to the beginning of the visible range for this element
-   * @param length the length of the visible range for this element, or `-1` if this element
+   * @param length the length of the visible range for this element, or {@code -1} if this element
    * does not have a visible range
    */
   void setVisibleRange(int offset, int length) {
@@ -3260,7 +3180,7 @@
   }
 }
 /**
- * Instances of the class `FunctionTypeAliasElementImpl` implement a`FunctionTypeAliasElement`.
+ * Instances of the class {@code FunctionTypeAliasElementImpl} implement a{@code FunctionTypeAliasElement}.
  * @coverage dart.engine.element
  */
 class FunctionTypeAliasElementImpl extends ElementImpl implements FunctionTypeAliasElement {
@@ -3271,11 +3191,6 @@
   List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
 
   /**
-   * The return type defined by this type alias.
-   */
-  Type2 _returnType;
-
-  /**
    * The type of function defined by this type alias.
    */
   FunctionType _type;
@@ -3313,7 +3228,6 @@
   CompilationUnitElement get enclosingElement => super.enclosingElement as CompilationUnitElement;
   ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
   List<ParameterElement> get parameters => _parameters;
-  Type2 get returnType => _returnType;
   FunctionType get type => _type;
   List<TypeVariableElement> get typeVariables => _typeVariables;
 
@@ -3331,14 +3245,6 @@
   }
 
   /**
-   * Set the return type defined by this type alias.
-   * @param returnType the return type defined by this type alias
-   */
-  void set returnType(Type2 returnType2) {
-    this._returnType = returnType2;
-  }
-
-  /**
    * Set the type of function defined by this type alias to the given type.
    * @param type the type of function defined by this type alias
    */
@@ -3391,7 +3297,7 @@
   }
 }
 /**
- * Instances of the class `HideElementCombinatorImpl` implement a[HideElementCombinator].
+ * Instances of the class {@code HideElementCombinatorImpl} implement a{@link HideElementCombinator}.
  * @coverage dart.engine.element
  */
 class HideElementCombinatorImpl implements HideElementCombinator {
@@ -3425,7 +3331,7 @@
   }
 }
 /**
- * Instances of the class `HtmlElementImpl` implement an [HtmlElement].
+ * Instances of the class {@code HtmlElementImpl} implement an {@link HtmlElement}.
  * @coverage dart.engine.element
  */
 class HtmlElementImpl extends ElementImpl implements HtmlElement {
@@ -3500,7 +3406,7 @@
   }
 }
 /**
- * Instances of the class `HtmlScriptElementImpl` implement an [HtmlScriptElement].
+ * Instances of the class {@code HtmlScriptElementImpl} implement an {@link HtmlScriptElement}.
  * @coverage dart.engine.element
  */
 abstract class HtmlScriptElementImpl extends ElementImpl implements HtmlScriptElement {
@@ -3512,13 +3418,13 @@
 
   /**
    * Initialize a newly created script element to have the specified tag name and offset.
-   * @param node the XML node from which this element is derived (not `null`)
+   * @param node the XML node from which this element is derived (not {@code null})
    */
   HtmlScriptElementImpl(XmlTagNode node) : super.con2(node.tag.lexeme, node.tag.offset) {
   }
 }
 /**
- * Instances of the class `ImportElementImpl` implement an [ImportElement].
+ * Instances of the class {@code ImportElementImpl} implement an {@link ImportElement}.
  * @coverage dart.engine.element
  */
 class ImportElementImpl extends ElementImpl implements ImportElement {
@@ -3540,7 +3446,7 @@
   List<NamespaceCombinator> _combinators = NamespaceCombinator.EMPTY_ARRAY;
 
   /**
-   * The prefix that was specified as part of the import directive, or `null` if there was no
+   * The prefix that was specified as part of the import directive, or {@code null} if there was no
    * prefix specified.
    */
   PrefixElement _prefix;
@@ -3601,18 +3507,18 @@
   String get identifier => ((_importedLibrary as LibraryElementImpl)).identifier;
 }
 /**
- * Instances of the class `LabelElementImpl` implement a `LabelElement`.
+ * Instances of the class {@code LabelElementImpl} implement a {@code LabelElement}.
  * @coverage dart.engine.element
  */
 class LabelElementImpl extends ElementImpl implements LabelElement {
 
   /**
-   * A flag indicating whether this label is associated with a `switch` statement.
+   * A flag indicating whether this label is associated with a {@code switch} statement.
    */
   bool _onSwitchStatement = false;
 
   /**
-   * A flag indicating whether this label is associated with a `switch` member (`case`or `default`).
+   * A flag indicating whether this label is associated with a {@code switch} member ({@code case}or {@code default}).
    */
   bool _onSwitchMember = false;
 
@@ -3624,8 +3530,8 @@
   /**
    * Initialize a newly created label element to have the given name.
    * @param name the name of this element
-   * @param onSwitchStatement `true` if this label is associated with a `switch`statement
-   * @param onSwitchMember `true` if this label is associated with a `switch` member
+   * @param onSwitchStatement {@code true} if this label is associated with a {@code switch}statement
+   * @param onSwitchMember {@code true} if this label is associated with a {@code switch} member
    */
   LabelElementImpl(Identifier name, bool onSwitchStatement, bool onSwitchMember) : super.con1(name) {
     this._onSwitchStatement = onSwitchStatement;
@@ -3636,19 +3542,19 @@
   ElementKind get kind => ElementKind.LABEL;
 
   /**
-   * Return `true` if this label is associated with a `switch` member (`case` or`default`).
-   * @return `true` if this label is associated with a `switch` member
+   * Return {@code true} if this label is associated with a {@code switch} member ({@code case} or{@code default}).
+   * @return {@code true} if this label is associated with a {@code switch} member
    */
-  bool get isOnSwitchMember => _onSwitchMember;
+  bool isOnSwitchMember() => _onSwitchMember;
 
   /**
-   * Return `true` if this label is associated with a `switch` statement.
-   * @return `true` if this label is associated with a `switch` statement
+   * Return {@code true} if this label is associated with a {@code switch} statement.
+   * @return {@code true} if this label is associated with a {@code switch} statement
    */
-  bool get isOnSwitchStatement => _onSwitchStatement;
+  bool isOnSwitchStatement() => _onSwitchStatement;
 }
 /**
- * Instances of the class `LibraryElementImpl` implement a `LibraryElement`.
+ * Instances of the class {@code LibraryElementImpl} implement a {@code LibraryElement}.
  * @coverage dart.engine.element
  */
 class LibraryElementImpl extends ElementImpl implements LibraryElement {
@@ -3700,7 +3606,7 @@
   CompilationUnitElement _definingCompilationUnit;
 
   /**
-   * The entry point for this library, or `null` if this library does not have an entry point.
+   * The entry point for this library, or {@code null} if this library does not have an entry point.
    */
   FunctionElement _entryPoint;
 
@@ -3715,7 +3621,7 @@
   List<ExportElement> _exports = ExportElement.EMPTY_ARRAY;
 
   /**
-   * An array containing all of the compilation units that are included in this library using a`part` directive.
+   * An array containing all of the compilation units that are included in this library using a{@code part} directive.
    */
   List<CompilationUnitElement> _parts = CompilationUnitElementImpl.EMPTY_ARRAY;
 
@@ -3809,8 +3715,8 @@
     return null;
   }
   int get hashCode => _definingCompilationUnit.hashCode;
-  bool get isBrowserApplication => _entryPoint != null && isOrImportsBrowserLibrary;
-  bool get isDartCore => name == "dart.core";
+  bool isBrowserApplication() => _entryPoint != null && isOrImportsBrowserLibrary();
+  bool isDartCore() => name == "dart.core";
   bool isUpToDate2(int timeStamp) {
     Set<LibraryElement> visitedLibraries = new Set();
     return isUpToDate(this, timeStamp, visitedLibraries);
@@ -3860,8 +3766,8 @@
   }
 
   /**
-   * Set the compilation units that are included in this library using a `part` directive.
-   * @param parts the compilation units that are included in this library using a `part`directive
+   * Set the compilation units that are included in this library using a {@code part} directive.
+   * @param parts the compilation units that are included in this library using a {@code part}directive
    */
   void set parts(List<CompilationUnitElement> parts2) {
     for (CompilationUnitElement compilationUnit in parts2) {
@@ -3878,10 +3784,10 @@
   }
 
   /**
-   * Answer `true` if the receiver directly or indirectly imports the dart:html libraries.
-   * @return `true` if the receiver directly or indirectly imports the dart:html libraries
+   * Answer {@code true} if the receiver directly or indirectly imports the dart:html libraries.
+   * @return {@code true} if the receiver directly or indirectly imports the dart:html libraries
    */
-  bool get isOrImportsBrowserLibrary {
+  bool isOrImportsBrowserLibrary() {
     List<LibraryElement> visited = new List<LibraryElement>();
     Source htmlLibSource = _context.sourceFactory.forUri(DartSdk.DART_HTML);
     visited.add(this);
@@ -3906,7 +3812,7 @@
   }
 }
 /**
- * Instances of the class `LocalVariableElementImpl` implement a `LocalVariableElement`.
+ * Instances of the class {@code LocalVariableElementImpl} implement a {@code LocalVariableElement}.
  * @coverage dart.engine.element
  */
 class LocalVariableElementImpl extends VariableElementImpl implements LocalVariableElement {
@@ -3917,7 +3823,7 @@
   int _visibleRangeOffset = 0;
 
   /**
-   * The length of the visible range for this element, or `-1` if this element does not have a
+   * The length of the visible range for this element, or {@code -1} if this element does not have a
    * visible range.
    */
   int _visibleRangeLength = -1;
@@ -3946,7 +3852,7 @@
    * Set the visible range for this element to the range starting at the given offset with the given
    * length.
    * @param offset the offset to the beginning of the visible range for this element
-   * @param length the length of the visible range for this element, or `-1` if this element
+   * @param length the length of the visible range for this element, or {@code -1} if this element
    * does not have a visible range
    */
   void setVisibleRange(int offset, int length) {
@@ -3961,7 +3867,7 @@
   String get identifier => "${super.identifier}@${nameOffset}";
 }
 /**
- * Instances of the class `MethodElementImpl` implement a `MethodElement`.
+ * Instances of the class {@code MethodElementImpl} implement a {@code MethodElement}.
  * @coverage dart.engine.element
  */
 class MethodElementImpl extends ExecutableElementImpl implements MethodElement {
@@ -3976,9 +3882,9 @@
    * @param name the name of this element
    */
   MethodElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_218_impl(name);
+    _jtd_constructor_217_impl(name);
   }
-  _jtd_constructor_218_impl(Identifier name) {
+  _jtd_constructor_217_impl(Identifier name) {
   }
 
   /**
@@ -3988,24 +3894,24 @@
    * declaration of this element
    */
   MethodElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_219_impl(name, nameOffset);
+    _jtd_constructor_218_impl(name, nameOffset);
   }
-  _jtd_constructor_219_impl(String name, int nameOffset) {
+  _jtd_constructor_218_impl(String name, int nameOffset) {
   }
   accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
   ElementKind get kind => ElementKind.METHOD;
   String get name {
     String name = super.name;
-    if (isOperator && name == "-") {
+    if (isOperator() && name == "-") {
       if (parameters.length == 0) {
         return "unary-";
       }
     }
     return super.name;
   }
-  bool get isAbstract => hasModifier(Modifier.ABSTRACT);
-  bool get isOperator {
+  bool isAbstract() => hasModifier(Modifier.ABSTRACT);
+  bool isOperator() {
     String name = displayName;
     if (name.isEmpty) {
       return false;
@@ -4013,11 +3919,11 @@
     int first = name.codeUnitAt(0);
     return !((0x61 <= first && first <= 0x7A) || (0x41 <= first && first <= 0x5A) || first == 0x5F || first == 0x24);
   }
-  bool get isStatic => hasModifier(Modifier.STATIC);
+  bool isStatic() => hasModifier(Modifier.STATIC);
 
   /**
    * Set whether this method is abstract to correspond to the given value.
-   * @param isAbstract `true` if the method is abstract
+   * @param isAbstract {@code true} if the method is abstract
    */
   void set abstract(bool isAbstract) {
     setModifier(Modifier.ABSTRACT, isAbstract);
@@ -4025,7 +3931,7 @@
 
   /**
    * Set whether this method is static to correspond to the given value.
-   * @param isStatic `true` if the method is static
+   * @param isStatic {@code true} if the method is static
    */
   void set static(bool isStatic) {
     setModifier(Modifier.STATIC, isStatic);
@@ -4038,7 +3944,7 @@
   }
 }
 /**
- * The enumeration `Modifier` defines constants for all of the modifiers defined by the Dart
+ * The enumeration {@code Modifier} defines constants for all of the modifiers defined by the Dart
  * language and for a few additional flags that are useful.
  * @coverage dart.engine.element
  */
@@ -4068,7 +3974,7 @@
   String toString() => name;
 }
 /**
- * Instances of the class `MultiplyDefinedElementImpl` represent a collection of elements that
+ * Instances of the class {@code MultiplyDefinedElementImpl} represent a collection of elements that
  * have the same name within the same scope.
  * @coverage dart.engine.element
  */
@@ -4121,7 +4027,7 @@
     }
     return false;
   }
-  bool get isSynthetic => true;
+  bool isSynthetic() => true;
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append("[");
@@ -4170,7 +4076,7 @@
   }
 }
 /**
- * Instances of the class `ParameterElementImpl` implement a `ParameterElement`.
+ * Instances of the class {@code ParameterElementImpl} implement a {@code ParameterElement}.
  * @coverage dart.engine.element
  */
 class ParameterElementImpl extends VariableElementImpl implements ParameterElement {
@@ -4192,7 +4098,7 @@
   int _defaultValueRangeOffset = 0;
 
   /**
-   * The length of the default value range for this element, or `-1` if this element does not
+   * The length of the default value range for this element, or {@code -1} if this element does not
    * have a default value.
    */
   int _defaultValueRangeLength = -1;
@@ -4203,7 +4109,7 @@
   int _visibleRangeOffset = 0;
 
   /**
-   * The length of the visible range for this element, or `-1` if this element does not have a
+   * The length of the visible range for this element, or {@code -1} if this element does not have a
    * visible range.
    */
   int _visibleRangeLength = -1;
@@ -4235,13 +4141,13 @@
     }
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
-  bool get isInitializingFormal => false;
+  bool isInitializingFormal() => false;
 
   /**
    * Set the range of the default value for this parameter to the range starting at the given offset
    * with the given length.
    * @param offset the offset to the beginning of the default value range for this element
-   * @param length the length of the default value range for this element, or `-1` if this
+   * @param length the length of the default value range for this element, or {@code -1} if this
    * element does not have a default value
    */
   void setDefaultValueRange(int offset, int length) {
@@ -4272,7 +4178,7 @@
    * Set the visible range for this element to the range starting at the given offset with the given
    * length.
    * @param offset the offset to the beginning of the visible range for this element
-   * @param length the length of the visible range for this element, or `-1` if this element
+   * @param length the length of the visible range for this element, or {@code -1} if this element
    * does not have a visible range
    */
   void setVisibleRange(int offset, int length) {
@@ -4304,7 +4210,7 @@
   }
 }
 /**
- * Instances of the class `PrefixElementImpl` implement a `PrefixElement`.
+ * Instances of the class {@code PrefixElementImpl} implement a {@code PrefixElement}.
  * @coverage dart.engine.element
  */
 class PrefixElementImpl extends ElementImpl implements PrefixElement {
@@ -4346,7 +4252,7 @@
   }
 }
 /**
- * Instances of the class `PropertyAccessorElementImpl` implement a`PropertyAccessorElement`.
+ * Instances of the class {@code PropertyAccessorElementImpl} implement a{@code PropertyAccessorElement}.
  * @coverage dart.engine.element
  */
 class PropertyAccessorElementImpl extends ExecutableElementImpl implements PropertyAccessorElement {
@@ -4366,9 +4272,9 @@
    * @param name the name of this element
    */
   PropertyAccessorElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_224_impl(name);
+    _jtd_constructor_223_impl(name);
   }
-  _jtd_constructor_224_impl(Identifier name) {
+  _jtd_constructor_223_impl(Identifier name) {
   }
 
   /**
@@ -4377,47 +4283,47 @@
    * @param variable the variable with which this access is associated
    */
   PropertyAccessorElementImpl.con2(PropertyInducingElementImpl variable2) : super.con2(variable2.name, variable2.nameOffset) {
-    _jtd_constructor_225_impl(variable2);
+    _jtd_constructor_224_impl(variable2);
   }
-  _jtd_constructor_225_impl(PropertyInducingElementImpl variable2) {
+  _jtd_constructor_224_impl(PropertyInducingElementImpl variable2) {
     this._variable = variable2;
     synthetic = true;
   }
   accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
-  bool operator ==(Object object) => super == object && identical(isGetter, ((object as PropertyAccessorElement)).isGetter);
+  bool operator ==(Object object) => super == object && identical(isGetter(), ((object as PropertyAccessorElement)).isGetter());
   PropertyAccessorElement get correspondingGetter {
-    if (isGetter || _variable == null) {
+    if (isGetter() || _variable == null) {
       return null;
     }
     return _variable.getter;
   }
   PropertyAccessorElement get correspondingSetter {
-    if (isSetter || _variable == null) {
+    if (isSetter() || _variable == null) {
       return null;
     }
     return _variable.setter;
   }
   ElementKind get kind {
-    if (isGetter) {
+    if (isGetter()) {
       return ElementKind.GETTER;
     }
     return ElementKind.SETTER;
   }
   String get name {
-    if (isSetter) {
+    if (isSetter()) {
       return "${super.name}=";
     }
     return super.name;
   }
   PropertyInducingElement get variable => _variable;
-  bool get isAbstract => hasModifier(Modifier.ABSTRACT);
-  bool get isGetter => hasModifier(Modifier.GETTER);
-  bool get isSetter => hasModifier(Modifier.SETTER);
-  bool get isStatic => hasModifier(Modifier.STATIC);
+  bool isAbstract() => hasModifier(Modifier.ABSTRACT);
+  bool isGetter() => hasModifier(Modifier.GETTER);
+  bool isSetter() => hasModifier(Modifier.SETTER);
+  bool isStatic() => hasModifier(Modifier.STATIC);
 
   /**
    * Set whether this accessor is abstract to correspond to the given value.
-   * @param isAbstract `true` if the accessor is abstract
+   * @param isAbstract {@code true} if the accessor is abstract
    */
   void set abstract(bool isAbstract) {
     setModifier(Modifier.ABSTRACT, isAbstract);
@@ -4425,7 +4331,7 @@
 
   /**
    * Set whether this accessor is a getter to correspond to the given value.
-   * @param isGetter `true` if the accessor is a getter
+   * @param isGetter {@code true} if the accessor is a getter
    */
   void set getter(bool isGetter) {
     setModifier(Modifier.GETTER, isGetter);
@@ -4433,7 +4339,7 @@
 
   /**
    * Set whether this accessor is a setter to correspond to the given value.
-   * @param isSetter `true` if the accessor is a setter
+   * @param isSetter {@code true} if the accessor is a setter
    */
   void set setter(bool isSetter) {
     setModifier(Modifier.SETTER, isSetter);
@@ -4441,7 +4347,7 @@
 
   /**
    * Set whether this accessor is static to correspond to the given value.
-   * @param isStatic `true` if the accessor is static
+   * @param isStatic {@code true} if the accessor is static
    */
   void set static(bool isStatic) {
     setModifier(Modifier.STATIC, isStatic);
@@ -4455,13 +4361,13 @@
     this._variable = variable2;
   }
   void appendTo(JavaStringBuilder builder) {
-    builder.append(isGetter ? "get " : "set ");
+    builder.append(isGetter() ? "get " : "set ");
     builder.append(variable.displayName);
     super.appendTo(builder);
   }
 }
 /**
- * Instances of the class `PropertyInducingElementImpl` implement a`PropertyInducingElement`.
+ * Instances of the class {@code PropertyInducingElementImpl} implement a{@code PropertyInducingElement}.
  * @coverage dart.engine.element
  */
 abstract class PropertyInducingElementImpl extends VariableElementImpl implements PropertyInducingElement {
@@ -4472,7 +4378,7 @@
   PropertyAccessorElement _getter;
 
   /**
-   * The setter associated with this element, or `null` if the element is effectively`final` and therefore does not have a setter associated with it.
+   * The setter associated with this element, or {@code null} if the element is effectively{@code final} and therefore does not have a setter associated with it.
    */
   PropertyAccessorElement _setter;
 
@@ -4486,9 +4392,9 @@
    * @param name the name of this element
    */
   PropertyInducingElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_226_impl(name);
+    _jtd_constructor_225_impl(name);
   }
-  _jtd_constructor_226_impl(Identifier name) {
+  _jtd_constructor_225_impl(Identifier name) {
   }
 
   /**
@@ -4496,9 +4402,9 @@
    * @param name the name of this element
    */
   PropertyInducingElementImpl.con2(String name) : super.con2(name, -1) {
-    _jtd_constructor_227_impl(name);
+    _jtd_constructor_226_impl(name);
   }
-  _jtd_constructor_227_impl(String name) {
+  _jtd_constructor_226_impl(String name) {
     synthetic = true;
   }
   PropertyAccessorElement get getter => _getter;
@@ -4521,7 +4427,7 @@
   }
 }
 /**
- * Instances of the class `ShowElementCombinatorImpl` implement a[ShowElementCombinator].
+ * Instances of the class {@code ShowElementCombinatorImpl} implement a{@link ShowElementCombinator}.
  * @coverage dart.engine.element
  */
 class ShowElementCombinatorImpl implements ShowElementCombinator {
@@ -4555,7 +4461,7 @@
   }
 }
 /**
- * Instances of the class `TopLevelVariableElementImpl` implement a`TopLevelVariableElement`.
+ * Instances of the class {@code TopLevelVariableElementImpl} implement a{@code TopLevelVariableElement}.
  * @coverage dart.engine.element
  */
 class TopLevelVariableElementImpl extends PropertyInducingElementImpl implements TopLevelVariableElement {
@@ -4570,9 +4476,9 @@
    * @param name the name of this element
    */
   TopLevelVariableElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_229_impl(name);
+    _jtd_constructor_228_impl(name);
   }
-  _jtd_constructor_229_impl(Identifier name) {
+  _jtd_constructor_228_impl(Identifier name) {
   }
 
   /**
@@ -4580,16 +4486,16 @@
    * @param name the name of this element
    */
   TopLevelVariableElementImpl.con2(String name) : super.con2(name) {
-    _jtd_constructor_230_impl(name);
+    _jtd_constructor_229_impl(name);
   }
-  _jtd_constructor_230_impl(String name) {
+  _jtd_constructor_229_impl(String name) {
   }
   accept(ElementVisitor visitor) => visitor.visitTopLevelVariableElement(this);
   ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
-  bool get isStatic => true;
+  bool isStatic() => true;
 }
 /**
- * Instances of the class `TypeVariableElementImpl` implement a `TypeVariableElement`.
+ * Instances of the class {@code TypeVariableElementImpl} implement a {@code TypeVariableElement}.
  * @coverage dart.engine.element
  */
 class TypeVariableElementImpl extends ElementImpl implements TypeVariableElement {
@@ -4600,7 +4506,7 @@
   TypeVariableType _type;
 
   /**
-   * The type representing the bound associated with this variable, or `null` if this variable
+   * The type representing the bound associated with this variable, or {@code null} if this variable
    * does not have an explicit bound.
    */
   Type2 _bound;
@@ -4645,7 +4551,7 @@
   }
 }
 /**
- * Instances of the class `VariableElementImpl` implement a `VariableElement`.
+ * Instances of the class {@code VariableElementImpl} implement a {@code VariableElement}.
  * @coverage dart.engine.element
  */
 abstract class VariableElementImpl extends ElementImpl implements VariableElement {
@@ -4656,7 +4562,7 @@
   Type2 _type;
 
   /**
-   * A synthetic function representing this variable's initializer, or `null` if this variable
+   * A synthetic function representing this variable's initializer, or {@code null} if this variable
    * does not have an initializer.
    */
   FunctionElement _initializer;
@@ -4671,9 +4577,9 @@
    * @param name the name of this element
    */
   VariableElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_232_impl(name);
+    _jtd_constructor_231_impl(name);
   }
-  _jtd_constructor_232_impl(Identifier name) {
+  _jtd_constructor_231_impl(Identifier name) {
   }
 
   /**
@@ -4683,26 +4589,26 @@
    * declaration of this element
    */
   VariableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_233_impl(name, nameOffset);
+    _jtd_constructor_232_impl(name, nameOffset);
   }
-  _jtd_constructor_233_impl(String name, int nameOffset) {
+  _jtd_constructor_232_impl(String name, int nameOffset) {
   }
 
   /**
    * Return the result of evaluating this variable's initializer as a compile-time constant
-   * expression, or `null` if this variable is not a 'const' variable or does not have an
+   * expression, or {@code null} if this variable is not a 'const' variable or does not have an
    * initializer.
    * @return the result of evaluating this variable's initializer
    */
   EvaluationResultImpl get evaluationResult => null;
   FunctionElement get initializer => _initializer;
   Type2 get type => _type;
-  bool get isConst => hasModifier(Modifier.CONST);
-  bool get isFinal => hasModifier(Modifier.FINAL);
+  bool isConst() => hasModifier(Modifier.CONST);
+  bool isFinal() => hasModifier(Modifier.FINAL);
 
   /**
    * Set whether this variable is const to correspond to the given value.
-   * @param isConst `true` if the variable is const
+   * @param isConst {@code true} if the variable is const
    */
   void set const3(bool isConst) {
     setModifier(Modifier.CONST, isConst);
@@ -4719,7 +4625,7 @@
 
   /**
    * Set whether this variable is final to correspond to the given value.
-   * @param isFinal `true` if the variable is final
+   * @param isFinal {@code true} if the variable is final
    */
   void set final2(bool isFinal) {
     setModifier(Modifier.FINAL, isFinal);
@@ -4754,7 +4660,7 @@
   }
 }
 /**
- * Instances of the class `ConstructorMember` represent a constructor element defined in a
+ * Instances of the class {@code ConstructorMember} represent a constructor element defined in a
  * parameterized type where the values of the type parameters are known.
  */
 class ConstructorMember extends ExecutableMember implements ConstructorElement {
@@ -4775,7 +4681,7 @@
     }
     FunctionType baseType = baseConstructor.type;
     List<Type2> argumentTypes = definingType.typeArguments;
-    List<Type2> parameterTypes = definingType.element.type.typeArguments;
+    List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(definingType.element.typeVariables);
     FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
     if (baseType == substitutedType) {
       return baseConstructor;
@@ -4794,9 +4700,8 @@
   ConstructorElement get baseElement => super.baseElement as ConstructorElement;
   ClassElement get enclosingElement => baseElement.enclosingElement;
   ConstructorElement get redirectedConstructor => from(baseElement.redirectedConstructor, definingType);
-  bool get isConst => baseElement.isConst;
-  bool get isDefaultConstructor => baseElement.isDefaultConstructor;
-  bool get isFactory => baseElement.isFactory;
+  bool isConst() => baseElement.isConst();
+  bool isFactory() => baseElement.isFactory();
   String toString() {
     ConstructorElement baseElement = this.baseElement;
     List<ParameterElement> parameters = this.parameters;
@@ -4826,7 +4731,7 @@
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
 /**
- * The abstract class `ExecutableMember` defines the behavior common to members that represent
+ * The abstract class {@code ExecutableMember} defines the behavior common to members that represent
  * an executable element defined in a parameterized type where the values of the type parameters are
  * known.
  */
@@ -4860,10 +4765,9 @@
     }
     return parameterizedParameters;
   }
-  Type2 get returnType => substituteFor(baseElement.returnType);
   FunctionType get type => substituteFor(baseElement.type);
-  bool get isOperator => baseElement.isOperator;
-  bool get isStatic => baseElement.isStatic;
+  bool isOperator() => baseElement.isOperator();
+  bool isStatic() => baseElement.isStatic();
   void visitChildren(ElementVisitor<Object> visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(baseElement.functions, visitor);
@@ -4873,7 +4777,7 @@
   }
 }
 /**
- * Instances of the class `FieldMember` represent a field element defined in a parameterized
+ * Instances of the class {@code FieldMember} represent a field element defined in a parameterized
  * type where the values of the type parameters are known.
  */
 class FieldMember extends VariableMember implements FieldElement {
@@ -4897,7 +4801,7 @@
       return baseField;
     }
     List<Type2> argumentTypes = definingType.typeArguments;
-    List<Type2> parameterTypes = definingType.element.type.typeArguments;
+    List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(definingType.element.typeVariables);
     Type2 substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
     if (baseType == substitutedType) {
       return baseField;
@@ -4917,11 +4821,11 @@
   ClassElement get enclosingElement => baseElement.enclosingElement;
   PropertyAccessorElement get getter => PropertyAccessorMember.from(baseElement.getter, definingType);
   PropertyAccessorElement get setter => PropertyAccessorMember.from(baseElement.setter, definingType);
-  bool get isStatic => baseElement.isStatic;
+  bool isStatic() => baseElement.isStatic();
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
 /**
- * The abstract class `Member` defines the behavior common to elements that represent members
+ * The abstract class {@code Member} defines the behavior common to elements that represent members
  * of parameterized types.
  */
 abstract class Member implements Element {
@@ -4963,7 +4867,7 @@
   int get nameOffset => _baseElement.nameOffset;
   Source get source => _baseElement.source;
   bool isAccessibleIn(LibraryElement library) => _baseElement.isAccessibleIn(library);
-  bool get isSynthetic => _baseElement.isSynthetic;
+  bool isSynthetic() => _baseElement.isSynthetic();
   void visitChildren(ElementVisitor<Object> visitor) {
   }
 
@@ -4974,7 +4878,7 @@
   ParameterizedType get definingType => _definingType;
 
   /**
-   * If the given child is not `null`, use the given visitor to visit it.
+   * If the given child is not {@code null}, use the given visitor to visit it.
    * @param child the child to be visited
    * @param visitor the visitor to be used to visit the child
    */
@@ -5025,7 +4929,7 @@
   }
 }
 /**
- * Instances of the class `MethodMember` represent a method element defined in a parameterized
+ * Instances of the class {@code MethodMember} represent a method element defined in a parameterized
  * type where the values of the type parameters are known.
  */
 class MethodMember extends ExecutableMember implements MethodElement {
@@ -5046,7 +4950,7 @@
     }
     FunctionType baseType = baseMethod.type;
     List<Type2> argumentTypes = definingType.typeArguments;
-    List<Type2> parameterTypes = definingType.element.type.typeArguments;
+    List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(definingType.element.typeVariables);
     FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
     if (baseType == substitutedType) {
       return baseMethod;
@@ -5064,7 +4968,7 @@
   accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
   MethodElement get baseElement => super.baseElement as MethodElement;
   ClassElement get enclosingElement => baseElement.enclosingElement;
-  bool get isAbstract => baseElement.isAbstract;
+  bool isAbstract() => baseElement.isAbstract();
   String toString() {
     MethodElement baseElement = this.baseElement;
     List<ParameterElement> parameters = this.parameters;
@@ -5090,7 +4994,7 @@
   }
 }
 /**
- * Instances of the class `ParameterMember` represent a parameter element defined in a
+ * Instances of the class {@code ParameterMember} represent a parameter element defined in a
  * parameterized type where the values of the type parameters are known.
  */
 class ParameterMember extends VariableMember implements ParameterElement {
@@ -5159,7 +5063,7 @@
     return parameterizedParameters;
   }
   SourceRange get visibleRange => baseElement.visibleRange;
-  bool get isInitializingFormal => baseElement.isInitializingFormal;
+  bool isInitializingFormal() => baseElement.isInitializingFormal();
   String toString() {
     ParameterElement baseElement = this.baseElement;
     String left = "";
@@ -5188,7 +5092,7 @@
   }
 }
 /**
- * Instances of the class `PropertyAccessorMember` represent a property accessor element
+ * Instances of the class {@code PropertyAccessorMember} represent a property accessor element
  * defined in a parameterized type where the values of the type parameters are known.
  */
 class PropertyAccessorMember extends ExecutableMember implements PropertyAccessorElement {
@@ -5209,7 +5113,7 @@
     }
     FunctionType baseType = baseAccessor.type;
     List<Type2> argumentTypes = definingType.typeArguments;
-    List<Type2> parameterTypes = definingType.element.type.typeArguments;
+    List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(definingType.element.typeVariables);
     FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
     if (baseType == substitutedType) {
       return baseAccessor;
@@ -5237,13 +5141,13 @@
     }
     return variable;
   }
-  bool get isAbstract => baseElement.isAbstract;
-  bool get isGetter => baseElement.isGetter;
-  bool get isSetter => baseElement.isSetter;
+  bool isAbstract() => baseElement.isAbstract();
+  bool isGetter() => baseElement.isGetter();
+  bool isSetter() => baseElement.isSetter();
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
 /**
- * The abstract class `VariableMember` defines the behavior common to members that represent a
+ * The abstract class {@code VariableMember} defines the behavior common to members that represent a
  * variable element defined in a parameterized type where the values of the type parameters are
  * known.
  */
@@ -5262,15 +5166,38 @@
     throw new UnsupportedOperationException();
   }
   Type2 get type => substituteFor(baseElement.type);
-  bool get isConst => baseElement.isConst;
-  bool get isFinal => baseElement.isFinal;
+  bool isConst() => baseElement.isConst();
+  bool isFinal() => baseElement.isFinal();
   void visitChildren(ElementVisitor<Object> visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(baseElement.initializer, visitor);
   }
 }
 /**
- * The unique instance of the class `BottomTypeImpl` implements the type `bottom`.
+ * Instances of the class {@code AnonymousFunctionTypeImpl} extend the behavior of{@link FunctionTypeImpl} to support anonymous function types created for function typed
+ * parameters.
+ * @coverage dart.engine.type
+ */
+class AnonymousFunctionTypeImpl extends FunctionTypeImpl {
+
+  /**
+   * An array of parameters elements of this type of function.
+   */
+  List<ParameterElement> _baseParameters = ParameterElementImpl.EMPTY_ARRAY;
+  AnonymousFunctionTypeImpl() : super.con2((null as FunctionTypeAliasElement)) {
+  }
+
+  /**
+   * Sets the parameters elements of this type of function.
+   * @param parameters the parameters elements of this type of function
+   */
+  void set baseParameters(List<ParameterElement> parameters) {
+    this._baseParameters = parameters;
+  }
+  List<ParameterElement> get baseParameters => _baseParameters;
+}
+/**
+ * The unique instance of the class {@code BottomTypeImpl} implements the type {@code bottom}.
  * @coverage dart.engine.type
  */
 class BottomTypeImpl extends TypeImpl {
@@ -5298,7 +5225,7 @@
   BottomTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
 }
 /**
- * The unique instance of the class `DynamicTypeImpl` implements the type `dynamic`.
+ * The unique instance of the class {@code DynamicTypeImpl} implements the type {@code dynamic}.
  * @coverage dart.engine.type
  */
 class DynamicTypeImpl extends TypeImpl {
@@ -5321,26 +5248,26 @@
     ((element as DynamicElementImpl)).type = this;
   }
   bool operator ==(Object object) => object is DynamicTypeImpl;
-  bool get isDynamic => true;
+  bool isDynamic() => true;
   bool isMoreSpecificThan(Type2 type) => false;
   bool isSubtypeOf(Type2 type) => identical(this, type);
   bool isSupertypeOf(Type2 type) => true;
   DynamicTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
 }
 /**
- * Instances of the class `FunctionTypeImpl` defines the behavior common to objects
+ * Instances of the class {@code FunctionTypeImpl} defines the behavior common to objects
  * representing the type of a function, method, constructor, getter, or setter.
  * @coverage dart.engine.type
  */
 class FunctionTypeImpl extends TypeImpl implements FunctionType {
 
   /**
-   * Return `true` if all of the name/type pairs in the first map are equal to the
+   * Return {@code true} if all of the name/type pairs in the first map are equal to the
    * corresponding name/type pairs in the second map. The maps are expected to iterate over their
    * entries in the same order in which those entries were added to the map.
    * @param firstTypes the first map of name/type pairs being compared
    * @param secondTypes the second map of name/type pairs being compared
-   * @return `true` if all of the name/type pairs in the first map are equal to the
+   * @return {@code true} if all of the name/type pairs in the first map are equal to the
    * corresponding name/type pairs in the second map
    */
   static bool equals2(Map<String, Type2> firstTypes, Map<String, Type2> secondTypes) {
@@ -5404,6 +5331,11 @@
   Map<String, Type2> _namedParameterTypes = new Map();
 
   /**
+   * The type of object returned by this type of function.
+   */
+  Type2 _returnType = VoidTypeImpl.instance;
+
+  /**
    * Initialize a newly created function type to be declared by the given element and to have the
    * given name.
    * @param element the element representing the declaration of the function type
@@ -5429,12 +5361,11 @@
       return false;
     }
     FunctionTypeImpl otherType = object as FunctionTypeImpl;
-    return element == otherType.element && JavaArrays.equals(_normalParameterTypes, otherType._normalParameterTypes) && JavaArrays.equals(_optionalParameterTypes, otherType._optionalParameterTypes) && equals2(_namedParameterTypes, otherType._namedParameterTypes) && returnType == otherType.returnType;
+    return element == otherType.element && JavaArrays.equals(_normalParameterTypes, otherType._normalParameterTypes) && JavaArrays.equals(_optionalParameterTypes, otherType._optionalParameterTypes) && equals2(_namedParameterTypes, otherType._namedParameterTypes) && _returnType == otherType._returnType;
   }
   String get displayName {
     String name = this.name;
     if (name == null) {
-      Type2 returnType = this.returnType;
       JavaStringBuilder builder = new JavaStringBuilder();
       builder.append("(");
       bool needsComma = false;
@@ -5485,10 +5416,10 @@
         needsComma = true;
       }
       builder.append(") -> ");
-      if (returnType == null) {
+      if (_returnType == null) {
         builder.append("null");
       } else {
-        builder.append(returnType.displayName);
+        builder.append(_returnType.displayName);
       }
       name = builder.toString();
     }
@@ -5509,20 +5440,13 @@
     }
     return specializedParameters;
   }
-  Type2 get returnType {
-    Type2 baseReturnType = this.baseReturnType;
-    return baseReturnType.substitute2(_typeArguments, TypeVariableTypeImpl.getTypes(typeVariables));
-  }
+  Type2 get returnType => _returnType;
   List<Type2> get typeArguments => _typeArguments;
   List<TypeVariableElement> get typeVariables {
     Element element = this.element;
     if (element is FunctionTypeAliasElement) {
       return ((element as FunctionTypeAliasElement)).typeVariables;
     }
-    ClassElement definingClass = element.getAncestor(ClassElement);
-    if (definingClass != null) {
-      return definingClass.typeVariables;
-    }
     return TypeVariableElementImpl.EMPTY_ARRAY;
   }
   int get hashCode {
@@ -5535,7 +5459,7 @@
   bool isSubtypeOf(Type2 type) {
     if (type == null) {
       return false;
-    } else if (identical(this, type) || type.isDynamic || type.isDartCoreFunction || type.isObject) {
+    } else if (identical(this, type) || type.isDynamic() || type.isDartCoreFunction() || type.isObject()) {
       return true;
     } else if (type is! FunctionType) {
       return false;
@@ -5637,6 +5561,14 @@
   }
 
   /**
+   * Set the type of object returned by this type of function to the given type.
+   * @param returnType the type of object returned by this type of function
+   */
+  void set returnType(Type2 returnType2) {
+    this._returnType = returnType2;
+  }
+
+  /**
    * Set the actual types of the type arguments to the given types.
    * @param typeArguments the actual types of the type arguments
    */
@@ -5653,14 +5585,14 @@
     }
     Element element = this.element;
     FunctionTypeImpl newType = (element is ExecutableElement) ? new FunctionTypeImpl.con1((element as ExecutableElement)) : new FunctionTypeImpl.con2((element as FunctionTypeAliasElement));
+    newType.returnType = _returnType.substitute2(argumentTypes, parameterTypes);
     newType.normalParameterTypes = TypeImpl.substitute(_normalParameterTypes, argumentTypes, parameterTypes);
     newType.optionalParameterTypes = TypeImpl.substitute(_optionalParameterTypes, argumentTypes, parameterTypes);
     newType._namedParameterTypes = substitute3(_namedParameterTypes, argumentTypes, parameterTypes);
-    newType.typeArguments = TypeImpl.substitute(_typeArguments, argumentTypes, parameterTypes);
+    newType.typeArguments = argumentTypes;
     return newType;
   }
   void appendTo(JavaStringBuilder builder) {
-    Type2 returnType = this.returnType;
     builder.append("(");
     bool needsComma = false;
     if (_normalParameterTypes.length > 0) {
@@ -5710,15 +5642,15 @@
       needsComma = true;
     }
     builder.append(") -> ");
-    if (returnType == null) {
+    if (_returnType == null) {
       builder.append("null");
     } else {
-      ((returnType as TypeImpl)).appendTo(builder);
+      ((_returnType as TypeImpl)).appendTo(builder);
     }
   }
 
   /**
-   * @return the base parameter elements of this function element, not `null`.
+   * @return the base parameter elements of this function element, not {@code null}.
    */
   List<ParameterElement> get baseParameters {
     Element element = this.element;
@@ -5728,22 +5660,9 @@
       return ((element as FunctionTypeAliasElement)).parameters;
     }
   }
-
-  /**
-   * Return the return type defined by this function's element.
-   * @return the return type defined by this function's element
-   */
-  Type2 get baseReturnType {
-    Element element = this.element;
-    if (element is ExecutableElement) {
-      return ((element as ExecutableElement)).returnType;
-    } else {
-      return ((element as FunctionTypeAliasElement)).returnType;
-    }
-  }
 }
 /**
- * Instances of the class `InterfaceTypeImpl` defines the behavior common to objects
+ * Instances of the class {@code InterfaceTypeImpl} defines the behavior common to objects
  * representing the type introduced by either a class or an interface, or a reference to such a
  * type.
  * @coverage dart.engine.type
@@ -5756,25 +5675,25 @@
   static List<InterfaceType> EMPTY_ARRAY = new List<InterfaceType>(0);
 
   /**
-   * This method computes the longest inheritance path from some passed [Type] to Object.
-   * @param type the [Type] to compute the longest inheritance path of from the passed[Type] to Object
+   * This method computes the longest inheritance path from some passed {@link Type} to Object.
+   * @param type the {@link Type} to compute the longest inheritance path of from the passed{@link Type} to Object
    * @return the computed longest inheritance path to Object
    * @see InterfaceType#getLeastUpperBound(Type)
    */
   static int computeLongestInheritancePathToObject(InterfaceType type) => computeLongestInheritancePathToObject2(type, 0, new Set<ClassElement>());
 
   /**
-   * Returns the set of all superinterfaces of the passed [Type].
-   * @param type the [Type] to compute the set of superinterfaces of
-   * @return the [Set] of superinterfaces of the passed [Type]
+   * Returns the set of all superinterfaces of the passed {@link Type}.
+   * @param type the {@link Type} to compute the set of superinterfaces of
+   * @return the {@link Set} of superinterfaces of the passed {@link Type}
    * @see #getLeastUpperBound(Type)
    */
   static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => computeSuperinterfaceSet2(type, new Set<InterfaceType>());
 
   /**
-   * This method computes the longest inheritance path from some passed [Type] to Object. This
-   * method calls itself recursively, callers should use the public method[computeLongestInheritancePathToObject].
-   * @param type the [Type] to compute the longest inheritance path of from the passed[Type] to Object
+   * This method computes the longest inheritance path from some passed {@link Type} to Object. This
+   * method calls itself recursively, callers should use the public method{@link #computeLongestInheritancePathToObject(Type)}.
+   * @param type the {@link Type} to compute the longest inheritance path of from the passed{@link Type} to Object
    * @param depth a field used recursively
    * @param visitedClasses the classes that have already been visited
    * @return the computed longest inheritance path to Object
@@ -5811,11 +5730,11 @@
   }
 
   /**
-   * Returns the set of all superinterfaces of the passed [Type]. This is a recursive method,
-   * callers should call the public [computeSuperinterfaceSet].
-   * @param type the [Type] to compute the set of superinterfaces of
-   * @param set a [HashSet] used recursively by this method
-   * @return the [Set] of superinterfaces of the passed [Type]
+   * Returns the set of all superinterfaces of the passed {@link Type}. This is a recursive method,
+   * callers should call the public {@link #computeSuperinterfaceSet(Type)}.
+   * @param type the {@link Type} to compute the set of superinterfaces of
+   * @param set a {@link HashSet} used recursively by this method
+   * @return the {@link Set} of superinterfaces of the passed {@link Type}
    * @see #computeSuperinterfaceSet(Type)
    * @see #getLeastUpperBound(Type)
    */
@@ -5929,28 +5848,19 @@
     InterfaceTypeImpl otherType = object as InterfaceTypeImpl;
     return element == otherType.element && JavaArrays.equals(_typeArguments, otherType._typeArguments);
   }
-  List<PropertyAccessorElement> get accessors {
-    List<PropertyAccessorElement> accessors = element.accessors;
-    List<PropertyAccessorElement> members = new List<PropertyAccessorElement>(accessors.length);
-    for (int i = 0; i < accessors.length; i++) {
-      members[i] = PropertyAccessorMember.from(accessors[i], this);
-    }
-    return members;
-  }
   ClassElement get element => super.element as ClassElement;
   PropertyAccessorElement getGetter(String getterName) => PropertyAccessorMember.from(((element as ClassElementImpl)).getGetter(getterName), this);
   List<InterfaceType> get interfaces {
     ClassElement classElement = element;
     List<InterfaceType> interfaces = classElement.interfaces;
     List<TypeVariableElement> typeVariables = classElement.typeVariables;
-    List<Type2> parameterTypes = classElement.type.typeArguments;
     if (typeVariables.length == 0) {
       return interfaces;
     }
     int count = interfaces.length;
     List<InterfaceType> typedInterfaces = new List<InterfaceType>(count);
     for (int i = 0; i < count; i++) {
-      typedInterfaces[i] = interfaces[i].substitute2(_typeArguments, parameterTypes);
+      typedInterfaces[i] = interfaces[i].substitute2(_typeArguments, TypeVariableTypeImpl.getTypes(typeVariables));
     }
     return typedInterfaces;
   }
@@ -5996,26 +5906,17 @@
     return null;
   }
   MethodElement getMethod(String methodName) => MethodMember.from(((element as ClassElementImpl)).getMethod(methodName), this);
-  List<MethodElement> get methods {
-    List<MethodElement> methods = element.methods;
-    List<MethodElement> members = new List<MethodElement>(methods.length);
-    for (int i = 0; i < methods.length; i++) {
-      members[i] = MethodMember.from(methods[i], this);
-    }
-    return members;
-  }
   List<InterfaceType> get mixins {
     ClassElement classElement = element;
     List<InterfaceType> mixins = classElement.mixins;
     List<TypeVariableElement> typeVariables = classElement.typeVariables;
-    List<Type2> parameterTypes = classElement.type.typeArguments;
     if (typeVariables.length == 0) {
       return mixins;
     }
     int count = mixins.length;
     List<InterfaceType> typedMixins = new List<InterfaceType>(count);
     for (int i = 0; i < count; i++) {
-      typedMixins[i] = mixins[i].substitute2(_typeArguments, parameterTypes);
+      typedMixins[i] = mixins[i].substitute2(_typeArguments, TypeVariableTypeImpl.getTypes(typeVariables));
     }
     return typedMixins;
   }
@@ -6026,7 +5927,7 @@
     if (supertype == null) {
       return null;
     }
-    return supertype.substitute2(_typeArguments, classElement.type.typeArguments);
+    return supertype.substitute2(_typeArguments, TypeVariableTypeImpl.getTypes(classElement.typeVariables));
   }
   List<Type2> get typeArguments => _typeArguments;
   List<TypeVariableElement> get typeVariables => element.typeVariables;
@@ -6037,12 +5938,12 @@
     }
     return element.hashCode;
   }
-  bool get isDartCoreFunction {
+  bool isDartCoreFunction() {
     ClassElement element = this.element;
     if (element == null) {
       return false;
     }
-    return element.name == "Function" && element.library.isDartCore;
+    return element.name == "Function" && element.library.isDartCore();
   }
   bool isDirectSupertypeOf(InterfaceType type) {
     ClassElement i = element;
@@ -6075,7 +5976,7 @@
     }
     return isMoreSpecificThan2((type as InterfaceType), new Set<ClassElement>());
   }
-  bool get isObject => element.supertype == null;
+  bool isObject() => element.supertype == null;
   bool isSubtypeOf(Type2 type2) {
     if (identical(type2, DynamicTypeImpl.instance)) {
       return true;
@@ -6286,15 +6187,15 @@
     }
     return false;
   }
-  bool isSubtypeOf2(InterfaceType type2, Set<ClassElement> visitedClasses) {
+  bool isSubtypeOf2(InterfaceType type, Set<ClassElement> visitedClasses) {
     InterfaceType typeT = this;
-    InterfaceType typeS = type2;
+    InterfaceType typeS = type;
     ClassElement elementT = element;
     if (elementT == null || visitedClasses.contains(elementT)) {
       return false;
     }
     javaSetAdd(visitedClasses, elementT);
-    typeT = substitute2(_typeArguments, elementT.type.typeArguments);
+    typeT = substitute2(_typeArguments, TypeVariableTypeImpl.getTypes(elementT.typeVariables));
     if (typeT == typeS) {
       return true;
     } else if (elementT == typeS.element) {
@@ -6309,7 +6210,7 @@
         }
       }
       return true;
-    } else if (typeS.isDartCoreFunction && elementT.getMethod("call") != null) {
+    } else if (typeS.isDartCoreFunction() && elementT.getMethod("call") != null) {
       return true;
     }
     InterfaceType supertype = elementT.supertype;
@@ -6332,7 +6233,7 @@
   }
 }
 /**
- * The abstract class `TypeImpl` implements the behavior common to objects representing the
+ * The abstract class {@code TypeImpl} implements the behavior common to objects representing the
  * declared type of elements in the element model.
  * @coverage dart.engine.type
  */
@@ -6359,13 +6260,13 @@
   }
 
   /**
-   * The element representing the declaration of this type, or `null` if the type has not, or
+   * The element representing the declaration of this type, or {@code null} if the type has not, or
    * cannot, be associated with an element.
    */
   Element _element;
 
   /**
-   * The name of this type, or `null` if the type does not have a name.
+   * The name of this type, or {@code null} if the type does not have a name.
    */
   String _name;
 
@@ -6388,12 +6289,12 @@
   Type2 getLeastUpperBound(Type2 type) => null;
   String get name => _name;
   bool isAssignableTo(Type2 type) => this.isSubtypeOf(type) || type.isSubtypeOf(this);
-  bool get isDartCoreFunction => false;
-  bool get isDynamic => false;
+  bool isDartCoreFunction() => false;
+  bool isDynamic() => false;
   bool isMoreSpecificThan(Type2 type) => false;
-  bool get isObject => false;
+  bool isObject() => false;
   bool isSupertypeOf(Type2 type) => type.isSubtypeOf(this);
-  bool get isVoid => false;
+  bool isVoid() => false;
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     appendTo(builder);
@@ -6413,18 +6314,13 @@
   }
 }
 /**
- * Instances of the class `TypeVariableTypeImpl` defines the behavior of objects representing
+ * Instances of the class {@code TypeVariableTypeImpl} defines the behavior of objects representing
  * the type introduced by a type variable.
  * @coverage dart.engine.type
  */
 class TypeVariableTypeImpl extends TypeImpl implements TypeVariableType {
 
   /**
-   * An empty array of type variable types.
-   */
-  static List<TypeVariableType> EMPTY_ARRAY = new List<TypeVariableType>(0);
-
-  /**
    * Return an array containing the type variable types defined by the given array of type variable
    * elements.
    * @param typeVariables the type variable elements defining the type variable types to be returned
@@ -6432,9 +6328,6 @@
    */
   static List<TypeVariableType> getTypes(List<TypeVariableElement> typeVariables) {
     int count = typeVariables.length;
-    if (count == 0) {
-      return EMPTY_ARRAY;
-    }
     List<TypeVariableType> types = new List<TypeVariableType>(count);
     for (int i = 0; i < count; i++) {
       types[i] = typeVariables[i].type;
@@ -6468,7 +6361,7 @@
   }
 }
 /**
- * The unique instance of the class `VoidTypeImpl` implements the type `void`.
+ * The unique instance of the class {@code VoidTypeImpl} implements the type {@code void}.
  * @coverage dart.engine.type
  */
 class VoidTypeImpl extends TypeImpl implements VoidType {
@@ -6491,20 +6384,20 @@
   }
   bool operator ==(Object object) => identical(object, this);
   bool isSubtypeOf(Type2 type) => identical(type, this) || identical(type, DynamicTypeImpl.instance);
-  bool get isVoid => true;
+  bool isVoid() => true;
   VoidTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
 }
 /**
- * The interface `FunctionType` defines the behavior common to objects representing the type
+ * The interface {@code FunctionType} defines the behavior common to objects representing the type
  * of a function, method, constructor, getter, or setter. Function types come in three variations:
  * <ol>
- * * The types of functions that only have required parameters. These have the general form
- * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i>.
- * * The types of functions with optional positional parameters. These have the general form
+ * <li>The types of functions that only have required parameters. These have the general form
+ * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i>.</li>
+ * <li>The types of functions with optional positional parameters. These have the general form
  * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, \[T<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>\]) &rarr;
- * T</i>.
- * * The types of functions with named parameters. These have the general form <i>(T<sub>1</sub>,
- * &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;, T<sub>xk</sub> xk}) &rarr; T</i>.
+ * T</i>.</li>
+ * <li>The types of functions with named parameters. These have the general form <i>(T<sub>1</sub>,
+ * &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;, T<sub>xk</sub> xk}) &rarr; T</i>.</li>
  * </ol>
  * @coverage dart.engine.type
  */
@@ -6549,53 +6442,53 @@
   Type2 get returnType;
 
   /**
-   * Return `true` if this type is a subtype of the given type.
-   *
+   * Return {@code true} if this type is a subtype of the given type.
+   * <p>
    * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i> is a subtype of the
    * function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>) &rarr; S</i>, if all of the following
    * conditions are met:
-   *
-   * * Either
-   *
-   * * <i>S</i> is void, or
-   * * <i>T &hArr; S</i>.
-   *
-   *
-   * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr; S<sub>i</sub></i>.
-   *
+   * <ul>
+   * <li>Either
+   * <ul>
+   * <li><i>S</i> is void, or</li>
+   * <li><i>T &hArr; S</i>.</li>
+   * </ul>
+   * </li>
+   * <li>For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr; S<sub>i</sub></i>.</li>
+   * </ul>
    * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, \[T<sub>n+1</sub>, &hellip;,
    * T<sub>n+k</sub>\]) &rarr; T</i> is a subtype of the function type <i>(S<sub>1</sub>, &hellip;,
    * S<sub>n</sub>, \[S<sub>n+1</sub>, &hellip;, S<sub>n+m</sub>\]) &rarr; S</i>, if all of the
    * following conditions are met:
-   *
-   * * Either
-   *
-   * * <i>S</i> is void, or
-   * * <i>T &hArr; S</i>.
-   *
-   *
-   * * <i>k</i> >= <i>m</i> and for all <i>i</i>, 1 <= <i>i</i> <= <i>n+m</i>, <i>T<sub>i</sub>
-   * &hArr; S<sub>i</sub></i>.
-   *
+   * <ul>
+   * <li>Either
+   * <ul>
+   * <li><i>S</i> is void, or</li>
+   * <li><i>T &hArr; S</i>.</li>
+   * </ul>
+   * </li>
+   * <li><i>k</i> >= <i>m</i> and for all <i>i</i>, 1 <= <i>i</i> <= <i>n+m</i>, <i>T<sub>i</sub>
+   * &hArr; S<sub>i</sub></i>.</li>
+   * </ul>
    * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;,
    * T<sub>xk</sub> xk}) &rarr; T</i> is a subtype of the function type <i>(S<sub>1</sub>, &hellip;,
    * S<sub>n</sub>, {S<sub>y1</sub> y1, &hellip;, S<sub>ym</sub> ym}) &rarr; S</i>, if all of the
    * following conditions are met:
-   *
-   * * Either
-   *
-   * * <i>S</i> is void,
-   * * or <i>T &hArr; S</i>.
-   *
-   *
-   * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr; S<sub>i</sub></i>.
-   * * <i>k</i> >= <i>m</i> and <i>y<sub>i</sub></i> in <i>{x<sub>1</sub>, &hellip;,
-   * x<sub>k</sub>}</i>, 1 <= <i>i</i> <= <i>m</i>.
-   * * For all <i>y<sub>i</sub></i> in <i>{y<sub>1</sub>, &hellip;, y<sub>m</sub>}</i>,
-   * <i>y<sub>i</sub> = x<sub>j</sub> => Tj &hArr; Si</i>.
-   *
+   * <ul>
+   * <li>Either
+   * <ul>
+   * <li><i>S</i> is void,</li>
+   * <li>or <i>T &hArr; S</i>.</li>
+   * </ul>
+   * </li>
+   * <li>For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr; S<sub>i</sub></i>.</li>
+   * <li><i>k</i> >= <i>m</i> and <i>y<sub>i</sub></i> in <i>{x<sub>1</sub>, &hellip;,
+   * x<sub>k</sub>}</i>, 1 <= <i>i</i> <= <i>m</i>.</li>
+   * <li>For all <i>y<sub>i</sub></i> in <i>{y<sub>1</sub>, &hellip;, y<sub>m</sub>}</i>,
+   * <i>y<sub>i</sub> = x<sub>j</sub> => Tj &hArr; Si</i>.</li>
+   * </ul>
    * In addition, the following subtype rules apply:
-   *
+   * <p>
    * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, \[\]) &rarr; T <: (T<sub>1</sub>, &hellip;,
    * T<sub>n</sub>) &rarr; T.</i><br>
    * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>, &hellip;,
@@ -6604,18 +6497,18 @@
    * T<sub>n</sub>) &rarr; T.</i><br>
    * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>, &hellip;,
    * T<sub>n</sub>, \[\]) &rarr; T.</i>
-   *
-   * All functions implement the class `Function`. However not all function types are a
-   * subtype of `Function`. If an interface type <i>I</i> includes a method named`call()`, and the type of `call()` is the function type <i>F</i>, then <i>I</i> is
+   * <p>
+   * All functions implement the class {@code Function}. However not all function types are a
+   * subtype of {@code Function}. If an interface type <i>I</i> includes a method named{@code call()}, and the type of {@code call()} is the function type <i>F</i>, then <i>I</i> is
    * considered to be a subtype of <i>F</i>.
    * @param type the type being compared with this type
-   * @return `true` if this type is a subtype of the given type
+   * @return {@code true} if this type is a subtype of the given type
    */
   bool isSubtypeOf(Type2 type);
 
   /**
    * Return the type resulting from substituting the given arguments for this type's parameters.
-   * This is fully equivalent to `substitute(argumentTypes, getTypeArguments())`.
+   * This is fully equivalent to {@code substitute(argumentTypes, getTypeArguments())}.
    * @param argumentTypes the actual type arguments being substituted for the type parameters
    * @return the result of performing the substitution
    */
@@ -6623,22 +6516,16 @@
   FunctionType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
 }
 /**
- * The interface `InterfaceType` defines the behavior common to objects representing the type
+ * The interface {@code InterfaceType} defines the behavior common to objects representing the type
  * introduced by either a class or an interface, or a reference to such a type.
  * @coverage dart.engine.type
  */
 abstract class InterfaceType implements ParameterizedType {
-
-  /**
-   * Return an array containing all of the accessors (getters and setters) declared in this type.
-   * @return the accessors declared in this type
-   */
-  List<PropertyAccessorElement> get accessors;
   ClassElement get element;
 
   /**
    * Return the element representing the getter with the given name that is declared in this class,
-   * or `null` if this class does not declare a getter with the given name.
+   * or {@code null} if this class does not declare a getter with the given name.
    * @param getterName the name of the getter to be returned
    * @return the getter declared in this class with the given name
    */
@@ -6653,9 +6540,9 @@
   List<InterfaceType> get interfaces;
 
   /**
-   * Return the least upper bound of this type and the given type, or `null` if there is no
+   * Return the least upper bound of this type and the given type, or {@code null} if there is no
    * least upper bound.
-   *
+   * <p>
    * Given two interfaces <i>I</i> and <i>J</i>, let <i>S<sub>I</sub></i> be the set of
    * superinterfaces of <i>I<i>, let <i>S<sub>J</sub></i> be the set of superinterfaces of <i>J</i>
    * and let <i>S = (I &cup; S<sub>I</sub>) &cap; (J &cup; S<sub>J</sub>)</i>. Furthermore, we
@@ -6671,19 +6558,13 @@
 
   /**
    * Return the element representing the method with the given name that is declared in this class,
-   * or `null` if this class does not declare a method with the given name.
+   * or {@code null} if this class does not declare a method with the given name.
    * @param methodName the name of the method to be returned
    * @return the method declared in this class with the given name
    */
   MethodElement getMethod(String methodName);
 
   /**
-   * Return an array containing all of the methods declared in this type.
-   * @return the methods declared in this type
-   */
-  List<MethodElement> get methods;
-
-  /**
    * Return an array containing all of the mixins that are applied to the class being extended in
    * order to derive the superclass of this class. Note that this is <b>not</b>, in general,
    * equivalent to getting the mixins from this type's element because the types returned by this
@@ -6694,7 +6575,7 @@
 
   /**
    * Return the element representing the setter with the given name that is declared in this class,
-   * or `null` if this class does not declare a setter with the given name.
+   * or {@code null} if this class does not declare a setter with the given name.
    * @param setterName the name of the setter to be returned
    * @return the setter declared in this class with the given name
    */
@@ -6710,55 +6591,55 @@
   InterfaceType get superclass;
 
   /**
-   * Return `true` if this type is a direct supertype of the given type. The implicit
+   * Return {@code true} if this type is a direct supertype of the given type. The implicit
    * interface of class <i>I</i> is a direct supertype of the implicit interface of class <i>J</i>
    * iff:
-   *
-   * * <i>I</i> is Object, and <i>J</i> has no extends clause.
-   * * <i>I</i> is listed in the extends clause of <i>J</i>.
-   * * <i>I</i> is listed in the implements clause of <i>J</i>.
-   * * <i>I</i> is listed in the with clause of <i>J</i>.
-   * * <i>J</i> is a mixin application of the mixin of <i>I</i>.
-   *
+   * <ul>
+   * <li><i>I</i> is Object, and <i>J</i> has no extends clause.</li>
+   * <li><i>I</i> is listed in the extends clause of <i>J</i>.</li>
+   * <li><i>I</i> is listed in the implements clause of <i>J</i>.</li>
+   * <li><i>I</i> is listed in the with clause of <i>J</i>.</li>
+   * <li><i>J</i> is a mixin application of the mixin of <i>I</i>.</li>
+   * </ul>
    * @param type the type being compared with this type
-   * @return `true` if this type is a direct supertype of the given type
+   * @return {@code true} if this type is a direct supertype of the given type
    */
   bool isDirectSupertypeOf(InterfaceType type);
 
   /**
-   * Return `true` if this type is more specific than the given type. An interface type
+   * Return {@code true} if this type is more specific than the given type. An interface type
    * <i>T</i> is more specific than an interface type <i>S</i>, written <i>T &laquo; S</i>, if one
    * of the following conditions is met:
-   *
-   * * Reflexivity: <i>T</i> is <i>S</i>.
-   * * <i>T</i> is bottom.
-   * * <i>S</i> is dynamic.
-   * * Direct supertype: <i>S</i> is a direct supertype of <i>T</i>.
-   * * <i>T</i> is a type variable and <i>S</i> is the upper bound of <i>T</i>.
-   * * Covariance: <i>T</i> is of the form <i>I&lt;T<sub>1</sub>, &hellip;, T<sub>n</sub>&gt;</i>
+   * <ul>
+   * <li>Reflexivity: <i>T</i> is <i>S</i>.
+   * <li><i>T</i> is bottom.
+   * <li><i>S</i> is dynamic.
+   * <li>Direct supertype: <i>S</i> is a direct supertype of <i>T</i>.
+   * <li><i>T</i> is a type variable and <i>S</i> is the upper bound of <i>T</i>.
+   * <li>Covariance: <i>T</i> is of the form <i>I&lt;T<sub>1</sub>, &hellip;, T<sub>n</sub>&gt;</i>
    * and S</i> is of the form <i>I&lt;S<sub>1</sub>, &hellip;, S<sub>n</sub>&gt;</i> and
    * <i>T<sub>i</sub> &laquo; S<sub>i</sub></i>, <i>1 <= i <= n</i>.
-   * * Transitivity: <i>T &laquo; U</i> and <i>U &laquo; S</i>.
-   *
+   * <li>Transitivity: <i>T &laquo; U</i> and <i>U &laquo; S</i>.
+   * </ul>
    * @param type the type being compared with this type
-   * @return `true` if this type is more specific than the given type
+   * @return {@code true} if this type is more specific than the given type
    */
   bool isMoreSpecificThan(Type2 type);
 
   /**
-   * Return `true` if this type is a subtype of the given type. An interface type <i>T</i> is
+   * Return {@code true} if this type is a subtype of the given type. An interface type <i>T</i> is
    * a subtype of an interface type <i>S</i>, written <i>T</i> <: <i>S</i>, iff
    * <i>\[bottom/dynamic\]T</i> &laquo; <i>S</i> (<i>T</i> is more specific than <i>S</i>). If an
    * interface type <i>I</i> includes a method named <i>call()</i>, and the type of <i>call()</i> is
    * the function type <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>.
    * @param type the type being compared with this type
-   * @return `true` if this type is a subtype of the given type
+   * @return {@code true} if this type is a subtype of the given type
    */
   bool isSubtypeOf(Type2 type);
 
   /**
    * Return the element representing the constructor that results from looking up the given
-   * constructor in this class with respect to the given library, or `null` if the look up
+   * constructor in this class with respect to the given library, or {@code null} if the look up
    * fails. The behavior of this method is defined by the Dart Language Specification in section
    * 12.11.1: <blockquote>If <i>e</i> is of the form <b>new</b> <i>T.id()</i> then let <i>q<i> be
    * the constructor <i>T.id</i>, otherwise let <i>q<i> be the constructor <i>T<i>. Otherwise, if
@@ -6772,17 +6653,17 @@
 
   /**
    * Return the element representing the getter that results from looking up the given getter in
-   * this class with respect to the given library, or `null` if the look up fails. The
+   * this class with respect to the given library, or {@code null} if the look up fails. The
    * behavior of this method is defined by the Dart Language Specification in section 12.15.1:
    * <blockquote>The result of looking up getter (respectively setter) <i>m</i> in class <i>C</i>
    * with respect to library <i>L</i> is:
-   *
-   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * <ul>
+   * <li>If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
    * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
    * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
    * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
-   * Otherwise, we say that the lookup has failed.
-   *
+   * Otherwise, we say that the lookup has failed.</li>
+   * </ul>
    * </blockquote>
    * @param getterName the name of the getter being looked up
    * @param library the library with respect to which the lookup is being performed
@@ -6793,17 +6674,17 @@
 
   /**
    * Return the element representing the getter that results from looking up the given getter in the
-   * superclass of this class with respect to the given library, or `null` if the look up
+   * superclass of this class with respect to the given library, or {@code null} if the look up
    * fails. The behavior of this method is defined by the Dart Language Specification in section
    * 12.15.1: <blockquote>The result of looking up getter (respectively setter) <i>m</i> in class
    * <i>C</i> with respect to library <i>L</i> is:
-   *
-   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * <ul>
+   * <li>If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
    * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
    * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
    * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
-   * Otherwise, we say that the lookup has failed.
-   *
+   * Otherwise, we say that the lookup has failed.</li>
+   * </ul>
    * </blockquote>
    * @param getterName the name of the getter being looked up
    * @param library the library with respect to which the lookup is being performed
@@ -6814,16 +6695,16 @@
 
   /**
    * Return the element representing the method that results from looking up the given method in
-   * this class with respect to the given library, or `null` if the look up fails. The
+   * this class with respect to the given library, or {@code null} if the look up fails. The
    * behavior of this method is defined by the Dart Language Specification in section 12.15.1:
    * <blockquote> The result of looking up method <i>m</i> in class <i>C</i> with respect to library
    * <i>L</i> is:
-   *
-   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
+   * <ul>
+   * <li>If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
    * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
    * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
-   * to <i>L</i>. Otherwise, we say that the lookup has failed.
-   *
+   * to <i>L</i>. Otherwise, we say that the lookup has failed.</li>
+   * </ul>
    * </blockquote>
    * @param methodName the name of the method being looked up
    * @param library the library with respect to which the lookup is being performed
@@ -6834,16 +6715,16 @@
 
   /**
    * Return the element representing the method that results from looking up the given method in the
-   * superclass of this class with respect to the given library, or `null` if the look up
+   * superclass of this class with respect to the given library, or {@code null} if the look up
    * fails. The behavior of this method is defined by the Dart Language Specification in section
    * 12.15.1: <blockquote> The result of looking up method <i>m</i> in class <i>C</i> with respect
    * to library <i>L</i> is:
-   *
-   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
+   * <ul>
+   * <li>If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
    * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
    * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
-   * to <i>L</i>. Otherwise, we say that the lookup has failed.
-   *
+   * to <i>L</i>. Otherwise, we say that the lookup has failed.</li>
+   * </ul>
    * </blockquote>
    * @param methodName the name of the method being looked up
    * @param library the library with respect to which the lookup is being performed
@@ -6854,17 +6735,17 @@
 
   /**
    * Return the element representing the setter that results from looking up the given setter in
-   * this class with respect to the given library, or `null` if the look up fails. The
+   * this class with respect to the given library, or {@code null} if the look up fails. The
    * behavior of this method is defined by the Dart Language Specification in section 12.16:
    * <blockquote> The result of looking up getter (respectively setter) <i>m</i> in class <i>C</i>
    * with respect to library <i>L</i> is:
-   *
-   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * <ul>
+   * <li>If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
    * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
    * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
    * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
-   * Otherwise, we say that the lookup has failed.
-   *
+   * Otherwise, we say that the lookup has failed.</li>
+   * </ul>
    * </blockquote>
    * @param setterName the name of the setter being looked up
    * @param library the library with respect to which the lookup is being performed
@@ -6875,17 +6756,17 @@
 
   /**
    * Return the element representing the setter that results from looking up the given setter in the
-   * superclass of this class with respect to the given library, or `null` if the look up
+   * superclass of this class with respect to the given library, or {@code null} if the look up
    * fails. The behavior of this method is defined by the Dart Language Specification in section
    * 12.16: <blockquote> The result of looking up getter (respectively setter) <i>m</i> in class
    * <i>C</i> with respect to library <i>L</i> is:
-   *
-   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * <ul>
+   * <li>If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
    * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
    * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
    * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
-   * Otherwise, we say that the lookup has failed.
-   *
+   * Otherwise, we say that the lookup has failed.</li>
+   * </ul>
    * </blockquote>
    * @param setterName the name of the setter being looked up
    * @param library the library with respect to which the lookup is being performed
@@ -6896,7 +6777,7 @@
 
   /**
    * Return the type resulting from substituting the given arguments for this type's parameters.
-   * This is fully equivalent to `substitute(argumentTypes, getTypeArguments())`.
+   * This is fully equivalent to {@code substitute(argumentTypes, getTypeArguments())}.
    * @param argumentTypes the actual type arguments being substituted for the type parameters
    * @return the result of performing the substitution
    */
@@ -6904,7 +6785,7 @@
   InterfaceType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
 }
 /**
- * The interface `ParameterizedType` defines the behavior common to objects representing the
+ * The interface {@code ParameterizedType} defines the behavior common to objects representing the
  * type with type parameters, such as class and function type alias.
  * @coverage dart.engine.type
  */
@@ -6927,7 +6808,7 @@
   List<TypeVariableElement> get typeVariables;
 }
 /**
- * The interface `Type` defines the behavior of objects representing the declared type of
+ * The interface {@code Type} defines the behavior of objects representing the declared type of
  * elements in the element model.
  * @coverage dart.engine.type
  */
@@ -6941,7 +6822,7 @@
   String get displayName;
 
   /**
-   * Return the element representing the declaration of this type, or `null` if the type has
+   * Return the element representing the declaration of this type, or {@code null} if the type has
    * not, or cannot, be associated with an element. The former case will occur if the element model
    * is not yet complete; the latter case will occur if this object represents an undefined type.
    * @return the element representing the declaration of this type
@@ -6949,7 +6830,7 @@
   Element get element;
 
   /**
-   * Return the least upper bound of this type and the given type, or `null` if there is no
+   * Return the least upper bound of this type and the given type, or {@code null} if there is no
    * least upper bound.
    * @param type the other type used to compute the least upper bound
    * @return the least upper bound of this type and the given type
@@ -6957,68 +6838,68 @@
   Type2 getLeastUpperBound(Type2 type);
 
   /**
-   * Return the name of this type, or `null` if the type does not have a name, such as when
+   * Return the name of this type, or {@code null} if the type does not have a name, such as when
    * the type represents the type of an unnamed function.
    * @return the name of this type
    */
   String get name;
 
   /**
-   * Return `true` if this type is assignable to the given type. A type <i>T</i> may be
+   * Return {@code true} if this type is assignable to the given type. A type <i>T</i> may be
    * assigned to a type <i>S</i>, written <i>T</i> &hArr; <i>S</i>, iff either <i>T</i> <: <i>S</i>
    * or <i>S</i> <: <i>T</i>.
    * @param type the type being compared with this type
-   * @return `true` if this type is assignable to the given type
+   * @return {@code true} if this type is assignable to the given type
    */
   bool isAssignableTo(Type2 type);
 
   /**
-   * Return `true` if this type represents the type 'Function' defined in the dart:core
+   * Return {@code true} if this type represents the type 'Function' defined in the dart:core
    * library.
-   * @return `true` if this type represents the type 'Function' defined in the dart:core
+   * @return {@code true} if this type represents the type 'Function' defined in the dart:core
    * library
    */
-  bool get isDartCoreFunction;
+  bool isDartCoreFunction();
 
   /**
-   * Return `true` if this type represents the type 'dynamic'.
-   * @return `true` if this type represents the type 'dynamic'
+   * Return {@code true} if this type represents the type 'dynamic'.
+   * @return {@code true} if this type represents the type 'dynamic'
    */
-  bool get isDynamic;
+  bool isDynamic();
 
   /**
-   * Return `true` if this type is more specific than the given type.
+   * Return {@code true} if this type is more specific than the given type.
    * @param type the type being compared with this type
-   * @return `true` if this type is more specific than the given type
+   * @return {@code true} if this type is more specific than the given type
    */
   bool isMoreSpecificThan(Type2 type);
 
   /**
-   * Return `true` if this type represents the type 'Object'.
-   * @return `true` if this type represents the type 'Object'
+   * Return {@code true} if this type represents the type 'Object'.
+   * @return {@code true} if this type represents the type 'Object'
    */
-  bool get isObject;
+  bool isObject();
 
   /**
-   * Return `true` if this type is a subtype of the given type.
+   * Return {@code true} if this type is a subtype of the given type.
    * @param type the type being compared with this type
-   * @return `true` if this type is a subtype of the given type
+   * @return {@code true} if this type is a subtype of the given type
    */
   bool isSubtypeOf(Type2 type);
 
   /**
-   * Return `true` if this type is a supertype of the given type. A type <i>S</i> is a
+   * Return {@code true} if this type is a supertype of the given type. A type <i>S</i> is a
    * supertype of <i>T</i>, written <i>S</i> :> <i>T</i>, iff <i>T</i> is a subtype of <i>S</i>.
    * @param type the type being compared with this type
-   * @return `true` if this type is a supertype of the given type
+   * @return {@code true} if this type is a supertype of the given type
    */
   bool isSupertypeOf(Type2 type);
 
   /**
-   * Return `true` if this type represents the type 'void'.
-   * @return `true` if this type represents the type 'void'
+   * Return {@code true} if this type represents the type 'void'.
+   * @return {@code true} if this type represents the type 'void'
    */
-  bool get isVoid;
+  bool isVoid();
 
   /**
    * Return the type resulting from substituting the given arguments for the given parameters in
@@ -7035,7 +6916,7 @@
   Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
 }
 /**
- * The interface `TypeVariableType` defines the behavior of objects representing the type
+ * The interface {@code TypeVariableType} defines the behavior of objects representing the type
  * introduced by a type variable.
  * @coverage dart.engine.type
  */
@@ -7043,7 +6924,7 @@
   TypeVariableElement get element;
 }
 /**
- * The interface `VoidType` defines the behavior of the unique object representing the type`void`.
+ * The interface {@code VoidType} defines the behavior of the unique object representing the type{@code void}.
  * @coverage dart.engine.type
  */
 abstract class VoidType implements Type2 {
diff --git a/pkg/analyzer_experimental/lib/src/generated/engine.dart b/pkg/analyzer_experimental/lib/src/generated/engine.dart
index 42407bf..fd4a2e5 100644
--- a/pkg/analyzer_experimental/lib/src/generated/engine.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/engine.dart
@@ -15,7 +15,7 @@
 import 'resolver.dart';
 import 'html.dart' show XmlTagNode, XmlAttributeNode, RecursiveXmlVisitor, HtmlScanner, HtmlScanResult, HtmlParser, HtmlParseResult, HtmlUnit;
 /**
- * The unique instance of the class `AnalysisEngine` serves as the entry point for the
+ * The unique instance of the class {@code AnalysisEngine} serves as the entry point for the
  * functionality provided by the analysis engine.
  * @coverage dart.engine
  */
@@ -48,9 +48,9 @@
   static AnalysisEngine get instance => _UniqueInstance;
 
   /**
-   * Return `true` if the given file name is assumed to contain Dart source code.
+   * Return {@code true} if the given file name is assumed to contain Dart source code.
    * @param fileName the name of the file being tested
-   * @return `true` if the given file name is assumed to contain Dart source code
+   * @return {@code true} if the given file name is assumed to contain Dart source code
    */
   static bool isDartFileName(String fileName) {
     if (fileName == null) {
@@ -60,9 +60,9 @@
   }
 
   /**
-   * Return `true` if the given file name is assumed to contain HTML.
+   * Return {@code true} if the given file name is assumed to contain HTML.
    * @param fileName the name of the file being tested
-   * @return `true` if the given file name is assumed to contain HTML
+   * @return {@code true} if the given file name is assumed to contain HTML
    */
   static bool isHtmlFileName(String fileName) {
     if (fileName == null) {
@@ -82,7 +82,7 @@
    * @return the analysis context that was created
    */
   AnalysisContext createAnalysisContext() {
-    if (Instrumentation.isNullLogger) {
+    if (Instrumentation.isNullLogger()) {
       return new DelegatingAnalysisContextImpl();
     } else {
       return new InstrumentedAnalysisContextImpl.con1(new DelegatingAnalysisContextImpl());
@@ -106,32 +106,32 @@
   }
 }
 /**
- * The interface `AnalysisContext` defines the behavior of objects that represent a context in
+ * The interface {@code AnalysisContext} defines the behavior of objects that represent a context in
  * which a single analysis can be performed and incrementally maintained. The context includes such
  * information as the version of the SDK being analyzed against as well as the package-root used to
- * resolve 'package:' URI's. (Both of which are known indirectly through the [SourceFactorysource factory].)
- *
+ * resolve 'package:' URI's. (Both of which are known indirectly through the {@link SourceFactorysource factory}.)
+ * <p>
  * An analysis context also represents the state of the analysis, which includes knowing which
  * sources have been included in the analysis (either directly or indirectly) and the results of the
- * analysis. Sources must be added and removed from the context using the method[applyChanges], which is also used to notify the context when sources have been
+ * analysis. Sources must be added and removed from the context using the method{@link #applyChanges(ChangeSet)}, which is also used to notify the context when sources have been
  * modified and, consequently, previously known results might have been invalidated.
- *
+ * <p>
  * There are two ways to access the results of the analysis. The most common is to use one of the
  * 'get' methods to access the results. The 'get' methods have the advantage that they will always
  * return quickly, but have the disadvantage that if the results are not currently available they
  * will return either nothing or in some cases an incomplete result. The second way to access
  * results is by using one of the 'compute' methods. The 'compute' methods will always attempt to
  * compute the requested results but might block the caller for a significant period of time.
- *
+ * <p>
  * When results have been invalidated, have never been computed (as is the case for newly added
  * sources), or have been removed from the cache, they are <b>not</b> automatically recreated. They
  * will only be recreated if one of the 'compute' methods is invoked.
- *
+ * <p>
  * However, this is not always acceptable. Some clients need to keep the analysis results
  * up-to-date. For such clients there is a mechanism that allows them to incrementally perform
  * needed analysis and get notified of the consequent changes to the analysis results. This
- * mechanism is realized by the method [performAnalysisTask].
- *
+ * mechanism is realized by the method {@link #performAnalysisTask()}.
+ * <p>
  * Analysis engine allows for having more than one context. This can be used, for example, to
  * perform one analysis based on the state of files on disk and a separate analysis based on the
  * state of those files in open editors. It can also be used to perform an analysis based on a
@@ -148,7 +148,7 @@
 
   /**
    * Return the documentation comment for the given element as it appears in the original source
-   * (complete with the beginning and ending delimiters), or `null` if the element does not
+   * (complete with the beginning and ending delimiters), or {@code null} if the element does not
    * have a documentation comment associated with it. This can be a long-running operation if the
    * information needed to access the comment is not cached.
    * @param element the element whose documentation comment is to be returned
@@ -185,7 +185,7 @@
   HtmlElement computeHtmlElement(Source source);
 
   /**
-   * Return the kind of the given source, computing it's kind if it is not already known. Return[SourceKind#UNKNOWN] if the source is not contained in this context.
+   * Return the kind of the given source, computing it's kind if it is not already known. Return{@link SourceKind#UNKNOWN} if the source is not contained in this context.
    * @param source the source whose kind is to be returned
    * @return the kind of the given source
    * @see #getKindOf(Source)
@@ -206,7 +206,7 @@
   LibraryElement computeLibraryElement(Source source);
 
   /**
-   * Return the line information for the given source, or `null` if the source is not of a
+   * Return the line information for the given source, or {@code null} if the source is not of a
    * recognized kind (neither a Dart nor HTML file). If the line information was not previously
    * known it will be created. The line information is used to map offsets from the beginning of the
    * source to line and column pairs.
@@ -234,7 +234,7 @@
   AnalysisOptions get analysisOptions;
 
   /**
-   * Return the element referenced by the given location, or `null` if the element is not
+   * Return the element referenced by the given location, or {@code null} if the element is not
    * immediately available or if there is no element with the given location. The latter condition
    * can occur, for example, if the location describes an element from a different context or if the
    * element has been removed from this context as a result of some change since it was originally
@@ -256,7 +256,7 @@
   AnalysisErrorInfo getErrors(Source source);
 
   /**
-   * Return the element model corresponding to the HTML file defined by the given source, or`null` if the source does not represent an HTML file, the element representing the file
+   * Return the element model corresponding to the HTML file defined by the given source, or{@code null} if the source does not represent an HTML file, the element representing the file
    * has not yet been created, or the analysis of the HTML file failed for some reason.
    * @param source the source defining the HTML file whose element model is to be returned
    * @return the element model corresponding to the HTML file defined by the given source
@@ -281,7 +281,7 @@
   List<Source> get htmlSources;
 
   /**
-   * Return the kind of the given source, or `null` if the kind is not known to this context.
+   * Return the kind of the given source, or {@code null} if the kind is not known to this context.
    * @param source the source whose kind is to be returned
    * @return the kind of the given source
    * @see #computeKindOf(Source)
@@ -331,7 +331,7 @@
   List<Source> getLibrariesDependingOn(Source librarySource);
 
   /**
-   * Return the element model corresponding to the library defined by the given source, or`null` if the element model does not currently exist or if the library cannot be analyzed
+   * Return the element model corresponding to the library defined by the given source, or{@code null} if the element model does not currently exist or if the library cannot be analyzed
    * for some reason.
    * @param source the source defining the library whose element model is to be returned
    * @return the element model corresponding to the library defined by the given source
@@ -347,7 +347,7 @@
   List<Source> get librarySources;
 
   /**
-   * Return the line information for the given source, or `null` if the line information is
+   * Return the line information for the given source, or {@code null} if the line information is
    * not known. The line information is used to map offsets from the beginning of the source to line
    * and column pairs.
    * @param source the source whose line information is to be returned
@@ -357,7 +357,7 @@
   LineInfo getLineInfo(Source source);
 
   /**
-   * Return a fully resolved AST for a single compilation unit within the given library, or`null` if the resolved AST is not already computed.
+   * Return a fully resolved AST for a single compilation unit within the given library, or{@code null} if the resolved AST is not already computed.
    * @param unitSource the source of the compilation unit
    * @param library the library containing the compilation unit
    * @return a fully resolved AST for the compilation unit
@@ -366,7 +366,7 @@
   CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library);
 
   /**
-   * Return a fully resolved AST for a single compilation unit within the given library, or`null` if the resolved AST is not already computed.
+   * Return a fully resolved AST for a single compilation unit within the given library, or{@code null} if the resolved AST is not already computed.
    * @param unitSource the source of the compilation unit
    * @param librarySource the source of the defining compilation unit of the library containing the
    * compilation unit
@@ -382,28 +382,28 @@
   SourceFactory get sourceFactory;
 
   /**
-   * Return `true` if the given source is known to be the defining compilation unit of a
+   * Return {@code true} if the given source is known to be the defining compilation unit of a
    * library that can be run on a client (references 'dart:html', either directly or indirectly).
-   *
-   * <b>Note:</b> In addition to the expected case of returning `false` if the source is known
-   * to be a library that cannot be run on a client, this method will also return `false` if
+   * <p>
+   * <b>Note:</b> In addition to the expected case of returning {@code false} if the source is known
+   * to be a library that cannot be run on a client, this method will also return {@code false} if
    * the source is not known to be a library or if we do not know whether it can be run on a client.
    * @param librarySource the source being tested
-   * @return `true` if the given source is known to be a library that can be run on a client
+   * @return {@code true} if the given source is known to be a library that can be run on a client
    */
   bool isClientLibrary(Source librarySource);
 
   /**
-   * Return `true` if the given source is known to be the defining compilation unit of a
+   * Return {@code true} if the given source is known to be the defining compilation unit of a
    * library that can be run on the server (does not reference 'dart:html', either directly or
    * indirectly).
-   *
-   * <b>Note:</b> In addition to the expected case of returning `false` if the source is known
-   * to be a library that cannot be run on the server, this method will also return `false` if
+   * <p>
+   * <b>Note:</b> In addition to the expected case of returning {@code false} if the source is known
+   * to be a library that cannot be run on the server, this method will also return {@code false} if
    * the source is not known to be a library or if we do not know whether it can be run on the
    * server.
    * @param librarySource the source being tested
-   * @return `true` if the given source is known to be a library that can be run on the server
+   * @return {@code true} if the given source is known to be a library that can be run on the server
    */
   bool isServerLibrary(Source librarySource);
 
@@ -429,7 +429,7 @@
    * may not be resolved, and may have a slightly different structure depending upon whether it is
    * resolved.
    * @param source the HTML source to be parsed
-   * @return the parse result (not `null`)
+   * @return the parse result (not {@code null})
    * @throws AnalysisException if the analysis could not be performed
    */
   HtmlUnit parseHtmlUnit(Source source);
@@ -438,7 +438,7 @@
    * Perform the next unit of work required to keep the analysis results up-to-date and return
    * information about the consequent changes to the analysis results. If there were no results the
    * returned array will be empty. If there are no more units of work required, then this method
-   * returns `null`. This method can be long running.
+   * returns {@code null}. This method can be long running.
    * @return an array containing notices of changes to the analysis results
    */
   List<ChangeNotice> performAnalysisTask();
@@ -484,7 +484,7 @@
   /**
    * Set the contents of the given source to the given contents and mark the source as having
    * changed. This has the effect of overriding the default contents of the source. If the contents
-   * are `null` the override is removed so that the default contents will be returned.
+   * are {@code null} the override is removed so that the default contents will be returned.
    * @param source the source whose contents are being overridden
    * @param contents the new contents of the source
    */
@@ -500,33 +500,33 @@
   void set sourceFactory(SourceFactory factory);
 
   /**
-   * Given a collection of sources with content that has changed, return an [Iterable]identifying the sources that need to be resolved.
-   * @param changedSources an array of sources (not `null`, contains no `null`s)
+   * Given a collection of sources with content that has changed, return an {@link Iterable}identifying the sources that need to be resolved.
+   * @param changedSources an array of sources (not {@code null}, contains no {@code null}s)
    * @return An iterable returning the sources to be resolved
    */
   Iterable<Source> sourcesToResolve(List<Source> changedSources);
 }
 /**
- * The interface `AnalysisErrorInfo` contains the analysis errors and line information for the
+ * The interface {@code AnalysisErrorInfo} contains the analysis errors and line information for the
  * errors.
  */
 abstract class AnalysisErrorInfo {
 
   /**
-   * Return the errors that as a result of the analysis, or `null` if there were no errors.
+   * Return the errors that as a result of the analysis, or {@code null} if there were no errors.
    * @return the errors as a result of the analysis
    */
   List<AnalysisError> get errors;
 
   /**
-   * Return the line information associated with the errors, or `null` if there were no
+   * Return the line information associated with the errors, or {@code null} if there were no
    * errors.
    * @return the line information associated with the errors
    */
   LineInfo get lineInfo;
 }
 /**
- * Instances of the class `AnalysisException` represent an exception that occurred during the
+ * Instances of the class {@code AnalysisException} represent an exception that occurred during the
  * analysis of one or more sources.
  * @coverage dart.engine
  */
@@ -573,27 +573,27 @@
   }
 }
 /**
- * The interface `AnalysisOptions` defines the behavior of objects that provide access to a
+ * The interface {@code AnalysisOptions} defines the behavior of objects that provide access to a
  * set of analysis options used to control the behavior of an analysis context.
  */
 abstract class AnalysisOptions {
 
   /**
-   * Return `true` if analysis is to use strict mode. In strict mode, error reporting is based
+   * Return {@code true} if analysis is to use strict mode. In strict mode, error reporting is based
    * exclusively on the static type information.
-   * @return `true` if analysis is to use strict mode
+   * @return {@code true} if analysis is to use strict mode
    */
   bool get strictMode;
 }
 /**
- * The interface `ChangeNotice` defines the behavior of objects that represent a change to the
+ * The interface {@code ChangeNotice} defines the behavior of objects that represent a change to the
  * analysis results associated with a given source.
  * @coverage dart.engine
  */
 abstract class ChangeNotice implements AnalysisErrorInfo {
 
   /**
-   * Return the fully resolved AST that changed as a result of the analysis, or `null` if the
+   * Return the fully resolved AST that changed as a result of the analysis, or {@code null} if the
    * AST was not changed.
    * @return the fully resolved AST that changed as a result of the analysis
    */
@@ -606,7 +606,7 @@
   Source get source;
 }
 /**
- * Instances of the class `ChangeSet` indicate what sources have been added, changed, or
+ * Instances of the class {@code ChangeSet} indicate what sources have been added, changed, or
  * removed.
  * @coverage dart.engine
  */
@@ -675,10 +675,10 @@
   List<SourceContainer> get removedContainers => _removedContainers;
 
   /**
-   * Return `true` if this change set does not contain any changes.
-   * @return `true` if this change set does not contain any changes
+   * Return {@code true} if this change set does not contain any changes.
+   * @return {@code true} if this change set does not contain any changes
    */
-  bool get isEmpty => _added2.isEmpty && _changed2.isEmpty && _removed2.isEmpty && _removedContainers.isEmpty;
+  bool isEmpty() => _added2.isEmpty && _changed2.isEmpty && _removed2.isEmpty && _removedContainers.isEmpty;
 
   /**
    * Record that the specified source has been removed.
@@ -701,7 +701,7 @@
   }
 }
 /**
- * The interface `DartEntry` defines the behavior of objects that maintain the information
+ * The interface {@code DartEntry} defines the behavior of objects that maintain the information
  * cached by an analysis context about an individual Dart file.
  * @coverage dart.engine
  */
@@ -776,14 +776,14 @@
 
   /**
    * Return a valid parsed compilation unit, either an unresolved AST structure or the result of
-   * resolving the AST structure in the context of some library, or `null` if there is no
+   * resolving the AST structure in the context of some library, or {@code null} if there is no
    * parsed compilation unit available.
    * @return a valid parsed compilation unit
    */
   CompilationUnit get anyParsedCompilationUnit;
 
   /**
-   * Return the result of resolving the compilation unit as part of any library, or `null` if
+   * Return the result of resolving the compilation unit as part of any library, or {@code null} if
    * there is no cached resolved compilation unit.
    * @return any resolved compilation unit
    */
@@ -801,7 +801,7 @@
 
   /**
    * Return the value of the data represented by the given descriptor in the context of the given
-   * library, or `null` if the data represented by the descriptor is not in the cache.
+   * library, or {@code null} if the data represented by the descriptor is not in the cache.
    * @param descriptor the descriptor representing which data is to be returned
    * @param librarySource the source of the defining compilation unit of the library that is the
    * context for the data
@@ -811,7 +811,7 @@
   DartEntryImpl get writableCopy;
 }
 /**
- * Instances of the class `DartEntryImpl` implement a [DartEntry].
+ * Instances of the class {@code DartEntryImpl} implement a {@link DartEntry}.
  * @coverage dart.engine
  */
 class DartEntryImpl extends SourceEntryImpl implements DartEntry {
@@ -832,7 +832,7 @@
   CacheState _parsedUnitState = CacheState.INVALID;
 
   /**
-   * The parsed compilation unit, or `null` if the parsed compilation unit is not currently
+   * The parsed compilation unit, or {@code null} if the parsed compilation unit is not currently
    * cached.
    */
   CompilationUnit _parsedUnit;
@@ -843,7 +843,7 @@
   CacheState _parseErrorsState = CacheState.INVALID;
 
   /**
-   * The errors produced while scanning and parsing the compilation unit, or `null` if the
+   * The errors produced while scanning and parsing the compilation unit, or {@code null} if the
    * errors are not currently cached.
    */
   List<AnalysisError> _parseErrors = AnalysisError.NO_ERRORS;
@@ -873,7 +873,7 @@
 
   /**
    * The information known as a result of resolving this compilation unit as part of the library
-   * that contains this unit. This field will never be `null`.
+   * that contains this unit. This field will never be {@code null}.
    */
   DartEntryImpl_ResolutionState _resolutionState = new DartEntryImpl_ResolutionState();
 
@@ -883,7 +883,7 @@
   CacheState _elementState = CacheState.INVALID;
 
   /**
-   * The element representing the library, or `null` if the element is not currently cached.
+   * The element representing the library, or {@code null} if the element is not currently cached.
    */
   LibraryElement _element;
 
@@ -893,7 +893,7 @@
   CacheState _publicNamespaceState = CacheState.INVALID;
 
   /**
-   * The public namespace of the library, or `null` if the namespace is not currently cached.
+   * The public namespace of the library, or {@code null} if the namespace is not currently cached.
    */
   Namespace _publicNamespace;
 
@@ -908,7 +908,7 @@
   CacheState _launchableState = CacheState.INVALID;
 
   /**
-   * An integer holding bit masks such as [LAUNCHABLE] and [CLIENT_CODE].
+   * An integer holding bit masks such as {@link #LAUNCHABLE} and {@link #CLIENT_CODE}.
    */
   int _bitmask = 0;
 
@@ -1280,7 +1280,7 @@
 
   /**
    * Set the value of the data represented by the given descriptor in the context of the given
-   * library to the given value, and set the state of that data to [CacheState#VALID].
+   * library to the given value, and set the state of that data to {@link CacheState#VALID}.
    * @param descriptor the descriptor representing which data is to have its value set
    * @param librarySource the source of the defining compilation unit of the library that is the
    * context for the data
@@ -1321,8 +1321,8 @@
 
   /**
    * Return a resolution state for the specified library, creating one as necessary.
-   * @param librarySource the library source (not `null`)
-   * @return the resolution state (not `null`)
+   * @param librarySource the library source (not {@code null})
+   * @return the resolution state (not {@code null})
    */
   DartEntryImpl_ResolutionState getOrCreateResolutionState(Source librarySource2) {
     DartEntryImpl_ResolutionState state = _resolutionState;
@@ -1360,13 +1360,13 @@
   }
 }
 /**
- * Instances of the class `ResolutionState` represent the information produced by resolving
+ * Instances of the class {@code ResolutionState} represent the information produced by resolving
  * a compilation unit as part of a specific library.
  */
 class DartEntryImpl_ResolutionState {
 
   /**
-   * The next resolution state or `null` if none.
+   * The next resolution state or {@code null} if none.
    */
   DartEntryImpl_ResolutionState _nextState;
 
@@ -1383,7 +1383,7 @@
   CacheState _resolvedUnitState = CacheState.INVALID;
 
   /**
-   * The resolved compilation unit, or `null` if the resolved compilation unit is not
+   * The resolved compilation unit, or {@code null} if the resolved compilation unit is not
    * currently cached.
    */
   CompilationUnit _resolvedUnit;
@@ -1394,7 +1394,7 @@
   CacheState _resolutionErrorsState = CacheState.INVALID;
 
   /**
-   * The errors produced while resolving the compilation unit, or `null` if the errors are
+   * The errors produced while resolving the compilation unit, or {@code null} if the errors are
    * not currently cached.
    */
   List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
@@ -1443,7 +1443,7 @@
   }
 }
 /**
- * Instances of the class `DataDescriptor` are immutable constants representing data that can
+ * Instances of the class {@code DataDescriptor} are immutable constants representing data that can
  * be stored in the cache.
  */
 class DataDescriptor<E> {
@@ -1463,7 +1463,7 @@
   String toString() => _name;
 }
 /**
- * The interface `HtmlEntry` defines the behavior of objects that maintain the information
+ * The interface {@code HtmlEntry} defines the behavior of objects that maintain the information
  * cached by an analysis context about an individual HTML file.
  * @coverage dart.engine
  */
@@ -1502,7 +1502,7 @@
   HtmlEntryImpl get writableCopy;
 }
 /**
- * Instances of the class `HtmlEntryImpl` implement an [HtmlEntry].
+ * Instances of the class {@code HtmlEntryImpl} implement an {@link HtmlEntry}.
  * @coverage dart.engine
  */
 class HtmlEntryImpl extends SourceEntryImpl implements HtmlEntry {
@@ -1513,7 +1513,7 @@
   CacheState _parsedUnitState = CacheState.INVALID;
 
   /**
-   * The parsed HTML unit, or `null` if the parsed HTML unit is not currently cached.
+   * The parsed HTML unit, or {@code null} if the parsed HTML unit is not currently cached.
    */
   HtmlUnit _parsedUnit;
 
@@ -1523,7 +1523,7 @@
   CacheState _resolutionErrorsState = CacheState.INVALID;
 
   /**
-   * The errors produced while resolving the compilation unit, or `null` if the errors are not
+   * The errors produced while resolving the compilation unit, or {@code null} if the errors are not
    * currently cached.
    */
   List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
@@ -1534,7 +1534,7 @@
   CacheState _resolvedUnitState = CacheState.INVALID;
 
   /**
-   * The resolved HTML unit, or `null` if the resolved HTML unit is not currently cached.
+   * The resolved HTML unit, or {@code null} if the resolved HTML unit is not currently cached.
    */
   HtmlUnit _resolvedUnit;
 
@@ -1544,7 +1544,7 @@
   CacheState _referencedLibrariesState = CacheState.INVALID;
 
   /**
-   * The list of libraries referenced in the HTML, or `null` if the list is not currently
+   * The list of libraries referenced in the HTML, or {@code null} if the list is not currently
    * cached. Note that this list does not include libraries defined directly within the HTML file.
    */
   List<Source> _referencedLibraries = Source.EMPTY_ARRAY;
@@ -1555,7 +1555,7 @@
   CacheState _elementState = CacheState.INVALID;
 
   /**
-   * The element representing the HTML file, or `null` if the element is not currently cached.
+   * The element representing the HTML file, or {@code null} if the element is not currently cached.
    */
   HtmlElement _element;
   List<AnalysisError> get allErrors {
@@ -1658,9 +1658,9 @@
   }
 }
 /**
- * The interface `SourceEntry` defines the behavior of objects that maintain the information
+ * The interface {@code SourceEntry} defines the behavior of objects that maintain the information
  * cached by an analysis context about an individual source, no matter what kind of source it is.
- *
+ * <p>
  * Source entries should be treated as if they were immutable unless a writable copy of the entry
  * has been obtained and has not yet been made visible to other threads.
  * @coverage dart.engine
@@ -1673,7 +1673,7 @@
   static final DataDescriptor<LineInfo> LINE_INFO = new DataDescriptor<LineInfo>("SourceEntry.LINE_INFO");
 
   /**
-   * Return the kind of the source, or `null` if the kind is not currently cached.
+   * Return the kind of the source, or {@code null} if the kind is not currently cached.
    * @return the kind of the source
    */
   SourceKind get kind;
@@ -1693,7 +1693,7 @@
   CacheState getState(DataDescriptor<Object> descriptor);
 
   /**
-   * Return the value of the data represented by the given descriptor, or `null` if the data
+   * Return the value of the data represented by the given descriptor, or {@code null} if the data
    * represented by the descriptor is not in the cache.
    * @param descriptor the descriptor representing which data is to be returned
    * @return the value of the data represented by the given descriptor
@@ -1708,7 +1708,7 @@
   SourceEntryImpl get writableCopy;
 }
 /**
- * Instances of the abstract class `SourceEntryImpl` implement the behavior common to all[SourceEntry source entries].
+ * Instances of the abstract class {@code SourceEntryImpl} implement the behavior common to all{@link SourceEntry source entries}.
  * @coverage dart.engine
  */
 abstract class SourceEntryImpl implements SourceEntry {
@@ -1725,7 +1725,7 @@
   CacheState _lineInfoState = CacheState.INVALID;
 
   /**
-   * The line information computed for the source, or `null` if the line information is not
+   * The line information computed for the source, or {@code null} if the line information is not
    * currently cached.
    */
   LineInfo _lineInfo;
@@ -1810,8 +1810,8 @@
   }
 }
 /**
- * Instances of the class `AnalysisContextImpl` implement an [AnalysisContext analysis
- * context].
+ * Instances of the class {@code AnalysisContextImpl} implement an {@link AnalysisContext analysis
+ * context}.
  * @coverage dart.engine
  */
 class AnalysisContextImpl implements InternalAnalysisContext {
@@ -1884,7 +1884,7 @@
     _sourceMap[source] = info;
   }
   void applyChanges(ChangeSet changeSet) {
-    if (changeSet.isEmpty) {
+    if (changeSet.isEmpty()) {
       return;
     }
     {
@@ -1906,7 +1906,7 @@
       }
       if (addedDartSource) {
         for (MapEntry<Source, SourceEntry> mapEntry in getMapEntrySet(_sourceMap)) {
-          if (!mapEntry.getKey().isInSystemLibrary && mapEntry.getValue() is DartEntry) {
+          if (!mapEntry.getKey().isInSystemLibrary() && mapEntry.getValue() is DartEntry) {
             DartEntryImpl dartCopy = ((mapEntry.getValue() as DartEntry)).writableCopy;
             dartCopy.invalidateAllResolutionInformation();
             mapEntry.setValue(dartCopy);
@@ -2172,7 +2172,7 @@
       for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
         Source source = entry.getKey();
         SourceEntry sourceEntry = entry.getValue();
-        if (identical(sourceEntry.kind, SourceKind.LIBRARY) && !source.isInSystemLibrary) {
+        if (identical(sourceEntry.kind, SourceKind.LIBRARY) && !source.isInSystemLibrary()) {
           sources.add(source);
         }
       }
@@ -2185,7 +2185,7 @@
       for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
         Source source = entry.getKey();
         SourceEntry sourceEntry = entry.getValue();
-        if (identical(sourceEntry.kind, SourceKind.LIBRARY) && !source.isInSystemLibrary) {
+        if (identical(sourceEntry.kind, SourceKind.LIBRARY) && !source.isInSystemLibrary()) {
           sources.add(source);
         }
       }
@@ -2496,9 +2496,9 @@
   }
 
   /**
-   * Return a list of the sources that would be processed by [performAnalysisTask]. This
+   * Return a list of the sources that would be processed by {@link #performAnalysisTask()}. This
    * method is intended to be used for testing purposes only.
-   * @return a list of the sources that would be processed by [performAnalysisTask]
+   * @return a list of the sources that would be processed by {@link #performAnalysisTask()}
    */
   List<Source> get sourcesNeedingProcessing {
     List<Source> sources = new List<Source>();
@@ -2527,8 +2527,8 @@
 
   /**
    * Record that the given source was just accessed for some unspecified purpose.
-   *
-   * Note: This method must only be invoked while we are synchronized on [cacheLock].
+   * <p>
+   * Note: This method must only be invoked while we are synchronized on {@link #cacheLock}.
    * @param source the source that was accessed
    */
   void accessed(Source source) {
@@ -2559,8 +2559,8 @@
 
   /**
    * Add all of the sources contained in the given source container to the given list of sources.
-   *
-   * Note: This method must only be invoked while we are synchronized on [cacheLock].
+   * <p>
+   * Note: This method must only be invoked while we are synchronized on {@link #cacheLock}.
    * @param sources the list to which sources are to be added
    * @param container the source container containing the sources to be added to the list
    */
@@ -2573,10 +2573,10 @@
   }
 
   /**
-   * Return `true` if the given array of sources contains the given source.
+   * Return {@code true} if the given array of sources contains the given source.
    * @param sources the sources being searched
    * @param targetSource the source being searched for
-   * @return `true` if the given source is in the array
+   * @return {@code true} if the given source is in the array
    */
   bool contains(List<Source> sources, Source targetSource) {
     for (Source source in sources) {
@@ -2588,10 +2588,10 @@
   }
 
   /**
-   * Return `true` if the given array of sources contains any of the given target sources.
+   * Return {@code true} if the given array of sources contains any of the given target sources.
    * @param sources the sources being searched
    * @param targetSources the sources being searched for
-   * @return `true` if any of the given target sources are in the array
+   * @return {@code true} if any of the given target sources are in the array
    */
   bool containsAny(List<Source> sources, List<Source> targetSources) {
     for (Source targetSource in targetSources) {
@@ -2604,7 +2604,7 @@
 
   /**
    * Create a source information object suitable for the given source. Return the source information
-   * object that was created, or `null` if the source should not be tracked by this context.
+   * object that was created, or {@code null} if the source should not be tracked by this context.
    * @param source the source for which an information object is being created
    * @return the source information object that was created
    */
@@ -2622,7 +2622,7 @@
   }
 
   /**
-   * Disable flushing information from the cache until [enableCacheRemoval] has been
+   * Disable flushing information from the cache until {@link #enableCacheRemoval()} has been
    * called.
    */
   void disableCacheRemoval() {
@@ -2659,7 +2659,7 @@
 
   /**
    * Search the compilation units that are part of the given library and return the element
-   * representing the compilation unit with the given source. Return `null` if there is no
+   * representing the compilation unit with the given source. Return {@code null} if there is no
    * such compilation unit.
    * @param libraryElement the element representing the library being searched through
    * @param unitSource the source for the compilation unit whose element is to be returned
@@ -2679,13 +2679,13 @@
   }
 
   /**
-   * Return the compilation unit information associated with the given source, or `null` if
+   * Return the compilation unit information associated with the given source, or {@code null} if
    * the source is not known to this context. This method should be used to access the compilation
    * unit information rather than accessing the compilation unit map directly because sources in the
    * SDK are implicitly part of every analysis context and are therefore only added to the map when
    * first accessed.
-   *
-   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
+   * <p>
+   * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
    * @param source the source for which information is being sought
    * @return the compilation unit information associated with the given source
    */
@@ -2702,13 +2702,13 @@
   }
 
   /**
-   * Return the HTML unit information associated with the given source, or `null` if the
+   * Return the HTML unit information associated with the given source, or {@code null} if the
    * source is not known to this context. This method should be used to access the HTML unit
    * information rather than accessing the HTML unit map directly because sources in the SDK are
    * implicitly part of every analysis context and are therefore only added to the map when first
    * accessed.
-   *
-   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
+   * <p>
+   * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
    * @param source the source for which information is being sought
    * @return the HTML unit information associated with the given source
    */
@@ -2754,7 +2754,7 @@
   }
 
   /**
-   * Return the cache entry associated with the given source, or `null` if there is no entry
+   * Return the cache entry associated with the given source, or {@code null} if there is no entry
    * associated with the source.
    * @param source the source for which a cache entry is being sought
    * @return the source cache entry associated with the given source
@@ -2766,12 +2766,12 @@
   }
 
   /**
-   * Return the source information associated with the given source, or `null` if the source
+   * Return the source information associated with the given source, or {@code null} if the source
    * is not known to this context. This method should be used to access the source information
    * rather than accessing the source map directly because sources in the SDK are implicitly part of
    * every analysis context and are therefore only added to the map when first accessed.
-   *
-   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
+   * <p>
+   * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
    * @param source the source for which information is being sought
    * @return the source information associated with the given source
    */
@@ -2801,10 +2801,10 @@
   }
 
   /**
-   * Return `true` if the given compilation unit has a part-of directive but no library
+   * Return {@code true} if the given compilation unit has a part-of directive but no library
    * directive.
    * @param unit the compilation unit being tested
-   * @return `true` if the compilation unit has a part-of directive
+   * @return {@code true} if the compilation unit has a part-of directive
    */
   bool hasPartOfDirective(CompilationUnit unit) {
     bool hasPartOf = false;
@@ -2898,8 +2898,8 @@
 
   /**
    * Invalidate all of the results computed by this context.
-   *
-   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
+   * <p>
+   * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
    */
   void invalidateAllResults() {
     for (MapEntry<Source, SourceEntry> mapEntry in getMapEntrySet(_sourceMap)) {
@@ -2941,11 +2941,11 @@
   }
 
   /**
-   * Return `true` if this library is, or depends on, dart:html.
+   * Return {@code true} if this library is, or depends on, dart:html.
    * @param library the library being tested
    * @param visitedLibraries a collection of the libraries that have been visited, used to prevent
    * infinite recursion
-   * @return `true` if this library is, or depends on, dart:html
+   * @return {@code true} if this library is, or depends on, dart:html
    */
   bool isClient(LibraryElement library, Source htmlSource, Set<LibraryElement> visitedLibraries) {
     if (visitedLibraries.contains(library)) {
@@ -2970,9 +2970,9 @@
 
   /**
    * Perform a single analysis task.
-   *
-   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
-   * @return `true` if work was done, implying that there might be more work to be done
+   * <p>
+   * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
+   * @return {@code true} if work was done, implying that there might be more work to be done
    */
   bool performSingleAnalysisTask() {
     for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
@@ -3122,12 +3122,12 @@
   }
 
   /**
-   * Create an entry for the newly added source. Return `true` if the new source is a Dart
+   * Create an entry for the newly added source. Return {@code true} if the new source is a Dart
    * file.
-   *
-   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
+   * <p>
+   * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
    * @param source the source that has been added
-   * @return `true` if the new source is a Dart file
+   * @return {@code true} if the new source is a Dart file
    */
   bool sourceAvailable(Source source) {
     SourceEntry sourceEntry = _sourceMap[source];
@@ -3138,7 +3138,7 @@
   }
 
   /**
-   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
+   * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
    * @param source the source that has been changed
    */
   void sourceChanged(Source source) {
@@ -3152,21 +3152,28 @@
       htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.INVALID);
       _sourceMap[source] = htmlCopy;
     } else if (sourceEntry is DartEntry) {
+      Set<Source> librariesToInvalidate = new Set<Source>();
       List<Source> containingLibraries = getLibrariesContaining(source);
+      for (Source containingLibrary in containingLibraries) {
+        javaSetAdd(librariesToInvalidate, containingLibrary);
+        for (Source dependentLibrary in getLibrariesDependingOn(containingLibrary)) {
+          javaSetAdd(librariesToInvalidate, dependentLibrary);
+        }
+      }
       DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
       dartCopy.setState(SourceEntry.LINE_INFO, CacheState.INVALID);
       dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.INVALID);
       dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.INVALID);
       dartCopy.setState(DartEntry.SOURCE_KIND, CacheState.INVALID);
       _sourceMap[source] = dartCopy;
-      for (Source library in containingLibraries) {
+      for (Source library in librariesToInvalidate) {
         invalidateLibraryResolution(library);
       }
     }
   }
 
   /**
-   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
+   * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
    * @param source the source that has been deleted
    */
   void sourceRemoved(Source source) {
@@ -3187,7 +3194,7 @@
   }
 }
 /**
- * Instances of the class `ScanResult` represent the results of scanning a source.
+ * Instances of the class {@code ScanResult} represent the results of scanning a source.
  */
 class AnalysisContextImpl_ScanResult {
 
@@ -3259,18 +3266,18 @@
   }
 }
 /**
- * Instances of the class `AnalysisErrorInfoImpl` represent the analysis errors and line info
+ * Instances of the class {@code AnalysisErrorInfoImpl} represent the analysis errors and line info
  * associated with a source.
  */
 class AnalysisErrorInfoImpl implements AnalysisErrorInfo {
 
   /**
-   * The analysis errors associated with a source, or `null` if there are no errors.
+   * The analysis errors associated with a source, or {@code null} if there are no errors.
    */
   List<AnalysisError> _errors;
 
   /**
-   * The line information associated with the errors, or `null` if there are no errors.
+   * The line information associated with the errors, or {@code null} if there are no errors.
    */
   LineInfo _lineInfo;
 
@@ -3285,20 +3292,20 @@
   }
 
   /**
-   * Return the errors of analysis, or `null` if there were no errors.
+   * Return the errors of analysis, or {@code null} if there were no errors.
    * @return the errors as a result of the analysis
    */
   List<AnalysisError> get errors => _errors;
 
   /**
-   * Return the line information associated with the errors, or `null` if there were no
+   * Return the line information associated with the errors, or {@code null} if there were no
    * errors.
    * @return the line information associated with the errors
    */
   LineInfo get lineInfo => _lineInfo;
 }
 /**
- * Instances of the class `AnalysisOptions` represent a set of analysis options used to
+ * Instances of the class {@code AnalysisOptions} represent a set of analysis options used to
  * control the behavior of an analysis context.
  */
 class AnalysisOptionsImpl implements AnalysisOptions {
@@ -3310,78 +3317,78 @@
   bool _strictMode = false;
 
   /**
-   * Return `true` if analysis is to use strict mode. In strict mode, error reporting is based
+   * Return {@code true} if analysis is to use strict mode. In strict mode, error reporting is based
    * exclusively on the static type information.
-   * @return `true` if analysis is to use strict mode
+   * @return {@code true} if analysis is to use strict mode
    */
   bool get strictMode => _strictMode;
 
   /**
    * Set whether analysis is to use strict mode to the given value. In strict mode, error reporting
    * is based exclusively on the static type information.
-   * @param isStrict `true` if analysis is to use strict mode
+   * @param isStrict {@code true} if analysis is to use strict mode
    */
   void set strictMode(bool isStrict) {
     _strictMode = isStrict;
   }
 }
 /**
- * The enumeration `CacheState` defines the possible states of cached data.
+ * The enumeration {@code CacheState} defines the possible states of cached data.
  */
 class CacheState implements Comparable<CacheState> {
 
   /**
    * The data is not in the cache and the last time an attempt was made to compute the data an
    * exception occurred, making it pointless to attempt.
-   *
+   * <p>
    * Valid Transitions:
-   *
-   * * [INVALID] if a source was modified that might cause the data to be computable
-   *
+   * <ul>
+   * <li>{@link #INVALID} if a source was modified that might cause the data to be computable</li>
+   * </ul>
    */
   static final CacheState ERROR = new CacheState('ERROR', 0);
 
   /**
    * The data is not in the cache because it was flushed from the cache in order to control memory
    * usage. If the data is recomputed, results do not need to be reported.
-   *
+   * <p>
    * Valid Transitions:
-   *
-   * * [IN_PROCESS] if the data is being recomputed
-   * * [INVALID] if a source was modified that causes the data to need to be recomputed
-   *
+   * <ul>
+   * <li>{@link #IN_PROCESS} if the data is being recomputed</li>
+   * <li>{@link #INVALID} if a source was modified that causes the data to need to be recomputed</li>
+   * </ul>
    */
   static final CacheState FLUSHED = new CacheState('FLUSHED', 1);
 
   /**
    * The data might or might not be in the cache but is in the process of being recomputed.
-   *
+   * <p>
    * Valid Transitions:
-   *
-   * * [ERROR] if an exception occurred while trying to compute the data
-   * * [VALID] if the data was successfully computed and stored in the cache
-   *
+   * <ul>
+   * <li>{@link #ERROR} if an exception occurred while trying to compute the data</li>
+   * <li>{@link #VALID} if the data was successfully computed and stored in the cache</li>
+   * </ul>
    */
   static final CacheState IN_PROCESS = new CacheState('IN_PROCESS', 2);
 
   /**
    * The data is not in the cache and needs to be recomputed so that results can be reported.
-   *
+   * <p>
    * Valid Transitions:
-   *
-   * * [IN_PROCESS] if an attempt is being made to recompute the data
-   *
+   * <ul>
+   * <li>{@link #IN_PROCESS} if an attempt is being made to recompute the data</li>
+   * </ul>
    */
   static final CacheState INVALID = new CacheState('INVALID', 3);
 
   /**
    * The data is in the cache and up-to-date.
-   *
+   * <p>
    * Valid Transitions:
-   *
-   * * [FLUSHED] if the data is removed in order to manage memory usage
-   * * [INVALID] if a source was modified in such a way as to invalidate the previous data
-   *
+   * <ul>
+   * <li>{@link #FLUSHED} if the data is removed in order to manage memory usage</li>
+   * <li>{@link #INVALID} if a source was modified in such a way as to invalidate the previous data</li>
+   * </ul>
    */
   static final CacheState VALID = new CacheState('VALID', 4);
   static final List<CacheState> values = [ERROR, FLUSHED, IN_PROCESS, INVALID, VALID];
@@ -3398,7 +3405,7 @@
   String toString() => name;
 }
 /**
- * Instances of the class `ChangeNoticeImpl` represent a change to the analysis results
+ * Instances of the class {@code ChangeNoticeImpl} represent a change to the analysis results
  * associated with a given source.
  * @coverage dart.engine
  */
@@ -3410,19 +3417,19 @@
   Source _source;
 
   /**
-   * The fully resolved AST that changed as a result of the analysis, or `null` if the AST was
+   * The fully resolved AST that changed as a result of the analysis, or {@code null} if the AST was
    * not changed.
    */
   CompilationUnit _compilationUnit;
 
   /**
-   * The errors that changed as a result of the analysis, or `null` if errors were not
+   * The errors that changed as a result of the analysis, or {@code null} if errors were not
    * changed.
    */
   List<AnalysisError> _errors;
 
   /**
-   * The line information associated with the source, or `null` if errors were not changed.
+   * The line information associated with the source, or {@code null} if errors were not changed.
    */
   LineInfo _lineInfo;
 
@@ -3440,21 +3447,21 @@
   }
 
   /**
-   * Return the fully resolved AST that changed as a result of the analysis, or `null` if the
+   * Return the fully resolved AST that changed as a result of the analysis, or {@code null} if the
    * AST was not changed.
    * @return the fully resolved AST that changed as a result of the analysis
    */
   CompilationUnit get compilationUnit => _compilationUnit;
 
   /**
-   * Return the errors that changed as a result of the analysis, or `null` if errors were not
+   * Return the errors that changed as a result of the analysis, or {@code null} if errors were not
    * changed.
    * @return the errors that changed as a result of the analysis
    */
   List<AnalysisError> get errors => _errors;
 
   /**
-   * Return the line information associated with the source, or `null` if errors were not
+   * Return the line information associated with the source, or {@code null} if errors were not
    * changed.
    * @return the line information associated with the source
    */
@@ -3486,112 +3493,112 @@
   }
 }
 /**
- * Instances of the class `DelegatingAnalysisContextImpl` extend [AnalysisContextImplanalysis context] to delegate sources to the appropriate analysis context. For instance, if the
- * source is in a system library then the analysis context from the [DartSdk] is used.
+ * Instances of the class {@code DelegatingAnalysisContextImpl} extend {@link AnalysisContextImplanalysis context} to delegate sources to the appropriate analysis context. For instance, if the
+ * source is in a system library then the analysis context from the {@link DartSdk} is used.
  * @coverage dart.engine
  */
 class DelegatingAnalysisContextImpl extends AnalysisContextImpl {
 
   /**
-   * This references the [InternalAnalysisContext] held onto by the [DartSdk] which is
-   * used (instead of this [AnalysisContext]) for SDK sources. This field is set when
-   * #setSourceFactory(SourceFactory) is called, and references the analysis context in the[DartUriResolver] in the [SourceFactory], this analysis context assumes that there
+   * This references the {@link InternalAnalysisContext} held onto by the {@link DartSdk} which is
+   * used (instead of this {@link AnalysisContext}) for SDK sources. This field is set when
+   * #setSourceFactory(SourceFactory) is called, and references the analysis context in the{@link DartUriResolver} in the {@link SourceFactory}, this analysis context assumes that there
    * will be such a resolver.
    */
   InternalAnalysisContext _sdkAnalysisContext;
   void addSourceInfo(Source source, SourceEntry info) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       _sdkAnalysisContext.addSourceInfo(source, info);
     } else {
       super.addSourceInfo(source, info);
     }
   }
   List<AnalysisError> computeErrors(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.computeErrors(source);
     } else {
       return super.computeErrors(source);
     }
   }
   HtmlElement computeHtmlElement(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.computeHtmlElement(source);
     } else {
       return super.computeHtmlElement(source);
     }
   }
   SourceKind computeKindOf(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.computeKindOf(source);
     } else {
       return super.computeKindOf(source);
     }
   }
   LibraryElement computeLibraryElement(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.computeLibraryElement(source);
     } else {
       return super.computeLibraryElement(source);
     }
   }
   LineInfo computeLineInfo(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.computeLineInfo(source);
     } else {
       return super.computeLineInfo(source);
     }
   }
   CompilationUnit computeResolvableCompilationUnit(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.computeResolvableCompilationUnit(source);
     } else {
       return super.computeResolvableCompilationUnit(source);
     }
   }
   AnalysisErrorInfo getErrors(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.getErrors(source);
     } else {
       return super.getErrors(source);
     }
   }
   HtmlElement getHtmlElement(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.getHtmlElement(source);
     } else {
       return super.getHtmlElement(source);
     }
   }
   List<Source> getHtmlFilesReferencing(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.getHtmlFilesReferencing(source);
     } else {
       return super.getHtmlFilesReferencing(source);
     }
   }
   SourceKind getKindOf(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.getKindOf(source);
     } else {
       return super.getKindOf(source);
     }
   }
   List<Source> getLibrariesContaining(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.getLibrariesContaining(source);
     } else {
       return super.getLibrariesContaining(source);
     }
   }
   List<Source> getLibrariesDependingOn(Source librarySource) {
-    if (librarySource.isInSystemLibrary) {
+    if (librarySource.isInSystemLibrary()) {
       return _sdkAnalysisContext.getLibrariesDependingOn(librarySource);
     } else {
       return super.getLibrariesDependingOn(librarySource);
     }
   }
   LibraryElement getLibraryElement(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.getLibraryElement(source);
     } else {
       return super.getLibraryElement(source);
@@ -3599,7 +3606,7 @@
   }
   List<Source> get librarySources => ArrayUtils.addAll(super.librarySources, _sdkAnalysisContext.librarySources);
   LineInfo getLineInfo(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.getLineInfo(source);
     } else {
       return super.getLineInfo(source);
@@ -3607,56 +3614,56 @@
   }
   Namespace getPublicNamespace(LibraryElement library) {
     Source source = library.source;
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.getPublicNamespace(library);
     } else {
       return super.getPublicNamespace(library);
     }
   }
   Namespace getPublicNamespace2(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.getPublicNamespace2(source);
     } else {
       return super.getPublicNamespace2(source);
     }
   }
   CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) {
-    if (unitSource.isInSystemLibrary) {
+    if (unitSource.isInSystemLibrary()) {
       return _sdkAnalysisContext.getResolvedCompilationUnit(unitSource, library);
     } else {
       return super.getResolvedCompilationUnit(unitSource, library);
     }
   }
   CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource) {
-    if (unitSource.isInSystemLibrary) {
+    if (unitSource.isInSystemLibrary()) {
       return _sdkAnalysisContext.getResolvedCompilationUnit2(unitSource, librarySource);
     } else {
       return super.getResolvedCompilationUnit2(unitSource, librarySource);
     }
   }
   bool isClientLibrary(Source librarySource) {
-    if (librarySource.isInSystemLibrary) {
+    if (librarySource.isInSystemLibrary()) {
       return _sdkAnalysisContext.isClientLibrary(librarySource);
     } else {
       return super.isClientLibrary(librarySource);
     }
   }
   bool isServerLibrary(Source librarySource) {
-    if (librarySource.isInSystemLibrary) {
+    if (librarySource.isInSystemLibrary()) {
       return _sdkAnalysisContext.isServerLibrary(librarySource);
     } else {
       return super.isServerLibrary(librarySource);
     }
   }
   CompilationUnit parseCompilationUnit(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.parseCompilationUnit(source);
     } else {
       return super.parseCompilationUnit(source);
     }
   }
   HtmlUnit parseHtmlUnit(Source source) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.parseHtmlUnit(source);
     } else {
       return super.parseHtmlUnit(source);
@@ -3667,35 +3674,35 @@
       return;
     }
     Source source = new JavaIterator(elementMap.keys.toSet()).next();
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       _sdkAnalysisContext.recordLibraryElements(elementMap);
     } else {
       super.recordLibraryElements(elementMap);
     }
   }
   CompilationUnit resolveCompilationUnit(Source source, LibraryElement library) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.resolveCompilationUnit(source, library);
     } else {
       return super.resolveCompilationUnit(source, library);
     }
   }
   CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource) {
-    if (unitSource.isInSystemLibrary) {
+    if (unitSource.isInSystemLibrary()) {
       return _sdkAnalysisContext.resolveCompilationUnit2(unitSource, librarySource);
     } else {
       return super.resolveCompilationUnit2(unitSource, librarySource);
     }
   }
   HtmlUnit resolveHtmlUnit(Source unitSource) {
-    if (unitSource.isInSystemLibrary) {
+    if (unitSource.isInSystemLibrary()) {
       return _sdkAnalysisContext.resolveHtmlUnit(unitSource);
     } else {
       return super.resolveHtmlUnit(unitSource);
     }
   }
   void setContents(Source source, String contents) {
-    if (source.isInSystemLibrary) {
+    if (source.isInSystemLibrary()) {
       _sdkAnalysisContext.setContents(source, contents);
     } else {
       super.setContents(source, contents);
@@ -3716,7 +3723,7 @@
   }
 }
 /**
- * Instances of the class `InstrumentedAnalysisContextImpl` implement an[AnalysisContext analysis context] by recording instrumentation data and delegating to
+ * Instances of the class {@code InstrumentedAnalysisContextImpl} implement an{@link AnalysisContext analysis context} by recording instrumentation data and delegating to
  * another analysis context to do the non-instrumentation work.
  * @coverage dart.engine
  */
@@ -3742,7 +3749,7 @@
   InternalAnalysisContext _basis;
 
   /**
-   * Create a new [InstrumentedAnalysisContextImpl] which wraps a new[AnalysisContextImpl] as the basis context.
+   * Create a new {@link InstrumentedAnalysisContextImpl} which wraps a new{@link AnalysisContextImpl} as the basis context.
    */
   InstrumentedAnalysisContextImpl() {
     _jtd_constructor_183_impl();
@@ -3752,9 +3759,9 @@
   }
 
   /**
-   * Create a new [InstrumentedAnalysisContextImpl] with a specified basis context, aka the
+   * Create a new {@link InstrumentedAnalysisContextImpl} with a specified basis context, aka the
    * context to wrap and instrument.
-   * @param context some [InstrumentedAnalysisContext] to wrap and instrument
+   * @param context some {@link InstrumentedAnalysisContext} to wrap and instrument
    */
   InstrumentedAnalysisContextImpl.con1(InternalAnalysisContext context) {
     _jtd_constructor_184_impl(context);
@@ -3863,7 +3870,7 @@
   }
 
   /**
-   * @return the underlying [AnalysisContext].
+   * @return the underlying {@link AnalysisContext}.
    */
   AnalysisContext get basis => _basis;
   Element getElement(ElementLocation location) {
@@ -4188,7 +4195,7 @@
   }
 }
 /**
- * The interface `InternalAnalysisContext` defines additional behavior for an analysis context
+ * The interface {@code InternalAnalysisContext} defines additional behavior for an analysis context
  * that is required by internal users of the context.
  */
 abstract class InternalAnalysisContext implements AnalysisContext {
@@ -4246,7 +4253,7 @@
   void recordLibraryElements(Map<Source, LibraryElement> elementMap);
 }
 /**
- * Instances of the class `RecordingErrorListener` implement an error listener that will
+ * Instances of the class {@code RecordingErrorListener} implement an error listener that will
  * record the errors that are reported to it in a way that is appropriate for caching those errors
  * within an analysis context.
  * @coverage dart.engine
@@ -4254,7 +4261,7 @@
 class RecordingErrorListener implements AnalysisErrorListener {
 
   /**
-   * A HashMap of lists containing the errors that were collected, keyed by each [Source].
+   * A HashMap of lists containing the errors that were collected, keyed by each {@link Source}.
    */
   Map<Source, List<AnalysisError>> _errors = new Map<Source, List<AnalysisError>>();
 
@@ -4270,7 +4277,7 @@
 
   /**
    * Answer the errors collected by the listener.
-   * @return an array of errors (not `null`, contains no `null`s)
+   * @return an array of errors (not {@code null}, contains no {@code null}s)
    */
   List<AnalysisError> get errors {
     Iterable<MapEntry<Source, List<AnalysisError>>> entrySet = getMapEntrySet(_errors);
@@ -4286,10 +4293,10 @@
   }
 
   /**
-   * Answer the errors collected by the listener for some passed [Source].
-   * @param source some [Source] for which the caller wants the set of [AnalysisError]s
+   * Answer the errors collected by the listener for some passed {@link Source}.
+   * @param source some {@link Source} for which the caller wants the set of {@link AnalysisError}s
    * collected by this listener
-   * @return the errors collected by the listener for the passed [Source]
+   * @return the errors collected by the listener for the passed {@link Source}
    */
   List<AnalysisError> getErrors2(Source source) {
     List<AnalysisError> errorsForSource = _errors[source];
@@ -4310,7 +4317,7 @@
   }
 }
 /**
- * Instances of the class `ResolutionEraser` remove any resolution information from an AST
+ * Instances of the class {@code ResolutionEraser} remove any resolution information from an AST
  * structure when used to visit that structure.
  */
 class ResolutionEraser extends GeneralizingASTVisitor<Object> {
@@ -4381,7 +4388,7 @@
   }
 }
 /**
- * The interface `Logger` defines the behavior of objects that can be used to receive
+ * The interface {@code Logger} defines the behavior of objects that can be used to receive
  * information about errors within the analysis engine. Implementations usually write this
  * information to a file, but can also record the information for later use (such as during testing)
  * or even ignore the information.
@@ -4424,7 +4431,7 @@
   void logInformation2(String message, Exception exception);
 }
 /**
- * Implementation of [Logger] that does nothing.
+ * Implementation of {@link Logger} that does nothing.
  */
 class Logger_NullLogger implements Logger {
   void logError(String message) {
diff --git a/pkg/analyzer_experimental/lib/src/generated/error.dart b/pkg/analyzer_experimental/lib/src/generated/error.dart
index a330e1e..6061cb0 100644
--- a/pkg/analyzer_experimental/lib/src/generated/error.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/error.dart
@@ -6,7 +6,7 @@
 import 'ast.dart' show ASTNode;
 import 'scanner.dart' show Token;
 /**
- * Instances of the enumeration `ErrorSeverity` represent the severity of an [ErrorCode].
+ * Instances of the enumeration {@code ErrorSeverity} represent the severity of an {@link ErrorCode}.
  * @coverage dart.engine.error
  */
 class ErrorSeverity implements Comparable<ErrorSeverity> {
@@ -24,7 +24,7 @@
   static final ErrorSeverity SUGGESTION = new ErrorSeverity('SUGGESTION', 1, "S", "suggestion");
 
   /**
-   * The severity representing a warning. Warnings can become errors if the `-Werror` command
+   * The severity representing a warning. Warnings can become errors if the {@code -Werror} command
    * line flag is specified.
    */
   static final ErrorSeverity WARNING = new ErrorSeverity('WARNING', 2, "W", "warning");
@@ -84,7 +84,7 @@
   String toString() => name;
 }
 /**
- * Instances of the class `AnalysisErrorWithProperties`
+ * Instances of the class {@code AnalysisErrorWithProperties}
  */
 class AnalysisErrorWithProperties extends AnalysisError {
 
@@ -122,7 +122,7 @@
   Object getProperty(ErrorProperty property) => _propertyMap[property];
 
   /**
-   * Set the value of the given property to the given value. Using a value of `null` will
+   * Set the value of the given property to the given value. Using a value of {@code null} will
    * effectively remove the property from this error.
    * @param property the property whose value is to be returned
    * @param value the new value of the given property
@@ -132,7 +132,7 @@
   }
 }
 /**
- * Instances of the class `ErrorReporter` wrap an error listener with utility methods used to
+ * Instances of the class {@code ErrorReporter} wrap an error listener with utility methods used to
  * create the errors being reported.
  * @coverage dart.engine.error
  */
@@ -217,7 +217,7 @@
   }
 
   /**
-   * Set the source to be used when reporting errors. Setting the source to `null` will cause
+   * Set the source to be used when reporting errors. Setting the source to {@code null} will cause
    * the default source to be used.
    * @param source the source to be used when reporting errors
    */
@@ -226,7 +226,7 @@
   }
 }
 /**
- * Instances of the class `AnalysisError` represent an error discovered during the analysis of
+ * Instances of the class {@code AnalysisError} represent an error discovered during the analysis of
  * some Dart code.
  * @see AnalysisErrorListener
  * @coverage dart.engine.error
@@ -239,13 +239,13 @@
   static List<AnalysisError> NO_ERRORS = new List<AnalysisError>(0);
 
   /**
-   * A [Comparator] that sorts by the name of the file that the [AnalysisError] was
+   * A {@link Comparator} that sorts by the name of the file that the {@link AnalysisError} was
    * found.
    */
   static Comparator<AnalysisError> FILE_COMPARATOR = (AnalysisError o1, AnalysisError o2) => o1.source.shortName.compareTo(o2.source.shortName);
 
   /**
-   * A [Comparator] that sorts error codes first by their severity (errors first, warnings
+   * A {@link Comparator} that sorts error codes first by their severity (errors first, warnings
    * second), and then by the the error code type.
    */
   static Comparator<AnalysisError> ERROR_CODE_COMPARATOR = (AnalysisError o1, AnalysisError o2) {
@@ -273,7 +273,7 @@
   String _message;
 
   /**
-   * The source in which the error occurred, or `null` if unknown.
+   * The source in which the error occurred, or {@code null} if unknown.
    */
   Source _source;
 
@@ -350,7 +350,7 @@
   int get offset => _offset;
 
   /**
-   * Return the value of the given property, or `null` if the given property is not defined
+   * Return the value of the given property, or {@code null} if the given property is not defined
    * for this error.
    * @param property the property whose value is to be returned
    * @return the value of the given property
@@ -358,7 +358,7 @@
   Object getProperty(ErrorProperty property) => null;
 
   /**
-   * Return the source in which the error occurred, or `null` if unknown.
+   * Return the source in which the error occurred, or {@code null} if unknown.
    * @return the source in which the error occurred
    */
   Source get source => _source;
@@ -389,12 +389,12 @@
   }
 }
 /**
- * The enumeration `ErrorProperty` defines the properties that can be associated with an[AnalysisError].
+ * The enumeration {@code ErrorProperty} defines the properties that can be associated with an{@link AnalysisError}.
  */
 class ErrorProperty implements Comparable<ErrorProperty> {
 
   /**
-   * A property whose value is an array of [ExecutableElement executable elements] that should
+   * A property whose value is an array of {@link ExecutableElement executable elements} that should
    * be but are not implemented by a concrete class.
    */
   static final ErrorProperty UNIMPLEMENTED_METHODS = new ErrorProperty('UNIMPLEMENTED_METHODS', 0);
@@ -412,8 +412,8 @@
   String toString() => name;
 }
 /**
- * The interface `ErrorCode` defines the behavior common to objects representing error codes
- * associated with [AnalysisError analysis errors].
+ * The interface {@code ErrorCode} defines the behavior common to objects representing error codes
+ * associated with {@link AnalysisError analysis errors}.
  * @coverage dart.engine.error
  */
 abstract class ErrorCode {
@@ -437,7 +437,7 @@
   ErrorType get type;
 }
 /**
- * Instances of the enumeration `ErrorType` represent the type of an [ErrorCode].
+ * Instances of the enumeration {@code ErrorType} represent the type of an {@link ErrorCode}.
  * @coverage dart.engine.error
  */
 class ErrorType implements Comparable<ErrorType> {
@@ -501,7 +501,7 @@
   String toString() => name;
 }
 /**
- * The enumeration `CompileTimeErrorCode` defines the error codes used for compile time
+ * The enumeration {@code CompileTimeErrorCode} defines the error codes used for compile time
  * errors. The convention for this class is for the name of the error code to indicate the problem
  * that caused the error to be generated and for the error message to explain what is wrong and,
  * when appropriate, how the problem can be corrected.
@@ -523,10 +523,10 @@
    * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> is introduced
    * into the top level scope <i>L</i> by more than one import then:
    * <ol>
-   * * It is a static warning if <i>N</i> is used as a type annotation.
-   * * In checked mode, it is a dynamic error if <i>N</i> is used as a type annotation and
+   * <li>It is a static warning if <i>N</i> is used as a type annotation.
+   * <li>In checked mode, it is a dynamic error if <i>N</i> is used as a type annotation and
    * referenced during a subtype test.
-   * * Otherwise, it is a compile-time error.
+   * <li>Otherwise, it is a compile-time error.
    * </ol>
    * @param ambiguousElementName the name of the ambiguous element
    * @param firstLibraryName the name of the first library that the type is found
@@ -602,7 +602,7 @@
   /**
    * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
    * by a class that has a non-final instance variable.
-   *
+   * <p>
    * The above refers to both locally declared and inherited instance variables.
    */
   static final CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = new CompileTimeErrorCode('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 12, "Cannot define the 'const' constructor for a class with non-final fields");
@@ -611,7 +611,7 @@
    * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error if o is not
    * <b>null</b> and the interface of the class of <i>o</i> is not a subtype of the static type of
    * the field <i>v</i>.
-   *
+   * <p>
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    * @param initializerType the name of the type of the initializer expression
@@ -696,7 +696,7 @@
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
-   *
+   * <p>
    * 12.11.2 Const: If <i>e</i> is of the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
    * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
    * compile-time error if <i>T</i> is not a class accessible in the current scope, optionally
@@ -791,16 +791,16 @@
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
-   *
+   * <p>
    * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement int.
-   *
+   * <p>
    * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement double.
-   *
+   * <p>
    * 12.3 Numbers: It is a compile-time error for any type other than the types int and double to
    * attempt to extend or implement num.
-   *
+   * <p>
    * 12.4 Booleans: It is a compile-time error for a class to attempt to extend or implement bool.
-   *
+   * <p>
    * 12.5 Strings: It is a compile-time error for a class to attempt to extend or implement String.
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
@@ -809,7 +809,7 @@
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
-   *
+   * <p>
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    * @param requiredCount the maximum number of positional arguments
@@ -819,16 +819,16 @@
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
-   *
+   * <p>
    * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement int.
-   *
+   * <p>
    * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement double.
-   *
+   * <p>
    * 12.3 Numbers: It is a compile-time error for any type other than the types int and double to
    * attempt to extend or implement num.
-   *
+   * <p>
    * 12.4 Booleans: It is a compile-time error for a class to attempt to extend or implement bool.
-   *
+   * <p>
    * 12.5 Strings: It is a compile-time error for a class to attempt to extend or implement String.
    * @param typeName the name of the type that cannot be implemented
    * @see #EXTENDS_DISALLOWED_CLASS
@@ -886,7 +886,7 @@
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
-   *
+   * <p>
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
@@ -923,7 +923,7 @@
   /**
    * 7.6.1 Generative Constructors: Note that this is not in scope on the right hand side of an
    * initializer.
-   *
+   * <p>
    * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
    * initializer, in a factory constructor, or in a static method or variable initializer, or in the
    * initializer of an instance variable.
@@ -1076,10 +1076,10 @@
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
    * not a library declaration.
-   *
+   * <p>
    * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
    * not a library declaration.
-   *
+   * <p>
    * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
    * declaration.
    * @param uri the URI that is invalid
@@ -1090,7 +1090,7 @@
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
    * the innermost function in which <i>s<sub>b</sub></i> occurs.
-   *
+   * <p>
    * 13.14 Continue: It is a compile-time error if no such statement or case clause
    * <i>s<sub>E</sub></i> exists within the innermost function in which <i>s<sub>c</sub></i> occurs.
    * @param labelName the name of the unresolvable label
@@ -1100,7 +1100,7 @@
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
    * the innermost function in which <i>s<sub>b</sub></i> occurs.
-   *
+   * <p>
    * 13.14 Continue: It is a compile-time error if no such statement or case clause
    * <i>s<sub>E</sub></i> exists within the innermost function in which <i>s<sub>c</sub></i> occurs.
    * @param labelName the name of the unresolvable label
@@ -1231,7 +1231,7 @@
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
-   *
+   * <p>
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    * @param requiredCount the expected number of required arguments
@@ -1285,10 +1285,10 @@
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
-   *
+   * <p>
    * TODO(scheglov) review this later, there are no explicit "it is a compile-time error" in
    * specification. But it was added to the co19 and there is same error for factories.
-   *
+   * <p>
    * https://code.google.com/p/dart/issues/detail?id=954
    */
   static final CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = new CompileTimeErrorCode('RECURSIVE_CONSTRUCTOR_REDIRECT', 103, "Cycle in redirecting generative constructors");
@@ -1308,9 +1308,9 @@
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
    * superinterface of itself.
-   *
+   * <p>
    * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
-   *
+   * <p>
    * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a superclass of itself.
    * @param className the name of the class that implements itself recursively
    * @param strImplementsPath a string representation of the implements loop
@@ -1320,9 +1320,9 @@
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
    * superinterface of itself.
-   *
+   * <p>
    * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
-   *
+   * <p>
    * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a superclass of itself.
    * @param className the name of the class that implements itself recursively
    */
@@ -1331,9 +1331,9 @@
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
    * superinterface of itself.
-   *
+   * <p>
    * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
-   *
+   * <p>
    * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a superclass of itself.
    * @param className the name of the class that implements itself recursively
    */
@@ -1404,10 +1404,20 @@
   static final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode('SUPER_INITIALIZER_IN_OBJECT', 118, "");
 
   /**
+   * 12.11 Instance Creation: It is a compile-time error if a constructor of a non-generic type
+   * invoked by a new expression or a constant object expression is passed any type arguments.
+   * <p>
+   * 12.32 Type Cast: It is a compile-time error if <i>T</i> is a parameterized type of the form
+   * <i>G&lt;T<sub>1</sub>, &hellip;, T<sub>n</sub>&gt;</i> and <i>G</i> is not a generic type with
+   * <i>n</i> type parameters.
+   */
+  static final CompileTimeErrorCode TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS = new CompileTimeErrorCode('TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS', 119, "");
+
+  /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
    */
-  static final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode('UNDEFINED_CLASS', 119, "Undefined class '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode('UNDEFINED_CLASS', 120, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1415,7 +1425,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 120, "The class '%s' does not have a generative constructor '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 121, "The class '%s' does not have a generative constructor '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1423,7 +1433,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 121, "The class '%s' does not have a default generative constructor");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 122, "The class '%s' does not have a default generative constructor");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Each final instance
@@ -1431,49 +1441,49 @@
    * <i>k</i>'s initializer list unless it has already been initialized by one of the following
    * means:
    * <ol>
-   * * Initialization at the declaration of <i>f</i>.
-   * * Initialization by means of an initializing formal of <i>k</i>.
+   * <li>Initialization at the declaration of <i>f</i>.
+   * <li>Initialization by means of an initializing formal of <i>k</i>.
    * </ol>
    * or a compile-time error occurs.
    */
-  static final CompileTimeErrorCode UNINITIALIZED_FINAL_FIELD = new CompileTimeErrorCode('UNINITIALIZED_FINAL_FIELD', 122, "");
+  static final CompileTimeErrorCode UNINITIALIZED_FINAL_FIELD = new CompileTimeErrorCode('UNINITIALIZED_FINAL_FIELD', 123, "");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
    * must have a corresponding named parameter in the set {<i>p<sub>n+1</sub></i> ...
    * <i>p<sub>n+k</sub></i>} or a static warning occurs.
-   *
+   * <p>
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    * @param name the name of the requested named parameter
    */
-  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode('UNDEFINED_NAMED_PARAMETER', 123, "The named parameter '%s' is not defined");
+  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode('UNDEFINED_NAMED_PARAMETER', 124, "The named parameter '%s' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
    * not a library declaration.
-   *
+   * <p>
    * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
    * not a library declaration.
-   *
+   * <p>
    * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
    * declaration.
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode('URI_DOES_NOT_EXIST', 124, "Target of URI does not exist: '%s'");
+  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode('URI_DOES_NOT_EXIST', 125, "Target of URI does not exist: '%s'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
    * <i>x</i> involves string interpolation.
-   *
+   * <p>
    * 14.3 Parts: It is a compile-time error if <i>s</i> is not a compile-time constant, or if
    * <i>s</i> involves string interpolation.
-   *
+   * <p>
    * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
    * not a compile-time constant, or if <i>x</i> involves string interpolation.
    */
-  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode('URI_WITH_INTERPOLATION', 125, "URIs cannot use string interpolation");
+  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode('URI_WITH_INTERPOLATION', 126, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator \[\]= is
@@ -1485,33 +1495,33 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 126, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 127, "Operator '%s' should declare exactly %d parameter(s), but %d found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
    * 0 or 1.
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 127, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 128, "Operator '-' should declare 0 or 1 parameter, but %d found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
    * exactly one required formal parameter <i>p</i>.
    * @param numberOfParameters the number of parameters found in the setter
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 128, "Setters should declare exactly one parameter, %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 129, "Setters should declare exactly one parameter, %d found");
 
   /**
    * 12.11 Instance Creation: It is a compile-time error if a constructor of a generic type with
    * <i>n</i> type parameters invoked by a new expression or a constant object expression is passed
    * <i>m</i> type arguments where <i>m != n</i>.
-   *
+   * <p>
    * 12.31 Type Test: It is a compile-time error if <i>T</i> is a parameterized type of the form
    * <i>G&lt;T<sub>1</sub>, &hellip;, T<sub>n</sub>&gt;</i> and <i>G</i> is not a generic type with
    * <i>n</i> type parameters.
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new CompileTimeErrorCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 129, "");
-  static final List<CompileTimeErrorCode> values = [AMBIGUOUS_EXPORT, AMBIGUOUS_IMPORT, ARGUMENT_DEFINITION_TEST_NON_PARAMETER, BUILT_IN_IDENTIFIER_AS_TYPE, BUILT_IN_IDENTIFIER_AS_TYPE_NAME, BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME, BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME, CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, COMPILE_TIME_CONSTANT_RAISES_EXCEPTION, CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, CONST_CONSTRUCTOR_THROWS_EXCEPTION, CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, CONST_FORMAL_PARAMETER, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, CONST_INSTANCE_FIELD, CONST_EVAL_TYPE_BOOL, CONST_EVAL_TYPE_BOOL_NUM_STRING, CONST_EVAL_TYPE_INT, CONST_EVAL_TYPE_NUM, CONST_EVAL_THROWS_EXCEPTION, CONST_WITH_INVALID_TYPE_PARAMETERS, CONST_WITH_NON_CONST, CONST_WITH_NON_CONSTANT_ARGUMENT, CONST_WITH_NON_TYPE, CONST_WITH_TYPE_PARAMETERS, CONST_WITH_UNDEFINED_CONSTRUCTOR, CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, DUPLICATE_CONSTRUCTOR_DEFAULT, DUPLICATE_CONSTRUCTOR_NAME, DUPLICATE_DEFINITION, DUPLICATE_MEMBER_NAME, DUPLICATE_MEMBER_NAME_INSTANCE_STATIC, DUPLICATE_NAMED_ARGUMENT, EXPORT_INTERNAL_LIBRARY, EXPORT_OF_NON_LIBRARY, EXTENDS_NON_CLASS, EXTENDS_DISALLOWED_CLASS, EXTRA_POSITIONAL_ARGUMENTS, IMPLEMENTS_DISALLOWED_CLASS, FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, FINAL_INITIALIZED_MULTIPLE_TIMES, FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, GETTER_AND_METHOD_WITH_SAME_NAME, IMPLEMENTS_DYNAMIC, IMPLEMENTS_NON_CLASS, IMPLEMENTS_REPEATED, IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, IMPORT_INTERNAL_LIBRARY, IMPORT_OF_NON_LIBRARY, INCONSISTENT_CASE_EXPRESSION_TYPES, INITIALIZER_FOR_NON_EXISTANT_FIELD, INITIALIZER_FOR_STATIC_FIELD, INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, INITIALIZING_FORMAL_FOR_STATIC_FIELD, INVALID_CONSTANT, INVALID_CONSTRUCTOR_NAME, INVALID_FACTORY_NAME_NOT_A_CLASS, INVALID_OVERRIDE_DEFAULT_VALUE, INVALID_OVERRIDE_NAMED, INVALID_OVERRIDE_POSITIONAL, INVALID_OVERRIDE_REQUIRED, INVALID_REFERENCE_TO_THIS, INVALID_TYPE_ARGUMENT_FOR_KEY, INVALID_TYPE_ARGUMENT_IN_CONST_LIST, INVALID_TYPE_ARGUMENT_IN_CONST_MAP, INVALID_URI, LABEL_IN_OUTER_SCOPE, LABEL_UNDEFINED, MEMBER_WITH_CLASS_NAME, METHOD_AND_GETTER_WITH_SAME_NAME, MISSING_CONST_IN_LIST_LITERAL, MISSING_CONST_IN_MAP_LITERAL, MIXIN_DECLARES_CONSTRUCTOR, MIXIN_INHERITS_FROM_NOT_OBJECT, MIXIN_OF_NON_CLASS, MIXIN_REFERENCES_SUPER, MIXIN_WITH_NON_CLASS_SUPERCLASS, MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, MULTIPLE_SUPER_INITIALIZERS, NEW_WITH_INVALID_TYPE_PARAMETERS, NON_CONST_MAP_AS_EXPRESSION_STATEMENT, NON_CONSTANT_CASE_EXPRESSION, NON_CONSTANT_DEFAULT_VALUE, NON_CONSTANT_LIST_ELEMENT, NON_CONSTANT_MAP_KEY, NON_CONSTANT_MAP_VALUE, NON_CONSTANT_VALUE_IN_INITIALIZER, NOT_ENOUGH_REQUIRED_ARGUMENTS, NON_GENERATIVE_CONSTRUCTOR, OBJECT_CANNOT_EXTEND_ANOTHER_CLASS, OPTIONAL_PARAMETER_IN_OPERATOR, PART_OF_NON_PART, PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, PRIVATE_OPTIONAL_PARAMETER, RECURSIVE_COMPILE_TIME_CONSTANT, RECURSIVE_CONSTRUCTOR_REDIRECT, RECURSIVE_FACTORY_REDIRECT, RECURSIVE_FUNCTION_TYPE_ALIAS, RECURSIVE_INTERFACE_INHERITANCE, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS, REDIRECT_TO_NON_CONST_CONSTRUCTOR, REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER, RESERVED_WORD_AS_IDENTIFIER, RETHROW_OUTSIDE_CATCH, RETURN_IN_GENERATIVE_CONSTRUCTOR, STATIC_TOP_LEVEL_FUNCTION, STATIC_TOP_LEVEL_VARIABLE, SUPER_IN_INVALID_CONTEXT, SUPER_IN_REDIRECTING_CONSTRUCTOR, SUPER_INITIALIZER_IN_OBJECT, UNDEFINED_CLASS, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, UNINITIALIZED_FINAL_FIELD, UNDEFINED_NAMED_PARAMETER, URI_DOES_NOT_EXIST, URI_WITH_INTERPOLATION, WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, WRONG_NUMBER_OF_TYPE_ARGUMENTS];
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new CompileTimeErrorCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 130, "");
+  static final List<CompileTimeErrorCode> values = [AMBIGUOUS_EXPORT, AMBIGUOUS_IMPORT, ARGUMENT_DEFINITION_TEST_NON_PARAMETER, BUILT_IN_IDENTIFIER_AS_TYPE, BUILT_IN_IDENTIFIER_AS_TYPE_NAME, BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME, BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME, CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, COMPILE_TIME_CONSTANT_RAISES_EXCEPTION, CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, CONST_CONSTRUCTOR_THROWS_EXCEPTION, CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, CONST_FORMAL_PARAMETER, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, CONST_INSTANCE_FIELD, CONST_EVAL_TYPE_BOOL, CONST_EVAL_TYPE_BOOL_NUM_STRING, CONST_EVAL_TYPE_INT, CONST_EVAL_TYPE_NUM, CONST_EVAL_THROWS_EXCEPTION, CONST_WITH_INVALID_TYPE_PARAMETERS, CONST_WITH_NON_CONST, CONST_WITH_NON_CONSTANT_ARGUMENT, CONST_WITH_NON_TYPE, CONST_WITH_TYPE_PARAMETERS, CONST_WITH_UNDEFINED_CONSTRUCTOR, CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, DUPLICATE_CONSTRUCTOR_DEFAULT, DUPLICATE_CONSTRUCTOR_NAME, DUPLICATE_DEFINITION, DUPLICATE_MEMBER_NAME, DUPLICATE_MEMBER_NAME_INSTANCE_STATIC, DUPLICATE_NAMED_ARGUMENT, EXPORT_INTERNAL_LIBRARY, EXPORT_OF_NON_LIBRARY, EXTENDS_NON_CLASS, EXTENDS_DISALLOWED_CLASS, EXTRA_POSITIONAL_ARGUMENTS, IMPLEMENTS_DISALLOWED_CLASS, FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, FINAL_INITIALIZED_MULTIPLE_TIMES, FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, GETTER_AND_METHOD_WITH_SAME_NAME, IMPLEMENTS_DYNAMIC, IMPLEMENTS_NON_CLASS, IMPLEMENTS_REPEATED, IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, IMPORT_INTERNAL_LIBRARY, IMPORT_OF_NON_LIBRARY, INCONSISTENT_CASE_EXPRESSION_TYPES, INITIALIZER_FOR_NON_EXISTANT_FIELD, INITIALIZER_FOR_STATIC_FIELD, INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, INITIALIZING_FORMAL_FOR_STATIC_FIELD, INVALID_CONSTANT, INVALID_CONSTRUCTOR_NAME, INVALID_FACTORY_NAME_NOT_A_CLASS, INVALID_OVERRIDE_DEFAULT_VALUE, INVALID_OVERRIDE_NAMED, INVALID_OVERRIDE_POSITIONAL, INVALID_OVERRIDE_REQUIRED, INVALID_REFERENCE_TO_THIS, INVALID_TYPE_ARGUMENT_FOR_KEY, INVALID_TYPE_ARGUMENT_IN_CONST_LIST, INVALID_TYPE_ARGUMENT_IN_CONST_MAP, INVALID_URI, LABEL_IN_OUTER_SCOPE, LABEL_UNDEFINED, MEMBER_WITH_CLASS_NAME, METHOD_AND_GETTER_WITH_SAME_NAME, MISSING_CONST_IN_LIST_LITERAL, MISSING_CONST_IN_MAP_LITERAL, MIXIN_DECLARES_CONSTRUCTOR, MIXIN_INHERITS_FROM_NOT_OBJECT, MIXIN_OF_NON_CLASS, MIXIN_REFERENCES_SUPER, MIXIN_WITH_NON_CLASS_SUPERCLASS, MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, MULTIPLE_SUPER_INITIALIZERS, NEW_WITH_INVALID_TYPE_PARAMETERS, NON_CONST_MAP_AS_EXPRESSION_STATEMENT, NON_CONSTANT_CASE_EXPRESSION, NON_CONSTANT_DEFAULT_VALUE, NON_CONSTANT_LIST_ELEMENT, NON_CONSTANT_MAP_KEY, NON_CONSTANT_MAP_VALUE, NON_CONSTANT_VALUE_IN_INITIALIZER, NOT_ENOUGH_REQUIRED_ARGUMENTS, NON_GENERATIVE_CONSTRUCTOR, OBJECT_CANNOT_EXTEND_ANOTHER_CLASS, OPTIONAL_PARAMETER_IN_OPERATOR, PART_OF_NON_PART, PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, PRIVATE_OPTIONAL_PARAMETER, RECURSIVE_COMPILE_TIME_CONSTANT, RECURSIVE_CONSTRUCTOR_REDIRECT, RECURSIVE_FACTORY_REDIRECT, RECURSIVE_FUNCTION_TYPE_ALIAS, RECURSIVE_INTERFACE_INHERITANCE, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS, REDIRECT_TO_NON_CONST_CONSTRUCTOR, REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER, RESERVED_WORD_AS_IDENTIFIER, RETHROW_OUTSIDE_CATCH, RETURN_IN_GENERATIVE_CONSTRUCTOR, STATIC_TOP_LEVEL_FUNCTION, STATIC_TOP_LEVEL_VARIABLE, SUPER_IN_INVALID_CONTEXT, SUPER_IN_REDIRECTING_CONSTRUCTOR, SUPER_INITIALIZER_IN_OBJECT, TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS, UNDEFINED_CLASS, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, UNINITIALIZED_FINAL_FIELD, UNDEFINED_NAMED_PARAMETER, URI_DOES_NOT_EXIST, URI_WITH_INTERPOLATION, WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, WRONG_NUMBER_OF_TYPE_ARGUMENTS];
 
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
@@ -1539,7 +1549,7 @@
   String toString() => name;
 }
 /**
- * The enumeration `PubSuggestionCode` defines the suggestions used for reporting deviations
+ * The enumeration {@code PubSuggestionCode} defines the suggestions used for reporting deviations
  * from pub best practices. The convention for this class is for the name of the bad practice to
  * indicate the problem that caused the suggestion to be generated and for the message to explain
  * what is wrong and, when appropriate, how the situation can be corrected.
@@ -1549,7 +1559,7 @@
   /**
    * It is a bad practice for a source file in a package "lib" directory hierarchy to traverse
    * outside that directory hierarchy. For example, a source file in the "lib" directory should not
-   * contain a directive such as `import '../web/some.dart'` which references a file outside
+   * contain a directive such as {@code import '../web/some.dart'} which references a file outside
    * the lib directory.
    */
   static final PubSuggestionCode FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE = new PubSuggestionCode('FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE', 0, "A file in the 'lib' directory hierarchy should not reference a file outside that hierarchy");
@@ -1557,7 +1567,7 @@
   /**
    * It is a bad practice for a source file ouside a package "lib" directory hierarchy to traverse
    * into that directory hierarchy. For example, a source file in the "web" directory should not
-   * contain a directive such as `import '../lib/some.dart'` which references a file inside
+   * contain a directive such as {@code import '../lib/some.dart'} which references a file inside
    * the lib directory.
    */
   static final PubSuggestionCode FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE = new PubSuggestionCode('FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE', 1, "A file outside the 'lib' directory hierarchy should not reference a file inside that hierarchy. Use a package: reference instead.");
@@ -1565,7 +1575,7 @@
   /**
    * It is a bad practice for a package import to reference anything outside the given package, or
    * more generally, it is bad practice for a package import to contain a "..". For example, a
-   * source file should not contain a directive such as `import 'package:foo/../some.dart'`.
+   * source file should not contain a directive such as {@code import 'package:foo/../some.dart'}.
    */
   static final PubSuggestionCode PACKAGE_IMPORT_CONTAINS_DOT_DOT = new PubSuggestionCode('PACKAGE_IMPORT_CONTAINS_DOT_DOT', 2, "A package import should not contain '..'");
   static final List<PubSuggestionCode> values = [FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE, PACKAGE_IMPORT_CONTAINS_DOT_DOT];
@@ -1596,7 +1606,7 @@
   String toString() => name;
 }
 /**
- * The enumeration `StaticWarningCode` defines the error codes used for static warnings. The
+ * The enumeration {@code StaticWarningCode} defines the error codes used for static warnings. The
  * convention for this class is for the name of the error code to indicate the problem that caused
  * the error to be generated and for the error message to explain what is wrong and, when
  * appropriate, how the problem can be corrected.
@@ -1608,10 +1618,10 @@
    * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> is introduced
    * into the top level scope <i>L</i> by more than one import then:
    * <ol>
-   * * It is a static warning if <i>N</i> is used as a type annotation.
-   * * In checked mode, it is a dynamic error if <i>N</i> is used as a type annotation and
+   * <li>It is a static warning if <i>N</i> is used as a type annotation.
+   * <li>In checked mode, it is a dynamic error if <i>N</i> is used as a type annotation and
    * referenced during a subtype test.
-   * * Otherwise, it is a compile-time error.
+   * <li>Otherwise, it is a compile-time error.
    * </ol>
    * @param ambiguousTypeName the name of the ambiguous type
    * @param firstLibraryName the name of the first library that the type is found
@@ -1623,17 +1633,17 @@
    * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+
    * k</i> may not be assigned to the type of the corresponding formal parameter of the constructor
    * <i>T.id</i> (respectively <i>T</i>).
-   *
+   * <p>
    * 12.11.2 Const: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;=
    * n+ k</i> may not be assigned to the type of the corresponding formal parameter of the
    * constructor <i>T.id</i> (respectively <i>T</i>).
-   *
+   * <p>
    * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
    * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
    * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
-   *
+   * <p>
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub>, 1 &lt;= i &lt;= l</i>,
    * must have a corresponding named parameter in the set <i>{p<sub>n+1</sub>, &hellip;
    * p<sub>n+k</sub>}</i> or a static warning occurs. It is a static warning if
@@ -1764,7 +1774,7 @@
    * <i>e</i> proceeds as follows: First, the expression <i>e</i> is evaluated to an object
    * <i>o</i>. Then, the instance variable <i>v</i> of the object denoted by this is bound to
    * <i>o</i>.
-   *
+   * <p>
    * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
    * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
    * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
@@ -1803,7 +1813,7 @@
    * &hellip; m<sub>k</sub></i> with the same name <i>n</i> that would be inherited (because
    * identically named members existed in several superinterfaces) then at most one member is
    * inherited.
-   *
+   * <p>
    * If some but not all of the <i>m<sub>i</sub>, 1 &lt;= i &lt;= k</i>, are getters, or if some but
    * not all of the <i>m<sub>i</sub></i> are setters, none of the <i>m<sub>i</sub></i> are
    * inherited, and a static warning is issued.
@@ -1889,15 +1899,7 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 32, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
-   * instance member <i>m2</i>, the signature of <i>m2</i> explicitly specifies a default value for
-   * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
-   * for <i>p</i>.
-   */
-  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 33, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
+  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES', 32, "");
 
   /**
    * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
@@ -1908,7 +1910,7 @@
    * @param className the name of the class where the overridden setter is declared
    * @see #INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static final StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 34, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
+  static final StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 33, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1916,27 +1918,27 @@
    * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. If <i>S.m</i> exists, it is a static warning if the type
    * <i>F</i> of <i>S.m</i> may not be assigned to a function type.
    */
-  static final StaticWarningCode INVOCATION_OF_NON_FUNCTION = new StaticWarningCode('INVOCATION_OF_NON_FUNCTION', 35, "");
+  static final StaticWarningCode INVOCATION_OF_NON_FUNCTION = new StaticWarningCode('INVOCATION_OF_NON_FUNCTION', 34, "");
 
   /**
    * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
    * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
    * assigned to <i>S</i>.
    */
-  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = new StaticWarningCode('MISMATCHED_GETTER_AND_SETTER_TYPES', 36, "The parameter type for setter '%s' is %s which is not assignable to its getter (of type %s)");
+  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = new StaticWarningCode('MISMATCHED_GETTER_AND_SETTER_TYPES', 35, "The parameter type for setter '%s' is %s which is not assignable to its getter (of type %s)");
 
   /**
    * 12.11.1 New: It is a static warning if <i>q</i> is a constructor of an abstract class and
    * <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode('NEW_WITH_ABSTRACT_CLASS', 37, "Abstract classes cannot be created with a 'new' expression");
+  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode('NEW_WITH_ABSTRACT_CLASS', 36, "Abstract classes cannot be created with a 'new' expression");
 
   /**
    * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible in the current scope,
    * optionally followed by type arguments.
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode('NEW_WITH_NON_TYPE', 38, "The name '%s' is not a class");
+  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode('NEW_WITH_NON_TYPE', 37, "The name '%s' is not a class");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -1947,7 +1949,7 @@
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR', 39, "The class '%s' does not have a constructor '%s'");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR', 38, "The class '%s' does not have a constructor '%s'");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -1958,25 +1960,12 @@
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 40, "The class '%s' does not have a default constructor");
-
-  /**
-   * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
-   * of the form <b>super</b>() is added at the end of <i>k</i>'s initializer list, unless the
-   * enclosing class is class <i>Object</i>.
-   */
-  static final StaticWarningCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = new StaticWarningCode('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 41, "The class '%s' does not have a default constructor");
-
-  /**
-   * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
-   * default constructor C() : <b>super<b>() {}, unless <i>C</i> is class <i>Object</i>.
-   */
-  static final StaticWarningCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = new StaticWarningCode('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 42, "The class '%s' does not have a default constructor");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 39, "The class '%s' does not have a default constructor");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
    * abstract method.
-   *
+   * <p>
    * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
    * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
    * corresponding instance member <i>m</i>.
@@ -1998,12 +1987,12 @@
    * @param name fourth member name
    * @param additionalCount the number of additional missing members that aren't listed
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 43, "Missing inherited members: %s'%s.%s', %s'%s.%s', %s'%s.%s', %s'%s.%s' and %d more");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 40, "Missing inherited members: %s'%s.%s', %s'%s.%s', %s'%s.%s', %s'%s.%s' and %d more");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
    * abstract method.
-   *
+   * <p>
    * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
    * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
    * corresponding instance member <i>m</i>.
@@ -2024,12 +2013,12 @@
    * @param enclosingClass enclosing class of the fourth missing member
    * @param name fourth member name
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 44, "Missing inherited members: %s'%s.%s', %s'%s.%s', %s'%s.%s' and %s'%s.%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 41, "Missing inherited members: %s'%s.%s', %s'%s.%s', %s'%s.%s' and %s'%s.%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
    * abstract method.
-   *
+   * <p>
    * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
    * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
    * corresponding instance member <i>m</i>.
@@ -2037,12 +2026,12 @@
    * @param enclosingClass enclosing class of the missing member
    * @param name member name
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 45, "Missing inherited member %s'%s.%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 42, "Missing inherited member %s'%s.%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
    * abstract method.
-   *
+   * <p>
    * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
    * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
    * corresponding instance member <i>m</i>.
@@ -2059,12 +2048,12 @@
    * @param enclosingClass enclosing class of the third missing member
    * @param name third member name
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 46, "Missing inherited members: %s'%s.%s', %s'%s.%s' and %s'%s.%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 43, "Missing inherited members: %s'%s.%s', %s'%s.%s' and %s'%s.%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
    * abstract method.
-   *
+   * <p>
    * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
    * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
    * corresponding instance member <i>m</i>.
@@ -2077,7 +2066,7 @@
    * @param enclosingClass enclosing class of the second missing member
    * @param name second member name
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 47, "Missing inherited members: %s'%s.%s' and %s'%s.%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 44, "Missing inherited members: %s'%s.%s' and %s'%s.%s'");
 
   /**
    * 13.11 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>, p<sub>2</sub>) s</i> or
@@ -2086,38 +2075,38 @@
    * catch clause.
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode('NON_TYPE_IN_CATCH_CLAUSE', 48, "The name '%s' is not a type and cannot be used in an on-catch clause");
+  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode('NON_TYPE_IN_CATCH_CLAUSE', 45, "The name '%s' is not a type and cannot be used in an on-catch clause");
 
   /**
    * 7.1.1 Operators: It is a static warning if the return type of the user-declared operator \[\]= is
    * explicitly declared and not void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode('NON_VOID_RETURN_FOR_OPERATOR', 49, "The return type of the operator []= must be 'void'");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode('NON_VOID_RETURN_FOR_OPERATOR', 46, "The return type of the operator []= must be 'void'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter declares a return type other than void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode('NON_VOID_RETURN_FOR_SETTER', 50, "The return type of the setter must be 'void'");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode('NON_VOID_RETURN_FOR_SETTER', 47, "The return type of the setter must be 'void'");
 
   /**
-   * 15.1 Static Types: A type <i>T</i> is malformed iff: * <i>T</i> has the form <i>id</i> or the
+   * 15.1 Static Types: A type <i>T</i> is malformed iff: <li><i>T</i> has the form <i>id</i> or the
    * form <i>prefix.id</i>, and in the enclosing lexical scope, the name <i>id</i> (respectively
-   * <i>prefix.id</i>) does not denote a type. * <i>T</i> denotes a type variable in the
-   * enclosing lexical scope, but occurs in the signature or body of a static member. *
+   * <i>prefix.id</i>) does not denote a type.</li> <li><i>T</i> denotes a type variable in the
+   * enclosing lexical scope, but occurs in the signature or body of a static member.</li> <li>
    * <i>T</i> is a parameterized type of the form <i>G&lt;S<sub>1</sub>, .., S<sub>n</sub>&gt;</i>,
-   * and <i>G</i> is malformed.
-   *
+   * and <i>G</i> is malformed.</li></ul>
+   * <p>
    * Any use of a malformed type gives rise to a static warning.
    * @param nonTypeName the name that is not a type
    */
-  static final StaticWarningCode NOT_A_TYPE = new StaticWarningCode('NOT_A_TYPE', 51, "%s is not a type");
+  static final StaticWarningCode NOT_A_TYPE = new StaticWarningCode('NOT_A_TYPE', 48, "%s is not a type");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
    * @param requiredCount the expected number of required arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 52, "%d required argument(s) expected, but %d found");
+  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 49, "%d required argument(s) expected, but %d found");
 
   /**
    * 14.3 Parts: It is a static warning if the referenced part declaration <i>p</i> names a library
@@ -2125,7 +2114,7 @@
    * @param expectedLibraryName the name of expected library name
    * @param actualLibraryName the non-matching actual library name from the "part of" declaration
    */
-  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode('PART_OF_DIFFERENT_LIBRARY', 53, "Expected this library to be part of '%s', not '%s'");
+  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode('PART_OF_DIFFERENT_LIBRARY', 50, "Expected this library to be part of '%s', not '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -2133,7 +2122,7 @@
    * @param redirectedName the name of the redirected constructor
    * @param redirectingName the name of the redirecting constructor
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_FUNCTION_TYPE', 54, "The redirected constructor '%s' has incompatible parameters with '%s'");
+  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_FUNCTION_TYPE', 51, "The redirected constructor '%s' has incompatible parameters with '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -2141,62 +2130,62 @@
    * @param redirectedName the name of the redirected constructor return type
    * @param redirectingName the name of the redirecting constructor return type
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_RETURN_TYPE', 55, "The return type '%s' of the redirected constructor is not a subclass of '%s'");
+  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_RETURN_TYPE', 52, "The return type '%s' of the redirected constructor is not a subclass of '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode('REDIRECT_TO_MISSING_CONSTRUCTOR', 56, "The constructor '%s' could not be found in '%s'");
+  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode('REDIRECT_TO_MISSING_CONSTRUCTOR', 53, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode('REDIRECT_TO_NON_CLASS', 57, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode('REDIRECT_TO_NON_CLASS', 54, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 13.11 Return: Let <i>f</i> be the function immediately enclosing a return statement of the form
    * <i>return;</i> It is a static warning if both of the following conditions hold:
    * <ol>
-   * * <i>f</i> is not a generative constructor.
-   * * The return type of <i>f</i> may not be assigned to void.
+   * <li><i>f</i> is not a generative constructor.
+   * <li>The return type of <i>f</i> may not be assigned to void.
    * </ol>
    */
-  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode('RETURN_WITHOUT_VALUE', 58, "Missing return value after 'return'");
+  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode('RETURN_WITHOUT_VALUE', 55, "Missing return value after 'return'");
 
   /**
    * 12.15.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
    * or getter <i>m</i>.
    * @param memberName the name of the instance member
    */
-  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode('STATIC_ACCESS_TO_INSTANCE_MEMBER', 59, "Instance member '%s' cannot be accessed using static access");
+  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode('STATIC_ACCESS_TO_INSTANCE_MEMBER', 56, "Instance member '%s' cannot be accessed using static access");
 
   /**
    * 13.9 Switch: It is a static warning if the type of <i>e</i> may not be assigned to the type of
    * <i>e<sub>k</sub></i>.
    */
-  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 60, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
+  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 57, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
 
   /**
    * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type available in the
    * current lexical scope.
    */
-  static final StaticWarningCode TYPE_TEST_NON_TYPE = new StaticWarningCode('TYPE_TEST_NON_TYPE', 61, "The name '%s' is not a type and cannot be used in an 'is' expression");
+  static final StaticWarningCode TYPE_TEST_NON_TYPE = new StaticWarningCode('TYPE_TEST_NON_TYPE', 58, "The name '%s' is not a type and cannot be used in an 'is' expression");
 
   /**
-   * 15.1 Static Types: A type <i>T</i> is malformed iff: * <i>T</i> has the form <i>id</i> or the
+   * 15.1 Static Types: A type <i>T</i> is malformed iff: <li><i>T</i> has the form <i>id</i> or the
    * form <i>prefix.id</i>, and in the enclosing lexical scope, the name <i>id</i> (respectively
-   * <i>prefix.id</i>) does not denote a type. * <i>T</i> denotes a type variable in the
-   * enclosing lexical scope, but occurs in the signature or body of a static member. *
+   * <i>prefix.id</i>) does not denote a type.</li> <li><i>T</i> denotes a type variable in the
+   * enclosing lexical scope, but occurs in the signature or body of a static member.</li> <li>
    * <i>T</i> is a parameterized type of the form <i>G&lt;S<sub>1</sub>, .., S<sub>n</sub>&gt;</i>,
-   * and <i>G</i> is malformed.
-   *
+   * and <i>G</i> is malformed.</li></ul>
+   * <p>
    * Any use of a malformed type gives rise to a static warning.
    */
-  static final StaticWarningCode TYPE_VARIABLE_IN_STATIC_SCOPE = new StaticWarningCode('TYPE_VARIABLE_IN_STATIC_SCOPE', 62, "");
+  static final StaticWarningCode TYPE_VARIABLE_IN_STATIC_SCOPE = new StaticWarningCode('TYPE_VARIABLE_IN_STATIC_SCOPE', 59, "");
 
   /**
    * 12.15.3 Static Invocation: A static method invocation <i>i</i> has the form
@@ -2204,12 +2193,12 @@
    * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a static warning if <i>C</i> does not denote a
    * class in the current scope.
    */
-  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode('UNDEFINED_CLASS', 63, "Undefined class '%s'");
+  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode('UNDEFINED_CLASS', 60, "Undefined class '%s'");
 
   /**
-   * Same as [UNDEFINED_CLASS], but to catch using "boolean" instead of "bool".
+   * Same as {@link #UNDEFINED_CLASS}, but to catch using "boolean" instead of "bool".
    */
-  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode('UNDEFINED_CLASS_BOOLEAN', 64, "Undefined class 'boolean'; did you mean 'bool'?");
+  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode('UNDEFINED_CLASS_BOOLEAN', 61, "Undefined class 'boolean'; did you mean 'bool'?");
 
   /**
    * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
@@ -2218,7 +2207,7 @@
    * @param getterName the name of the getter
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode('UNDEFINED_GETTER', 65, "There is no such getter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode('UNDEFINED_GETTER', 62, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
@@ -2226,7 +2215,7 @@
    * setter) or variable initializer and there is no declaration <i>d</i> with name <i>id</i> in the
    * lexical scope enclosing the expression.
    */
-  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode('UNDEFINED_IDENTIFIER', 66, "Undefined name '%s'");
+  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode('UNDEFINED_IDENTIFIER', 63, "Undefined name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -2234,21 +2223,21 @@
    * <i>p<sub>n+k</sub></i>} or a static warning occurs.
    * @param name the name of the requested named parameter
    */
-  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode('UNDEFINED_NAMED_PARAMETER', 67, "The named parameter '%s' is not defined");
+  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode('UNDEFINED_NAMED_PARAMETER', 64, "The named parameter '%s' is not defined");
 
   /**
    * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
    * inside a top level or static function (be it function, method, getter, or setter) or variable
    * initializer and there is no declaration <i>d</i> with name <i>v=</i> in the lexical scope
    * enclosing the assignment.
-   *
+   * <p>
    * 12.18 Assignment: It is a static warning if there is no class <i>C</i> in the enclosing lexical
    * scope of the assignment, or if <i>C</i> does not declare, implicitly or explicitly, a setter
    * <i>v=</i>.
    * @param setterName the name of the getter
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode('UNDEFINED_SETTER', 68, "There is no such setter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode('UNDEFINED_SETTER', 65, "There is no such setter '%s' in '%s'");
 
   /**
    * 12.15.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
@@ -2256,8 +2245,8 @@
    * @param methodName the name of the method
    * @param enclosingType the name of the enclosing type where the method is being looked for
    */
-  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode('UNDEFINED_STATIC_METHOD_OR_GETTER', 69, "There is no such static method '%s' in '%s'");
-  static final List<StaticWarningCode> values = [AMBIGUOUS_IMPORT, ARGUMENT_TYPE_NOT_ASSIGNABLE, ASSIGNMENT_TO_FINAL, CASE_BLOCK_NOT_TERMINATED, CAST_TO_NON_TYPE, COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE, COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE, COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR, COMMENT_REFERENCE_UNDECLARED_IDENTIFIER, COMMENT_REFERENCE_URI_NOT_LIBRARY, CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, CONST_WITH_ABSTRACT_CLASS, EQUAL_KEYS_IN_MAP, EXPORT_DUPLICATED_LIBRARY_NAME, EXTRA_POSITIONAL_ARGUMENTS, FIELD_INITIALIZER_NOT_ASSIGNABLE, FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, FINAL_NOT_INITIALIZED, IMPORT_DUPLICATED_LIBRARY_NAME, INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD, INCORRECT_NUMBER_OF_ARGUMENTS, INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, INVALID_FACTORY_NAME, INVALID_GETTER_OVERRIDE_RETURN_TYPE, INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE, INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, INVALID_METHOD_OVERRIDE_RETURN_TYPE, INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED, INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL, INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, INVOCATION_OF_NON_FUNCTION, MISMATCHED_GETTER_AND_SETTER_TYPES, NEW_WITH_ABSTRACT_CLASS, NEW_WITH_NON_TYPE, NEW_WITH_UNDEFINED_CONSTRUCTOR, NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, NON_TYPE_IN_CATCH_CLAUSE, NON_VOID_RETURN_FOR_OPERATOR, NON_VOID_RETURN_FOR_SETTER, NOT_A_TYPE, NOT_ENOUGH_REQUIRED_ARGUMENTS, PART_OF_DIFFERENT_LIBRARY, REDIRECT_TO_INVALID_FUNCTION_TYPE, REDIRECT_TO_INVALID_RETURN_TYPE, REDIRECT_TO_MISSING_CONSTRUCTOR, REDIRECT_TO_NON_CLASS, RETURN_WITHOUT_VALUE, STATIC_ACCESS_TO_INSTANCE_MEMBER, SWITCH_EXPRESSION_NOT_ASSIGNABLE, TYPE_TEST_NON_TYPE, TYPE_VARIABLE_IN_STATIC_SCOPE, UNDEFINED_CLASS, UNDEFINED_CLASS_BOOLEAN, UNDEFINED_GETTER, UNDEFINED_IDENTIFIER, UNDEFINED_NAMED_PARAMETER, UNDEFINED_SETTER, UNDEFINED_STATIC_METHOD_OR_GETTER];
+  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode('UNDEFINED_STATIC_METHOD_OR_GETTER', 66, "There is no such static method '%s' in '%s'");
+  static final List<StaticWarningCode> values = [AMBIGUOUS_IMPORT, ARGUMENT_TYPE_NOT_ASSIGNABLE, ASSIGNMENT_TO_FINAL, CASE_BLOCK_NOT_TERMINATED, CAST_TO_NON_TYPE, COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE, COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE, COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR, COMMENT_REFERENCE_UNDECLARED_IDENTIFIER, COMMENT_REFERENCE_URI_NOT_LIBRARY, CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, CONST_WITH_ABSTRACT_CLASS, EQUAL_KEYS_IN_MAP, EXPORT_DUPLICATED_LIBRARY_NAME, EXTRA_POSITIONAL_ARGUMENTS, FIELD_INITIALIZER_NOT_ASSIGNABLE, FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, FINAL_NOT_INITIALIZED, IMPORT_DUPLICATED_LIBRARY_NAME, INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD, INCORRECT_NUMBER_OF_ARGUMENTS, INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, INVALID_FACTORY_NAME, INVALID_GETTER_OVERRIDE_RETURN_TYPE, INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE, INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, INVALID_METHOD_OVERRIDE_RETURN_TYPE, INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES, INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, INVOCATION_OF_NON_FUNCTION, MISMATCHED_GETTER_AND_SETTER_TYPES, NEW_WITH_ABSTRACT_CLASS, NEW_WITH_NON_TYPE, NEW_WITH_UNDEFINED_CONSTRUCTOR, NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, NON_TYPE_IN_CATCH_CLAUSE, NON_VOID_RETURN_FOR_OPERATOR, NON_VOID_RETURN_FOR_SETTER, NOT_A_TYPE, NOT_ENOUGH_REQUIRED_ARGUMENTS, PART_OF_DIFFERENT_LIBRARY, REDIRECT_TO_INVALID_FUNCTION_TYPE, REDIRECT_TO_INVALID_RETURN_TYPE, REDIRECT_TO_MISSING_CONSTRUCTOR, REDIRECT_TO_NON_CLASS, RETURN_WITHOUT_VALUE, STATIC_ACCESS_TO_INSTANCE_MEMBER, SWITCH_EXPRESSION_NOT_ASSIGNABLE, TYPE_TEST_NON_TYPE, TYPE_VARIABLE_IN_STATIC_SCOPE, UNDEFINED_CLASS, UNDEFINED_CLASS_BOOLEAN, UNDEFINED_GETTER, UNDEFINED_IDENTIFIER, UNDEFINED_NAMED_PARAMETER, UNDEFINED_SETTER, UNDEFINED_STATIC_METHOD_OR_GETTER];
 
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
@@ -2285,7 +2274,7 @@
   String toString() => name;
 }
 /**
- * The interface `AnalysisErrorListener` defines the behavior of objects that listen for[AnalysisError analysis errors] being produced by the analysis engine.
+ * The interface {@code AnalysisErrorListener} defines the behavior of objects that listen for{@link AnalysisError analysis errors} being produced by the analysis engine.
  * @coverage dart.engine.error
  */
 abstract class AnalysisErrorListener {
@@ -2297,7 +2286,7 @@
 
   /**
    * This method is invoked when an error has been found by the analysis engine.
-   * @param error the error that was just found (not `null`)
+   * @param error the error that was just found (not {@code null})
    */
   void onError(AnalysisError error);
 }
@@ -2306,7 +2295,7 @@
   }
 }
 /**
- * The enumeration `HtmlWarningCode` defines the error codes used for warnings in HTML files.
+ * The enumeration {@code HtmlWarningCode} defines the error codes used for warnings in HTML files.
  * The convention for this class is for the name of the error code to indicate the problem that
  * caused the error to be generated and for the error message to explain what is wrong and, when
  * appropriate, how the problem can be corrected.
@@ -2355,7 +2344,7 @@
   String toString() => name;
 }
 /**
- * The enumeration `StaticTypeWarningCode` defines the error codes used for static type
+ * The enumeration {@code StaticTypeWarningCode} defines the error codes used for static type
  * warnings. The convention for this class is for the name of the error code to indicate the problem
  * that caused the error to be generated and for the error message to explain what is wrong and,
  * when appropriate, how the problem can be corrected.
@@ -2375,19 +2364,19 @@
    * &hellip; m<sub>k</sub></i> with the same name <i>n</i> that would be inherited (because
    * identically named members existed in several superinterfaces) then at most one member is
    * inherited.
-   *
+   * <p>
    * If the static types <i>T<sub>1</sub>, &hellip;, T<sub>k</sub></i> of the members
    * <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> are not identical, then there must be a member
    * <i>m<sub>x</sub></i> such that <i>T<sub>x</sub> &lt; T<sub>i</sub>, 1 &lt;= x &lt;= k</i> for
    * all <i>i, 1 &lt;= i &lt; k</i>, or a static type warning occurs. The member that is inherited
    * is <i>m<sub>x</sub></i>, if it exists; otherwise:
    * <ol>
-   * * If all of <i>m<sub>1</sub>, &hellip; m<sub>k</sub></i> have the same number <i>r</i> of
+   * <li>If all of <i>m<sub>1</sub>, &hellip; m<sub>k</sub></i> have the same number <i>r</i> of
    * required parameters and the same set of named parameters <i>s</i>, then let <i>h = max(
    * numberOfOptionalPositionals( m<sub>i</sub> ) ), 1 &lt;= i &lt;= k</i>. <i>I</i> has a method
    * named <i>n</i>, with <i>r</i> required parameters of type dynamic, <i>h</i> optional positional
    * parameters of type dynamic, named parameters <i>s</i> of type dynamic and return type dynamic.
-   * * Otherwise none of the members <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> is inherited.
+   * <li>Otherwise none of the members <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> is inherited.
    * </ol>
    */
   static final StaticTypeWarningCode INCONSISTENT_METHOD_INHERITANCE = new StaticTypeWarningCode('INCONSISTENT_METHOD_INHERITANCE', 1, "'%s' is inherited by at least two interfaces inconsistently");
@@ -2396,11 +2385,11 @@
    * 12.18 Assignment: It is a static type warning if the static type of <i>e</i> may not be
    * assigned to the static type of <i>v</i>. The static type of the expression <i>v = e</i> is the
    * static type of <i>e</i>.
-   *
+   * <p>
    * 12.18 Assignment: It is a static type warning if the static type of <i>e</i> may not be
    * assigned to the static type of <i>C.v</i>. The static type of the expression <i>C.v = e</i> is
    * the static type of <i>e</i>.
-   *
+   * <p>
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
    * warning if the static type of <i>e<sub>2</sub></i> may not be assigned to <i>T</i>.
    * @param rhsTypeName the name of the right hand side type
@@ -2412,19 +2401,19 @@
    * 12.14.4 Function Expression Invocation: A function expression invocation <i>i</i> has the form
    * <i>e<sub>f</sub>(a<sub>1</sub>, &hellip; a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
    * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>, where <i>e<sub>f</sub></i> is an expression.
-   *
+   * <p>
    * It is a static type warning if the static type <i>F</i> of <i>e<sub>f</sub></i> may not be
    * assigned to a function type.
-   *
+   * <p>
    * 12.15.1 Ordinary Invocation: An ordinary method invocation <i>i</i> has the form
    * <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
    * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
-   *
+   * <p>
    * Let <i>T</i> be the static type of <i>o</i>. It is a static type warning if <i>T</i> does not
    * have an accessible instance member named <i>m</i>. If <i>T.m</i> exists, it is a static warning
    * if the type <i>F</i> of <i>T.m</i> may not be assigned to a function type. If <i>T.m</i> does
    * not exist, or if <i>F</i> is not a function type, the static type of <i>i</i> is dynamic.
-   *
+   * <p>
    * 12.15.3 Static Invocation: It is a static type warning if the type <i>F</i> of <i>C.m</i> may
    * not be assigned to a function type.
    * @param nonFunctionIdentifier the name of the identifier that is not a function type
@@ -2434,12 +2423,12 @@
   /**
    * 12.19 Conditional: It is a static type warning if the type of <i>e<sub>1</sub></i> may not be
    * assigned to bool.
-   *
+   * <p>
    * 13.5 If: It is a static type warning if the type of the expression <i>b</i> may not be assigned
    * to bool.
-   *
+   * <p>
    * 13.7 While: It is a static type warning if the type of <i>e</i> may not be assigned to bool.
-   *
+   * <p>
    * 13.8 Do: It is a static type warning if the type of <i>e</i> cannot be assigned to bool.
    */
   static final StaticTypeWarningCode NON_BOOL_CONDITION = new StaticTypeWarningCode('NON_BOOL_CONDITION', 4, "Conditions must have a static type of 'bool'");
@@ -2484,7 +2473,7 @@
 
   /**
    * 10 Generics: It is a static type warning if a type parameter is a supertype of its upper bound.
-   *
+   * <p>
    * 15.8 Parameterized Types: If <i>S</i> is the static type of a member <i>m</i> of <i>G</i>, then
    * the static type of the member <i>m</i> of <i>G&lt;A<sub>1</sub>, &hellip; A<sub>n</sub>&gt;</i>
    * is <i>\[A<sub>1</sub>, &hellip;, A<sub>n</sub>/T<sub>1</sub>, &hellip;, T<sub>n</sub>\]S</i>
@@ -2496,7 +2485,7 @@
   static final StaticTypeWarningCode TYPE_ARGUMENT_VIOLATES_BOUNDS = new StaticTypeWarningCode('TYPE_ARGUMENT_VIOLATES_BOUNDS', 10, "");
 
   /**
-   * Specification reference needed. This is equivalent to [UNDEFINED_METHOD], but for
+   * Specification reference needed. This is equivalent to {@link #UNDEFINED_METHOD}, but for
    * top-level functions.
    * @param methodName the name of the method that is undefined
    */
@@ -2523,11 +2512,11 @@
    * <i>e<sub>1</sub></i>\[<i>e<sub>2</sub></i>\] = <i>e<sub>3</sub></i> is equivalent to the
    * evaluation of the expression (a, i, e){a.\[\]=(i, e); return e;} (<i>e<sub>1</sub></i>,
    * <i>e<sub>2</sub></i>, <i>e<sub>2</sub></i>).
-   *
+   * <p>
    * 12.29 Assignable Expressions: An assignable expression of the form
    * <i>e<sub>1</sub></i>\[<i>e<sub>2</sub></i>\] is evaluated as a method invocation of the operator
    * method \[\] on <i>e<sub>1</sub></i> with argument <i>e<sub>2</sub></i>.
-   *
+   * <p>
    * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>. It is a static type
    * warning if <i>T</i> does not have an accessible instance member named <i>m</i>.
    * @param operator the name of the operator
diff --git a/pkg/analyzer_experimental/lib/src/generated/html.dart b/pkg/analyzer_experimental/lib/src/generated/html.dart
index c667f7b..02ca349 100644
--- a/pkg/analyzer_experimental/lib/src/generated/html.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/html.dart
@@ -10,7 +10,7 @@
 import 'element.dart' show HtmlElementImpl;
 import 'engine.dart' show AnalysisEngine;
 /**
- * Instances of the class `Token` represent a token that was scanned from the input. Each
+ * Instances of the class {@code Token} represent a token that was scanned from the input. Each
  * token knows which token follows it, acting as the head of a linked list of tokens.
  * @coverage dart.engine.html
  */
@@ -43,7 +43,7 @@
 
   /**
    * Initialize a newly created token.
-   * @param type the token type (not `null`)
+   * @param type the token type (not {@code null})
    * @param offset the offset from the beginning of the file to the first character in the token
    */
   Token.con1(TokenType type, int offset) {
@@ -55,9 +55,9 @@
 
   /**
    * Initialize a newly created token.
-   * @param type the token type (not `null`)
+   * @param type the token type (not {@code null})
    * @param offset the offset from the beginning of the file to the first character in the token
-   * @param value the lexeme represented by this token (not `null`)
+   * @param value the lexeme represented by this token (not {@code null})
    */
   Token.con2(TokenType type2, int offset2, String value2) {
     _jtd_constructor_156_impl(type2, offset2, value2);
@@ -84,7 +84,7 @@
 
   /**
    * Return the lexeme that represents this token.
-   * @return the lexeme (not `null`)
+   * @return the lexeme (not {@code null})
    */
   String get lexeme => _value;
 
@@ -108,17 +108,17 @@
 
   /**
    * Answer the token type for the receiver.
-   * @return the token type (not `null`)
+   * @return the token type (not {@code null})
    */
   TokenType get type => _type;
 
   /**
-   * Return `true` if this token is a synthetic token. A synthetic token is a token that was
+   * Return {@code true} if this token is a synthetic token. A synthetic token is a token that was
    * introduced by the parser in order to recover from an error in the code. Synthetic tokens always
-   * have a length of zero (`0`).
-   * @return `true` if this token is a synthetic token
+   * have a length of zero ({@code 0}).
+   * @return {@code true} if this token is a synthetic token
    */
-  bool get isSynthetic => length == 0;
+  bool isSynthetic() => length == 0;
 
   /**
    * Set the next token in the token stream to the given token. This has the side-effect of setting
@@ -142,13 +142,13 @@
   }
 }
 /**
- * Instances of `HtmlParseResult` hold the result of parsing an HTML file.
+ * Instances of {@code HtmlParseResult} hold the result of parsing an HTML file.
  * @coverage dart.engine.html
  */
 class HtmlParseResult extends HtmlScanResult {
 
   /**
-   * The unit containing the parsed information (not `null`).
+   * The unit containing the parsed information (not {@code null}).
    */
   HtmlUnit _unit;
   HtmlParseResult(int modificationTime, Token token, List<int> lineStarts, HtmlUnit unit) : super(modificationTime, token, lineStarts) {
@@ -157,15 +157,15 @@
 
   /**
    * Answer the unit generated by parsing the source
-   * @return the unit (not `null`)
+   * @return the unit (not {@code null})
    */
   HtmlUnit get htmlUnit => _unit;
 }
 /**
- * Instances of the class `RecursiveXmlVisitor` implement an XML visitor that will recursively
+ * Instances of the class {@code RecursiveXmlVisitor} implement an XML visitor that will recursively
  * visit all of the nodes in an XML structure. For example, using an instance of this class to visit
- * a [XmlTagNode] will also cause all of the contained [XmlAttributeNode]s and[XmlTagNode]s to be visited.
- *
+ * a {@link XmlTagNode} will also cause all of the contained {@link XmlAttributeNode}s and{@link XmlTagNode}s to be visited.
+ * <p>
  * Subclasses that override a visit method must either invoke the overridden visit method or must
  * explicitly ask the visited node to visit its children. Failure to do so will cause the children
  * of the visited node to not be visited.
@@ -186,13 +186,13 @@
   }
 }
 /**
- * The abstract class `XmlNode` defines behavior common to all XML/HTML nodes.
+ * The abstract class {@code XmlNode} defines behavior common to all XML/HTML nodes.
  * @coverage dart.engine.html
  */
 abstract class XmlNode {
 
   /**
-   * The parent of the node, or `null` if the node is the root of an AST structure.
+   * The parent of the node, or {@code null} if the node is the root of an AST structure.
    */
   XmlNode _parent;
 
@@ -205,13 +205,13 @@
 
   /**
    * Return the first token included in this node's source range.
-   * @return the first token or `null` if none
+   * @return the first token or {@code null} if none
    */
   Token get beginToken;
 
   /**
    * Return the offset of the character immediately following the last character of this node's
-   * source range. This is equivalent to `node.getOffset() + node.getLength()`. For an html
+   * source range. This is equivalent to {@code node.getOffset() + node.getLength()}. For an html
    * unit this will be equal to the length of the unit's source.
    * @return the offset of the character just past the node's source range
    */
@@ -219,7 +219,7 @@
 
   /**
    * Return the last token included in this node's source range.
-   * @return the last token or `null` if none
+   * @return the last token or {@code null} if none
    */
   Token get endToken;
 
@@ -251,11 +251,11 @@
   }
 
   /**
-   * Return this node's parent node, or `null` if this node is the root of an AST structure.
-   *
+   * Return this node's parent node, or {@code null} if this node is the root of an AST structure.
+   * <p>
    * Note that the relationship between an AST node and its parent node may change over the lifetime
    * of a node.
-   * @return the parent of this node, or `null` if none
+   * @return the parent of this node, or {@code null} if none
    */
   XmlNode get parent => _parent;
   String toString() {
@@ -353,7 +353,7 @@
   }
 }
 /**
- * Instances of the class `SimpleXmlVisitor` implement an AST visitor that will do nothing
+ * Instances of the class {@code SimpleXmlVisitor} implement an AST visitor that will do nothing
  * when visiting an AST node. It is intended to be a superclass for classes that use the visitor
  * pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a whole
  * structure) and that only need to visit a small number of node types.
@@ -364,7 +364,7 @@
   R visitXmlTagNode(XmlTagNode xmlTagNode) => null;
 }
 /**
- * The abstract class `AbstractScanner` implements a scanner for HTML code. Subclasses are
+ * The abstract class {@code AbstractScanner} implements a scanner for HTML code. Subclasses are
  * required to implement the interface used to access the characters being scanned.
  * @coverage dart.engine.html
  */
@@ -424,7 +424,7 @@
 
   /**
    * Answer the source being scanned.
-   * @return the source or `null` if undefined
+   * @return the source or {@code null} if undefined
    */
   Source get source => _source;
 
@@ -638,7 +638,7 @@
   }
 }
 /**
- * Instances of `HtmlScanResult` hold the result of scanning an HTML file.
+ * Instances of {@code HtmlScanResult} hold the result of scanning an HTML file.
  * @coverage dart.engine.html
  */
 class HtmlScanResult {
@@ -649,7 +649,7 @@
   int _modificationTime = 0;
 
   /**
-   * The first token in the token stream (not `null`).
+   * The first token in the token stream (not {@code null}).
    */
   Token _token;
 
@@ -665,7 +665,7 @@
 
   /**
    * Answer the line start information that was produced.
-   * @return an array of line starts (not `null`)
+   * @return an array of line starts (not {@code null})
    */
   List<int> get lineStarts => _lineStarts;
 
@@ -677,12 +677,12 @@
 
   /**
    * Answer the first token in the token stream.
-   * @return the token (not `null`)
+   * @return the token (not {@code null})
    */
   Token get token => _token;
 }
 /**
- * Instances of the class `StringScanner` implement a scanner that reads from a string. The
+ * Instances of the class {@code StringScanner} implement a scanner that reads from a string. The
  * scanning logic is in the superclass.
  * @coverage dart.engine.html
  */
@@ -733,7 +733,7 @@
   }
 }
 /**
- * Instances of the class `CharBufferScanner` implement a scanner that reads from a character
+ * Instances of the class {@code CharBufferScanner} implement a scanner that reads from a character
  * buffer. The scanning logic is in the superclass.
  * @coverage dart.engine.html
  */
@@ -781,7 +781,7 @@
   }
 }
 /**
- * Instances of the class `ToSourceVisitor` write a source representation of a visited XML
+ * Instances of the class {@code ToSourceVisitor} write a source representation of a visited XML
  * node (and all of it's children) to a writer.
  * @coverage dart.engine.html
  */
@@ -853,7 +853,7 @@
   }
 }
 /**
- * The enumeration `TokenType` defines the types of tokens that can be returned by the
+ * The enumeration {@code TokenType} defines the types of tokens that can be returned by the
  * scanner.
  * @coverage dart.engine.html
  */
@@ -883,7 +883,7 @@
   final int ordinal;
 
   /**
-   * The lexeme that defines this type of token, or `null` if there is more than one possible
+   * The lexeme that defines this type of token, or {@code null} if there is more than one possible
    * lexeme for this type of token.
    */
   String _lexeme;
@@ -892,7 +892,7 @@
   }
 
   /**
-   * Return the lexeme that defines this type of token, or `null` if there is more than one
+   * Return the lexeme that defines this type of token, or {@code null} if there is more than one
    * possible lexeme for this type of token.
    * @return the lexeme that defines this type of token
    */
@@ -906,7 +906,7 @@
   String toString() => "-eof-";
 }
 /**
- * Instances of `XmlAttributeNode` represent name/value pairs owned by an [XmlTagNode].
+ * Instances of {@code XmlAttributeNode} represent name/value pairs owned by an {@link XmlTagNode}.
  * @coverage dart.engine.html
  */
 class XmlAttributeNode extends XmlNode {
@@ -916,10 +916,10 @@
 
   /**
    * Construct a new instance representing an XML attribute.
-   * @param name the name token (not `null`). This may be a zero length token if the attribute
+   * @param name the name token (not {@code null}). This may be a zero length token if the attribute
    * is badly formed.
-   * @param equals the equals sign or `null` if none
-   * @param value the value token (not `null`)
+   * @param equals the equals sign or {@code null} if none
+   * @param value the value token (not {@code null})
    */
   XmlAttributeNode(Token name, Token equals, Token value) {
     this._name = name;
@@ -931,20 +931,20 @@
   Token get endToken => _value;
 
   /**
-   * Answer the equals sign token that appears between the name and value tokens. This may be`null` if the attribute is badly formed.
-   * @return the token or `null` if there is no equals sign between the name and value
+   * Answer the equals sign token that appears between the name and value tokens. This may be{@code null} if the attribute is badly formed.
+   * @return the token or {@code null} if there is no equals sign between the name and value
    */
   Token get equals => _equals;
 
   /**
    * Answer the attribute name. This may be a zero length token if the attribute is badly formed.
-   * @return the name (not `null`)
+   * @return the name (not {@code null})
    */
   Token get name => _name;
 
   /**
    * Answer the lexeme for the value token without the leading and trailing quotes.
-   * @return the text or `null` if the value is not specified
+   * @return the text or {@code null} if the value is not specified
    */
   String get text {
     if (_value == null) {
@@ -973,14 +973,14 @@
   /**
    * Answer the attribute value. A properly formed value will start and end with matching quote
    * characters, but the value returned may not be properly formed.
-   * @return the value or `null` if this represents a badly formed attribute
+   * @return the value or {@code null} if this represents a badly formed attribute
    */
   Token get value => _value;
   void visitChildren(XmlVisitor<Object> visitor) {
   }
 }
 /**
- * The interface `XmlVisitor` defines the behavior of objects that can be used to visit an[XmlNode] structure.
+ * The interface {@code XmlVisitor} defines the behavior of objects that can be used to visit an{@link XmlNode} structure.
  * @coverage dart.engine.html
  */
 abstract class XmlVisitor<R> {
@@ -989,7 +989,7 @@
   R visitXmlTagNode(XmlTagNode xmlTagNode);
 }
 /**
- * Instances of `HtmlScanner` receive and scan HTML content from a [Source].<br/>
+ * Instances of {@code HtmlScanner} receive and scan HTML content from a {@link Source}.<br/>
  * For example, the following code scans HTML source and returns the result:
  * <pre>
  * HtmlScanner scanner = new HtmlScanner(source);
@@ -1002,7 +1002,7 @@
   List<String> _SCRIPT_TAG = <String> ["script"];
 
   /**
-   * The source being scanned (not `null`)
+   * The source being scanned (not {@code null})
    */
   Source _source;
 
@@ -1023,7 +1023,7 @@
 
   /**
    * Construct a new instance to scan the specified source.
-   * @param source the source to be scanned (not `null`)
+   * @param source the source to be scanned (not {@code null})
    */
   HtmlScanner(Source source) {
     this._source = source;
@@ -1043,13 +1043,13 @@
 
   /**
    * Answer the result of scanning the source
-   * @return the result (not `null`)
+   * @return the result (not {@code null})
    */
   HtmlScanResult get result => new HtmlScanResult(_modificationTime, _token, _scanner.lineStarts);
 }
 /**
- * Instances of the class `XmlParser` are used to parse tokens into a AST structure comprised
- * of [XmlNode]s.
+ * Instances of the class {@code XmlParser} are used to parse tokens into a AST structure comprised
+ * of {@link XmlNode}s.
  * @coverage dart.engine.html
  */
 class XmlParser {
@@ -1079,17 +1079,17 @@
   Source get source => _source;
 
   /**
-   * Answer `true` if the specified tag is self closing and thus should never have content or
+   * Answer {@code true} if the specified tag is self closing and thus should never have content or
    * child tag nodes.
-   * @param tag the tag (not `null`)
-   * @return `true` if self closing
+   * @param tag the tag (not {@code null})
+   * @return {@code true} if self closing
    */
   bool isSelfClosing(Token tag) => false;
 
   /**
    * Parse the entire token stream and in the process, advance the current token to the end of the
    * token stream.
-   * @return the list of tag nodes found (not `null`, contains no `null`)
+   * @return the list of tag nodes found (not {@code null}, contains no {@code null})
    */
   List<XmlTagNode> parseTopTagNodes(Token firstToken) {
     _currentToken = firstToken;
@@ -1119,8 +1119,8 @@
 
   /**
    * Insert a synthetic token of the specified type before the current token
-   * @param type the type of token to be inserted (not `null`)
-   * @return the synthetic token that was inserted (not `null`)
+   * @param type the type of token to be inserted (not {@code null})
+   * @return the synthetic token that was inserted (not {@code null})
    */
   Token insertSyntheticToken(TokenType type) {
     Token token = new Token.con2(type, _currentToken.offset, "");
@@ -1131,8 +1131,8 @@
 
   /**
    * Parse the token stream for an attribute. This method advances the current token over the
-   * attribute, but should not be called if the [currentToken] is not [TokenType#TAG].
-   * @return the attribute (not `null`)
+   * attribute, but should not be called if the {@link #currentToken} is not {@link TokenType#TAG}.
+   * @return the attribute (not {@code null})
    */
   XmlAttributeNode parseAttribute() {
     Token name = _currentToken;
@@ -1158,8 +1158,8 @@
 
   /**
    * Parse the stream for a sequence of attributes. This method advances the current token to the
-   * next [TokenType#GT], [TokenType#SLASH_GT], or [TokenType#EOF].
-   * @return a collection of zero or more attributes (not `null`, contains no `null`s)
+   * next {@link TokenType#GT}, {@link TokenType#SLASH_GT}, or {@link TokenType#EOF}.
+   * @return a collection of zero or more attributes (not {@code null}, contains no {@code null}s)
    */
   List<XmlAttributeNode> parseAttributes() {
     TokenType type = _currentToken.type;
@@ -1184,8 +1184,8 @@
 
   /**
    * Parse the stream for a sequence of tag nodes existing within a parent tag node. This method
-   * advances the current token to the next [TokenType#LT_SLASH] or [TokenType#EOF].
-   * @return a list of nodes (not `null`, contains no `null`s)
+   * advances the current token to the next {@link TokenType#LT_SLASH} or {@link TokenType#EOF}.
+   * @return a list of nodes (not {@code null}, contains no {@code null}s)
    */
   List<XmlTagNode> parseChildTagNodes() {
     TokenType type = _currentToken.type;
@@ -1212,8 +1212,8 @@
 
   /**
    * Parse the token stream for the next tag node. This method advances current token over the
-   * parsed tag node, but should only be called if the current token is [TokenType#LT]
-   * @return the tag node or `null` if none found
+   * parsed tag node, but should only be called if the current token is {@link TokenType#LT}
+   * @return the tag node or {@code null} if none found
    */
   XmlTagNode parseTagNode() {
     Token nodeStart = _currentToken;
@@ -1273,7 +1273,7 @@
   }
 }
 /**
- * Instances of `XmlTagNode` represent XML or HTML elements such as `` and`<body foo="bar"> ... </body>`.
+ * Instances of {@code XmlTagNode} represent XML or HTML elements such as {@code <p>} and{@code <body foo="bar"> ... </body>}.
  * @coverage dart.engine.html
  */
 class XmlTagNode extends XmlNode {
@@ -1289,75 +1289,75 @@
   static List<XmlTagNode> NO_TAG_NODES = new UnmodifiableListView(new List<XmlTagNode>());
 
   /**
-   * The starting [TokenType#LT] token (not `null`).
+   * The starting {@link TokenType#LT} token (not {@code null}).
    */
   Token _nodeStart;
 
   /**
-   * The [TokenType#TAG] token after the starting '&lt;' (not `null`).
+   * The {@link TokenType#TAG} token after the starting '&lt;' (not {@code null}).
    */
   Token _tag;
 
   /**
-   * The attributes contained by the receiver (not `null`, contains no `null`s).
+   * The attributes contained by the receiver (not {@code null}, contains no {@code null}s).
    */
   List<XmlAttributeNode> _attributes;
 
   /**
-   * The [TokenType#GT] or [TokenType#SLASH_GT] token after the attributes (not`null`). The token may be the same token as [nodeEnd] if there are no child[tagNodes].
+   * The {@link TokenType#GT} or {@link TokenType#SLASH_GT} token after the attributes (not{@code null}). The token may be the same token as {@link #nodeEnd} if there are no child{@link #tagNodes}.
    */
   Token _attributeEnd;
 
   /**
-   * The tag nodes contained in the receiver (not `null`, contains no `null`s).
+   * The tag nodes contained in the receiver (not {@code null}, contains no {@code null}s).
    */
   List<XmlTagNode> _tagNodes;
 
   /**
-   * The token (not `null`) after the content, which may be
-   *
-   * * (1) [TokenType#LT_SLASH] for nodes with open and close tags, or
-   * * (2) the [TokenType#LT] nodeStart of the next sibling node if this node is self
-   * closing or the attributeEnd is [TokenType#SLASH_GT], or
-   * * (3) [TokenType#EOF] if the node does not have a closing tag and is the last node in
-   * the stream [TokenType#LT_SLASH] token after the content, or `null` if there is no
-   * content and the attributes ended with [TokenType#SLASH_GT].
-   *
+   * The token (not {@code null}) after the content, which may be
+   * <ul>
+   * <li>(1) {@link TokenType#LT_SLASH} for nodes with open and close tags, or</li>
+   * <li>(2) the {@link TokenType#LT} nodeStart of the next sibling node if this node is self
+   * closing or the attributeEnd is {@link TokenType#SLASH_GT}, or</li>
+   * <li>(3) {@link TokenType#EOF} if the node does not have a closing tag and is the last node in
+   * the stream {@link TokenType#LT_SLASH} token after the content, or {@code null} if there is no
+   * content and the attributes ended with {@link TokenType#SLASH_GT}.</li>
+   * </ul>
    */
   Token _contentEnd;
 
   /**
-   * The closing [TokenType#TAG] after the child elements or `null` if there is no
-   * content and the attributes ended with [TokenType#SLASH_GT]
+   * The closing {@link TokenType#TAG} after the child elements or {@code null} if there is no
+   * content and the attributes ended with {@link TokenType#SLASH_GT}
    */
   Token _closingTag;
 
   /**
-   * The ending [TokenType#GT] or [TokenType#SLASH_GT] token (not `null`).
+   * The ending {@link TokenType#GT} or {@link TokenType#SLASH_GT} token (not {@code null}).
    */
   Token _nodeEnd;
 
   /**
    * Construct a new instance representing an XML or HTML element
-   * @param nodeStart the starting [TokenType#LT] token (not `null`)
-   * @param tag the [TokenType#TAG] token after the starting '&lt;' (not `null`).
-   * @param attributes the attributes associated with this element or [NO_ATTRIBUTES] (not`null`, contains no `null`s)
-   * @param attributeEnd The [TokenType#GT] or [TokenType#SLASH_GT] token after the
-   * attributes (not `null`). The token may be the same token as [nodeEnd] if
-   * there are no child [tagNodes].
-   * @param tagNodes child tag nodes of the receiver or [NO_TAG_NODES] (not `null`,
-   * contains no `null`s)
-   * @param contentEnd the token (not `null`) after the content, which may be
-   *
-   * * (1) [TokenType#LT_SLASH] for nodes with open and close tags, or
-   * * (2) the [TokenType#LT] nodeStart of the next sibling node if this node is
-   * self closing or the attributeEnd is [TokenType#SLASH_GT], or
-   * * (3) [TokenType#EOF] if the node does not have a closing tag and is the last
-   * node in the stream [TokenType#LT_SLASH] token after the content, or `null`if there is no content and the attributes ended with [TokenType#SLASH_GT].
-   *
-   * @param closingTag the closing [TokenType#TAG] after the child elements or `null` if
-   * there is no content and the attributes ended with [TokenType#SLASH_GT]
-   * @param nodeEnd the ending [TokenType#GT] or [TokenType#SLASH_GT] token (not`null`)
+   * @param nodeStart the starting {@link TokenType#LT} token (not {@code null})
+   * @param tag the {@link TokenType#TAG} token after the starting '&lt;' (not {@code null}).
+   * @param attributes the attributes associated with this element or {@link #NO_ATTRIBUTES} (not{@code null}, contains no {@code null}s)
+   * @param attributeEnd The {@link TokenType#GT} or {@link TokenType#SLASH_GT} token after the
+   * attributes (not {@code null}). The token may be the same token as {@link #nodeEnd} if
+   * there are no child {@link #tagNodes}.
+   * @param tagNodes child tag nodes of the receiver or {@link #NO_TAG_NODES} (not {@code null},
+   * contains no {@code null}s)
+   * @param contentEnd the token (not {@code null}) after the content, which may be
+   * <ul>
+   * <li>(1) {@link TokenType#LT_SLASH} for nodes with open and close tags, or</li>
+   * <li>(2) the {@link TokenType#LT} nodeStart of the next sibling node if this node is
+   * self closing or the attributeEnd is {@link TokenType#SLASH_GT}, or</li>
+   * <li>(3) {@link TokenType#EOF} if the node does not have a closing tag and is the last
+   * node in the stream {@link TokenType#LT_SLASH} token after the content, or {@code null}if there is no content and the attributes ended with {@link TokenType#SLASH_GT}.</li>
+   * </ul>
+   * @param closingTag the closing {@link TokenType#TAG} after the child elements or {@code null} if
+   * there is no content and the attributes ended with {@link TokenType#SLASH_GT}
+   * @param nodeEnd the ending {@link TokenType#GT} or {@link TokenType#SLASH_GT} token (not{@code null})
    */
   XmlTagNode(Token nodeStart, Token tag, List<XmlAttributeNode> attributes, Token attributeEnd, List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag, Token nodeEnd) {
     this._nodeStart = nodeStart;
@@ -1374,7 +1374,7 @@
   /**
    * Answer the attribute with the specified name.
    * @param name the attribute name
-   * @return the attribute or `null` if no matching attribute is found
+   * @return the attribute or {@code null} if no matching attribute is found
    */
   XmlAttributeNode getAttribute(String name2) {
     for (XmlAttributeNode attribute in _attributes) {
@@ -1386,23 +1386,23 @@
   }
 
   /**
-   * The [TokenType#GT] or [TokenType#SLASH_GT] token after the attributes (not`null`). The token may be the same token as [nodeEnd] if there are no child[tagNodes].
-   * @return the token (not `null`)
+   * The {@link TokenType#GT} or {@link TokenType#SLASH_GT} token after the attributes (not{@code null}). The token may be the same token as {@link #nodeEnd} if there are no child{@link #tagNodes}.
+   * @return the token (not {@code null})
    */
   Token get attributeEnd => _attributeEnd;
 
   /**
    * Answer the receiver's attributes. Callers should not manipulate the returned list to edit the
    * AST structure.
-   * @return the attributes (not `null`, contains no `null`s)
+   * @return the attributes (not {@code null}, contains no {@code null}s)
    */
   List<XmlAttributeNode> get attributes => _attributes;
 
   /**
-   * Find the attribute with the given name (see [getAttribute] and answer the lexeme
-   * for the attribute's value token without the leading and trailing quotes (see[XmlAttributeNode#getText]).
+   * Find the attribute with the given name (see {@link #getAttribute(String)} and answer the lexeme
+   * for the attribute's value token without the leading and trailing quotes (see{@link XmlAttributeNode#getText()}).
    * @param name the attribute name
-   * @return the attribute text or `null` if no matching attribute is found
+   * @return the attribute text or {@code null} if no matching attribute is found
    */
   String getAttributeText(String name) {
     XmlAttributeNode attribute = getAttribute(name);
@@ -1411,17 +1411,17 @@
   Token get beginToken => _nodeStart;
 
   /**
-   * The the closing [TokenType#TAG] after the child elements or `null` if there is no
-   * content and the attributes ended with [TokenType#SLASH_GT]
-   * @return the closing tag or `null`
+   * The the closing {@link TokenType#TAG} after the child elements or {@code null} if there is no
+   * content and the attributes ended with {@link TokenType#SLASH_GT}
+   * @return the closing tag or {@code null}
    */
   Token get closingTag => _closingTag;
 
   /**
    * Answer a string representing the content contained in the receiver. This includes the textual
-   * representation of any child tag nodes ([getTagNodes]). Whitespace between '&lt;',
+   * representation of any child tag nodes ({@link #getTagNodes()}). Whitespace between '&lt;',
    * '&lt;/', and '>', '/>' is discarded, but all other whitespace is preserved.
-   * @return the content (not `null`)
+   * @return the content (not {@code null})
    */
   String get content {
     Token token = _attributeEnd.next;
@@ -1442,16 +1442,16 @@
   }
 
   /**
-   * Answer the token (not `null`) after the content, which may be
-   *
-   * * (1) [TokenType#LT_SLASH] for nodes with open and close tags, or
-   * * (2) the [TokenType#LT] nodeStart of the next sibling node if this node is self
-   * closing or the attributeEnd is [TokenType#SLASH_GT], or
-   * * (3) [TokenType#EOF] if the node does not have a closing tag and is the last node in
-   * the stream [TokenType#LT_SLASH] token after the content, or `null` if there is no
-   * content and the attributes ended with [TokenType#SLASH_GT].
-   *
-   * @return the token (not `null`)
+   * Answer the token (not {@code null}) after the content, which may be
+   * <ul>
+   * <li>(1) {@link TokenType#LT_SLASH} for nodes with open and close tags, or</li>
+   * <li>(2) the {@link TokenType#LT} nodeStart of the next sibling node if this node is self
+   * closing or the attributeEnd is {@link TokenType#SLASH_GT}, or</li>
+   * <li>(3) {@link TokenType#EOF} if the node does not have a closing tag and is the last node in
+   * the stream {@link TokenType#LT_SLASH} token after the content, or {@code null} if there is no
+   * content and the attributes ended with {@link TokenType#SLASH_GT}.</li>
+   * </ul>
+   * @return the token (not {@code null})
    */
   Token get contentEnd => _contentEnd;
   Token get endToken {
@@ -1477,27 +1477,27 @@
   }
 
   /**
-   * Answer the ending [TokenType#GT] or [TokenType#SLASH_GT] token.
-   * @return the token (not `null`)
+   * Answer the ending {@link TokenType#GT} or {@link TokenType#SLASH_GT} token.
+   * @return the token (not {@code null})
    */
   Token get nodeEnd => _nodeEnd;
 
   /**
-   * Answer the starting [TokenType#LT] token.
-   * @return the token (not `null`)
+   * Answer the starting {@link TokenType#LT} token.
+   * @return the token (not {@code null})
    */
   Token get nodeStart => _nodeStart;
 
   /**
-   * Answer the [TokenType#TAG] token after the starting '&lt;'.
-   * @return the token (not `null`)
+   * Answer the {@link TokenType#TAG} token after the starting '&lt;'.
+   * @return the token (not {@code null})
    */
   Token get tag => _tag;
 
   /**
    * Answer the tag nodes contained in the receiver. Callers should not manipulate the returned list
    * to edit the AST structure.
-   * @return the children (not `null`, contains no `null`s)
+   * @return the children (not {@code null}, contains no {@code null}s)
    */
   List<XmlTagNode> get tagNodes => _tagNodes;
   void visitChildren(XmlVisitor<Object> visitor) {
@@ -1510,7 +1510,7 @@
   }
 
   /**
-   * Same as [becomeParentOf], but returns given "ifEmpty" if "children" is empty
+   * Same as {@link #becomeParentOf(List)}, but returns given "ifEmpty" if "children" is empty
    */
   List becomeParentOfEmpty(List children, List ifEmpty) {
     if (children != null && children.isEmpty) {
@@ -1520,8 +1520,8 @@
   }
 }
 /**
- * Instances of the class `HtmlParser` are used to parse tokens into a AST structure comprised
- * of [XmlNode]s.
+ * Instances of the class {@code HtmlParser} are used to parse tokens into a AST structure comprised
+ * of {@link XmlNode}s.
  * @coverage dart.engine.html
  */
 class HtmlParser extends XmlParser {
@@ -1536,8 +1536,8 @@
 
   /**
    * Parse the tokens specified by the given scan result.
-   * @param scanResult the result of scanning an HTML source (not `null`)
-   * @return the parse result (not `null`)
+   * @param scanResult the result of scanning an HTML source (not {@code null})
+   * @return the parse result (not {@code null})
    */
   HtmlParseResult parse(HtmlScanResult scanResult) {
     Token firstToken = scanResult.token;
@@ -1548,8 +1548,8 @@
 
   /**
    * Scan then parse the specified source.
-   * @param source the source to be scanned and parsed (not `null`)
-   * @return the parse result (not `null`)
+   * @param source the source to be scanned and parsed (not {@code null})
+   * @return the parse result (not {@code null})
    */
   HtmlParseResult parse2(Source source) {
     HtmlScanner scanner = new HtmlScanner(source);
@@ -1559,7 +1559,7 @@
   bool isSelfClosing(Token tag) => SELF_CLOSING.contains(tag.lexeme);
 }
 /**
- * Instances of the class `HtmlUnit` represent the contents of an HTML file.
+ * Instances of the class {@code HtmlUnit} represent the contents of an HTML file.
  * @coverage dart.engine.html
  */
 class HtmlUnit extends XmlNode {
@@ -1571,25 +1571,25 @@
 
   /**
    * The last token in the token stream that was parsed to form this compilation unit. This token
-   * should always have a type of [TokenType.EOF].
+   * should always have a type of {@link TokenType.EOF}.
    */
   Token _endToken;
 
   /**
-   * The tag nodes contained in the receiver (not `null`, contains no `null`s).
+   * The tag nodes contained in the receiver (not {@code null}, contains no {@code null}s).
    */
   List<XmlTagNode> _tagNodes;
 
   /**
-   * The element associated with this HTML unit or `null` if the receiver is not resolved.
+   * The element associated with this HTML unit or {@code null} if the receiver is not resolved.
    */
   HtmlElementImpl _element;
 
   /**
    * Construct a new instance representing the content of an HTML file.
-   * @param beginToken the first token in the file (not `null`)
-   * @param tagNodes child tag nodes of the receiver (not `null`, contains no `null`s)
-   * @param endToken the last token in the token stream which should be of type[TokenType.EOF]
+   * @param beginToken the first token in the file (not {@code null})
+   * @param tagNodes child tag nodes of the receiver (not {@code null}, contains no {@code null}s)
+   * @param endToken the last token in the token stream which should be of type{@link TokenType.EOF}
    */
   HtmlUnit(Token beginToken, List<XmlTagNode> tagNodes, Token endToken) {
     this._beginToken = beginToken;
@@ -1601,7 +1601,7 @@
 
   /**
    * Return the element associated with this HTML unit.
-   * @return the element or `null` if the receiver is not resolved
+   * @return the element or {@code null} if the receiver is not resolved
    */
   HtmlElementImpl get element => _element;
   Token get endToken => _endToken;
@@ -1609,7 +1609,7 @@
   /**
    * Answer the tag nodes contained in the receiver. Callers should not manipulate the returned list
    * to edit the AST structure.
-   * @return the children (not `null`, contains no `null`s)
+   * @return the children (not {@code null}, contains no {@code null}s)
    */
   List<XmlTagNode> get tagNodes => _tagNodes;
 
diff --git a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
index 7da792e..0f62806 100644
--- a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
@@ -3,17 +3,17 @@
 library engine.instrumentation;
 import 'java_core.dart';
 /**
- * The class `Instrumentation` implements support for logging instrumentation information.
- *
+ * The class {@code Instrumentation} implements support for logging instrumentation information.
+ * <p>
  * Instrumentation information consists of information about specific operations. Those operations
  * can range from user-facing operations, such as saving the changes to a file, to internal
- * operations, such as tokenizing source code. The information to be logged is gathered by[InstrumentationBuilder instrumentation builder], created by one of the static methods on
- * this class such as [builder] or [builder].
- *
- * Note, however, that until an instrumentation logger is installed using the method[setLogger], all instrumentation data will be lost.
- *
+ * operations, such as tokenizing source code. The information to be logged is gathered by{@link InstrumentationBuilder instrumentation builder}, created by one of the static methods on
+ * this class such as {@link #builder(Class)} or {@link #builder(String)}.
+ * <p>
+ * Note, however, that until an instrumentation logger is installed using the method{@link #setLogger(InstrumentationLogger)}, all instrumentation data will be lost.
+ * <p>
  * <b>Example</b>
- *
+ * <p>
  * To collect metrics about how long it took to save a file, you would write something like the
  * following:
  * <pre>
@@ -21,9 +21,9 @@
  * // save the file
  * instrumentation.metric("chars", fileLength).log();
  * </pre>
- * The `Instrumentation.builder` method creates a new [InstrumentationBuilderinstrumentation builder] and records the time at which it was created. The[InstrumentationBuilder#metric] appends the information specified by the
+ * The {@code Instrumentation.builder} method creates a new {@link InstrumentationBuilderinstrumentation builder} and records the time at which it was created. The{@link InstrumentationBuilder#metric(String,long)} appends the information specified by the
  * arguments and records the time at which the method is called so that the time to complete the
- * save operation can be calculated. The `log` method tells the builder that all of the data
+ * save operation can be calculated. The {@code log} method tells the builder that all of the data
  * has been collected and that the resulting information should be logged.
  * @coverage dart.engine.utilities
  */
@@ -47,15 +47,15 @@
 
   /**
    * Create a builder that can collect the data associated with an operation.
-   * @param clazz the class performing the operation (not `null`)
-   * @return the builder that was created (not `null`)
+   * @param clazz the class performing the operation (not {@code null})
+   * @return the builder that was created (not {@code null})
    */
   static InstrumentationBuilder builder(Type clazz) => _CURRENT_LOGGER.createBuilder(clazz.toString());
 
   /**
    * Create a builder that can collect the data associated with an operation.
-   * @param name the name used to uniquely identify the operation (not `null`)
-   * @return the builder that was created (not `null`)
+   * @param name the name used to uniquely identify the operation (not {@code null})
+   * @return the builder that was created (not {@code null})
    */
   static InstrumentationBuilder builder2(String name) => _CURRENT_LOGGER.createBuilder(name);
 
@@ -66,7 +66,7 @@
 
   /**
    * Return a builder that will silently ignore all data and logging requests.
-   * @return the builder (not `null`)
+   * @return the builder (not {@code null})
    */
   static InstrumentationBuilder get nullBuilder => _NULL_INSTRUMENTATION_BUILDER;
 
@@ -75,7 +75,7 @@
    * it?
    * @return
    */
-  static bool get isNullLogger => identical(_CURRENT_LOGGER, _NULL_LOGGER);
+  static bool isNullLogger() => identical(_CURRENT_LOGGER, _NULL_LOGGER);
 
   /**
    * Set the logger that should receive instrumentation information to the given logger.
@@ -103,10 +103,10 @@
   InstrumentationBuilder createBuilder(String name) => Instrumentation._NULL_INSTRUMENTATION_BUILDER;
 }
 /**
- * The interface `InstrumentationBuilder` defines the behavior of objects used to collect data
+ * The interface {@code InstrumentationBuilder} defines the behavior of objects used to collect data
  * about an operation that has occurred and record that data through an instrumentation logger.
- *
- * For an example of using objects that implement this interface, see [Instrumentation].
+ * <p>
+ * For an example of using objects that implement this interface, see {@link Instrumentation}.
  * @coverage dart.engine.utilities
  */
 abstract class InstrumentationBuilder {
@@ -152,8 +152,8 @@
   InstrumentationBuilder data4(String name, List<String> value);
 
   /**
-   * Answer the [InstrumentationLevel] of this `InstrumentationBuilder`.
-   * @return one of [InstrumentationLevel#EVERYTHING], [InstrumentationLevel#METRICS],[InstrumentationLevel#OFF]
+   * Answer the {@link InstrumentationLevel} of this {@code InstrumentationBuilder}.
+   * @return one of {@link InstrumentationLevel#EVERYTHING}, {@link InstrumentationLevel#METRICS},{@link InstrumentationLevel#OFF}
    */
   InstrumentationLevel get instrumentationLevel;
 
@@ -206,17 +206,17 @@
 
   /**
    * Append the given exception to the information being collected by this builder. The exception's
-   * class name is captured using [metric]. Other aspects of the exception
+   * class name is captured using {@link #metric(String,String)}. Other aspects of the exception
    * may contain either user identifiable or contains user intellectual property (but is not
-   * guaranteed to contain either) and thus are captured using the various data methods such as[data].
-   * @param exception the exception (may be `null`)
+   * guaranteed to contain either) and thus are captured using the various data methods such as{@link #data(String,String)}.
+   * @param exception the exception (may be {@code null})
    */
   InstrumentationBuilder record(Exception exception);
 }
 /**
- * The instrumentation recording level representing (1) recording [EVERYTHING] recording of
- * all instrumentation data, (2) recording only [METRICS] information, or (3) recording
- * turned [OFF] in which case nothing is recorded.
+ * The instrumentation recording level representing (1) recording {@link #EVERYTHING} recording of
+ * all instrumentation data, (2) recording only {@link #METRICS} information, or (3) recording
+ * turned {@link #OFF} in which case nothing is recorded.
  * @coverage dart.engine.utilities
  */
 class InstrumentationLevel implements Comparable<InstrumentationLevel> {
@@ -261,10 +261,10 @@
   String toString() => name;
 }
 /**
- * The interface `InstrumentationLogger` defines the behavior of objects that are used to log
+ * The interface {@code InstrumentationLogger} defines the behavior of objects that are used to log
  * instrumentation data.
- *
- * For an example of using objects that implement this interface, see [Instrumentation].
+ * <p>
+ * For an example of using objects that implement this interface, see {@link Instrumentation}.
  * @coverage dart.engine.utilities
  */
 abstract class InstrumentationLogger {
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_core.dart b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
index 01ffd5d..7e90245 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_core.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
@@ -154,16 +154,6 @@
       }
     });
   }
-  static int indexOf(String target, String str, int fromIndex) {
-    if (fromIndex > target.length) return -1;
-    if (fromIndex < 0) fromIndex = 0;
-    return target.indexOf(str, fromIndex);
-  }
-  static int lastIndexOf(String target, String str, int fromIndex) {
-    if (fromIndex > target.length) return -1;
-    if (fromIndex < 0) fromIndex = 0;
-    return target.lastIndexOf(str, fromIndex);
-  }
   static bool startsWithBefore(String s, String other, int start) {
     return s.indexOf(other, start) != -1;
   }
diff --git a/pkg/analyzer_experimental/lib/src/generated/parser.dart b/pkg/analyzer_experimental/lib/src/generated/parser.dart
index 32c04c8..bd5a1dc 100644
--- a/pkg/analyzer_experimental/lib/src/generated/parser.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/parser.dart
@@ -11,14 +11,14 @@
 import 'ast.dart';
 import 'utilities_dart.dart';
 /**
- * Instances of the class `CommentAndMetadata` implement a simple data-holder for a method
+ * Instances of the class {@code CommentAndMetadata} implement a simple data-holder for a method
  * that needs to return multiple values.
  * @coverage dart.engine.parser
  */
 class CommentAndMetadata {
 
   /**
-   * The documentation comment that was parsed, or `null` if none was given.
+   * The documentation comment that was parsed, or {@code null} if none was given.
    */
   Comment _comment;
 
@@ -38,7 +38,7 @@
   }
 
   /**
-   * Return the documentation comment that was parsed, or `null` if none was given.
+   * Return the documentation comment that was parsed, or {@code null} if none was given.
    * @return the documentation comment that was parsed
    */
   Comment get comment => _comment;
@@ -50,19 +50,19 @@
   List<Annotation> get metadata => _metadata;
 }
 /**
- * Instances of the class `FinalConstVarOrType` implement a simple data-holder for a method
+ * Instances of the class {@code FinalConstVarOrType} implement a simple data-holder for a method
  * that needs to return multiple values.
  * @coverage dart.engine.parser
  */
 class FinalConstVarOrType {
 
   /**
-   * The 'final', 'const' or 'var' keyword, or `null` if none was given.
+   * The 'final', 'const' or 'var' keyword, or {@code null} if none was given.
    */
   Token _keyword;
 
   /**
-   * The type, of `null` if no type was specified.
+   * The type, of {@code null} if no type was specified.
    */
   TypeName _type;
 
@@ -77,103 +77,103 @@
   }
 
   /**
-   * Return the 'final', 'const' or 'var' keyword, or `null` if none was given.
+   * Return the 'final', 'const' or 'var' keyword, or {@code null} if none was given.
    * @return the 'final', 'const' or 'var' keyword
    */
   Token get keyword => _keyword;
 
   /**
-   * Return the type, of `null` if no type was specified.
+   * Return the type, of {@code null} if no type was specified.
    * @return the type
    */
   TypeName get type => _type;
 }
 /**
- * Instances of the class `Modifiers` implement a simple data-holder for a method that needs
+ * Instances of the class {@code Modifiers} implement a simple data-holder for a method that needs
  * to return multiple values.
  * @coverage dart.engine.parser
  */
 class Modifiers {
 
   /**
-   * The token representing the keyword 'abstract', or `null` if the keyword was not found.
+   * The token representing the keyword 'abstract', or {@code null} if the keyword was not found.
    */
   Token _abstractKeyword;
 
   /**
-   * The token representing the keyword 'const', or `null` if the keyword was not found.
+   * The token representing the keyword 'const', or {@code null} if the keyword was not found.
    */
   Token _constKeyword;
 
   /**
-   * The token representing the keyword 'external', or `null` if the keyword was not found.
+   * The token representing the keyword 'external', or {@code null} if the keyword was not found.
    */
   Token _externalKeyword;
 
   /**
-   * The token representing the keyword 'factory', or `null` if the keyword was not found.
+   * The token representing the keyword 'factory', or {@code null} if the keyword was not found.
    */
   Token _factoryKeyword;
 
   /**
-   * The token representing the keyword 'final', or `null` if the keyword was not found.
+   * The token representing the keyword 'final', or {@code null} if the keyword was not found.
    */
   Token _finalKeyword;
 
   /**
-   * The token representing the keyword 'static', or `null` if the keyword was not found.
+   * The token representing the keyword 'static', or {@code null} if the keyword was not found.
    */
   Token _staticKeyword;
 
   /**
-   * The token representing the keyword 'var', or `null` if the keyword was not found.
+   * The token representing the keyword 'var', or {@code null} if the keyword was not found.
    */
   Token _varKeyword;
 
   /**
-   * Return the token representing the keyword 'abstract', or `null` if the keyword was not
+   * Return the token representing the keyword 'abstract', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'abstract'
    */
   Token get abstractKeyword => _abstractKeyword;
 
   /**
-   * Return the token representing the keyword 'const', or `null` if the keyword was not
+   * Return the token representing the keyword 'const', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'const'
    */
   Token get constKeyword => _constKeyword;
 
   /**
-   * Return the token representing the keyword 'external', or `null` if the keyword was not
+   * Return the token representing the keyword 'external', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'external'
    */
   Token get externalKeyword => _externalKeyword;
 
   /**
-   * Return the token representing the keyword 'factory', or `null` if the keyword was not
+   * Return the token representing the keyword 'factory', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'factory'
    */
   Token get factoryKeyword => _factoryKeyword;
 
   /**
-   * Return the token representing the keyword 'final', or `null` if the keyword was not
+   * Return the token representing the keyword 'final', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'final'
    */
   Token get finalKeyword => _finalKeyword;
 
   /**
-   * Return the token representing the keyword 'static', or `null` if the keyword was not
+   * Return the token representing the keyword 'static', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'static'
    */
   Token get staticKeyword => _staticKeyword;
 
   /**
-   * Return the token representing the keyword 'var', or `null` if the keyword was not found.
+   * Return the token representing the keyword 'var', or {@code null} if the keyword was not found.
    * @return the token representing the keyword 'var'
    */
   Token get varKeyword => _varKeyword;
@@ -246,12 +246,12 @@
   }
 
   /**
-   * If the given keyword is not `null`, append it to the given builder, prefixing it with a
+   * If the given keyword is not {@code null}, append it to the given builder, prefixing it with a
    * space if needed.
    * @param builder the builder to which the keyword will be appended
-   * @param needsSpace `true` if the keyword needs to be prefixed with a space
+   * @param needsSpace {@code true} if the keyword needs to be prefixed with a space
    * @param keyword the keyword to be appended
-   * @return `true` if subsequent keywords need to be prefixed with a space
+   * @return {@code true} if subsequent keywords need to be prefixed with a space
    */
   bool appendKeyword(JavaStringBuilder builder, bool needsSpace, Token keyword) {
     if (keyword != null) {
@@ -265,7 +265,7 @@
   }
 }
 /**
- * Instances of the class `Parser` are used to parse tokens into an AST structure.
+ * Instances of the class {@code Parser} are used to parse tokens into an AST structure.
  * @coverage dart.engine.parser
  */
 class Parser {
@@ -329,7 +329,7 @@
   /**
    * Parse an expression, starting with the given token.
    * @param token the first token of the expression
-   * @return the expression that was parsed, or `null` if the tokens do not represent a
+   * @return the expression that was parsed, or {@code null} if the tokens do not represent a
    * recognizable expression
    */
   Expression parseExpression(Token token) {
@@ -345,7 +345,7 @@
   /**
    * Parse a statement, starting with the given token.
    * @param token the first token of the statement
-   * @return the statement that was parsed, or `null` if the tokens do not represent a
+   * @return the statement that was parsed, or {@code null} if the tokens do not represent a
    * recognizable statement
    */
   Statement parseStatement(Token token) {
@@ -361,7 +361,7 @@
   /**
    * Parse a sequence of statements, starting with the given token.
    * @param token the first token of the sequence of statement
-   * @return the statements that were parsed, or `null` if the tokens do not represent a
+   * @return the statements that were parsed, or {@code null} if the tokens do not represent a
    * recognizable sequence of statements
    */
   List<Statement> parseStatements(Token token) {
@@ -450,10 +450,10 @@
   FunctionDeclaration convertToFunctionDeclaration(MethodDeclaration method) => new FunctionDeclaration.full(method.documentationComment, method.metadata, method.externalKeyword, method.returnType, method.propertyKeyword, method.name, new FunctionExpression.full(method.parameters, method.body));
 
   /**
-   * Return `true` if the current token could be the start of a compilation unit member. This
+   * Return {@code true} if the current token could be the start of a compilation unit member. This
    * method is used for recovery purposes to decide when to stop skipping tokens after finding an
    * error while parsing a compilation unit member.
-   * @return `true` if the current token could be the start of a compilation unit member
+   * @return {@code true} if the current token could be the start of a compilation unit member
    */
   bool couldBeStartOfCompilationUnitMember() {
     if ((matches(Keyword.IMPORT) || matches(Keyword.EXPORT) || matches(Keyword.LIBRARY) || matches(Keyword.PART)) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
@@ -517,7 +517,7 @@
    * @param expression the expression being checked
    */
   void ensureAssignable(Expression expression) {
-    if (expression != null && !expression.isAssignable) {
+    if (expression != null && !expression.isAssignable()) {
       reportError7(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, []);
     }
   }
@@ -556,7 +556,7 @@
 
   /**
    * Search the given list of ranges for a range that contains the given index. Return the range
-   * that was found, or `null` if none of the ranges contain the index.
+   * that was found, or {@code null} if none of the ranges contain the index.
    * @param ranges the ranges to be searched
    * @param index the index contained in the returned range
    * @return the range that was found
@@ -611,7 +611,7 @@
           index = end;
         }
       } else if (JavaString.startsWithBefore(comment, "[:", index)) {
-        int end = JavaString.indexOf(comment, ":]", index + 2);
+        int end = comment.indexOf(":]", index + 2);
         if (end < 0) {
           end = length;
         }
@@ -625,7 +625,7 @@
   }
 
   /**
-   * Return the end token associated with the given begin token, or `null` if either the given
+   * Return the end token associated with the given begin token, or {@code null} if either the given
    * token is not a begin token or it does not have an end token associated with it.
    * @param beginToken the token that is expected to have an end token associated with it
    * @return the end token associated with the begin token
@@ -638,11 +638,11 @@
   }
 
   /**
-   * Return `true` if the current token is the first token of a return type that is followed
+   * Return {@code true} if the current token is the first token of a return type that is followed
    * by an identifier, possibly followed by a list of type parameters, followed by a
    * left-parenthesis. This is used by parseTypeAlias to determine whether or not to parse a return
    * type.
-   * @return `true` if we can successfully parse the rest of a type alias if we first parse a
+   * @return {@code true} if we can successfully parse the rest of a type alias if we first parse a
    * return type.
    */
   bool hasReturnTypeInTypeAlias() {
@@ -654,8 +654,8 @@
   }
 
   /**
-   * Return `true` if the current token appears to be the beginning of a function declaration.
-   * @return `true` if the current token appears to be the beginning of a function declaration
+   * Return {@code true} if the current token appears to be the beginning of a function declaration.
+   * @return {@code true} if the current token appears to be the beginning of a function declaration
    */
   bool isFunctionDeclaration() {
     if (matches(Keyword.VOID)) {
@@ -676,9 +676,9 @@
   }
 
   /**
-   * Return `true` if the given token appears to be the beginning of a function expression.
+   * Return {@code true} if the given token appears to be the beginning of a function expression.
    * @param startToken the token that might be the start of a function expression
-   * @return `true` if the given token appears to be the beginning of a function expression
+   * @return {@code true} if the given token appears to be the beginning of a function expression
    */
   bool isFunctionExpression(Token startToken) {
     Token afterParameters = skipFormalParameterList(startToken);
@@ -689,14 +689,14 @@
   }
 
   /**
-   * Return `true` if the given character is a valid hexadecimal digit.
+   * Return {@code true} if the given character is a valid hexadecimal digit.
    * @param character the character being tested
-   * @return `true` if the character is a valid hexadecimal digit
+   * @return {@code true} if the character is a valid hexadecimal digit
    */
   bool isHexDigit(int character) => (0x30 <= character && character <= 0x39) || (0x41 <= character && character <= 0x46) || (0x61 <= character && character <= 0x66);
 
   /**
-   * Return `true` if the current token is the first token in an initialized variable
+   * Return {@code true} if the current token is the first token in an initialized variable
    * declaration rather than an expression. This method assumes that we have already skipped past
    * any metadata that might be associated with the declaration.
    * <pre>
@@ -714,7 +714,7 @@
    * initializedIdentifier ::=
    * identifier ('=' expression)?
    * </pre>
-   * @return `true` if the current token is the first token in an initialized variable
+   * @return {@code true} if the current token is the first token in an initialized variable
    * declaration
    */
   bool isInitializedVariableDeclaration() {
@@ -740,12 +740,12 @@
    * Given that we have just found bracketed text within a comment, look to see whether that text is
    * (a) followed by a parenthesized link address, (b) followed by a colon, or (c) followed by
    * optional whitespace and another square bracket.
-   *
+   * <p>
    * This method uses the syntax described by the <a
    * href="http://daringfireball.net/projects/markdown/syntax">markdown</a> project.
    * @param comment the comment text in which the bracketed text was found
    * @param rightIndex the index of the right bracket
-   * @return `true` if the bracketed text is followed by a link address
+   * @return {@code true} if the bracketed text is followed by a link address
    */
   bool isLinkText(String comment, int rightIndex) {
     int length = comment.length;
@@ -768,14 +768,14 @@
   }
 
   /**
-   * Return `true` if the given token appears to be the beginning of an operator declaration.
+   * Return {@code true} if the given token appears to be the beginning of an operator declaration.
    * @param startToken the token that might be the start of an operator declaration
-   * @return `true` if the given token appears to be the beginning of an operator declaration
+   * @return {@code true} if the given token appears to be the beginning of an operator declaration
    */
   bool isOperator(Token startToken) {
-    if (startToken.isOperator) {
+    if (startToken.isOperator()) {
       Token token = startToken.next;
-      while (token.isOperator) {
+      while (token.isOperator()) {
         token = token.next;
       }
       return matches4(token, TokenType.OPEN_PAREN);
@@ -784,8 +784,8 @@
   }
 
   /**
-   * Return `true` if the current token appears to be the beginning of a switch member.
-   * @return `true` if the current token appears to be the beginning of a switch member
+   * Return {@code true} if the current token appears to be the beginning of a switch member.
+   * @return {@code true} if the current token appears to be the beginning of a switch member
    */
   bool isSwitchMember() {
     Token token = _currentToken;
@@ -801,9 +801,9 @@
 
   /**
    * Compare the given tokens to find the token that appears first in the source being parsed. That
-   * is, return the left-most of all of the tokens. The arguments are allowed to be `null`.
-   * Return the token with the smallest offset, or `null` if there are no arguments or if all
-   * of the arguments are `null`.
+   * is, return the left-most of all of the tokens. The arguments are allowed to be {@code null}.
+   * Return the token with the smallest offset, or {@code null} if there are no arguments or if all
+   * of the arguments are {@code null}.
    * @param tokens the tokens being compared
    * @return the token with the smallest offset
    */
@@ -823,42 +823,42 @@
   }
 
   /**
-   * Return `true` if the current token matches the given keyword.
+   * Return {@code true} if the current token matches the given keyword.
    * @param keyword the keyword that can optionally appear in the current location
-   * @return `true` if the current token matches the given keyword
+   * @return {@code true} if the current token matches the given keyword
    */
   bool matches(Keyword keyword) => matches3(_currentToken, keyword);
 
   /**
-   * Return `true` if the current token matches the given identifier.
+   * Return {@code true} if the current token matches the given identifier.
    * @param identifier the identifier that can optionally appear in the current location
-   * @return `true` if the current token matches the given identifier
+   * @return {@code true} if the current token matches the given identifier
    */
   bool matches2(String identifier) => identical(_currentToken.type, TokenType.IDENTIFIER) && _currentToken.lexeme == identifier;
 
   /**
-   * Return `true` if the given token matches the given keyword.
+   * Return {@code true} if the given token matches the given keyword.
    * @param token the token being tested
    * @param keyword the keyword that is being tested for
-   * @return `true` if the given token matches the given keyword
+   * @return {@code true} if the given token matches the given keyword
    */
   bool matches3(Token token, Keyword keyword2) => identical(token.type, TokenType.KEYWORD) && identical(((token as KeywordToken)).keyword, keyword2);
 
   /**
-   * Return `true` if the given token has the given type.
+   * Return {@code true} if the given token has the given type.
    * @param token the token being tested
    * @param type the type of token that is being tested for
-   * @return `true` if the given token has the given type
+   * @return {@code true} if the given token has the given type
    */
   bool matches4(Token token, TokenType type2) => identical(token.type, type2);
 
   /**
-   * Return `true` if the current token has the given type. Note that this method, unlike
+   * Return {@code true} if the current token has the given type. Note that this method, unlike
    * other variants, will modify the token stream if possible to match a wider range of tokens. In
    * particular, if we are attempting to match a '>' and the next token is either a '>>' or '>>>',
-   * the token stream will be re-written and `true` will be returned.
+   * the token stream will be re-written and {@code true} will be returned.
    * @param type the type of token that can optionally appear in the current location
-   * @return `true` if the current token has the given type
+   * @return {@code true} if the current token has the given type
    */
   bool matches5(TokenType type2) {
     TokenType currentType = _currentToken.type;
@@ -901,10 +901,10 @@
   }
 
   /**
-   * Return `true` if the given token has any one of the given types.
+   * Return {@code true} if the given token has any one of the given types.
    * @param token the token being tested
    * @param types the types of token that are being tested for
-   * @return `true` if the given token has any of the given types
+   * @return {@code true} if the given token has any of the given types
    */
   bool matchesAny(Token token, List<TokenType> types) {
     TokenType actualType = token.type;
@@ -917,23 +917,23 @@
   }
 
   /**
-   * Return `true` if the current token is a valid identifier. Valid identifiers include
+   * Return {@code true} if the current token is a valid identifier. Valid identifiers include
    * built-in identifiers (pseudo-keywords).
-   * @return `true` if the current token is a valid identifier
+   * @return {@code true} if the current token is a valid identifier
    */
   bool matchesIdentifier() => matchesIdentifier2(_currentToken);
 
   /**
-   * Return `true` if the given token is a valid identifier. Valid identifiers include
+   * Return {@code true} if the given token is a valid identifier. Valid identifiers include
    * built-in identifiers (pseudo-keywords).
-   * @return `true` if the given token is a valid identifier
+   * @return {@code true} if the given token is a valid identifier
    */
-  bool matchesIdentifier2(Token token) => matches4(token, TokenType.IDENTIFIER) || (matches4(token, TokenType.KEYWORD) && ((token as KeywordToken)).keyword.isPseudoKeyword);
+  bool matchesIdentifier2(Token token) => matches4(token, TokenType.IDENTIFIER) || (matches4(token, TokenType.KEYWORD) && ((token as KeywordToken)).keyword.isPseudoKeyword());
 
   /**
-   * If the current token has the given type, then advance to the next token and return `true`. Otherwise, return `false` without advancing.
+   * If the current token has the given type, then advance to the next token and return {@code true}. Otherwise, return {@code false} without advancing.
    * @param type the type of token that can optionally appear in the current location
-   * @return `true` if the current token has the given type
+   * @return {@code true} if the current token has the given type
    */
   bool optional(TokenType type) {
     if (matches5(type)) {
@@ -954,12 +954,12 @@
    */
   Expression parseAdditiveExpression() {
     Expression expression;
-    if (matches(Keyword.SUPER) && _currentToken.next.type.isAdditiveOperator) {
+    if (matches(Keyword.SUPER) && _currentToken.next.type.isAdditiveOperator()) {
       expression = new SuperExpression.full(andAdvance);
     } else {
       expression = parseMultiplicativeExpression();
     }
-    while (_currentToken.type.isAdditiveOperator) {
+    while (_currentToken.type.isAdditiveOperator()) {
       Token operator = andAdvance;
       expression = new BinaryExpression.full(expression, operator, parseMultiplicativeExpression());
     }
@@ -1087,7 +1087,7 @@
    * | 'super' assignableSelector
    * | identifier
    * </pre>
-   * @param primaryAllowed `true` if the expression is allowed to be a primary without any
+   * @param primaryAllowed {@code true} if the expression is allowed to be a primary without any
    * assignable selector
    * @return the assignable expression that was parsed
    */
@@ -1136,7 +1136,7 @@
    * | '.' identifier
    * </pre>
    * @param prefix the expression preceding the selector
-   * @param optional `true` if the selector is optional
+   * @param optional {@code true} if the selector is optional
    * @return the assignable selector that was parsed
    */
   Expression parseAssignableSelector(Expression prefix, bool optional) {
@@ -1330,7 +1330,7 @@
         }
       }
     }
-    if (_currentToken.type.isAssignmentOperator) {
+    if (_currentToken.type.isAssignmentOperator()) {
       Token operator = andAdvance;
       ensureAssignable(expression);
       expression = new AssignmentExpression.full(expression, operator, parseExpressionWithoutCascade());
@@ -1345,7 +1345,7 @@
    * metadata 'abstract'? 'class' name typeParameterList? (extendsClause withClause?)? implementsClause? '{' classMembers '}'
    * </pre>
    * @param commentAndMetadata the metadata to be associated with the member
-   * @param abstractKeyword the token for the keyword 'abstract', or `null` if the keyword was
+   * @param abstractKeyword the token for the keyword 'abstract', or {@code null} if the keyword was
    * not given
    * @return the class declaration that was parsed
    */
@@ -1425,7 +1425,7 @@
    * | methodSignature functionBody
    * </pre>
    * @param className the name of the class containing the member being parsed
-   * @return the class member that was parsed, or `null` if what was found was not a valid
+   * @return the class member that was parsed, or {@code null} if what was found was not a valid
    * class member
    */
   ClassMember parseClassMember(String className) {
@@ -1533,7 +1533,7 @@
    * (metadata memberDefinition)
    * </pre>
    * @param className the name of the class whose members are being parsed
-   * @param closingBracket the closing bracket for the class, or `null` if the closing bracket
+   * @param closingBracket the closing bracket for the class, or {@code null} if the closing bracket
    * is missing
    * @return the list of class members that were parsed
    */
@@ -1664,7 +1664,7 @@
    * @param referenceSource the source occurring between the square brackets within a documentation
    * comment
    * @param sourceOffset the offset of the first character of the reference source
-   * @return the comment reference that was parsed, or `null` if no reference could be found
+   * @return the comment reference that was parsed, or {@code null} if no reference could be found
    */
   CommentReference parseCommentReference(String referenceSource, int sourceOffset) {
     if (referenceSource.length == 0) {
@@ -1729,7 +1729,7 @@
       while (leftIndex >= 0 && leftIndex + 1 < length) {
         List<int> range = findRange(codeBlockRanges, leftIndex);
         if (range == null) {
-          int rightIndex = JavaString.indexOf(comment, ']', leftIndex);
+          int rightIndex = comment.indexOf(']', leftIndex);
           if (rightIndex >= 0) {
             int firstChar = comment.codeUnitAt(leftIndex + 1);
             if (firstChar != 0x27 && firstChar != 0x22) {
@@ -1744,9 +1744,9 @@
           } else {
             rightIndex = leftIndex + 1;
           }
-          leftIndex = JavaString.indexOf(comment, '[', rightIndex);
+          leftIndex = comment.indexOf('[', rightIndex);
         } else {
-          leftIndex = JavaString.indexOf(comment, '[', range[1] + 1);
+          leftIndex = comment.indexOf('[', range[1] + 1);
         }
       }
     }
@@ -1755,7 +1755,7 @@
 
   /**
    * Parse a compilation unit.
-   *
+   * <p>
    * Specified:
    * <pre>
    * compilationUnit ::=
@@ -1861,7 +1861,7 @@
    * | variableDeclaration ';'
    * </pre>
    * @param commentAndMetadata the metadata to be associated with the member
-   * @return the compilation unit member that was parsed, or `null` if what was parsed could
+   * @return the compilation unit member that was parsed, or {@code null} if what was parsed could
    * not be represented as a compilation unit member
    */
   CompilationUnitMember parseCompilationUnitMember(CommentAndMetadata commentAndMetadata) {
@@ -2129,7 +2129,7 @@
    * multiLineComment?
    * | singleLineComment
    * </pre>
-   * @return the documentation comment that was parsed, or `null` if there was no comment
+   * @return the documentation comment that was parsed, or {@code null} if there was no comment
    */
   Comment parseDocumentationComment() {
     List<Token> commentTokens = new List<Token>();
@@ -2204,12 +2204,12 @@
    */
   Expression parseEqualityExpression() {
     Expression expression;
-    if (matches(Keyword.SUPER) && _currentToken.next.type.isEqualityOperator) {
+    if (matches(Keyword.SUPER) && _currentToken.next.type.isEqualityOperator()) {
       expression = new SuperExpression.full(andAdvance);
     } else {
       expression = parseRelationalExpression();
     }
-    while (_currentToken.type.isEqualityOperator) {
+    while (_currentToken.type.isEqualityOperator()) {
       Token operator = andAdvance;
       expression = new BinaryExpression.full(expression, operator, parseRelationalExpression());
     }
@@ -2261,7 +2261,7 @@
         tokenType = _currentToken.type;
       }
       return new CascadeExpression.full(expression, cascadeSections);
-    } else if (tokenType.isAssignmentOperator) {
+    } else if (tokenType.isAssignmentOperator()) {
       Token operator = andAdvance;
       ensureAssignable(expression);
       return new AssignmentExpression.full(expression, operator, parseExpression2());
@@ -2303,7 +2303,7 @@
       return parseRethrowExpression();
     }
     Expression expression = parseConditionalExpression();
-    if (_currentToken.type.isAssignmentOperator) {
+    if (_currentToken.type.isAssignmentOperator()) {
       Token operator = andAdvance;
       ensureAssignable(expression);
       expression = new AssignmentExpression.full(expression, operator, parseExpressionWithoutCascade());
@@ -2334,7 +2334,7 @@
    * | 'var'
    * | type
    * </pre>
-   * @param optional `true` if the keyword and type are optional
+   * @param optional {@code true} if the keyword and type are optional
    * @return the 'final', 'const', 'var' or type that was parsed
    */
   FinalConstVarOrType parseFinalConstVarOrType(bool optional) {
@@ -2358,7 +2358,7 @@
   }
 
   /**
-   * Parse a formal parameter. At most one of `isOptional` and `isNamed` can be`true`.
+   * Parse a formal parameter. At most one of {@code isOptional} and {@code isNamed} can be{@code true}.
    * <pre>
    * defaultFormalParameter ::=
    * normalFormalParameter ('=' expression)?
@@ -2603,9 +2603,9 @@
    * '=>' expression
    * | block
    * </pre>
-   * @param mayBeEmpty `true` if the function body is allowed to be empty
+   * @param mayBeEmpty {@code true} if the function body is allowed to be empty
    * @param emptyErrorCode the error code to report if function body expecte, but not found
-   * @param inExpression `true` if the function body is being parsed as part of an expression
+   * @param inExpression {@code true} if the function body is being parsed as part of an expression
    * and therefore does not have a terminating semicolon
    * @return the function body that was parsed
    */
@@ -2656,9 +2656,9 @@
    * </pre>
    * @param commentAndMetadata the documentation comment and metadata to be associated with the
    * declaration
-   * @param externalKeyword the 'external' keyword, or `null` if the function is not external
-   * @param returnType the return type, or `null` if there is no return type
-   * @param isStatement `true` if the function declaration is being parsed as a statement
+   * @param externalKeyword the 'external' keyword, or {@code null} if the function is not external
+   * @param returnType the return type, or {@code null} if there is no return type
+   * @param isStatement {@code true} if the function declaration is being parsed as a statement
    * @return the function declaration that was parsed
    */
   FunctionDeclaration parseFunctionDeclaration(CommentAndMetadata commentAndMetadata, Token externalKeyword, TypeName returnType) {
@@ -2710,7 +2710,7 @@
    * </pre>
    * @param commentAndMetadata the documentation comment and metadata to be associated with the
    * declaration
-   * @param returnType the return type, or `null` if there is no return type
+   * @param returnType the return type, or {@code null} if there is no return type
    * @return the function declaration statement that was parsed
    */
   Statement parseFunctionDeclarationStatement2(CommentAndMetadata commentAndMetadata, TypeName returnType) => new FunctionDeclarationStatement.full(parseFunctionDeclaration(commentAndMetadata, null, returnType));
@@ -2778,8 +2778,8 @@
    * @param commentAndMetadata the documentation comment and metadata to be associated with the
    * declaration
    * @param externalKeyword the 'external' token
-   * @param staticKeyword the static keyword, or `null` if the getter is not static
-   * @param the return type that has already been parsed, or `null` if there was no return
+   * @param staticKeyword the static keyword, or {@code null} if the getter is not static
+   * @param the return type that has already been parsed, or {@code null} if there was no return
    * type
    * @return the getter that was parsed
    */
@@ -2893,10 +2893,10 @@
    * </pre>
    * @param commentAndMetadata the documentation comment and metadata to be associated with the
    * declaration
-   * @param staticKeyword the static keyword, or `null` if the getter is not static
-   * @param keyword the token representing the 'final', 'const' or 'var' keyword, or `null` if
+   * @param staticKeyword the static keyword, or {@code null} if the getter is not static
+   * @param keyword the token representing the 'final', 'const' or 'var' keyword, or {@code null} if
    * there is no keyword
-   * @param type the type that has already been parsed, or `null` if 'var' was provided
+   * @param type the type that has already been parsed, or {@code null} if 'var' was provided
    * @return the getter that was parsed
    */
   FieldDeclaration parseInitializedIdentifierList(CommentAndMetadata commentAndMetadata, Token staticKeyword, Token keyword, TypeName type) {
@@ -2984,9 +2984,9 @@
    * listLiteral ::=
    * 'const'? typeArguments? '\[' (expressionList ','?)? '\]'
    * </pre>
-   * @param modifier the 'const' modifier appearing before the literal, or `null` if there is
+   * @param modifier the 'const' modifier appearing before the literal, or {@code null} if there is
    * no modifier
-   * @param typeArguments the type arguments appearing before the literal, or `null` if there
+   * @param typeArguments the type arguments appearing before the literal, or {@code null} if there
    * are no type arguments
    * @return the list literal that was parsed
    */
@@ -3024,7 +3024,7 @@
    * listLiteral
    * | mapLiteral
    * </pre>
-   * @param modifier the 'const' modifier appearing before the literal, or `null` if there is
+   * @param modifier the 'const' modifier appearing before the literal, or {@code null} if there is
    * no modifier
    * @return the list or map literal that was parsed
    */
@@ -3082,9 +3082,9 @@
    * mapLiteral ::=
    * 'const'? typeArguments? '{' (mapLiteralEntry (',' mapLiteralEntry)* ','?)? '}'
    * </pre>
-   * @param modifier the 'const' modifier appearing before the literal, or `null` if there is
+   * @param modifier the 'const' modifier appearing before the literal, or {@code null} if there is
    * no modifier
-   * @param typeArguments the type arguments that were declared, or `null` if there are no
+   * @param typeArguments the type arguments that were declared, or {@code null} if there are no
    * type arguments
    * @return the map literal that was parsed
    */
@@ -3136,7 +3136,7 @@
    * @param commentAndMetadata the documentation comment and metadata to be associated with the
    * declaration
    * @param externalKeyword the 'external' token
-   * @param staticKeyword the static keyword, or `null` if the getter is not static
+   * @param staticKeyword the static keyword, or {@code null} if the getter is not static
    * @param returnType the return type of the method
    * @return the method declaration that was parsed
    */
@@ -3157,7 +3157,7 @@
    * @param commentAndMetadata the documentation comment and metadata to be associated with the
    * declaration
    * @param externalKeyword the 'external' token
-   * @param staticKeyword the static keyword, or `null` if the getter is not static
+   * @param staticKeyword the static keyword, or {@code null} if the getter is not static
    * @param returnType the return type of the method
    * @param name the name of the method
    * @param parameters the parameters to the method
@@ -3181,7 +3181,7 @@
    * Parse the modifiers preceding a declaration. This method allows the modifiers to appear in any
    * order but does generate errors for duplicated modifiers. Checks for other problems, such as
    * having the modifiers appear in the wrong order or specifying both 'const' and 'final', are
-   * reported in one of the methods whose name is prefixed with `validateModifiersFor`.
+   * reported in one of the methods whose name is prefixed with {@code validateModifiersFor}.
    * <pre>
    * modifiers ::=
    * ('abstract' | 'const' | 'external' | 'factory' | 'final' | 'static' | 'var')
@@ -3259,12 +3259,12 @@
    */
   Expression parseMultiplicativeExpression() {
     Expression expression;
-    if (matches(Keyword.SUPER) && _currentToken.next.type.isMultiplicativeOperator) {
+    if (matches(Keyword.SUPER) && _currentToken.next.type.isMultiplicativeOperator()) {
       expression = new SuperExpression.full(andAdvance);
     } else {
       expression = parseUnaryExpression();
     }
-    while (_currentToken.type.isMultiplicativeOperator) {
+    while (_currentToken.type.isMultiplicativeOperator()) {
       Token operator = andAdvance;
       expression = new BinaryExpression.full(expression, operator, parseUnaryExpression());
     }
@@ -3312,7 +3312,7 @@
         }
       }
       return parseBlock();
-    } else if (matches5(TokenType.KEYWORD) && !((_currentToken as KeywordToken)).keyword.isPseudoKeyword) {
+    } else if (matches5(TokenType.KEYWORD) && !((_currentToken as KeywordToken)).keyword.isPseudoKeyword()) {
       Keyword keyword = ((_currentToken as KeywordToken)).keyword;
       if (identical(keyword, Keyword.ASSERT)) {
         return parseAssertStatement();
@@ -3442,7 +3442,7 @@
    * @param commentAndMetadata the documentation comment and metadata to be associated with the
    * declaration
    * @param externalKeyword the 'external' token
-   * @param the return type that has already been parsed, or `null` if there was no return
+   * @param the return type that has already been parsed, or {@code null} if there was no return
    * type
    * @return the operator declaration that was parsed
    */
@@ -3454,7 +3454,7 @@
       reportError8(ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken, []);
       operatorKeyword = createSyntheticToken(Keyword.OPERATOR);
     }
-    if (!_currentToken.isUserDefinableOperator) {
+    if (!_currentToken.isUserDefinableOperator()) {
       reportError7(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
     }
     SimpleIdentifier name = new SimpleIdentifier.full(andAdvance);
@@ -3475,7 +3475,7 @@
   }
 
   /**
-   * Parse a return type if one is given, otherwise return `null` without advancing.
+   * Parse a return type if one is given, otherwise return {@code null} without advancing.
    * @return the return type that was parsed
    */
   TypeName parseOptionalReturnType() {
@@ -3543,7 +3543,7 @@
       } while (matches5(TokenType.OPEN_SQUARE_BRACKET) || matches5(TokenType.PERIOD) || matches5(TokenType.OPEN_PAREN));
       return operand;
     }
-    if (!_currentToken.type.isIncrementOperator) {
+    if (!_currentToken.type.isIncrementOperator()) {
       return operand;
     }
     if (operand is FunctionExpressionInvocation) {
@@ -3693,7 +3693,7 @@
    * @return the relational expression that was parsed
    */
   Expression parseRelationalExpression() {
-    if (matches(Keyword.SUPER) && _currentToken.next.type.isRelationalOperator) {
+    if (matches(Keyword.SUPER) && _currentToken.next.type.isRelationalOperator()) {
       Expression expression = new SuperExpression.full(andAdvance);
       Token operator = andAdvance;
       expression = new BinaryExpression.full(expression, operator, parseShiftExpression());
@@ -3710,7 +3710,7 @@
         notOperator = andAdvance;
       }
       expression = new IsExpression.full(expression, isOperator, notOperator, parseTypeName());
-    } else if (_currentToken.type.isRelationalOperator) {
+    } else if (_currentToken.type.isRelationalOperator()) {
       Token operator = andAdvance;
       expression = new BinaryExpression.full(expression, operator, parseShiftExpression());
     }
@@ -3773,8 +3773,8 @@
    * @param commentAndMetadata the documentation comment and metadata to be associated with the
    * declaration
    * @param externalKeyword the 'external' token
-   * @param staticKeyword the static keyword, or `null` if the setter is not static
-   * @param the return type that has already been parsed, or `null` if there was no return
+   * @param staticKeyword the static keyword, or {@code null} if the setter is not static
+   * @param the return type that has already been parsed, or {@code null} if there was no return
    * type
    * @return the setter that was parsed
    */
@@ -3801,12 +3801,12 @@
    */
   Expression parseShiftExpression() {
     Expression expression;
-    if (matches(Keyword.SUPER) && _currentToken.next.type.isShiftOperator) {
+    if (matches(Keyword.SUPER) && _currentToken.next.type.isShiftOperator()) {
       expression = new SuperExpression.full(andAdvance);
     } else {
       expression = parseAdditiveExpression();
     }
-    while (_currentToken.type.isShiftOperator) {
+    while (_currentToken.type.isShiftOperator()) {
       Token operator = andAdvance;
       expression = new BinaryExpression.full(expression, operator, parseAdditiveExpression());
     }
@@ -4256,7 +4256,7 @@
         return new PrefixExpression.full(operator, new SuperExpression.full(andAdvance));
       }
       return new PrefixExpression.full(operator, parseUnaryExpression());
-    } else if (_currentToken.type.isIncrementOperator) {
+    } else if (_currentToken.type.isIncrementOperator()) {
       Token operator = andAdvance;
       if (matches(Keyword.SUPER)) {
         if (matches4(peek(), TokenType.OPEN_SQUARE_BRACKET) || matches4(peek(), TokenType.PERIOD)) {
@@ -4323,8 +4323,8 @@
    * variableDeclarationList ::=
    * finalConstVarOrType variableDeclaration (',' variableDeclaration)
    * </pre>
-   * @param commentAndMetadata the metadata to be associated with the variable declaration list, or`null` if there is no attempt at parsing the comment and metadata
-   * @param keyword the token representing the 'final', 'const' or 'var' keyword, or `null` if
+   * @param commentAndMetadata the metadata to be associated with the variable declaration list, or{@code null} if there is no attempt at parsing the comment and metadata
+   * @param keyword the token representing the 'final', 'const' or 'var' keyword, or {@code null} if
    * there is no keyword
    * @param type the type of the variables in the list
    * @return the variable declaration list that was parsed
@@ -4346,7 +4346,7 @@
    * variableDeclarationList ';'
    * </pre>
    * @param commentAndMetadata the metadata to be associated with the variable declaration
-   * statement, or `null` if there is no attempt at parsing the comment and metadata
+   * statement, or {@code null} if there is no attempt at parsing the comment and metadata
    * @return the variable declaration statement that was parsed
    */
   VariableDeclarationStatement parseVariableDeclarationStatement(CommentAndMetadata commentAndMetadata) {
@@ -4362,8 +4362,8 @@
    * variableDeclarationList ';'
    * </pre>
    * @param commentAndMetadata the metadata to be associated with the variable declaration
-   * statement, or `null` if there is no attempt at parsing the comment and metadata
-   * @param keyword the token representing the 'final', 'const' or 'var' keyword, or `null` if
+   * statement, or {@code null} if there is no attempt at parsing the comment and metadata
+   * @param keyword the token representing the 'final', 'const' or 'var' keyword, or {@code null} if
    * there is no keyword
    * @param type the type of the variables in the list
    * @return the variable declaration statement that was parsed
@@ -4416,14 +4416,14 @@
   }
 
   /**
-   * Return the token that is immediately after the current token. This is equivalent to[peek].
+   * Return the token that is immediately after the current token. This is equivalent to{@link #peek(int) peek(1)}.
    * @return the token that is immediately after the current token
    */
   Token peek() => _currentToken.next;
 
   /**
    * Return the token that is the given distance after the current token.
-   * @param distance the number of tokens to look ahead, where `0` is the current token,`1` is the next token, etc.
+   * @param distance the number of tokens to look ahead, where {@code 0} is the current token,{@code 1} is the next token, etc.
    * @return the token that is the given distance after the current token
    */
   Token peek2(int distance) {
@@ -4466,7 +4466,7 @@
   /**
    * Parse the 'final', 'const', 'var' or type preceding a variable declaration, starting at the
    * given token, without actually creating a type or changing the current token. Return the token
-   * following the type that was parsed, or `null` if the given token is not the first token
+   * following the type that was parsed, or {@code null} if the given token is not the first token
    * in a valid type.
    * <pre>
    * finalConstVarOrType ::=
@@ -4498,16 +4498,16 @@
   /**
    * Parse a list of formal parameters, starting at the given token, without actually creating a
    * formal parameter list or changing the current token. Return the token following the formal
-   * parameter list that was parsed, or `null` if the given token is not the first token in a
+   * parameter list that was parsed, or {@code null} if the given token is not the first token in a
    * valid list of formal parameter.
-   *
+   * <p>
    * Note that unlike other skip methods, this method uses a heuristic. In the worst case, the
    * parameters could be prefixed by metadata, which would require us to be able to skip arbitrary
    * expressions. Rather than duplicate the logic of most of the parse methods we simply look for
    * something that is likely to be a list of parameters and then skip to returning the token after
    * the closing parenthesis.
-   *
-   * This method must be kept in sync with [parseFormalParameterList].
+   * <p>
+   * This method must be kept in sync with {@link #parseFormalParameterList()}.
    * <pre>
    * formalParameterList ::=
    * '(' ')'
@@ -4555,7 +4555,7 @@
 
   /**
    * If the given token is a begin token with an associated end token, then return the token
-   * following the end token. Otherwise, return `null`.
+   * following the end token. Otherwise, return {@code null}.
    * @param startToken the token that is assumed to be a being token
    * @return the token following the matching end token
    */
@@ -4573,10 +4573,10 @@
   /**
    * Parse a prefixed identifier, starting at the given token, without actually creating a prefixed
    * identifier or changing the current token. Return the token following the prefixed identifier
-   * that was parsed, or `null` if the given token is not the first token in a valid prefixed
+   * that was parsed, or {@code null} if the given token is not the first token in a valid prefixed
    * identifier.
-   *
-   * This method must be kept in sync with [parsePrefixedIdentifier].
+   * <p>
+   * This method must be kept in sync with {@link #parsePrefixedIdentifier()}.
    * <pre>
    * prefixedIdentifier ::=
    * identifier ('.' identifier)?
@@ -4596,9 +4596,9 @@
 
   /**
    * Parse a return type, starting at the given token, without actually creating a return type or
-   * changing the current token. Return the token following the return type that was parsed, or`null` if the given token is not the first token in a valid return type.
-   *
-   * This method must be kept in sync with [parseReturnType].
+   * changing the current token. Return the token following the return type that was parsed, or{@code null} if the given token is not the first token in a valid return type.
+   * <p>
+   * This method must be kept in sync with {@link #parseReturnType()}.
    * <pre>
    * returnType ::=
    * 'void'
@@ -4618,10 +4618,10 @@
   /**
    * Parse a simple identifier, starting at the given token, without actually creating a simple
    * identifier or changing the current token. Return the token following the simple identifier that
-   * was parsed, or `null` if the given token is not the first token in a valid simple
+   * was parsed, or {@code null} if the given token is not the first token in a valid simple
    * identifier.
-   *
-   * This method must be kept in sync with [parseSimpleIdentifier].
+   * <p>
+   * This method must be kept in sync with {@link #parseSimpleIdentifier()}.
    * <pre>
    * identifier ::=
    * IDENTIFIER
@@ -4630,7 +4630,7 @@
    * @return the token following the simple identifier that was parsed
    */
   Token skipSimpleIdentifier(Token startToken) {
-    if (matches4(startToken, TokenType.IDENTIFIER) || (matches4(startToken, TokenType.KEYWORD) && ((startToken as KeywordToken)).keyword.isPseudoKeyword)) {
+    if (matches4(startToken, TokenType.IDENTIFIER) || (matches4(startToken, TokenType.KEYWORD) && ((startToken as KeywordToken)).keyword.isPseudoKeyword())) {
       return startToken.next;
     }
     return null;
@@ -4639,10 +4639,10 @@
   /**
    * Parse a string literal that contains interpolations, starting at the given token, without
    * actually creating a string literal or changing the current token. Return the token following
-   * the string literal that was parsed, or `null` if the given token is not the first token
+   * the string literal that was parsed, or {@code null} if the given token is not the first token
    * in a valid string literal.
-   *
-   * This method must be kept in sync with [parseStringInterpolation].
+   * <p>
+   * This method must be kept in sync with {@link #parseStringInterpolation(Token)}.
    * @param startToken the token at which parsing is to begin
    * @return the string literal that was parsed
    */
@@ -4692,9 +4692,9 @@
   /**
    * Parse a string literal, starting at the given token, without actually creating a string literal
    * or changing the current token. Return the token following the string literal that was parsed,
-   * or `null` if the given token is not the first token in a valid string literal.
-   *
-   * This method must be kept in sync with [parseStringLiteral].
+   * or {@code null} if the given token is not the first token in a valid string literal.
+   * <p>
+   * This method must be kept in sync with {@link #parseStringLiteral()}.
    * <pre>
    * stringLiteral ::=
    * MULTI_LINE_STRING+
@@ -4721,9 +4721,9 @@
   /**
    * Parse a list of type arguments, starting at the given token, without actually creating a type argument list
    * or changing the current token. Return the token following the type argument list that was parsed,
-   * or `null` if the given token is not the first token in a valid type argument list.
-   *
-   * This method must be kept in sync with [parseTypeArgumentList].
+   * or {@code null} if the given token is not the first token in a valid type argument list.
+   * <p>
+   * This method must be kept in sync with {@link #parseTypeArgumentList()}.
    * <pre>
    * typeArguments ::=
    * '<' typeList '>'
@@ -4760,9 +4760,9 @@
 
   /**
    * Parse a type name, starting at the given token, without actually creating a type name or
-   * changing the current token. Return the token following the type name that was parsed, or`null` if the given token is not the first token in a valid type name.
-   *
-   * This method must be kept in sync with [parseTypeName].
+   * changing the current token. Return the token following the type name that was parsed, or{@code null} if the given token is not the first token in a valid type name.
+   * <p>
+   * This method must be kept in sync with {@link #parseTypeName()}.
    * <pre>
    * type ::=
    * qualified typeArguments?
@@ -4784,10 +4784,10 @@
   /**
    * Parse a list of type parameters, starting at the given token, without actually creating a type
    * parameter list or changing the current token. Return the token following the type parameter
-   * list that was parsed, or `null` if the given token is not the first token in a valid type
+   * list that was parsed, or {@code null} if the given token is not the first token in a valid type
    * parameter list.
-   *
-   * This method must be kept in sync with [parseTypeParameterList].
+   * <p>
+   * This method must be kept in sync with {@link #parseTypeParameterList()}.
    * <pre>
    * typeParameterList ::=
    * '<' typeParameter (',' typeParameter)* '>'
@@ -5199,7 +5199,7 @@
   }
 }
 /**
- * The enumeration `ParserErrorCode` defines the error codes used for errors detected by the
+ * The enumeration {@code ParserErrorCode} defines the error codes used for errors detected by the
  * parser. The convention for this class is for the name of the error code to indicate the problem
  * that caused the error to be generated and for the error message to explain what is wrong and,
  * when appropriate, how the problem can be corrected.
@@ -5530,7 +5530,7 @@
       for (String line in StringUtils.split(token.lexeme, "\n")) {
         if (firstLine) {
           firstLine = false;
-          if (node.isDocumentation) {
+          if (node.isDocumentation()) {
             nl2();
           }
         } else {
@@ -5790,7 +5790,7 @@
     return null;
   }
   Object visitIndexExpression(IndexExpression node) {
-    if (node.isCascaded) {
+    if (node.isCascaded()) {
       _writer.print("..");
     } else {
       visit(node.array);
@@ -5892,7 +5892,7 @@
     visit8(node.propertyKeyword, " ");
     visit8(node.operatorKeyword, " ");
     visit(node.name);
-    if (!node.isGetter) {
+    if (!node.isGetter()) {
       visit(node.parameters);
     }
     if (node.body is! EmptyFunctionBody) {
@@ -5902,7 +5902,7 @@
     return null;
   }
   Object visitMethodInvocation(MethodInvocation node) {
-    if (node.isCascaded) {
+    if (node.isCascaded()) {
       _writer.print("..");
     } else {
       visit6(node.target, ".");
@@ -5961,7 +5961,7 @@
     return null;
   }
   Object visitPropertyAccess(PropertyAccess node) {
-    if (node.isCascaded) {
+    if (node.isCascaded()) {
       _writer.print("..");
     } else {
       visit6(node.target, ".");
diff --git a/pkg/analyzer_experimental/lib/src/generated/resolver.dart b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
index dc5fb59..3a052ac 100644
--- a/pkg/analyzer_experimental/lib/src/generated/resolver.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
@@ -17,7 +17,7 @@
 import 'engine.dart';
 import 'constant.dart';
 /**
- * Instances of the class `CompilationUnitBuilder` build an element model for a single
+ * Instances of the class {@code CompilationUnitBuilder} build an element model for a single
  * compilation unit.
  * @coverage dart.engine.resolver
  */
@@ -49,7 +49,7 @@
   }
 }
 /**
- * Instances of the class `ElementBuilder` traverse an AST structure and build the element
+ * Instances of the class {@code ElementBuilder} traverse an AST structure and build the element
  * model representing the AST structure.
  * @coverage dart.engine.resolver
  */
@@ -76,13 +76,6 @@
   bool _isValidMixin = false;
 
   /**
-   * A collection holding the function types defined in a class that need to have their type
-   * arguments set to the types of the type parameters for the class, or `null` if we are not
-   * currently processing nodes within a class.
-   */
-  List<FunctionTypeImpl> _functionTypesToFix = null;
-
-  /**
    * Initialize a newly created element builder to build the elements for a compilation unit.
    * @param initialHolder the element holder associated with the compilation unit being built
    */
@@ -117,14 +110,12 @@
   Object visitClassDeclaration(ClassDeclaration node) {
     ElementHolder holder = new ElementHolder();
     _isValidMixin = true;
-    _functionTypesToFix = new List<FunctionTypeImpl>();
     visitChildren(holder, node);
     SimpleIdentifier className = node.name;
     ClassElementImpl element = new ClassElementImpl(className);
     List<TypeVariableElement> typeVariables = holder.typeVariables;
-    List<Type2> typeArguments = createTypeVariableTypes(typeVariables);
     InterfaceTypeImpl interfaceType = new InterfaceTypeImpl.con1(element);
-    interfaceType.typeArguments = typeArguments;
+    interfaceType.typeArguments = createTypeVariableTypes(typeVariables);
     element.type = interfaceType;
     List<ConstructorElement> constructors = holder.constructors;
     if (constructors.length == 0) {
@@ -137,18 +128,12 @@
     element.methods = holder.methods;
     element.typeVariables = typeVariables;
     element.validMixin = _isValidMixin;
-    for (FunctionTypeImpl functionType in _functionTypesToFix) {
-      functionType.typeArguments = typeArguments;
-    }
-    _functionTypesToFix = null;
     _currentHolder.addType(element);
     className.element = element;
-    holder.validate();
     return null;
   }
   Object visitClassTypeAlias(ClassTypeAlias node) {
     ElementHolder holder = new ElementHolder();
-    _functionTypesToFix = new List<FunctionTypeImpl>();
     visitChildren(holder, node);
     SimpleIdentifier className = node.name;
     ClassElementImpl element = new ClassElementImpl(className);
@@ -156,18 +141,12 @@
     element.typedef = true;
     List<TypeVariableElement> typeVariables = holder.typeVariables;
     element.typeVariables = typeVariables;
-    List<Type2> typeArguments = createTypeVariableTypes(typeVariables);
     InterfaceTypeImpl interfaceType = new InterfaceTypeImpl.con1(element);
-    interfaceType.typeArguments = typeArguments;
+    interfaceType.typeArguments = createTypeVariableTypes(typeVariables);
     element.type = interfaceType;
     element.constructors = createDefaultConstructors(interfaceType);
-    for (FunctionTypeImpl functionType in _functionTypesToFix) {
-      functionType.typeArguments = typeArguments;
-    }
-    _functionTypesToFix = null;
     _currentHolder.addType(element);
     className.element = element;
-    holder.validate();
     return null;
   }
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
@@ -200,7 +179,6 @@
     } else {
       constructorName.element = element;
     }
-    holder.validate();
     return null;
   }
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
@@ -227,13 +205,15 @@
     initializer.parameters = holder.parameters;
     SimpleIdentifier parameterName = node.parameter.identifier;
     ParameterElementImpl parameter;
-    if (node.parameter is FieldFormalParameter) {
-      parameter = new DefaultFieldFormalParameterElementImpl(parameterName);
+    if (node.isConst()) {
+      parameter = new ConstParameterElementImpl(parameterName);
+      parameter.const3 = true;
+    } else if (node.parameter is FieldFormalParameter) {
+      parameter = new FieldFormalParameterElementImpl(parameterName);
     } else {
-      parameter = new DefaultParameterElementImpl(parameterName);
+      parameter = new ParameterElementImpl(parameterName);
     }
-    parameter.const3 = node.isConst;
-    parameter.final2 = node.isFinal;
+    parameter.final2 = node.isFinal();
     parameter.initializer = initializer;
     parameter.parameterKind = node.kind;
     Expression defaultValue = node.defaultValue;
@@ -247,7 +227,6 @@
     _currentHolder.addParameter(parameter);
     parameterName.element = parameter;
     node.parameter.accept(this);
-    holder.validate();
     return null;
   }
   Object visitFieldDeclaration(FieldDeclaration node) {
@@ -264,8 +243,8 @@
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
       FieldFormalParameterElementImpl parameter = new FieldFormalParameterElementImpl(parameterName);
-      parameter.const3 = node.isConst;
-      parameter.final2 = node.isFinal;
+      parameter.const3 = node.isConst();
+      parameter.final2 = node.isFinal();
       parameter.parameterKind = node.kind;
       _currentHolder.addParameter(parameter);
       parameterName.element = parameter;
@@ -291,6 +270,8 @@
         element.labels = holder.labels;
         element.localVariables = holder.localVariables;
         element.parameters = holder.parameters;
+        FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
+        element.type = type;
         _currentHolder.addFunction(element);
         expression.element = element;
         functionName.element = element;
@@ -333,7 +314,6 @@
           propertyNameNode.element = setter;
         }
       }
-      holder.validate();
     }
     return null;
   }
@@ -360,13 +340,9 @@
       }
     }
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
-    if (_functionTypesToFix != null) {
-      _functionTypesToFix.add(type);
-    }
     element.type = type;
     _currentHolder.addFunction(element);
     node.element = element;
-    holder.validate();
     return null;
   }
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
@@ -383,7 +359,6 @@
     element.type = type;
     _currentHolder.addTypeAlias(element);
     aliasName.element = element;
-    holder.validate();
     return null;
   }
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
@@ -397,7 +372,6 @@
     ElementHolder holder = new ElementHolder();
     visitChildren(holder, node);
     ((node.element as ParameterElementImpl)).parameters = holder.parameters;
-    holder.validate();
     return null;
   }
   Object visitLabeledStatement(LabeledStatement node) {
@@ -419,7 +393,7 @@
     } finally {
       _inFunction = wasInFunction;
     }
-    bool isStatic = node.isStatic;
+    bool isStatic = node.isStatic();
     sc.Token property = node.propertyKeyword;
     if (property == null) {
       SimpleIdentifier methodName = node.name;
@@ -428,7 +402,7 @@
         nameOfMethod = "unary-";
       }
       MethodElementImpl element = new MethodElementImpl.con2(nameOfMethod, methodName.offset);
-      element.abstract = node.isAbstract;
+      element.abstract = node.isAbstract();
       element.functions = holder.functions;
       element.labels = holder.labels;
       element.localVariables = holder.localVariables;
@@ -474,15 +448,14 @@
         propertyNameNode.element = setter;
       }
     }
-    holder.validate();
     return null;
   }
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
       ParameterElementImpl parameter = new ParameterElementImpl(parameterName);
-      parameter.const3 = node.isConst;
-      parameter.final2 = node.isFinal;
+      parameter.const3 = node.isConst();
+      parameter.final2 = node.isFinal();
       parameter.parameterKind = node.kind;
       _currentHolder.addParameter(parameter);
       parameterName.element = parameter;
@@ -581,7 +554,6 @@
       initializer.localVariables = holder.localVariables;
       initializer.synthetic = true;
       element.initializer = initializer;
-      holder.validate();
     }
     if (element is PropertyInducingElementImpl) {
       PropertyInducingElementImpl variable = element as PropertyInducingElementImpl;
@@ -590,13 +562,13 @@
       }
       PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(variable);
       getter.getter = true;
-      getter.static = variable.isStatic;
+      getter.static = variable.isStatic();
       _currentHolder.addAccessor(getter);
       variable.getter = getter;
       if (!isFinal) {
         PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con2(variable);
         setter.setter = true;
-        setter.static = variable.isStatic;
+        setter.static = variable.isStatic();
         _currentHolder.addAccessor(setter);
         variable.setter = setter;
       }
@@ -605,26 +577,18 @@
   }
 
   /**
-   * Creates the [ConstructorElement]s array with the single default constructor element.
+   * Creates the {@link ConstructorElement}s array with the single default constructor element.
    * @param interfaceType the interface type for which to create a default constructor
-   * @return the [ConstructorElement]s array with the single default constructor element
+   * @return the {@link ConstructorElement}s array with the single default constructor element
    */
   List<ConstructorElement> createDefaultConstructors(InterfaceTypeImpl interfaceType) {
     ConstructorElementImpl constructor = new ConstructorElementImpl(null);
     constructor.synthetic = true;
-    constructor.returnType = interfaceType;
     FunctionTypeImpl type = new FunctionTypeImpl.con1(constructor);
-    _functionTypesToFix.add(type);
+    type.returnType = interfaceType;
     constructor.type = type;
     return <ConstructorElement> [constructor];
   }
-
-  /**
-   * Create the types associated with the given type variables, setting the type of each type
-   * variable, and return an array of types corresponding to the given variables.
-   * @param typeVariables the type variables for which types are to be created
-   * @return
-   */
   List<Type2> createTypeVariableTypes(List<TypeVariableElement> typeVariables) {
     int typeVariableCount = typeVariables.length;
     List<Type2> typeArguments = new List<Type2>(typeVariableCount);
@@ -638,7 +602,7 @@
   }
 
   /**
-   * Return the body of the function that contains the given parameter, or `null` if no
+   * Return the body of the function that contains the given parameter, or {@code null} if no
    * function body could be found.
    * @param node the parameter contained in the function whose body is to be returned
    * @return the body of the function that contains the given parameter
@@ -657,10 +621,10 @@
   }
 
   /**
-   * Return `true` if the given token is a token for the given keyword.
+   * Return {@code true} if the given token is a token for the given keyword.
    * @param token the token being tested
    * @param keyword the keyword being tested for
-   * @return `true` if the given token is a token for the given keyword
+   * @return {@code true} if the given token is a token for the given keyword
    */
   bool matches(sc.Token token, sc.Keyword keyword2) => token != null && identical(token.type, sc.TokenType.KEYWORD) && identical(((token as sc.KeywordToken)).keyword, keyword2);
 
@@ -699,115 +663,72 @@
   }
 }
 /**
- * Instances of the class `ElementHolder` hold on to elements created while traversing an AST
+ * Instances of the class {@code ElementHolder} hold on to elements created while traversing an AST
  * structure so that they can be accessed when creating their enclosing element.
  * @coverage dart.engine.resolver
  */
 class ElementHolder {
-  List<PropertyAccessorElement> _accessors;
-  List<ConstructorElement> _constructors;
-  List<FieldElement> _fields;
-  List<FunctionElement> _functions;
-  List<LabelElement> _labels;
-  List<VariableElement> _localVariables;
-  List<MethodElement> _methods;
-  List<ParameterElement> _parameters;
-  List<VariableElement> _topLevelVariables;
-  List<ClassElement> _types;
-  List<FunctionTypeAliasElement> _typeAliases;
-  List<TypeVariableElement> _typeVariables;
+  List<PropertyAccessorElement> _accessors = new List<PropertyAccessorElement>();
+  List<ConstructorElement> _constructors = new List<ConstructorElement>();
+  List<FieldElement> _fields = new List<FieldElement>();
+  List<FunctionElement> _functions = new List<FunctionElement>();
+  List<LabelElement> _labels = new List<LabelElement>();
+  List<VariableElement> _localVariables = new List<VariableElement>();
+  List<MethodElement> _methods = new List<MethodElement>();
+  List<FunctionTypeAliasElement> _typeAliases = new List<FunctionTypeAliasElement>();
+  List<ParameterElement> _parameters = new List<ParameterElement>();
+  List<VariableElement> _topLevelVariables = new List<VariableElement>();
+  List<ClassElement> _types = new List<ClassElement>();
+  List<TypeVariableElement> _typeVariables = new List<TypeVariableElement>();
   void addAccessor(PropertyAccessorElement element) {
-    if (_accessors == null) {
-      _accessors = new List<PropertyAccessorElement>();
-    }
     _accessors.add(element);
   }
   void addConstructor(ConstructorElement element) {
-    if (_constructors == null) {
-      _constructors = new List<ConstructorElement>();
-    }
     _constructors.add(element);
   }
   void addField(FieldElement element) {
-    if (_fields == null) {
-      _fields = new List<FieldElement>();
-    }
     _fields.add(element);
   }
   void addFunction(FunctionElement element) {
-    if (_functions == null) {
-      _functions = new List<FunctionElement>();
-    }
     _functions.add(element);
   }
   void addLabel(LabelElement element) {
-    if (_labels == null) {
-      _labels = new List<LabelElement>();
-    }
     _labels.add(element);
   }
   void addLocalVariable(LocalVariableElement element) {
-    if (_localVariables == null) {
-      _localVariables = new List<VariableElement>();
-    }
     _localVariables.add(element);
   }
   void addMethod(MethodElement element) {
-    if (_methods == null) {
-      _methods = new List<MethodElement>();
-    }
     _methods.add(element);
   }
   void addParameter(ParameterElement element) {
-    if (_parameters == null) {
-      _parameters = new List<ParameterElement>();
-    }
     _parameters.add(element);
   }
   void addTopLevelVariable(TopLevelVariableElement element) {
-    if (_topLevelVariables == null) {
-      _topLevelVariables = new List<VariableElement>();
-    }
     _topLevelVariables.add(element);
   }
   void addType(ClassElement element) {
-    if (_types == null) {
-      _types = new List<ClassElement>();
-    }
     _types.add(element);
   }
   void addTypeAlias(FunctionTypeAliasElement element) {
-    if (_typeAliases == null) {
-      _typeAliases = new List<FunctionTypeAliasElement>();
-    }
     _typeAliases.add(element);
   }
   void addTypeVariable(TypeVariableElement element) {
-    if (_typeVariables == null) {
-      _typeVariables = new List<TypeVariableElement>();
-    }
     _typeVariables.add(element);
   }
   List<PropertyAccessorElement> get accessors {
-    if (_accessors == null) {
+    if (_accessors.isEmpty) {
       return PropertyAccessorElementImpl.EMPTY_ARRAY;
     }
-    List<PropertyAccessorElement> result = new List.from(_accessors);
-    _accessors = null;
-    return result;
+    return new List.from(_accessors);
   }
   List<ConstructorElement> get constructors {
-    if (_constructors == null) {
+    if (_constructors.isEmpty) {
       return ConstructorElementImpl.EMPTY_ARRAY;
     }
-    List<ConstructorElement> result = new List.from(_constructors);
-    _constructors = null;
-    return result;
+    return new List.from(_constructors);
   }
   FieldElement getField(String fieldName) {
-    if (_fields == null) {
-      return null;
-    }
     for (FieldElement field in _fields) {
       if (field.name == fieldName) {
         return field;
@@ -816,175 +737,68 @@
     return null;
   }
   List<FieldElement> get fields {
-    if (_fields == null) {
+    if (_fields.isEmpty) {
       return FieldElementImpl.EMPTY_ARRAY;
     }
-    List<FieldElement> result = new List.from(_fields);
-    _fields = null;
-    return result;
+    return new List.from(_fields);
   }
   List<FunctionElement> get functions {
-    if (_functions == null) {
+    if (_functions.isEmpty) {
       return FunctionElementImpl.EMPTY_ARRAY;
     }
-    List<FunctionElement> result = new List.from(_functions);
-    _functions = null;
-    return result;
+    return new List.from(_functions);
   }
   List<LabelElement> get labels {
-    if (_labels == null) {
+    if (_labels.isEmpty) {
       return LabelElementImpl.EMPTY_ARRAY;
     }
-    List<LabelElement> result = new List.from(_labels);
-    _labels = null;
-    return result;
+    return new List.from(_labels);
   }
   List<LocalVariableElement> get localVariables {
-    if (_localVariables == null) {
+    if (_localVariables.isEmpty) {
       return LocalVariableElementImpl.EMPTY_ARRAY;
     }
-    List<LocalVariableElement> result = new List.from(_localVariables);
-    _localVariables = null;
-    return result;
+    return new List.from(_localVariables);
   }
   List<MethodElement> get methods {
-    if (_methods == null) {
+    if (_methods.isEmpty) {
       return MethodElementImpl.EMPTY_ARRAY;
     }
-    List<MethodElement> result = new List.from(_methods);
-    _methods = null;
-    return result;
+    return new List.from(_methods);
   }
   List<ParameterElement> get parameters {
-    if (_parameters == null) {
+    if (_parameters.isEmpty) {
       return ParameterElementImpl.EMPTY_ARRAY;
     }
-    List<ParameterElement> result = new List.from(_parameters);
-    _parameters = null;
-    return result;
+    return new List.from(_parameters);
   }
   List<TopLevelVariableElement> get topLevelVariables {
-    if (_topLevelVariables == null) {
+    if (_topLevelVariables.isEmpty) {
       return TopLevelVariableElementImpl.EMPTY_ARRAY;
     }
-    List<TopLevelVariableElement> result = new List.from(_topLevelVariables);
-    _topLevelVariables = null;
-    return result;
+    return new List.from(_topLevelVariables);
   }
   List<FunctionTypeAliasElement> get typeAliases {
-    if (_typeAliases == null) {
+    if (_typeAliases.isEmpty) {
       return FunctionTypeAliasElementImpl.EMPTY_ARRAY;
     }
-    List<FunctionTypeAliasElement> result = new List.from(_typeAliases);
-    _typeAliases = null;
-    return result;
+    return new List.from(_typeAliases);
   }
   List<ClassElement> get types {
-    if (_types == null) {
+    if (_types.isEmpty) {
       return ClassElementImpl.EMPTY_ARRAY;
     }
-    List<ClassElement> result = new List.from(_types);
-    _types = null;
-    return result;
+    return new List.from(_types);
   }
   List<TypeVariableElement> get typeVariables {
-    if (_typeVariables == null) {
+    if (_typeVariables.isEmpty) {
       return TypeVariableElementImpl.EMPTY_ARRAY;
     }
-    List<TypeVariableElement> result = new List.from(_typeVariables);
-    _typeVariables = null;
-    return result;
-  }
-  void validate() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    if (_accessors != null) {
-      builder.append(_accessors.length);
-      builder.append(" accessors");
-    }
-    if (_constructors != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
-      }
-      builder.append(_constructors.length);
-      builder.append(" constructors");
-    }
-    if (_fields != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
-      }
-      builder.append(_fields.length);
-      builder.append(" fields");
-    }
-    if (_functions != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
-      }
-      builder.append(_functions.length);
-      builder.append(" functions");
-    }
-    if (_labels != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
-      }
-      builder.append(_labels.length);
-      builder.append(" labels");
-    }
-    if (_localVariables != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
-      }
-      builder.append(_localVariables.length);
-      builder.append(" local variables");
-    }
-    if (_methods != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
-      }
-      builder.append(_methods.length);
-      builder.append(" methods");
-    }
-    if (_parameters != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
-      }
-      builder.append(_parameters.length);
-      builder.append(" parameters");
-    }
-    if (_topLevelVariables != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
-      }
-      builder.append(_topLevelVariables.length);
-      builder.append(" top-level variables");
-    }
-    if (_types != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
-      }
-      builder.append(_types.length);
-      builder.append(" types");
-    }
-    if (_typeAliases != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
-      }
-      builder.append(_typeAliases.length);
-      builder.append(" type aliases");
-    }
-    if (_typeVariables != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
-      }
-      builder.append(_typeVariables.length);
-      builder.append(" type variables");
-    }
-    if (builder.length > 0) {
-      AnalysisEngine.instance.logger.logError("Failed to capture elements: ${builder.toString()}");
-    }
+    return new List.from(_typeVariables);
   }
 }
 /**
- * Instances of the class `HtmlUnitBuilder` build an element model for a single HTML unit.
+ * Instances of the class {@code HtmlUnitBuilder} build an element model for a single HTML unit.
  */
 class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
   static String _APPLICATION_DART_IN_DOUBLE_QUOTES = "\"application/dart\"";
@@ -1004,7 +818,7 @@
   RecordingErrorListener _errorListener;
 
   /**
-   * The line information associated with the source for which an element is being built, or`null` if we are not building an element.
+   * The line information associated with the source for which an element is being built, or{@code null} if we are not building an element.
    */
   LineInfo _lineInfo;
 
@@ -1163,7 +977,7 @@
   }
 
   /**
-   * Return the first source attribute for the given tag node, or `null` if it does not exist.
+   * Return the first source attribute for the given tag node, or {@code null} if it does not exist.
    * @param node the node containing attributes
    * @return the source attribute contained in the given tag
    */
@@ -1178,8 +992,8 @@
 
   /**
    * Determine if the specified node is a Dart script.
-   * @param node the node to be tested (not `null`)
-   * @return `true` if the node is a Dart script
+   * @param node the node to be tested (not {@code null})
+   * @return {@code true} if the node is a Dart script
    */
   bool isScriptNode(ht.XmlTagNode node) {
     if (node.tagNodes.length != 0 || node.tag.lexeme != _SCRIPT) {
@@ -1212,7 +1026,7 @@
   }
 }
 /**
- * Instances of the class `DeclarationResolver` are used to resolve declarations in an AST
+ * Instances of the class {@code DeclarationResolver} are used to resolve declarations in an AST
  * structure to already built elements.
  */
 class DeclarationResolver extends RecursiveASTVisitor<Object> {
@@ -1223,25 +1037,25 @@
   CompilationUnitElement _enclosingUnit;
 
   /**
-   * The function type alias containing the AST nodes being visited, or `null` if we are not
+   * The function type alias containing the AST nodes being visited, or {@code null} if we are not
    * in the scope of a function type alias.
    */
   FunctionTypeAliasElement _enclosingAlias;
 
   /**
-   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
+   * The class containing the AST nodes being visited, or {@code null} if we are not in the scope of
    * a class.
    */
   ClassElement _enclosingClass;
 
   /**
-   * The method or function containing the AST nodes being visited, or `null` if we are not in
+   * The method or function containing the AST nodes being visited, or {@code null} if we are not in
    * the scope of a method or function.
    */
   ExecutableElement _enclosingExecutable;
 
   /**
-   * The parameter containing the AST nodes being visited, or `null` if we are not in the
+   * The parameter containing the AST nodes being visited, or {@code null} if we are not in the
    * scope of a parameter.
    */
   ParameterElement _enclosingParameter;
@@ -1587,7 +1401,7 @@
   }
 
   /**
-   * Return the element for the part with the given source, or `null` if there is no element
+   * Return the element for the part with the given source, or {@code null} if there is no element
    * for the given source.
    * @param parts the elements for the parts
    * @param partSource the source for the part whose element is to be returned
@@ -1642,7 +1456,7 @@
   }
 
   /**
-   * Return the export element from the given array whose library has the given source, or`null` if there is no such export.
+   * Return the export element from the given array whose library has the given source, or{@code null} if there is no such export.
    * @param exports the export elements being searched
    * @param source the source of the library associated with the export element to being searched
    * for
@@ -1659,7 +1473,7 @@
 
   /**
    * Return the import element from the given array whose library has the given source and that has
-   * the given prefix, or `null` if there is no such import.
+   * the given prefix, or {@code null} if there is no such import.
    * @param imports the import elements being searched
    * @param source the source of the library associated with the import element to being searched
    * for
@@ -1685,7 +1499,7 @@
   }
 
   /**
-   * Return the value of the given string literal, or `null` if the string is not a constant
+   * Return the value of the given string literal, or {@code null} if the string is not a constant
    * string without any string interpolation.
    * @param literal the string literal whose value is to be returned
    * @return the value of the given string literal
@@ -1704,45 +1518,45 @@
   }
 }
 /**
- * Instances of the class `ElementResolver` are used by instances of [ResolverVisitor]to resolve references within the AST structure to the elements being referenced. The requirements
+ * Instances of the class {@code ElementResolver} are used by instances of {@link ResolverVisitor}to resolve references within the AST structure to the elements being referenced. The requirements
  * for the element resolver are:
  * <ol>
- * * Every [SimpleIdentifier] should be resolved to the element to which it refers.
+ * <li>Every {@link SimpleIdentifier} should be resolved to the element to which it refers.
  * Specifically:
- *
- * * An identifier within the declaration of that name should resolve to the element being
- * declared.
- * * An identifier denoting a prefix should resolve to the element representing the import that
- * defines the prefix (an [ImportElement]).
- * * An identifier denoting a variable should resolve to the element representing the variable (a[VariableElement]).
- * * An identifier denoting a parameter should resolve to the element representing the parameter
- * (a [ParameterElement]).
- * * An identifier denoting a field should resolve to the element representing the getter or
- * setter being invoked (a [PropertyAccessorElement]).
- * * An identifier denoting the name of a method or function being invoked should resolve to the
- * element representing the method or function (a [ExecutableElement]).
- * * An identifier denoting a label should resolve to the element representing the label (a[LabelElement]).
- *
- * The identifiers within directives are exceptions to this rule and are covered below.
- * * Every node containing a token representing an operator that can be overridden ([BinaryExpression], [PrefixExpression], [PostfixExpression]) should resolve to
- * the element representing the method invoked by that operator (a [MethodElement]).
- * * Every [FunctionExpressionInvocation] should resolve to the element representing the
- * function being invoked (a [FunctionElement]). This will be the same element as that to
+ * <ul>
+ * <li>An identifier within the declaration of that name should resolve to the element being
+ * declared.</li>
+ * <li>An identifier denoting a prefix should resolve to the element representing the import that
+ * defines the prefix (an {@link ImportElement}).</li>
+ * <li>An identifier denoting a variable should resolve to the element representing the variable (a{@link VariableElement}).</li>
+ * <li>An identifier denoting a parameter should resolve to the element representing the parameter
+ * (a {@link ParameterElement}).</li>
+ * <li>An identifier denoting a field should resolve to the element representing the getter or
+ * setter being invoked (a {@link PropertyAccessorElement}).</li>
+ * <li>An identifier denoting the name of a method or function being invoked should resolve to the
+ * element representing the method or function (a {@link ExecutableElement}).</li>
+ * <li>An identifier denoting a label should resolve to the element representing the label (a{@link LabelElement}).</li>
+ * </ul>
+ * The identifiers within directives are exceptions to this rule and are covered below.</li>
+ * <li>Every node containing a token representing an operator that can be overridden ({@link BinaryExpression}, {@link PrefixExpression}, {@link PostfixExpression}) should resolve to
+ * the element representing the method invoked by that operator (a {@link MethodElement}).</li>
+ * <li>Every {@link FunctionExpressionInvocation} should resolve to the element representing the
+ * function being invoked (a {@link FunctionElement}). This will be the same element as that to
  * which the name is resolved if the function has a name, but is provided for those cases where an
- * unnamed function is being invoked.
- * * Every [LibraryDirective] and [PartOfDirective] should resolve to the element
- * representing the library being specified by the directive (a [LibraryElement]) unless, in
- * the case of a part-of directive, the specified library does not exist.
- * * Every [ImportDirective] and [ExportDirective] should resolve to the element
+ * unnamed function is being invoked.</li>
+ * <li>Every {@link LibraryDirective} and {@link PartOfDirective} should resolve to the element
+ * representing the library being specified by the directive (a {@link LibraryElement}) unless, in
+ * the case of a part-of directive, the specified library does not exist.</li>
+ * <li>Every {@link ImportDirective} and {@link ExportDirective} should resolve to the element
  * representing the library being specified by the directive unless the specified library does not
- * exist (an [ImportElement] or [ExportElement]).
- * * The identifier representing the prefix in an [ImportDirective] should resolve to the
- * element representing the prefix (a [PrefixElement]).
- * * The identifiers in the hide and show combinators in [ImportDirective]s and[ExportDirective]s should resolve to the elements that are being hidden or shown,
+ * exist (an {@link ImportElement} or {@link ExportElement}).</li>
+ * <li>The identifier representing the prefix in an {@link ImportDirective} should resolve to the
+ * element representing the prefix (a {@link PrefixElement}).</li>
+ * <li>The identifiers in the hide and show combinators in {@link ImportDirective}s and{@link ExportDirective}s should resolve to the elements that are being hidden or shown,
  * respectively, unless those names are not defined in the specified library (or the specified
- * library does not exist).
- * * Every [PartDirective] should resolve to the element representing the compilation unit
- * being specified by the string unless the specified compilation unit does not exist (a[CompilationUnitElement]).
+ * library does not exist).</li>
+ * <li>Every {@link PartDirective} should resolve to the element representing the compilation unit
+ * being specified by the string unless the specified compilation unit does not exist (a{@link CompilationUnitElement}).</li>
  * </ol>
  * Note that AST nodes that would represent elements that are not defined are not resolved to
  * anything. This includes such things as references to undeclared variables (which is an error) and
@@ -1753,7 +1567,7 @@
 class ElementResolver extends SimpleASTVisitor<Object> {
 
   /**
-   * @return `true` if the given identifier is the return type of a constructor declaration.
+   * @return {@code true} if the given identifier is the return type of a constructor declaration.
    */
   static bool isConstructorReturnType(SimpleIdentifier node) {
     ASTNode parent = node.parent;
@@ -1765,7 +1579,7 @@
   }
 
   /**
-   * @return `true` if the given identifier is the return type of a factory constructor
+   * @return {@code true} if the given identifier is the return type of a factory constructor
    * declaration.
    */
   static bool isFactoryConstructorReturnType(SimpleIdentifier node) {
@@ -1780,7 +1594,7 @@
   /**
    * Checks if the given 'super' expression is used in the valid context.
    * @param node the 'super' expression to analyze
-   * @return `true` if the given 'super' expression is in the valid context
+   * @return {@code true} if the given 'super' expression is in the valid context
    */
   static bool isSuperInValidContext(SuperExpression node) {
     for (ASTNode n = node; n != null; n = n.parent) {
@@ -1796,7 +1610,7 @@
       }
       if (n is MethodDeclaration) {
         MethodDeclaration method = n as MethodDeclaration;
-        return !method.isStatic;
+        return !method.isStatic();
       }
     }
     return false;
@@ -1846,7 +1660,7 @@
         node.staticElement = staticMethod;
         Type2 propagatedType = getPropagatedType(leftHandSide);
         MethodElement propagatedMethod = lookUpMethod(leftHandSide, propagatedType, methodName);
-        node.element = select2(staticMethod, propagatedMethod);
+        node.element = select3(staticMethod, propagatedMethod);
         if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
           _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_METHOD, operator, [methodName, staticType.displayName]);
         }
@@ -1856,7 +1670,7 @@
   }
   Object visitBinaryExpression(BinaryExpression node) {
     sc.Token operator = node.operator;
-    if (operator.isUserDefinableOperator) {
+    if (operator.isUserDefinableOperator()) {
       Expression leftOperand = node.leftOperand;
       if (leftOperand != null) {
         String methodName = operator.lexeme;
@@ -1865,7 +1679,7 @@
         node.staticElement = staticMethod;
         Type2 propagatedType = getPropagatedType(leftOperand);
         MethodElement propagatedMethod = lookUpMethod(leftOperand, propagatedType, methodName);
-        node.element = select2(staticMethod, propagatedMethod);
+        node.element = select3(staticMethod, propagatedMethod);
         if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
           _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
         }
@@ -1876,7 +1690,7 @@
   Object visitBreakStatement(BreakStatement node) {
     SimpleIdentifier labelNode = node.label;
     LabelElementImpl labelElement = lookupLabel(node, labelNode);
-    if (labelElement != null && labelElement.isOnSwitchMember) {
+    if (labelElement != null && labelElement.isOnSwitchMember()) {
       _resolver.reportError(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode, []);
     }
     return null;
@@ -1902,7 +1716,7 @@
       }
       if (element == null) {
       } else {
-        if (element.library == null || element.library != _resolver.definingLibrary) {
+        if (element.library != _resolver.definingLibrary) {
         }
         recordResolution(simpleIdentifier, element);
         if (node.newKeyword != null) {
@@ -1989,21 +1803,21 @@
     ClassElement enclosingClass = _resolver.enclosingClass;
     FieldElement fieldElement = ((enclosingClass as ClassElementImpl)).getField(fieldName.name);
     recordResolution(fieldName, fieldElement);
-    if (fieldElement == null || fieldElement.isSynthetic) {
+    if (fieldElement == null || fieldElement.isSynthetic()) {
       _resolver.reportError(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
-    } else if (fieldElement.isStatic) {
+    } else if (fieldElement.isStatic()) {
       _resolver.reportError(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName]);
     }
     return null;
   }
   Object visitConstructorName(ConstructorName node) {
     Type2 type = node.type.type;
-    if (type != null && type.isDynamic) {
+    if (type != null && type.isDynamic()) {
       return null;
     } else if (type is! InterfaceType) {
       ASTNode parent = node.parent;
       if (parent is InstanceCreationExpression) {
-        if (((parent as InstanceCreationExpression)).isConst) {
+        if (((parent as InstanceCreationExpression)).isConst()) {
         } else {
         }
       } else {
@@ -2028,7 +1842,7 @@
   Object visitContinueStatement(ContinueStatement node) {
     SimpleIdentifier labelNode = node.label;
     LabelElementImpl labelElement = lookupLabel(node, labelNode);
-    if (labelElement != null && labelElement.isOnSwitchStatement) {
+    if (labelElement != null && labelElement.isOnSwitchStatement()) {
       _resolver.reportError(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode, []);
     }
     return null;
@@ -2062,17 +1876,17 @@
           if (node.type == null) {
             fieldFormal.type = fieldType;
           }
-          if (fieldElement.isSynthetic) {
+          if (fieldElement.isSynthetic()) {
             _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
-          } else if (fieldElement.isStatic) {
+          } else if (fieldElement.isStatic()) {
             _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
           } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
             _resolver.reportError(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
           }
         } else {
-          if (fieldElement.isSynthetic) {
+          if (fieldElement.isSynthetic()) {
             _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
-          } else if (fieldElement.isStatic) {
+          } else if (fieldElement.isStatic()) {
             _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
           }
         }
@@ -2133,7 +1947,7 @@
     node.staticElement = invokedConstructor;
     node.element = invokedConstructor;
     ArgumentList argumentList = node.argumentList;
-    List<ParameterElement> parameters = resolveArgumentsToParameters(node.isConst, argumentList, invokedConstructor);
+    List<ParameterElement> parameters = resolveArgumentsToParameters(node.isConst(), argumentList, invokedConstructor);
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
@@ -2179,7 +1993,20 @@
         argumentList.correspondingParameters = parameters;
       }
     }
-    ErrorCode errorCode = checkForInvocationError(target, staticElement);
+    ErrorCode errorCode;
+    if (staticElement == null) {
+      if (propagatedElement == null) {
+        errorCode = checkForInvocationError(target, staticElement);
+      } else {
+        errorCode = checkForInvocationError(target, propagatedElement);
+      }
+    } else {
+      errorCode = checkForInvocationError(target, staticElement);
+      if (propagatedElement != null) {
+        ErrorCode propagatedError = checkForInvocationError(target, propagatedElement);
+        errorCode = select(errorCode, propagatedError);
+      }
+    }
     if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) {
       _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName, [methodName.name]);
     } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) {
@@ -2223,7 +2050,7 @@
     node.staticElement = staticMethod;
     Type2 propagatedType = getPropagatedType(operand);
     MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, methodName);
-    node.element = select2(staticMethod, propagatedMethod);
+    node.element = select3(staticMethod, propagatedMethod);
     if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
       _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.displayName]);
     }
@@ -2256,7 +2083,7 @@
   Object visitPrefixExpression(PrefixExpression node) {
     sc.Token operator = node.operator;
     sc.TokenType operatorType = operator.type;
-    if (operatorType.isUserDefinableOperator || identical(operatorType, sc.TokenType.PLUS_PLUS) || identical(operatorType, sc.TokenType.MINUS_MINUS)) {
+    if (operatorType.isUserDefinableOperator() || identical(operatorType, sc.TokenType.PLUS_PLUS) || identical(operatorType, sc.TokenType.MINUS_MINUS)) {
       Expression operand = node.operand;
       String methodName = getPrefixOperator(node);
       Type2 staticType = getStaticType(operand);
@@ -2264,7 +2091,7 @@
       node.staticElement = staticMethod;
       Type2 propagatedType = getPropagatedType(operand);
       MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, methodName);
-      node.element = select2(staticMethod, propagatedMethod);
+      node.element = select3(staticMethod, propagatedMethod);
       if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
         _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
       }
@@ -2348,7 +2175,7 @@
       }
       return null;
     } else {
-      if (element.isFactory) {
+      if (element.isFactory()) {
         _resolver.reportError(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
       }
     }
@@ -2403,8 +2230,8 @@
 
   /**
    * Given that we have found code to invoke the given element, return the error code that should be
-   * reported, or `null` if no error should be reported.
-   * @param target the target of the invocation, or `null` if there was no target
+   * reported, or {@code null} if no error should be reported.
+   * @param target the target of the invocation, or {@code null} if there was no target
    * @param element the element to be invoked
    * @return the error code that should be reported
    */
@@ -2455,7 +2282,7 @@
           Type2 targetType = getStaticType(target);
           if (targetType == null) {
             return StaticTypeWarningCode.UNDEFINED_FUNCTION;
-          } else if (!targetType.isDynamic && !classDeclaresNoSuchMethod2(targetType.element)) {
+          } else if (!targetType.isDynamic() && !classDeclaresNoSuchMethod2(targetType.element)) {
             return StaticTypeWarningCode.UNDEFINED_METHOD;
           }
         }
@@ -2465,10 +2292,10 @@
   }
 
   /**
-   * Return `true` if the given class declares a method named "noSuchMethod" and is not the
+   * Return {@code true} if the given class declares a method named "noSuchMethod" and is not the
    * class 'Object'.
    * @param element the class being tested
-   * @return `true` if the given class declares a method named "noSuchMethod"
+   * @return {@code true} if the given class declares a method named "noSuchMethod"
    */
   bool classDeclaresNoSuchMethod(ClassElement classElement) {
     if (classElement == null) {
@@ -2479,10 +2306,10 @@
   }
 
   /**
-   * Return `true` if the given element represents a class that declares a method named
+   * Return {@code true} if the given element represents a class that declares a method named
    * "noSuchMethod" and is not the class 'Object'.
    * @param element the element being tested
-   * @return `true` if the given element represents a class that declares a method named
+   * @return {@code true} if the given element represents a class that declares a method named
    * "noSuchMethod"
    */
   bool classDeclaresNoSuchMethod2(Element element) {
@@ -2495,7 +2322,7 @@
   /**
    * Given a list of arguments and the element that will be invoked using those argument, compute
    * the list of parameters that correspond to the list of arguments. Return the parameters that
-   * correspond to the arguments, or `null` if no correspondence could be computed.
+   * correspond to the arguments, or {@code null} if no correspondence could be computed.
    * @param argumentList the list of arguments being passed to the element
    * @param executableElement the element that will be invoked with the arguments
    * @return the parameters that correspond to the arguments
@@ -2552,7 +2379,7 @@
 
   /**
    * Look for any declarations of the given identifier that are imported using a prefix. Return the
-   * element that was found, or `null` if the name is not imported using a prefix.
+   * element that was found, or {@code null} if the name is not imported using a prefix.
    * @param identifier the identifier that might have been imported using a prefix
    * @return the element that was found
    */
@@ -2646,13 +2473,13 @@
   }
 
   /**
-   * Return `true` if the given type represents an object that could be invoked using the call
+   * Return {@code true} if the given type represents an object that could be invoked using the call
    * operator '()'.
    * @param type the type being tested
-   * @return `true` if the given type represents an object that could be invoked
+   * @return {@code true} if the given type represents an object that could be invoked
    */
   bool isExecutableType(Type2 type) {
-    if (type.isDynamic || (type is FunctionType) || type.isDartCoreFunction) {
+    if (type.isDynamic() || (type is FunctionType) || type.isDartCoreFunction()) {
       return true;
     } else if (type is InterfaceType) {
       ClassElement classElement = ((type as InterfaceType)).element;
@@ -2663,32 +2490,32 @@
   }
 
   /**
-   * Return `true` if the given element is a static element.
+   * Return {@code true} if the given element is a static element.
    * @param element the element being tested
-   * @return `true` if the given element is a static element
+   * @return {@code true} if the given element is a static element
    */
   bool isStatic(Element element) {
     if (element is ExecutableElement) {
-      return ((element as ExecutableElement)).isStatic;
+      return ((element as ExecutableElement)).isStatic();
     } else if (element is PropertyInducingElement) {
-      return ((element as PropertyInducingElement)).isStatic;
+      return ((element as PropertyInducingElement)).isStatic();
     }
     return false;
   }
 
   /**
-   * Looks up the method element with the given name for index expression, reports[StaticWarningCode#UNDEFINED_OPERATOR] if not found.
+   * Looks up the method element with the given name for index expression, reports{@link StaticWarningCode#UNDEFINED_OPERATOR} if not found.
    * @param node the index expression to resolve
    * @param target the target of the expression
    * @param methodName the name of the operator associated with the context of using of the given
    * index expression
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    */
   bool lookUpCheckIndexOperator(IndexExpression node, Expression target, String methodName, Type2 staticType, Type2 propagatedType) {
     MethodElement staticMethod = lookUpMethod(target, staticType, methodName);
     MethodElement propagatedMethod = lookUpMethod(target, propagatedType, methodName);
     node.staticElement = staticMethod;
-    node.element = select2(staticMethod, propagatedMethod);
+    node.element = select3(staticMethod, propagatedMethod);
     if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
       sc.Token leftBracket = node.leftBracket;
       sc.Token rightBracket = node.rightBracket;
@@ -2707,8 +2534,8 @@
 
   /**
    * Look up the getter with the given name in the given type. Return the element representing the
-   * getter that was found, or `null` if there is no getter with the given name.
-   * @param target the target of the invocation, or `null` if there is no target
+   * getter that was found, or {@code null} if there is no getter with the given name.
+   * @param target the target of the invocation, or {@code null} if there is no target
    * @param type the type in which the getter is defined
    * @param getterName the name of the getter being looked up
    * @return the element representing the getter that was found
@@ -2733,9 +2560,9 @@
 
   /**
    * Look up the getter with the given name in the interfaces implemented by the given type, either
-   * directly or indirectly. Return the element representing the getter that was found, or`null` if there is no getter with the given name.
+   * directly or indirectly. Return the element representing the getter that was found, or{@code null} if there is no getter with the given name.
    * @param targetType the type in which the getter might be defined
-   * @param includeTargetType `true` if the search should include the target type
+   * @param includeTargetType {@code true} if the search should include the target type
    * @param getterName the name of the getter being looked up
    * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
    * to prevent infinite recursion and to optimize the search
@@ -2774,7 +2601,7 @@
 
   /**
    * Look up the method or getter with the given name in the given type. Return the element
-   * representing the method or getter that was found, or `null` if there is no method or
+   * representing the method or getter that was found, or {@code null} if there is no method or
    * getter with the given name.
    * @param type the type in which the method or getter is defined
    * @param memberName the name of the method or getter being looked up
@@ -2800,9 +2627,9 @@
   /**
    * Look up the method or getter with the given name in the interfaces implemented by the given
    * type, either directly or indirectly. Return the element representing the method or getter that
-   * was found, or `null` if there is no method or getter with the given name.
+   * was found, or {@code null} if there is no method or getter with the given name.
    * @param targetType the type in which the method or getter might be defined
-   * @param includeTargetType `true` if the search should include the target type
+   * @param includeTargetType {@code true} if the search should include the target type
    * @param memberName the name of the method or getter being looked up
    * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
    * to prevent infinite recursion and to optimize the search
@@ -2884,8 +2711,8 @@
 
   /**
    * Look up the method with the given name in the given type. Return the element representing the
-   * method that was found, or `null` if there is no method with the given name.
-   * @param target the target of the invocation, or `null` if there is no target
+   * method that was found, or {@code null} if there is no method with the given name.
+   * @param target the target of the invocation, or {@code null} if there is no target
    * @param type the type in which the method is defined
    * @param methodName the name of the method being looked up
    * @return the element representing the method that was found
@@ -2910,9 +2737,9 @@
 
   /**
    * Look up the method with the given name in the interfaces implemented by the given type, either
-   * directly or indirectly. Return the element representing the method that was found, or`null` if there is no method with the given name.
+   * directly or indirectly. Return the element representing the method that was found, or{@code null} if there is no method with the given name.
    * @param targetType the type in which the member might be defined
-   * @param includeTargetType `true` if the search should include the target type
+   * @param includeTargetType {@code true} if the search should include the target type
    * @param methodName the name of the method being looked up
    * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
    * to prevent infinite recursion and to optimize the search
@@ -2951,8 +2778,8 @@
 
   /**
    * Look up the setter with the given name in the given type. Return the element representing the
-   * setter that was found, or `null` if there is no setter with the given name.
-   * @param target the target of the invocation, or `null` if there is no target
+   * setter that was found, or {@code null} if there is no setter with the given name.
+   * @param target the target of the invocation, or {@code null} if there is no target
    * @param type the type in which the setter is defined
    * @param setterName the name of the setter being looked up
    * @return the element representing the setter that was found
@@ -2977,9 +2804,9 @@
 
   /**
    * Look up the setter with the given name in the interfaces implemented by the given type, either
-   * directly or indirectly. Return the element representing the setter that was found, or`null` if there is no setter with the given name.
+   * directly or indirectly. Return the element representing the setter that was found, or{@code null} if there is no setter with the given name.
    * @param targetType the type in which the setter might be defined
-   * @param includeTargetType `true` if the search should include the target type
+   * @param includeTargetType {@code true} if the search should include the target type
    * @param setterName the name of the setter being looked up
    * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
    * to prevent infinite recursion and to optimize the search
@@ -3079,8 +2906,8 @@
   /**
    * Given a list of arguments and the element that will be invoked using those argument, compute
    * the list of parameters that correspond to the list of arguments. Return the parameters that
-   * correspond to the arguments, or `null` if no correspondence could be computed.
-   * @param reportError if `true` then compile-time error should be reported; if `false`then compile-time warning
+   * correspond to the arguments, or {@code null} if no correspondence could be computed.
+   * @param reportError if {@code true} then compile-time error should be reported; if {@code false}then compile-time warning
    * @param argumentList the list of arguments being passed to the element
    * @param executableElement the element that will be invoked with the arguments
    * @return the parameters that correspond to the arguments
@@ -3097,7 +2924,7 @@
    * Given a list of arguments and the parameters related to the element that will be invoked using
    * those argument, compute the list of parameters that correspond to the list of arguments. Return
    * the parameters that correspond to the arguments.
-   * @param reportError if `true` then compile-time error should be reported; if `false`then compile-time warning
+   * @param reportError if {@code true} then compile-time error should be reported; if {@code false}then compile-time warning
    * @param argumentList the list of arguments being passed to the element
    * @param parameters the of the function that will be invoked with the arguments
    * @return the parameters that correspond to the arguments
@@ -3266,7 +3093,7 @@
     propertyName.staticElement = staticElement;
     Type2 propagatedType = getPropagatedType(target);
     ExecutableElement propagatedElement = resolveProperty(target, propagatedType, propertyName);
-    Element selectedElement = select(staticElement, propagatedElement);
+    Element selectedElement = select2(staticElement, propagatedElement);
     propertyName.element = selectedElement;
     if (shouldReportMissingMember(staticType, staticElement) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedElement))) {
       bool staticNoSuchMethod = staticType != null && classDeclaresNoSuchMethod2(staticType.element);
@@ -3294,7 +3121,7 @@
 
   /**
    * Resolve the given simple identifier if possible. Return the element to which it could be
-   * resolved, or `null` if it could not be resolved. This does not record the results of the
+   * resolved, or {@code null} if it could not be resolved. This does not record the results of the
    * resolution.
    * @param node the identifier to be resolved
    * @return the element to which the identifier could be resolved
@@ -3353,20 +3180,35 @@
   }
 
   /**
-   * Return the propagated element if it is not `null`, or the static element if it is.
+   * Given two possible error codes for the same piece of code, one computed using static type
+   * information and the other using propagated type information, return the error code that should
+   * be reported, or {@code null} if no error should be reported.
+   * @param staticError the error code computed using static type information
+   * @param propagatedError the error code computed using propagated type information
+   * @return the error code that should be reported
+   */
+  ErrorCode select(ErrorCode staticError, ErrorCode propagatedError) {
+    if (staticError == null || propagatedError == null) {
+      return null;
+    }
+    return propagatedError;
+  }
+
+  /**
+   * Return the propagated element if it is not {@code null}, or the static element if it is.
    * @param staticElement the element computed using static type information
    * @param propagatedElement the element computed using propagated type information
    * @return the more specific of the two elements
    */
-  ExecutableElement select(ExecutableElement staticElement, ExecutableElement propagatedElement) => propagatedElement != null ? propagatedElement : staticElement;
+  ExecutableElement select2(ExecutableElement staticElement, ExecutableElement propagatedElement) => propagatedElement != null ? propagatedElement : staticElement;
 
   /**
-   * Return the propagated method if it is not `null`, or the static method if it is.
+   * Return the propagated method if it is not {@code null}, or the static method if it is.
    * @param staticMethod the method computed using static type information
    * @param propagatedMethod the method computed using propagated type information
    * @return the more specific of the two methods
    */
-  MethodElement select2(MethodElement staticMethod, MethodElement propagatedMethod) => propagatedMethod != null ? propagatedMethod : staticMethod;
+  MethodElement select3(MethodElement staticMethod, MethodElement propagatedMethod) => propagatedMethod != null ? propagatedMethod : staticMethod;
 
   /**
    * Given a node that can have annotations associated with it and the element to which that node
@@ -3398,14 +3240,14 @@
   }
 
   /**
-   * Return `true` if we should report an error as a result of looking up a member in the
+   * Return {@code true} if we should report an error as a result of looking up a member in the
    * given type and not finding any member.
    * @param type the type in which we attempted to perform the look-up
    * @param member the result of the look-up
-   * @return `true` if we should report an error
+   * @return {@code true} if we should report an error
    */
   bool shouldReportMissingMember(Type2 type, ExecutableElement member) {
-    if (member != null || type == null || type.isDynamic) {
+    if (member != null || type == null || type.isDynamic()) {
       return false;
     }
     if (type is InterfaceType) {
@@ -3415,7 +3257,7 @@
   }
 }
 /**
- * Instances of the class `SyntheticIdentifier` implement an identifier that can be used to
+ * Instances of the class {@code SyntheticIdentifier} implement an identifier that can be used to
  * look up names in the lexical scope when there is no identifier in the AST structure. There is
  * no identifier in the AST when the parser could not distinguish between a method invocation and
  * an invocation of a top-level function imported with a prefix.
@@ -3444,31 +3286,31 @@
   }
 }
 /**
- * Instances of the class `InheritanceManager` manage the knowledge of where class members
+ * Instances of the class {@code InheritanceManager} manage the knowledge of where class members
  * (methods, getters & setters) are inherited from.
  * @coverage dart.engine.resolver
  */
 class InheritanceManager {
 
   /**
-   * The [LibraryElement] that is managed by this manager.
+   * The {@link LibraryElement} that is managed by this manager.
    */
   LibraryElement _library;
 
   /**
-   * This is a mapping between each [ClassElement] and a map between the [String] member
-   * names and the associated [ExecutableElement] in the mixin and superclass chain.
+   * This is a mapping between each {@link ClassElement} and a map between the {@link String} member
+   * names and the associated {@link ExecutableElement} in the mixin and superclass chain.
    */
   Map<ClassElement, Map<String, ExecutableElement>> _classLookup;
 
   /**
-   * This is a mapping between each [ClassElement] and a map between the [String] member
-   * names and the associated [ExecutableElement] in the interface set.
+   * This is a mapping between each {@link ClassElement} and a map between the {@link String} member
+   * names and the associated {@link ExecutableElement} in the interface set.
    */
   Map<ClassElement, Map<String, ExecutableElement>> _interfaceLookup;
 
   /**
-   * A map between each visited [ClassElement] and the set of [AnalysisError]s found on
+   * A map between each visited {@link ClassElement} and the set of {@link AnalysisError}s found on
    * the class element.
    */
   Map<ClassElement, Set<AnalysisError>> _errorsInClassElement = new Map<ClassElement, Set<AnalysisError>>();
@@ -3484,35 +3326,35 @@
   }
 
   /**
-   * Return the set of [AnalysisError]s found on the passed [ClassElement], or`null` if there are none.
+   * Return the set of {@link AnalysisError}s found on the passed {@link ClassElement}, or{@code null} if there are none.
    * @param classElt the class element to query
-   * @return the set of [AnalysisError]s found on the passed [ClassElement], or`null` if there are none
+   * @return the set of {@link AnalysisError}s found on the passed {@link ClassElement}, or{@code null} if there are none
    */
   Set<AnalysisError> getErrors(ClassElement classElt) => _errorsInClassElement[classElt];
 
   /**
    * Get and return a mapping between the set of all string names of the members inherited from the
-   * passed [ClassElement] superclass hierarchy, and the associated [ExecutableElement].
+   * passed {@link ClassElement} superclass hierarchy, and the associated {@link ExecutableElement}.
    * @param classElt the class element to query
-   * @return a mapping between the set of all members inherited from the passed [ClassElement]superclass hierarchy, and the associated [ExecutableElement]
+   * @return a mapping between the set of all members inherited from the passed {@link ClassElement}superclass hierarchy, and the associated {@link ExecutableElement}
    */
   Map<String, ExecutableElement> getMapOfMembersInheritedFromClasses(ClassElement classElt) => computeClassChainLookupMap(classElt, new Set<ClassElement>());
 
   /**
    * Get and return a mapping between the set of all string names of the members inherited from the
-   * passed [ClassElement] interface hierarchy, and the associated [ExecutableElement].
+   * passed {@link ClassElement} interface hierarchy, and the associated {@link ExecutableElement}.
    * @param classElt the class element to query
-   * @return a mapping between the set of all string names of the members inherited from the passed[ClassElement] interface hierarchy, and the associated [ExecutableElement].
+   * @return a mapping between the set of all string names of the members inherited from the passed{@link ClassElement} interface hierarchy, and the associated {@link ExecutableElement}.
    */
   Map<String, ExecutableElement> getMapOfMembersInheritedFromInterfaces(ClassElement classElt) => computeInterfaceLookupMap(classElt, new Set<ClassElement>());
 
   /**
-   * Given some [ClassElement class element] and some member name, this returns the[ExecutableElement executable element] that the class inherits from the mixins,
-   * superclasses or interfaces, that has the member name, if no member is inherited `null` is
+   * Given some {@link ClassElement class element} and some member name, this returns the{@link ExecutableElement executable element} that the class inherits from the mixins,
+   * superclasses or interfaces, that has the member name, if no member is inherited {@code null} is
    * returned.
    * @param classElt the class element to query
    * @param memberName the name of the executable element to find and return
-   * @return the inherited executable element with the member name, or `null` if no such
+   * @return the inherited executable element with the member name, or {@code null} if no such
    * member exists
    */
   ExecutableElement lookupInheritance(ClassElement classElt, String memberName) {
@@ -3527,11 +3369,11 @@
   }
 
   /**
-   * Given some [ClassElement class element] and some member name, this returns the[ExecutableElement executable element] that the class either declares itself, or
-   * inherits, that has the member name, if no member is inherited `null` is returned.
+   * Given some {@link ClassElement class element} and some member name, this returns the{@link ExecutableElement executable element} that the class either declares itself, or
+   * inherits, that has the member name, if no member is inherited {@code null} is returned.
    * @param classElt the class element to query
    * @param memberName the name of the executable element to find and return
-   * @return the inherited executable element with the member name, or `null` if no such
+   * @return the inherited executable element with the member name, or {@code null} if no such
    * member exists
    */
   ExecutableElement lookupMember(ClassElement classElt, String memberName) {
@@ -3551,7 +3393,7 @@
   }
 
   /**
-   * This method takes some inherited [FunctionType], and resolves all the parameterized types
+   * This method takes some inherited {@link FunctionType}, and resolves all the parameterized types
    * in the function type, dependent on the class in which it is being overridden.
    * @param baseFunctionType the function type that is being overridden
    * @param memberName the name of the member, this is used to lookup the inheritance path of the
@@ -3571,9 +3413,9 @@
     FunctionType functionTypeToReturn = baseFunctionType;
     InterfaceType lastType = inheritancePath.removeLast();
     while (inheritancePath.length > 0) {
-      List<Type2> parameterTypes = lastType.element.type.typeArguments;
-      List<Type2> argumentTypes = lastType.typeArguments;
-      functionTypeToReturn = functionTypeToReturn.substitute2(argumentTypes, parameterTypes);
+      List<Type2> paramTypes = TypeVariableTypeImpl.getTypes(lastType.element.typeVariables);
+      List<Type2> argTypes = lastType.typeArguments;
+      functionTypeToReturn = functionTypeToReturn.substitute2(argTypes, paramTypes);
       lastType = inheritancePath.removeLast();
     }
     return functionTypeToReturn;
@@ -3581,11 +3423,11 @@
 
   /**
    * Compute and return a mapping between the set of all string names of the members inherited from
-   * the passed [ClassElement] superclass hierarchy, and the associated[ExecutableElement].
+   * the passed {@link ClassElement} superclass hierarchy, and the associated{@link ExecutableElement}.
    * @param classElt the class element to query
    * @param visitedClasses a set of visited classes passed back into this method when it calls
    * itself recursively
-   * @return a mapping between the set of all string names of the members inherited from the passed[ClassElement] superclass hierarchy, and the associated [ExecutableElement]
+   * @return a mapping between the set of all string names of the members inherited from the passed{@link ClassElement} superclass hierarchy, and the associated {@link ExecutableElement}
    */
   Map<String, ExecutableElement> computeClassChainLookupMap(ClassElement classElt, Set<ClassElement> visitedClasses) {
     Map<String, ExecutableElement> resultMap = _classLookup[classElt];
@@ -3627,7 +3469,7 @@
    * Compute and return the inheritance path given the context of a type and a member that is
    * overridden in the inheritance path (for which the type is in the path).
    * @param chain the inheritance path that is built up as this method calls itself recursively,
-   * when this method is called an empty [LinkedList] should be provided
+   * when this method is called an empty {@link LinkedList} should be provided
    * @param currentType the current type in the inheritance path
    * @param memberName the name of the member that is being looked up the inheritance path
    */
@@ -3671,11 +3513,11 @@
 
   /**
    * Compute and return a mapping between the set of all string names of the members inherited from
-   * the passed [ClassElement] interface hierarchy, and the associated[ExecutableElement].
+   * the passed {@link ClassElement} interface hierarchy, and the associated{@link ExecutableElement}.
    * @param classElt the class element to query
    * @param visitedInterfaces a set of visited classes passed back into this method when it calls
    * itself recursively
-   * @return a mapping between the set of all string names of the members inherited from the passed[ClassElement] interface hierarchy, and the associated [ExecutableElement]
+   * @return a mapping between the set of all string names of the members inherited from the passed{@link ClassElement} interface hierarchy, and the associated {@link ExecutableElement}
    */
   Map<String, ExecutableElement> computeInterfaceLookupMap(ClassElement classElt, Set<ClassElement> visitedInterfaces) {
     Map<String, ExecutableElement> resultMap = _interfaceLookup[classElt];
@@ -3687,7 +3529,7 @@
     InterfaceType supertype = classElt.supertype;
     ClassElement superclassElement = supertype != null ? supertype.element : null;
     List<InterfaceType> interfaces = classElt.interfaces;
-    if ((superclassElement == null || supertype.isObject) && interfaces.length == 0) {
+    if (superclassElement == null || interfaces.length == 0) {
       _interfaceLookup[classElt] = resultMap;
       return resultMap;
     }
@@ -3751,7 +3593,7 @@
     if (superclassElement != null) {
       List<MethodElement> methods = superclassElement.methods;
       for (MethodElement method in methods) {
-        if (method.isAccessibleIn(_library) && !method.isStatic) {
+        if (method.isAccessibleIn(_library) && !method.isStatic()) {
           String key = method.name;
           if (!unionMap.containsKey(key)) {
             Set<ExecutableElement> set = new Set<ExecutableElement>();
@@ -3764,7 +3606,7 @@
       }
       List<PropertyAccessorElement> accessors = superclassElement.accessors;
       for (PropertyAccessorElement accessor in accessors) {
-        if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
+        if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) {
           String key = accessor.name;
           if (!unionMap.containsKey(key)) {
             Set<ExecutableElement> set = new Set<ExecutableElement>();
@@ -3781,7 +3623,7 @@
       if (interfaceElement != null) {
         List<MethodElement> methods = interfaceElement.methods;
         for (MethodElement method in methods) {
-          if (method.isAccessibleIn(_library) && !method.isStatic) {
+          if (method.isAccessibleIn(_library) && !method.isStatic()) {
             String key = method.name;
             if (!unionMap.containsKey(key)) {
               Set<ExecutableElement> set = new Set<ExecutableElement>();
@@ -3794,7 +3636,7 @@
         }
         List<PropertyAccessorElement> accessors = interfaceElement.accessors;
         for (PropertyAccessorElement accessor in accessors) {
-          if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
+          if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) {
             String key = accessor.name;
             if (!unionMap.containsKey(key)) {
               Set<ExecutableElement> set = new Set<ExecutableElement>();
@@ -3820,7 +3662,7 @@
         for (ExecutableElement executableElement in set) {
           if (executableElement is PropertyAccessorElement) {
             allMethods = false;
-            if (((executableElement as PropertyAccessorElement)).isSetter) {
+            if (((executableElement as PropertyAccessorElement)).isSetter()) {
               allGetters = false;
             } else {
               allSetters = false;
@@ -3873,23 +3715,23 @@
   }
 
   /**
-   * Given some [ClassElement], this method finds and returns the [ExecutableElement] of
+   * Given some {@link ClassElement}, this method finds and returns the {@link ExecutableElement} of
    * the passed name in the class element. Static members, members in super types and members not
    * accessible from the current library are not considered.
    * @param classElt the class element to query
    * @param memberName the name of the member to lookup in the class
-   * @return the found [ExecutableElement], or `null` if no such member was found
+   * @return the found {@link ExecutableElement}, or {@code null} if no such member was found
    */
   ExecutableElement lookupMemberInClass(ClassElement classElt, String memberName) {
     List<MethodElement> methods = classElt.methods;
     for (MethodElement method in methods) {
-      if (memberName == method.name && method.isAccessibleIn(_library) && !method.isStatic) {
+      if (memberName == method.name && method.isAccessibleIn(_library) && !method.isStatic()) {
         return method;
       }
     }
     List<PropertyAccessorElement> accessors = classElt.accessors;
     for (PropertyAccessorElement accessor in accessors) {
-      if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !accessor.isStatic) {
+      if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !accessor.isStatic()) {
         return accessor;
       }
     }
@@ -3899,19 +3741,19 @@
   /**
    * Record the passed map with the set of all members (methods, getters and setters) in the class
    * into the passed map.
-   * @param map some non-`null`
+   * @param map some non-{@code null}
    * @param classElt the class element that will be recorded into the passed map
    */
   void recordMapWithClassMembers(Map<String, ExecutableElement> map, ClassElement classElt) {
     List<MethodElement> methods = classElt.methods;
     for (MethodElement method in methods) {
-      if (method.isAccessibleIn(_library) && !method.isStatic) {
+      if (method.isAccessibleIn(_library) && !method.isStatic()) {
         map[method.name] = method;
       }
     }
     List<PropertyAccessorElement> accessors = classElt.accessors;
     for (PropertyAccessorElement accessor in accessors) {
-      if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
+      if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) {
         map[accessor.name] = accessor;
       }
     }
@@ -3919,7 +3761,7 @@
 
   /**
    * This method is used to report errors on when they are found computing inheritance information.
-   * See [ErrorVerifier#checkForInconsistentMethodInheritance] to see where these generated
+   * See {@link ErrorVerifier#checkForInconsistentMethodInheritance()} to see where these generated
    * error codes are reported back into the analysis engine.
    * @param classElt the location of the source for which the exception occurred
    * @param offset the offset of the location of the error
@@ -3937,7 +3779,7 @@
   }
 }
 /**
- * Instances of the class `Library` represent the data about a single library during the
+ * Instances of the class {@code Library} represent the data about a single library during the
  * resolution of some (possibly different) library. They are not intended to be used except during
  * the resolution process.
  * @coverage dart.engine.resolver
@@ -4060,8 +3902,8 @@
   CompilationUnit get definingCompilationUnit => getAST(librarySource);
 
   /**
-   * Return `true` if this library explicitly imports core.
-   * @return `true` if this library explicitly imports core
+   * Return {@code true} if this library explicitly imports core.
+   * @return {@code true} if this library explicitly imports core
    */
   bool get explicitlyImportsCore => _explicitlyImportsCore;
 
@@ -4156,7 +3998,7 @@
 
   /**
    * Return the result of resolving the URI of the given URI-based directive against the URI of the
-   * library, or `null` if the URI is not valid. If the URI is not valid, report the error.
+   * library, or {@code null} if the URI is not valid. If the URI is not valid, report the error.
    * @param directive the directive which URI should be resolved
    * @return the result of resolving the URI against the URI of the library
    */
@@ -4197,7 +4039,7 @@
 
   /**
    * Set whether this library explicitly imports core to match the given value.
-   * @param explicitlyImportsCore `true` if this library explicitly imports core
+   * @param explicitlyImportsCore {@code true} if this library explicitly imports core
    */
   void set explicitlyImportsCore(bool explicitlyImportsCore2) {
     this._explicitlyImportsCore = explicitlyImportsCore2;
@@ -4216,7 +4058,7 @@
   String toString() => _librarySource.shortName;
 
   /**
-   * Return the result of resolving the given URI against the URI of the library, or `null` if
+   * Return the result of resolving the given URI against the URI of the library, or {@code null} if
    * the URI is not valid.
    * @param uri the URI to be resolved
    * @return the result of resolving the given URI against the URI of the library
@@ -4229,7 +4071,7 @@
   }
 }
 /**
- * Instances of the class `LibraryElementBuilder` build an element model for a single library.
+ * Instances of the class {@code LibraryElementBuilder} build an element model for a single library.
  * @coverage dart.engine.resolver
  */
 class LibraryElementBuilder {
@@ -4333,12 +4175,12 @@
    */
   void collectAccessors(Map<String, PropertyAccessorElement> getters, List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
     for (PropertyAccessorElement accessor in unit.accessors) {
-      if (accessor.isGetter) {
-        if (!accessor.isSynthetic && accessor.correspondingSetter == null) {
+      if (accessor.isGetter()) {
+        if (!accessor.isSynthetic() && accessor.correspondingSetter == null) {
           getters[accessor.displayName] = accessor;
         }
       } else {
-        if (!accessor.isSynthetic && accessor.correspondingGetter == null) {
+        if (!accessor.isSynthetic() && accessor.correspondingGetter == null) {
           setters.add(accessor);
         }
       }
@@ -4348,7 +4190,7 @@
   /**
    * Search the top-level functions defined in the given compilation unit for the entry point.
    * @param element the compilation unit to be searched
-   * @return the entry point that was found, or `null` if the compilation unit does not define
+   * @return the entry point that was found, or {@code null} if the compilation unit does not define
    * an entry point
    */
   FunctionElement findEntryPoint(CompilationUnitElementImpl element) {
@@ -4361,7 +4203,7 @@
   }
 
   /**
-   * Return the name of the library that the given part is declared to be a part of, or `null`if the part does not contain a part-of directive.
+   * Return the name of the library that the given part is declared to be a part of, or {@code null}if the part does not contain a part-of directive.
    * @param library the library containing the part
    * @param partSource the source representing the part
    * @param directivesToResolve a list of directives that should be resolved to the library being
@@ -4409,7 +4251,7 @@
   }
 }
 /**
- * Instances of the class `LibraryResolver` are used to resolve one or more mutually dependent
+ * Instances of the class {@code LibraryResolver} are used to resolve one or more mutually dependent
  * libraries within a single context.
  * @coverage dart.engine.resolver
  */
@@ -4422,7 +4264,7 @@
 
   /**
    * The listener to which analysis errors will be reported, this error listener is either
-   * references [recordingErrorListener], or it unions the passed[AnalysisErrorListener] with the [recordingErrorListener].
+   * references {@link #recordingErrorListener}, or it unions the passed{@link AnalysisErrorListener} with the {@link #recordingErrorListener}.
    */
   RecordingErrorListener _errorListener;
 
@@ -4485,7 +4327,7 @@
    * @param librarySource the source specifying the defining compilation unit of the library to be
    * resolved
    * @param unit the compilation unit representing the embedded library
-   * @param fullAnalysis `true` if a full analysis should be performed
+   * @param fullAnalysis {@code true} if a full analysis should be performed
    * @return the element representing the resolved library
    * @throws AnalysisException if the library could not be resolved for some reason
    */
@@ -4529,13 +4371,13 @@
 
   /**
    * Resolve the library specified by the given source in the given context.
-   *
+   * <p>
    * Note that because Dart allows circular imports between libraries, it is possible that more than
    * one library will need to be resolved. In such cases the error listener can receive errors from
    * multiple libraries.
    * @param librarySource the source specifying the defining compilation unit of the library to be
    * resolved
-   * @param fullAnalysis `true` if a full analysis should be performed
+   * @param fullAnalysis {@code true} if a full analysis should be performed
    * @return the element representing the resolved library
    * @throws AnalysisException if the library could not be resolved for some reason
    */
@@ -4658,7 +4500,7 @@
   }
 
   /**
-   * Every library now has a corresponding [LibraryElement], so it is now possible to resolve
+   * Every library now has a corresponding {@link LibraryElement}, so it is now possible to resolve
    * the import and export directives.
    * @throws AnalysisException if the defining compilation unit for any of the libraries could not
    * be accessed
@@ -4752,7 +4594,7 @@
    * Compute a dependency map of libraries reachable from the given library. A dependency map is a
    * table that maps individual libraries to a list of the libraries that either import or export
    * those libraries.
-   *
+   * <p>
    * This map is used to compute all of the libraries involved in a cycle that include the root
    * library. Given that we only add libraries that are reachable from the root library, when we
    * work backward we are guaranteed to only get libraries in the cycle.
@@ -4780,7 +4622,7 @@
 
   /**
    * Recursively traverse the libraries reachable from the given library, creating instances of the
-   * class [Library] to represent them, and record the references in the library objects.
+   * class {@link Library} to represent them, and record the references in the library objects.
    * @param library the library to be processed to find libraries that have not yet been traversed
    * @throws AnalysisException if some portion of the library graph could not be traversed
    */
@@ -4873,7 +4715,7 @@
 
   /**
    * Create an object to represent the information about the library defined by the compilation unit
-   * with the given source. Return the library object that was created, or `null` if the
+   * with the given source. Return the library object that was created, or {@code null} if the
    * source is not valid.
    * @param librarySource the source of the library's defining compilation unit
    * @return the library object that was created
@@ -4893,9 +4735,9 @@
   }
 
   /**
-   * Return `true` if and only if the passed [CompilationUnit] has a part-of directive.
-   * @param node the [CompilationUnit] to test
-   * @return `true` if and only if the passed [CompilationUnit] has a part-of directive
+   * Return {@code true} if and only if the passed {@link CompilationUnit} has a part-of directive.
+   * @param node the {@link CompilationUnit} to test
+   * @return {@code true} if and only if the passed {@link CompilationUnit} has a part-of directive
    */
   bool doesCompilationUnitHavePartOfDirective(CompilationUnit node) {
     NodeList<Directive> directives = node.directives;
@@ -4966,7 +4808,7 @@
   }
 
   /**
-   * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier]analysis in the current cycle.
+   * Run additional analyses, such as the {@link ConstantVerifier} and {@link ErrorVerifier}analysis in the current cycle.
    * @throws AnalysisException if any of the identifiers could not be resolved or if the types in
    * the library cannot be analyzed
    */
@@ -4977,7 +4819,7 @@
   }
 
   /**
-   * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier]analysis in the given library.
+   * Run additional analyses, such as the {@link ConstantVerifier} and {@link ErrorVerifier}analysis in the given library.
    * @param library the library to have the extra analyses processes run
    * @throws AnalysisException if any of the identifiers could not be resolved or if the types in
    * the library cannot be analyzed
@@ -4986,15 +4828,16 @@
     for (Source source in library.compilationUnitSources) {
       ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
       CompilationUnit unit = library.getAST(source);
-      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _typeProvider);
-      unit.accept(constantVerifier);
       ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, library.libraryElement, _typeProvider, library.inheritanceManager);
       unit.accept(errorVerifier);
+      unit.accept(new PubVerifier(_analysisContext, errorReporter));
+      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _typeProvider);
+      unit.accept(constantVerifier);
     }
   }
 }
 /**
- * Instances of the class `ResolverVisitor` are used to resolve the nodes within a single
+ * Instances of the class {@code ResolverVisitor} are used to resolve the nodes within a single
  * compilation unit.
  * @coverage dart.engine.resolver
  */
@@ -5011,13 +4854,13 @@
   StaticTypeAnalyzer _typeAnalyzer;
 
   /**
-   * The class element representing the class containing the current node, or `null` if the
+   * The class element representing the class containing the current node, or {@code null} if the
    * current node is not contained in a class.
    */
   ClassElement _enclosingClass = null;
 
   /**
-   * The element representing the function containing the current node, or `null` if the
+   * The element representing the function containing the current node, or {@code null} if the
    * current node is not contained in a function.
    */
   ExecutableElement _enclosingFunction = null;
@@ -5034,9 +4877,9 @@
    * @param typeProvider the object used to access the types from the core library
    */
   ResolverVisitor.con1(Library library, Source source, TypeProvider typeProvider) : super.con1(library, source, typeProvider) {
-    _jtd_constructor_274_impl(library, source, typeProvider);
+    _jtd_constructor_273_impl(library, source, typeProvider);
   }
-  _jtd_constructor_274_impl(Library library, Source source, TypeProvider typeProvider) {
+  _jtd_constructor_273_impl(Library library, Source source, TypeProvider typeProvider) {
     this._elementResolver = new ElementResolver(this);
     this._typeAnalyzer = new StaticTypeAnalyzer(this);
   }
@@ -5051,9 +4894,9 @@
    * during resolution
    */
   ResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) : super.con2(definingLibrary, source, typeProvider, errorListener) {
-    _jtd_constructor_275_impl(definingLibrary, source, typeProvider, errorListener);
+    _jtd_constructor_274_impl(definingLibrary, source, typeProvider, errorListener);
   }
-  _jtd_constructor_275_impl(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
+  _jtd_constructor_274_impl(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
     this._elementResolver = new ElementResolver(this);
     this._typeAnalyzer = new StaticTypeAnalyzer(this);
   }
@@ -5432,21 +5275,21 @@
   }
 
   /**
-   * Return the class element representing the class containing the current node, or `null` if
+   * Return the class element representing the class containing the current node, or {@code null} if
    * the current node is not contained in a class.
    * @return the class element representing the class containing the current node
    */
   ClassElement get enclosingClass => _enclosingClass;
 
   /**
-   * Return the element representing the function containing the current node, or `null` if
+   * Return the element representing the function containing the current node, or {@code null} if
    * the current node is not contained in a function.
    * @return the element representing the function containing the current node
    */
   ExecutableElement get enclosingFunction => _enclosingFunction;
 
   /**
-   * Return the element associated with the given expression whose type can be overridden, or`null` if there is no element whose type can be overridden.
+   * Return the element associated with the given expression whose type can be overridden, or{@code null} if there is no element whose type can be overridden.
    * @param expression the expression with which the element is associated
    * @return the element associated with the given expression
    */
@@ -5478,7 +5321,7 @@
     }
     if (element is PropertyInducingElement) {
       PropertyInducingElement variable = element as PropertyInducingElement;
-      if (!variable.isConst && !variable.isFinal) {
+      if (!variable.isConst() && !variable.isFinal()) {
         return;
       }
     }
@@ -5545,7 +5388,7 @@
   /**
    * The given expression is the expression used to compute the iterator for a for-each statement.
    * Attempt to compute the type of objects that will be assigned to the loop variable and return
-   * that type. Return `null` if the type could not be determined.
+   * that type. Return {@code null} if the type could not be determined.
    * @param iterator the iterator for a for-each statement
    * @return the type of objects that will be assigned to the loop variable
    */
@@ -5569,10 +5412,10 @@
   }
 
   /**
-   * Return `true` if the given expression terminates abruptly (that is, if any expression
+   * Return {@code true} if the given expression terminates abruptly (that is, if any expression
    * following the given expression will not be reached).
    * @param expression the expression being tested
-   * @return `true` if the given expression terminates abruptly
+   * @return {@code true} if the given expression terminates abruptly
    */
   bool isAbruptTermination(Expression expression2) {
     while (expression2 is ParenthesizedExpression) {
@@ -5582,10 +5425,10 @@
   }
 
   /**
-   * Return `true` if the given statement terminates abruptly (that is, if any statement
+   * Return {@code true} if the given statement terminates abruptly (that is, if any statement
    * following the given statement will not be reached).
    * @param statement the statement being tested
-   * @return `true` if the given statement terminates abruptly
+   * @return {@code true} if the given statement terminates abruptly
    */
   bool isAbruptTermination2(Statement statement) {
     if (statement is ReturnStatement || statement is BreakStatement || statement is ContinueStatement) {
@@ -5682,7 +5525,7 @@
   set enclosingClass_J2DAccessor(__v) => _enclosingClass = __v;
 }
 /**
- * The abstract class `ScopedVisitor` maintains name and label scopes as an AST structure is
+ * The abstract class {@code ScopedVisitor} maintains name and label scopes as an AST structure is
  * being visited.
  * @coverage dart.engine.resolver
  */
@@ -5714,7 +5557,7 @@
   TypeProvider _typeProvider;
 
   /**
-   * The scope used to resolve labels for `break` and `continue` statements, or`null` if no labels have been defined in the current context.
+   * The scope used to resolve labels for {@code break} and {@code continue} statements, or{@code null} if no labels have been defined in the current context.
    */
   LabelScope _labelScope;
 
@@ -5725,9 +5568,9 @@
    * @param typeProvider the object used to access the types from the core library
    */
   ScopedVisitor.con1(Library library, Source source2, TypeProvider typeProvider2) {
-    _jtd_constructor_276_impl(library, source2, typeProvider2);
+    _jtd_constructor_275_impl(library, source2, typeProvider2);
   }
-  _jtd_constructor_276_impl(Library library, Source source2, TypeProvider typeProvider2) {
+  _jtd_constructor_275_impl(Library library, Source source2, TypeProvider typeProvider2) {
     this._definingLibrary = library.libraryElement;
     this._source = source2;
     LibraryScope libraryScope = library.libraryScope;
@@ -5746,9 +5589,9 @@
    * during resolution
    */
   ScopedVisitor.con2(LibraryElement definingLibrary2, Source source2, TypeProvider typeProvider2, AnalysisErrorListener errorListener2) {
-    _jtd_constructor_277_impl(definingLibrary2, source2, typeProvider2, errorListener2);
+    _jtd_constructor_276_impl(definingLibrary2, source2, typeProvider2, errorListener2);
   }
-  _jtd_constructor_277_impl(LibraryElement definingLibrary2, Source source2, TypeProvider typeProvider2, AnalysisErrorListener errorListener2) {
+  _jtd_constructor_276_impl(LibraryElement definingLibrary2, Source source2, TypeProvider typeProvider2, AnalysisErrorListener errorListener2) {
     this._definingLibrary = definingLibrary2;
     this._source = source2;
     this._errorListener = errorListener2;
@@ -6081,12 +5924,12 @@
   }
 }
 /**
- * Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. First, they
+ * Instances of the class {@code StaticTypeAnalyzer} perform two type-related tasks. First, they
  * compute the static type of every expression. Second, they look for any static type errors or
  * warnings that might need to be generated. The requirements for the type analyzer are:
  * <ol>
- * * Every element that refers to types should be fully populated.
- * * Every node representing an expression should be resolved to the Type of the expression.
+ * <li>Every element that refers to types should be fully populated.
+ * <li>Every node representing an expression should be resolved to the Type of the expression.</li>
  * </ol>
  * @coverage dart.engine.resolver
  */
@@ -6176,7 +6019,7 @@
   Type2 _dynamicType;
 
   /**
-   * The type representing the class containing the nodes being analyzed, or `null` if the
+   * The type representing the class containing the nodes being analyzed, or {@code null} if the
    * nodes are not within a class.
    */
   InterfaceType _thisType;
@@ -6212,7 +6055,7 @@
   }
 
   /**
-   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is`String`.</blockquote>
+   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is{@code String}.</blockquote>
    */
   Object visitAdjacentStrings(AdjacentStrings node) {
     recordStaticType(node, _typeProvider.stringType);
@@ -6221,7 +6064,7 @@
 
   /**
    * The Dart Language Specification, 12.33: <blockquote>The static type of an argument definition
-   * test is `bool`.</blockquote>
+   * test is {@code bool}.</blockquote>
    */
   Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     recordStaticType(node, _typeProvider.boolType);
@@ -6230,10 +6073,10 @@
 
   /**
    * The Dart Language Specification, 12.32: <blockquote>... the cast expression <i>e as T</i> ...
-   *
+   * <p>
    * It is a static warning if <i>T</i> does not denote a type available in the current lexical
    * scope.
-   *
+   * <p>
    * The static type of a cast expression <i>e as T</i> is <i>T</i>.</blockquote>
    */
   Object visitAsExpression(AsExpression node) {
@@ -6244,33 +6087,33 @@
   /**
    * The Dart Language Specification, 12.18: <blockquote>... an assignment <i>a</i> of the form <i>v
    * = e</i> ...
-   *
+   * <p>
    * It is a static type warning if the static type of <i>e</i> may not be assigned to the static
    * type of <i>v</i>.
-   *
+   * <p>
    * The static type of the expression <i>v = e</i> is the static type of <i>e</i>.
-   *
+   * <p>
    * ... an assignment of the form <i>C.v = e</i> ...
-   *
+   * <p>
    * It is a static type warning if the static type of <i>e</i> may not be assigned to the static
    * type of <i>C.v</i>.
-   *
+   * <p>
    * The static type of the expression <i>C.v = e</i> is the static type of <i>e</i>.
-   *
+   * <p>
    * ... an assignment of the form <i>e<sub>1</sub>.v = e<sub>2</sub></i> ...
-   *
+   * <p>
    * Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type warning if
    * <i>T</i> does not have an accessible instance setter named <i>v=</i>. It is a static type
    * warning if the static type of <i>e<sub>2</sub></i> may not be assigned to <i>T</i>.
-   *
+   * <p>
    * The static type of the expression <i>e<sub>1</sub>.v = e<sub>2</sub></i> is the static type of
    * <i>e<sub>2</sub></i>.
-   *
+   * <p>
    * ... an assignment of the form <i>e<sub>1</sub>\[e<sub>2</sub>\] = e<sub>3</sub></i> ...
-   *
+   * <p>
    * The static type of the expression <i>e<sub>1</sub>\[e<sub>2</sub>\] = e<sub>3</sub></i> is the
    * static type of <i>e<sub>3</sub></i>.
-   *
+   * <p>
    * A compound assignment of the form <i>v op= e</i> is equivalent to <i>v = v op e</i>. A compound
    * assignment of the form <i>C.v op= e</i> is equivalent to <i>C.v = C.v op e</i>. A compound
    * assignment of the form <i>e<sub>1</sub>.v op= e<sub>2</sub></i> is equivalent to <i>((x) => x.v
@@ -6315,35 +6158,35 @@
 
   /**
    * The Dart Language Specification, 12.20: <blockquote>The static type of a logical boolean
-   * expression is `bool`.</blockquote>
-   *
+   * expression is {@code bool}.</blockquote>
+   * <p>
    * The Dart Language Specification, 12.21:<blockquote>A bitwise expression of the form
    * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
    * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A bitwise expression of the form <i>super op
    * e<sub>2</sub></i> is equivalent to the method invocation
    * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
-   *
+   * <p>
    * The Dart Language Specification, 12.22: <blockquote>The static type of an equality expression
-   * is `bool`.</blockquote>
-   *
+   * is {@code bool}.</blockquote>
+   * <p>
    * The Dart Language Specification, 12.23: <blockquote>A relational expression of the form
    * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
    * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A relational expression of the form <i>super op
    * e<sub>2</sub></i> is equivalent to the method invocation
    * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
-   *
+   * <p>
    * The Dart Language Specification, 12.24: <blockquote>A shift expression of the form
    * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
    * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A shift expression of the form <i>super op
    * e<sub>2</sub></i> is equivalent to the method invocation
    * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
-   *
+   * <p>
    * The Dart Language Specification, 12.25: <blockquote>An additive expression of the form
    * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
    * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. An additive expression of the form <i>super op
    * e<sub>2</sub></i> is equivalent to the method invocation
    * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
-   *
+   * <p>
    * The Dart Language Specification, 12.26: <blockquote>A multiplicative expression of the form
    * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
    * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A multiplicative expression of the form <i>super op
@@ -6388,9 +6231,9 @@
   /**
    * The Dart Language Specification, 12.19: <blockquote> ... a conditional expression <i>c</i> of
    * the form <i>e<sub>1</sub> ? e<sub>2</sub> : e<sub>3</sub></i> ...
-   *
-   * It is a static type warning if the type of e<sub>1</sub> may not be assigned to `bool`.
-   *
+   * <p>
+   * It is a static type warning if the type of e<sub>1</sub> may not be assigned to {@code bool}.
+   * <p>
    * The static type of <i>c</i> is the least upper bound of the static type of <i>e<sub>2</sub></i>
    * and the static type of <i>e<sub>3</sub></i>.</blockquote>
    */
@@ -6435,10 +6278,8 @@
   }
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionExpression function = node.functionExpression;
-    ExecutableElementImpl functionElement = node.element as ExecutableElementImpl;
-    functionElement.returnType = computeReturnType2(node);
-    FunctionTypeImpl functionType = functionElement.type as FunctionTypeImpl;
-    setTypeInformation(functionType, function.parameters);
+    FunctionTypeImpl functionType = node.element.type as FunctionTypeImpl;
+    setTypeInformation(functionType, computeReturnType2(node), function.parameters);
     recordStaticType(function, functionType);
     return null;
   }
@@ -6451,21 +6292,21 @@
    * x<sub>n+k</sub>\]) &rarr; T<sub>0</sub></i>, where <i>T<sub>0</sub></i> is the static type of
    * <i>e</i>. In any case where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is
    * considered to have been specified as dynamic.
-   *
+   * <p>
    * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
    * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip;, T<sub>n+k</sub>
    * x<sub>n+k</sub> : dk}) => e</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>n+1</sub>
    * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>}) &rarr; T<sub>0</sub></i>, where
    * <i>T<sub>0</sub></i> is the static type of <i>e</i>. In any case where <i>T<sub>i</sub>, 1
    * &lt;= i &lt;= n</i>, is not specified, it is considered to have been specified as dynamic.
-   *
+   * <p>
    * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
    * T<sub>n</sub> a<sub>n</sub>, \[T<sub>n+1</sub> x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub>
    * x<sub>n+k</sub> = dk\]) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, \[T<sub>n+1</sub>
    * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>\]) &rarr; dynamic</i>. In any case
    * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is considered to have been
    * specified as dynamic.
-   *
+   * <p>
    * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
    * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip;, T<sub>n+k</sub>
    * x<sub>n+k</sub> : dk}) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>n+1</sub>
@@ -6477,10 +6318,8 @@
     if (node.parent is FunctionDeclaration) {
       return null;
     }
-    ExecutableElementImpl functionElement = node.element as ExecutableElementImpl;
-    functionElement.returnType = computeReturnType3(node);
     FunctionTypeImpl functionType = node.element.type as FunctionTypeImpl;
-    setTypeInformation(functionType, node.parameters);
+    setTypeInformation(functionType, computeReturnType3(node), node.parameters);
     recordStaticType(node, functionType);
     return null;
   }
@@ -6490,10 +6329,10 @@
    * has the form <i>e<sub>f</sub>(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
    * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>, where <i>e<sub>f</sub></i> is
    * an expression.
-   *
+   * <p>
    * It is a static type warning if the static type <i>F</i> of <i>e<sub>f</sub></i> may not be
    * assigned to a function type.
-   *
+   * <p>
    * If <i>F</i> is not a function type, the static type of <i>i</i> is dynamic. Otherwise the
    * static type of <i>i</i> is the declared return type of <i>F</i>.</blockquote>
    */
@@ -6547,7 +6386,7 @@
    * The Dart Language Specification, 12.11.1: <blockquote>The static type of a new expression of
    * either the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the form <i>new
    * T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>.</blockquote>
-   *
+   * <p>
    * The Dart Language Specification, 12.11.2: <blockquote>The static type of a constant object
    * expression of either the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the
    * form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>. </blockquote>
@@ -6568,7 +6407,7 @@
   }
 
   /**
-   * The Dart Language Specification, 12.3: <blockquote>The static type of an integer literal is`int`.</blockquote>
+   * The Dart Language Specification, 12.3: <blockquote>The static type of an integer literal is{@code int}.</blockquote>
    */
   Object visitIntegerLiteral(IntegerLiteral node) {
     recordStaticType(node, _typeProvider.intType);
@@ -6578,8 +6417,8 @@
   /**
    * The Dart Language Specification, 12.31: <blockquote>It is a static warning if <i>T</i> does not
    * denote a type available in the current lexical scope.
-   *
-   * The static type of an is-expression is `bool`.</blockquote>
+   * <p>
+   * The static type of an is-expression is {@code bool}.</blockquote>
    */
   Object visitIsExpression(IsExpression node) {
     recordStaticType(node, _typeProvider.boolType);
@@ -6589,9 +6428,9 @@
   /**
    * The Dart Language Specification, 12.6: <blockquote>The static type of a list literal of the
    * form <i><b>const</b> &lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> or the form
-   * <i>&lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is `List&lt;E&gt;`. The static
+   * <i>&lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is {@code List&lt;E&gt;}. The static
    * type a list literal of the form <i><b>const</b> \[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> or
-   * the form <i>\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is `List&lt;dynamic&gt;`.</blockquote>
+   * the form <i>\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is {@code List&lt;dynamic&gt;}.</blockquote>
    */
   Object visitListLiteral(ListLiteral node) {
     Type2 staticType = _dynamicType;
@@ -6633,11 +6472,11 @@
    * The Dart Language Specification, 12.7: <blockquote>The static type of a map literal of the form
    * <i><b>const</b> &lt;String, V&gt; {k<sub>1</sub>:e<sub>1</sub>, &hellip;,
    * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>&lt;String, V&gt; {k<sub>1</sub>:e<sub>1</sub>,
-   * &hellip;, k<sub>n</sub>:e<sub>n</sub>}</i> is `Map&lt;String, V&gt;`. The static type a
+   * &hellip;, k<sub>n</sub>:e<sub>n</sub>}</i> is {@code Map&lt;String, V&gt;}. The static type a
    * map literal of the form <i><b>const</b> {k<sub>1</sub>:e<sub>1</sub>, &hellip;,
    * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>{k<sub>1</sub>:e<sub>1</sub>, &hellip;,
-   * k<sub>n</sub>:e<sub>n</sub>}</i> is `Map&lt;String, dynamic&gt;`.
-   *
+   * k<sub>n</sub>:e<sub>n</sub>}</i> is {@code Map&lt;String, dynamic&gt;}.
+   * <p>
    * It is a compile-time error if the first type argument to a map literal is not
    * <i>String</i>.</blockquote>
    */
@@ -6707,34 +6546,34 @@
    * The Dart Language Specification, 12.15.1: <blockquote>An ordinary method invocation <i>i</i>
    * has the form <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
    * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
-   *
+   * <p>
    * Let <i>T</i> be the static type of <i>o</i>. It is a static type warning if <i>T</i> does not
    * have an accessible instance member named <i>m</i>. If <i>T.m</i> exists, it is a static warning
    * if the type <i>F</i> of <i>T.m</i> may not be assigned to a function type.
-   *
+   * <p>
    * If <i>T.m</i> does not exist, or if <i>F</i> is not a function type, the static type of
    * <i>i</i> is dynamic. Otherwise the static type of <i>i</i> is the declared return type of
    * <i>F</i>.</blockquote>
-   *
+   * <p>
    * The Dart Language Specification, 11.15.3: <blockquote>A static method invocation <i>i</i> has
    * the form <i>C.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
    * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
-   *
+   * <p>
    * It is a static type warning if the type <i>F</i> of <i>C.m</i> may not be assigned to a
    * function type.
-   *
+   * <p>
    * If <i>F</i> is not a function type, or if <i>C.m</i> does not exist, the static type of i is
    * dynamic. Otherwise the static type of <i>i</i> is the declared return type of
    * <i>F</i>.</blockquote>
-   *
+   * <p>
    * The Dart Language Specification, 11.15.4: <blockquote>A super method invocation <i>i</i> has
    * the form <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
    * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
-   *
+   * <p>
    * It is a static type warning if <i>S</i> does not have an accessible instance member named m. If
    * <i>S.m</i> exists, it is a static warning if the type <i>F</i> of <i>S.m</i> may not be
    * assigned to a function type.
-   *
+   * <p>
    * If <i>S.m</i> does not exist, or if <i>F</i> is not a function type, the static type of
    * <i>i</i> is dynamic. Otherwise the static type of <i>i</i> is the declared return type of
    * <i>F</i>.</blockquote>
@@ -6823,7 +6662,7 @@
   }
 
   /**
-   * The Dart Language Specification, 12.2: <blockquote>The static type of `null` is bottom.
+   * The Dart Language Specification, 12.2: <blockquote>The static type of {@code null} is bottom.
    * </blockquote>
    */
   Object visitNullLiteral(NullLiteral node) {
@@ -6841,25 +6680,25 @@
    * The Dart Language Specification, 12.28: <blockquote>A postfix expression of the form
    * <i>v++</i>, where <i>v</i> is an identifier, is equivalent to <i>(){var r = v; v = r + 1;
    * return r}()</i>.
-   *
+   * <p>
    * A postfix expression of the form <i>C.v++</i> is equivalent to <i>(){var r = C.v; C.v = r + 1;
    * return r}()</i>.
-   *
+   * <p>
    * A postfix expression of the form <i>e1.v++</i> is equivalent to <i>(x){var r = x.v; x.v = r +
    * 1; return r}(e1)</i>.
-   *
+   * <p>
    * A postfix expression of the form <i>e1\[e2\]++</i> is equivalent to <i>(a, i){var r = a\[i\]; a\[i\]
    * = r + 1; return r}(e1, e2)</i>
-   *
+   * <p>
    * A postfix expression of the form <i>v--</i>, where <i>v</i> is an identifier, is equivalent to
    * <i>(){var r = v; v = r - 1; return r}()</i>.
-   *
+   * <p>
    * A postfix expression of the form <i>C.v--</i> is equivalent to <i>(){var r = C.v; C.v = r - 1;
    * return r}()</i>.
-   *
+   * <p>
    * A postfix expression of the form <i>e1.v--</i> is equivalent to <i>(x){var r = x.v; x.v = r -
    * 1; return r}(e1)</i>.
-   *
+   * <p>
    * A postfix expression of the form <i>e1\[e2\]--</i> is equivalent to <i>(a, i){var r = a\[i\]; a\[i\]
    * = r - 1; return r}(e1, e2)</i></blockquote>
    */
@@ -6879,7 +6718,7 @@
   }
 
   /**
-   * See [visitSimpleIdentifier].
+   * See {@link #visitSimpleIdentifier(SimpleIdentifier)}.
    */
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefixedIdentifier = node.identifier;
@@ -6948,43 +6787,43 @@
    * The Dart Language Specification, 12.13: <blockquote> Property extraction allows for a member of
    * an object to be concisely extracted from the object. If <i>o</i> is an object, and if <i>m</i>
    * is the name of a method member of <i>o</i>, then
-   *
-   * * <i>o.m</i> is defined to be equivalent to: <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>,
+   * <ul>
+   * <li><i>o.m</i> is defined to be equivalent to: <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>,
    * {p<sub>1</sub> : d<sub>1</sub>, &hellip;, p<sub>k</sub> : d<sub>k</sub>}){return
    * o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>, p<sub>1</sub>: p<sub>1</sub>, &hellip;,
    * p<sub>k</sub>: p<sub>k</sub>);}</i> if <i>m</i> has required parameters <i>r<sub>1</sub>,
    * &hellip;, r<sub>n</sub></i>, and named parameters <i>p<sub>1</sub> &hellip; p<sub>k</sub></i>
-   * with defaults <i>d<sub>1</sub>, &hellip;, d<sub>k</sub></i>.
-   * * <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>, \[p<sub>1</sub> = d<sub>1</sub>, &hellip;,
+   * with defaults <i>d<sub>1</sub>, &hellip;, d<sub>k</sub></i>.</li>
+   * <li><i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>, \[p<sub>1</sub> = d<sub>1</sub>, &hellip;,
    * p<sub>k</sub> = d<sub>k</sub>\]){return o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>,
    * p<sub>1</sub>, &hellip;, p<sub>k</sub>);}</i> if <i>m</i> has required parameters
    * <i>r<sub>1</sub>, &hellip;, r<sub>n</sub></i>, and optional positional parameters
    * <i>p<sub>1</sub> &hellip; p<sub>k</sub></i> with defaults <i>d<sub>1</sub>, &hellip;,
-   * d<sub>k</sub></i>.
-   *
+   * d<sub>k</sub></i>.</li>
+   * </ul>
    * Otherwise, if <i>m</i> is the name of a getter member of <i>o</i> (declared implicitly or
    * explicitly) then <i>o.m</i> evaluates to the result of invoking the getter. </blockquote>
-   *
+   * <p>
    * The Dart Language Specification, 12.17: <blockquote> ... a getter invocation <i>i</i> of the
    * form <i>e.m</i> ...
-   *
+   * <p>
    * Let <i>T</i> be the static type of <i>e</i>. It is a static type warning if <i>T</i> does not
    * have a getter named <i>m</i>.
-   *
+   * <p>
    * The static type of <i>i</i> is the declared return type of <i>T.m</i>, if <i>T.m</i> exists;
    * otherwise the static type of <i>i</i> is dynamic.
-   *
+   * <p>
    * ... a getter invocation <i>i</i> of the form <i>C.m</i> ...
-   *
+   * <p>
    * It is a static warning if there is no class <i>C</i> in the enclosing lexical scope of
    * <i>i</i>, or if <i>C</i> does not declare, implicitly or explicitly, a getter named <i>m</i>.
-   *
+   * <p>
    * The static type of <i>i</i> is the declared return type of <i>C.m</i> if it exists or dynamic
    * otherwise.
-   *
+   * <p>
    * ... a top-level getter invocation <i>i</i> of the form <i>m</i>, where <i>m</i> is an
    * identifier ...
-   *
+   * <p>
    * The static type of <i>i</i> is the declared return type of <i>m</i>.</blockquote>
    */
   Object visitPropertyAccess(PropertyAccess node) {
@@ -7018,43 +6857,43 @@
   /**
    * The Dart Language Specification, 12.30: <blockquote>Evaluation of an identifier expression
    * <i>e</i> of the form <i>id</i> proceeds as follows:
-   *
+   * <p>
    * Let <i>d</i> be the innermost declaration in the enclosing lexical scope whose name is
    * <i>id</i>. If no such declaration exists in the lexical scope, let <i>d</i> be the declaration
    * of the inherited member named <i>id</i> if it exists.
-   *
-   * * If <i>d</i> is a class or type alias <i>T</i>, the value of <i>e</i> is the unique instance
-   * of class `Type` reifying <i>T</i>.
-   * * If <i>d</i> is a type parameter <i>T</i>, then the value of <i>e</i> is the value of the
+   * <ul>
+   * <li>If <i>d</i> is a class or type alias <i>T</i>, the value of <i>e</i> is the unique instance
+   * of class {@code Type} reifying <i>T</i>.
+   * <li>If <i>d</i> is a type parameter <i>T</i>, then the value of <i>e</i> is the value of the
    * actual type argument corresponding to <i>T</i> that was passed to the generative constructor
    * that created the current binding of this. We are assured that this is well defined, because if
    * we were in a static member the reference to <i>T</i> would be a compile-time error.
-   * * If <i>d</i> is a library variable then:
-   *
-   * * If <i>d</i> is of one of the forms <i>var v = e<sub>i</sub>;</i>, <i>T v =
+   * <li>If <i>d</i> is a library variable then:
+   * <ul>
+   * <li>If <i>d</i> is of one of the forms <i>var v = e<sub>i</sub>;</i>, <i>T v =
    * e<sub>i</sub>;</i>, <i>final v = e<sub>i</sub>;</i>, <i>final T v = e<sub>i</sub>;</i>, and no
    * value has yet been stored into <i>v</i> then the initializer expression <i>e<sub>i</sub></i> is
    * evaluated. If, during the evaluation of <i>e<sub>i</sub></i>, the getter for <i>v</i> is
    * referenced, a CyclicInitializationError is thrown. If the evaluation succeeded yielding an
    * object <i>o</i>, let <i>r = o</i>, otherwise let <i>r = null</i>. In any case, <i>r</i> is
    * stored into <i>v</i>. The value of <i>e</i> is <i>r</i>.
-   * * If <i>d</i> is of one of the forms <i>const v = e;</i> or <i>const T v = e;</i> the result
+   * <li>If <i>d</i> is of one of the forms <i>const v = e;</i> or <i>const T v = e;</i> the result
    * of the getter is the value of the compile time constant <i>e</i>. Otherwise
-   * * <i>e</i> evaluates to the current binding of <i>id</i>.
-   *
-   * * If <i>d</i> is a local variable or formal parameter then <i>e</i> evaluates to the current
+   * <li><i>e</i> evaluates to the current binding of <i>id</i>.
+   * </ul>
+   * <li>If <i>d</i> is a local variable or formal parameter then <i>e</i> evaluates to the current
    * binding of <i>id</i>.
-   * * If <i>d</i> is a static method, top level function or local function then <i>e</i>
+   * <li>If <i>d</i> is a static method, top level function or local function then <i>e</i>
    * evaluates to the function defined by <i>d</i>.
-   * * If <i>d</i> is the declaration of a static variable or static getter declared in class
+   * <li>If <i>d</i> is the declaration of a static variable or static getter declared in class
    * <i>C</i>, then <i>e</i> is equivalent to the getter invocation <i>C.id</i>.
-   * * If <i>d</i> is the declaration of a top level getter, then <i>e</i> is equivalent to the
+   * <li>If <i>d</i> is the declaration of a top level getter, then <i>e</i> is equivalent to the
    * getter invocation <i>id</i>.
-   * * Otherwise, if <i>e</i> occurs inside a top level or static function (be it function,
+   * <li>Otherwise, if <i>e</i> occurs inside a top level or static function (be it function,
    * method, getter, or setter) or variable initializer, evaluation of e causes a NoSuchMethodError
    * to be thrown.
-   * * Otherwise <i>e</i> is equivalent to the property extraction <i>this.id</i>.
-   *
+   * <li>Otherwise <i>e</i> is equivalent to the property extraction <i>this.id</i>.
+   * </ul>
    * </blockquote>
    */
   Object visitSimpleIdentifier(SimpleIdentifier node) {
@@ -7092,7 +6931,7 @@
   }
 
   /**
-   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is`String`.</blockquote>
+   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is{@code String}.</blockquote>
    */
   Object visitSimpleStringLiteral(SimpleStringLiteral node) {
     recordStaticType(node, _typeProvider.stringType);
@@ -7100,7 +6939,7 @@
   }
 
   /**
-   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is`String`.</blockquote>
+   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is{@code String}.</blockquote>
    */
   Object visitStringInterpolation(StringInterpolation node) {
     recordStaticType(node, _typeProvider.stringType);
@@ -7116,7 +6955,7 @@
   }
 
   /**
-   * The Dart Language Specification, 12.10: <blockquote>The static type of `this` is the
+   * The Dart Language Specification, 12.10: <blockquote>The static type of {@code this} is the
    * interface of the immediately enclosing class.</blockquote>
    */
   Object visitThisExpression(ThisExpression node) {
@@ -7186,7 +7025,7 @@
           if (innerReturnType != null) {
             return innerReturnType;
           }
-        } else if (returnType.isDartCoreFunction) {
+        } else if (returnType.isDartCoreFunction()) {
           return _dynamicType;
         }
         if (returnType != null) {
@@ -7209,7 +7048,7 @@
 
   /**
    * Given a function declaration, compute the return type of the function. The return type of
-   * functions with a block body is `dynamicType`, with an expression body it is the type of
+   * functions with a block body is {@code dynamicType}, with an expression body it is the type of
    * the expression.
    * @param node the function expression whose return type is to be computed
    * @return the return type that was computed
@@ -7224,7 +7063,7 @@
 
   /**
    * Given a function expression, compute the return type of the function. The return type of
-   * functions with a block body is `dynamicType`, with an expression body it is the type of
+   * functions with a block body is {@code dynamicType}, with an expression body it is the type of
    * the expression.
    * @param node the function expression whose return type is to be computed
    * @return the return type that was computed
@@ -7357,7 +7196,7 @@
   /**
    * Return the type that should be recorded for a node that resolved to the given accessor.
    * @param accessor the accessor that the node resolved to
-   * @param context if the accessor element has context \[by being the RHS of a[PrefixedIdentifier] or [PropertyAccess]\], and the return type of the
+   * @param context if the accessor element has context \[by being the RHS of a{@link PrefixedIdentifier} or {@link PropertyAccess}\], and the return type of the
    * accessor is a parameter type, then the type of the LHS can be used to get more
    * specific type information
    * @return the type that should be recorded for a node that resolved to the given accessor
@@ -7367,7 +7206,7 @@
     if (functionType == null) {
       return _dynamicType;
     }
-    if (accessor.isSetter) {
+    if (accessor.isSetter()) {
       List<Type2> parameterTypes = functionType.normalParameterTypes;
       if (parameterTypes != null && parameterTypes.length > 0) {
         return parameterTypes[0];
@@ -7411,16 +7250,16 @@
   }
 
   /**
-   * Return `true` if the given library is the 'dart:html' library.
+   * Return {@code true} if the given library is the 'dart:html' library.
    * @param library the library being tested
-   * @return `true` if the library is 'dart:html'
+   * @return {@code true} if the library is 'dart:html'
    */
   bool isHtmlLibrary(LibraryElement library) => library.name == "dart.dom.html";
 
   /**
-   * Return `true` if the given node is not a type literal.
+   * Return {@code true} if the given node is not a type literal.
    * @param node the node being tested
-   * @return `true` if the given node is not a type literal
+   * @return {@code true} if the given node is not a type literal
    */
   bool isNotTypeLiteral(Identifier node) {
     ASTNode parent = node.parent;
@@ -7433,7 +7272,7 @@
    * @param type the propagated type of the node
    */
   void recordPropagatedType(Expression expression, Type2 type) {
-    if (type != null && !type.isDynamic) {
+    if (type != null && !type.isDynamic()) {
       expression.propagatedType = type;
     }
   }
@@ -7481,9 +7320,10 @@
    * Set the return type and parameter type information for the given function type based on the
    * given return type and parameter elements.
    * @param functionType the function type to be filled in
+   * @param returnType the return type of the function, or {@code null} if no type was declared
    * @param parameters the elements representing the parameters to the function
    */
-  void setTypeInformation(FunctionTypeImpl functionType, FormalParameterList parameterList) {
+  void setTypeInformation(FunctionTypeImpl functionType, Type2 returnType2, FormalParameterList parameterList) {
     List<Type2> normalParameterTypes = new List<Type2>();
     List<Type2> optionalParameterTypes = new List<Type2>();
     LinkedHashMap<String, Type2> namedParameterTypes = new LinkedHashMap<String, Type2>();
@@ -7504,18 +7344,19 @@
     functionType.normalParameterTypes = new List.from(normalParameterTypes);
     functionType.optionalParameterTypes = new List.from(optionalParameterTypes);
     functionType.namedParameterTypes = namedParameterTypes;
+    functionType.returnType = returnType2;
   }
   get thisType_J2DAccessor => _thisType;
   set thisType_J2DAccessor(__v) => _thisType = __v;
 }
 /**
- * Instances of the class `TypeOverrideManager` manage the ability to override the type of an
+ * Instances of the class {@code TypeOverrideManager} manage the ability to override the type of an
  * element within a given context.
  */
 class TypeOverrideManager {
 
   /**
-   * The current override scope, or `null` if no scope has been entered.
+   * The current override scope, or {@code null} if no scope has been entered.
    */
   TypeOverrideManager_TypeOverrideScope _currentScope;
 
@@ -7573,7 +7414,7 @@
   }
 
   /**
-   * Return the overridden type of the given element, or `null` if the type of the element has
+   * Return the overridden type of the given element, or {@code null} if the type of the element has
    * not been overridden.
    * @param element the element whose type might have been overridden
    * @return the overridden type of the given element
@@ -7598,7 +7439,7 @@
   }
 }
 /**
- * Instances of the class `TypeOverrideScope` represent a scope in which the types of
+ * Instances of the class {@code TypeOverrideScope} represent a scope in which the types of
  * elements can be overridden.
  */
 class TypeOverrideManager_TypeOverrideScope {
@@ -7646,7 +7487,7 @@
    */
   Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) {
     Map<Element, Type2> overrides = new Map<Element, Type2>();
-    if (variableList.isConst || variableList.isFinal) {
+    if (variableList.isConst() || variableList.isFinal()) {
       for (VariableDeclaration variable in variableList.variables) {
         Element element = variable.element;
         if (element != null) {
@@ -7661,7 +7502,7 @@
   }
 
   /**
-   * Return the overridden type of the given element, or `null` if the type of the element
+   * Return the overridden type of the given element, or {@code null} if the type of the element
    * has not been overridden.
    * @param element the element whose type might have been overridden
    * @return the overridden type of the given element
@@ -7689,7 +7530,7 @@
   }
 }
 /**
- * The interface `TypeProvider` defines the behavior of objects that provide access to types
+ * The interface {@code TypeProvider} defines the behavior of objects that provide access to types
  * defined by the language.
  * @coverage dart.engine.resolver
  */
@@ -7774,7 +7615,7 @@
   InterfaceType get typeType;
 }
 /**
- * Instances of the class `TypeProviderImpl` provide access to types defined by the language
+ * Instances of the class {@code TypeProviderImpl} provide access to types defined by the language
  * by looking for those types in the element model for the core library.
  * @coverage dart.engine.resolver
  */
@@ -7867,7 +7708,7 @@
   InterfaceType get typeType => _typeType;
 
   /**
-   * Return the type with the given name from the given namespace, or `null` if there is no
+   * Return the type with the given name from the given namespace, or {@code null} if there is no
    * class with the given name.
    * @param namespace the namespace in which to search for the given name
    * @param typeName the name of the type being searched for
@@ -7904,7 +7745,7 @@
   }
 }
 /**
- * Instances of the class `TypeResolverVisitor` are used to resolve the types associated with
+ * Instances of the class {@code TypeResolverVisitor} are used to resolve the types associated with
  * the elements in the element model. This includes the types of superclasses, mixins, interfaces,
  * fields, methods, parameters, and local variables. As a side-effect, this also finishes building
  * the type hierarchy.
@@ -7929,9 +7770,9 @@
    * @param typeProvider the object used to access the types from the core library
    */
   TypeResolverVisitor.con1(Library library, Source source, TypeProvider typeProvider) : super.con1(library, source, typeProvider) {
-    _jtd_constructor_282_impl(library, source, typeProvider);
+    _jtd_constructor_281_impl(library, source, typeProvider);
   }
-  _jtd_constructor_282_impl(Library library, Source source, TypeProvider typeProvider) {
+  _jtd_constructor_281_impl(Library library, Source source, TypeProvider typeProvider) {
     _dynamicType = typeProvider.dynamicType;
   }
 
@@ -7945,9 +7786,9 @@
    * during resolution
    */
   TypeResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) : super.con2(definingLibrary, source, typeProvider, errorListener) {
-    _jtd_constructor_283_impl(definingLibrary, source, typeProvider, errorListener);
+    _jtd_constructor_282_impl(definingLibrary, source, typeProvider, errorListener);
   }
-  _jtd_constructor_283_impl(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
+  _jtd_constructor_282_impl(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
     _dynamicType = typeProvider.dynamicType;
   }
   Object visitCatchClause(CatchClause node) {
@@ -8016,11 +7857,9 @@
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
-    ClassElement definingClass = element.enclosingElement as ClassElement;
-    element.returnType = definingClass.type;
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
-    type.typeArguments = definingClass.type.typeArguments;
-    setTypeInformation(type, element.parameters);
+    setTypeInformation(type, null, element.parameters);
+    type.returnType = ((element.enclosingElement as ClassElement)).type;
     element.type = type;
     return null;
   }
@@ -8061,65 +7900,38 @@
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     super.visitFunctionDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
-    element.returnType = computeReturnType(node.returnType);
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
-    ClassElement definingClass = element.getAncestor(ClassElement);
-    if (definingClass != null) {
-      type.typeArguments = definingClass.type.typeArguments;
-    }
-    setTypeInformation(type, element.parameters);
+    setTypeInformation(type, node.returnType, element.parameters);
     element.type = type;
     return null;
   }
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     super.visitFunctionTypeAlias(node);
     FunctionTypeAliasElementImpl element = node.element as FunctionTypeAliasElementImpl;
-    element.returnType = computeReturnType(node.returnType);
     FunctionTypeImpl type = element.type as FunctionTypeImpl;
-    setTypeInformation(type, element.parameters);
+    setTypeInformation(type, node.returnType, element.parameters);
     return null;
   }
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     super.visitFunctionTypedFormalParameter(node);
     ParameterElementImpl element = node.identifier.element as ParameterElementImpl;
+    AnonymousFunctionTypeImpl type = new AnonymousFunctionTypeImpl();
     List<ParameterElement> parameters = getElements(node.parameters);
-    FunctionTypeAliasElementImpl aliasElement = new FunctionTypeAliasElementImpl(null);
-    aliasElement.synthetic = true;
-    aliasElement.parameters = parameters;
-    aliasElement.returnType = computeReturnType(node.returnType);
-    FunctionTypeImpl type = new FunctionTypeImpl.con2(aliasElement);
-    ClassElement definingClass = element.getAncestor(ClassElement);
-    if (definingClass != null) {
-      aliasElement.typeVariables = definingClass.typeVariables;
-      type.typeArguments = definingClass.type.typeArguments;
-    } else {
-      FunctionTypeAliasElement alias = element.getAncestor(FunctionTypeAliasElement);
-      if (alias != null) {
-        aliasElement.typeVariables = alias.typeVariables;
-        type.typeArguments = alias.type.typeArguments;
-      } else {
-        type.typeArguments = TypeVariableTypeImpl.EMPTY_ARRAY;
-      }
-    }
-    setTypeInformation(type, parameters);
+    setTypeInformation(type, node.returnType, parameters);
+    type.baseParameters = parameters;
     element.type = type;
     return null;
   }
   Object visitMethodDeclaration(MethodDeclaration node) {
     super.visitMethodDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
-    element.returnType = computeReturnType(node.returnType);
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
-    ClassElement definingClass = element.getAncestor(ClassElement);
-    if (definingClass != null) {
-      type.typeArguments = definingClass.type.typeArguments;
-    }
-    setTypeInformation(type, element.parameters);
+    setTypeInformation(type, node.returnType, element.parameters);
     element.type = type;
     if (element is PropertyAccessorElement) {
       PropertyAccessorElement accessor = element as PropertyAccessorElement;
       PropertyInducingElementImpl variable = accessor.variable as PropertyInducingElementImpl;
-      if (accessor.isGetter) {
+      if (accessor.isGetter()) {
         variable.type = type.returnType;
       } else if (variable.type == null) {
         List<Type2> parameterTypes = type.normalParameterTypes;
@@ -8193,7 +8005,7 @@
     if (elementValid && element is! ClassElement && isTypeNameInInstanceCreationExpression(node)) {
       SimpleIdentifier typeNameSimple = getTypeSimpleIdentifier(typeName);
       InstanceCreationExpression creation = node.parent.parent as InstanceCreationExpression;
-      if (creation.isConst) {
+      if (creation.isConst()) {
         if (element == null) {
           reportError(CompileTimeErrorCode.UNDEFINED_CLASS, typeNameSimple, [typeName]);
         } else {
@@ -8331,20 +8143,13 @@
       if (element is PropertyInducingElement) {
         PropertyInducingElement variableElement = element as PropertyInducingElement;
         PropertyAccessorElementImpl getter = variableElement.getter as PropertyAccessorElementImpl;
-        getter.returnType = declaredType;
         FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
-        ClassElement definingClass = element.getAncestor(ClassElement);
-        if (definingClass != null) {
-          getterType.typeArguments = definingClass.type.typeArguments;
-        }
+        getterType.returnType = declaredType;
         getter.type = getterType;
         PropertyAccessorElementImpl setter = variableElement.setter as PropertyAccessorElementImpl;
         if (setter != null) {
-          setter.returnType = VoidTypeImpl.instance;
           FunctionTypeImpl setterType = new FunctionTypeImpl.con1(setter);
-          if (definingClass != null) {
-            setterType.typeArguments = definingClass.type.typeArguments;
-          }
+          setterType.returnType = VoidTypeImpl.instance;
           setterType.normalParameterTypes = <Type2> [declaredType];
           setter.type = setterType;
         }
@@ -8355,20 +8160,6 @@
   }
 
   /**
-   * Given a type name representing the return type of a function, compute the return type of the
-   * function.
-   * @param returnType the type name representing the return type of the function
-   * @return the return type that was computed
-   */
-  Type2 computeReturnType(TypeName returnType) {
-    if (returnType == null) {
-      return _dynamicType;
-    } else {
-      return returnType.type;
-    }
-  }
-
-  /**
    * Return the class element that represents the class whose name was provided.
    * @param identifier the name from the declaration of a class
    * @return the class element that represents the class
@@ -8414,7 +8205,7 @@
     if (parent is ConstructorName) {
       parent = parent.parent;
       if (parent is InstanceCreationExpression) {
-        if (((parent as InstanceCreationExpression)).isConst) {
+        if (((parent as InstanceCreationExpression)).isConst()) {
           return CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS;
         } else {
           return CompileTimeErrorCode.NEW_WITH_INVALID_TYPE_PARAMETERS;
@@ -8426,7 +8217,7 @@
 
   /**
    * Given the multiple elements to which a single name could potentially be resolved, return the
-   * single interface type that should be used, or `null` if there is no clear choice.
+   * single interface type that should be used, or {@code null} if there is no clear choice.
    * @param elements the elements to which a single name could potentially be resolved
    * @return the single interface type that should be used for the type name
    */
@@ -8486,7 +8277,7 @@
   /**
    * Checks if the given type name is used as the type in an as expression.
    * @param typeName the type name to analyzer
-   * @return `true` if the given type name is used as the type in an as expression
+   * @return {@code true} if the given type name is used as the type in an as expression
    */
   bool isTypeNameInAsExpression(TypeName typeName) {
     ASTNode parent = typeName.parent;
@@ -8500,7 +8291,7 @@
   /**
    * Checks if the given type name is used as the exception type in a catch clause.
    * @param typeName the type name to analyzer
-   * @return `true` if the given type name is used as the exception type in a catch clause
+   * @return {@code true} if the given type name is used as the exception type in a catch clause
    */
   bool isTypeNameInCatchClause(TypeName typeName) {
     ASTNode parent = typeName.parent;
@@ -8514,7 +8305,7 @@
   /**
    * Checks if the given type name is used as the type in an instance creation expression.
    * @param typeName the type name to analyzer
-   * @return `true` if the given type name is used as the type in an instance creation
+   * @return {@code true} if the given type name is used as the type in an instance creation
    * expression
    */
   bool isTypeNameInInstanceCreationExpression(TypeName typeName) {
@@ -8529,7 +8320,7 @@
   /**
    * Checks if the given type name is used as the type in an is expression.
    * @param typeName the type name to analyzer
-   * @return `true` if the given type name is used as the type in an is expression
+   * @return {@code true} if the given type name is used as the type in an is expression
    */
   bool isTypeNameInIsExpression(TypeName typeName) {
     ASTNode parent = typeName.parent;
@@ -8543,7 +8334,7 @@
   /**
    * Checks if the given type name is the target in a redirected constructor.
    * @param typeName the type name to analyzer
-   * @return `true` if the given type name is used as the type in a redirected constructor
+   * @return {@code true} if the given type name is used as the type in a redirected constructor
    */
   bool isTypeNameTargetInRedirectedConstructor(TypeName typeName) {
     ASTNode parent = typeName.parent;
@@ -8681,9 +8472,10 @@
    * Set the return type and parameter type information for the given function type based on the
    * given return type and parameter elements.
    * @param functionType the function type to be filled in
+   * @param returnType the return type of the function, or {@code null} if no type was declared
    * @param parameters the elements representing the parameters to the function
    */
-  void setTypeInformation(FunctionTypeImpl functionType, List<ParameterElement> parameters) {
+  void setTypeInformation(FunctionTypeImpl functionType, TypeName returnType2, List<ParameterElement> parameters) {
     List<Type2> normalParameterTypes = new List<Type2>();
     List<Type2> optionalParameterTypes = new List<Type2>();
     LinkedHashMap<String, Type2> namedParameterTypes = new LinkedHashMap<String, Type2>();
@@ -8708,10 +8500,15 @@
     if (!namedParameterTypes.isEmpty) {
       functionType.namedParameterTypes = namedParameterTypes;
     }
+    if (returnType2 == null) {
+      functionType.returnType = _dynamicType;
+    } else {
+      functionType.returnType = returnType2.type;
+    }
   }
 }
 /**
- * Instances of the class `ClassScope` implement the scope defined by a class.
+ * Instances of the class {@code ClassScope} implement the scope defined by a class.
  * @coverage dart.engine.resolver
  */
 class ClassScope extends EnclosedScope {
@@ -8761,7 +8558,7 @@
   }
 }
 /**
- * Instances of the class `EnclosedScope` implement a scope that is lexically enclosed in
+ * Instances of the class {@code EnclosedScope} implement a scope that is lexically enclosed in
  * another scope.
  * @coverage dart.engine.resolver
  */
@@ -8796,7 +8593,7 @@
   }
 }
 /**
- * Instances of the class `FunctionScope` implement the scope defined by a function.
+ * Instances of the class {@code FunctionScope} implement the scope defined by a function.
  * @coverage dart.engine.resolver
  */
 class FunctionScope extends EnclosedScope {
@@ -8823,14 +8620,14 @@
       }
     }
     for (ParameterElement parameter in functionElement.parameters) {
-      if (!parameter.isInitializingFormal) {
+      if (!parameter.isInitializingFormal()) {
         parameterScope.define(parameter);
       }
     }
   }
 }
 /**
- * Instances of the class `FunctionTypeScope` implement the scope defined by a function type
+ * Instances of the class {@code FunctionTypeScope} implement the scope defined by a function type
  * alias.
  * @coverage dart.engine.resolver
  */
@@ -8868,7 +8665,7 @@
   }
 }
 /**
- * Instances of the class `LabelScope` represent a scope in which a single label is defined.
+ * Instances of the class {@code LabelScope} represent a scope in which a single label is defined.
  * @coverage dart.engine.resolver
  */
 class LabelScope {
@@ -8889,26 +8686,26 @@
   LabelElement _element;
 
   /**
-   * The marker used to look up a label element for an unlabeled `break` or `continue`.
+   * The marker used to look up a label element for an unlabeled {@code break} or {@code continue}.
    */
   static String EMPTY_LABEL = "";
 
   /**
-   * The label element returned for scopes that can be the target of an unlabeled `break` or`continue`.
+   * The label element returned for scopes that can be the target of an unlabeled {@code break} or{@code continue}.
    */
   static SimpleIdentifier _EMPTY_LABEL_IDENTIFIER = new SimpleIdentifier.full(new sc.StringToken(sc.TokenType.IDENTIFIER, "", 0));
 
   /**
-   * Initialize a newly created scope to represent the potential target of an unlabeled`break` or `continue`.
+   * Initialize a newly created scope to represent the potential target of an unlabeled{@code break} or {@code continue}.
    * @param outerScope the label scope enclosing the new label scope
-   * @param onSwitchStatement `true` if this label is associated with a `switch`statement
-   * @param onSwitchMember `true` if this label is associated with a `switch` member
+   * @param onSwitchStatement {@code true} if this label is associated with a {@code switch}statement
+   * @param onSwitchMember {@code true} if this label is associated with a {@code switch} member
    */
   LabelScope.con1(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) {
-    _jtd_constructor_288_impl(outerScope, onSwitchStatement, onSwitchMember);
+    _jtd_constructor_287_impl(outerScope, onSwitchStatement, onSwitchMember);
   }
-  _jtd_constructor_288_impl(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) {
-    _jtd_constructor_289_impl(outerScope, EMPTY_LABEL, new LabelElementImpl(_EMPTY_LABEL_IDENTIFIER, onSwitchStatement, onSwitchMember));
+  _jtd_constructor_287_impl(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) {
+    _jtd_constructor_288_impl(outerScope, EMPTY_LABEL, new LabelElementImpl(_EMPTY_LABEL_IDENTIFIER, onSwitchStatement, onSwitchMember));
   }
 
   /**
@@ -8918,16 +8715,16 @@
    * @param element the element to which the label resolves
    */
   LabelScope.con2(LabelScope outerScope2, String label2, LabelElement element2) {
-    _jtd_constructor_289_impl(outerScope2, label2, element2);
+    _jtd_constructor_288_impl(outerScope2, label2, element2);
   }
-  _jtd_constructor_289_impl(LabelScope outerScope2, String label2, LabelElement element2) {
+  _jtd_constructor_288_impl(LabelScope outerScope2, String label2, LabelElement element2) {
     this._outerScope = outerScope2;
     this._label = label2;
     this._element = element2;
   }
 
   /**
-   * Return the label element corresponding to the given label, or `null` if the given label
+   * Return the label element corresponding to the given label, or {@code null} if the given label
    * is not defined in this scope.
    * @param targetLabel the label being looked up
    * @return the label element corresponding to the given label
@@ -8935,7 +8732,7 @@
   LabelElement lookup(SimpleIdentifier targetLabel) => lookup2(targetLabel.name);
 
   /**
-   * Return the label element corresponding to the given label, or `null` if the given label
+   * Return the label element corresponding to the given label, or {@code null} if the given label
    * is not defined in this scope.
    * @param targetLabel the label being looked up
    * @return the label element corresponding to the given label
@@ -8951,14 +8748,14 @@
   }
 }
 /**
- * Instances of the class `LibraryImportScope` represent the scope containing all of the names
+ * Instances of the class {@code LibraryImportScope} represent the scope containing all of the names
  * available from imported libraries.
  * @coverage dart.engine.resolver
  */
 class LibraryImportScope extends Scope {
 
   /**
-   * @return `true` if the given [Identifier] is the part of type annotation.
+   * @return {@code true} if the given {@link Identifier} is the part of type annotation.
    */
   static bool isTypeAnnotation(Identifier identifier) {
     ASTNode parent = identifier.parent;
@@ -9087,7 +8884,7 @@
   }
 }
 /**
- * Instances of the class `LibraryScope` implement a scope containing all of the names defined
+ * Instances of the class {@code LibraryScope} implement a scope containing all of the names defined
  * in a given library.
  * @coverage dart.engine.resolver
  */
@@ -9106,7 +8903,7 @@
       int offset = duplicate.nameOffset;
       if (duplicate is PropertyAccessorElement) {
         PropertyAccessorElement accessor = duplicate as PropertyAccessorElement;
-        if (accessor.isSynthetic) {
+        if (accessor.isSynthetic()) {
           offset = accessor.variable.nameOffset;
         }
       }
@@ -9152,7 +8949,7 @@
   }
 }
 /**
- * Instances of the class `Namespace` implement a mapping of identifiers to the elements
+ * Instances of the class {@code Namespace} implement a mapping of identifiers to the elements
  * represented by those identifiers. Namespaces are the building blocks for scopes.
  * @coverage dart.engine.resolver
  */
@@ -9193,14 +8990,14 @@
   Map<String, Element> get definedNames => new Map<String, Element>.from(_definedNames);
 }
 /**
- * Instances of the class `NamespaceBuilder` are used to build a `Namespace`. Namespace
+ * Instances of the class {@code NamespaceBuilder} are used to build a {@code Namespace}. Namespace
  * builders are thread-safe and re-usable.
  * @coverage dart.engine.resolver
  */
 class NamespaceBuilder {
 
   /**
-   * Create a namespace representing the export namespace of the given [ExportElement].
+   * Create a namespace representing the export namespace of the given {@link ExportElement}.
    * @param element the export element whose export namespace is to be created
    * @return the export namespace that was created
    */
@@ -9405,7 +9202,7 @@
   }
 }
 /**
- * The abstract class `Scope` defines the behavior common to name scopes used by the resolver
+ * The abstract class {@code Scope} defines the behavior common to name scopes used by the resolver
  * to determine which names are visible at any given point in the code.
  * @coverage dart.engine.resolver
  */
@@ -9429,9 +9226,9 @@
   static String UNARY_MINUS = "unary-";
 
   /**
-   * Return `true` if the given name is a library-private name.
+   * Return {@code true} if the given name is a library-private name.
    * @param name the name being tested
-   * @return `true` if the given name is a library-private name
+   * @return {@code true} if the given name is a library-private name
    */
   static bool isPrivateName(String name) => name != null && name.startsWith(PRIVATE_NAME_PREFIX);
 
@@ -9460,7 +9257,7 @@
   }
 
   /**
-   * Return the element with which the given identifier is associated, or `null` if the name
+   * Return the element with which the given identifier is associated, or {@code null} if the name
    * is not defined within this scope.
    * @param identifier the identifier associated with the element to be returned
    * @param referencingLibrary the library that contains the reference to the name, used to
@@ -9521,7 +9318,7 @@
   Source get source => definingLibrary.definingCompilationUnit.source;
 
   /**
-   * Return the element with which the given name is associated, or `null` if the name is not
+   * Return the element with which the given name is associated, or {@code null} if the name is not
    * defined within this scope. This method only returns elements that are directly defined within
    * this scope, not elements that are defined in an enclosing scope.
    * @param name the name associated with the element to be returned
@@ -9532,7 +9329,7 @@
   Element localLookup(String name, LibraryElement referencingLibrary) => _definedNames[name];
 
   /**
-   * Return the element with which the given name is associated, or `null` if the name is not
+   * Return the element with which the given name is associated, or {@code null} if the name is not
    * defined within this scope.
    * @param identifier the identifier node to lookup element for, used to report correct kind of a
    * problem and associate problem with
@@ -9559,7 +9356,7 @@
   }
 }
 /**
- * Instances of the class `ConstantVerifier` traverse an AST structure looking for additional
+ * Instances of the class {@code ConstantVerifier} traverse an AST structure looking for additional
  * errors and warnings not covered by the parser and resolver. In particular, it looks for errors
  * and warnings related to constant expressions.
  * @coverage dart.engine.resolver
@@ -9606,7 +9403,6 @@
     if (node.constKeyword != null) {
       validateInitializers(node);
     }
-    validateDefaultValues(node.parameters);
     return super.visitConstructorDeclaration(node);
   }
   Object visitFunctionExpression(FunctionExpression node) {
@@ -9680,7 +9476,7 @@
   Object visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     Expression initializer = node.initializer;
-    if (initializer != null && node.isConst) {
+    if (initializer != null && node.isConst()) {
       VariableElementImpl element = node.element as VariableElementImpl;
       EvaluationResultImpl result = element.evaluationResult;
       if (result == null) {
@@ -9694,11 +9490,11 @@
   }
 
   /**
-   * Return `true` if the given value is the result of evaluating an expression whose value is
+   * Return {@code true} if the given value is the result of evaluating an expression whose value is
    * a valid key in a const map literal. Keys in const map literals must be either a string, number,
    * boolean, list, map, or null.
    * @param value
-   * @return `true` if the given value is a valid key in a const map literal
+   * @return {@code true} if the given value is a valid key in a const map literal
    */
   bool isValidConstMapKey(Object value) => true;
 
@@ -9723,7 +9519,7 @@
 
   /**
    * Validate that the given expression is a compile time constant. Return the value of the compile
-   * time constant, or `null` if the expression is not a compile time constant.
+   * time constant, or {@code null} if the expression is not a compile time constant.
    * @param expression the expression to be validated
    * @param errorCode the error code to be used if the expression is not a compile time constant
    * @return the value of the compile time constant
@@ -9740,7 +9536,7 @@
    * @param node the instance creation evaluate
    */
   void validateConstantArguments(InstanceCreationExpression node) {
-    if (!node.isConst) {
+    if (!node.isConst()) {
       return;
     }
     ArgumentList argumentList = node.argumentList;
@@ -9770,8 +9566,10 @@
         Expression defaultValue = defaultParameter.defaultValue;
         if (defaultValue != null) {
           EvaluationResultImpl result = validate(defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE);
-          VariableElementImpl element = parameter.element as VariableElementImpl;
-          element.evaluationResult = result;
+          if (defaultParameter.isConst()) {
+            VariableElementImpl element = parameter.element as VariableElementImpl;
+            element.evaluationResult = result;
+          }
         }
       }
     }
@@ -9837,7 +9635,7 @@
       if (identical(parameterElement, element) && parameterElement != null) {
         Type2 type = parameterElement.type;
         if (type != null) {
-          if (type.isDynamic) {
+          if (type.isDynamic()) {
             return ValidResult.RESULT_DYNAMIC;
           }
           if (type.isSubtypeOf(ConstantVerifier_this._boolType)) {
@@ -9860,7 +9658,7 @@
   }
 }
 /**
- * Instances of the class `ErrorVerifier` traverse an AST structure looking for additional
+ * Instances of the class {@code ErrorVerifier} traverse an AST structure looking for additional
  * errors and warnings not covered by the parser and resolver.
  * @coverage dart.engine.resolver
  */
@@ -9869,7 +9667,7 @@
   /**
    * Checks if the given expression is the reference to the type.
    * @param expr the expression to evaluate
-   * @return `true` if the given expression is the reference to the type
+   * @return {@code true} if the given expression is the reference to the type
    */
   static bool isTypeReference(Expression expr) {
     if (expr is Identifier) {
@@ -9911,47 +9709,47 @@
   bool _strictMode = false;
 
   /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of a[ConstructorDeclaration] and the constructor is 'const'.
+   * This is set to {@code true} iff the visitor is currently visiting children nodes of a{@link ConstructorDeclaration} and the constructor is 'const'.
    * @see #visitConstructorDeclaration(ConstructorDeclaration)
    */
   bool _isEnclosingConstructorConst = false;
 
   /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of a[CatchClause].
+   * This is set to {@code true} iff the visitor is currently visiting children nodes of a{@link CatchClause}.
    * @see #visitCatchClause(CatchClause)
    */
   bool _isInCatchClause = false;
 
   /**
-   * This is set to `true` iff the visitor is currently visiting a[ConstructorInitializer].
+   * This is set to {@code true} iff the visitor is currently visiting a{@link ConstructorInitializer}.
    */
   bool _isInConstructorInitializer = false;
 
   /**
-   * This is set to `true` iff the visitor is currently visiting code in the SDK.
+   * This is set to {@code true} iff the visitor is currently visiting code in the SDK.
    */
   bool _isInSystemLibrary = false;
 
   /**
-   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
+   * The class containing the AST nodes being visited, or {@code null} if we are not in the scope of
    * a class.
    */
   ClassElement _enclosingClass;
 
   /**
-   * The method or function that we are currently visiting, or `null` if we are not inside a
+   * The method or function that we are currently visiting, or {@code null} if we are not inside a
    * method or function.
    */
   ExecutableElement _enclosingFunction;
 
   /**
    * This map is initialized when visiting the contents of a class declaration. If the visitor is
-   * not in an enclosing class declaration, then the map is set to `null`.
-   *
-   * When set the map maps the set of [FieldElement]s in the class to an[INIT_STATE#NOT_INIT] or [INIT_STATE#INIT_IN_DECLARATION]. <code>checkFor*</code>
-   * methods, specifically [checkForAllFinalInitializedErrorCodes],
+   * not in an enclosing class declaration, then the map is set to {@code null}.
+   * <p>
+   * When set the map maps the set of {@link FieldElement}s in the class to an{@link INIT_STATE#NOT_INIT} or {@link INIT_STATE#INIT_IN_DECLARATION}. <code>checkFor*</code>
+   * methods, specifically {@link #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)},
    * can make a copy of the map to compute error code states. <code>checkFor*</code> methods should
-   * only ever make a copy, or read from this map after it has been set in[visitClassDeclaration].
+   * only ever make a copy, or read from this map after it has been set in{@link #visitClassDeclaration(ClassDeclaration)}.
    * @see #visitClassDeclaration(ClassDeclaration)
    * @see #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)
    */
@@ -9978,13 +9776,13 @@
   Set<String> _namesForReferenceToDeclaredVariableInInitializer = new Set<String>();
 
   /**
-   * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and[CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS] error codes.
+   * A list of types used by the {@link CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS} and{@link CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS} error codes.
    */
   List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
   ErrorVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary, TypeProvider typeProvider, InheritanceManager inheritanceManager) {
     this._errorReporter = errorReporter;
     this._currentLibrary = currentLibrary;
-    this._isInSystemLibrary = currentLibrary.source.isInSystemLibrary;
+    this._isInSystemLibrary = currentLibrary.source.isInSystemLibrary();
     this._typeProvider = typeProvider;
     this._inheritanceManager = inheritanceManager;
     _strictMode = currentLibrary.context.analysisOptions.strictMode;
@@ -10038,7 +9836,6 @@
       ExtendsClause extendsClause = node.extendsClause;
       checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
       checkForMemberWithClassName();
-      checkForNoDefaultSuperConstructorImplicit(node);
       checkForAllMixinErrorCodes(withClause);
       if (implementsClause != null || extendsClause != null) {
         if (!checkForImplementsDisallowedClass(implementsClause) && !checkForExtendsDisallowedClass(extendsClause)) {
@@ -10052,7 +9849,7 @@
         List<FieldElement> fieldElements = classElement.fields;
         _initialFieldElementsMap = new Map<FieldElement, INIT_STATE>();
         for (FieldElement fieldElement in fieldElements) {
-          if (!fieldElement.isSynthetic) {
+          if (!fieldElement.isSynthetic()) {
             _initialFieldElementsMap[fieldElement] = fieldElement.initializer == null ? INIT_STATE.NOT_INIT : INIT_STATE.INIT_IN_DECLARATION;
           }
         }
@@ -10124,16 +9921,10 @@
     checkForExportInternalLibrary(node);
     return super.visitExportDirective(node);
   }
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
-    Type2 expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
-    checkForReturnOfInvalidType(node.expression, expectedReturnType);
-    return super.visitExpressionFunctionBody(node);
-  }
   Object visitFieldDeclaration(FieldDeclaration node) {
-    if (!node.isStatic) {
+    if (!node.isStatic()) {
       VariableDeclarationList variables = node.fields;
-      if (variables.isConst) {
+      if (variables.isConst()) {
         _errorReporter.reportError4(CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword, []);
       }
     }
@@ -10148,14 +9939,14 @@
     ExecutableElement outerFunction = _enclosingFunction;
     try {
       SimpleIdentifier identifier = node.name;
-      String methodName = "";
+      String methoName = "";
       if (identifier != null) {
-        methodName = identifier.name;
+        methoName = identifier.name;
       }
       _enclosingFunction = node.element;
-      if (node.isSetter || node.isGetter) {
-        checkForMismatchedAccessorTypes(node, methodName);
-        if (node.isSetter) {
+      if (node.isSetter() || node.isGetter()) {
+        checkForMismatchedAccessorTypes(node, methoName);
+        if (node.isSetter()) {
           FunctionExpression functionExpression = node.functionExpression;
           if (functionExpression != null) {
             checkForWrongNumberOfParametersForSetter(node.name, functionExpression.parameters);
@@ -10170,16 +9961,12 @@
     }
   }
   Object visitFunctionExpression(FunctionExpression node) {
-    if (node.parent is! FunctionDeclaration) {
-      ExecutableElement outerFunction = _enclosingFunction;
-      try {
-        _enclosingFunction = node.element;
-        return super.visitFunctionExpression(node);
-      } finally {
-        _enclosingFunction = outerFunction;
-      }
-    } else {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      _enclosingFunction = node.element;
       return super.visitFunctionExpression(node);
+    } finally {
+      _enclosingFunction = outerFunction;
     }
   }
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
@@ -10207,7 +9994,7 @@
     if (type is InterfaceType) {
       InterfaceType interfaceType = type as InterfaceType;
       checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
-      if (node.isConst) {
+      if (node.isConst()) {
         checkForConstWithNonConst(node);
         checkForConstWithUndefinedConstructor(node);
         checkForConstWithTypeParameters(node);
@@ -10253,17 +10040,17 @@
       if (identifier != null) {
         methoName = identifier.name;
       }
-      if (node.isSetter || node.isGetter) {
+      if (node.isSetter() || node.isGetter()) {
         checkForMismatchedAccessorTypes(node, methoName);
         checkForConflictingInstanceGetterAndSuperclassMember(node);
       }
-      if (node.isGetter) {
+      if (node.isGetter()) {
         checkForConflictingStaticGetterAndInstanceSetter(node);
-      } else if (node.isSetter) {
+      } else if (node.isSetter()) {
         checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
         checkForNonVoidReturnTypeForSetter(node.returnType);
         checkForConflictingStaticSetterAndInstanceMember(node);
-      } else if (node.isOperator) {
+      } else if (node.isOperator()) {
         checkForOptionalParameterInOperator(node);
         checkForWrongNumberOfParametersForOperator(node);
         checkForNonVoidReturnTypeForOperator(node);
@@ -10292,7 +10079,7 @@
     return super.visitPrefixedIdentifier(node);
   }
   Object visitPrefixExpression(PrefixExpression node) {
-    if (node.operator.type.isIncrementOperator) {
+    if (node.operator.type.isIncrementOperator()) {
       checkForAssignmentToFinal2(node.operand);
     }
     return super.visitPrefixExpression(node);
@@ -10389,8 +10176,8 @@
   /**
    * This verifies that the passed constructor declaration does not violate any of the error codes
    * relating to the initialization of fields in the enclosing class.
-   * @param node the [ConstructorDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @param node the {@link ConstructorDeclaration} to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see #initialFieldElementsMap
    * @see CompileTimeErrorCode#FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR
    * @see CompileTimeErrorCode#FINAL_INITIALIZED_MULTIPLE_TIMES
@@ -10413,12 +10200,12 @@
         if (identical(state, INIT_STATE.NOT_INIT)) {
           fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
         } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) {
-          if (fieldElement.isFinal || fieldElement.isConst) {
+          if (fieldElement.isFinal() || fieldElement.isConst()) {
             _errorReporter.reportError2(CompileTimeErrorCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.displayName]);
             foundError = true;
           }
         } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) {
-          if (fieldElement.isFinal || fieldElement.isConst) {
+          if (fieldElement.isFinal() || fieldElement.isConst()) {
             _errorReporter.reportError2(CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, formalParameter.identifier, [fieldElement.displayName]);
             foundError = true;
           }
@@ -10437,7 +10224,7 @@
           if (identical(state, INIT_STATE.NOT_INIT)) {
             fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS;
           } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) {
-            if (fieldElement.isFinal || fieldElement.isConst) {
+            if (fieldElement.isFinal() || fieldElement.isConst()) {
               _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName, []);
               foundError = true;
             }
@@ -10456,8 +10243,8 @@
 
   /**
    * This checks the passed method declaration against override-error codes.
-   * @param node the [MethodDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @param node the {@link MethodDeclaration} to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
    * @see CompileTimeErrorCode#INVALID_OVERRIDE_REQUIRED
    * @see CompileTimeErrorCode#INVALID_OVERRIDE_POSITIONAL
@@ -10468,10 +10255,9 @@
    * @see StaticWarningCode#INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
    * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
    * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE
-   * @see StaticWarningCode#INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
    */
   bool checkForAllInvalidOverrideErrorCodes(MethodDeclaration node) {
-    if (_enclosingClass == null || node.isStatic || node.body is NativeFunctionBody) {
+    if (_enclosingClass == null || node.isStatic() || node.body is NativeFunctionBody) {
       return false;
     }
     ExecutableElement executableElement = node.element;
@@ -10479,13 +10265,13 @@
       return false;
     }
     SimpleIdentifier methodName = node.name;
-    if (methodName.isSynthetic) {
+    if (methodName.isSynthetic()) {
       return false;
     }
     String methodNameStr = methodName.name;
     ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritance(_enclosingClass, executableElement.name);
     if (overriddenExecutable == null) {
-      if (!node.isGetter && !node.isSetter && !node.isOperator) {
+      if (!node.isGetter() && !node.isSetter() && !node.isOperator()) {
         Set<ClassElement> visitedClasses = new Set<ClassElement>();
         InterfaceType superclassType = _enclosingClass.supertype;
         ClassElement superclassElement = superclassType == null ? null : superclassType.element;
@@ -10493,21 +10279,21 @@
           javaSetAdd(visitedClasses, superclassElement);
           List<FieldElement> fieldElts = superclassElement.fields;
           for (FieldElement fieldElt in fieldElts) {
-            if (fieldElt.name == methodNameStr && fieldElt.isStatic) {
+            if (fieldElt.name == methodNameStr && fieldElt.isStatic()) {
               _errorReporter.reportError2(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, methodName, [methodNameStr, fieldElt.enclosingElement.displayName]);
               return true;
             }
           }
           List<PropertyAccessorElement> propertyAccessorElts = superclassElement.accessors;
           for (PropertyAccessorElement accessorElt in propertyAccessorElts) {
-            if (accessorElt.name == methodNameStr && accessorElt.isStatic) {
+            if (accessorElt.name == methodNameStr && accessorElt.isStatic()) {
               _errorReporter.reportError2(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, methodName, [methodNameStr, accessorElt.enclosingElement.displayName]);
               return true;
             }
           }
           List<MethodElement> methodElements = superclassElement.methods;
           for (MethodElement methodElement in methodElements) {
-            if (methodElement.name == methodNameStr && methodElement.isStatic) {
+            if (methodElement.name == methodNameStr && methodElement.isStatic()) {
               _errorReporter.reportError2(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, methodName, [methodNameStr, methodElement.enclosingElement.displayName]);
               return true;
             }
@@ -10551,7 +10337,7 @@
       }
     }
     if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
-      _errorReporter.reportError2(!node.isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, methodName, [overridingFTReturnType.displayName, overriddenFTReturnType.displayName, overriddenExecutable.enclosingElement.displayName]);
+      _errorReporter.reportError2(!node.isGetter() ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, methodName, [overridingFTReturnType.displayName, overriddenFTReturnType.displayName, overriddenExecutable.enclosingElement.displayName]);
       return true;
     }
     FormalParameterList formalParameterList = node.parameters;
@@ -10562,7 +10348,7 @@
     int parameterIndex = 0;
     for (int i = 0; i < overridingNormalPT.length; i++) {
       if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
-        _errorReporter.reportError2(!node.isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterNodeList[parameterIndex], [overridingNormalPT[i].displayName, overriddenNormalPT[i].displayName, overriddenExecutable.enclosingElement.displayName]);
+        _errorReporter.reportError2(!node.isSetter() ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterNodeList[parameterIndex], [overridingNormalPT[i].displayName, overriddenNormalPT[i].displayName, overriddenExecutable.enclosingElement.displayName]);
         return true;
       }
       parameterIndex++;
@@ -10599,72 +10385,13 @@
         }
       }
     }
-    bool foundError = false;
-    List<FormalParameter> formalParameters = new List<FormalParameter>();
-    List<ParameterElementImpl> parameterElts = new List<ParameterElementImpl>();
-    List<ParameterElementImpl> overriddenParameterElts = new List<ParameterElementImpl>();
-    List<ParameterElement> overriddenPEs = overriddenExecutable.parameters;
-    for (FormalParameter formalParameter in parameterNodeList) {
-      if (formalParameter.kind.isOptional) {
-        formalParameters.add(formalParameter);
-        parameterElts.add((formalParameter.element as ParameterElementImpl));
-      }
-    }
-    for (ParameterElement parameterElt in overriddenPEs) {
-      if (parameterElt.parameterKind.isOptional) {
-        overriddenParameterElts.add((parameterElt as ParameterElementImpl));
-      }
-    }
-    if (parameterElts.length > 0) {
-      if (identical(parameterElts[0].parameterKind, ParameterKind.NAMED)) {
-        for (int i = 0; i < parameterElts.length; i++) {
-          ParameterElementImpl parameterElt = parameterElts[i];
-          EvaluationResultImpl result = parameterElt.evaluationResult;
-          if (result == null || identical(result, ValidResult.RESULT_OBJECT)) {
-            continue;
-          }
-          String parameterName = parameterElt.name;
-          for (int j = 0; j < overriddenParameterElts.length; j++) {
-            ParameterElementImpl overriddenParameterElt = overriddenParameterElts[j];
-            String overriddenParameterName = overriddenParameterElt.name;
-            if (parameterName != null && parameterName == overriddenParameterName) {
-              EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
-              if (overriddenResult == null || identical(result, ValidResult.RESULT_OBJECT)) {
-                break;
-              }
-              if (!result.equalValues(overriddenResult)) {
-                _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED, formalParameters[i], [overriddenExecutable.enclosingElement.displayName, overriddenExecutable.displayName, parameterName]);
-                foundError = true;
-              }
-            }
-          }
-        }
-      } else {
-        for (int i = 0; i < parameterElts.length && i < overriddenParameterElts.length; i++) {
-          ParameterElementImpl parameterElt = parameterElts[i];
-          EvaluationResultImpl result = parameterElt.evaluationResult;
-          if (result == null || identical(result, ValidResult.RESULT_OBJECT)) {
-            continue;
-          }
-          ParameterElementImpl overriddenParameterElt = overriddenParameterElts[i];
-          EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
-          if (overriddenResult == null || identical(result, ValidResult.RESULT_OBJECT)) {
-            continue;
-          }
-          if (!result.equalValues(overriddenResult)) {
-            _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL, formalParameters[i], [overriddenExecutable.enclosingElement.displayName, overriddenExecutable.displayName]);
-            foundError = true;
-          }
-        }
-      }
-    }
-    return foundError;
+    return false;
   }
 
   /**
    * This verifies that all classes of the passed 'with' clause are valid.
    * @param node the 'with' clause to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
    * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
    * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
@@ -10690,7 +10417,7 @@
   /**
    * This checks error related to the redirected constructors.
    * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#REDIRECT_TO_INVALID_RETURN_TYPE
    * @see StaticWarningCode#REDIRECT_TO_INVALID_FUNCTION_TYPE
    * @see StaticWarningCode#REDIRECT_TO_MISSING_CONSTRUCTOR
@@ -10732,15 +10459,15 @@
   /**
    * This checks that the return statement of the form <i>return e;</i> is not in a generative
    * constructor.
-   *
+   * <p>
    * This checks that return statements without expressions are not in a generative constructor and
-   * the return type is not assignable to `null`; that is, we don't have `return;` if
+   * the return type is not assignable to {@code null}; that is, we don't have {@code return;} if
    * the enclosing method has a return type.
-   *
+   * <p>
    * This checks that the return type matches the type of the declared return type in the enclosing
    * method or function.
    * @param node the return statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
    * @see StaticWarningCode#RETURN_WITHOUT_VALUE
    * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
@@ -10749,7 +10476,7 @@
     FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
     Type2 expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
     Expression returnExpression = node.expression;
-    bool isGenerativeConstructor = _enclosingFunction is ConstructorElement && !((_enclosingFunction as ConstructorElement)).isFactory;
+    bool isGenerativeConstructor = _enclosingFunction is ConstructorElement && !((_enclosingFunction as ConstructorElement)).isFactory();
     if (isGenerativeConstructor) {
       if (returnExpression == null) {
         return false;
@@ -10764,14 +10491,37 @@
       _errorReporter.reportError2(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []);
       return true;
     }
-    return checkForReturnOfInvalidType(returnExpression, expectedReturnType);
+    Type2 staticReturnType = getStaticType(returnExpression);
+    if (expectedReturnType.isVoid()) {
+      if (staticReturnType.isVoid() || staticReturnType.isDynamic() || identical(staticReturnType, BottomTypeImpl.instance)) {
+        return false;
+      }
+      _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [staticReturnType.displayName, expectedReturnType.displayName, _enclosingFunction.displayName]);
+      return true;
+    }
+    bool isStaticAssignable = staticReturnType.isAssignableTo(expectedReturnType);
+    Type2 propagatedReturnType = getPropagatedType(returnExpression);
+    if (_strictMode || propagatedReturnType == null) {
+      if (isStaticAssignable) {
+        return false;
+      }
+      _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [staticReturnType.displayName, expectedReturnType.displayName, _enclosingFunction.displayName]);
+      return true;
+    } else {
+      bool isPropagatedAssignable = propagatedReturnType.isAssignableTo(expectedReturnType);
+      if (isStaticAssignable || isPropagatedAssignable) {
+        return false;
+      }
+      _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [staticReturnType.displayName, expectedReturnType.displayName, _enclosingFunction.displayName]);
+      return true;
+    }
   }
 
   /**
    * This verifies that the export namespace of the passed export directive does not export any name
    * already exported by other export directive.
    * @param node the export directive node to report problem on
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
    */
   bool checkForAmbiguousExport(ExportDirective node) {
@@ -10799,8 +10549,8 @@
 
   /**
    * This verifies that the passed argument definition test identifier is a parameter.
-   * @param node the [ArgumentDefinitionTest] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @param node the {@link ArgumentDefinitionTest} to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#ARGUMENT_DEFINITION_TEST_NON_PARAMETER
    */
   bool checkForArgumentDefinitionTestNonParameter(ArgumentDefinitionTest node) {
@@ -10816,7 +10566,7 @@
   /**
    * This verifies that the passed arguments can be assigned to their corresponding parameters.
    * @param node the arguments to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
    */
   bool checkForArgumentTypeNotAssignable(ArgumentList argumentList) {
@@ -10833,7 +10583,7 @@
   /**
    * This verifies that the passed argument can be assigned to their corresponding parameters.
    * @param node the argument to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
    */
   bool checkForArgumentTypeNotAssignable2(Expression argument) {
@@ -10873,7 +10623,7 @@
   /**
    * This verifies that left hand side of the passed assignment expression is not final.
    * @param node the assignment expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
    */
   bool checkForAssignmentToFinal(AssignmentExpression node) {
@@ -10884,7 +10634,7 @@
   /**
    * This verifies that the passed expression is not final.
    * @param node the expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
    */
   bool checkForAssignmentToFinal2(Expression expression) {
@@ -10897,7 +10647,7 @@
     }
     if (element is VariableElement) {
       VariableElement leftVar = element as VariableElement;
-      if (leftVar.isFinal) {
+      if (leftVar.isFinal()) {
         _errorReporter.reportError2(StaticWarningCode.ASSIGNMENT_TO_FINAL, expression, []);
         return true;
       }
@@ -10905,7 +10655,7 @@
     }
     if (element is PropertyAccessorElement) {
       PropertyAccessorElement leftAccessor = element as PropertyAccessorElement;
-      if (!leftAccessor.isSetter) {
+      if (!leftAccessor.isSetter()) {
         _errorReporter.reportError2(StaticWarningCode.ASSIGNMENT_TO_FINAL, expression, []);
         return true;
       }
@@ -10919,8 +10669,8 @@
    * on the identifier if it is a keyword.
    * @param identifier the identifier to check to ensure that it is not a keyword
    * @param errorCode if the passed identifier is a keyword then this error code is created on the
-   * identifier, the error code will be one of[CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME],[CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME] or[CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]
-   * @return `true` if and only if an error code is generated on the passed node
+   * identifier, the error code will be one of{@link CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME},{@link CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME} or{@link CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME}
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME
    * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME
    * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME
@@ -10937,7 +10687,7 @@
   /**
    * This verifies that the passed variable declaration list does not have a built-in identifier.
    * @param node the variable declaration list to check
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE
    */
   bool checkForBuiltInIdentifierAsName2(VariableDeclarationList node) {
@@ -10962,7 +10712,7 @@
    * This verifies that the given switch case is terminated with 'break', 'continue', 'return' or
    * 'throw'.
    * @param node the switch case to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
    */
   bool checkForCaseBlockNotTerminated(SwitchCase node) {
@@ -10997,7 +10747,7 @@
    * This verifies that the switch cases in the given switch statement is terminated with 'break',
    * 'continue', 'return' or 'throw'.
    * @param node the switch statement containing the cases to be checked
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
    */
   bool checkForCaseBlocksNotTerminated(SwitchStatement node) {
@@ -11017,7 +10767,7 @@
    * This verifies that the passed switch statement does not have a case expression with the
    * operator '==' overridden.
    * @param node the switch statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
    */
   bool checkForCaseExpressionTypeImplementsEquals(SwitchStatement node) {
@@ -11041,11 +10791,11 @@
    * This verifies that the passed method declaration is abstract only if the enclosing class is
    * also abstract.
    * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
    */
   bool checkForConcreteClassWithAbstractMember(MethodDeclaration node) {
-    if (node.isAbstract && _enclosingClass != null && !_enclosingClass.isAbstract) {
+    if (node.isAbstract() && _enclosingClass != null && !_enclosingClass.isAbstract()) {
       SimpleIdentifier methodName = node.name;
       _errorReporter.reportError2(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, methodName, [methodName.name, _enclosingClass.displayName]);
       return true;
@@ -11057,7 +10807,7 @@
    * This verifies all possible conflicts of the constructor name with other constructors and
    * members of the same class.
    * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT
    * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME
    * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD
@@ -11082,7 +10832,7 @@
         return true;
       }
     }
-    if (constructorName != null && constructorElement != null && !constructorName.isSynthetic) {
+    if (constructorName != null && constructorElement != null && !constructorName.isSynthetic()) {
       List<FieldElement> fields = classElement.fields;
       for (FieldElement field in fields) {
         if (field.name == name) {
@@ -11105,12 +10855,12 @@
    * This verifies that the superclass of the enclosing class does not declare accessible static
    * member with the same name as the passed instance getter/setter method declaration.
    * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER
    * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER
    */
   bool checkForConflictingInstanceGetterAndSuperclassMember(MethodDeclaration node) {
-    if (node.isStatic) {
+    if (node.isStatic()) {
       return false;
     }
     SimpleIdentifier nameNode = node.name;
@@ -11133,12 +10883,12 @@
     if (superElement == null) {
       return false;
     }
-    if (!superElement.isStatic) {
+    if (!superElement.isStatic()) {
       return false;
     }
     ClassElement superElementClass = superElement.enclosingElement as ClassElement;
     InterfaceType superElementType = superElementClass.type;
-    if (node.isGetter) {
+    if (node.isGetter()) {
       _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, nameNode, [superElementType.displayName]);
     } else {
       _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, nameNode, [superElementType.displayName]);
@@ -11150,11 +10900,11 @@
    * This verifies that the enclosing class does not have an instance member with the same name as
    * the passed static getter method declaration.
    * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER
    */
   bool checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) {
-    if (!node.isStatic) {
+    if (!node.isStatic()) {
       return false;
     }
     SimpleIdentifier nameNode = node.name;
@@ -11170,7 +10920,7 @@
     if (setter == null) {
       return false;
     }
-    if (setter.isStatic) {
+    if (setter.isStatic()) {
       return false;
     }
     ClassElement setterClass = setter.enclosingElement as ClassElement;
@@ -11183,11 +10933,11 @@
    * This verifies that the enclosing class does not have an instance member with the same name as
    * the passed static getter method declaration.
    * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER
    */
   bool checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) {
-    if (!node.isStatic) {
+    if (!node.isStatic()) {
       return false;
     }
     SimpleIdentifier nameNode = node.name;
@@ -11210,7 +10960,7 @@
     if (member == null) {
       return false;
     }
-    if (member.isStatic) {
+    if (member.isStatic()) {
       return false;
     }
     ClassElement memberClass = member.enclosingElement as ClassElement;
@@ -11223,7 +10973,7 @@
    * This verifies that the passed constructor declaration is 'const' then there are no non-final
    * instance variable.
    * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
    */
   bool checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) {
@@ -11243,7 +10993,7 @@
    * This verifies that the passed throw expression is not enclosed in a 'const' constructor
    * declaration.
    * @param node the throw expression expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_THROWS_EXCEPTION
    */
   bool checkForConstEvalThrowsException(ThrowExpression node) {
@@ -11257,11 +11007,11 @@
   /**
    * This verifies that the passed normal formal parameter is not 'const'.
    * @param node the normal formal parameter to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_FORMAL_PARAMETER
    */
   bool checkForConstFormalParameter(NormalFormalParameter node) {
-    if (node.isConst) {
+    if (node.isConst()) {
       _errorReporter.reportError2(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, node, []);
       return true;
     }
@@ -11272,16 +11022,16 @@
    * This verifies that the passed instance creation expression is not being invoked on an abstract
    * class.
    * @param node the instance creation expression to evaluate
-   * @param typeName the [TypeName] of the [ConstructorName] from the[InstanceCreationExpression], this is the AST node that the error is attached to
-   * @param type the type being constructed with this [InstanceCreationExpression]
-   * @return `true` if and only if an error code is generated on the passed node
+   * @param typeName the {@link TypeName} of the {@link ConstructorName} from the{@link InstanceCreationExpression}, this is the AST node that the error is attached to
+   * @param type the type being constructed with this {@link InstanceCreationExpression}
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS
    * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS
    */
   bool checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, TypeName typeName, InterfaceType type) {
-    if (type.element.isAbstract) {
+    if (type.element.isAbstract()) {
       ConstructorElement element = node.element;
-      if (element != null && !element.isFactory) {
+      if (element != null && !element.isFactory()) {
         if (identical(((node.keyword as sc.KeywordToken)).keyword, sc.Keyword.CONST)) {
           _errorReporter.reportError2(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
         } else {
@@ -11296,15 +11046,15 @@
   /**
    * This verifies that the passed 'const' instance creation expression is not being invoked on a
    * constructor that is not 'const'.
-   *
+   * <p>
    * This method assumes that the instance creation was tested to be 'const' before being called.
    * @param node the instance creation expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_WITH_NON_CONST
    */
   bool checkForConstWithNonConst(InstanceCreationExpression node) {
     ConstructorElement constructorElement = node.element;
-    if (constructorElement != null && !constructorElement.isConst) {
+    if (constructorElement != null && !constructorElement.isConst()) {
       _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_NON_CONST, node, []);
       return true;
     }
@@ -11314,10 +11064,10 @@
   /**
    * This verifies that the passed 'const' instance creation expression does not reference any type
    * parameters.
-   *
+   * <p>
    * This method assumes that the instance creation was tested to be 'const' before being called.
    * @param node the instance creation expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
    */
   bool checkForConstWithTypeParameters(InstanceCreationExpression node) {
@@ -11332,7 +11082,7 @@
   /**
    * This verifies that the passed type name does not reference any type parameters.
    * @param typeName the type name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
    */
   bool checkForConstWithTypeParameters2(TypeName typeName) {
@@ -11360,10 +11110,10 @@
   /**
    * This verifies that if the passed 'const' instance creation expression is being invoked on the
    * resolved constructor.
-   *
+   * <p>
    * This method assumes that the instance creation was tested to be 'const' before being called.
    * @param node the instance creation expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
    * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
    */
@@ -11392,7 +11142,7 @@
   /**
    * This verifies that there are no default parameters in the passed function type alias.
    * @param node the function type alias to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS
    */
   bool checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) {
@@ -11414,7 +11164,7 @@
   /**
    * This verifies the passed import has unique name among other exported libraries.
    * @param node the export directive to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
    */
   bool checkForExportDuplicateLibraryName(ExportDirective node) {
@@ -11444,7 +11194,7 @@
    * Check that if the visiting library is not system, then any passed library should not be SDK
    * internal library.
    * @param node the export directive to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY
    */
   bool checkForExportInternalLibrary(ExportDirective node) {
@@ -11462,7 +11212,7 @@
     if (sdkLibrary == null) {
       return false;
     }
-    if (!sdkLibrary.isInternal) {
+    if (!sdkLibrary.isInternal()) {
       return false;
     }
     _errorReporter.reportError2(CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, node, [node.uri]);
@@ -11472,7 +11222,7 @@
   /**
    * This verifies that the passed extends clause does not extend classes such as num or String.
    * @param node the extends clause to test
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
    */
   bool checkForExtendsDisallowedClass(ExtendsClause extendsClause) {
@@ -11486,14 +11236,14 @@
    * This verifies that the passed type name does not extend or implement classes such as 'num' or
    * 'String'.
    * @param node the type name to test
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see #checkForExtendsDisallowedClass(ExtendsClause)
    * @see #checkForImplementsDisallowedClass(ImplementsClause)
    * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
    * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
    */
   bool checkForExtendsOrImplementsDisallowedClass(TypeName typeName, ErrorCode errorCode) {
-    if (typeName.isSynthetic) {
+    if (typeName.isSynthetic()) {
       return false;
     }
     Type2 superType = typeName.type;
@@ -11520,7 +11270,7 @@
    * This verifies that the passed constructor field initializer has compatible field and
    * initializer expression types.
    * @param node the constructor field initializer to test
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
    * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
    */
@@ -11564,7 +11314,7 @@
   /**
    * This verifies that the passed field formal parameter is in a constructor declaration.
    * @param node the field formal parameter to test
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
    */
   bool checkForFieldInitializingFormalRedirectingConstructor(FieldFormalParameter node) {
@@ -11589,9 +11339,9 @@
   /**
    * This verifies that final fields that are declared, without any constructors in the enclosing
    * class, are initialized. Cases in which there is at least one constructor are handled at the end
-   * of [checkForAllFinalInitializedErrorCodes].
+   * of {@link #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)}.
    * @param node the class declaration to test
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#FINAL_NOT_INITIALIZED
    */
   bool checkForFinalNotInitialized(ClassDeclaration node) {
@@ -11613,14 +11363,14 @@
 
   /**
    * This verifies that the passed variable declaration list has only initialized variables if the
-   * list is final or const. This method is called by[checkForFinalNotInitialized],[visitTopLevelVariableDeclaration] and[visitVariableDeclarationStatement].
+   * list is final or const. This method is called by{@link #checkForFinalNotInitialized(ClassDeclaration)},{@link #visitTopLevelVariableDeclaration(TopLevelVariableDeclaration)} and{@link #visitVariableDeclarationStatement(VariableDeclarationStatement)}.
    * @param node the class declaration to test
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#FINAL_NOT_INITIALIZED
    */
   bool checkForFinalNotInitialized2(VariableDeclarationList node) {
     bool foundError = false;
-    if (!node.isSynthetic && (node.isConst || node.isFinal)) {
+    if (!node.isSynthetic() && (node.isConst() || node.isFinal())) {
       NodeList<VariableDeclaration> variables = node.variables;
       for (VariableDeclaration variable in variables) {
         if (variable.initializer == null) {
@@ -11636,7 +11386,7 @@
    * This verifies that the passed implements clause does not implement classes such as 'num' or
    * 'String'.
    * @param node the implements clause to test
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
    */
   bool checkForImplementsDisallowedClass(ImplementsClause implementsClause) {
@@ -11654,7 +11404,7 @@
    * This verifies that if the passed identifier is part of constructor initializer, then it does
    * not reference implicitly 'this' expression.
    * @param node the simple identifier to test
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
    */
   bool checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
@@ -11666,7 +11416,7 @@
       return false;
     }
     ExecutableElement executableElement = element as ExecutableElement;
-    if (executableElement.isStatic) {
+    if (executableElement.isStatic()) {
       return false;
     }
     Element enclosingElement = element.enclosingElement;
@@ -11701,7 +11451,7 @@
   /**
    * This verifies the passed import has unique name among other imported libraries.
    * @param node the import directive to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME
    */
   bool checkForImportDuplicateLibraryName(ImportDirective node) {
@@ -11731,7 +11481,7 @@
    * Check that if the visiting library is not system, then any passed library should not be SDK
    * internal library.
    * @param node the import directive to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY
    */
   bool checkForImportInternalLibrary(ImportDirective node) {
@@ -11749,7 +11499,7 @@
     if (sdkLibrary == null) {
       return false;
     }
-    if (!sdkLibrary.isInternal) {
+    if (!sdkLibrary.isInternal()) {
       return false;
     }
     _errorReporter.reportError2(CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, node, [node.uri]);
@@ -11759,7 +11509,7 @@
   /**
    * This verifies that the passed switch statement case expressions all have the same type.
    * @param node the switch statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES
    */
   bool checkForInconsistentCaseExpressionTypes(SwitchStatement node) {
@@ -11787,7 +11537,7 @@
   /**
    * For each class declaration, this method is called which verifies that all inherited members are
    * inherited consistently.
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#INCONSISTENT_METHOD_INHERITANCE
    */
   bool checkForInconsistentMethodInheritance() {
@@ -11806,7 +11556,7 @@
    * Given an assignment using a compound assignment operator, this verifies that the given
    * assignment is valid.
    * @param node the assignment expression being tested
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
    */
   bool checkForInvalidAssignment(AssignmentExpression node) {
@@ -11835,7 +11585,7 @@
    * This verifies that the passed left hand side and right hand side represent a valid assignment.
    * @param lhs the left hand side expression
    * @param rhs the right hand side expression
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
    */
   bool checkForInvalidAssignment2(Expression lhs, Expression rhs) {
@@ -11865,7 +11615,7 @@
   /**
    * This verifies that the usage of the passed 'this' is valid.
    * @param node the 'this' expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#INVALID_REFERENCE_TO_THIS
    */
   bool checkForInvalidReferenceToThis(ThisExpression node) {
@@ -11878,8 +11628,8 @@
 
   /**
    * Checks to ensure that first type argument to a map literal must be the 'String' type.
-   * @param arguments a non-`null`, non-empty [TypeName] node list from the respective[MapLiteral]
-   * @return `true` if and only if an error code is generated on the passed node
+   * @param arguments a non-{@code null}, non-empty {@link TypeName} node list from the respective{@link MapLiteral}
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_FOR_KEY
    */
   bool checkForInvalidTypeArgumentForKey(NodeList<TypeName> arguments) {
@@ -11893,11 +11643,11 @@
   }
 
   /**
-   * Checks to ensure that the passed [ListLiteral] or [MapLiteral] does not have a type
+   * Checks to ensure that the passed {@link ListLiteral} or {@link MapLiteral} does not have a type
    * parameter as a type argument.
-   * @param arguments a non-`null`, non-empty [TypeName] node list from the respective[ListLiteral] or [MapLiteral]
-   * @param errorCode either [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_LIST] or[CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_MAP]
-   * @return `true` if and only if an error code is generated on the passed node
+   * @param arguments a non-{@code null}, non-empty {@link TypeName} node list from the respective{@link ListLiteral} or {@link MapLiteral}
+   * @param errorCode either {@link CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_LIST} or{@link CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_MAP}
+   * @return {@code true} if and only if an error code is generated on the passed node
    */
   bool checkForInvalidTypeArgumentInConstTypedLiteral(NodeList<TypeName> arguments, ErrorCode errorCode) {
     bool foundError = false;
@@ -11911,9 +11661,9 @@
   }
 
   /**
-   * This verifies that the [enclosingClass] does not define members with the same name as
+   * This verifies that the {@link #enclosingClass} does not define members with the same name as
    * the enclosing class.
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MEMBER_WITH_CLASS_NAME
    */
   bool checkForMemberWithClassName() {
@@ -11952,10 +11702,10 @@
     }
     Type2 getterType = null;
     Type2 setterType = null;
-    if (propertyAccessorElement.isGetter) {
+    if (propertyAccessorElement.isGetter()) {
       getterType = getGetterType(propertyAccessorElement);
       setterType = getSetterType(counterpartAccessor);
-    } else if (propertyAccessorElement.isSetter) {
+    } else if (propertyAccessorElement.isSetter()) {
       setterType = getSetterType(propertyAccessorElement);
       counterpartAccessor = propertyAccessorElement.correspondingGetter;
       getterType = getGetterType(counterpartAccessor);
@@ -11969,12 +11719,12 @@
    * This verifies that the passed mixin does not have an explicitly declared constructor.
    * @param mixinName the node to report problem on
    * @param mixinElement the mixing to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
    */
   bool checkForMixinDeclaresConstructor(TypeName mixinName, ClassElement mixinElement) {
     for (ConstructorElement constructor in mixinElement.constructors) {
-      if (!constructor.isSynthetic && !constructor.isFactory) {
+      if (!constructor.isSynthetic() && !constructor.isFactory()) {
         _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, mixinName, [mixinElement.name]);
         return true;
       }
@@ -11986,13 +11736,13 @@
    * This verifies that the passed mixin has the 'Object' superclass.
    * @param mixinName the node to report problem on
    * @param mixinElement the mixing to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
    */
   bool checkForMixinInheritsNotFromObject(TypeName mixinName, ClassElement mixinElement) {
     InterfaceType mixinSupertype = mixinElement.supertype;
     if (mixinSupertype != null) {
-      if (!mixinSupertype.isObject || !mixinElement.isTypedef && mixinElement.mixins.length != 0) {
+      if (!mixinSupertype.isObject() || !mixinElement.isTypedef() && mixinElement.mixins.length != 0) {
         _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, mixinName, [mixinElement.name]);
         return true;
       }
@@ -12004,7 +11754,7 @@
    * This verifies that the passed mixin does not reference 'super'.
    * @param mixinName the node to report problem on
    * @param mixinElement the mixing to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
    */
   bool checkForMixinReferencesSuper(TypeName mixinName, ClassElement mixinElement) {
@@ -12017,7 +11767,7 @@
   /**
    * This verifies that the passed constructor has at most one 'super' initializer.
    * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MULTIPLE_SUPER_INITIALIZERS
    */
   bool checkForMultipleSuperInitializers(ConstructorDeclaration node) {
@@ -12036,7 +11786,7 @@
   /**
    * Checks to ensure that native function bodies can only in SDK code.
    * @param node the native function body to test
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see ParserErrorCode#NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
    */
   bool checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody node) {
@@ -12049,10 +11799,10 @@
 
   /**
    * This verifies that the passed 'new' instance creation expression invokes existing constructor.
-   *
+   * <p>
    * This method assumes that the instance creation was tested to be 'new' before being called.
    * @param node the instance creation expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
    */
   bool checkForNewWithUndefinedConstructor(InstanceCreationExpression node) {
@@ -12078,34 +11828,10 @@
   }
 
   /**
-   * This checks that passed if the passed class declaration implicitly calls default constructor of
-   * its superclass, there should be such default constructor - implicit or explicit.
-   * @param node the [ClassDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
-   */
-  bool checkForNoDefaultSuperConstructorImplicit(ClassDeclaration node) {
-    List<ConstructorElement> constructors = _enclosingClass.constructors;
-    if (!constructors[0].isSynthetic) {
-      return false;
-    }
-    InterfaceType superType = _enclosingClass.supertype;
-    if (superType == null) {
-      return false;
-    }
-    ClassElement superClass = superType.element;
-    if (superClass.hasDefaultConstructor()) {
-      return false;
-    }
-    _errorReporter.reportError2(StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, node.name, [superType.displayName]);
-    return true;
-  }
-
-  /**
    * This checks that passed class declaration overrides all members required by its superclasses
    * and interfaces.
-   * @param node the [ClassDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @param node the {@link ClassDeclaration} to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE
    * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO
    * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE
@@ -12113,7 +11839,7 @@
    * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS
    */
   bool checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration node) {
-    if (_enclosingClass.isAbstract) {
+    if (_enclosingClass.isAbstract()) {
       return false;
     }
     Set<ExecutableElement> missingOverrides = new Set<ExecutableElement>();
@@ -12132,7 +11858,7 @@
       ExecutableElement executableElt = entry.getValue();
       if (executableElt is MethodElement) {
         MethodElement methodElt = executableElt as MethodElement;
-        if (methodElt.isAbstract) {
+        if (methodElt.isAbstract()) {
           String methodName = entry.getKey();
           if (!methodsInEnclosingClass.contains(methodName)) {
             javaSetAdd(missingOverrides, executableElt);
@@ -12140,7 +11866,7 @@
         }
       } else if (executableElt is PropertyAccessorElement) {
         PropertyAccessorElement propertyAccessorElt = executableElt as PropertyAccessorElement;
-        if (propertyAccessorElt.isAbstract) {
+        if (propertyAccessorElt.isAbstract()) {
           String accessorName = entry.getKey();
           if (!accessorsInEnclosingClass.contains(accessorName)) {
             javaSetAdd(missingOverrides, executableElt);
@@ -12153,9 +11879,9 @@
       ExecutableElement executableElt = entry.getValue();
       ExecutableElement elt = membersInheritedFromSuperclasses[executableElt.name];
       if (elt != null) {
-        if (elt is MethodElement && !((elt as MethodElement)).isAbstract) {
+        if (elt is MethodElement && !((elt as MethodElement)).isAbstract()) {
           continue;
-        } else if (elt is PropertyAccessorElement && !((elt as PropertyAccessorElement)).isAbstract) {
+        } else if (elt is PropertyAccessorElement && !((elt as PropertyAccessorElement)).isAbstract()) {
           continue;
         }
       }
@@ -12182,7 +11908,7 @@
     for (int i = 0; i < stringTypeArray.length; i++) {
       stringTypeArray[i] = StringUtilities.EMPTY;
       if (missingOverridesArray[i] is PropertyAccessorElement) {
-        stringTypeArray[i] = ((missingOverridesArray[i] as PropertyAccessorElement)).isGetter ? GET : SET;
+        stringTypeArray[i] = ((missingOverridesArray[i] as PropertyAccessorElement)).isGetter() ? GET : SET;
       }
     }
     AnalysisErrorWithProperties analysisError;
@@ -12206,7 +11932,7 @@
    * Checks to ensure that the expressions that need to be of type bool, are. Otherwise an error is
    * reported on the expression.
    * @param condition the conditional expression to test
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#NON_BOOL_CONDITION
    */
   bool checkForNonBoolCondition(Expression condition) {
@@ -12221,7 +11947,7 @@
   /**
    * This verifies that the passed assert statement has either a 'bool' or '() -> bool' input.
    * @param node the assert statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#NON_BOOL_EXPRESSION
    */
   bool checkForNonBoolExpression(AssertStatement node) {
@@ -12244,13 +11970,13 @@
 
   /**
    * This verifies the passed map literal either:
-   *
-   * * has `const modifier`
-   * * has explicit type arguments
-   * * is not start of the statement
-   *
+   * <ul>
+   * <li>has {@code const modifier}</li>
+   * <li>has explicit type arguments</li>
+   * <li>is not start of the statement</li>
+   * <ul>
    * @param node the map literal to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT
    */
   bool checkForNonConstMapAsExpressionStatement(MapLiteral node) {
@@ -12272,10 +11998,10 @@
   }
 
   /**
-   * This verifies the passed method declaration of operator `\[\]=`, has `void` return
+   * This verifies the passed method declaration of operator {@code \[\]=}, has {@code void} return
    * type.
    * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR
    */
   bool checkForNonVoidReturnTypeForOperator(MethodDeclaration node) {
@@ -12286,7 +12012,7 @@
     TypeName typeName = node.returnType;
     if (typeName != null) {
       Type2 type = typeName.type;
-      if (type != null && !type.isVoid) {
+      if (type != null && !type.isVoid()) {
         _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, typeName, []);
       }
     }
@@ -12294,15 +12020,15 @@
   }
 
   /**
-   * This verifies the passed setter has no return type or the `void` return type.
+   * This verifies the passed setter has no return type or the {@code void} return type.
    * @param typeName the type name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER
    */
   bool checkForNonVoidReturnTypeForSetter(TypeName typeName) {
     if (typeName != null) {
       Type2 type = typeName.type;
-      if (type != null && !type.isVoid) {
+      if (type != null && !type.isVoid()) {
         _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, typeName, []);
       }
     }
@@ -12311,11 +12037,11 @@
 
   /**
    * This verifies the passed operator-method declaration, does not have an optional parameter.
-   *
+   * <p>
    * This method assumes that the method declaration was tested to be an operator declaration before
    * being called.
    * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#OPTIONAL_PARAMETER_IN_OPERATOR
    */
   bool checkForOptionalParameterInOperator(MethodDeclaration node) {
@@ -12326,7 +12052,7 @@
     bool foundError = false;
     NodeList<FormalParameter> formalParameters = parameterList.parameters;
     for (FormalParameter formalParameter in formalParameters) {
-      if (formalParameter.kind.isOptional) {
+      if (formalParameter.kind.isOptional()) {
         _errorReporter.reportError2(CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, formalParameter, []);
         foundError = true;
       }
@@ -12337,7 +12063,7 @@
   /**
    * This checks for named optional parameters that begin with '_'.
    * @param node the default formal parameter to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#PRIVATE_OPTIONAL_PARAMETER
    */
   bool checkForPrivateOptionalParameter(DefaultFormalParameter node) {
@@ -12345,7 +12071,7 @@
     if (separator != null && separator.lexeme == ":") {
       NormalFormalParameter parameter = node.parameter;
       SimpleIdentifier name = parameter.identifier;
-      if (!name.isSynthetic && name.name.startsWith("_")) {
+      if (!name.isSynthetic() && name.name.startsWith("_")) {
         _errorReporter.reportError2(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, node, []);
         return true;
       }
@@ -12357,7 +12083,7 @@
    * This checks if the passed constructor declaration is the redirecting generative constructor and
    * references itself directly or indirectly.
    * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
    */
   bool checkForRecursiveConstructorRedirect(ConstructorDeclaration node) {
@@ -12381,7 +12107,7 @@
    * This checks if the passed constructor declaration has redirected constructor and references
    * itself directly or indirectly.
    * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
    */
   bool checkForRecursiveFactoryRedirect(ConstructorDeclaration node) {
@@ -12401,7 +12127,7 @@
    * This checks the class declaration is not a superinterface to itself.
    * @param classElt the class element to test
    * @param list a list containing the potentially cyclic implements path
-   * @return `true` if and only if an error code is generated on the passed element
+   * @return {@code true} if and only if an error code is generated on the passed element
    * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
    * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
    * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
@@ -12440,7 +12166,7 @@
     }
     List<ClassElement> interfaceElements;
     List<InterfaceType> interfaceTypes = classElt.interfaces;
-    if (supertype != null && !supertype.isObject) {
+    if (supertype != null && !supertype.isObject()) {
       interfaceElements = new List<ClassElement>(interfaceTypes.length + 1);
       interfaceElements[0] = supertype.element;
       for (int i = 0; i < interfaceTypes.length; i++) {
@@ -12465,7 +12191,7 @@
    * This checks the passed constructor declaration has a valid combination of redirected
    * constructor invocation(s), super constructor invocations and field initializers.
    * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS
    * @see CompileTimeErrorCode#SUPER_IN_REDIRECTING_CONSTRUCTOR
    * @see CompileTimeErrorCode#FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
@@ -12501,7 +12227,7 @@
    * This checks if the passed constructor declaration has redirected constructor and references
    * itself directly or indirectly. TODO(scheglov)
    * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
    */
   bool checkForRedirectToNonConstConstructor(ConstructorDeclaration node) {
@@ -12513,14 +12239,14 @@
     if (element == null) {
       return false;
     }
-    if (!element.isConst) {
+    if (!element.isConst()) {
       return false;
     }
     ConstructorElement redirectedConstructor = element.redirectedConstructor;
     if (redirectedConstructor == null) {
       return false;
     }
-    if (redirectedConstructor.isConst) {
+    if (redirectedConstructor.isConst()) {
       return false;
     }
     _errorReporter.reportError2(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR, redirectedConstructorNode, []);
@@ -12531,7 +12257,7 @@
    * This checks if the passed identifier is banned because it is part of the variable declaration
    * with the same name.
    * @param node the identifier to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER
    */
   bool checkForReferenceToDeclaredVariableInInitializer(SimpleIdentifier node) {
@@ -12577,7 +12303,7 @@
   /**
    * This checks that the rethrow is inside of a catch clause.
    * @param node the rethrow expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#RETHROW_OUTSIDE_CATCH
    */
   bool checkForRethrowOutsideCatch(RethrowExpression node) {
@@ -12589,48 +12315,11 @@
   }
 
   /**
-   * This checks that a type mis-match between the return type and the expressed return type by the
-   * enclosing method or function.
-   *
-   * This method is called both by [checkForAllReturnStatementErrorCodes]and [visitExpressionFunctionBody].
-   * @param returnExpression the returned expression to evaluate
-   * @param expectedReturnType the expressed return type by the enclosing method or function
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
-   */
-  bool checkForReturnOfInvalidType(Expression returnExpression, Type2 expectedReturnType) {
-    Type2 staticReturnType = getStaticType(returnExpression);
-    if (expectedReturnType.isVoid) {
-      if (staticReturnType.isVoid || staticReturnType.isDynamic || identical(staticReturnType, BottomTypeImpl.instance)) {
-        return false;
-      }
-      _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [staticReturnType.displayName, expectedReturnType.displayName, _enclosingFunction.displayName]);
-      return true;
-    }
-    bool isStaticAssignable = staticReturnType.isAssignableTo(expectedReturnType);
-    Type2 propagatedReturnType = getPropagatedType(returnExpression);
-    if (_strictMode || propagatedReturnType == null) {
-      if (isStaticAssignable) {
-        return false;
-      }
-      _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [staticReturnType.displayName, expectedReturnType.displayName, _enclosingFunction.displayName]);
-      return true;
-    } else {
-      bool isPropagatedAssignable = propagatedReturnType.isAssignableTo(expectedReturnType);
-      if (isStaticAssignable || isPropagatedAssignable) {
-        return false;
-      }
-      _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [staticReturnType.displayName, expectedReturnType.displayName, _enclosingFunction.displayName]);
-      return true;
-    }
-  }
-
-  /**
    * This checks that if the given "target" is the type reference then the "name" is not the
    * reference to a instance member.
    * @param target the target of the name access to evaluate
    * @param name the accessed name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER
    */
   bool checkForStaticAccessToInstanceMember(Expression target, SimpleIdentifier name2) {
@@ -12639,7 +12328,7 @@
       return false;
     }
     ExecutableElement memberElement = element as ExecutableElement;
-    if (memberElement.isStatic) {
+    if (memberElement.isStatic()) {
       return false;
     }
     if (!isTypeReference(target)) {
@@ -12653,7 +12342,7 @@
    * This checks that the type of the passed 'switch' expression is assignable to the type of the
    * 'case' members.
    * @param node the 'switch' statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE
    */
   bool checkForSwitchExpressionNotAssignable(SwitchStatement node) {
@@ -12684,9 +12373,9 @@
    * their bounds as specified by the class element where the constructor \[that is being invoked\] is
    * declared.
    * @param node the instance creation expression to evaluate
-   * @param typeName the [TypeName] of the [ConstructorName] from the[InstanceCreationExpression], this is the AST node that the error is attached to
-   * @param constructorElement the [ConstructorElement] from the instance creation expression
-   * @return `true` if and only if an error code is generated on the passed node
+   * @param typeName the {@link TypeName} of the {@link ConstructorName} from the{@link InstanceCreationExpression}, this is the AST node that the error is attached to
+   * @param constructorElement the {@link ConstructorElement} from the instance creation expression
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
   bool checkForTypeArgumentNotMatchingBounds(InstanceCreationExpression node, ConstructorElement constructorElement, TypeName typeName) {
@@ -12714,10 +12403,9 @@
    * invocation nor a redirecting constructor invocation, that the superclass has a default
    * generative constructor.
    * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT
    * @see CompileTimeErrorCode#NON_GENERATIVE_CONSTRUCTOR
-   * @see StaticWarningCode#NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT
    */
   bool checkForUndefinedConstructorInInitializerImplicit(ConstructorDeclaration node) {
     if (node.factoryKeyword != null) {
@@ -12736,23 +12424,12 @@
       return false;
     }
     ClassElement superElement = superType.element;
-    ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
-    if (superUnnamedConstructor != null) {
-      if (superUnnamedConstructor.isFactory) {
-        _errorReporter.reportError2(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.returnType, [superUnnamedConstructor]);
+    ConstructorElement superDefaultConstructor = superElement.unnamedConstructor;
+    if (superDefaultConstructor != null) {
+      if (superDefaultConstructor.isFactory()) {
+        _errorReporter.reportError2(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.returnType, [superDefaultConstructor]);
         return true;
       }
-      if (!superUnnamedConstructor.isDefaultConstructor) {
-        int offset;
-        int length;
-        {
-          Identifier returnType = node.returnType;
-          SimpleIdentifier name = node.name;
-          offset = returnType.offset;
-          length = (name != null ? name.end : returnType.end) - offset;
-        }
-        _errorReporter.reportError3(StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, length, [superType.displayName]);
-      }
       return false;
     }
     _errorReporter.reportError2(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node.returnType, [superElement.name]);
@@ -12761,11 +12438,11 @@
 
   /**
    * This verifies the passed operator-method declaration, has correct number of parameters.
-   *
+   * <p>
    * This method assumes that the method declaration was tested to be an operator declaration before
    * being called.
    * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR
    */
   bool checkForWrongNumberOfParametersForOperator(MethodDeclaration node) {
@@ -12800,11 +12477,11 @@
 
   /**
    * This verifies if the passed setter parameter list have only one parameter.
-   *
+   * <p>
    * This method assumes that the method declaration was tested to be a setter before being called.
    * @param setterName the name of the setter to report problems on
    * @param parameterList the parameter list to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
    */
   bool checkForWrongNumberOfParametersForSetter(SimpleIdentifier setterName, FormalParameterList parameterList) {
@@ -12884,7 +12561,7 @@
   }
 
   /**
-   * Return the variable element represented by the given expression, or `null` if there is no
+   * Return the variable element represented by the given expression, or {@code null} if there is no
    * such element.
    * @param expression the expression whose element is to be returned
    * @return the variable element represented by the expression
@@ -12900,7 +12577,7 @@
   }
 
   /**
-   * @return `true` if the given constructor redirects to itself, directly or indirectly
+   * @return {@code true} if the given constructor redirects to itself, directly or indirectly
    */
   bool hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
     Set<ConstructorElement> constructors = new Set<ConstructorElement>();
@@ -12920,7 +12597,7 @@
 
   /**
    * @param node the 'this' expression to analyze
-   * @return `true` if the given 'this' expression is in the valid context
+   * @return {@code true} if the given 'this' expression is in the valid context
    */
   bool isThisInValidContext(ThisExpression node) {
     for (ASTNode n = node; n != null; n = n.parent) {
@@ -12936,7 +12613,7 @@
       }
       if (n is MethodDeclaration) {
         MethodDeclaration method = n as MethodDeclaration;
-        return !method.isStatic;
+        return !method.isStatic();
       }
     }
     return false;
@@ -12967,7 +12644,7 @@
   String toString() => name;
 }
 /**
- * Instances of the class `PubVerifier` traverse an AST structure looking for deviations from
+ * Instances of the class {@code PubVerifier} traverse an AST structure looking for deviations from
  * pub best practices.
  */
 class PubVerifier extends RecursiveASTVisitor<Object> {
@@ -12994,9 +12671,9 @@
    * This verifies that the passed file import directive is not contained in a source inside a
    * package "lib" directory hierarchy referencing a source outside that package "lib" directory
    * hierarchy.
-   * @param uriLiteral the import URL (not `null`)
-   * @param path the file path being verified (not `null`)
-   * @return `true` if and only if an error code is generated on the passed node
+   * @param uriLiteral the import URL (not {@code null})
+   * @param path the file path being verified (not {@code null})
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE
    */
   bool checkForFileImportInsideLibReferencesFileOutside(StringLiteral uriLiteral, String path) {
@@ -13006,7 +12683,7 @@
       int pathIndex = 0;
       int fullNameIndex = fullName.length;
       while (pathIndex < path.length && JavaString.startsWithBefore(path, "../", pathIndex)) {
-        fullNameIndex = JavaString.lastIndexOf(fullName, '/', fullNameIndex);
+        fullNameIndex = fullName.lastIndexOf('/', fullNameIndex);
         if (fullNameIndex < 4) {
           return false;
         }
@@ -13028,9 +12705,9 @@
    * This verifies that the passed file import directive is not contained in a source outside a
    * package "lib" directory hierarchy referencing a source inside that package "lib" directory
    * hierarchy.
-   * @param uriLiteral the import URL (not `null`)
-   * @param path the file path being verified (not `null`)
-   * @return `true` if and only if an error code is generated on the passed node
+   * @param uriLiteral the import URL (not {@code null})
+   * @param path the file path being verified (not {@code null})
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE
    */
   bool checkForFileImportOutsideLibReferencesFileInside(StringLiteral uriLiteral, String path) {
@@ -13044,7 +12721,7 @@
       if (checkForFileImportOutsideLibReferencesFileInside2(uriLiteral, path, pathIndex + 1)) {
         return true;
       }
-      pathIndex = JavaString.indexOf(path, "/lib/", pathIndex + 4);
+      pathIndex = path.indexOf("/lib/", pathIndex + 4);
     }
     return false;
   }
@@ -13067,9 +12744,9 @@
 
   /**
    * This verifies that the passed package import directive does not contain ".."
-   * @param uriLiteral the import URL (not `null`)
-   * @param path the path to be validated (not `null`)
-   * @return `true` if and only if an error code is generated on the passed node
+   * @param uriLiteral the import URL (not {@code null})
+   * @param path the path to be validated (not {@code null})
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
    */
   bool checkForPackageImportContainsDotDot(StringLiteral uriLiteral, String path) {
@@ -13082,8 +12759,8 @@
 
   /**
    * Answer the source associated with the compilation unit containing the given AST node.
-   * @param node the node (not `null`)
-   * @return the source or `null` if it could not be determined
+   * @param node the node (not {@code null})
+   * @return the source or {@code null} if it could not be determined
    */
   Source getSource(ASTNode node) {
     Source source = null;
@@ -13098,9 +12775,9 @@
   }
 
   /**
-   * Answer the full name of the given source. The returned value will have all[File#separatorChar] replace by '/'.
+   * Answer the full name of the given source. The returned value will have all{@link File#separatorChar} replace by '/'.
    * @param source the source
-   * @return the full name or `null` if it could not be determined
+   * @return the full name or {@code null} if it could not be determined
    */
   String getSourceFullName(Source source) {
     if (source != null) {
@@ -13113,7 +12790,7 @@
   }
 }
 /**
- * The enumeration `ResolverErrorCode` defines the error codes used for errors detected by the
+ * The enumeration {@code ResolverErrorCode} defines the error codes used for errors detected by the
  * resolver. The convention for this class is for the name of the error code to indicate the problem
  * that caused the error to be generated and for the error message to explain what is wrong and,
  * when appropriate, how the problem can be corrected.
diff --git a/pkg/analyzer_experimental/lib/src/generated/scanner.dart b/pkg/analyzer_experimental/lib/src/generated/scanner.dart
index 24464e6..7c3c523 100644
--- a/pkg/analyzer_experimental/lib/src/generated/scanner.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/scanner.dart
@@ -8,7 +8,7 @@
 import 'error.dart';
 import 'instrumentation.dart';
 /**
- * Instances of the abstract class `KeywordState` represent a state in a state machine used to
+ * Instances of the abstract class {@code KeywordState} represent a state in a state machine used to
  * scan keywords.
  * @coverage dart.engine.parser
  */
@@ -87,12 +87,12 @@
 
   /**
    * A table mapping characters to the states to which those characters will transition. (The index
-   * into the array is the offset from the character `'a'` to the transitioning character.)
+   * into the array is the offset from the character {@code 'a'} to the transitioning character.)
    */
   List<KeywordState> _table;
 
   /**
-   * The keyword that is recognized by this state, or `null` if this state is not a terminal
+   * The keyword that is recognized by this state, or {@code null} if this state is not a terminal
    * state.
    */
   Keyword _keyword2;
@@ -109,21 +109,21 @@
   }
 
   /**
-   * Return the keyword that was recognized by this state, or `null` if this state does not
+   * Return the keyword that was recognized by this state, or {@code null} if this state does not
    * recognized a keyword.
    * @return the keyword that was matched by reaching this state
    */
   Keyword keyword() => _keyword2;
 
   /**
-   * Return the state that follows this state on a transition of the given character, or`null` if there is no valid state reachable from this state with such a transition.
+   * Return the state that follows this state on a transition of the given character, or{@code null} if there is no valid state reachable from this state with such a transition.
    * @param c the character used to transition from this state to another state
    * @return the state that follows this state on a transition of the given character
    */
   KeywordState next(int c) => _table[c - 0x61];
 }
 /**
- * The enumeration `ScannerErrorCode` defines the error codes used for errors detected by the
+ * The enumeration {@code ScannerErrorCode} defines the error codes used for errors detected by the
  * scanner.
  * @coverage dart.engine.parser
  */
@@ -162,7 +162,7 @@
   String toString() => name;
 }
 /**
- * Instances of the class `TokenWithComment` represent a string token that is preceded by
+ * Instances of the class {@code TokenWithComment} represent a string token that is preceded by
  * comments.
  * @coverage dart.engine.parser
  */
@@ -186,7 +186,7 @@
   Token get precedingComments => _precedingComment;
 }
 /**
- * The enumeration `Keyword` defines the keywords in the Dart programming language.
+ * The enumeration {@code Keyword} defines the keywords in the Dart programming language.
  * @coverage dart.engine.parser
  */
 class Keyword implements Comparable<Keyword> {
@@ -288,9 +288,9 @@
 
   /**
    * Initialize a newly created keyword to have the given syntax. The keyword is a pseudo-keyword if
-   * the given flag is `true`.
+   * the given flag is {@code true}.
    * @param syntax the lexeme for the keyword
-   * @param isPseudoKeyword `true` if this keyword is a pseudo-keyword
+   * @param isPseudoKeyword {@code true} if this keyword is a pseudo-keyword
    */
   Keyword.con2(this.name, this.ordinal, String syntax2, bool isPseudoKeyword) {
     _jtd_constructor_319_impl(syntax2, isPseudoKeyword);
@@ -307,19 +307,19 @@
   String get syntax => _syntax;
 
   /**
-   * Return `true` if this keyword is a pseudo-keyword. Pseudo keywords can be used as
+   * Return {@code true} if this keyword is a pseudo-keyword. Pseudo keywords can be used as
    * identifiers.
-   * @return `true` if this keyword is a pseudo-keyword
+   * @return {@code true} if this keyword is a pseudo-keyword
    */
-  bool get isPseudoKeyword => _isPseudoKeyword2;
+  bool isPseudoKeyword() => _isPseudoKeyword2;
   int compareTo(Keyword other) => ordinal - other.ordinal;
   int get hashCode => ordinal;
   String toString() => name;
 }
 /**
- * The abstract class `AbstractScanner` implements a scanner for Dart code. Subclasses are
+ * The abstract class {@code AbstractScanner} implements a scanner for Dart code. Subclasses are
  * required to implement the interface used to access the characters being scanned.
- *
+ * <p>
  * The lexical structure of Dart is ambiguous without knowledge of the context in which a token is
  * being scanned. For example, without context we cannot determine whether source of the form "<<"
  * should be scanned as a single left-shift operator or as two left angle brackets. This scanner
@@ -415,8 +415,8 @@
   int get offset;
 
   /**
-   * Return `true` if any unmatched groups were found during the parse.
-   * @return `true` if any unmatched groups were found during the parse
+   * Return {@code true} if any unmatched groups were found during the parse.
+   * @return {@code true} if any unmatched groups were found during the parse
    */
   bool hasUnmatchedGroups() => _hasUnmatchedGroups2;
 
@@ -764,7 +764,7 @@
       return next;
     }
   }
-  int select3(int choice, TokenType yesType, TokenType noType, int offset) {
+  int select4(int choice, TokenType yesType, TokenType noType, int offset) {
     int next = advance();
     if (next == choice) {
       appendToken2(yesType, offset);
@@ -871,7 +871,7 @@
     if (!hasDigit) {
       appendStringToken(TokenType.INT, getString(start, -2));
       if (0x2E == next) {
-        return select3(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD, offset - 1);
+        return select4(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD, offset - 1);
       }
       appendToken2(TokenType.PERIOD, offset - 1);
       return bigSwitch(next);
@@ -1272,7 +1272,7 @@
   }
 }
 /**
- * Instances of the class `StringToken` represent a token whose value is independent of it's
+ * Instances of the class {@code StringToken} represent a token whose value is independent of it's
  * type.
  * @coverage dart.engine.parser
  */
@@ -1296,7 +1296,7 @@
   String value() => _value2;
 }
 /**
- * Instances of the class `CharBufferScanner` implement a scanner that reads from a character
+ * Instances of the class {@code CharBufferScanner} implement a scanner that reads from a character
  * buffer. The scanning logic is in the superclass.
  * @coverage dart.engine.parser
  */
@@ -1344,7 +1344,7 @@
   }
 }
 /**
- * Instances of the class `TokenWithComment` represent a normal token that is preceded by
+ * Instances of the class {@code TokenWithComment} represent a normal token that is preceded by
  * comments.
  * @coverage dart.engine.parser
  */
@@ -1368,7 +1368,7 @@
   Token get precedingComments => _precedingComment;
 }
 /**
- * Instances of the class `Token` represent a token that was scanned from the input. Each
+ * Instances of the class {@code Token} represent a token that was scanned from the input. Each
  * token knows which token follows it, acting as the head of a linked list of tokens.
  * @coverage dart.engine.parser
  */
@@ -1437,9 +1437,9 @@
   int get offset => _offset;
 
   /**
-   * Return the first comment in the list of comments that precede this token, or `null` if
+   * Return the first comment in the list of comments that precede this token, or {@code null} if
    * there are no comments preceding this token. Additional comments can be reached by following the
-   * token stream using [getNext] until `null` is returned.
+   * token stream using {@link #getNext()} until {@code null} is returned.
    * @return the first comment in the list of comments that precede this token
    */
   Token get precedingComments => null;
@@ -1457,24 +1457,24 @@
   TokenType get type => _type;
 
   /**
-   * Return `true` if this token represents an operator.
-   * @return `true` if this token represents an operator
+   * Return {@code true} if this token represents an operator.
+   * @return {@code true} if this token represents an operator
    */
-  bool get isOperator => _type.isOperator;
+  bool isOperator() => _type.isOperator();
 
   /**
-   * Return `true` if this token is a synthetic token. A synthetic token is a token that was
+   * Return {@code true} if this token is a synthetic token. A synthetic token is a token that was
    * introduced by the parser in order to recover from an error in the code. Synthetic tokens always
-   * have a length of zero (`0`).
-   * @return `true` if this token is a synthetic token
+   * have a length of zero ({@code 0}).
+   * @return {@code true} if this token is a synthetic token
    */
-  bool get isSynthetic => length == 0;
+  bool isSynthetic() => length == 0;
 
   /**
-   * Return `true` if this token represents an operator that can be defined by users.
-   * @return `true` if this token represents an operator that can be defined by users
+   * Return {@code true} if this token represents an operator that can be defined by users.
+   * @return {@code true} if this token represents an operator that can be defined by users
    */
-  bool get isUserDefinableOperator => _type.isUserDefinableOperator;
+  bool isUserDefinableOperator() => _type.isUserDefinableOperator();
 
   /**
    * Set the next token in the token stream to the given token. This has the side-effect of setting
@@ -1525,7 +1525,7 @@
   }
 }
 /**
- * Instances of the class `StringScanner` implement a scanner that reads from a string. The
+ * Instances of the class {@code StringScanner} implement a scanner that reads from a string. The
  * scanning logic is in the superclass.
  * @coverage dart.engine.parser
  */
@@ -1568,7 +1568,7 @@
   /**
    * Record that the source begins on the given line and column at the given offset. The line starts
    * for lines before the given line will not be correct.
-   *
+   * <p>
    * This method must be invoked at most one time and must be invoked before scanning begins. The
    * values provided must be sensible. The results are undefined if these conditions are violated.
    * @param line the one-based index of the line containing the first character of the source
@@ -1604,7 +1604,7 @@
   }
 }
 /**
- * Instances of the class `BeginTokenWithComment` represent a begin token that is preceded by
+ * Instances of the class {@code BeginTokenWithComment} represent a begin token that is preceded by
  * comments.
  * @coverage dart.engine.parser
  */
@@ -1628,7 +1628,7 @@
   Token get precedingComments => _precedingComment;
 }
 /**
- * Instances of the class `KeywordToken` represent a keyword in the language.
+ * Instances of the class {@code KeywordToken} represent a keyword in the language.
  * @coverage dart.engine.parser
  */
 class KeywordToken extends Token {
@@ -1656,7 +1656,7 @@
   Keyword value() => _keyword;
 }
 /**
- * Instances of the class `BeginToken` represent the opening half of a grouping pair of
+ * Instances of the class {@code BeginToken} represent the opening half of a grouping pair of
  * tokens. This is used for curly brackets ('{'), parentheses ('('), and square brackets ('\[').
  * @coverage dart.engine.parser
  */
@@ -1691,7 +1691,7 @@
   }
 }
 /**
- * The enumeration `TokenClass` represents classes (or groups) of tokens with a similar use.
+ * The enumeration {@code TokenClass} represents classes (or groups) of tokens with a similar use.
  * @coverage dart.engine.parser
  */
 class TokenClass implements Comparable<TokenClass> {
@@ -1784,7 +1784,7 @@
   final int ordinal;
 
   /**
-   * The precedence of tokens of this class, or `0` if the such tokens do not represent an
+   * The precedence of tokens of this class, or {@code 0} if the such tokens do not represent an
    * operator.
    */
   int _precedence = 0;
@@ -1802,7 +1802,7 @@
   }
 
   /**
-   * Return the precedence of tokens of this class, or `0` if the such tokens do not represent
+   * Return the precedence of tokens of this class, or {@code 0} if the such tokens do not represent
    * an operator.
    * @return the precedence of tokens of this class
    */
@@ -1812,7 +1812,7 @@
   String toString() => name;
 }
 /**
- * Instances of the class `KeywordTokenWithComment` implement a keyword token that is preceded
+ * Instances of the class {@code KeywordTokenWithComment} implement a keyword token that is preceded
  * by comments.
  * @coverage dart.engine.parser
  */
@@ -1836,7 +1836,7 @@
   Token get precedingComments => _precedingComment;
 }
 /**
- * The enumeration `TokenType` defines the types of tokens that can be returned by the
+ * The enumeration {@code TokenType} defines the types of tokens that can be returned by the
  * scanner.
  * @coverage dart.engine.parser
  */
@@ -1927,7 +1927,7 @@
   TokenClass _tokenClass;
 
   /**
-   * The lexeme that defines this type of token, or `null` if there is more than one possible
+   * The lexeme that defines this type of token, or {@code null} if there is more than one possible
    * lexeme for this type of token.
    */
   String _lexeme;
@@ -1946,95 +1946,95 @@
   }
 
   /**
-   * Return the lexeme that defines this type of token, or `null` if there is more than one
+   * Return the lexeme that defines this type of token, or {@code null} if there is more than one
    * possible lexeme for this type of token.
    * @return the lexeme that defines this type of token
    */
   String get lexeme => _lexeme;
 
   /**
-   * Return the precedence of the token, or `0` if the token does not represent an operator.
+   * Return the precedence of the token, or {@code 0} if the token does not represent an operator.
    * @return the precedence of the token
    */
   int get precedence => _tokenClass.precedence;
 
   /**
-   * Return `true` if this type of token represents an additive operator.
-   * @return `true` if this type of token represents an additive operator
+   * Return {@code true} if this type of token represents an additive operator.
+   * @return {@code true} if this type of token represents an additive operator
    */
-  bool get isAdditiveOperator => identical(_tokenClass, TokenClass.ADDITIVE_OPERATOR);
+  bool isAdditiveOperator() => identical(_tokenClass, TokenClass.ADDITIVE_OPERATOR);
 
   /**
-   * Return `true` if this type of token represents an assignment operator.
-   * @return `true` if this type of token represents an assignment operator
+   * Return {@code true} if this type of token represents an assignment operator.
+   * @return {@code true} if this type of token represents an assignment operator
    */
-  bool get isAssignmentOperator => identical(_tokenClass, TokenClass.ASSIGNMENT_OPERATOR);
+  bool isAssignmentOperator() => identical(_tokenClass, TokenClass.ASSIGNMENT_OPERATOR);
 
   /**
-   * Return `true` if this type of token represents an associative operator. An associative
-   * operator is an operator for which the following equality is true:`(a * b) * c == a * (b * c)`. In other words, if the result of applying the operator to
+   * Return {@code true} if this type of token represents an associative operator. An associative
+   * operator is an operator for which the following equality is true:{@code (a * b) * c == a * (b * c)}. In other words, if the result of applying the operator to
    * multiple operands does not depend on the order in which those applications occur.
-   *
+   * <p>
    * Note: This method considers the logical-and and logical-or operators to be associative, even
    * though the order in which the application of those operators can have an effect because
    * evaluation of the right-hand operand is conditional.
-   * @return `true` if this type of token represents an associative operator
+   * @return {@code true} if this type of token represents an associative operator
    */
-  bool get isAssociativeOperator => identical(this, AMPERSAND) || identical(this, AMPERSAND_AMPERSAND) || identical(this, BAR) || identical(this, BAR_BAR) || identical(this, CARET) || identical(this, PLUS) || identical(this, STAR);
+  bool isAssociativeOperator() => identical(this, AMPERSAND) || identical(this, AMPERSAND_AMPERSAND) || identical(this, BAR) || identical(this, BAR_BAR) || identical(this, CARET) || identical(this, PLUS) || identical(this, STAR);
 
   /**
-   * Return `true` if this type of token represents an equality operator.
-   * @return `true` if this type of token represents an equality operator
+   * Return {@code true} if this type of token represents an equality operator.
+   * @return {@code true} if this type of token represents an equality operator
    */
-  bool get isEqualityOperator => identical(_tokenClass, TokenClass.EQUALITY_OPERATOR);
+  bool isEqualityOperator() => identical(_tokenClass, TokenClass.EQUALITY_OPERATOR);
 
   /**
-   * Return `true` if this type of token represents an increment operator.
-   * @return `true` if this type of token represents an increment operator
+   * Return {@code true} if this type of token represents an increment operator.
+   * @return {@code true} if this type of token represents an increment operator
    */
-  bool get isIncrementOperator => identical(_lexeme, "++") || identical(_lexeme, "--");
+  bool isIncrementOperator() => identical(_lexeme, "++") || identical(_lexeme, "--");
 
   /**
-   * Return `true` if this type of token represents a multiplicative operator.
-   * @return `true` if this type of token represents a multiplicative operator
+   * Return {@code true} if this type of token represents a multiplicative operator.
+   * @return {@code true} if this type of token represents a multiplicative operator
    */
-  bool get isMultiplicativeOperator => identical(_tokenClass, TokenClass.MULTIPLICATIVE_OPERATOR);
+  bool isMultiplicativeOperator() => identical(_tokenClass, TokenClass.MULTIPLICATIVE_OPERATOR);
 
   /**
-   * Return `true` if this token type represents an operator.
-   * @return `true` if this token type represents an operator
+   * Return {@code true} if this token type represents an operator.
+   * @return {@code true} if this token type represents an operator
    */
-  bool get isOperator => _tokenClass != TokenClass.NO_CLASS && this != OPEN_PAREN && this != OPEN_SQUARE_BRACKET && this != PERIOD;
+  bool isOperator() => _tokenClass != TokenClass.NO_CLASS && this != OPEN_PAREN && this != OPEN_SQUARE_BRACKET && this != PERIOD;
 
   /**
-   * Return `true` if this type of token represents a relational operator.
-   * @return `true` if this type of token represents a relational operator
+   * Return {@code true} if this type of token represents a relational operator.
+   * @return {@code true} if this type of token represents a relational operator
    */
-  bool get isRelationalOperator => identical(_tokenClass, TokenClass.RELATIONAL_OPERATOR);
+  bool isRelationalOperator() => identical(_tokenClass, TokenClass.RELATIONAL_OPERATOR);
 
   /**
-   * Return `true` if this type of token represents a shift operator.
-   * @return `true` if this type of token represents a shift operator
+   * Return {@code true} if this type of token represents a shift operator.
+   * @return {@code true} if this type of token represents a shift operator
    */
-  bool get isShiftOperator => identical(_tokenClass, TokenClass.SHIFT_OPERATOR);
+  bool isShiftOperator() => identical(_tokenClass, TokenClass.SHIFT_OPERATOR);
 
   /**
-   * Return `true` if this type of token represents a unary postfix operator.
-   * @return `true` if this type of token represents a unary postfix operator
+   * Return {@code true} if this type of token represents a unary postfix operator.
+   * @return {@code true} if this type of token represents a unary postfix operator
    */
-  bool get isUnaryPostfixOperator => identical(_tokenClass, TokenClass.UNARY_POSTFIX_OPERATOR);
+  bool isUnaryPostfixOperator() => identical(_tokenClass, TokenClass.UNARY_POSTFIX_OPERATOR);
 
   /**
-   * Return `true` if this type of token represents a unary prefix operator.
-   * @return `true` if this type of token represents a unary prefix operator
+   * Return {@code true} if this type of token represents a unary prefix operator.
+   * @return {@code true} if this type of token represents a unary prefix operator
    */
-  bool get isUnaryPrefixOperator => identical(_tokenClass, TokenClass.UNARY_PREFIX_OPERATOR);
+  bool isUnaryPrefixOperator() => identical(_tokenClass, TokenClass.UNARY_PREFIX_OPERATOR);
 
   /**
-   * Return `true` if this token type represents an operator that can be defined by users.
-   * @return `true` if this token type represents an operator that can be defined by users
+   * Return {@code true} if this token type represents an operator that can be defined by users.
+   * @return {@code true} if this token type represents an operator that can be defined by users
    */
-  bool get isUserDefinableOperator => identical(_lexeme, "==") || identical(_lexeme, "~") || identical(_lexeme, "[]") || identical(_lexeme, "[]=") || identical(_lexeme, "*") || identical(_lexeme, "/") || identical(_lexeme, "%") || identical(_lexeme, "~/") || identical(_lexeme, "+") || identical(_lexeme, "-") || identical(_lexeme, "<<") || identical(_lexeme, ">>") || identical(_lexeme, ">=") || identical(_lexeme, ">") || identical(_lexeme, "<=") || identical(_lexeme, "<") || identical(_lexeme, "&") || identical(_lexeme, "^") || identical(_lexeme, "|");
+  bool isUserDefinableOperator() => identical(_lexeme, "==") || identical(_lexeme, "~") || identical(_lexeme, "[]") || identical(_lexeme, "[]=") || identical(_lexeme, "*") || identical(_lexeme, "/") || identical(_lexeme, "%") || identical(_lexeme, "~/") || identical(_lexeme, "+") || identical(_lexeme, "-") || identical(_lexeme, "<<") || identical(_lexeme, ">>") || identical(_lexeme, ">=") || identical(_lexeme, ">") || identical(_lexeme, "<=") || identical(_lexeme, "<") || identical(_lexeme, "&") || identical(_lexeme, "^") || identical(_lexeme, "|");
   int compareTo(TokenType other) => ordinal - other.ordinal;
   int get hashCode => ordinal;
   String toString() => name;
diff --git a/pkg/analyzer_experimental/lib/src/generated/sdk.dart b/pkg/analyzer_experimental/lib/src/generated/sdk.dart
index 4f1cc08..ca85cf4 100644
--- a/pkg/analyzer_experimental/lib/src/generated/sdk.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/sdk.dart
@@ -17,67 +17,67 @@
   String get category;
 
   /**
-   * Return the path to the file defining the library. The path is relative to the `lib`directory within the SDK.
+   * Return the path to the file defining the library. The path is relative to the {@code lib}directory within the SDK.
    * @return the path to the file defining the library
    */
   String get path;
 
   /**
-   * Return the short name of the library. This is the name used after `dart:` in a URI.
+   * Return the short name of the library. This is the name used after {@code dart:} in a URI.
    * @return the short name of the library
    */
   String get shortName;
 
   /**
-   * Return `true` if this library can be compiled to JavaScript by dart2js.
-   * @return `true` if this library can be compiled to JavaScript by dart2js
+   * Return {@code true} if this library can be compiled to JavaScript by dart2js.
+   * @return {@code true} if this library can be compiled to JavaScript by dart2js
    */
-  bool get isDart2JsLibrary;
+  bool isDart2JsLibrary();
 
   /**
-   * Return `true` if the library is documented.
-   * @return `true` if the library is documented
+   * Return {@code true} if the library is documented.
+   * @return {@code true} if the library is documented
    */
-  bool get isDocumented;
+  bool isDocumented();
 
   /**
-   * Return `true` if the library is an implementation library.
-   * @return `true` if the library is an implementation library
+   * Return {@code true} if the library is an implementation library.
+   * @return {@code true} if the library is an implementation library
    */
-  bool get isImplementation;
+  bool isImplementation();
 
   /**
-   * Return `true` if library is internal can be used only by other SDK libraries.
-   * @return `true` if library is internal can be used only by other SDK libraries
+   * Return {@code true} if library is internal can be used only by other SDK libraries.
+   * @return {@code true} if library is internal can be used only by other SDK libraries
    */
-  bool get isInternal;
+  bool isInternal();
 
   /**
-   * Return `true` if library can be used for both client and server.
-   * @return `true` if this library can be used for both client and server.
+   * Return {@code true} if library can be used for both client and server.
+   * @return {@code true} if this library can be used for both client and server.
    */
-  bool get isShared;
+  bool isShared();
 
   /**
-   * Return `true` if this library can be run on the VM.
-   * @return `true` if this library can be run on the VM
+   * Return {@code true} if this library can be run on the VM.
+   * @return {@code true} if this library can be run on the VM
    */
-  bool get isVmLibrary;
+  bool isVmLibrary();
 }
 /**
- * Instances of the class `SdkLibrary` represent the information known about a single library
+ * Instances of the class {@code SdkLibrary} represent the information known about a single library
  * within the SDK.
  * @coverage dart.engine.sdk
  */
 class SdkLibraryImpl implements SdkLibrary {
 
   /**
-   * The short name of the library. This is the name used after `dart:` in a URI.
+   * The short name of the library. This is the name used after {@code dart:} in a URI.
    */
   String _shortName = null;
 
   /**
-   * The path to the file defining the library. The path is relative to the `lib` directory
+   * The path to the file defining the library. The path is relative to the {@code lib} directory
    * within the SDK.
    */
   String _path = null;
@@ -125,21 +125,21 @@
   String get category => _category;
   String get path => _path;
   String get shortName => _shortName;
-  bool get isDart2JsLibrary => (_platforms & DART2JS_PLATFORM) != 0;
-  bool get isDocumented => _documented;
-  bool get isImplementation => _implementation;
-  bool get isInternal => "Internal" == _category;
+  bool isDart2JsLibrary() => (_platforms & DART2JS_PLATFORM) != 0;
+  bool isDocumented() => _documented;
+  bool isImplementation() => _implementation;
+  bool isInternal() => "Internal" == _category;
 
   /**
-   * Return `true` if library can be used for both client and server
+   * Return {@code true} if library can be used for both client and server
    */
-  bool get isShared => _category == "Shared";
+  bool isShared() => _category == "Shared";
 
   /**
-   * Return `true` if this library can be run on the VM.
-   * @return `true` if this library can be run on the VM
+   * Return {@code true} if this library can be run on the VM.
+   * @return {@code true} if this library can be run on the VM
    */
-  bool get isVmLibrary => (_platforms & VM_PLATFORM) != 0;
+  bool isVmLibrary() => (_platforms & VM_PLATFORM) != 0;
 
   /**
    * Set the name of the category containing the library to the given name.
@@ -158,7 +158,7 @@
 
   /**
    * Set whether the library is documented to match the given value.
-   * @param documented `true` if the library is documented
+   * @param documented {@code true} if the library is documented
    */
   void set documented(bool documented2) {
     this._documented = documented2;
@@ -166,14 +166,14 @@
 
   /**
    * Set whether the library is an implementation library to match the given value.
-   * @param implementation `true` if the library is an implementation library
+   * @param implementation {@code true} if the library is an implementation library
    */
   void set implementation(bool implementation2) {
     this._implementation = implementation2;
   }
 
   /**
-   * Set the path to the file defining the library to the given path. The path is relative to the`lib` directory within the SDK.
+   * Set the path to the file defining the library to the given path. The path is relative to the{@code lib} directory within the SDK.
    * @param path the path to the file defining the library
    */
   void set path(String path2) {
@@ -188,7 +188,7 @@
   }
 }
 /**
- * Instances of the class `LibraryMap` map Dart library URI's to the [SdkLibraryImpllibrary].
+ * Instances of the class {@code LibraryMap} map Dart library URI's to the {@link SdkLibraryImpllibrary}.
  * @coverage dart.engine.sdk
  */
 class LibraryMap {
@@ -199,14 +199,14 @@
   Map<String, SdkLibraryImpl> _libraryMap = new Map<String, SdkLibraryImpl>();
 
   /**
-   * Return the library with the given URI, or `null` if the URI does not map to a library.
+   * Return the library with the given URI, or {@code null} if the URI does not map to a library.
    * @param dartUri the URI of the library to be returned
    * @return the library with the given URI
    */
   SdkLibrary getLibrary(String dartUri) => _libraryMap[dartUri];
 
   /**
-   * Return an array containing all the sdk libraries [SdkLibraryImpl] in the mapping
+   * Return an array containing all the sdk libraries {@link SdkLibraryImpl} in the mapping
    * @return the sdk libraries in the mapping
    */
   List<SdkLibrary> get sdkLibraries => new List.from(_libraryMap.values);
@@ -218,7 +218,7 @@
   List<String> get uris => new List.from(_libraryMap.keys.toSet());
 
   /**
-   * Return the library with the given URI, or `null` if the URI does not map to a library.
+   * Return the library with the given URI, or {@code null} if the URI does not map to a library.
    * @param dartUri the URI of the library to be returned
    * @param library the library with the given URI
    */
@@ -233,7 +233,7 @@
   int size() => _libraryMap.length;
 }
 /**
- * Instances of the class `DartSdk` represent a Dart SDK installed in a specified location.
+ * Instances of the class {@code DartSdk} represent a Dart SDK installed in a specified location.
  * @coverage dart.engine.sdk
  */
 abstract class DartSdk {
@@ -264,8 +264,8 @@
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri);
 
   /**
-   * Return the [AnalysisContext] used for all of the sources in this [DartSdk].
-   * @return the [AnalysisContext] used for all of the sources in this [DartSdk]
+   * Return the {@link AnalysisContext} used for all of the sources in this {@link DartSdk}.
+   * @return the {@link AnalysisContext} used for all of the sources in this {@link DartSdk}
    */
   AnalysisContext get context;
 
@@ -276,14 +276,14 @@
   List<SdkLibrary> get sdkLibraries;
 
   /**
-   * Return the library representing the library with the given `dart:` URI, or `null`if the given URI does not denote a library in this SDK.
+   * Return the library representing the library with the given {@code dart:} URI, or {@code null}if the given URI does not denote a library in this SDK.
    * @param dartUri the URI of the library to be returned
    * @return the SDK library object
    */
   SdkLibrary getSdkLibrary(String dartUri);
 
   /**
-   * Return the revision number of this SDK, or `"0"` if the revision number cannot be
+   * Return the revision number of this SDK, or {@code "0"} if the revision number cannot be
    * discovered.
    * @return the revision number of this SDK
    */
@@ -296,7 +296,7 @@
   List<String> get uris;
 
   /**
-   * Return the source representing the library with the given `dart:` URI, or `null` if
+   * Return the source representing the library with the given {@code dart:} URI, or {@code null} if
    * the given URI does not denote a library in this SDK.
    * @param contentCache the content cache used to access the contents of the mapped source
    * @param dartUri the URI of the library to be returned
diff --git a/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart b/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
index 5bcead2..baf26d7 100644
--- a/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
@@ -14,14 +14,14 @@
 import 'sdk.dart';
 import 'engine.dart';
 /**
- * Instances of the class `DirectoryBasedDartSdk` represent a Dart SDK installed in a
+ * Instances of the class {@code DirectoryBasedDartSdk} represent a Dart SDK installed in a
  * specified directory.
  * @coverage dart.engine.sdk
  */
 class DirectoryBasedDartSdk implements DartSdk {
 
   /**
-   * The [AnalysisContext] which is used for all of the sources in this [DartSdk].
+   * The {@link AnalysisContext} which is used for all of the sources in this {@link DartSdk}.
    */
   InternalAnalysisContext _analysisContext;
 
@@ -31,7 +31,7 @@
   JavaFile _sdkDirectory;
 
   /**
-   * The revision number of this SDK, or `"0"` if the revision number cannot be discovered.
+   * The revision number of this SDK, or {@code "0"} if the revision number cannot be discovered.
    */
   String _sdkVersion;
 
@@ -81,7 +81,7 @@
   static String _DARTIUM_EXECUTABLE_NAME_WIN = "Chrome.exe";
 
   /**
-   * The name of the [System] property whose value is the path to the default Dart SDK
+   * The name of the {@link System} property whose value is the path to the default Dart SDK
    * directory.
    */
   static String _DEFAULT_DIRECTORY_PROPERTY_NAME = "com.google.dart.sdk";
@@ -129,7 +129,7 @@
   static String _VM_EXECUTABLE_NAME = "dart";
 
   /**
-   * Return the default Dart SDK, or `null` if the directory containing the default SDK cannot
+   * Return the default Dart SDK, or {@code null} if the directory containing the default SDK cannot
    * be determined (or does not exist).
    * @return the default Dart SDK
    */
@@ -142,10 +142,10 @@
   }
 
   /**
-   * Return the default directory for the Dart SDK, or `null` if the directory cannot be
-   * determined (or does not exist). The default directory is provided by a [System] property
-   * named `com.google.dart.sdk`, or, if the property is not defined, an environment variable
-   * named `DART_SDK`.
+   * Return the default directory for the Dart SDK, or {@code null} if the directory cannot be
+   * determined (or does not exist). The default directory is provided by a {@link System} property
+   * named {@code com.google.dart.sdk}, or, if the property is not defined, an environment variable
+   * named {@code DART_SDK}.
    * @return the default directory for the Dart SDK
    */
   static JavaFile get defaultSdkDirectory {
@@ -184,7 +184,7 @@
   AnalysisContext get context => _analysisContext;
 
   /**
-   * Return the file containing the Dartium executable, or `null` if it does not exist.
+   * Return the file containing the Dartium executable, or {@code null} if it does not exist.
    * @return the file containing the Dartium executable
    */
   JavaFile get dartiumExecutable {
@@ -219,7 +219,7 @@
   JavaFile get docDirectory => new JavaFile.relative(_sdkDirectory, _DOCS_DIRECTORY_NAME);
 
   /**
-   * Return the auxiliary documentation file for the given library, or `null` if no such file
+   * Return the auxiliary documentation file for the given library, or {@code null} if no such file
    * exists.
    * @param libraryName the name of the library associated with the documentation file to be
    * returned
@@ -247,7 +247,7 @@
   SdkLibrary getSdkLibrary(String dartUri) => _libraryMap.getLibrary(dartUri);
 
   /**
-   * Return the revision number of this SDK, or `"0"` if the revision number cannot be
+   * Return the revision number of this SDK, or {@code "0"} if the revision number cannot be
    * discovered.
    * @return the revision number of this SDK
    */
@@ -275,7 +275,7 @@
   List<String> get uris => _libraryMap.uris;
 
   /**
-   * Return the file containing the VM executable, or `null` if it does not exist.
+   * Return the file containing the VM executable, or {@code null} if it does not exist.
    * @return the file containing the VM executable
    */
   JavaFile get vmExecutable {
@@ -291,16 +291,16 @@
   }
 
   /**
-   * Return `true` if this SDK includes documentation.
-   * @return `true` if this installation of the SDK has documentation
+   * Return {@code true} if this SDK includes documentation.
+   * @return {@code true} if this installation of the SDK has documentation
    */
   bool hasDocumentation() => docDirectory.exists();
 
   /**
-   * Return `true` if the Dartium binary is available.
-   * @return `true` if the Dartium binary is available
+   * Return {@code true} if the Dartium binary is available.
+   * @return {@code true} if the Dartium binary is available
    */
-  bool get isDartiumInstalled => dartiumExecutable != null;
+  bool isDartiumInstalled() => dartiumExecutable != null;
   Source mapDartUri(ContentCache contentCache, String dartUri) {
     SdkLibrary library = getSdkLibrary(dartUri);
     if (library == null) {
@@ -366,7 +366,7 @@
   }
 }
 /**
- * Instances of the class `SdkLibrariesReader` read and parse the libraries file
+ * Instances of the class {@code SdkLibrariesReader} read and parse the libraries file
  * (dart-sdk/lib/_internal/libraries.dart) for information about the libraries in an SDK. The
  * library information is represented as a Dart file containing a single top-level variable whose
  * value is a const map. The keys of the map are the names of libraries defined in the SDK and the
@@ -438,7 +438,7 @@
   static String _PLATFORMS = "platforms";
 
   /**
-   * The value of the [PLATFORMS platforms] parameter used to specify that the library can
+   * The value of the {@link #PLATFORMS platforms} parameter used to specify that the library can
    * be used on the VM.
    */
   static String _VM_PLATFORM = "VM_PLATFORM";
diff --git a/pkg/analyzer_experimental/lib/src/generated/source.dart b/pkg/analyzer_experimental/lib/src/generated/source.dart
index d149b4b..da272e9 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source.dart
@@ -5,7 +5,7 @@
 import 'sdk.dart' show DartSdk;
 import 'engine.dart' show AnalysisContext;
 /**
- * Instances of the class `SourceFactory` resolve possibly relative URI's against an existing[Source source].
+ * Instances of the class {@code SourceFactory} resolve possibly relative URI's against an existing{@link Source source}.
  * @coverage dart.engine.source
  */
 class SourceFactory {
@@ -50,7 +50,7 @@
   }
 
   /**
-   * Return a source object representing the given absolute URI, or `null` if the URI is not a
+   * Return a source object representing the given absolute URI, or {@code null} if the URI is not a
    * valid URI or if it is not an absolute URI.
    * @param absoluteUri the absolute URI to be resolved
    * @return a source object representing the absolute URI
@@ -108,9 +108,9 @@
   AnalysisContext get context => _context;
 
   /**
-   * Return the [DartSdk] associated with this [SourceFactory], or `null` if there
+   * Return the {@link DartSdk} associated with this {@link SourceFactory}, or {@code null} if there
    * is no such SDK.
-   * @return the [DartSdk] associated with this [SourceFactory], or `null` if
+   * @return the {@link DartSdk} associated with this {@link SourceFactory}, or {@code null} if
    * there is no such SDK
    */
   DartSdk get dartSdk {
@@ -125,7 +125,7 @@
 
   /**
    * Return a source object representing the URI that results from resolving the given (possibly
-   * relative) contained URI against the URI associated with an existing source object, or`null` if either the contained URI is invalid or if it cannot be resolved against the
+   * relative) contained URI against the URI associated with an existing source object, or{@code null} if either the contained URI is invalid or if it cannot be resolved against the
    * source object's URI.
    * @param containingSource the source containing the given URI
    * @param containedUri the (possibly relative) URI to be resolved against the containing source
@@ -142,7 +142,7 @@
   /**
    * Return an absolute URI that represents the given source.
    * @param source the source to get URI for
-   * @return the absolute URI representing the given source, may be `null`
+   * @return the absolute URI representing the given source, may be {@code null}
    */
   Uri restoreUri(Source source) {
     for (UriResolver resolver in _resolvers) {
@@ -156,7 +156,7 @@
 
   /**
    * Set the contents of the given source to the given contents. This has the effect of overriding
-   * the default contents of the source. If the contents are `null` the override is removed so
+   * the default contents of the source. If the contents are {@code null} the override is removed so
    * that the default contents will be returned.
    * @param source the source whose contents are being overridden
    * @param contents the new contents of the source
@@ -167,8 +167,8 @@
 
   /**
    * Set the analysis context that this source factory is associated with to the given context.
-   *
-   * <b>Note:</b> This method should only be invoked by[AnalysisContextImpl#setSourceFactory] and is only public out of
+   * <p>
+   * <b>Note:</b> This method should only be invoked by{@link AnalysisContextImpl#setSourceFactory(SourceFactory)} and is only public out of
    * necessity.
    * @param context the analysis context that this source factory is associated with
    */
@@ -177,20 +177,20 @@
   }
 
   /**
-   * Return the contents of the given source, or `null` if this factory does not override the
+   * Return the contents of the given source, or {@code null} if this factory does not override the
    * contents of the source.
-   *
-   * <b>Note:</b> This method is not intended to be used except by[FileBasedSource#getContents].
+   * <p>
+   * <b>Note:</b> This method is not intended to be used except by{@link FileBasedSource#getContents(com.google.dart.engine.source.Source.ContentReceiver)}.
    * @param source the source whose content is to be returned
    * @return the contents of the given source
    */
   String getContents(Source source) => _contentCache.getContents(source);
 
   /**
-   * Return the modification stamp of the given source, or `null` if this factory does not
+   * Return the modification stamp of the given source, or {@code null} if this factory does not
    * override the contents of the source.
-   *
-   * <b>Note:</b> This method is not intended to be used except by[FileBasedSource#getModificationStamp].
+   * <p>
+   * <b>Note:</b> This method is not intended to be used except by{@link FileBasedSource#getModificationStamp()}.
    * @param source the source whose modification stamp is to be returned
    * @return the modification stamp of the given source
    */
@@ -198,7 +198,7 @@
 
   /**
    * Return a source object representing the URI that results from resolving the given (possibly
-   * relative) contained URI against the URI associated with an existing source object, or`null` if either the contained URI is invalid or if it cannot be resolved against the
+   * relative) contained URI against the URI associated with an existing source object, or{@code null} if either the contained URI is invalid or if it cannot be resolved against the
    * source object's URI.
    * @param containingSource the source containing the given URI
    * @param containedUri the (possibly relative) URI to be resolved against the containing source
@@ -219,7 +219,7 @@
   }
 }
 /**
- * The abstract class `UriResolver` defines the behavior of objects that are used to resolve
+ * The abstract class {@code UriResolver} defines the behavior of objects that are used to resolve
  * URI's for a source factory. Subclasses of this class are expected to resolve a single scheme of
  * absolute URI.
  * @coverage dart.engine.source
@@ -228,34 +228,34 @@
 
   /**
    * If this resolver should be used for URI's of the given kind, resolve the given absolute URI.
-   * The URI does not need to have the scheme handled by this resolver if the kind matches. Return a[Source source] representing the file to which it was resolved, or `null` if it
+   * The URI does not need to have the scheme handled by this resolver if the kind matches. Return a{@link Source source} representing the file to which it was resolved, or {@code null} if it
    * could not be resolved.
    * @param contentCache the content cache used to access the contents of the returned source
    * @param kind the kind of URI that was originally resolved in order to produce an encoding with
    * the given URI
    * @param uri the URI to be resolved
-   * @return a [Source source] representing the file to which given URI was resolved
+   * @return a {@link Source source} representing the file to which given URI was resolved
    */
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri);
 
   /**
-   * Resolve the given absolute URI. Return a [Source source] representing the file to which
-   * it was resolved, or `null` if it could not be resolved.
+   * Resolve the given absolute URI. Return a {@link Source source} representing the file to which
+   * it was resolved, or {@code null} if it could not be resolved.
    * @param contentCache the content cache used to access the contents of the returned source
    * @param uri the URI to be resolved
-   * @return a [Source source] representing the file to which given URI was resolved
+   * @return a {@link Source source} representing the file to which given URI was resolved
    */
   Source resolveAbsolute(ContentCache contentCache, Uri uri);
 
   /**
    * Return an absolute URI that represents the given source.
    * @param source the source to get URI for
-   * @return the absolute URI representing the given source, may be `null`
+   * @return the absolute URI representing the given source, may be {@code null}
    */
   Uri restoreAbsolute(Source source) => null;
 }
 /**
- * The interface `Source` defines the behavior of objects representing source code that can be
+ * The interface {@code Source} defines the behavior of objects representing source code that can be
  * compiled.
  * @coverage dart.engine.source
  */
@@ -267,18 +267,18 @@
   static final List<Source> EMPTY_ARRAY = new List<Source>(0);
 
   /**
-   * Return `true` if the given object is a source that represents the same source code as
+   * Return {@code true} if the given object is a source that represents the same source code as
    * this source.
    * @param object the object to be compared with this object
-   * @return `true` if the given object is a source that represents the same source code as
+   * @return {@code true} if the given object is a source that represents the same source code as
    * this source
    * @see Object#equals(Object)
    */
   bool operator ==(Object object);
 
   /**
-   * Return `true` if this source exists.
-   * @return `true` if this source exists
+   * Return {@code true} if this source exists.
+   * @return {@code true} if this source exists
    */
   bool exists();
 
@@ -342,27 +342,27 @@
   int get hashCode;
 
   /**
-   * Return `true` if this source is in one of the system libraries.
-   * @return `true` if this is in a system library
+   * Return {@code true} if this source is in one of the system libraries.
+   * @return {@code true} if this is in a system library
    */
-  bool get isInSystemLibrary;
+  bool isInSystemLibrary();
 
   /**
-   * Resolve the relative URI against the URI associated with this source object. Return a[Source source] representing the URI to which it was resolved, or `null` if it
+   * Resolve the relative URI against the URI associated with this source object. Return a{@link Source source} representing the URI to which it was resolved, or {@code null} if it
    * could not be resolved.
-   *
+   * <p>
    * Note: This method is not intended for public use, it is only visible out of necessity. It is
-   * only intended to be invoked by a [SourceFactory source factory]. Source factories will
+   * only intended to be invoked by a {@link SourceFactory source factory}. Source factories will
    * only invoke this method if the URI is relative, so implementations of this method are not
    * required to, and generally do not, verify the argument. The result of invoking this method with
    * an absolute URI is intentionally left unspecified.
    * @param relativeUri the relative URI to be resolved against the containing source
-   * @return a [Source source] representing the URI to which given URI was resolved
+   * @return a {@link Source source} representing the URI to which given URI was resolved
    */
   Source resolveRelative(Uri relativeUri);
 }
 /**
- * The interface `ContentReceiver` defines the behavior of objects that can receive the
+ * The interface {@code ContentReceiver} defines the behavior of objects that can receive the
  * content of a source.
  */
 abstract class Source_ContentReceiver {
@@ -382,7 +382,7 @@
   void accept2(String contents, int modificationTime);
 }
 /**
- * The enumeration `SourceKind` defines the different kinds of sources that are known to the
+ * The enumeration {@code SourceKind} defines the different kinds of sources that are known to the
  * analysis engine.
  * @coverage dart.engine.source
  */
@@ -424,7 +424,7 @@
   String toString() => name;
 }
 /**
- * The enumeration `UriKind` defines the different kinds of URI's that are known to the
+ * The enumeration {@code UriKind} defines the different kinds of URI's that are known to the
  * analysis engine. These are used to keep track of the kind of URI associated with a given source.
  * @coverage dart.engine.source
  */
@@ -466,7 +466,7 @@
   }
 
   /**
-   * Return the URI kind represented by the given encoding, or `null` if there is no kind with
+   * Return the URI kind represented by the given encoding, or {@code null} if there is no kind with
    * the given encoding.
    * @param encoding the single character encoding used to identify the URI kind to be returned
    * @return the URI kind represented by the given encoding
@@ -495,7 +495,7 @@
   String toString() => name;
 }
 /**
- * A source range defines an [Element]'s source coordinates relative to its [Source].
+ * A source range defines an {@link Element}'s source coordinates relative to its {@link Source}.
  * @coverage dart.engine.utilities
  */
 class SourceRange {
@@ -523,27 +523,27 @@
   }
 
   /**
-   * @return `true` if <code>x</code> is in \[offset, offset + length) interval.
+   * @return {@code true} if <code>x</code> is in \[offset, offset + length) interval.
    */
   bool contains(int x) => _offset <= x && x < _offset + _length;
 
   /**
-   * @return `true` if <code>x</code> is in (offset, offset + length) interval.
+   * @return {@code true} if <code>x</code> is in (offset, offset + length) interval.
    */
   bool containsExclusive(int x) => _offset < x && x < _offset + _length;
 
   /**
-   * @return `true` if <code>otherRange</code> covers this [SourceRange].
+   * @return {@code true} if <code>otherRange</code> covers this {@link SourceRange}.
    */
   bool coveredBy(SourceRange otherRange) => otherRange.covers(this);
 
   /**
-   * @return `true` if this [SourceRange] covers <code>otherRange</code>.
+   * @return {@code true} if this {@link SourceRange} covers <code>otherRange</code>.
    */
   bool covers(SourceRange otherRange) => offset <= otherRange.offset && otherRange.end <= end;
 
   /**
-   * @return `true` if this [SourceRange] ends in <code>otherRange</code>.
+   * @return {@code true} if this {@link SourceRange} ends in <code>otherRange</code>.
    */
   bool endsIn(SourceRange otherRange) {
     int thisEnd = end;
@@ -564,7 +564,7 @@
   int get end => _offset + _length;
 
   /**
-   * @return the expanded instance of [SourceRange], which has the same center.
+   * @return the expanded instance of {@link SourceRange}, which has the same center.
    */
   SourceRange getExpanded(int delta) => new SourceRange(_offset - delta, delta + _length + delta);
 
@@ -577,7 +577,7 @@
   int get length => _length;
 
   /**
-   * @return the instance of [SourceRange] with end moved on "delta".
+   * @return the instance of {@link SourceRange} with end moved on "delta".
    */
   SourceRange getMoveEnd(int delta) => new SourceRange(_offset, _length + delta);
 
@@ -590,13 +590,13 @@
   int get offset => _offset;
 
   /**
-   * @return the expanded translated of [SourceRange], with moved start and the same length.
+   * @return the expanded translated of {@link SourceRange}, with moved start and the same length.
    */
   SourceRange getTranslated(int delta) => new SourceRange(_offset + delta, _length);
   int get hashCode => 31 * _offset + _length;
 
   /**
-   * @return `true` if this [SourceRange] intersects with given.
+   * @return {@code true} if this {@link SourceRange} intersects with given.
    */
   bool intersects(SourceRange other) {
     if (other == null) {
@@ -612,7 +612,7 @@
   }
 
   /**
-   * @return `true` if this [SourceRange] starts in <code>otherRange</code>.
+   * @return {@code true} if this {@link SourceRange} starts in <code>otherRange</code>.
    */
   bool startsIn(SourceRange otherRange) => otherRange.contains(_offset);
   String toString() {
@@ -626,8 +626,8 @@
   }
 }
 /**
- * The interface `SourceContainer` is used by clients to define a collection of sources
- *
+ * The interface {@code SourceContainer} is used by clients to define a collection of sources
+ * <p>
  * Source containers are not used within analysis engine, but can be used by clients to group
  * sources for the purposes of accessing composite dependency information. For example, the Eclipse
  * client uses source containers to represent Eclipse projects, which allows it to easily compute
@@ -639,12 +639,12 @@
   /**
    * Determine if the specified source is part of the receiver's collection of sources.
    * @param source the source in question
-   * @return `true` if the receiver contains the source, else `false`
+   * @return {@code true} if the receiver contains the source, else {@code false}
    */
   bool contains(Source source);
 }
 /**
- * Instances of the class `DartUriResolver` resolve `dart` URI's.
+ * Instances of the class {@code DartUriResolver} resolve {@code dart} URI's.
  * @coverage dart.engine.source
  */
 class DartUriResolver extends UriResolver {
@@ -655,14 +655,14 @@
   DartSdk _sdk;
 
   /**
-   * The name of the `dart` scheme.
+   * The name of the {@code dart} scheme.
    */
   static String _DART_SCHEME = "dart";
 
   /**
-   * Return `true` if the given URI is a `dart:` URI.
+   * Return {@code true} if the given URI is a {@code dart:} URI.
    * @param uri the URI being tested
-   * @return `true` if the given URI is a `dart:` URI
+   * @return {@code true} if the given URI is a {@code dart:} URI
    */
   static bool isDartUri(Uri uri) => _DART_SCHEME == uri.scheme;
 
@@ -682,8 +682,8 @@
   }
 
   /**
-   * Return the [DartSdk] against which URIs are to be resolved.
-   * @return the [DartSdk] against which URIs are to be resolved.
+   * Return the {@link DartSdk} against which URIs are to be resolved.
+   * @return the {@link DartSdk} against which URIs are to be resolved.
    */
   DartSdk get dartSdk => _sdk;
   Source resolveAbsolute(ContentCache contentCache, Uri uri) {
@@ -694,7 +694,7 @@
   }
 }
 /**
- * Instances of the class `LineInfo` encapsulate information about line and column information
+ * Instances of the class {@code LineInfo} encapsulate information about line and column information
  * within a source file.
  * @coverage dart.engine.utilities
  */
@@ -735,7 +735,7 @@
   }
 }
 /**
- * Instances of the class `Location` represent the location of a character as a line and
+ * Instances of the class {@code Location} represent the location of a character as a line and
  * column pair.
  */
 class LineInfo_Location {
@@ -774,7 +774,7 @@
   int get lineNumber => _lineNumber;
 }
 /**
- * Instances of class `ContentCache` hold content used to override the default content of a[Source].
+ * Instances of class {@code ContentCache} hold content used to override the default content of a{@link Source}.
  * @coverage dart.engine.source
  */
 class ContentCache {
@@ -792,20 +792,20 @@
   Map<Source, int> _stampMap = new Map<Source, int>();
 
   /**
-   * Return the contents of the given source, or `null` if this cache does not override the
+   * Return the contents of the given source, or {@code null} if this cache does not override the
    * contents of the source.
-   *
-   * <b>Note:</b> This method is not intended to be used except by[SourceFactory#getContents].
+   * <p>
+   * <b>Note:</b> This method is not intended to be used except by{@link SourceFactory#getContents(com.google.dart.engine.source.Source.ContentReceiver)}.
    * @param source the source whose content is to be returned
    * @return the contents of the given source
    */
   String getContents(Source source) => _contentMap[source];
 
   /**
-   * Return the modification stamp of the given source, or `null` if this cache does not
+   * Return the modification stamp of the given source, or {@code null} if this cache does not
    * override the contents of the source.
-   *
-   * <b>Note:</b> This method is not intended to be used except by[SourceFactory#getModificationStamp].
+   * <p>
+   * <b>Note:</b> This method is not intended to be used except by{@link SourceFactory#getModificationStamp(com.google.dart.engine.source.Source)}.
    * @param source the source whose modification stamp is to be returned
    * @return the modification stamp of the given source
    */
@@ -813,7 +813,7 @@
 
   /**
    * Set the contents of the given source to the given contents. This has the effect of overriding
-   * the default contents of the source. If the contents are `null` the override is removed so
+   * the default contents of the source. If the contents are {@code null} the override is removed so
    * that the default contents will be returned.
    * @param source the source whose contents are being overridden
    * @param contents the new contents of the source
diff --git a/pkg/analyzer_experimental/lib/src/generated/source_io.dart b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
index 513f77f..98d8fc0 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
@@ -9,7 +9,7 @@
 import 'engine.dart' show AnalysisContext, AnalysisEngine;
 export 'source.dart';
 /**
- * Instances of the class `FileBasedSource` implement a source that represents a file.
+ * Instances of the class {@code FileBasedSource} implement a source that represents a file.
  * @coverage dart.engine.source
  */
 class FileBasedSource implements Source {
@@ -52,7 +52,7 @@
    * Initialize a newly created source object.
    * @param contentCache the content cache used to access the contents of this source
    * @param file the file represented by this source
-   * @param flags `true` if this source is in one of the system libraries
+   * @param flags {@code true} if this source is in one of the system libraries
    */
   FileBasedSource.con2(ContentCache contentCache2, JavaFile file2, UriKind uriKind2) {
     _jtd_constructor_339_impl(contentCache2, file2, uriKind2);
@@ -87,7 +87,7 @@
   String get shortName => _file.getName();
   UriKind get uriKind => _uriKind;
   int get hashCode => _file.hashCode;
-  bool get isInSystemLibrary => identical(_uriKind, UriKind.DART_URI);
+  bool isInSystemLibrary() => identical(_uriKind, UriKind.DART_URI);
   Source resolveRelative(Uri containedUri) {
     try {
       Uri resolvedUri = file.toURI().resolveUri(containedUri);
@@ -105,15 +105,15 @@
 
   /**
    * Return the file represented by this source. This is an internal method that is only intended to
-   * be used by [UriResolver].
+   * be used by {@link UriResolver}.
    * @return the file represented by this source
    */
   JavaFile get file => _file;
 }
 /**
- * Instances of the class `PackageUriResolver` resolve `package` URI's in the context of
+ * Instances of the class {@code PackageUriResolver} resolve {@code package} URI's in the context of
  * an application.
- *
+ * <p>
  * For the purposes of sharing analysis, the path to each package under the "packages" directory
  * should be canonicalized, but to preserve relative links within a package, the remainder of the
  * path from the package directory to the leaf should not.
@@ -122,12 +122,12 @@
 class PackageUriResolver extends UriResolver {
 
   /**
-   * The package directories that `package` URI's are assumed to be relative to.
+   * The package directories that {@code package} URI's are assumed to be relative to.
    */
   List<JavaFile> _packagesDirectories;
 
   /**
-   * The name of the `package` scheme.
+   * The name of the {@code package} scheme.
    */
   static String PACKAGE_SCHEME = "package";
 
@@ -137,16 +137,16 @@
   static bool _CanLogRequiredKeyIoException = true;
 
   /**
-   * Return `true` if the given URI is a `package` URI.
+   * Return {@code true} if the given URI is a {@code package} URI.
    * @param uri the URI being tested
-   * @return `true` if the given URI is a `package` URI
+   * @return {@code true} if the given URI is a {@code package} URI
    */
   static bool isPackageUri(Uri uri) => PACKAGE_SCHEME == uri.scheme;
 
   /**
-   * Initialize a newly created resolver to resolve `package` URI's relative to the given
+   * Initialize a newly created resolver to resolve {@code package} URI's relative to the given
    * package directories.
-   * @param packagesDirectories the package directories that `package` URI's are assumed to be
+   * @param packagesDirectories the package directories that {@code package} URI's are assumed to be
    * relative to
    */
   PackageUriResolver(List<JavaFile> packagesDirectories) {
@@ -216,11 +216,11 @@
 
   /**
    * Answer the canonical file for the specified package.
-   * @param packagesDirectory the "packages" directory (not `null`)
-   * @param pkgName the package name (not `null`, not empty)
-   * @param relPath the path relative to the package directory (not `null`, no leading slash,
+   * @param packagesDirectory the "packages" directory (not {@code null})
+   * @param pkgName the package name (not {@code null}, not empty)
+   * @param relPath the path relative to the package directory (not {@code null}, no leading slash,
    * but may be empty string)
-   * @return the file (not `null`)
+   * @return the file (not {@code null})
    */
   JavaFile getCanonicalFile(JavaFile packagesDirectory, String pkgName, String relPath) {
     JavaFile pkgDir = new JavaFile.relative(packagesDirectory, pkgName);
@@ -238,7 +238,7 @@
   }
 }
 /**
- * Instances of the class [DirectoryBasedSourceContainer] represent a source container that
+ * Instances of the class {@link DirectoryBasedSourceContainer} represent a source container that
  * contains all sources within a given directory.
  * @coverage dart.engine.source
  */
@@ -258,14 +258,14 @@
   }
 
   /**
-   * The container's path (not `null`).
+   * The container's path (not {@code null}).
    */
   String _path;
 
   /**
-   * Construct a container representing the specified directory and containing any sources whose[Source#getFullName] starts with the directory's path. This is a convenience method,
-   * fully equivalent to [DirectoryBasedSourceContainer#DirectoryBasedSourceContainer].
-   * @param directory the directory (not `null`)
+   * Construct a container representing the specified directory and containing any sources whose{@link Source#getFullName()} starts with the directory's path. This is a convenience method,
+   * fully equivalent to {@link DirectoryBasedSourceContainer#DirectoryBasedSourceContainer(String)}.
+   * @param directory the directory (not {@code null})
    */
   DirectoryBasedSourceContainer.con1(JavaFile directory) {
     _jtd_constructor_336_impl(directory);
@@ -275,8 +275,8 @@
   }
 
   /**
-   * Construct a container representing the specified path and containing any sources whose[Source#getFullName] starts with the specified path.
-   * @param path the path (not `null` and not empty)
+   * Construct a container representing the specified path and containing any sources whose{@link Source#getFullName()} starts with the specified path.
+   * @param path the path (not {@code null} and not empty)
    */
   DirectoryBasedSourceContainer.con2(String path2) {
     _jtd_constructor_337_impl(path2);
@@ -289,27 +289,27 @@
 
   /**
    * Answer the receiver's path, used to determine if a source is contained in the receiver.
-   * @return the path (not `null`, not empty)
+   * @return the path (not {@code null}, not empty)
    */
   String get path => _path;
   int get hashCode => _path.hashCode;
   String toString() => "SourceContainer[${_path}]";
 }
 /**
- * Instances of the class `FileUriResolver` resolve `file` URI's.
+ * Instances of the class {@code FileUriResolver} resolve {@code file} URI's.
  * @coverage dart.engine.source
  */
 class FileUriResolver extends UriResolver {
 
   /**
-   * The name of the `file` scheme.
+   * The name of the {@code file} scheme.
    */
   static String FILE_SCHEME = "file";
 
   /**
-   * Return `true` if the given URI is a `file` URI.
+   * Return {@code true} if the given URI is a {@code file} URI.
    * @param uri the URI being tested
-   * @return `true` if the given URI is a `file` URI
+   * @return {@code true} if the given URI is a {@code file} URI
    */
   static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri) {
diff --git a/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart b/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
index 0a331cb..80804cd 100644
--- a/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
@@ -2,7 +2,7 @@
 // significant change. Please see the README file for more information.
 library engine.utilities.dart;
 /**
- * The enumeration `ParameterKind` defines the different kinds of parameters. There are two
+ * The enumeration {@code ParameterKind} defines the different kinds of parameters. There are two
  * basic kinds of parameters: required and optional. Optional parameters are further divided into
  * two kinds: positional optional and named optional.
  * @coverage dart.engine.utilities
@@ -26,17 +26,17 @@
 
   /**
    * Initialize a newly created kind with the given state.
-   * @param isOptional `true` if this is an optional parameter
+   * @param isOptional {@code true} if this is an optional parameter
    */
   ParameterKind(this.name, this.ordinal, bool isOptional) {
     this._isOptional2 = isOptional;
   }
 
   /**
-   * Return `true` if this is an optional parameter.
-   * @return `true` if this is an optional parameter
+   * Return {@code true} if this is an optional parameter.
+   * @return {@code true} if this is an optional parameter
    */
-  bool get isOptional => _isOptional2;
+  bool isOptional() => _isOptional2;
   int compareTo(ParameterKind other) => ordinal - other.ordinal;
   int get hashCode => ordinal;
   String toString() => name;
diff --git a/pkg/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart
new file mode 100644
index 0000000..df37f7b
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart
@@ -0,0 +1,157 @@
+// Copyright (c) 2013, 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.
+
+/// A library for code coverage support for Dart.
+library runtime.coverage_impl;
+
+import "dart:io";
+
+import "package:logging/logging.dart" as log;
+import "package:pathos/path.dart" as po;
+
+import 'package:analyzer_experimental/src/generated/source.dart' show Source;
+import 'package:analyzer_experimental/src/generated/scanner.dart' show StringScanner;
+import 'package:analyzer_experimental/src/generated/parser.dart' show Parser;
+import 'package:analyzer_experimental/src/generated/ast.dart';
+import 'package:analyzer_experimental/src/generated/engine.dart' show RecordingErrorListener;
+
+
+log.Logger logger = log.Logger.root;
+
+/// Abstract server that listens requests and serves files, may be rewriting them.
+abstract class RewriteServer {
+  String _basePath;
+  RewriteServer(this._basePath);
+  void start() {
+    HttpServer.bind("127.0.0.1", 3445).then((HttpServer server) {
+      logger.info('RewriteServer is listening at: ${server.port}.');
+      server.listen((HttpRequest request) {
+        var response = request.response;
+        // Prepare path.
+        var path = _basePath + '/' + request.uri.path;
+        path = po.normalize(path);
+        logger.info('[$path] Requested.');
+        // May be serve using just path.
+        {
+          String content = rewritePathContent(path);
+          if (content != null) {
+            logger.info('[$path] Request served by path.');
+            response.write(content);
+            response.close();
+            return;
+          }
+        }
+        // Serve from file.
+        logger.info('[$path] Serving file.');
+        var file = new File(path);
+        file.exists().then((bool found) {
+          if (found) {
+            logger.finest('[$path] Found file.');
+            file.readAsString().then((String content) {
+              logger.finest('[$path] Got file content.');
+              var sw = new Stopwatch();
+              sw.start();
+              try {
+                content = rewriteFileContent(path, content);
+              } finally {
+                sw.stop();
+                logger.fine('[$path] Rewritten in ${sw.elapsedMilliseconds} ms.');
+              }
+              response.write(content);
+              response.close();
+            });
+          } else {
+            logger.severe('[$path] File not found.');
+            response.statusCode = HttpStatus.NOT_FOUND;
+            response.close();
+          }
+        });
+      });
+    });
+  }
+
+  /// Subclasses implement this method to rewrite the provided [code] of the file with [path].
+  /// Returns some content or `null` if file content should be requested.
+  String rewritePathContent(String path);
+
+  /// Subclasses implement this method to rewrite the provided [code] of the file with [path].
+  String rewriteFileContent(String path, String code);
+}
+
+/// Server that rewrites Dart code so that it reports execution of statements and other nodes.
+class CoverageServer extends RewriteServer {
+  CoverageServer(String basePath) : super(basePath);
+
+  String rewritePathContent(String path) {
+    if (path.endsWith('__coverage_impl.dart')) {
+      String implPath = po.joinAll([
+          po.dirname(new Options().script),
+          '..', 'lib', 'src', 'services', 'runtime', 'coverage_lib.dart']);
+      return new File(implPath).readAsStringSync();
+    }
+    return null;
+  }
+
+  String rewriteFileContent(String path, String code) {
+    if (po.extension(path).toLowerCase() != '.dart') return code;
+    if (path.contains('packages')) return code;
+    var unit = _parseCode(code);
+    var injector = new StringInjector(code);
+    // Inject coverage library import.
+    var directives = unit.directives;
+    if (directives.isNotEmpty && directives[0] is LibraryDirective) {
+      injector.inject(directives[0].end, 'import "__coverage_impl.dart" as __cc;');
+    } else {
+      throw new Exception('Only single library coverage is implemented.');
+    }
+    // Insert touch() invocations.
+    unit.accept(new InsertTouchInvocationsVisitor(injector));
+    // Done.
+    code = injector.code;
+    logger.finest('[$path] Rewritten content\n$code');
+    return code;
+  }
+
+  CompilationUnit _parseCode(String code) {
+    var source = null;
+    var errorListener = new RecordingErrorListener();
+    var parser = new Parser(source, errorListener);
+    var scanner = new StringScanner(source, code, errorListener);
+    var token = scanner.tokenize();
+    return parser.parseCompilationUnit(token);
+  }
+}
+
+/// The visitor that inserts `touch` method invocations.
+class InsertTouchInvocationsVisitor extends GeneralizingASTVisitor {
+  StringInjector injector;
+  InsertTouchInvocationsVisitor(this.injector);
+  visitStatement(Statement node) {
+    super.visitStatement(node);
+    var offset = node.end;
+    if (node is Block) {
+      offset--;
+    }
+    if (node is Block && node.parent is BlockFunctionBody) return null;
+    injector.inject(offset, '__cc.touch(${node.offset});');
+    return null;
+  }
+}
+
+/// Helper for injecting fragments into some existing [String].
+class StringInjector {
+  String code;
+  int _lastOffset = -1;
+  int _delta = 0;
+  StringInjector(this.code);
+  void inject(int offset, String fragment) {
+    if (offset < _lastOffset) {
+      throw new ArgumentError('Only forward inserts are supported, was $_lastOffset given $offset');
+    }
+    _lastOffset = offset;
+    offset += _delta;
+    code = code.substring(0, offset) + fragment + code.substring(offset);
+    _delta += fragment.length;
+  }
+}
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.dart b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.dart
new file mode 100644
index 0000000..945b38f
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2013, 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 library is injected into the applications under coverage.
+library coverage_lib;
+
+/// Notifies that the object with the given [id] - statement, token, etc was executed.
+touch(int id) {
+  print('touch: $id');
+}
diff --git a/pkg/analyzer_experimental/test/generated/ast_test.dart b/pkg/analyzer_experimental/test/generated/ast_test.dart
index bd06fba..ae71ad1b 100644
--- a/pkg/analyzer_experimental/test/generated/ast_test.dart
+++ b/pkg/analyzer_experimental/test/generated/ast_test.dart
@@ -212,11 +212,11 @@
   }
 }
 /**
- * The class `ASTFactory` defines utility methods that can be used to create AST nodes. The
+ * The class {@code ASTFactory} defines utility methods that can be used to create AST nodes. The
  * nodes that are created are complete in the sense that all of the tokens that would have been
  * associated with the nodes by a parser are also created, but the token stream is not constructed.
  * None of the nodes are resolved.
- *
+ * <p>
  * The general pattern is for the name of the factory method to be the same as the name of the class
  * of AST node being created. There are two notable exceptions. The first is for methods creating
  * nodes that are part of a cascade expression. These methods are all prefixed with 'cascaded'. The
@@ -402,7 +402,7 @@
   /**
    * Create a type name whose name has been resolved to the given element and whose type has been
    * resolved to the type of the given element.
-   *
+   * <p>
    * <b>Note:</b> This method does not correctly handle class elements that have type parameters.
    * @param element the element defining the type represented by the type name
    * @return the type name that was created
@@ -1950,7 +1950,7 @@
   }
 
   /**
-   * Assert that a `ToSourceVisitor` will produce the expected source when visiting the given
+   * Assert that a {@code ToSourceVisitor} will produce the expected source when visiting the given
    * node.
    * @param expectedSource the source string that the visitor is expected to produce
    * @param node the AST node being visited to produce the actual source
diff --git a/pkg/analyzer_experimental/test/generated/element_test.dart b/pkg/analyzer_experimental/test/generated/element_test.dart
index 4625b78..a89b723 100644
--- a/pkg/analyzer_experimental/test/generated/element_test.dart
+++ b/pkg/analyzer_experimental/test/generated/element_test.dart
@@ -347,7 +347,6 @@
     String getterName = "g";
     PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, typeE);
     classA.accessors = <PropertyAccessorElement> [getterG];
-    ((getterG.type as FunctionTypeImpl)).typeArguments = classA.type.typeArguments;
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
     typeAI.typeArguments = <Type2> [typeI];
@@ -589,7 +588,6 @@
     String methodName = "m";
     MethodElementImpl methodM = ElementFactory.methodElement(methodName, typeE, [typeE]);
     classA.methods = <MethodElement> [methodM];
-    ((methodM.type as FunctionTypeImpl)).typeArguments = classA.type.typeArguments;
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
     typeAI.typeArguments = <Type2> [typeI];
@@ -652,7 +650,6 @@
     String setterName = "s";
     PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, typeE);
     classA.accessors = <PropertyAccessorElement> [setterS];
-    ((setterS.type as FunctionTypeImpl)).typeArguments = classA.type.typeArguments;
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
     typeAI.typeArguments = <Type2> [typeI];
@@ -1026,7 +1023,6 @@
     String methodName = "m";
     MethodElementImpl methodM = ElementFactory.methodElement(methodName, typeE, [typeE]);
     classA.methods = <MethodElement> [methodM];
-    ((methodM.type as FunctionTypeImpl)).typeArguments = classA.type.typeArguments;
     ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
     InterfaceType typeB = classB.type;
     InterfaceTypeImpl typeAF = new InterfaceTypeImpl.con1(classA);
@@ -1559,7 +1555,7 @@
   }
 }
 /**
- * The class `ElementFactory` defines utility methods used to create elements for testing
+ * The class {@code ElementFactory} defines utility methods used to create elements for testing
  * purposes. The elements that are created are complete in the sense that as much of the element
  * model as can be created, given the provided information, has been created.
  */
@@ -1590,11 +1586,12 @@
     return element;
   }
   static ClassElementImpl classElement2(String typeName, List<String> parameterNames) => classElement(typeName, object.type, parameterNames);
-  static ConstructorElementImpl constructorElement(ClassElement definingClass, String name) {
-    Type2 type = definingClass.type;
+  static ConstructorElementImpl constructorElement(ClassElement clazz, String name) {
+    Type2 type = clazz.type;
     ConstructorElementImpl constructor = new ConstructorElementImpl(name == null ? null : ASTFactory.identifier3(name));
-    constructor.returnType = type;
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
+    constructorType.normalParameterTypes = <Type2> [type];
+    constructorType.returnType = type;
     constructor.type = constructorType;
     return constructor;
   }
@@ -1615,9 +1612,9 @@
     getter.static = isStatic;
     getter.synthetic = true;
     getter.variable = field;
-    getter.returnType = type2;
     field.getter = getter;
     FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
+    getterType.returnType = type2;
     getter.type = getterType;
     if (!isConst && !isFinal) {
       PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con2(field);
@@ -1625,10 +1622,10 @@
       setter.static = isStatic;
       setter.synthetic = true;
       setter.variable = field;
-      setter.returnType = VoidTypeImpl.instance;
       field.setter = setter;
       FunctionTypeImpl setterType = new FunctionTypeImpl.con1(getter);
       setterType.normalParameterTypes = <Type2> [type2];
+      setterType.returnType = VoidTypeImpl.instance;
       setter.type = setterType;
     }
     return field;
@@ -1640,10 +1637,8 @@
     FunctionElementImpl functionElement = new FunctionElementImpl.con1(ASTFactory.identifier3(functionName));
     FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
     functionElement.type = functionType;
-    if (returnElement == null) {
-      functionElement.returnType = VoidTypeImpl.instance;
-    } else {
-      functionElement.returnType = returnElement.type;
+    if (returnElement != null) {
+      functionType.returnType = returnElement.type;
     }
     int normalCount = normalParameters == null ? 0 : normalParameters.length;
     if (normalCount > 0) {
@@ -1681,10 +1676,8 @@
     FunctionElementImpl functionElement = new FunctionElementImpl.con1(ASTFactory.identifier3(functionName));
     FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
     functionElement.type = functionType;
-    if (returnElement == null) {
-      functionElement.returnType = VoidTypeImpl.instance;
-    } else {
-      functionElement.returnType = returnElement.type;
+    if (returnElement != null) {
+      functionType.returnType = returnElement.type;
     }
     int count = normalParameters == null ? 0 : normalParameters.length;
     if (count > 0) {
@@ -1723,9 +1716,9 @@
     getter.getter = true;
     getter.static = isStatic;
     getter.variable = field;
-    getter.returnType = type2;
     field.getter = getter;
     FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
+    getterType.returnType = type2;
     getter.type = getterType;
     return getter;
   }
@@ -1758,9 +1751,9 @@
       parameters[i] = parameter;
     }
     method.parameters = parameters;
-    method.returnType = returnType2;
     FunctionTypeImpl methodType = new FunctionTypeImpl.con1(method);
     methodType.normalParameterTypes = argumentTypes;
+    methodType.returnType = returnType2;
     method.type = methodType;
     return method;
   }
@@ -1789,19 +1782,19 @@
     getter.getter = true;
     getter.static = isStatic;
     getter.variable = field;
-    getter.returnType = type2;
     field.getter = getter;
     FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
+    getterType.returnType = type2;
     getter.type = getterType;
     PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con2(field);
     setter.setter = true;
     setter.static = isStatic;
     setter.synthetic = true;
     setter.variable = field;
-    setter.returnType = VoidTypeImpl.instance;
     field.setter = setter;
-    FunctionTypeImpl setterType = new FunctionTypeImpl.con1(setter);
+    FunctionTypeImpl setterType = new FunctionTypeImpl.con1(getter);
     setterType.normalParameterTypes = <Type2> [type2];
+    setterType.returnType = VoidTypeImpl.instance;
     setter.type = setterType;
     return setter;
   }
@@ -1815,9 +1808,9 @@
     getter.static = true;
     getter.synthetic = true;
     getter.variable = variable;
-    getter.returnType = type2;
     variable.getter = getter;
     FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
+    getterType.returnType = type2;
     getter.type = getterType;
     if (!isFinal) {
       PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con2(variable);
@@ -1825,10 +1818,10 @@
       setter.static = true;
       setter.synthetic = true;
       setter.variable = variable;
-      setter.returnType = VoidTypeImpl.instance;
       variable.setter = setter;
       FunctionTypeImpl setterType = new FunctionTypeImpl.con1(getter);
       setterType.normalParameterTypes = <Type2> [type2];
+      setterType.returnType = VoidTypeImpl.instance;
       setter.type = setterType;
     }
     return variable;
@@ -2214,12 +2207,9 @@
     EngineTestCase.assertLength(0, types);
   }
   void test_getReturnType() {
-    Type2 expectedReturnType = VoidTypeImpl.instance;
-    FunctionElementImpl functionElement = new FunctionElementImpl.con1(ASTFactory.identifier3("f"));
-    functionElement.returnType = expectedReturnType;
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(functionElement);
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f")));
     Type2 returnType = type.returnType;
-    JUnitTestCase.assertEquals(expectedReturnType, returnType);
+    JUnitTestCase.assertEquals(VoidTypeImpl.instance, returnType);
   }
   void test_getTypeArguments() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f")));
@@ -2430,15 +2420,15 @@
     variableS.bound = stringType;
     TypeVariableTypeImpl typeS = new TypeVariableTypeImpl(variableS);
     FunctionElementImpl functionAliasElement = new FunctionElementImpl.con1(ASTFactory.identifier3("func"));
-    functionAliasElement.returnType = stringType;
     FunctionTypeImpl functionAliasType = new FunctionTypeImpl.con1(functionAliasElement);
     functionAliasElement.type = functionAliasType;
+    functionAliasType.returnType = stringType;
     functionAliasType.normalParameterTypes = <Type2> [typeB];
     functionAliasType.optionalParameterTypes = <Type2> [typeS];
     FunctionElementImpl functionElement = new FunctionElementImpl.con1(ASTFactory.identifier3("f"));
-    functionElement.returnType = provider.dynamicType;
     FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
     functionElement.type = functionType;
+    functionType.returnType = provider.dynamicType;
     functionType.normalParameterTypes = <Type2> [boolType];
     functionType.optionalParameterTypes = <Type2> [stringType];
     JUnitTestCase.assertTrue(functionType.isAssignableTo(functionAliasType));
@@ -2473,33 +2463,26 @@
     JUnitTestCase.assertEquals(expectedTypes, types);
   }
   void test_setReturnType() {
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f")));
     Type2 expectedType = new InterfaceTypeImpl.con1(new ClassElementImpl(ASTFactory.identifier3("C")));
-    FunctionElementImpl functionElement = new FunctionElementImpl.con1(ASTFactory.identifier3("f"));
-    functionElement.returnType = expectedType;
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(functionElement);
-    JUnitTestCase.assertEquals(expectedType, type.returnType);
+    type.returnType = expectedType;
+    Type2 returnType = type.returnType;
+    JUnitTestCase.assertEquals(expectedType, returnType);
   }
   void test_setTypeArguments() {
-    ClassElementImpl enclosingClass = ElementFactory.classElement2("C", ["E"]);
-    MethodElementImpl methodElement = new MethodElementImpl.con1(ASTFactory.identifier3("m"));
-    enclosingClass.methods = <MethodElement> [methodElement];
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(methodElement);
-    Type2 expectedType = enclosingClass.typeVariables[0].type;
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f")));
+    Type2 expectedType = new TypeVariableTypeImpl(new TypeVariableElementImpl(ASTFactory.identifier3("C")));
     type.typeArguments = <Type2> [expectedType];
     List<Type2> arguments = type.typeArguments;
     EngineTestCase.assertLength(1, arguments);
     JUnitTestCase.assertEquals(expectedType, arguments[0]);
   }
   void test_substitute2_equal() {
-    ClassElementImpl definingClass = ElementFactory.classElement2("C", ["E"]);
-    TypeVariableType parameterType = definingClass.typeVariables[0].type;
-    MethodElementImpl functionElement = new MethodElementImpl.con1(ASTFactory.identifier3("m"));
-    functionElement.returnType = parameterType;
-    definingClass.methods = <MethodElement> [functionElement];
-    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
+    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f")));
+    TypeVariableTypeImpl parameterType = new TypeVariableTypeImpl(new TypeVariableElementImpl(ASTFactory.identifier3("E")));
+    functionType.returnType = parameterType;
     functionType.normalParameterTypes = <Type2> [parameterType];
     functionType.optionalParameterTypes = <Type2> [parameterType];
-    functionType.typeArguments = <Type2> [parameterType];
     LinkedHashMap<String, Type2> namedParameterTypes = new LinkedHashMap<String, Type2>();
     String namedParameterName = "c";
     namedParameterTypes[namedParameterName] = parameterType;
@@ -2518,13 +2501,12 @@
     JUnitTestCase.assertEquals(argumentType, namedParameters[namedParameterName]);
   }
   void test_substitute2_notEqual() {
+    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f")));
     Type2 returnType = new InterfaceTypeImpl.con1(new ClassElementImpl(ASTFactory.identifier3("R")));
     Type2 normalParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(ASTFactory.identifier3("A")));
     Type2 optionalParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(ASTFactory.identifier3("B")));
     Type2 namedParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(ASTFactory.identifier3("C")));
-    FunctionElementImpl functionElement = new FunctionElementImpl.con1(ASTFactory.identifier3("f"));
-    functionElement.returnType = returnType;
-    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
+    functionType.returnType = returnType;
     functionType.normalParameterTypes = <Type2> [normalParameterType];
     functionType.optionalParameterTypes = <Type2> [optionalParameterType];
     LinkedHashMap<String, Type2> namedParameterTypes = new LinkedHashMap<String, Type2>();
@@ -2732,7 +2714,7 @@
 }
 class InterfaceTypeImpl_18 extends InterfaceTypeImpl {
   InterfaceTypeImpl_18(ClassElement arg0) : super.con1(arg0);
-  bool get isDartCoreFunction => true;
+  bool isDartCoreFunction() => true;
 }
 main() {
   ElementKindTest.dartSuite();
diff --git a/pkg/analyzer_experimental/test/generated/parser_test.dart b/pkg/analyzer_experimental/test/generated/parser_test.dart
index 41f6646..9c5f3d8 100644
--- a/pkg/analyzer_experimental/test/generated/parser_test.dart
+++ b/pkg/analyzer_experimental/test/generated/parser_test.dart
@@ -16,11 +16,11 @@
 import 'scanner_test.dart' show TokenFactory;
 import 'ast_test.dart' show ASTFactory;
 /**
- * The class `SimpleParserTest` defines parser tests that test individual parsing method. The
+ * The class {@code SimpleParserTest} defines parser tests that test individual parsing method. The
  * code fragments should be as minimal as possible in order to test the method, but should not test
  * the interactions between the method under test and other methods.
- *
- * More complex tests should be defined in the class [ComplexParserTest].
+ * <p>
+ * More complex tests should be defined in the class {@link ComplexParserTest}.
  */
 class SimpleParserTest extends ParserTestCase {
   void fail_parseCommentReference_this() {
@@ -83,11 +83,11 @@
   }
   void test_createSyntheticIdentifier() {
     SimpleIdentifier identifier = createSyntheticIdentifier();
-    JUnitTestCase.assertTrue(identifier.isSynthetic);
+    JUnitTestCase.assertTrue(identifier.isSynthetic());
   }
   void test_createSyntheticStringLiteral() {
     SimpleStringLiteral literal = createSyntheticStringLiteral();
-    JUnitTestCase.assertTrue(literal.isSynthetic);
+    JUnitTestCase.assertTrue(literal.isSynthetic());
   }
   void test_isFunctionDeclaration_nameButNoReturn_block() {
     JUnitTestCase.assertTrue(isFunctionDeclaration("f() {}"));
@@ -1508,15 +1508,15 @@
   }
   void test_parseDocumentationComment_block() {
     Comment comment = ParserTestCase.parse5("parseDocumentationComment", "/** */ class", []);
-    JUnitTestCase.assertFalse(comment.isBlock);
-    JUnitTestCase.assertTrue(comment.isDocumentation);
-    JUnitTestCase.assertFalse(comment.isEndOfLine);
+    JUnitTestCase.assertFalse(comment.isBlock());
+    JUnitTestCase.assertTrue(comment.isDocumentation());
+    JUnitTestCase.assertFalse(comment.isEndOfLine());
   }
   void test_parseDocumentationComment_block_withReference() {
     Comment comment = ParserTestCase.parse5("parseDocumentationComment", "/** [a] */ class", []);
-    JUnitTestCase.assertFalse(comment.isBlock);
-    JUnitTestCase.assertTrue(comment.isDocumentation);
-    JUnitTestCase.assertFalse(comment.isEndOfLine);
+    JUnitTestCase.assertFalse(comment.isBlock());
+    JUnitTestCase.assertTrue(comment.isDocumentation());
+    JUnitTestCase.assertFalse(comment.isEndOfLine());
     NodeList<CommentReference> references = comment.references;
     EngineTestCase.assertSize(1, references);
     CommentReference reference = references[0];
@@ -1525,9 +1525,9 @@
   }
   void test_parseDocumentationComment_endOfLine() {
     Comment comment = ParserTestCase.parse5("parseDocumentationComment", "/// \n/// \n class", []);
-    JUnitTestCase.assertFalse(comment.isBlock);
-    JUnitTestCase.assertTrue(comment.isDocumentation);
-    JUnitTestCase.assertFalse(comment.isEndOfLine);
+    JUnitTestCase.assertFalse(comment.isBlock());
+    JUnitTestCase.assertTrue(comment.isDocumentation());
+    JUnitTestCase.assertFalse(comment.isEndOfLine());
   }
   void test_parseDoStatement() {
     DoStatement statement = ParserTestCase.parse5("parseDoStatement", "do {} while (x);", []);
@@ -2870,7 +2870,7 @@
   }
   void test_parsePrimaryExpression_string() {
     SimpleStringLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "\"string\"", []);
-    JUnitTestCase.assertFalse(literal.isMultiline);
+    JUnitTestCase.assertFalse(literal.isMultiline());
     JUnitTestCase.assertEquals("string", literal.value);
   }
   void test_parsePrimaryExpression_super() {
@@ -3668,7 +3668,7 @@
   }
 
   /**
-   * Invoke the method [Parser#computeStringValue] with the given argument.
+   * Invoke the method {@link Parser#computeStringValue(String)} with the given argument.
    * @param lexeme the argument to the method
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
@@ -3680,7 +3680,7 @@
   }
 
   /**
-   * Invoke the method [Parser#createSyntheticIdentifier] with the parser set to the token
+   * Invoke the method {@link Parser#createSyntheticIdentifier()} with the parser set to the token
    * stream produced by scanning the given source.
    * @param source the source to be scanned to produce the token stream being tested
    * @return the result of invoking the method
@@ -3692,7 +3692,7 @@
   }
 
   /**
-   * Invoke the method [Parser#createSyntheticIdentifier] with the parser set to the token
+   * Invoke the method {@link Parser#createSyntheticIdentifier()} with the parser set to the token
    * stream produced by scanning the given source.
    * @param source the source to be scanned to produce the token stream being tested
    * @return the result of invoking the method
@@ -3704,7 +3704,7 @@
   }
 
   /**
-   * Invoke the method [Parser#isFunctionDeclaration] with the parser set to the token
+   * Invoke the method {@link Parser#isFunctionDeclaration()} with the parser set to the token
    * stream produced by scanning the given source.
    * @param source the source to be scanned to produce the token stream being tested
    * @return the result of invoking the method
@@ -3716,7 +3716,7 @@
   }
 
   /**
-   * Invoke the method [Parser#isFunctionExpression] with the parser set to the token stream
+   * Invoke the method {@link Parser#isFunctionExpression()} with the parser set to the token stream
    * produced by scanning the given source.
    * @param source the source to be scanned to produce the token stream being tested
    * @return the result of invoking the method
@@ -3731,7 +3731,7 @@
   }
 
   /**
-   * Invoke the method [Parser#isInitializedVariableDeclaration] with the parser set to the
+   * Invoke the method {@link Parser#isInitializedVariableDeclaration()} with the parser set to the
    * token stream produced by scanning the given source.
    * @param source the source to be scanned to produce the token stream being tested
    * @return the result of invoking the method
@@ -3743,7 +3743,7 @@
   }
 
   /**
-   * Invoke the method [Parser#isSwitchMember] with the parser set to the token stream
+   * Invoke the method {@link Parser#isSwitchMember()} with the parser set to the token stream
    * produced by scanning the given source.
    * @param source the source to be scanned to produce the token stream being tested
    * @return the result of invoking the method
@@ -3755,13 +3755,13 @@
   }
 
   /**
-   * Invoke a "skip" method in [Parser]. The method is assumed to take a token as it's
+   * Invoke a "skip" method in {@link Parser}. The method is assumed to take a token as it's
    * parameter and is given the first token in the scanned source.
    * @param methodName the name of the method that should be invoked
    * @param source the source to be processed by the method
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null`
+   * @throws AssertionFailedError if the result is {@code null}
    */
   Token skip(String methodName, String source) {
     GatheringErrorListener listener = new GatheringErrorListener();
@@ -5853,11 +5853,11 @@
   }
 }
 /**
- * The class `ComplexParserTest` defines parser tests that test the parsing of more complex
+ * The class {@code ComplexParserTest} defines parser tests that test the parsing of more complex
  * code fragments or the interactions between multiple parsing methods. For example, tests to ensure
  * that the precedence of operations is being handled correctly should be defined in this class.
- *
- * Simpler tests should be defined in the class [SimpleParserTest].
+ * <p>
+ * Simpler tests should be defined in the class {@link SimpleParserTest}.
  */
 class ComplexParserTest extends ParserTestCase {
   void test_additiveExpression_normal() {
@@ -5979,7 +5979,7 @@
       Expression lhs = ((section as AssignmentExpression)).leftHandSide;
       EngineTestCase.assertInstanceOf(IndexExpression, lhs);
       IndexExpression index = lhs as IndexExpression;
-      JUnitTestCase.assertTrue(index.isCascaded);
+      JUnitTestCase.assertTrue(index.isCascaded());
       JUnitTestCase.assertSame(target, index.realTarget);
     }
   }
@@ -6263,7 +6263,7 @@
   }
 }
 /**
- * Instances of the class `ASTValidator` are used to validate the correct construction of an
+ * Instances of the class {@code ASTValidator} are used to validate the correct construction of an
  * AST structure.
  */
 class ASTValidator extends GeneralizingASTVisitor<Object> {
@@ -6340,9 +6340,9 @@
   static List<Object> _EMPTY_ARGUMENTS = new List<Object>(0);
 
   /**
-   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
+   * Invoke a parse method in {@link Parser}. The method is assumed to have the given number and
    * type of parameters and will be invoked with the given arguments.
-   *
+   * <p>
    * The given source is scanned and the parser is initialized to start with the first token in the
    * source before the parse method is invoked.
    * @param methodName the name of the parse method that should be invoked to parse the source
@@ -6350,14 +6350,14 @@
    * @param source the source to be parsed by the parse method
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or if any errors are produced
+   * @throws AssertionFailedError if the result is {@code null} or if any errors are produced
    */
   static Object parse(String methodName, List<Object> objects, String source) => parse3(methodName, objects, source, new List<AnalysisError>(0));
 
   /**
-   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
+   * Invoke a parse method in {@link Parser}. The method is assumed to have the given number and
    * type of parameters and will be invoked with the given arguments.
-   *
+   * <p>
    * The given source is scanned and the parser is initialized to start with the first token in the
    * source before the parse method is invoked.
    * @param methodName the name of the parse method that should be invoked to parse the source
@@ -6366,7 +6366,7 @@
    * @param errorCodes the error codes of the errors that should be generated
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   * @throws AssertionFailedError if the result is {@code null} or the errors produced while
    * scanning and parsing the source do not match the expected errors
    */
   static Object parse3(String methodName, List<Object> objects, String source, List<AnalysisError> errors) {
@@ -6377,9 +6377,9 @@
   }
 
   /**
-   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
+   * Invoke a parse method in {@link Parser}. The method is assumed to have the given number and
    * type of parameters and will be invoked with the given arguments.
-   *
+   * <p>
    * The given source is scanned and the parser is initialized to start with the first token in the
    * source before the parse method is invoked.
    * @param methodName the name of the parse method that should be invoked to parse the source
@@ -6388,7 +6388,7 @@
    * @param errorCodes the error codes of the errors that should be generated
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   * @throws AssertionFailedError if the result is {@code null} or the errors produced while
    * scanning and parsing the source do not match the expected errors
    */
   static Object parse4(String methodName, List<Object> objects, String source, List<ErrorCode> errorCodes) {
@@ -6399,8 +6399,8 @@
   }
 
   /**
-   * Invoke a parse method in [Parser]. The method is assumed to have no arguments.
-   *
+   * Invoke a parse method in {@link Parser}. The method is assumed to have no arguments.
+   * <p>
    * The given source is scanned and the parser is initialized to start with the first token in the
    * source before the parse method is invoked.
    * @param methodName the name of the parse method that should be invoked to parse the source
@@ -6408,7 +6408,7 @@
    * @param errorCodes the error codes of the errors that should be generated
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   * @throws AssertionFailedError if the result is {@code null} or the errors produced while
    * scanning and parsing the source do not match the expected errors
    */
   static Object parse5(String methodName, String source, List<ErrorCode> errorCodes) => parse4(methodName, _EMPTY_ARGUMENTS, source, errorCodes);
@@ -6419,7 +6419,7 @@
    * @param errorCodes the error codes of the errors that are expected to be found
    * @return the compilation unit that was parsed
    * @throws Exception if the source could not be parsed, if the compilation errors in the source do
-   * not match those that are expected, or if the result would have been `null`
+   * not match those that are expected, or if the result would have been {@code null}
    */
   static CompilationUnit parseCompilationUnit(String source, List<ErrorCode> errorCodes) {
     GatheringErrorListener listener = new GatheringErrorListener();
@@ -6439,7 +6439,7 @@
    * @param errorCodes the error codes of the errors that are expected to be found
    * @return the expression that was parsed
    * @throws Exception if the source could not be parsed, if the compilation errors in the source do
-   * not match those that are expected, or if the result would have been `null`
+   * not match those that are expected, or if the result would have been {@code null}
    */
   static Expression parseExpression(String source, List<ErrorCode> errorCodes) {
     GatheringErrorListener listener = new GatheringErrorListener();
@@ -6459,7 +6459,7 @@
    * @param errorCodes the error codes of the errors that are expected to be found
    * @return the statement that was parsed
    * @throws Exception if the source could not be parsed, if the compilation errors in the source do
-   * not match those that are expected, or if the result would have been `null`
+   * not match those that are expected, or if the result would have been {@code null}
    */
   static Statement parseStatement(String source, List<ErrorCode> errorCodes) {
     GatheringErrorListener listener = new GatheringErrorListener();
@@ -6481,7 +6481,7 @@
    * @return the statements that were parsed
    * @throws Exception if the source could not be parsed, if the number of statements does not match
    * the expected count, if the compilation errors in the source do not match those that
-   * are expected, or if the result would have been `null`
+   * are expected, or if the result would have been {@code null}
    */
   static List<Statement> parseStatements(String source, int expectedCount, List<ErrorCode> errorCodes) {
     GatheringErrorListener listener = new GatheringErrorListener();
@@ -6496,9 +6496,9 @@
   }
 
   /**
-   * Invoke a method in [Parser]. The method is assumed to have the given number and type of
+   * Invoke a method in {@link Parser}. The method is assumed to have the given number and type of
    * parameters and will be invoked with the given arguments.
-   *
+   * <p>
    * The given source is scanned and the parser is initialized to start with the first token in the
    * source before the method is invoked.
    * @param methodName the name of the method that should be invoked
@@ -6507,7 +6507,7 @@
    * @param listener the error listener that will be used for both scanning and parsing
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   * @throws AssertionFailedError if the result is {@code null} or the errors produced while
    * scanning and parsing the source do not match the expected errors
    */
   static Object invokeParserMethod(String methodName, List<Object> objects, String source, GatheringErrorListener listener) {
@@ -6523,8 +6523,8 @@
   }
 
   /**
-   * Invoke a method in [Parser]. The method is assumed to have no arguments.
-   *
+   * Invoke a method in {@link Parser}. The method is assumed to have no arguments.
+   * <p>
    * The given source is scanned and the parser is initialized to start with the first token in the
    * source before the method is invoked.
    * @param methodName the name of the method that should be invoked
@@ -6532,7 +6532,7 @@
    * @param listener the error listener that will be used for both scanning and parsing
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   * @throws AssertionFailedError if the result is {@code null} or the errors produced while
    * scanning and parsing the source do not match the expected errors
    */
   static Object invokeParserMethod2(String methodName, String source, GatheringErrorListener listener) => invokeParserMethod(methodName, _EMPTY_ARGUMENTS, source, listener);
@@ -6562,7 +6562,7 @@
   }
 }
 /**
- * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
+ * The class {@code RecoveryParserTest} defines parser tests that test the parsing of invalid code
  * sequences to ensure that the correct recovery steps are taken in the parser.
  */
 class RecoveryParserTest extends ParserTestCase {
@@ -6572,24 +6572,24 @@
   void test_additiveExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("+ y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_additiveExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("+", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_additiveExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x +", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_additiveExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super +", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_additiveExpression_precedence_multiplicative_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("* +", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
@@ -6607,51 +6607,51 @@
     AssignmentExpression expression = ParserTestCase.parseExpression("= y = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression = expression.leftHandSide;
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_assignmentExpression_missing_compound2() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x = = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression = ((expression.rightHandSide as AssignmentExpression)).leftHandSide;
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_assignmentExpression_missing_compound3() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x = y =", [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression = ((expression.rightHandSide as AssignmentExpression)).rightHandSide;
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_assignmentExpression_missing_LHS() {
     AssignmentExpression expression = ParserTestCase.parseExpression("= 0", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftHandSide);
-    JUnitTestCase.assertTrue(expression.leftHandSide.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftHandSide.isSynthetic());
   }
   void test_assignmentExpression_missing_RHS() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x =", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftHandSide);
-    JUnitTestCase.assertTrue(expression.rightHandSide.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightHandSide.isSynthetic());
   }
   void test_bitwiseAndExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("& y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_bitwiseAndExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("&", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseAndExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x &", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseAndExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super &", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseAndExpression_precedence_equality_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("== &", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
@@ -6668,24 +6668,24 @@
   void test_bitwiseOrExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("| y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_bitwiseOrExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("|", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseOrExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x |", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseOrExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super |", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseOrExpression_precedence_xor_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("^ |", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
@@ -6702,24 +6702,24 @@
   void test_bitwiseXorExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("^ y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_bitwiseXorExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("^", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseXorExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ^", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseXorExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super ^", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseXorExpression_precedence_and_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("& ^", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
@@ -6739,34 +6739,34 @@
   void test_conditionalExpression_missingElse() {
     ConditionalExpression expression = ParserTestCase.parse5("parseConditionalExpression", "x ? y :", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.elseExpression);
-    JUnitTestCase.assertTrue(expression.elseExpression.isSynthetic);
+    JUnitTestCase.assertTrue(expression.elseExpression.isSynthetic());
   }
   void test_conditionalExpression_missingThen() {
     ConditionalExpression expression = ParserTestCase.parse5("parseConditionalExpression", "x ? : z", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.thenExpression);
-    JUnitTestCase.assertTrue(expression.thenExpression.isSynthetic);
+    JUnitTestCase.assertTrue(expression.thenExpression.isSynthetic());
   }
   void test_equalityExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("== y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_equalityExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("==", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_equalityExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ==", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_equalityExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super ==", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_equalityExpression_precedence_relational_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("is ==", [ParserErrorCode.EXPECTED_TYPE_NAME, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
@@ -6785,21 +6785,21 @@
     EngineTestCase.assertSize(4, result);
     Expression syntheticExpression = result[0];
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_expressionList_multiple_middle() {
     List<Expression> result = ParserTestCase.parse5("parseExpressionList", "1, 2, , 4", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertSize(4, result);
     Expression syntheticExpression = result[2];
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_expressionList_multiple_start() {
     List<Expression> result = ParserTestCase.parse5("parseExpressionList", "1, 2, 3,", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertSize(4, result);
     Expression syntheticExpression = result[3];
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_isExpression_noType() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}", [ParserErrorCode.EXPECTED_TYPE_NAME, ParserErrorCode.EXPECTED_TYPE_NAME, ParserErrorCode.MISSING_STATEMENT]);
@@ -6813,25 +6813,25 @@
     JUnitTestCase.assertNotNull(expression.notOperator);
     TypeName type = expression.type;
     JUnitTestCase.assertNotNull(type);
-    JUnitTestCase.assertTrue(type.name.isSynthetic);
+    JUnitTestCase.assertTrue(type.name.isSynthetic());
     EngineTestCase.assertInstanceOf(EmptyStatement, ifStatement.thenStatement);
   }
   void test_logicalAndExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("&& y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_logicalAndExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("&&", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_logicalAndExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x &&", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_logicalAndExpression_precedence_bitwiseOr_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("| &&", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
@@ -6844,19 +6844,19 @@
   void test_logicalOrExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("|| y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_logicalOrExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("||", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_logicalOrExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ||", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_logicalOrExpression_precedence_logicalAnd_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("&& ||", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
@@ -6869,24 +6869,24 @@
   void test_multiplicativeExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("* y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_multiplicativeExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("*", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_multiplicativeExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x *", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_multiplicativeExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super *", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_multiplicativeExpression_precedence_unary_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("-x *", [ParserErrorCode.MISSING_IDENTIFIER]);
@@ -6903,25 +6903,25 @@
   void test_prefixExpression_missing_operand_minus() {
     PrefixExpression expression = ParserTestCase.parseExpression("-", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.operand);
-    JUnitTestCase.assertTrue(expression.operand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.operand.isSynthetic());
     JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
   }
   void test_relationalExpression_missing_LHS() {
     IsExpression expression = ParserTestCase.parseExpression("is y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.expression);
-    JUnitTestCase.assertTrue(expression.expression.isSynthetic);
+    JUnitTestCase.assertTrue(expression.expression.isSynthetic());
   }
   void test_relationalExpression_missing_LHS_RHS() {
     IsExpression expression = ParserTestCase.parseExpression("is", [ParserErrorCode.EXPECTED_TYPE_NAME, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.expression);
-    JUnitTestCase.assertTrue(expression.expression.isSynthetic);
+    JUnitTestCase.assertTrue(expression.expression.isSynthetic());
     EngineTestCase.assertInstanceOf(TypeName, expression.type);
-    JUnitTestCase.assertTrue(expression.type.isSynthetic);
+    JUnitTestCase.assertTrue(expression.type.isSynthetic());
   }
   void test_relationalExpression_missing_RHS() {
     IsExpression expression = ParserTestCase.parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
     EngineTestCase.assertInstanceOf(TypeName, expression.type);
-    JUnitTestCase.assertTrue(expression.type.isSynthetic);
+    JUnitTestCase.assertTrue(expression.type.isSynthetic());
   }
   void test_relationalExpression_precedence_shift_right() {
     IsExpression expression = ParserTestCase.parseExpression("<< is", [ParserErrorCode.EXPECTED_TYPE_NAME, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
@@ -6930,24 +6930,24 @@
   void test_shiftExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("<< y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_shiftExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("<<", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_shiftExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x <<", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_shiftExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super <<", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_shiftExpression_precedence_unary_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("+ <<", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
@@ -7282,13 +7282,13 @@
   }
 }
 /**
- * The class `ErrorParserTest` defines parser tests that test the parsing of code to ensure
+ * The class {@code ErrorParserTest} defines parser tests that test the parsing of code to ensure
  * that errors are correctly reported, and in some cases, not reported.
  */
 class ErrorParserTest extends ParserTestCase {
   void fail_expectedListOrMapLiteral() {
     TypedLiteral literal = ParserTestCase.parse4("parseListOrMapLiteral", <Object> [null], "1", [ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]);
-    JUnitTestCase.assertTrue(literal.isSynthetic);
+    JUnitTestCase.assertTrue(literal.isSynthetic());
   }
   void fail_illegalAssignmentToNonAssignable_superAssigned() {
     ParserTestCase.parseExpression("super = x;", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
@@ -7490,7 +7490,7 @@
   }
   void test_expectedStringLiteral() {
     StringLiteral expression = ParserTestCase.parse5("parseStringLiteral", "1", [ParserErrorCode.EXPECTED_STRING_LITERAL]);
-    JUnitTestCase.assertTrue(expression.isSynthetic);
+    JUnitTestCase.assertTrue(expression.isSynthetic());
   }
   void test_expectedToken_commaMissingInArgumentList() {
     ParserTestCase.parse5("parseArgumentList", "(x, y z)", [ParserErrorCode.EXPECTED_TOKEN]);
@@ -7718,7 +7718,7 @@
   }
   void test_missingIdentifier_number() {
     SimpleIdentifier expression = ParserTestCase.parse5("parseSimpleIdentifier", "1", [ParserErrorCode.MISSING_IDENTIFIER]);
-    JUnitTestCase.assertTrue(expression.isSynthetic);
+    JUnitTestCase.assertTrue(expression.isSynthetic());
   }
   void test_missingKeywordOperator() {
     ParserTestCase.parse4("parseOperator", <Object> [emptyCommentAndMetadata(), null, null], "+(x) {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
@@ -7871,7 +7871,7 @@
   void test_useOfUnaryPlusOperator() {
     SimpleIdentifier expression = ParserTestCase.parse5("parseUnaryExpression", "+x", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression);
-    JUnitTestCase.assertTrue(expression.isSynthetic);
+    JUnitTestCase.assertTrue(expression.isSynthetic());
   }
   void test_varAsTypeName_as() {
     ParserTestCase.parseExpression("x as var", [ParserErrorCode.VAR_AS_TYPE_NAME]);
diff --git a/pkg/analyzer_experimental/test/generated/resolver_test.dart b/pkg/analyzer_experimental/test/generated/resolver_test.dart
index 81a1c44..c365a79 100644
--- a/pkg/analyzer_experimental/test/generated/resolver_test.dart
+++ b/pkg/analyzer_experimental/test/generated/resolver_test.dart
@@ -201,7 +201,7 @@
   void test_is_subclass() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {", "  B m() => this;", "}", "A f(A p) {", "  if (p is B) {", "    return p.m();", "  }", "}"]));
     LibraryElement library = resolve(source);
-    assertErrors([StaticTypeWarningCode.UNDEFINED_METHOD]);
+    assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     FunctionDeclaration function = unit.declarations[2] as FunctionDeclaration;
@@ -953,30 +953,6 @@
     assertNoErrors();
     verify([source]);
   }
-  void test_invalidMethodOverrideNamedParamType() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m({int a}) {}", "}", "class B implements A {", "  m({int a, int b}) {}", "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
-  void test_invalidOverrideDifferentDefaultValues_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m({int p : 0}) {}", "}", "class B extends A {", "  m({int p : 0}) {}", "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
-  void test_invalidOverrideDifferentDefaultValues_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m([int p = 0]) {}", "}", "class B extends A {", "  m([int p = 0]) {}", "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
-  void test_invalidOverrideDifferentDefaultValues_positional_changedOrder() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m([int a = 0, String b = '0']) {}", "}", "class B extends A {", "  m([int b = 0, String a = '0']) {}", "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
   void test_invalidOverrideNamed_unorderedNamedParameter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m({a, b}) {}", "}", "class B extends A {", "  m({b, a}) {}", "}"]));
     resolve(source);
@@ -1181,42 +1157,6 @@
     assertNoErrors();
     verify([source]);
   }
-  void test_nonConstantDefaultValue_function_named() {
-    Source source = addSource(EngineTestCase.createSource(["f({x : 2 + 3}) {}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
-  void test_nonConstantDefaultValue_function_positional() {
-    Source source = addSource(EngineTestCase.createSource(["f([x = 2 + 3]) {}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
-  void test_nonConstantDefaultValue_inConstructor_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A({x : 2 + 3}) {}", "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
-  void test_nonConstantDefaultValue_inConstructor_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A([x = 2 + 3]) {}", "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
-  void test_nonConstantDefaultValue_method_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m({x : 2 + 3}) {}", "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
-  void test_nonConstantDefaultValue_method_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m([x = 2 + 3]) {}", "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
   void test_nonConstCaseExpression() {
     Source source = addSource(EngineTestCase.createSource(["f(Type t) {", "  switch (t) {", "    case bool:", "    case int:", "      return true;", "    default:", "      return false;", "  }", "}"]));
     resolve(source);
@@ -1505,12 +1445,6 @@
     assertNoErrors();
     verify([source]);
   }
-  void test_undefinedConstructorInInitializer_hasOptionalParameters() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A([p]) {}", "}", "class B extends A {", "  B();", "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
   void test_undefinedConstructorInInitializer_implicit() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "class B extends A {", "  B();", "}"]));
     resolve(source);
@@ -1935,22 +1869,6 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidFactoryNameNotAClass);
       });
-      _ut.test('test_invalidMethodOverrideNamedParamType', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_invalidMethodOverrideNamedParamType);
-      });
-      _ut.test('test_invalidOverrideDifferentDefaultValues_named', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_invalidOverrideDifferentDefaultValues_named);
-      });
-      _ut.test('test_invalidOverrideDifferentDefaultValues_positional', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_invalidOverrideDifferentDefaultValues_positional);
-      });
-      _ut.test('test_invalidOverrideDifferentDefaultValues_positional_changedOrder', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_invalidOverrideDifferentDefaultValues_positional_changedOrder);
-      });
       _ut.test('test_invalidOverrideNamed_unorderedNamedParameter', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidOverrideNamed_unorderedNamedParameter);
@@ -2135,30 +2053,6 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_nonConstValueInInitializer_unary);
       });
-      _ut.test('test_nonConstantDefaultValue_function_named', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_function_named);
-      });
-      _ut.test('test_nonConstantDefaultValue_function_positional', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_function_positional);
-      });
-      _ut.test('test_nonConstantDefaultValue_inConstructor_named', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_inConstructor_named);
-      });
-      _ut.test('test_nonConstantDefaultValue_inConstructor_positional', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_inConstructor_positional);
-      });
-      _ut.test('test_nonConstantDefaultValue_method_named', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_method_named);
-      });
-      _ut.test('test_nonConstantDefaultValue_method_positional', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_method_positional);
-      });
       _ut.test('test_nonGenerativeConstructor', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_nonGenerativeConstructor);
@@ -2303,10 +2197,6 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_explicit_unnamed);
       });
-      _ut.test('test_undefinedConstructorInInitializer_hasOptionalParameters', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_hasOptionalParameters);
-      });
       _ut.test('test_undefinedConstructorInInitializer_implicit', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_implicit);
@@ -2658,48 +2548,12 @@
     assertErrors([StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
     verify([source]);
   }
-  void test_returnOfInvalidType_expressionFunctionBody_function() {
-    Source source = addSource(EngineTestCase.createSource(["int f() => '0';"]));
-    resolve(source);
-    assertErrors([StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
-  }
-  void test_returnOfInvalidType_expressionFunctionBody_getter() {
-    Source source = addSource(EngineTestCase.createSource(["int get g => '0';"]));
-    resolve(source);
-    assertErrors([StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
-  }
-  void test_returnOfInvalidType_expressionFunctionBody_localFunction() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  String m() {", "    int f() => '0';", "  }", "}"]));
-    resolve(source);
-    assertErrors([StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
-  }
-  void test_returnOfInvalidType_expressionFunctionBody_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int f() => '0';", "}"]));
-    resolve(source);
-    assertErrors([StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
-  }
-  void test_returnOfInvalidType_expressionFunctionBody_void() {
-    Source source = addSource(EngineTestCase.createSource(["void f() => 42;"]));
-    resolve(source);
-    assertErrors([StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
-  }
   void test_returnOfInvalidType_function() {
     Source source = addSource(EngineTestCase.createSource(["int f() { return '0'; }"]));
     resolve(source);
     assertErrors([StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
-  void test_returnOfInvalidType_getter() {
-    Source source = addSource(EngineTestCase.createSource(["int get g { return '0'; }"]));
-    resolve(source);
-    assertErrors([StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
-  }
   void test_returnOfInvalidType_localFunction() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  String m() {", "    int f() { return '0'; }", "  }", "}"]));
     resolve(source);
@@ -2750,11 +2604,6 @@
     resolve(source);
     assertErrors([StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
-  void test_undefinedMethod_ignoreTypePropagation() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {", "  m() {}", "}", "class C {", "f() {", "    A a = new B();", "    a.m();", "  }", "}"]));
-    resolve(source);
-    assertErrors([StaticTypeWarningCode.UNDEFINED_METHOD]);
-  }
   void test_undefinedOperator_indexBoth() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0]++;", "}"]));
     resolve(source);
@@ -2876,34 +2725,10 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_nonBoolExpression);
       });
-      _ut.test('test_returnOfInvalidType_expressionFunctionBody_function', () {
-        final __test = new StaticTypeWarningCodeTest();
-        runJUnitTest(__test, __test.test_returnOfInvalidType_expressionFunctionBody_function);
-      });
-      _ut.test('test_returnOfInvalidType_expressionFunctionBody_getter', () {
-        final __test = new StaticTypeWarningCodeTest();
-        runJUnitTest(__test, __test.test_returnOfInvalidType_expressionFunctionBody_getter);
-      });
-      _ut.test('test_returnOfInvalidType_expressionFunctionBody_localFunction', () {
-        final __test = new StaticTypeWarningCodeTest();
-        runJUnitTest(__test, __test.test_returnOfInvalidType_expressionFunctionBody_localFunction);
-      });
-      _ut.test('test_returnOfInvalidType_expressionFunctionBody_method', () {
-        final __test = new StaticTypeWarningCodeTest();
-        runJUnitTest(__test, __test.test_returnOfInvalidType_expressionFunctionBody_method);
-      });
-      _ut.test('test_returnOfInvalidType_expressionFunctionBody_void', () {
-        final __test = new StaticTypeWarningCodeTest();
-        runJUnitTest(__test, __test.test_returnOfInvalidType_expressionFunctionBody_void);
-      });
       _ut.test('test_returnOfInvalidType_function', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_returnOfInvalidType_function);
       });
-      _ut.test('test_returnOfInvalidType_getter', () {
-        final __test = new StaticTypeWarningCodeTest();
-        runJUnitTest(__test, __test.test_returnOfInvalidType_getter);
-      });
       _ut.test('test_returnOfInvalidType_localFunction', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_returnOfInvalidType_localFunction);
@@ -2940,10 +2765,6 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedMethod);
       });
-      _ut.test('test_undefinedMethod_ignoreTypePropagation', () {
-        final __test = new StaticTypeWarningCodeTest();
-        runJUnitTest(__test, __test.test_undefinedMethod_ignoreTypePropagation);
-      });
       _ut.test('test_undefinedOperator_indexBoth', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedOperator_indexBoth);
@@ -3294,7 +3115,7 @@
 class ResolverTestCase extends EngineTestCase {
 
   /**
-   * The source factory used to create [Source sources].
+   * The source factory used to create {@link Source sources}.
    */
   SourceFactory _sourceFactory;
 
@@ -3373,7 +3194,7 @@
   }
 
   /**
-   * Create a library element that represents a library named `"test"` containing a single
+   * Create a library element that represents a library named {@code "test"} containing a single
    * empty compilation unit.
    * @return the library element that was created
    */
@@ -3430,7 +3251,7 @@
   /**
    * Given a library and all of its parts, resolve the contents of the library and the contents of
    * the parts. This assumes that the sources for the library and its parts have already been added
-   * to the content provider using the method [addSource].
+   * to the content provider using the method {@link #addSource(String,String)}.
    * @param librarySource the source for the compilation unit that defines the library
    * @return the element representing the resolved library
    * @throws AnalysisException if the analysis could not be performed
@@ -4059,6 +3880,18 @@
     assertErrors([CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
     verify([source]);
   }
+  void fail_nonConstantDefaultValue_named() {
+    Source source = addSource(EngineTestCase.createSource(["f({x : 2 + 3}) {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+  void fail_nonConstantDefaultValue_positional() {
+    Source source = addSource(EngineTestCase.createSource(["f([x = 2 + 3]) {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
   void fail_objectCannotExtendAnotherClass() {
     Source source = addSource(EngineTestCase.createSource([]));
     resolve(source);
@@ -4107,6 +3940,24 @@
     assertErrors([CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT]);
     verify([source]);
   }
+  void fail_typeArgumentsForNonGenericClass_creation_const() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(p) {", "  return const A<int>();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS]);
+    verify([source]);
+  }
+  void fail_typeArgumentsForNonGenericClass_creation_new() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(p) {", "  return new A<int>();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS]);
+    verify([source]);
+  }
+  void fail_typeArgumentsForNonGenericClass_typeCast() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(p) {", "  return p as A<int>;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS]);
+    verify([source]);
+  }
   void fail_uninitializedFinalField() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int i;", "}"]));
     resolve(source);
@@ -4513,31 +4364,31 @@
   void test_extendsOrImplementsDisallowedClass_extends_bool() {
     Source source = addSource(EngineTestCase.createSource(["class A extends bool {}"]));
     resolve(source);
-    assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_extends_double() {
     Source source = addSource(EngineTestCase.createSource(["class A extends double {}"]));
     resolve(source);
-    assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_extends_int() {
     Source source = addSource(EngineTestCase.createSource(["class A extends int {}"]));
     resolve(source);
-    assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_extends_num() {
     Source source = addSource(EngineTestCase.createSource(["class A extends num {}"]));
     resolve(source);
-    assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_extends_String() {
     Source source = addSource(EngineTestCase.createSource(["class A extends String {}"]));
     resolve(source);
-    assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_implements_bool() {
@@ -4653,7 +4504,7 @@
    * This test doesn't test the FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR code, but tests the
    * FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION code instead. It is provided here to show
    * coverage over all of the permutations of initializers in constructor declarations.
-   *
+   * <p>
    * Note: FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION covers a subset of
    * FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, since it more specific, we use it instead of
    * the broader code
@@ -4681,7 +4532,7 @@
    * This test doesn't test the FINAL_INITIALIZED_MULTIPLE_TIMES code, but tests the
    * FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER code instead. It is provided here to show
    * coverage over all of the permutations of initializers in constructor declarations.
-   *
+   * <p>
    * Note: FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER covers a subset of
    * FINAL_INITIALIZED_MULTIPLE_TIMES, since it more specific, we use it instead of the broader code
    */
@@ -5075,42 +4926,6 @@
     assertErrors([CompileTimeErrorCode.NEW_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
-  void test_nonConstantDefaultValue_function_named() {
-    Source source = addSource(EngineTestCase.createSource(["int y;", "f({x : y}) {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
-  void test_nonConstantDefaultValue_function_positional() {
-    Source source = addSource(EngineTestCase.createSource(["int y;", "f([x = y]) {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
-  void test_nonConstantDefaultValue_inConstructor_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  A({x : y}) {}", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
-  void test_nonConstantDefaultValue_inConstructor_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  A([x = y]) {}", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
-  void test_nonConstantDefaultValue_method_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  m({x : y}) {}", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
-  void test_nonConstantDefaultValue_method_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  m([x = y]) {}", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
   void test_nonConstCaseExpression() {
     Source source = addSource(EngineTestCase.createSource(["f(int p, int q) {", "  switch (p) {", "    case 3 + q:", "      break;", "  }", "}"]));
     resolve(source);
@@ -6261,30 +6076,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonConstValueInInitializer_super);
       });
-      _ut.test('test_nonConstantDefaultValue_function_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_function_named);
-      });
-      _ut.test('test_nonConstantDefaultValue_function_positional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_function_positional);
-      });
-      _ut.test('test_nonConstantDefaultValue_inConstructor_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_inConstructor_named);
-      });
-      _ut.test('test_nonConstantDefaultValue_inConstructor_positional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_inConstructor_positional);
-      });
-      _ut.test('test_nonConstantDefaultValue_method_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_method_named);
-      });
-      _ut.test('test_nonConstantDefaultValue_method_positional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_method_positional);
-      });
       _ut.test('test_nonGenerativeConstructor_explicit', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonGenerativeConstructor_explicit);
@@ -6533,7 +6324,7 @@
   }
 }
 /**
- * Instances of the class `StaticTypeVerifier` verify that all of the nodes in an AST
+ * Instances of the class {@code StaticTypeVerifier} verify that all of the nodes in an AST
  * structure that should have a static type associated with them do have a static type.
  */
 class StaticTypeVerifier extends GeneralizingASTVisitor<Object> {
@@ -6667,7 +6458,7 @@
   }
 }
 /**
- * The class `StrictModeTest` contains tests to ensure that the correct errors and warnings
+ * The class {@code StrictModeTest} contains tests to ensure that the correct errors and warnings
  * are reported when the analysis engine is run in strict mode.
  */
 class StrictModeTest extends ResolverTestCase {
@@ -7169,7 +6960,7 @@
     resolveInClass(node, classA);
     Element element = node.element;
     EngineTestCase.assertInstanceOf(PropertyAccessorElement, element);
-    JUnitTestCase.assertTrue(((element as PropertyAccessorElement)).isSetter);
+    JUnitTestCase.assertTrue(((element as PropertyAccessorElement)).isSetter());
     _listener.assertNoErrors();
   }
   void test_visitSuperConstructorInvocation() {
@@ -7747,6 +7538,12 @@
     assertErrors([StaticWarningCode.INVALID_FACTORY_NAME]);
     verify([source]);
   }
+  void fail_invalidOverrideDifferentDefaultValues() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m([int p = 0]) {}", "}", "class B extends A {", "  m([int p = 1]) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES]);
+    verify([source]);
+  }
   void fail_invocationOfNonFunction() {
     Source source = addSource(EngineTestCase.createSource([]));
     resolve(source);
@@ -8244,18 +8041,6 @@
     assertErrors([StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
-  void test_invalidOverrideDifferentDefaultValues_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m({int p : 0}) {}", "}", "class B extends A {", "  m({int p : 1}) {}", "}"]));
-    resolve(source);
-    assertErrors([StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED]);
-    verify([source]);
-  }
-  void test_invalidOverrideDifferentDefaultValues_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m([int p = 0]) {}", "}", "class B extends A {", "  m([int p = 1]) {}", "}"]));
-    resolve(source);
-    assertErrors([StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL]);
-    verify([source]);
-  }
   void test_invalidSetterOverrideNormalParamType() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void set s(int v) {}", "}", "class B extends A {", "  void set s(String v) {}", "}"]));
     resolve(source);
@@ -8297,24 +8082,6 @@
     assertErrors([StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]);
     verify([source]);
   }
-  void test_noDefaultSuperConstructorExplicit() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(p);", "}", "class B extends A {", "  B() {}", "}"]));
-    resolve(source);
-    assertErrors([StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT]);
-    verify([source]);
-  }
-  void test_noDefaultSuperConstructorImplicit_superHasParameters() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(p);", "}", "class B extends A {", "}"]));
-    resolve(source);
-    assertErrors([StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-  void test_noDefaultSuperConstructorImplicit_superOnlyNamed() {
-    Source source = addSource(EngineTestCase.createSource(["class A { A.named() {} }", "class B extends A {}"]));
-    resolve(source);
-    assertErrors([StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
   void test_nonAbstractClassInheritsAbstractMemberFivePlus() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m();", "  n();", "  o();", "  p();", "  q();", "}", "class C extends A {", "}"]));
     resolve(source);
@@ -8369,12 +8136,6 @@
     assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
-  void test_nonAbstractClassInheritsAbstractMemberOne_superclasses_interface() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  get a => 'a';", "}", "abstract class B implements A {", "  get b => 'b';", "}", "class C extends B {", "}"]));
-    resolve(source);
-    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
-    verify([source]);
-  }
   void test_nonAbstractClassInheritsAbstractMemberThree() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m();", "  n();", "  o();", "}", "class C extends A {", "}"]));
     resolve(source);
@@ -8841,14 +8602,6 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidMethodOverrideReturnType_void);
       });
-      _ut.test('test_invalidOverrideDifferentDefaultValues_named', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_invalidOverrideDifferentDefaultValues_named);
-      });
-      _ut.test('test_invalidOverrideDifferentDefaultValues_positional', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_invalidOverrideDifferentDefaultValues_positional);
-      });
       _ut.test('test_invalidSetterOverrideNormalParamType', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidSetterOverrideNormalParamType);
@@ -8877,18 +8630,6 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_newWithUndefinedConstructorDefault);
       });
-      _ut.test('test_noDefaultSuperConstructorExplicit', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_noDefaultSuperConstructorExplicit);
-      });
-      _ut.test('test_noDefaultSuperConstructorImplicit_superHasParameters', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_noDefaultSuperConstructorImplicit_superHasParameters);
-      });
-      _ut.test('test_noDefaultSuperConstructorImplicit_superOnlyNamed', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_noDefaultSuperConstructorImplicit_superOnlyNamed);
-      });
       _ut.test('test_nonAbstractClassInheritsAbstractMemberFivePlus', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberFivePlus);
@@ -8925,10 +8666,6 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_setter_fromSuperclass);
       });
-      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_superclasses_interface', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_superclasses_interface);
-      });
       _ut.test('test_nonAbstractClassInheritsAbstractMemberThree', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberThree);
@@ -9079,7 +8816,7 @@
   }
 }
 /**
- * Instances of the class `TestTypeProvider` implement a type provider that can be used by
+ * Instances of the class {@code TestTypeProvider} implement a type provider that can be used by
  * tests without creating the element model for the core library.
  */
 class TestTypeProvider implements TypeProvider {
@@ -9200,7 +8937,6 @@
       _iterableType = iterableElement.type;
       Type2 eType = iterableElement.typeVariables[0].type;
       iterableElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("iterator", false, iteratorType.substitute5(<Type2> [eType])), ElementFactory.getterElement("last", false, eType)];
-      propagateTypeArguments(iterableElement);
     }
     return _iterableType;
   }
@@ -9210,7 +8946,6 @@
       _iteratorType = iteratorElement.type;
       Type2 eType = iteratorElement.typeVariables[0].type;
       iteratorElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("current", false, eType)];
-      propagateTypeArguments(iteratorElement);
     }
     return _iteratorType;
   }
@@ -9223,8 +8958,7 @@
       InterfaceType supertype = iterableType.substitute5(<Type2> [eType]);
       listElement.supertype = supertype;
       listElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("length", false, intType)];
-      listElement.methods = <MethodElement> [ElementFactory.methodElement("[]", eType, [intType]), ElementFactory.methodElement("[]=", VoidTypeImpl.instance, [intType, eType]), ElementFactory.methodElement("add", VoidTypeImpl.instance, [eType])];
-      propagateTypeArguments(listElement);
+      listElement.methods = <MethodElement> [ElementFactory.methodElement("[]", eType, [intType]), ElementFactory.methodElement("[]=", VoidTypeImpl.instance, [intType, eType])];
     }
     return _listType;
   }
@@ -9233,7 +8967,6 @@
       ClassElementImpl mapElement = ElementFactory.classElement2("Map", ["K", "V"]);
       _mapType = mapElement.type;
       mapElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("length", false, intType)];
-      propagateTypeArguments(mapElement);
     }
     return _mapType;
   }
@@ -9302,30 +9035,9 @@
     doubleElement.accessors = accessors;
     doubleElement.methods = <MethodElement> [ElementFactory.methodElement("remainder", _doubleType, [_numType]), ElementFactory.methodElement("+", _doubleType, [_numType]), ElementFactory.methodElement("-", _doubleType, [_numType]), ElementFactory.methodElement("*", _doubleType, [_numType]), ElementFactory.methodElement("%", _doubleType, [_numType]), ElementFactory.methodElement("/", _doubleType, [_numType]), ElementFactory.methodElement("~/", _doubleType, [_numType]), ElementFactory.methodElement("-", _doubleType, []), ElementFactory.methodElement("abs", _doubleType, []), ElementFactory.methodElement("round", _doubleType, []), ElementFactory.methodElement("floor", _doubleType, []), ElementFactory.methodElement("ceil", _doubleType, []), ElementFactory.methodElement("truncate", _doubleType, []), ElementFactory.methodElement("toString", _stringType, [])];
   }
-
-  /**
-   * Given a class element representing a class with type parameters, propagate those type
-   * parameters to all of the accessors, methods and constructors defined for the class.
-   * @param classElement the element representing the class with type parameters
-   */
-  void propagateTypeArguments(ClassElementImpl classElement) {
-    List<Type2> typeArguments = TypeVariableTypeImpl.getTypes(classElement.typeVariables);
-    for (PropertyAccessorElement accessor in classElement.accessors) {
-      FunctionTypeImpl functionType = accessor.type as FunctionTypeImpl;
-      functionType.typeArguments = typeArguments;
-    }
-    for (MethodElement method in classElement.methods) {
-      FunctionTypeImpl functionType = method.type as FunctionTypeImpl;
-      functionType.typeArguments = typeArguments;
-    }
-    for (ConstructorElement constructor in classElement.constructors) {
-      FunctionTypeImpl functionType = constructor.type as FunctionTypeImpl;
-      functionType.typeArguments = typeArguments;
-    }
-  }
 }
 /**
- * The class `AnalysisContextFactory` defines utility methods used to create analysis contexts
+ * The class {@code AnalysisContextFactory} defines utility methods used to create analysis contexts
  * for testing purposes.
  */
 class AnalysisContextFactory {
@@ -9498,7 +9210,7 @@
   }
 }
 /**
- * Instances of the class `ResolutionVerifier` verify that all of the nodes in an AST
+ * Instances of the class {@code ResolutionVerifier} verify that all of the nodes in an AST
  * structure that should have been resolved were resolved.
  */
 class ResolutionVerifier extends RecursiveASTVisitor<Object> {
@@ -9568,7 +9280,7 @@
   }
   Object visitBinaryExpression(BinaryExpression node) {
     node.visitChildren(this);
-    if (!node.operator.isUserDefinableOperator) {
+    if (!node.operator.isUserDefinableOperator()) {
       return null;
     }
     return checkResolved2(node, node.element, MethodElement);
@@ -9606,14 +9318,14 @@
   Object visitPartOfDirective(PartOfDirective node) => checkResolved2(node, node.element, LibraryElement);
   Object visitPostfixExpression(PostfixExpression node) {
     node.visitChildren(this);
-    if (!node.operator.isUserDefinableOperator) {
+    if (!node.operator.isUserDefinableOperator()) {
       return null;
     }
     return checkResolved2(node, node.element, MethodElement);
   }
   Object visitPrefixExpression(PrefixExpression node) {
     node.visitChildren(this);
-    if (!node.operator.isUserDefinableOperator) {
+    if (!node.operator.isUserDefinableOperator()) {
       return null;
     }
     return checkResolved2(node, node.element, MethodElement);
@@ -10059,8 +9771,8 @@
     ClassElementImpl classElement = ElementFactory.classElement2("C", []);
     String constructorName = "m";
     ConstructorElementImpl constructor = ElementFactory.constructorElement(classElement, constructorName);
-    constructor.returnType = classElement.type;
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
+    constructorType.returnType = classElement.type;
     constructor.type = constructorType;
     classElement.constructors = <ConstructorElement> [constructor];
     InstanceCreationExpression node = ASTFactory.instanceCreationExpression2(null, ASTFactory.typeName(classElement, []), [ASTFactory.identifier3(constructorName)]);
@@ -10073,8 +9785,8 @@
     ClassElementImpl elementI = ElementFactory.classElement2("I", []);
     ConstructorElementImpl constructor = ElementFactory.constructorElement(elementC, null);
     elementC.constructors = <ConstructorElement> [constructor];
-    constructor.returnType = elementC.type;
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
+    constructorType.returnType = elementC.type;
     constructor.type = constructorType;
     TypeName typeName = ASTFactory.typeName(elementC, [ASTFactory.typeName(elementI, [])]);
     typeName.type = elementC.type.substitute5(<Type2> [elementI.type]);
@@ -10089,8 +9801,8 @@
   void test_visitInstanceCreationExpression_unnamed() {
     ClassElementImpl classElement = ElementFactory.classElement2("C", []);
     ConstructorElementImpl constructor = ElementFactory.constructorElement(classElement, null);
-    constructor.returnType = classElement.type;
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
+    constructorType.returnType = classElement.type;
     constructor.type = constructorType;
     classElement.constructors = <ConstructorElement> [constructor];
     InstanceCreationExpression node = ASTFactory.instanceCreationExpression2(null, ASTFactory.typeName(classElement, []), []);
@@ -10413,7 +10125,7 @@
 
   /**
    * Create a function expression that has an element associated with it, where the element has an
-   * incomplete type associated with it (just like the one[ElementBuilder#visitFunctionExpression] would have built if we had
+   * incomplete type associated with it (just like the one{@link ElementBuilder#visitFunctionExpression(FunctionExpression)} would have built if we had
    * run it).
    * @param parameters the parameters to the function
    * @param body the body of the function
@@ -10817,7 +10529,7 @@
 class LibraryElementBuilderTest extends EngineTestCase {
 
   /**
-   * The source factory used to create [Source sources].
+   * The source factory used to create {@link Source sources}.
    */
   SourceFactory _sourceFactory;
   void setUp() {
@@ -11252,7 +10964,7 @@
     JUnitTestCase.assertNotNull(unit);
     List<ClassElement> classes = unit.types;
     EngineTestCase.assertLength(2, classes);
-    JUnitTestCase.assertFalse(classes[0].isValidMixin);
+    JUnitTestCase.assertFalse(classes[0].isValidMixin());
     assertNoErrors();
     verify([source]);
   }
@@ -11264,7 +10976,7 @@
     JUnitTestCase.assertNotNull(unit);
     List<ClassElement> classes = unit.types;
     EngineTestCase.assertLength(1, classes);
-    JUnitTestCase.assertFalse(classes[0].isValidMixin);
+    JUnitTestCase.assertFalse(classes[0].isValidMixin());
     assertNoErrors();
     verify([source]);
   }
@@ -11276,7 +10988,7 @@
     JUnitTestCase.assertNotNull(unit);
     List<ClassElement> classes = unit.types;
     EngineTestCase.assertLength(1, classes);
-    JUnitTestCase.assertFalse(classes[0].isValidMixin);
+    JUnitTestCase.assertFalse(classes[0].isValidMixin());
     assertNoErrors();
     verify([source]);
   }
@@ -11288,7 +11000,7 @@
     JUnitTestCase.assertNotNull(unit);
     List<ClassElement> classes = unit.types;
     EngineTestCase.assertLength(1, classes);
-    JUnitTestCase.assertTrue(classes[0].isValidMixin);
+    JUnitTestCase.assertTrue(classes[0].isValidMixin());
     assertNoErrors();
     verify([source]);
   }
@@ -11380,7 +11092,7 @@
     verify([source]);
   }
   void test_setter_inherited() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get x => 0;", "  set x(int p) {}", "}", "class B extends A {", "  int get x => super.x == null ? 0 : super.x;", "  int f() => x = 1;", "}"]));
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get x => 0;", "  set x(int p) {}", "}", "class B extends A {", "  int get x => super.x == null ? 0 : super.x;", "  void f() => x = 1;", "}"]));
     resolve(source);
     assertNoErrors();
     verify([source]);
@@ -11395,13 +11107,13 @@
   /**
    * Resolve the given source and verify that the arguments in a specific method invocation were
    * correctly resolved.
-   *
+   * <p>
    * The source is expected to be source for a compilation unit, the first declaration is expected
    * to be a class, the first member of which is expected to be a method with a block body, and the
    * first statement in the body is expected to be an expression statement whose expression is a
    * method invocation. It is the arguments to that method invocation that are tested. The method
    * invocation can contain errors.
-   *
+   * <p>
    * The arguments were resolved correctly if the number of expressions in the list matches the
    * length of the array of indices and if, for each index in the array of indices, the parameter to
    * which the argument expression was resolved is the parameter in the invoked method's list of
@@ -11635,6 +11347,7 @@
 //  CompileTimeErrorCodeTest.dartSuite();
 //  ErrorResolverTest.dartSuite();
 //  NonErrorResolverTest.dartSuite();
+//  PubSuggestionCodeTest.dartSuite();
 //  SimpleResolverTest.dartSuite();
 //  StaticTypeWarningCodeTest.dartSuite();
 //  StaticWarningCodeTest.dartSuite();
diff --git a/pkg/analyzer_experimental/test/generated/scanner_test.dart b/pkg/analyzer_experimental/test/generated/scanner_test.dart
index b48df5f..e9ff970 100644
--- a/pkg/analyzer_experimental/test/generated/scanner_test.dart
+++ b/pkg/analyzer_experimental/test/generated/scanner_test.dart
@@ -53,67 +53,67 @@
 }
 class TokenTypeTest extends EngineTestCase {
   void test_isOperator() {
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isOperator);
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND_AMPERSAND.isOperator);
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BANG.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BANG_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR_BAR.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.CARET.isOperator);
-    JUnitTestCase.assertTrue(TokenType.CARET_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_GT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_GT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX.isOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.IS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_LT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_LT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS_MINUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PERCENT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PERCENT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PERIOD_PERIOD.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS_PLUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.QUESTION.isOperator);
-    JUnitTestCase.assertTrue(TokenType.SLASH.isOperator);
-    JUnitTestCase.assertTrue(TokenType.SLASH_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.STAR.isOperator);
-    JUnitTestCase.assertTrue(TokenType.STAR_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE.isOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isOperator());
+    JUnitTestCase.assertTrue(TokenType.AMPERSAND_AMPERSAND.isOperator());
+    JUnitTestCase.assertTrue(TokenType.AMPERSAND_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.BANG.isOperator());
+    JUnitTestCase.assertTrue(TokenType.BANG_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.BAR.isOperator());
+    JUnitTestCase.assertTrue(TokenType.BAR_BAR.isOperator());
+    JUnitTestCase.assertTrue(TokenType.BAR_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.CARET.isOperator());
+    JUnitTestCase.assertTrue(TokenType.CARET_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.GT.isOperator());
+    JUnitTestCase.assertTrue(TokenType.GT_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.GT_GT.isOperator());
+    JUnitTestCase.assertTrue(TokenType.GT_GT_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.INDEX.isOperator());
+    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.IS.isOperator());
+    JUnitTestCase.assertTrue(TokenType.LT.isOperator());
+    JUnitTestCase.assertTrue(TokenType.LT_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.LT_LT.isOperator());
+    JUnitTestCase.assertTrue(TokenType.LT_LT_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.MINUS.isOperator());
+    JUnitTestCase.assertTrue(TokenType.MINUS_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.MINUS_MINUS.isOperator());
+    JUnitTestCase.assertTrue(TokenType.PERCENT.isOperator());
+    JUnitTestCase.assertTrue(TokenType.PERCENT_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.PERIOD_PERIOD.isOperator());
+    JUnitTestCase.assertTrue(TokenType.PLUS.isOperator());
+    JUnitTestCase.assertTrue(TokenType.PLUS_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.PLUS_PLUS.isOperator());
+    JUnitTestCase.assertTrue(TokenType.QUESTION.isOperator());
+    JUnitTestCase.assertTrue(TokenType.SLASH.isOperator());
+    JUnitTestCase.assertTrue(TokenType.SLASH_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.STAR.isOperator());
+    JUnitTestCase.assertTrue(TokenType.STAR_EQ.isOperator());
+    JUnitTestCase.assertTrue(TokenType.TILDE.isOperator());
+    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isOperator());
+    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH_EQ.isOperator());
   }
   void test_isUserDefinableOperator() {
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.CARET.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.GT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_GT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.LT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_LT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.PERCENT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.SLASH.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.STAR.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.BAR.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.CARET.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.GT.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.GT_EQ.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.GT_GT.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.INDEX.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.LT.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.LT_EQ.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.LT_LT.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.MINUS.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.PERCENT.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.PLUS.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.SLASH.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.STAR.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.TILDE.isUserDefinableOperator());
+    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isUserDefinableOperator());
   }
   static dartSuite() {
     _ut.group('TokenTypeTest', () {
@@ -129,7 +129,7 @@
   }
 }
 /**
- * The class `TokenFactory` defines utility methods that can be used to create tokens.
+ * The class {@code TokenFactory} defines utility methods that can be used to create tokens.
  */
 class TokenFactory {
   static Token token(Keyword keyword) => new KeywordToken(keyword, 0);
@@ -1474,7 +1474,7 @@
   }
 }
 /**
- * Instances of the class `TokenStreamValidator` are used to validate the correct construction
+ * Instances of the class {@code TokenStreamValidator} are used to validate the correct construction
  * of a stream of tokens.
  */
 class TokenStreamValidator {
@@ -2156,7 +2156,7 @@
   }
 }
 /**
- * Instances of the class `ExpectedLocation` encode information about the expected location
+ * Instances of the class {@code ExpectedLocation} encode information about the expected location
  * of a given offset in source code.
  */
 class AbstractScannerTest_ExpectedLocation {
diff --git a/pkg/analyzer_experimental/test/generated/test_support.dart b/pkg/analyzer_experimental/test/generated/test_support.dart
index 6b39ac8..ea44668 100644
--- a/pkg/analyzer_experimental/test/generated/test_support.dart
+++ b/pkg/analyzer_experimental/test/generated/test_support.dart
@@ -12,7 +12,7 @@
 import 'package:analyzer_experimental/src/generated/engine.dart' show AnalysisContext, AnalysisContextImpl, RecordingErrorListener;
 import 'package:unittest/unittest.dart' as _ut;
 /**
- * Instances of the class `GatheringErrorListener` implement an error listener that collects
+ * Instances of the class {@code GatheringErrorListener} implement an error listener that collects
  * all of the errors passed to it for later examination.
  */
 class GatheringErrorListener implements AnalysisErrorListener {
@@ -227,7 +227,7 @@
   List<AnalysisError> get errors => _errors;
 
   /**
-   * Return the line information associated with the given source, or `null` if no line
+   * Return the line information associated with the given source, or {@code null} if no line
    * information has been associated with the source.
    * @param source the source with which the line information is associated
    * @return the line information associated with the source
@@ -235,9 +235,9 @@
   LineInfo getLineInfo(Source source) => _lineInfoMap[source];
 
   /**
-   * Return `true` if an error with the given error code has been gathered.
+   * Return {@code true} if an error with the given error code has been gathered.
    * @param errorCode the error code being searched for
-   * @return `true` if an error with the given error code has been gathered
+   * @return {@code true} if an error with the given error code has been gathered
    */
   bool hasError(ErrorCode errorCode2) {
     for (AnalysisError error in _errors) {
@@ -249,8 +249,8 @@
   }
 
   /**
-   * Return `true` if at least one error has been gathered.
-   * @return `true` if at least one error has been gathered
+   * Return {@code true} if at least one error has been gathered.
+   * @return {@code true} if at least one error has been gathered
    */
   bool hasErrors() => _errors.length > 0;
   void onError(AnalysisError error) {
@@ -281,18 +281,18 @@
   }
 
   /**
-   * Return `true` if the two errors are equivalent.
+   * Return {@code true} if the two errors are equivalent.
    * @param firstError the first error being compared
    * @param secondError the second error being compared
-   * @return `true` if the two errors are equivalent
+   * @return {@code true} if the two errors are equivalent
    */
   bool equals3(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && equals4(firstError.source, secondError.source);
 
   /**
-   * Return `true` if the two sources are equivalent.
+   * Return {@code true} if the two sources are equivalent.
    * @param firstSource the first source being compared
    * @param secondSource the second source being compared
-   * @return `true` if the two sources are equivalent
+   * @return {@code true} if the two sources are equivalent
    */
   bool equals4(Source firstSource, Source secondSource) {
     if (firstSource == null) {
@@ -348,10 +348,10 @@
 
   /**
    * Search through the given list of errors for an error that is equal to the target error. If one
-   * is found, remove it from the list and return `true`, otherwise return `false`without modifying the list.
+   * is found, remove it from the list and return {@code true}, otherwise return {@code false}without modifying the list.
    * @param errors the errors through which we are searching
    * @param targetError the error being searched for
-   * @return `true` if the error is found and removed from the list
+   * @return {@code true} if the error is found and removed from the list
    */
   bool foundAndRemoved(List<AnalysisError> errors, AnalysisError targetError) {
     for (AnalysisError error in errors) {
@@ -364,7 +364,7 @@
   }
 }
 /**
- * The class `EngineTestCase` defines utility methods for making assertions.
+ * The class {@code EngineTestCase} defines utility methods for making assertions.
  */
 class EngineTestCase extends JUnitTestCase {
   static int _PRINT_RANGE = 6;
@@ -388,11 +388,11 @@
   }
 
   /**
-   * Assert that the given array is non-`null` and contains the expected elements. The
+   * Assert that the given array is non-{@code null} and contains the expected elements. The
    * elements can appear in any order.
    * @param array the array being tested
    * @param expectedElements the expected elements
-   * @throws AssertionFailedError if the array is `null` or does not contain the expected
+   * @throws AssertionFailedError if the array is {@code null} or does not contain the expected
    * elements
    */
   static void assertContains(List<Object> array, List<Object> expectedElements) {
@@ -466,10 +466,10 @@
   }
 
   /**
-   * Assert that the given list is non-`null` and has exactly expected elements.
+   * Assert that the given list is non-{@code null} and has exactly expected elements.
    * @param list the list being tested
    * @param expectedElements the expected elements
-   * @throws AssertionFailedError if the list is `null` or does not have the expected elements
+   * @throws AssertionFailedError if the list is {@code null} or does not have the expected elements
    */
   static void assertExactElements(List<Object> list, List<Object> expectedElements) {
     int expectedSize = expectedElements.length;
@@ -489,10 +489,10 @@
   }
 
   /**
-   * Assert that the given array is non-`null` and has exactly expected elements.
+   * Assert that the given array is non-{@code null} and has exactly expected elements.
    * @param array the array being tested
    * @param expectedElements the expected elements
-   * @throws AssertionFailedError if the array is `null` or does not have the expected
+   * @throws AssertionFailedError if the array is {@code null} or does not have the expected
    * elements
    */
   static void assertExactElements2(List<Object> array, List<Object> expectedElements) {
@@ -513,10 +513,10 @@
   }
 
   /**
-   * Assert that the given list is non-`null` and has exactly expected elements.
+   * Assert that the given list is non-{@code null} and has exactly expected elements.
    * @param set the list being tested
    * @param expectedElements the expected elements
-   * @throws AssertionFailedError if the list is `null` or does not have the expected elements
+   * @throws AssertionFailedError if the list is {@code null} or does not have the expected elements
    */
   static void assertExactElements3(Set<Object> set, List<Object> expectedElements) {
     int expectedSize = expectedElements.length;
@@ -549,10 +549,10 @@
   }
 
   /**
-   * Assert that the given array is non-`null` and has the expected number of elements.
+   * Assert that the given array is non-{@code null} and has the expected number of elements.
    * @param expectedLength the expected number of elements
    * @param array the array being tested
-   * @throws AssertionFailedError if the array is `null` or does not have the expected number
+   * @throws AssertionFailedError if the array is {@code null} or does not have the expected number
    * of elements
    */
   static void assertLength(int expectedLength, List<Object> array) {
@@ -582,10 +582,10 @@
   }
 
   /**
-   * Assert that the given list is non-`null` and has the expected number of elements.
+   * Assert that the given list is non-{@code null} and has the expected number of elements.
    * @param expectedSize the expected number of elements
    * @param list the list being tested
-   * @throws AssertionFailedError if the list is `null` or does not have the expected number
+   * @throws AssertionFailedError if the list is {@code null} or does not have the expected number
    * of elements
    */
   static void assertSize(int expectedSize, List<Object> list) {
@@ -597,10 +597,10 @@
   }
 
   /**
-   * Assert that the given map is non-`null` and has the expected number of elements.
+   * Assert that the given map is non-{@code null} and has the expected number of elements.
    * @param expectedSize the expected number of elements
    * @param map the map being tested
-   * @throws AssertionFailedError if the map is `null` or does not have the expected number of
+   * @throws AssertionFailedError if the map is {@code null} or does not have the expected number of
    * elements
    */
   static void assertSize2(int expectedSize, Map<Object, Object> map) {
@@ -612,10 +612,10 @@
   }
 
   /**
-   * Assert that the given set is non-`null` and has the expected number of elements.
+   * Assert that the given set is non-{@code null} and has the expected number of elements.
    * @param expectedSize the expected number of elements
    * @param set the set being tested
-   * @throws AssertionFailedError if the set is `null` or does not have the expected number of
+   * @throws AssertionFailedError if the set is {@code null} or does not have the expected number of
    * elements
    */
   static void assertSize3(int expectedSize, Set<Object> set) {
@@ -696,7 +696,7 @@
    */
   PropertyAccessorElement getGetter(InterfaceType type, String getterName) {
     for (PropertyAccessorElement accessor in type.element.accessors) {
-      if (accessor.isGetter && accessor.name == getterName) {
+      if (accessor.isGetter() && accessor.name == getterName) {
         return accessor;
       }
     }
@@ -751,7 +751,7 @@
     throw new UnsupportedOperationException();
   }
   bool exists() => true;
-  bool get isInSystemLibrary {
+  bool isInSystemLibrary() {
     throw new UnsupportedOperationException();
   }
   Source resolve(String uri) {
diff --git a/pkg/analyzer_experimental/test/services/test_utils.dart b/pkg/analyzer_experimental/test/services/test_utils.dart
index e8757a4..2128aaa 100644
--- a/pkg/analyzer_experimental/test/services/test_utils.dart
+++ b/pkg/analyzer_experimental/test/services/test_utils.dart
@@ -178,7 +178,7 @@
 
   bool exists() => true;
 
-  bool get isInSystemLibrary => _unsupported();
+  bool isInSystemLibrary() => _unsupported();
 
   Source resolve(String uri) => _unsupported();
 
diff --git a/pkg/args/lib/args.dart b/pkg/args/lib/args.dart
index 9e6252a..3898b9f 100644
--- a/pkg/args/lib/args.dart
+++ b/pkg/args/lib/args.dart
@@ -257,8 +257,6 @@
 
 import 'src/parser.dart';
 import 'src/usage.dart';
-import 'src/options.dart';
-export 'src/options.dart';
 
 /**
  * A class for taking a list of raw command line arguments and parsing out
@@ -379,6 +377,52 @@
 }
 
 /**
+ * A command-line option. Includes both flags and options which take a value.
+ */
+class Option {
+  final String name;
+  final String abbreviation;
+  final List<String> allowed;
+  final defaultValue;
+  final Function callback;
+  final String help;
+  final Map<String, String> allowedHelp;
+  final bool isFlag;
+  final bool negatable;
+  final bool allowMultiple;
+
+  Option(this.name, this.abbreviation, this.help, this.allowed,
+      this.allowedHelp, this.defaultValue, this.callback, {this.isFlag,
+      this.negatable, this.allowMultiple: false}) {
+
+    if (name.isEmpty) {
+      throw new ArgumentError('Name cannot be empty.');
+    } else if (name.startsWith('-')) {
+      throw new ArgumentError('Name $name cannot start with "-".');
+    }
+
+    // Ensure name does not contain any invalid characters.
+    if (_invalidChars.hasMatch(name)) {
+      throw new ArgumentError('Name "$name" contains invalid characters.');
+    }
+
+    if (abbreviation != null) {
+      if (abbreviation.length != 1) {
+        throw new ArgumentError('Abbreviation must be null or have length 1.');
+      } else if(abbreviation == '-') {
+        throw new ArgumentError('Abbreviation cannot be "-".');
+      }
+
+      if (_invalidChars.hasMatch(abbreviation)) {
+        throw new ArgumentError('Abbreviation is an invalid character.');
+      }
+    }
+  }
+
+  static final _invalidChars = new RegExp(r'''[ \t\r\n"'\\/]''');
+}
+
+/**
  * The results of parsing a series of command line arguments using
  * [ArgParser.parse()]. Includes the parsed options and any remaining unparsed
  * command line arguments.
diff --git a/runtime/bin/directory_win.cc b/runtime/bin/directory_win.cc
index e8dc694..22c7a3a 100644
--- a/runtime/bin/directory_win.cc
+++ b/runtime/bin/directory_win.cc
@@ -20,7 +20,7 @@
 namespace bin {
 
 PathBuffer::PathBuffer() : length_(0) {
-  data_ = calloc(PATH_MAX + 1,  sizeof(wchar_t));  // NOLINT
+  data_ = calloc(MAX_PATH + 1,  sizeof(wchar_t));  // NOLINT
 }
 
 char* PathBuffer::AsString() const {
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 2d40f2d..80b369c 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -129,14 +129,11 @@
     return _substringMatches(this.length - other.length, other);
   }
 
-  bool startsWith(Pattern pattern, [int index = 0]) {
-    if (index < 0 || index > this.length) {
-      throw new RangeError.range(index, 0, this.length);
-    }
+  bool startsWith(Pattern pattern) {
     if (pattern is String) {
-      return _substringMatches(index, pattern);
+      return _substringMatches(0, pattern);
     }
-    return pattern.matchAsPrefix(this, index) != null;
+    return pattern.matchAsPrefix(this, 0) != null;
   }
 
   int indexOf(Pattern pattern, [int start = 0]) {
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 912bb86..6eec38d 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -38,7 +38,7 @@
     "Trace IC miss in optimized code");
 DEFINE_FLAG(bool, trace_patching, false, "Trace patching of code.");
 DEFINE_FLAG(bool, trace_runtime_calls, false, "Trace runtime calls");
-DEFINE_FLAG(int, optimization_counter_threshold, 15000,
+DEFINE_FLAG(int, optimization_counter_threshold, 3000,
     "Function's usage-counter value before it is optimized, -1 means never");
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, trace_type_checks);
@@ -871,12 +871,12 @@
 static RawFunction* InlineCacheMissHandler(
     const GrowableArray<const Instance*>& args,
     const ICData& ic_data,
-    const Array& args_descriptor_array) {
+    const Array& arg_descriptor_array) {
   const Instance& receiver = *args[0];
   const Code& target_code =
       Code::Handle(ResolveCompileInstanceCallTarget(receiver,
                                                     ic_data,
-                                                    args_descriptor_array));
+                                                    arg_descriptor_array));
   if (target_code.IsNull()) {
     // Let the megamorphic stub handle special cases: NoSuchMethod,
     // closure calls.
@@ -1226,42 +1226,6 @@
 }
 
 
-static bool CanOptimizeFunction(const Function& function, Isolate* isolate) {
-  const intptr_t kLowInvocationCount = -100000000;
-  if (isolate->debugger()->HasBreakpoint(function)) {
-    // We cannot set breakpoints in optimized code, so do not optimize
-    // the function.
-    function.set_usage_counter(0);
-    return false;
-  }
-  if (function.deoptimization_counter() >=
-      FLAG_deoptimization_counter_threshold) {
-    if (FLAG_trace_failed_optimization_attempts) {
-      OS::PrintErr("Too Many Deoptimizations: %s\n",
-          function.ToFullyQualifiedCString());
-    }
-    // TODO(srdjan): Investigate excessive deoptimization.
-    function.set_usage_counter(kLowInvocationCount);
-    return false;
-  }
-  if ((FLAG_optimization_filter != NULL) &&
-      (strstr(function.ToFullyQualifiedCString(),
-              FLAG_optimization_filter) == NULL)) {
-    function.set_usage_counter(kLowInvocationCount);
-    return false;
-  }
-  if (!function.is_optimizable()) {
-    if (FLAG_trace_failed_optimization_attempts) {
-      OS::PrintErr("Not Optimizable: %s\n", function.ToFullyQualifiedCString());
-    }
-    // TODO(5442338): Abort as this should not happen.
-    function.set_usage_counter(kLowInvocationCount);
-    return false;
-  }
-  return true;
-}
-
-
 DEFINE_RUNTIME_ENTRY(StackOverflow, 0) {
   ASSERT(arguments.ArgCount() ==
          kStackOverflowRuntimeEntry.argument_count());
@@ -1314,7 +1278,7 @@
     StackFrame* frame = iterator.NextFrame();
     const Function& function = Function::Handle(frame->LookupDartFunction());
     ASSERT(!function.IsNull());
-    if (!CanOptimizeFunction(function, isolate)) return;
+    if (!function.is_optimizable()) return;
     intptr_t osr_id =
         Code::Handle(function.unoptimized_code()).GetDeoptIdForOsr(frame->pc());
     if (FLAG_trace_osr) {
@@ -1368,10 +1332,35 @@
 DEFINE_RUNTIME_ENTRY(OptimizeInvokedFunction, 1) {
   ASSERT(arguments.ArgCount() ==
          kOptimizeInvokedFunctionRuntimeEntry.argument_count());
+  const intptr_t kLowInvocationCount = -100000000;
   const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
   ASSERT(!function.IsNull());
-
-  if (CanOptimizeFunction(function, isolate)) {
+  if (isolate->debugger()->HasBreakpoint(function)) {
+    // We cannot set breakpoints in optimized code, so do not optimize
+    // the function.
+    function.set_usage_counter(0);
+    arguments.SetReturn(Code::Handle(function.CurrentCode()));
+    return;
+  }
+  if (function.deoptimization_counter() >=
+      FLAG_deoptimization_counter_threshold) {
+    if (FLAG_trace_failed_optimization_attempts) {
+      OS::PrintErr("Too Many Deoptimizations: %s\n",
+          function.ToFullyQualifiedCString());
+    }
+    // TODO(srdjan): Investigate excessive deoptimization.
+    function.set_usage_counter(kLowInvocationCount);
+    arguments.SetReturn(Code::Handle(function.CurrentCode()));
+    return;
+  }
+  if ((FLAG_optimization_filter != NULL) &&
+      (strstr(function.ToFullyQualifiedCString(),
+              FLAG_optimization_filter) == NULL)) {
+    function.set_usage_counter(kLowInvocationCount);
+    arguments.SetReturn(Code::Handle(function.CurrentCode()));
+    return;
+  }
+  if (function.is_optimizable()) {
     const Error& error =
         Error::Handle(Compiler::CompileOptimizedFunction(function));
     if (!error.IsNull()) {
@@ -1381,6 +1370,12 @@
     ASSERT(!optimized_code.IsNull());
     // Reset usage counter for reoptimization.
     function.set_usage_counter(0);
+  } else {
+    if (FLAG_trace_failed_optimization_attempts) {
+      OS::PrintErr("Not Optimizable: %s\n", function.ToFullyQualifiedCString());
+    }
+    // TODO(5442338): Abort as this should not happen.
+    function.set_usage_counter(kLowInvocationCount);
   }
   arguments.SetReturn(Code::Handle(function.CurrentCode()));
 }
diff --git a/runtime/vm/code_patcher_arm_test.cc b/runtime/vm/code_patcher_arm_test.cc
index 0f1e513..6fbd1a3 100644
--- a/runtime/vm/code_patcher_arm_test.cc
+++ b/runtime/vm/code_patcher_arm_test.cc
@@ -58,10 +58,10 @@
   const String& target_name = String::Handle(String::New("targetFunction"));
   const ICData& ic_data =
       ICData::ZoneHandle(ICData::New(function, target_name, 15, 1));
-  const Array& args_descriptor =
+  const Array& arg_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(1, Array::Handle()));
 
-  __ LoadObject(R4, args_descriptor);
+  __ LoadObject(R4, arg_descriptor);
   __ LoadObject(R5, ic_data);
   ExternalLabel target_label(
       "InlineCache", StubCode::OneArgCheckInlineCacheEntryPoint());
diff --git a/runtime/vm/code_patcher_ia32_test.cc b/runtime/vm/code_patcher_ia32_test.cc
index 87cb8f6..2bb6601 100644
--- a/runtime/vm/code_patcher_ia32_test.cc
+++ b/runtime/vm/code_patcher_ia32_test.cc
@@ -58,11 +58,11 @@
   const String& target_name = String::Handle(String::New("targetFunction"));
   const ICData& ic_data =
       ICData::ZoneHandle(ICData::New(function, target_name, 15, 1));
-  const Array& args_descriptor =
+  const Array& arg_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(1, Array::Handle()));
 
   __ LoadObject(ECX, ic_data);
-  __ LoadObject(EDX, args_descriptor);
+  __ LoadObject(EDX, arg_descriptor);
   ExternalLabel target_label(
       "InlineCache", StubCode::OneArgCheckInlineCacheEntryPoint());
   __ call(&target_label);
diff --git a/runtime/vm/code_patcher_mips_test.cc b/runtime/vm/code_patcher_mips_test.cc
index 1194289..9d0a681 100644
--- a/runtime/vm/code_patcher_mips_test.cc
+++ b/runtime/vm/code_patcher_mips_test.cc
@@ -58,10 +58,10 @@
   const String& target_name = String::Handle(String::New("targetFunction"));
   const ICData& ic_data =
       ICData::ZoneHandle(ICData::New(function, target_name, 15, 1));
-  const Array& args_descriptor =
+  const Array& arg_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(1, Array::Handle()));
 
-  __ LoadObject(S4, args_descriptor);
+  __ LoadObject(S4, arg_descriptor);
   __ LoadObject(S5, ic_data);
   ExternalLabel target_label(
       "InlineCache", StubCode::OneArgCheckInlineCacheEntryPoint());
diff --git a/runtime/vm/code_patcher_x64_test.cc b/runtime/vm/code_patcher_x64_test.cc
index 1da28a5..61807b3 100644
--- a/runtime/vm/code_patcher_x64_test.cc
+++ b/runtime/vm/code_patcher_x64_test.cc
@@ -58,11 +58,11 @@
   const String& target_name = String::Handle(String::New("targetFunction"));
   const ICData& ic_data =
       ICData::ZoneHandle(ICData::New(function, target_name, 15, 1));
-  const Array& args_descriptor =
+  const Array& arg_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(1, Array::Handle()));
 
   __ LoadObject(RBX, ic_data);
-  __ LoadObject(R10, args_descriptor);
+  __ LoadObject(R10, arg_descriptor);
   ExternalLabel target_label(
       "InlineCache", StubCode::OneArgCheckInlineCacheEntryPoint());
   __ call(&target_label);
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 1b1ef1d..0fba07c 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -268,11 +268,14 @@
         ASSERT(function.HasCode());
         // Extract type feedback before the graph is built, as the graph
         // builder uses it to attach it to nodes.
-        ASSERT(function.deoptimization_counter() <
-               FLAG_deoptimization_counter_threshold);
-        const Code& unoptimized_code =
-            Code::Handle(function.unoptimized_code());
-        ic_data_array = unoptimized_code.ExtractTypeFeedbackArray();
+        // Do not use type feedback to optimize a function that was
+        // deoptimized too often.
+        if (function.deoptimization_counter() <
+            FLAG_deoptimization_counter_threshold) {
+          const Code& unoptimized_code =
+              Code::Handle(function.unoptimized_code());
+          ic_data_array = unoptimized_code.ExtractTypeFeedbackArray();
+        }
       }
 
       // Build the flow graph.
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index f8d48be..8b82f4c 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1568,9 +1568,9 @@
       const Code& code =
           Code::Handle(Function::Handle(bpt->function_).unoptimized_code());
       CodePatcher::GetInstanceCallAt(bpt->pc_, code, &ic_data, &descriptor);
-      ArgumentsDescriptor args_descriptor(descriptor);
+      ArgumentsDescriptor arg_descriptor(descriptor);
       ActivationFrame* top_frame = stack_trace->ActivationFrameAt(0);
-      intptr_t num_args = args_descriptor.Count();
+      intptr_t num_args = arg_descriptor.Count();
       Instance& receiver =
           Instance::Handle(top_frame->GetInstanceCallReceiver(num_args));
       Code& target_code =
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index c63b362..d878f8d 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -60,12 +60,6 @@
 }
 
 
-static intptr_t NextInstructionPos(intptr_t pos) {
-  ASSERT(IsInstructionStartPosition(pos));
-  return pos + 2;
-}
-
-
 FlowGraphAllocator::FlowGraphAllocator(const FlowGraph& flow_graph)
   : flow_graph_(flow_graph),
     reaching_defs_(flow_graph),
@@ -518,16 +512,6 @@
         range->DefineAt(catch_entry->start_pos());  // Defined at block entry.
         ProcessInitialDefinition(defn, range, catch_entry);
       }
-      // Block the two registers used by CatchEntryInstr from the block start to
-      // until the end of the instruction so that they are preserved.
-      ASSERT(catch_entry->next()->IsCatchEntry());
-      intptr_t start = catch_entry->start_pos();
-      BlockLocation(Location::RegisterLocation(kExceptionObjectReg),
-                    start,
-                    ToInstructionEnd(NextInstructionPos(start)));
-      BlockLocation(Location::RegisterLocation(kStackTraceObjectReg),
-                    start,
-                    ToInstructionEnd(NextInstructionPos(start)));
     }
   }
 
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 295073b..07cc65a 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -30,7 +30,6 @@
 DECLARE_FLAG(bool, report_usage_count);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, use_cha);
-DECLARE_FLAG(bool, use_osr);
 
 
 // Assign locations to incoming arguments, i.e., values pushed above spill slots
@@ -165,11 +164,6 @@
 }
 
 
-bool FlowGraphCompiler::CanOSRFunction() const {
-  return FLAG_use_osr & CanOptimizeFunction() && !is_optimizing();
-}
-
-
 static bool IsEmptyBlock(BlockEntryInstr* block) {
   return !block->HasParallelMove() &&
          block->next()->IsGoto() &&
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 0af785d..6dbcaa4 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -258,7 +258,6 @@
   }
   static bool CanOptimize();
   bool CanOptimizeFunction() const;
-  bool CanOSRFunction() const;
   bool is_optimizing() const { return is_optimizing_; }
 
   const GrowableArray<BlockInfo*>& block_info() const { return block_info_; }
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index ba68855..eacd243 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -1714,11 +1714,6 @@
 }
 
 
-// When the parser is building an implicit static getter for optimization,
-// it can generate a function body where deoptimization ids do not line up
-// with the unoptimized code.
-//
-// This is safe only so long as LoadStaticFieldInstr cannot deoptimize.
 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register field = locs()->in(0).reg();
   Register result = locs()->out().reg();
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 03d011b..444cd5c 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -1772,11 +1772,6 @@
 }
 
 
-// When the parser is building an implicit static getter for optimization,
-// it can generate a function body where deoptimization ids do not line up
-// with the unoptimized code.
-//
-// This is safe only so long as LoadStaticFieldInstr cannot deoptimize.
 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register field = locs()->in(0).reg();
   Register result = locs()->out().reg();
@@ -2152,7 +2147,7 @@
   __ cmpl(ESP,
           Address::Absolute(Isolate::Current()->stack_limit_address()));
   __ j(BELOW_EQUAL, slow_path->entry_label());
-  if (compiler->CanOSRFunction() && in_loop()) {
+  if (FLAG_use_osr && !compiler->is_optimizing() && in_loop()) {
     // In unoptimized code check the usage counter to trigger OSR at loop
     // stack checks.
     __ LoadObject(EDI, compiler->parsed_function().function());
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 8f4db82..813378d 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -1773,11 +1773,6 @@
 }
 
 
-// When the parser is building an implicit static getter for optimization,
-// it can generate a function body where deoptimization ids do not line up
-// with the unoptimized code.
-//
-// This is safe only so long as LoadStaticFieldInstr cannot deoptimize.
 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("LoadStaticFieldInstr");
   Register field = locs()->in(0).reg();
@@ -2416,7 +2411,7 @@
         ASSERT(kSmiTagSize == 1);
         __ sra(TMP, left, 31);
         ASSERT(shift_count > 1);  // 1, -1 case handled above.
-        __ srl(TMP, TMP, 32 - shift_count);
+        __ sll(TMP, TMP, 32 - shift_count);
         __ addu(left, left, TMP);
         ASSERT(shift_count > 0);
         __ sra(result, left, shift_count);
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index ce0e778..a55f175 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -1754,11 +1754,6 @@
 }
 
 
-// When the parser is building an implicit static getter for optimization,
-// it can generate a function body where deoptimization ids do not line up
-// with the unoptimized code.
-//
-// This is safe only so long as LoadStaticFieldInstr cannot deoptimize.
 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register field = locs()->in(0).reg();
   Register result = locs()->out().reg();
@@ -2137,7 +2132,7 @@
   __ movq(temp, Immediate(Isolate::Current()->stack_limit_address()));
   __ cmpq(RSP, Address(temp, 0));
   __ j(BELOW_EQUAL, slow_path->entry_label());
-  if (compiler->CanOSRFunction() && in_loop()) {
+  if (FLAG_use_osr && !compiler->is_optimizing() && in_loop()) {
     // In unoptimized code check the usage counter to trigger OSR at loop
     // stack checks.
     __ LoadObject(temp, compiler->parsed_function().function());
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index ac0a972..0aec272 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -920,21 +920,6 @@
   const Field& field =
       Field::ZoneHandle(field_class.LookupStaticField(field_name));
 
-  if (!field.is_const() &&
-      (field.value() != Object::transition_sentinel().raw()) &&
-      (field.value() != Object::sentinel().raw())) {
-    // The field has already been initialized at compile time (this can
-    // happen, e.g., if we are recompiling for optimization).  There is no
-    // need to check for initialization and compile the potentially very
-    // large initialization code.  By skipping this code, the deoptimization
-    // ids will not line up with the original code, but this is safe because
-    // LoadStaticField does not deoptimize.
-    LoadStaticFieldNode* load_node = new LoadStaticFieldNode(ident_pos, field);
-    ReturnNode* return_node = new ReturnNode(ident_pos, load_node);
-    current_block_->statements->Add(return_node);
-    return CloseBlock();
-  }
-
   // Static const fields must have an initializer.
   ExpectToken(Token::kASSIGN);
 
@@ -8287,13 +8272,13 @@
     ASSERT(arg->IsLiteralNode());
     arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal());
   }
-  const Array& args_descriptor =
+  const Array& arg_descriptor =
       Array::Handle(ArgumentsDescriptor::New(num_arguments,
                                              arguments->names()));
   const Object& result =
       Object::Handle(DartEntry::InvokeFunction(constructor,
                                                arg_values,
-                                               args_descriptor));
+                                               arg_descriptor));
   if (result.IsError()) {
       // An exception may not occur in every parse attempt, i.e., the
       // generated AST is not deterministic. Therefore mark the function as
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 8567adb..5afa2a0 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -98,6 +98,13 @@
   ClassElement jsIndexingBehaviorInterface;
 
   /**
+   * A collection of selectors of intercepted method calls. The
+   * emitter uses this set to generate the [:ObjectInterceptor:] class
+   * whose members just forward the call to the intercepted receiver.
+   */
+  final Set<Selector> usedInterceptors;
+
+  /**
    * A collection of selectors that must have a one shot interceptor
    * generated.
    */
@@ -158,6 +165,7 @@
 
   JavaScriptBackend(Compiler compiler, bool generateSourceMap, bool disableEval)
       : namer = determineNamer(compiler),
+        usedInterceptors = new Set<Selector>(),
         oneShotInterceptors = new Map<String, Selector>(),
         interceptedElements = new Map<SourceString, Set<Element>>(),
         rti = new RuntimeTypes(compiler),
@@ -185,6 +193,10 @@
     return false;
   }
 
+  void addInterceptedSelector(Selector selector) {
+    usedInterceptors.add(selector);
+  }
+
   String registerOneShotInterceptor(Selector selector) {
     Set<ClassElement> classes = getInterceptedClassesOn(selector.name);
     String name = namer.getOneShotInterceptorName(selector, classes);
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 06e1f99b..7721152 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -75,7 +75,6 @@
   final List<ClassElement> nativeClasses = <ClassElement>[];
   final List<Selector> trivialNsmHandlers = <Selector>[];
   final Map<String, String> mangledFieldNames = <String, String>{};
-  final Set<String> interceptorInvocationNames = new Set<String>();
 
   // TODO(ngeoffray): remove this field.
   Set<ClassElement> instantiatedClasses;
@@ -959,7 +958,6 @@
       count++;
       parametersBuffer[0] = new jsAst.Parameter(receiverArgumentName);
       argumentsBuffer[0] = js(receiverArgumentName);
-      interceptorInvocationNames.add(invocationName);
     }
 
     int optionalParameterStart = positionalArgumentCount + extraArgumentCount;
@@ -1177,9 +1175,6 @@
       jsAst.Expression code = backend.generatedCode[member];
       if (code == null) return;
       String name = namer.getName(member);
-      if (backend.isInterceptedMethod(member)) {
-        interceptorInvocationNames.add(name);
-      }
       builder.addProperty(name, code);
       var metadata = buildMetadataFunction(member);
       if (metadata != null) {
@@ -2982,21 +2977,18 @@
    * method with an extra parameter.
    */
   void emitInterceptedNames(CodeBuffer buffer) {
-    // TODO(ahe): We should not generate the list of intercepted names at
-    // compile time, it can be generated automatically at runtime given
-    // subclasses of Interceptor (which can easily be identified).
     if (!compiler.enabledInvokeOn) return;
     String name = backend.namer.getName(backend.interceptedNames);
 
     int index = 0;
-    var invocationNames = interceptorInvocationNames.toList()..sort();
-    List<jsAst.ArrayElement> elements = invocationNames.map(
-      (String invocationName) {
-        jsAst.Literal str = js.string(invocationName);
+    List<jsAst.ArrayElement> elements = backend.usedInterceptors.map(
+      (Selector selector) {
+        jsAst.Literal str = js.string(namer.invocationName(selector));
         return new jsAst.ArrayElement(index++, str);
       }).toList();
-    jsAst.ArrayInitializer array =
-        new jsAst.ArrayInitializer(invocationNames.length, elements);
+    jsAst.ArrayInitializer array = new jsAst.ArrayInitializer(
+        backend.usedInterceptors.length,
+        elements);
 
     jsAst.Expression assignment = js('$isolateProperties.$name = #', array);
 
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 13b2ebf..75d6443 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -1242,15 +1242,6 @@
       }
     }
 
-    // Don't inline if the return type was inferred to be non-null empty. This
-    // means that the function always throws an exception.
-    TypeMask returnType =
-        compiler.typesTask.getGuaranteedReturnTypeOfElement(element);
-    if (returnType != null && returnType.isEmpty && !returnType.isNullable) {
-      isReachable = false;
-      return false;
-    }
-
     FunctionExpression functionExpression = function.parseNode(compiler);
     TreeElements newElements =
         compiler.enqueuer.resolution.getCachedElements(function);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index dd45355..b4f0d92 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -1550,6 +1550,12 @@
     return receiverType.refine(selector, compiler);
   }
 
+  void registerInvoke(HInvokeDynamic node, Selector selector) {
+    if (node.isInterceptedCall) {
+      backend.addInterceptedSelector(selector);
+    }
+  }
+
   void registerMethodInvoke(HInvokeDynamic node) {
     Selector selector = getOptimizedSelectorFor(node, node.selector);
 
@@ -1573,6 +1579,7 @@
       SourceString name = node.selector.name;
       world.registerDynamicInvocation(name, selector);
     }
+    registerInvoke(node, selector);
   }
 
   void registerSetter(HInvokeDynamic node) {
@@ -1581,6 +1588,7 @@
     HType valueType = node.isInterceptedCall
         ? node.inputs[2].instructionType
         : node.inputs[1].instructionType;
+    registerInvoke(node, selector);
   }
 
   void registerGetter(HInvokeDynamic node) {
@@ -1588,6 +1596,7 @@
     world.registerDynamicGetter(selector.name, selector);
     world.registerInstantiatedClass(
         compiler.functionClass, work.resolutionTree);
+    registerInvoke(node, selector);
   }
 
   visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
index 146ffdb..9ff7a6c 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
@@ -331,6 +331,10 @@
         instruction, input, compiler);
   }
 
+  HType visitNot(HNot instruction) {
+    return HType.BOOLEAN;
+  }
+
   HType visitPhi(HPhi phi) {
     // Best case scenario for a phi is, when all inputs have the same type. If
     // there is no desired outgoing type we therefore try to unify the input
@@ -451,9 +455,6 @@
     // TODO(ngeoffray): Allow speculative optimizations on
     // non-primitive types?
     if (!desiredType.isPrimitive(compiler)) return newType;
-    // It's not worth having a bailout method just because we want a
-    // boolean. Comparing to true is enough.
-    if (desiredType.isBooleanOrNull()) return newType;
     desiredType = newType.intersection(desiredType, compiler);
     if (desiredType != newType && !hasBeenSpeculativelyOptimized(instruction)) {
       savedTypes[instruction] = oldType;
diff --git a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
index 24634c3..ee5ccd5 100644
--- a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
@@ -470,10 +470,6 @@
     throw new UnsupportedError("");
   }
 
-  bool get isContainer {
-    throw new UnsupportedError("");
-  }
-
   bool containsOnlyInt(Compiler compiler) {
     throw new UnsupportedError("");
   }
diff --git a/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart b/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart
index 14bd037..04c9923 100644
--- a/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart
@@ -95,8 +95,6 @@
       var internal = inferrer.internal;
       // Walk over all created [ContainerTypeMask].
       internal.concreteTypes.values.forEach((ContainerTypeMask mask) {
-        // The element type has already been set for const containers.
-        if (mask.elementType != null) return;
         mask.elementType = new TracerForConcreteContainer(
             mask, this, compiler, inferrer).run();
       });
diff --git a/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart
index 8d5894b..75e35e1 100644
--- a/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart
@@ -60,11 +60,11 @@
   final Map<Element, TypeMask> fieldsInitializedInConstructor;
   final bool inTryBlock;
   bool isThisExposed;
-  bool seenReturnOrThrow = false;
+  bool seenReturn = false;
   bool seenBreakOrContinue = false;
 
   bool get aborts {
-    return seenReturnOrThrow || seenBreakOrContinue;
+    return seenReturn || seenBreakOrContinue;
   }
 
   LocalsHandler(this.inferrer, this.compiler)
@@ -183,7 +183,7 @@
       fieldsInitializedInConstructor.remove(element);
     });
     isThisExposed = isThisExposed || other.isThisExposed;
-    seenReturnOrThrow = seenReturnOrThrow && other.seenReturnOrThrow;
+    seenReturn = seenReturn && other.seenReturn;
     seenBreakOrContinue = seenBreakOrContinue && other.seenBreakOrContinue;
 
     return changed;
@@ -591,7 +591,7 @@
 
   TypeMask visitThrow(Throw node) {
     node.visitChildren(this);
-    locals.seenReturnOrThrow = true;
+    locals.seenReturn = true;
     return inferrer.dynamicType;
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
index 1d191c4..634a542 100644
--- a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
@@ -246,7 +246,7 @@
    * returns that type.
    *
    */
-  final Map<Node, CallSite> setterConstraints = new Map<Node, CallSite>();
+  final Map<Node, Selector> setterConstraints = new Map<Node, Selector>();
 
   /**
    * The work list of the inferrer.
@@ -861,7 +861,7 @@
                              Element caller,
                              Element callee,
                              ArgumentsTypes arguments,
-                             CallSite constraint,
+                             Selector constraint,
                              SideEffects sideEffects,
                              bool inLoop) {
     updateSideEffects(sideEffects, selector, callee);
@@ -892,10 +892,7 @@
 
     if (selector.isSetter() && callee.isField()) {
       recordNonFinalFieldElementType(
-          node,
-          callee,
-          arguments.positional[0],
-          constraint);
+          node, callee, arguments.positional[0], constraint);
       return;
     } else if (selector.isGetter()) {
       assert(arguments == null);
@@ -1030,7 +1027,7 @@
                                   TypeMask receiverType,
                                   Element caller,
                                   ArgumentsTypes arguments,
-                                  CallSite constraint,
+                                  Selector constraint,
                                   SideEffects sideEffects,
                                   bool inLoop) {
     TypeMask result;
@@ -1079,7 +1076,7 @@
   void recordNonFinalFieldElementType(Node node,
                                       Element element,
                                       TypeMask argumentType,
-                                      CallSite constraint) {
+                                      Selector constraint) {
     Map<Node, TypeMask> map =
         typeOfFields.putIfAbsent(element, () => new Map<Node, TypeMask>());
     map[node] = argumentType;
@@ -1096,10 +1093,10 @@
   }
 
   TypeMask computeFieldTypeWithConstraints(Element element, Map types) {
-    List<CallSite> constraints = <CallSite>[];
+    Set<Selector> constraints = new Set<Selector>();
     TypeMask fieldType;
     types.forEach((Node node, TypeMask mask) {
-      CallSite constraint = setterConstraints[node];
+      Selector constraint = setterConstraints[node];
       if (constraint != null) {
         // If this update has a constraint, we collect it and don't
         // use its type.
@@ -1117,23 +1114,18 @@
       TypeMask existing = typeOf[element];
       typeOf[element] = fieldType;
 
-      for (CallSite constraint in constraints) {
-        Selector selector = constraint.selector;
-        TypeMask type;
-        if (selector.isOperator()) {
+      for (Selector constraint in constraints) {
+        if (constraint.isOperator()) {
           // If the constraint is on an operator, we type the receiver
           // to be the field.
           if (fieldType != null) {
-            selector = new TypedSelector(fieldType, selector);
+            constraint = new TypedSelector(fieldType, constraint);
           }
-          type = handleIntrisifiedSelector(selector, constraint.arguments);
-          if (type == null) type = typeOfSelector(selector);
         } else {
           // Otherwise the constraint is on the form [: field = other.field :].
-          assert(selector.isGetter());
-          type = typeOfSelector(selector);
+          assert(constraint.isGetter());
         }
-        fieldType = computeLUB(fieldType, type, compiler);
+        fieldType = computeLUB(fieldType, typeOfSelector(constraint), compiler);
       }
       if (existing == null) {
         typeOf.remove(element);
@@ -1175,7 +1167,7 @@
                             Element constructor,
                             Element field,
                             TypeMask type,
-                            CallSite constraint) {
+                            Selector constraint) {
     if (constraint != null) {
       setterConstraints[node] = constraint;
     }
@@ -1219,14 +1211,6 @@
   }
 }
 
-class CallSite {
-  final Selector selector;
-  final ArgumentsTypes arguments;
-  CallSite(this.selector, this.arguments) {
-    assert(selector != null);
-  }
-}
-
 /**
  * Placeholder for inferred arguments types on sends.
  */
@@ -1378,11 +1362,8 @@
       visit(node.body);
       if (returnType == null) {
         // No return in the body.
-        returnType = locals.seenReturnOrThrow
-            ? new TypeMask.nonNullEmpty()  // Body always throws.
-            : inferrer.nullType;
-      } else if (!locals.seenReturnOrThrow &&
-                 !inferrer.isDynamicType(returnType)) {
+        returnType = inferrer.nullType;
+      } else if (!locals.seenReturn && !inferrer.isDynamicType(returnType)) {
         // We haven't seen returns on all branches. So the method may
         // also return null.
         returnType = returnType.nullable();
@@ -1409,7 +1390,7 @@
       });
       // TODO(ngeoffray): Re-analyze method if [changed]?
     }
-    compiler.world.registerSideEffects(analyzedElement, sideEffects);
+    compiler.world.registerSideEffects(analyzedElement, sideEffects);    
     assert(breaksFor.isEmpty);
     assert(continuesFor.isEmpty);
     return returnType;
@@ -1446,25 +1427,11 @@
   }
 
   TypeMask visitLiteralList(LiteralList node) {
-    if (node.isConst()) {
-      // We only set the type once. We don't need to re-visit the children
-      // when re-analyzing the node.
-      return inferrer.concreteTypes.putIfAbsent(node, () {
-        ContainerTypeMask container = new ContainerTypeMask(
-            inferrer.constListType, node, outermostElement);
-        TypeMask elementType = new TypeMask.nonNullEmpty();
-        for (Node element in node.elements.nodes) {
-          elementType = computeLUB(elementType, visit(element), compiler);
-        }
-        container.elementType = elementType;
-        return container;
-      });
-    } else {
-      node.visitChildren(this);
-      return inferrer.concreteTypes.putIfAbsent(
-        node, () => new ContainerTypeMask(
-            inferrer.growableListType, node, outermostElement));
-    }
+    node.visitChildren(this);
+    if (node.isConst()) return inferrer.constListType;
+    return inferrer.concreteTypes.putIfAbsent(
+      node, () => new ContainerTypeMask(
+          inferrer.growableListType, node, outermostElement));
   }
 
   bool isThisOrSuper(Node node) => node.isThis() || node.isSuper();
@@ -1588,14 +1555,14 @@
           node.arguments.head);
     } else {
       // [: foo++ :] or [: foo += 1 :].
-      ArgumentsTypes operatorArguments = new ArgumentsTypes([rhsType], null);
-      CallSite constraint;
+      Selector constraint;
       if (!Elements.isLocal(element)) {
         // Record a constraint of the form [: field++ :], or [: field += 42 :].
-        constraint = new CallSite(operatorSelector, operatorArguments);
+        constraint = operatorSelector;
       }
       TypeMask getterType;
       TypeMask newType;
+      ArgumentsTypes operatorArguments = new ArgumentsTypes([rhsType], null);
       if (Elements.isStaticOrTopLevelField(element)) {
         Element getterElement = elements[node.selector];
         getterType =
@@ -1642,7 +1609,7 @@
                                  TypeMask receiverType,
                                  TypeMask rhsType,
                                  Node rhs) {
-    CallSite constraint;
+    Selector constraint;
     if (node.asSend() != null && !Elements.isLocal(element)) {
       // Recognize a constraint of the form [: field = other.field :].
       // Note that we check if the right hand side is a local to
@@ -1655,7 +1622,7 @@
           && !Elements.isLocal(elements[rhs])
           && send.selector.asIdentifier().source
                == node.asSend().selector.asIdentifier().source) {
-        constraint = new CallSite(elements.getSelector(rhs), null);
+        constraint = elements.getSelector(rhs);
       }
     }
     ArgumentsTypes arguments = new ArgumentsTypes([rhsType], null);
@@ -1854,7 +1821,7 @@
                              Selector selector,
                              TypeMask receiver,
                              ArgumentsTypes arguments,
-                             [CallSite constraint]) {
+                             [Selector constraint]) {
     if (selector.mask != receiver) {
       selector = inferrer.isDynamicType(receiver)
           ? selector.asUntyped
@@ -1930,7 +1897,7 @@
           ? inferrer.nullType
           : expression.accept(this));
     }
-    locals.seenReturnOrThrow = true;
+    locals.seenReturn = true;
     return inferrer.dynamicType;
   }
 
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index 29715d1a..cd4e627 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -566,7 +566,7 @@
     return JS('var', '#.apply(#, #)', jsFunction, function, arguments);
   }
 
-  static getConstructorOrInterceptor(String className) {
+  static getConstructor(String className) {
     // TODO(ahe): Generalize this and improve test coverage of
     // reflecting on intercepted classes.
     if (JS('bool', '# == "String"', className)) return const JSString();
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index 3e99fe9..59b8355 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -242,16 +242,12 @@
 ClassMirror reflectClassByName(Symbol symbol) {
   disableTreeShaking();
   String className = n(symbol);
-  var constructorOrInterceptor =
-      Primitives.getConstructorOrInterceptor(className);
-  if (constructorOrInterceptor == null) {
+  var constructor = Primitives.getConstructor(className);
+  if (constructor == null) {
     // Probably an intercepted class.
     // TODO(ahe): How to handle intercepted classes?
     throw new UnsupportedError('Cannot find class for: $className');
   }
-  var constructor = (constructorOrInterceptor is Interceptor)
-      ? JS('', '#.constructor', constructorOrInterceptor)
-      : constructorOrInterceptor;
   var descriptor = JS('', '#["@"]', constructor);
   var fields;
   var fieldsMetadata;
@@ -270,11 +266,10 @@
       fields = '';
     }
   }
-  var mirror = classMirrors[constructorOrInterceptor];
+  var mirror = classMirrors[constructor];
   if (mirror == null) {
-    mirror = new JsClassMirror(
-        symbol, constructorOrInterceptor, fields, fieldsMetadata);
-    classMirrors[constructorOrInterceptor] = mirror;
+    mirror = new JsClassMirror(symbol, constructor, fields, fieldsMetadata);
+    classMirrors[constructor] = mirror;
   }
   return mirror;
 }
@@ -357,7 +352,7 @@
 
 class JsClassMirror extends JsTypeMirror with JsObjectMirror
     implements ClassMirror {
-  final _jsConstructorOrInterceptor;
+  final _jsConstructor;
   final String _fields;
   final List _fieldsMetadata;
   List _metadata;
@@ -368,7 +363,7 @@
   JsLibraryMirror _owner;
 
   JsClassMirror(Symbol simpleName,
-                this._jsConstructorOrInterceptor,
+                this._jsConstructor,
                 this._fields,
                 this._fieldsMetadata)
       : super(simpleName);
@@ -377,14 +372,6 @@
 
   Symbol get qualifiedName => computeQualifiedName(owner, simpleName);
 
-  get _jsConstructor {
-    if (_jsConstructorOrInterceptor is Interceptor) {
-      return JS('', '#.constructor', _jsConstructorOrInterceptor);
-    } else {
-      return _jsConstructorOrInterceptor;
-    }
-  }
-
   List<JsMethodMirror> get _methods {
     if (_cachedMethods != null) return _cachedMethods;
     var prototype = JS('', '#.prototype', _jsConstructor);
@@ -523,7 +510,7 @@
 
   DeclarationMirror get owner {
     if (_owner == null) {
-      if (_jsConstructorOrInterceptor is Interceptor) {
+      if (_jsConstructor is Interceptor) {
         _owner = reflectType(Object).owner;
       } else {
         for (var list in JsMirrorSystem.librariesByName.values) {
@@ -598,7 +585,6 @@
 
   String get _prettyName => 'VariableMirror';
 
-  // TODO(ahe): Improve this information and test it.
   TypeMirror get type => JsMirrorSystem._dynamicType;
 
   DeclarationMirror get owner => _owner;
@@ -721,9 +707,6 @@
 
   Symbol get qualifiedName => computeQualifiedName(owner, simpleName);
 
-  // TODO(ahe): Improve this information and test it.
-  TypeMirror get returnType => JsMirrorSystem._dynamicType;
-
   List<InstanceMirror> get metadata {
     if (_metadata == null) {
       _metadata = extractMetadata(_jsFunction);
diff --git a/sdk/lib/_internal/lib/js_rti.dart b/sdk/lib/_internal/lib/js_rti.dart
index f47c841..0cd37e1 100644
--- a/sdk/lib/_internal/lib/js_rti.dart
+++ b/sdk/lib/_internal/lib/js_rti.dart
@@ -2,54 +2,30 @@
 // 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 part contains helpers for supporting runtime type information.
- *
- * The helper use a mixture of Dart and JavaScript objects. To indicate which is
- * used where we adopt the scheme of using explicit type annotation for Dart
- * objects and 'var' or omitted return type for JavaScript objects.
- *
- * Since bool, int, and String values are represented by the same JavaScript
- * primitives, type annotations are used for these types in all cases.
- *
- * Several methods use a common JavaScript encoding of runtime type information.
- * This encoding is referred to as the type representation which is one of
- * these:
- *  1) a JavaScript constructor for a class C: the represented type is the raw
- *     type C.
- *  2) a Dart object: this is the interceptor instance for a native type.
- *  3) a JavaScript object: this represents a class for which there is no
- *     JavaScript constructor, because it is only used in type arguments or it
- *     is native. The represented type is the raw type of this class.
- *  4) a JavaScript array: the first entry is of type 1, 2 or 3 and contains the
- *     subtyping flags and the substitution of the type and the rest of the
- *     array are the type arguments.
- *  5) `null`: the dynamic type.
- *
- *
- * To check subtype relations between generic classes we use a JavaScript
- * expression that describes the necessary substitution for type arguments.
- * Such a substitution expresssion can be:
- *  1) `null`, if no substituted check is necessary, because the
- *     type variables are the same or there are no type variables in the class
- *     that is checked for.
- *  2) A list expression describing the type arguments to be used in the
- *     subtype check, if the type arguments to be used in the check do not
- *     depend on the type arguments of the object.
- *  3) A function mapping the type variables of the object to be checked to
- *     a list expression.
- */
-
 part of _js_helper;
 
-Type createRuntimeType(String name) => new TypeImpl(name);
+setRuntimeTypeInfo(target, typeInfo) {
+  assert(typeInfo == null || typeInfo is JSArray);
+  // We have to check for null because factories may return null.
+  if (target != null) JS('var', r'#.$builtinTypeInfo = #', target, typeInfo);
+}
+
+getRuntimeTypeInfo(target) {
+  if (target == null) return null;
+  return JS('var', r'#.$builtinTypeInfo', target);
+}
+
+getRuntimeTypeArgument(target, substitution, index) {
+  var arguments = substitute(substitution, getRuntimeTypeInfo(target));
+  return (arguments == null) ? null : getField(arguments, index);
+}
 
 class TypeImpl implements Type {
   final String _typeName;
 
   TypeImpl(this._typeName);
 
-  String toString() => _typeName;
+  toString() => _typeName;
 
   // TODO(ahe): This is a poor hashCode as it collides with its name.
   int get hashCode => _typeName.hashCode;
@@ -59,73 +35,21 @@
   }
 }
 
-/**
- * Sets the runtime type information on [target]. [typeInfo] is a type
- * representation of type 4 or 5, that is, either a JavaScript array or
- * [:null:].
- */
-void setRuntimeTypeInfo(Object target, var typeInfo) {
-  assert(isNull(typeInfo) || isJsArray(typeInfo));
-  // We have to check for null because factories may return null.
-  if (target != null) JS('var', r'#.$builtinTypeInfo = #', target, typeInfo);
-}
-
-/**
- * Returns the runtime type information of [target]. The returned value is a
- * list of type representations for the type arguments.
- */
-getRuntimeTypeInfo(Object target) {
-  if (target == null) return null;
-  return JS('var', r'#.$builtinTypeInfo', target);
-}
-
-/**
- * Returns the [index]th type argument of [target] converted using
- * [substitution].
- *
- * See the comment in the beginning of this file for a description of the
- * possible values for [substitution].
- */
-getRuntimeTypeArgument(Object target, var substitution, int index) {
-  assert(isNull(substitution) ||
-         isJsArray(substitution) ||
-         isJsFunction(substitution));
-  var arguments = substitute(substitution, getRuntimeTypeInfo(target));
-  return isNull(arguments) ? null : getIndex(arguments, index);
-}
-
-/**
- * Retrieves the class name from type information stored on the constructor
- * of [object].
- */
 String getClassName(var object) {
   return JS('String', r'#.constructor.builtin$cls', getInterceptor(object));
 }
 
-/**
- * Creates the string representation for the type representation [runtimeType]
- * of type 4, the JavaScript array, where the first element represents the class
- * and the remaining elements represent the type arguments.
- */
-String getRuntimeTypeAsString(var runtimeType) {
-  assert(isJsArray(runtimeType));
-  String className = getConstructorName(getIndex(runtimeType, 0));
+String getRuntimeTypeAsString(List runtimeType) {
+  String className = getConstructorName(runtimeType[0]);
   return '$className${joinArguments(runtimeType, 1)}';
 }
 
-/**
- * Retrieves the class name from type information stored on the constructor
- * [type].
- */
-String getConstructorName(var type) => JS('String', r'#.builtin$cls', type);
+String getConstructorName(type) => JS('String', r'#.builtin$cls', type);
 
-/**
- * Returns a human-readable representation of the type representation [type].
- */
-String runtimeTypeToString(var type) {
-  if (isNull(type)) {
+String runtimeTypeToString(type) {
+  if (type == null) {
     return 'dynamic';
-  } else if (isJsArray(type)) {
+  } else if (type is JSArray) {
     // A list representing a type with arguments.
     return getRuntimeTypeAsString(type);
   } else {
@@ -134,24 +58,18 @@
   }
 }
 
-/**
- * Creates a comma-separated string of human-readable representations of the
- * type representations in the JavaScript array [types] starting at index
- * [startIndex].
- */
 String joinArguments(var types, int startIndex) {
-  if (isNull(types)) return '';
-  assert(isJsArray(types));
+  if (types == null) return '';
   bool firstArgument = true;
   bool allDynamic = true;
   StringBuffer buffer = new StringBuffer();
-  for (int index = startIndex; index < getLength(types); index++) {
+  for (int index = startIndex; index < types.length; index++) {
     if (firstArgument) {
       firstArgument = false;
     } else {
       buffer.write(', ');
     }
-    var argument = getIndex(types, index);
+    var argument = types[index];
     if (argument != null) {
       allDynamic = false;
     }
@@ -160,11 +78,8 @@
   return allDynamic ? '' : '<$buffer>';
 }
 
-/**
- * Returns a human-readable representation of the type of [object].
- */
 String getRuntimeTypeString(var object) {
-  String className = isJsArray(object) ? 'List' : getClassName(object);
+  String className = object is JSArray ? 'List' : getClassName(object);
   var typeInfo = JS('var', r'#.$builtinTypeInfo', object);
   return "$className${joinArguments(typeInfo, 0)}";
 }
@@ -174,18 +89,16 @@
   return new TypeImpl(type);
 }
 
-/**
- * Applies the [substitution] on the [arguments].
- *
- * See the comment in the beginning of this file for a description of the
- * possible values for [substitution].
- */
+bool isJsFunction(var o) => JS('bool', r'typeof # == "function"', o);
+
+Object invoke(function, arguments) {
+  return JS('var', r'#.apply(null, #)', function, arguments);
+}
+
+Object call(target, name) => JS('var', r'#[#]()', target, name);
+
 substitute(var substitution, var arguments) {
-  assert(isNull(substitution) ||
-         isJsArray(substitution) ||
-         isJsFunction(substitution));
-  assert(isNull(arguments) || isJsArray(arguments));
-  if (isJsArray(substitution)) {
+  if (substitution is JSArray) {
     arguments = substitution;
   } else if (isJsFunction(substitution)) {
     arguments = invoke(substitution, arguments);
@@ -213,9 +126,9 @@
   // `null` or a primitive.
   // TODO(9586): Move type info for static functions onto an interceptor.
   var interceptor = getInterceptor(object);
-  var isSubclass = getField(interceptor, isField);
+  bool isSubclass = getField(interceptor, isField);
   // When we read the field and it is not there, [isSubclass] will be [:null:].
-  if (isNull(isSubclass)) return false;
+  if (isSubclass == null || !isSubclass) return false;
   // Should the asField function be passed the receiver?
   var substitution = getField(interceptor, asField);
   return checkArguments(substitution, arguments, checks);
@@ -252,60 +165,49 @@
  * list [checks] (at the respective positions), possibly applying [substitution]
  * to the arguments before the check.
  *
- * See the comment in the beginning of this file for a description of the
- * possible values for [substitution].
+ * See [:RuntimeTypes.getSubtypeSubstitution:] for a description of the possible
+ * values for [substitution].
  */
 bool checkArguments(var substitution, var arguments, var checks) {
   return areSubtypes(substitute(substitution, arguments), checks);
 }
 
-/**
- * Checks whether the types of [s] are all subtypes of the types of [t].
- *
- * [s] and [t] are either [:null:] or JavaScript arrays of type representations,
- * A [:null:] argument is interpreted as the arguments of a raw type, that is a
- * list of [:dynamic:]. If [s] and [t] are JavaScript arrays they must be of the
- * same length.
- *
- * See the comment in the beginning of this file for a description of type
- * representations.
- */
-bool areSubtypes(var s, var t) {
+bool areSubtypes(List s, List t) {
   // [:null:] means a raw type.
-  if (isNull(s) || isNull(t)) return true;
+  if (s == null || t == null) return true;
 
-  assert(isJsArray(s));
-  assert(isJsArray(t));
-  assert(getLength(s) == getLength(t));
+  assert(s is JSArray);
+  assert(t is JSArray);
+  assert(s.length == t.length);
 
-  int len = getLength(s);
+  int len = s.length;
   for (int i = 0; i < len; i++) {
-    if (!isSubtype(getIndex(s, i), getIndex(t, i))) {
+    if (!isSubtype(s[i], t[i])) {
       return false;
     }
   }
   return true;
 }
 
-/**
- * Returns [:true:] if the runtime type representation [type] is a supertype of
- * [:Null:].
- */
-bool isSupertypeOfNull(var type) {
+getArguments(var type) {
+  return type is JSArray ? JS('var', r'#.slice(1)', type) : null;
+}
+
+getField(var object, var name) => JS('var', r'#[#]', object, name);
+
+bool isSubtypeOfNull(type) {
   // `null` means `dynamic`.
-  return isNull(type) || getConstructorName(type) == JS_OBJECT_CLASS_NAME();
+  return type == null || getConstructorName(type) == JS_OBJECT_CLASS_NAME();
 }
 
 /**
  * Tests whether the Dart object [o] is a subtype of the runtime type
- * representation [t].
- *
- * See the comment in the beginning of this file for a description of type
- * representations.
+ * representation [t], which is a type representation as described in the
+ * comment on [isSubtype].
  */
 bool checkSubtypeOfRuntimeType(Object o, var t) {
-  if (isNull(o)) return isSupertypeOfNull(t);
-  if (isNull(t)) return true;
+  if (JS('bool', '# == null', o)) return isSubtypeOfNull(t);
+  if (JS('bool', '# == null', t)) return true;
   // Get the runtime type information from the object here, because we may
   // overwrite o with the interceptor below.
   var rti = getRuntimeTypeInfo(o);
@@ -314,7 +216,7 @@
   // the subtype flags and the substitution on the prototype, so they are
   // properties of the object in JS.
   var type;
-  if (isNotNull(rti)) {
+  if (JS('bool', '# != null', rti)) {
     // If the type has type variables (that is, [:rti != null:]), make a copy of
     // the type arguments and insert [o] in the first position to create a
     // compound type representation.
@@ -343,39 +245,40 @@
 }
 
 /**
- * Extracts the type arguments from a type representation. The result is a
- * JavaScript array or [:null:].
- */
-getArguments(var type) {
-  return isJsArray(type) ? JS('var', r'#.slice(1)', type) : null;
-}
-
-/**
- * Checks whether the type represented by the type representation [s] is a
- * subtype of the type represented by the type representation [t].
+ * Check whether the type represented by [s] is a subtype of the type
+ * represented by [t].
  *
- * See the comment in the beginning of this file for a description of type
- * representations.
+ * Type representations can be:
+ *  1) a JavaScript constructor for a class C: the represented type is the raw
+ *     type C.
+ *  2) a Dart object: this is the interceptor instance for a native type.
+ *  3) a JavaScript object: this represents a class for which there is no
+ *     JavaScript constructor, because it is only used in type arguments or it
+ *     is native. The represented type is the raw type of this class.
+ *  4) a JavaScript array: the first entry is of type 1, 2 or 3 and contains the
+ *     subtyping flags and the substitution of the type and the rest of the
+ *     array are the type arguments.
+ *  5) [:null:]: the dynamic type.
  */
 bool isSubtype(var s, var t) {
   // If either type is dynamic, [s] is a subtype of [t].
-  if (isNull(s) || isNull(t)) return true;
+  if (JS('bool', '# == null', s) || JS('bool', '# == null', t)) return true;
   // Subtyping is reflexive.
-  if (isIdentical(s, t)) return true;
+  if (JS('bool', '# === #', s, t)) return true;
   // Get the object describing the class and check for the subtyping flag
   // constructed from the type of [t].
-  var typeOfS = isJsArray(s) ? getIndex(s, 0) : s;
-  var typeOfT = isJsArray(t) ? getIndex(t, 0) : t;
+  var typeOfS = s is JSArray ? s[0] : s;
+  var typeOfT = t is JSArray ? t[0] : t;
   // TODO(johnniwinther): replace this with the real function subtype test.
   if (JS('bool', '#.func', s) == true || JS('bool', '#.func', t) == true ) {
     return true;
   }
   // Check for a subtyping flag.
   var test = '${JS_OPERATOR_IS_PREFIX()}${runtimeTypeToString(typeOfT)}';
-  if (isNull(getField(typeOfS, test))) return false;
+  if (getField(typeOfS, test) == null) return false;
   // Get the necessary substitution of the type arguments, if there is one.
   var substitution;
-  if (isNotIdentical(typeOfT, typeOfS)) {
+  if (JS('bool', '# !== #', typeOfT, typeOfS)) {
     var field = '${JS_OPERATOR_AS_PREFIX()}${runtimeTypeToString(typeOfT)}';
     substitution = getField(typeOfS, field);
   }
@@ -383,68 +286,12 @@
   // arguments and no substitution, it is used as raw type.  If [t] has no
   // type arguments, it used as a raw type.  In both cases, [s] is a subtype
   // of [t].
-  if ((!isJsArray(s) && isNull(substitution)) || !isJsArray(t)) {
+  if ((s is! JSArray && JS('bool', '# == null', substitution)) ||
+      t is! JSArray) {
     return true;
   }
   // Recursively check the type arguments.
   return checkArguments(substitution, getArguments(s), getArguments(t));
 }
 
-/**
- * Calls the JavaScript [function] with the [arguments] with the global scope
- * as the [:this:] context.
- */
-invoke(var function, var arguments) {
-  assert(isJsFunction(function));
-  assert(isNull(arguments) || isJsArray(arguments));
-  return JS('var', r'#.apply(null, #)', function, arguments);
-}
-
-/// Calls the property [name] on the JavaScript [object].
-call(var object, String name) => JS('var', r'#[#]()', object, name);
-
-/// Returns the property [name] of the JavaScript object [object].
-getField(var object, String name) => JS('var', r'#[#]', object, name);
-
-/// Returns the property [index] of the JavaScript array [array].
-getIndex(var array, int index) {
-  assert(isJsArray(array));
-  return JS('var', r'#[#]', array, index);
-}
-
-/// Returns the length of the JavaScript array [array].
-int getLength(var array) {
-  assert(isJsArray(array));
-  return JS('int', r'#.length', array);
-}
-
-/// Returns [:true:] if [o] is a JavaScript function.
-bool isJsFunction(var o) => JS('bool', r'typeof # == "function"', o);
-
-/**
- * Returns [:true:] if [o] is equal to [:null:], that is either [:null:] or
- * [:undefined:]. We use this helper to avoid generating code under the invalid
- * assumption that [o] is a Dart value.
- */
-bool isNull(var o) => JS('bool', '# == null', o);
-
-/**
- * Returns [:true:] if [o] is not equal to [:null:], that is neither [:null:]
- * nor [:undefined:].  We use this helper to avoid generating code under the
- * invalid assumption that [o] is a Dart value.
- */
-bool isNotNull(var o) => JS('bool', '# != null', o);
-
-/**
- * Returns [:true:] if the JavaScript values [s] and [t] are identical. We use
- * this helper to avoid generating code under the invalid assumption that [s]
- * and [t] are Dart values.
- */
-bool isIdentical(var s, var t) => JS('bool', '# === #', s, t);
-
-/**
- * Returns [:true:] if the JavaScript values [s] and [t] are not identical. We
- * use this helper to avoid generating code under the invalid assumption that
- * [s] and [t] are Dart values.
- */
-bool isNotIdentical(var s, var t) => JS('bool', '# !== #', s, t);
+createRuntimeType(String name) => new TypeImpl(name);
diff --git a/sdk/lib/_internal/lib/js_string.dart b/sdk/lib/_internal/lib/js_string.dart
index be707c0..2da5ed4 100644
--- a/sdk/lib/_internal/lib/js_string.dart
+++ b/sdk/lib/_internal/lib/js_string.dart
@@ -85,19 +85,15 @@
     }
   }
 
-  bool startsWith(Pattern pattern, [int index = 0]) {
-    if (index < 0 || index > this.length) {
-      throw new RangeError.range(index, 0, this.length);
-    }
+  bool startsWith(Pattern pattern) {
     if (pattern is String) {
       String other = pattern;
       int otherLength = other.length;
-      int endIndex = index + otherLength;
-      if (endIndex > length) return false;
+      if (otherLength > length) return false;
       return JS('bool', r'# == #', other,
-                JS('String', r'#.substring(#, #)', this, index, endIndex));
+                JS('String', r'#.substring(0, #)', this, otherLength));
     }
-    return pattern.matchAsPrefix(this, index) != null;
+    return pattern.matchAsPrefix(this, 0) != null;
   }
 
   String substring(int startIndex, [int endIndex]) {
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index e2ffc23..0d2503a 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -106,18 +106,8 @@
 
   /**
    * Returns whether this string starts with a match of [pattern].
-   *
-   * If [index] is provided, instead check if the substring starting
-   * at that index starts with a match of [pattern].
-   *
-   * It is an error if [index] is negative or greater than [length].
-   *
-   * A [RegExp] containing "^" will not match if the [index] is greater than
-   * zero. The pattern works on the string as a whole, and does not extract
-   * a substring starting at [index] first. That is.
-   *     "abc".startsWith(new RegExp("^.", 1)) == false
    */
-  bool startsWith(Pattern pattern, [int index = 0]);
+  bool startsWith(Pattern pattern);
 
   /**
    * Returns the first position of a match of [pattern] in this string,
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index ab8d86a..c0a7fdf 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -108,7 +108,7 @@
          fragment: _emptyIfNull(m[_COMPONENT_FRAGMENT]));
 
   /**
-   * Creates a new URI from its components.
+   * Create a new URI from its components.
    *
    * Each component is set through a named argument. Any number of
    * components can be provided. The default value for the components
@@ -178,91 +178,6 @@
   }
 
   /**
-   * Creates a new `http` URI from authority, path and query.
-   *
-   * Examples:
-   *
-   *     // Create the URI http://example.org/path?q=abc.
-   *     new Uri.http("google.com", "/search", { "q" : "dart" });http://example.org/path?q=abc.
-   *     new Uri.http("user:pass@localhost:8080, "");  // http://user:pass@localhost:8080/
-   *     new Uri.http("example.org, "a b");  // http://example.org/a%20b
-   *     new Uri.http("example.org, "/a%2F");  // http://example.org/a%25%2F
-   *
-   * The `scheme` is always set to `http`.
-   *
-   * The `userInfo`, `host` and `port` components are set from the
-   * [authority] argument.
-   *
-   * The `path` component is set from the [unencodedPath]
-   * argument. The path passed must not be encoded as this constructor
-   * encodes the path.
-   *
-   * The `query` component is set from the optional [queryParameters]
-   * argument.
-   */
-  factory Uri.http(String authority,
-                   String unencodedPath,
-                   [Map<String, String> queryParameters]) {
-    return _makeHttpUri("http", authority, unencodedPath, queryParameters);
-  }
-
-  /**
-   * Creates a new `https` URI from authority, path and query.
-   *
-   * This constructor is the same as [Uri.http] except for the scheme
-   * which is set to `https`.
-   */
-  factory Uri.https(String authority,
-                    String unencodedPath,
-                    [Map<String, String> queryParameters]) {
-    return _makeHttpUri("https", authority, unencodedPath, queryParameters);
-  }
-
-  static Uri _makeHttpUri(String scheme,
-                          String authority,
-                          String unencodedPath,
-                          Map<String, String> queryParameters) {
-    var userInfo = "";
-    var host = "";
-    var port = 0;
-
-    var hostStart = 0;
-    // Split off the user info.
-    bool hasUserInfo = false;
-    for (int i = 0; i < authority.length; i++) {
-      if (authority.codeUnitAt(i) == _AT_SIGN) {
-        hasUserInfo = true;
-        userInfo = authority.substring(0, i);
-        hostStart = i + 1;
-        break;
-      }
-    }
-    // Split host and port.
-    bool hasPort = false;
-    for (int i = hostStart; i < authority.length; i++) {
-      if (authority.codeUnitAt(i) == _COLON) {
-        hasPort = true;
-        host = authority.substring(hostStart, i);
-        if (!host.isEmpty) {
-          var portString = authority.substring(i + 1);
-          if (portString.isNotEmpty) port = int.parse(portString);
-        }
-        break;
-      }
-    }
-    if (!hasPort) {
-      host = hasUserInfo ? authority.substring(hostStart) : authority;
-    }
-
-    return new Uri(scheme: scheme,
-                   userInfo: userInfo,
-                   host: host,
-                   port: port,
-                   pathSegments: unencodedPath.split("/"),
-                   queryParameters: queryParameters);
-  }
-
-  /**
    * Returns the URI path split into its segments. Each of the
    * segments in the returned list have been decoded. If the path is
    * empty the empty list will be returned. A leading slash `/` does
@@ -831,7 +746,6 @@
   static const int _ZERO = 0x30;
   static const int _NINE = 0x39;
   static const int _COLON = 0x3A;
-  static const int _AT_SIGN = 0x40;
   static const int _UPPER_CASE_A = 0x41;
   static const int _UPPER_CASE_F = 0x46;
   static const int _LOWER_CASE_A = 0x61;
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index 4472fcb..f47ef4f 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -237,35 +237,16 @@
     return new Directory(newPath);
   }
 
-  static String _trimTrailingPathSeparators(String path) {
-    // Don't handle argument errors here.
-    if (path is! String) return path;
-    if (Platform.operatingSystem == 'windows') {
-      while (path.length > 1 &&
-             (path.endsWith(Platform.pathSeparator) ||
-              path.endsWith('/'))) {
-        path = path.substring(0, path.length - 1);
-      }
-    } else {
-      while (path.length > 1 && path.endsWith(Platform.pathSeparator)) {
-        path = path.substring(0, path.length - 1);
-      }
-    }
-    return path;
-  }
-
   Stream<FileSystemEntity> list({bool recursive: false,
                                  bool followLinks: true}) {
-    return new _AsyncDirectoryLister(_trimTrailingPathSeparators(path),
-                                     recursive,
-                                     followLinks).stream;
+    return new _AsyncDirectoryLister(path, recursive, followLinks).stream;
   }
 
   List listSync({bool recursive: false, bool followLinks: true}) {
-    if (_path is! String || recursive is! bool || followLinks is! bool) {
+    if (_path is! String || recursive is! bool) {
       throw new ArgumentError();
     }
-    return _list(_trimTrailingPathSeparators(path), recursive, followLinks);
+    return _list(_path, recursive, followLinks);
   }
 
   String get path => _path;
@@ -327,8 +308,7 @@
                         bool this.followLinks) {
     controller = new StreamController(onListen: onListen,
                                       onResume: onResume,
-                                      onCancel: onCancel,
-                                      sync: true);
+                                      onCancel: onCancel);
   }
 
   Stream get stream => controller.stream;
diff --git a/sdk/lib/io/http_parser.dart b/sdk/lib/io/http_parser.dart
index d885008..f863e4fc 100644
--- a/sdk/lib/io/http_parser.dart
+++ b/sdk/lib/io/http_parser.dart
@@ -660,7 +660,7 @@
           _index--;
           int dataAvailable = _buffer.length - _index;
           List<int> data;
-          if (_remainingContent == -1 ||
+          if (_remainingContent == null ||
               dataAvailable <= _remainingContent) {
             if (_index == 0) {
               data = _buffer;
@@ -673,7 +673,7 @@
             data.setRange(0, _remainingContent, _buffer, _index);
           }
           _bodyController.add(data);
-          if (_remainingContent != -1) {
+          if (_remainingContent != null) {
             _remainingContent -= data.length;
           }
           _index += data.length;
@@ -814,8 +814,6 @@
     _method_or_status_code = new List();
     _uri_or_reason_phrase = new List();
 
-    _statusCode = 0;
-
     _httpVersion = _HttpVersion.UNDETERMINED;
     _transferLength = -1;
     _persistentConnection = false;
@@ -824,7 +822,7 @@
 
     _noMessageBody = false;
     _responseToMethod = null;
-    _remainingContent = -1;
+    _remainingContent = null;
 
     _headers = null;
   }
@@ -963,21 +961,21 @@
   int _state;
   int _httpVersionIndex;
   int _messageType;
-  int _statusCode = 0;
+  int _statusCode;
   List _method_or_status_code;
   List _uri_or_reason_phrase;
   List _headerField;
   List _headerValue;
 
   int _httpVersion;
-  int _transferLength = -1;
+  int _transferLength;
   bool _persistentConnection;
   bool _connectionUpgrade;
   bool _chunked;
 
   bool _noMessageBody;
   String _responseToMethod;  // Indicates the method used for the request.
-  int _remainingContent = -1;
+  int _remainingContent;
 
   _HttpHeaders _headers;
 
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 2f99e82..fb5aa0d 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -618,13 +618,7 @@
 Language/11_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
 
 Language/12_Statements/06_For_A01_t11: Fail # http://dartbug.com/9824
-
-
-# BUG(11331): Renamed Date to DateTime (issue 373, 374) but this only has an
-# impact on V8, because of the way method calls are evaluated. Needs more
-# investigation.
-[ $compiler == dart2js && $runtime == d8 ]
-Language/14_Types/6_Type_dynamic_A03_t01: Fail
+Language/14_Types/6_Type_dynamic_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
 
 
 [ $compiler == dart2js && $jscl ]
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 064bcfd..6a518b5 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -541,23 +541,6 @@
 *: Skip
 
 
-[ $compiler == none && $runtime == vm && $arch == simmips && $mode == release ]
-LibTest/math/tan_A01_t01: Fail
-LibTest/math/cos_A01_t01: Pass, Fail # Fail on Mac
-LibTest/core/double/ceil_A01_t02: Fail
-LibTest/core/double/floor_A01_t02: Fail
-LibTest/core/double/truncate_A01_t01: Fail
-LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
+[ $compiler == none && $runtime == vm && $arch == simmips ]
+*: Skip
 
-[ $compiler == none && $runtime == vm && $arch == simmips && $mode == debug ]
-LibTest/math/tan_A01_t01: Fail
-LibTest/math/cos_A01_t01: Pass, Fail # Fail on Mac
-LibTest/core/Expect/throws_A01_t04: Crash
-LibTest/core/List/sort_A01_t04: Crash # Too far relative jump.
-LibTest/core/List/sort_A01_t05: Crash
-LibTest/core/List/sort_A01_t06: Crash
-LibTest/core/double/ceil_A01_t02: Fail
-LibTest/core/double/floor_A01_t02: Fail
-LibTest/core/double/truncate_A01_t01: Fail
-LibTest/math/Random/nextDouble_A01_t01: Crash
-LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
diff --git a/tests/compiler/dart2js/field_type_simple_inferer_test.dart b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
index 1b5c87f..1e25741 100644
--- a/tests/compiler/dart2js/field_type_simple_inferer_test.dart
+++ b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
@@ -522,8 +522,8 @@
                     'f3': (inferrer) => inferrer.intType.nullable(),
                     'f4': (inferrer) => inferrer.intType.nullable()});
 
-  runTest(TEST_24, {'f1': (inferrer) => inferrer.intType,
-                    'f2': (inferrer) => inferrer.intType,
+  runTest(TEST_24, {'f1': (inferrer) => inferrer.numType,
+                    'f2': (inferrer) => inferrer.numType,
                     'f3': (inferrer) => inferrer.intType,
                     'f4': (inferrer) => inferrer.intType,
                     'f5': (inferrer) => inferrer.numType.nullable(),
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index c632565..9fde6d6 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -92,7 +92,7 @@
   abstract class JSMutableIndexable extends JSIndexable {}
   class JSArray extends Interceptor implements List, JSIndexable {
     var length;
-    operator[](index) => this[index];
+    operator[](index) {}
     operator[]=(index, value) {}
     var add;
   }
diff --git a/tests/compiler/dart2js/simple_inferrer_no_such_method_test.dart b/tests/compiler/dart2js/simple_inferrer_no_such_method_test.dart
index 0d01558..400c0f8 100644
--- a/tests/compiler/dart2js/simple_inferrer_no_such_method_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_no_such_method_test.dart
@@ -108,7 +108,7 @@
   }
 
   checkReturn('test1', typesInferrer.intType);
-  checkReturn('test2', typesInferrer.dynamicType.nonNullable());
+  checkReturn('test2', typesInferrer.dynamicType);
   checkReturn('test3', typesInferrer.intType);
   checkReturn('test4', typesInferrer.mapType);
   checkReturn('test5', typesInferrer.dynamicType.nonNullable());
@@ -118,13 +118,17 @@
   compiler.runCompiler(uri);
   typesInferrer = compiler.typesTask.typesInferrer;
 
-  checkReturn('test1', typesInferrer.dynamicType.nonNullable());
+  checkReturn('test1', typesInferrer.dynamicType);
   checkReturn('test2', typesInferrer.mapType);
   checkReturn('test3', typesInferrer.mapType);
   checkReturn('test4', typesInferrer.mapType);
   checkReturn('test5', typesInferrer.mapType);
 
-  checkReturn('test6', typesInferrer.numType);
+  // TODO(ngeoffray): The reason for nullablity is because the
+  // inferrer thinks Object.noSuchMethod return null. Once we track
+  // aborting control flow in the analysis, we won't get the nullable
+  // anymore.
+  checkReturn('test6', typesInferrer.numType.nullable());
   checkReturn('test7', typesInferrer.intType);
   checkReturn('test8', typesInferrer.intType);
   checkReturn('test9', typesInferrer.intType);
diff --git a/tests/compiler/dart2js/simple_inferrer_test.dart b/tests/compiler/dart2js/simple_inferrer_test.dart
index 03ede88..19be754 100644
--- a/tests/compiler/dart2js/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_test.dart
@@ -351,16 +351,6 @@
   return b;
 }
 
-testReturnElementOfConstList1() {
-  return const [42][0];
-}
-
-testReturnElementOfConstList2() {
-  return topLevelConstList[0];
-}
-
-var topLevelConstList = const [42];
-
 get topLevelGetter => 42;
 returnDynamic() => topLevelGetter(42);
 returnTopLevelGetter() => topLevelGetter;
@@ -465,8 +455,6 @@
          ..returnInt7()
          ..returnInt8()
          ..returnInt9();
-  testReturnElementOfConstList1();
-  testReturnElementOfConstList2();
 }
 """;
 
@@ -539,8 +527,6 @@
   checkReturn('testBreak1', interceptorType.nullable());
   checkReturn('testContinue2', interceptorType.nullable());
   checkReturn('testBreak2', typesInferrer.intType.nullable());
-  checkReturn('testReturnElementOfConstList1', typesInferrer.intType);
-  checkReturn('testReturnElementOfConstList2', typesInferrer.intType);
 
   checkReturnInClass(String className, String methodName, type) {
     var cls = findElement(compiler, className);
diff --git a/tests/corelib/string_test.dart b/tests/corelib/string_test.dart
index aeb00c3..4519733 100644
--- a/tests/corelib/string_test.dart
+++ b/tests/corelib/string_test.dart
@@ -127,29 +127,6 @@
     Expect.isTrue("".startsWith(""));
     Expect.isFalse("".startsWith("s"));
 
-    Expect.isFalse("strstr".startsWith("s", 1));
-    Expect.isFalse("strstr".startsWith("s", 2));
-    Expect.isTrue("strstr".startsWith("s", 3));
-    Expect.isFalse("strstr".startsWith("s", 4));
-
-    Expect.isFalse("strstr".startsWith("st", 1));
-    Expect.isFalse("strstr".startsWith("st", 2));
-    Expect.isTrue("strstr".startsWith("st", 3));
-    Expect.isFalse("strstr".startsWith("st", 4));
-
-    Expect.isFalse("strstr".startsWith("str", 1));
-    Expect.isFalse("strstr".startsWith("str", 2));
-    Expect.isTrue("strstr".startsWith("str", 3));
-    Expect.isFalse("strstr".startsWith("str", 4));
-
-    Expect.isTrue("str".startsWith("", 0));
-    Expect.isTrue("str".startsWith("", 1));
-    Expect.isTrue("str".startsWith("", 2));
-    Expect.isTrue("str".startsWith("", 3));
-
-    Expect.throws(() => "str".startsWith("", -1));
-    Expect.throws(() => "str".startsWith("", 4));
-
     var regexp = new RegExp("s(?:tr?)?");
     Expect.isTrue("s".startsWith(regexp));
     Expect.isTrue("st".startsWith(regexp));
@@ -163,30 +140,6 @@
 
     Expect.isTrue("".startsWith(new RegExp("")));
     Expect.isTrue("".startsWith(new RegExp("a?")));
-
-    Expect.isFalse("strstr".startsWith(regexp, 1));
-    Expect.isFalse("strstr".startsWith(regexp, 2));
-    Expect.isTrue("strstr".startsWith(regexp, 3));
-    Expect.isFalse("strstr".startsWith(regexp, 4));
-
-    Expect.isTrue("str".startsWith(new RegExp(""), 0));
-    Expect.isTrue("str".startsWith(new RegExp(""), 1));
-    Expect.isTrue("str".startsWith(new RegExp(""), 2));
-    Expect.isTrue("str".startsWith(new RegExp(""), 3));
-    Expect.isTrue("str".startsWith(new RegExp("a?"), 0));
-    Expect.isTrue("str".startsWith(new RegExp("a?"), 1));
-    Expect.isTrue("str".startsWith(new RegExp("a?"), 2));
-    Expect.isTrue("str".startsWith(new RegExp("a?"), 3));
-
-    Expect.throws(() => "str".startsWith(regexp, -1));
-    Expect.throws(() => "str".startsWith(regexp, 4));
-
-    regexp = new RegExp("^str");
-    Expect.isTrue("strstr".startsWith(regexp));
-    Expect.isTrue("strstr".startsWith(regexp, 0));
-    Expect.isFalse("strstr".startsWith(regexp, 1));
-    Expect.isFalse("strstr".startsWith(regexp, 2));
-    Expect.isFalse("strstr".startsWith(regexp, 3));  // Second "str" isn't at ^.
   }
 
   static testIndexOf() {
diff --git a/tests/language/language.status b/tests/language/language.status
index 21e4f57..e55fc34 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -537,6 +537,7 @@
 left_shift_test: Pass, Fail # Fails on Mac
 positive_bit_operations_test: Pass, Fail, Crash # Fails and crashes on Mac
 
+
 # large_implicit_getter_test Passes on ReleaseARM, Crashes in SIMARM and
 # DebugARM. Should crash on ReleaseARM, but there is no exception on an
 # unaligned access. stack_overflow_test and  _stacktrace_test have the same
@@ -556,6 +557,7 @@
 bit_operations_test: Crash, Fail
 char_escape_test: Pass, Crash
 deopt_smi_op_test: Fail
+div_with_power_of_two_test: Fail
 gc_test: Crash
 invocation_mirror_test: Fail
 load_to_load_forwarding_vm_test: Fail
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index ac2f1ad..27a984d 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -135,6 +135,7 @@
 override_field_test/02: fail
 override_field_test/03: fail
 override_method_with_field_test/01: fail
+override_method_with_field_test/02: fail
 prefix10_negative_test: fail
 prefix11_negative_test: fail
 prefix12_negative_test: fail
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 4043be7..be8fb29 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -135,6 +135,7 @@
 override_field_test/02: fail
 override_field_test/03: fail
 override_method_with_field_test/01: fail
+override_method_with_field_test/02: fail
 prefix10_negative_test: fail
 prefix11_negative_test: fail
 prefix12_negative_test: fail
@@ -172,6 +173,7 @@
 syntax_test/31: fail
 syntax_test/32: fail
 syntax_test/33: fail
+ternary_test: fail
 throw7_negative_test: fail
 type_error_test: fail
 type_parameter_test/01: fail
@@ -194,6 +196,8 @@
 type_variable_bounds_test/09: fail
 type_variable_identifier_expression_negative_test: fail
 type_variable_static_context_negative_test: fail
+unary2_test: fail
+unary_test: fail
 unresolved_in_factory_negative_test: fail
 unresolved_top_level_method_negative_test: fail
 unresolved_top_level_var_negative_test: fail
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 6682046..e26f707 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -28,8 +28,6 @@
 mirrors/to_string_test: Fail # Issue 6490
 
 [ $csp ]
-mirrors/intercepted_class_test: Fail # Issue 6490
-mirrors/intercepted_object_test: Fail # Issue 6490
 mirrors/metadata_test: Fail # Issue 6490
 mirrors/reflect_model_test: Fail # Issue 6490
 mirrors/reflect_runtime_type_test: Fail # Issue 6490
diff --git a/tests/standalone/io/directory_list_pause_test.dart b/tests/standalone/io/directory_list_pause_test.dart
index 081b406..178f59f 100644
--- a/tests/standalone/io/directory_list_pause_test.dart
+++ b/tests/standalone/io/directory_list_pause_test.dart
@@ -10,34 +10,31 @@
 
 void testPauseList() {
   var keepAlive = new ReceivePort();
-  // TOTAL should be bigger the our directory listing buffer.
-  const int TOTAL = 128;
   new Directory("").createTemp().then((d) {
-    for (int i = 0; i < TOTAL; i++) {
-      new Directory("${d.path}/$i").createSync();
-      new File("${d.path}/$i/file").createSync();
+    // Linux reads 2K at a time, so be sure to be >>.
+    int total = 4 * 1024 + 1;
+    for (int i = 0; i < total; i++) {
+      new File("${d.path}/$i").createSync();
     }
     bool first = true;
     var subscription;
     int count = 0;
-    subscription = d.list(recursive: true).listen((file) {
-      if (file is File) {
-        if (first) {
-          first = false;
-          subscription.pause();
-          Timer.run(() {
-            for (int i = 0; i < TOTAL; i++) {
-              new File("${d.path}/$i/file").deleteSync();
-            }
-            subscription.resume();
-          });
-        }
-        count++;
+    subscription = d.list().listen((file) {
+      if (first) {
+        first = false;
+        subscription.pause();
+        Timer.run(() {
+          for (int i = 0; i < total; i++) {
+            new File("${d.path}/$i").deleteSync();
+          }
+          subscription.resume();
+        });
       }
+      count++;
     }, onDone: () {
-      Expect.notEquals(TOTAL, count);
-      Expect.isTrue(count > 0);
-      d.delete(recursive: true).then((ignore) => keepAlive.close());
+      Expect.notEquals(total, count);
+      keepAlive.close();
+      d.delete().then((ignore) => keepAlive.close());
     });
   });
 }
diff --git a/tests/standalone/io/directory_test.dart b/tests/standalone/io/directory_test.dart
index f9927d3..6592281 100644
--- a/tests/standalone/io/directory_test.dart
+++ b/tests/standalone/io/directory_test.dart
@@ -85,24 +85,6 @@
     Expect.isFalse(listedFile);
   }
 
-  static void testListingTailingPaths() {
-    Directory directory = new Directory("").createTempSync();
-    Directory subDirectory = new Directory("${directory.path}/subdir/");
-    subDirectory.createSync();
-    File f = new File('${subDirectory.path}/file.txt');
-    f.createSync();
-
-    void test(entry) {
-      Expect.isFalse(entry.path.contains(new RegExp('[\\/][\\/]')));
-    }
-
-    subDirectory.listSync().forEach(test);
-
-    subDirectory.list().listen(test, onDone: () {
-      directory.deleteSync(recursive: true);
-    });
-  }
-
   static void testListNonExistent() {
     setupListerHandlers(Stream<FileSystemEntity> stream) {
       stream.listen(
@@ -415,7 +397,6 @@
 
   static void testMain() {
     testListing();
-    testListingTailingPaths();
     testListNonExistent();
     testListTooLongName();
     testDeleteNonExistent();
diff --git a/tests/standalone/io/raw_socket_test.dart b/tests/standalone/io/raw_socket_test.dart
index 42d9c29..08ed693 100644
--- a/tests/standalone/io/raw_socket_test.dart
+++ b/tests/standalone/io/raw_socket_test.dart
@@ -241,7 +241,7 @@
     // sockets.
     subscription.pause();
     var connectCount = 0;
-    for (int i = 0; i < socketCount / 2; i++) {
+    for (int i = 0; i <= socketCount / 2; i++) {
       RawSocket.connect("127.0.0.1", server.port).then((_) {
         if (++connectCount == socketCount / 2) {
           subscription.resume();
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index fab1994..e08da8e 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -159,8 +159,16 @@
 *: Skip
 
 [ $arch == arm || $arch == simarm ]
-*: Skip # Many of these tests are still flaky on arm, so skipping until we
-        # actually start working on implementing the needed features.
+coverage_test: Crash # Issue: 11207
+debugger/basic_debugger_test: Crash # Issue: 11207
+debugger/closure_debugger_test: Crash # Issue: 11207
+http_launch_test: Fail, Crash # Issue: 11207
+left_shift_bit_and_op_test: Fail # Issue: 11207
+package/package_isolate_test: Pass, Crash # Issue: 11207
+out_of_memory_test: Pass, Crash # Issue: 11207 (Pass on Mac)
+typed_data_test: Timeout, Crash # Issue: 11207
+typed_data_isolate_test: Pass, Crash # Issue: 11207
+io/*: Skip # Skip IO tests for now as they are still quite flaky.
 
 [ $arch == mips ]
 *: Skip
diff --git a/tools/VERSION b/tools/VERSION
index 453bc99..c06980b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
-MINOR 1
-BUILD 2
-PATCH 0
+MINOR 5
+BUILD 20
+PATCH 2
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index ba2445a..eec4dc5 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -90,7 +90,9 @@
       },
 
       'Dart_Release': {
-        'cflags': [ '-O3', ],
+        'cflags': [ '-O3',
+                    '-fno-omit-frame-pointer',
+        ],
       },
     },
   },
diff --git a/tools/test.dart b/tools/test.dart
index da8f3ab..c2da69a 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -167,6 +167,7 @@
       // FIXME(kustermann/ricow): Remove this once the new browser_controller is
       // stable.
       maxBrowserProcesses = math.max(maxProcesses - 3, 1);
+      maxProcesses = math.max(maxProcesses -1, 1);
     }
 
     for (String key in selectors.keys) {
diff --git a/utils/pub/pub.Makefile b/utils/pub/pub.Makefile
new file mode 100644
index 0000000..c1d628d
--- /dev/null
+++ b/utils/pub/pub.Makefile
@@ -0,0 +1,6 @@
+# This file is generated by gyp; do not edit.
+
+export builddir_name ?= dart/utils/pub/out
+.PHONY: all
+all:
+	$(MAKE) -C ../.. pub
diff --git a/utils/pub/pub.target.mk b/utils/pub/pub.target.mk
new file mode 100644
index 0000000..6362e21
--- /dev/null
+++ b/utils/pub/pub.target.mk
@@ -0,0 +1,38 @@
+# This file is generated by gyp; do not edit.
+
+TOOLSET := target
+TARGET := pub
+### Rules for action "generate_pub_snapshot":
+quiet_cmd_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot = ACTION dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot $@
+cmd_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot = LD_LIBRARY_PATH=$(builddir)/lib.host:$(builddir)/lib.target:$$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd utils/pub; mkdir -p $(obj)/gen; "$(builddir)/dart" "--package-root=$(builddir)/packages/" "--generate-script-snapshot=$(obj)/gen/pub.dart.snapshot" ../../sdk/lib/_internal/pub/bin/pub.dart
+
+$(obj)/gen/pub.dart.snapshot: obj := $(abs_obj)
+$(obj)/gen/pub.dart.snapshot: builddir := $(abs_builddir)
+$(obj)/gen/pub.dart.snapshot: TOOLSET := $(TOOLSET)
+$(obj)/gen/pub.dart.snapshot: $(builddir)/dart sdk/lib/_internal/pub/bin/pub.dart sdk/lib/_internal/pub/lib/src/http.dart sdk/lib/_internal/pub/lib/src/utils.dart sdk/lib/_internal/pub/lib/src/command_deploy.dart sdk/lib/_internal/pub/lib/src/git_source.dart sdk/lib/_internal/pub/lib/src/command_install.dart sdk/lib/_internal/pub/lib/src/exit_codes.dart sdk/lib/_internal/pub/lib/src/command.dart sdk/lib/_internal/pub/lib/src/source_registry.dart sdk/lib/_internal/pub/lib/src/pubspec.dart sdk/lib/_internal/pub/lib/src/command_help.dart sdk/lib/_internal/pub/lib/src/oauth2.dart sdk/lib/_internal/pub/lib/src/command_uploader.dart sdk/lib/_internal/pub/lib/src/error_group.dart sdk/lib/_internal/pub/lib/src/directory_tree.dart sdk/lib/_internal/pub/lib/src/sdk.dart sdk/lib/_internal/pub/lib/src/dart.dart sdk/lib/_internal/pub/lib/src/hosted_source.dart sdk/lib/_internal/pub/lib/src/version.dart sdk/lib/_internal/pub/lib/src/git.dart sdk/lib/_internal/pub/lib/src/io.dart sdk/lib/_internal/pub/lib/src/system_cache.dart sdk/lib/_internal/pub/lib/src/safe_http_server.dart sdk/lib/_internal/pub/lib/src/command_update.dart sdk/lib/_internal/pub/lib/src/command_version.dart sdk/lib/_internal/pub/lib/src/validator.dart sdk/lib/_internal/pub/lib/src/command_cache.dart sdk/lib/_internal/pub/lib/src/source.dart sdk/lib/_internal/pub/lib/src/command_lish.dart sdk/lib/_internal/pub/lib/src/package.dart sdk/lib/_internal/pub/lib/src/log.dart sdk/lib/_internal/pub/lib/src/entrypoint.dart sdk/lib/_internal/pub/lib/src/lock_file.dart sdk/lib/_internal/pub/lib/src/path_source.dart sdk/lib/_internal/pub/lib/src/validator/name.dart sdk/lib/_internal/pub/lib/src/validator/size.dart sdk/lib/_internal/pub/lib/src/validator/pubspec_field.dart sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart sdk/lib/_internal/pub/lib/src/validator/directory.dart sdk/lib/_internal/pub/lib/src/validator/utf8_readme.dart sdk/lib/_internal/pub/lib/src/validator/dependency.dart sdk/lib/_internal/pub/lib/src/validator/license.dart sdk/lib/_internal/pub/lib/src/validator/lib.dart sdk/lib/_internal/pub/lib/src/solver/version_solver.dart sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart sdk/lib/_internal/pub/test/command_line_config.dart sdk/lib/_internal/pub/test/version_test.dart sdk/lib/_internal/pub/test/io_test.dart sdk/lib/_internal/pub/test/pub_cache_test.dart sdk/lib/_internal/pub/test/test_pub.dart sdk/lib/_internal/pub/test/lock_file_test.dart sdk/lib/_internal/pub/test/real_version_test.dart sdk/lib/_internal/pub/test/utils_test.dart sdk/lib/_internal/pub/test/directory_tree_test.dart sdk/lib/_internal/pub/test/unknown_source_test.dart sdk/lib/_internal/pub/test/dev_dependency_test.dart sdk/lib/_internal/pub/test/package_files_test.dart sdk/lib/_internal/pub/test/pubspec_test.dart sdk/lib/_internal/pub/test/pub_test.dart sdk/lib/_internal/pub/test/pub_install_and_update_test.dart sdk/lib/_internal/pub/test/version_solver_test.dart sdk/lib/_internal/pub/test/descriptor.dart sdk/lib/_internal/pub/test/error_group_test.dart sdk/lib/_internal/pub/test/pub_uploader_test.dart sdk/lib/_internal/pub/test/lish/cloud_storage_upload_doesnt_redirect_test.dart sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/utils.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart sdk/lib/_internal/pub/test/lish/force_cannot_be_combined_with_dry_run_test.dart sdk/lib/_internal/pub/test/lish/upload_form_fields_is_not_a_map_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_invalid_json_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/upload_form_is_missing_url_test.dart sdk/lib/_internal/pub/test/lish/force_does_not_publish_if_there_are_errors_test.dart sdk/lib/_internal/pub/test/lish/upload_form_is_missing_fields_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_an_error_test.dart sdk/lib/_internal/pub/test/lish/preview_package_validation_has_a_warning_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart sdk/lib/_internal/pub/test/lish/preview_package_validation_has_no_warnings_test.dart sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart sdk/lib/_internal/pub/test/lish/upload_form_url_is_not_a_string_test.dart sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart sdk/lib/_internal/pub/test/lish/upload_form_fields_has_a_non_string_value_test.dart sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart sdk/lib/_internal/pub/test/update/git/do_not_update_if_unneeded_test.dart sdk/lib/_internal/pub/test/update/git/update_to_incompatible_pubspec_test.dart sdk/lib/_internal/pub/test/update/git/update_to_nonexistent_pubspec_test.dart sdk/lib/_internal/pub/test/update/git/update_locked_test.dart sdk/lib/_internal/pub/test/update/git/update_one_locked_test.dart sdk/lib/_internal/pub/test/update/hosted/unlock_dependers_test.dart sdk/lib/_internal/pub/test/update/hosted/unlock_if_necessary_test.dart sdk/lib/_internal/pub/test/update/hosted/update_removed_constraints_test.dart sdk/lib/_internal/pub/test/validator/license_test.dart sdk/lib/_internal/pub/test/validator/utils.dart sdk/lib/_internal/pub/test/validator/pubspec_field_test.dart sdk/lib/_internal/pub/test/validator/dependency_test.dart sdk/lib/_internal/pub/test/validator/directory_test.dart sdk/lib/_internal/pub/test/validator/name_test.dart sdk/lib/_internal/pub/test/validator/lib_test.dart sdk/lib/_internal/pub/test/validator/size_test.dart sdk/lib/_internal/pub/test/validator/utf8_readme_test.dart sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart sdk/lib/_internal/pub/test/oauth2/utils.dart sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart sdk/lib/_internal/pub/test/descriptor/tar.dart sdk/lib/_internal/pub/test/descriptor/git.dart sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart sdk/lib/_internal/pub/test/hosted/offline_test.dart sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_url_resolve_test.dart sdk/lib/_internal/pub/test/hosted/remove_removed_transitive_dependency_test.dart sdk/lib/_internal/pub/test/hosted/remove_removed_dependency_test.dart sdk/lib/_internal/pub/test/install/relative_symlink_test.dart sdk/lib/_internal/pub/test/install/broken_symlink_test.dart sdk/lib/_internal/pub/test/install/switch_source_test.dart sdk/lib/_internal/pub/test/install/git/check_out_transitive_test.dart sdk/lib/_internal/pub/test/install/git/unlock_if_incompatible_test.dart sdk/lib/_internal/pub/test/install/git/require_pubspec_test.dart sdk/lib/_internal/pub/test/install/git/check_out_with_trailing_slash_test.dart sdk/lib/_internal/pub/test/install/git/dependency_name_match_pubspec_test.dart sdk/lib/_internal/pub/test/install/git/check_out_branch_test.dart sdk/lib/_internal/pub/test/install/git/stay_locked_if_compatible_test.dart sdk/lib/_internal/pub/test/install/git/check_out_and_update_test.dart sdk/lib/_internal/pub/test/install/git/check_out_twice_test.dart sdk/lib/_internal/pub/test/install/git/check_out_test.dart sdk/lib/_internal/pub/test/install/git/lock_version_test.dart sdk/lib/_internal/pub/test/install/git/require_pubspec_name_test.dart sdk/lib/_internal/pub/test/install/git/check_out_revision_test.dart sdk/lib/_internal/pub/test/install/git/different_repo_name_test.dart sdk/lib/_internal/pub/test/install/hosted/unlock_if_incompatible_test.dart sdk/lib/_internal/pub/test/install/hosted/do_not_update_on_removed_constraints_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_test.dart sdk/lib/_internal/pub/test/install/hosted/install_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_if_compatible_test.dart sdk/lib/_internal/pub/test/install/hosted/install_transitive_test.dart sdk/lib/_internal/pub/test/install/hosted/unlock_if_new_is_unsatisfied_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_if_new_is_satisfied_test.dart sdk/lib/_internal/pub/test/install/hosted/cached_pubspec_test.dart sdk/lib/_internal/pub/test/install/hosted/resolve_constraints_test.dart sdk/lib/_internal/pub/test/install/hosted/repair_cache_test.dart sdk/lib/_internal/pub/test/install/path/nonexistent_dir_test.dart sdk/lib/_internal/pub/test/install/path/absolute_path_test.dart sdk/lib/_internal/pub/test/install/path/relative_symlink_test.dart sdk/lib/_internal/pub/test/install/path/shared_dependency_test.dart sdk/lib/_internal/pub/test/install/path/shared_dependency_symlink_test.dart sdk/lib/_internal/pub/test/install/path/absolute_symlink_test.dart sdk/lib/_internal/pub/test/install/path/no_pubspec_test.dart sdk/lib/_internal/pub/test/install/path/relative_path_test.dart sdk/lib/_internal/pub/test/install/path/path_is_file_test.dart sdk/lib/_internal/pub/test/deploy/copies_non_dart_files_to_deploy_test.dart sdk/lib/_internal/pub/test/deploy/ignores_non_entrypoint_dart_files_test.dart sdk/lib/_internal/pub/test/deploy/compiles_dart_entrypoints_to_dart_and_js_test.dart sdk/lib/_internal/pub/test/deploy/reports_dart_parse_errors_test.dart sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints_test.dart sdk/lib/_internal/pub/test/deploy/with_no_web_directory_test.dart sdk/lib/_internal/libraries.dart sdk/lib/_internal/compiler/compiler.dart sdk/lib/_internal/compiler/implementation/dart_types.dart sdk/lib/_internal/compiler/implementation/string_validator.dart sdk/lib/_internal/compiler/implementation/world.dart sdk/lib/_internal/compiler/implementation/typechecker.dart sdk/lib/_internal/compiler/implementation/filenames.dart sdk/lib/_internal/compiler/implementation/dart2js.dart sdk/lib/_internal/compiler/implementation/patch_parser.dart sdk/lib/_internal/compiler/implementation/constants.dart sdk/lib/_internal/compiler/implementation/script.dart sdk/lib/_internal/compiler/implementation/library_loader.dart sdk/lib/_internal/compiler/implementation/enqueue.dart sdk/lib/_internal/compiler/implementation/compiler.dart sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart sdk/lib/_internal/compiler/implementation/warnings.dart sdk/lib/_internal/compiler/implementation/source_file_provider.dart sdk/lib/_internal/compiler/implementation/tree_validator.dart sdk/lib/_internal/compiler/implementation/apiimpl.dart sdk/lib/_internal/compiler/implementation/native_handler.dart sdk/lib/_internal/compiler/implementation/constant_system_dart.dart sdk/lib/_internal/compiler/implementation/dart2jslib.dart sdk/lib/_internal/compiler/implementation/compile_time_constants.dart sdk/lib/_internal/compiler/implementation/closure.dart sdk/lib/_internal/compiler/implementation/code_buffer.dart sdk/lib/_internal/compiler/implementation/source_file.dart sdk/lib/_internal/compiler/implementation/deferred_load.dart sdk/lib/_internal/compiler/implementation/resolved_visitor.dart sdk/lib/_internal/compiler/implementation/colors.dart sdk/lib/_internal/compiler/implementation/source_map_builder.dart sdk/lib/_internal/compiler/implementation/constant_system.dart sdk/lib/_internal/compiler/implementation/util/characters.dart sdk/lib/_internal/compiler/implementation/util/util.dart sdk/lib/_internal/compiler/implementation/util/uri_extras.dart sdk/lib/_internal/compiler/implementation/util/link_implementation.dart sdk/lib/_internal/compiler/implementation/util/link.dart sdk/lib/_internal/compiler/implementation/util/util_implementation.dart sdk/lib/_internal/compiler/implementation/tools/mini_parser.dart sdk/lib/_internal/compiler/implementation/dart_backend/utils.dart sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart sdk/lib/_internal/compiler/implementation/js_backend/namer.dart sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart sdk/lib/_internal/compiler/implementation/js_backend/backend.dart sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart sdk/lib/_internal/compiler/implementation/lib/string_helper.dart sdk/lib/_internal/compiler/implementation/lib/collection_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_rti.dart sdk/lib/_internal/compiler/implementation/lib/core_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_array.dart sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart sdk/lib/_internal/compiler/implementation/lib/async_patch.dart sdk/lib/_internal/compiler/implementation/lib/collection_dev_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_helper.dart sdk/lib/_internal/compiler/implementation/lib/scalarlist_patch.dart sdk/lib/_internal/compiler/implementation/lib/native_helper.dart sdk/lib/_internal/compiler/implementation/lib/io_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_number.dart sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart sdk/lib/_internal/compiler/implementation/lib/constant_map.dart sdk/lib/_internal/compiler/implementation/lib/typed_data_patch.dart sdk/lib/_internal/compiler/implementation/lib/math_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_string.dart sdk/lib/_internal/compiler/implementation/lib/json_patch.dart sdk/lib/_internal/compiler/implementation/lib/foreign_helper.dart sdk/lib/_internal/compiler/implementation/lib/interceptors.dart sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart sdk/lib/_internal/compiler/implementation/mirrors/util.dart sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart sdk/lib/_internal/compiler/implementation/resolution/scope.dart sdk/lib/_internal/compiler/implementation/resolution/resolution.dart sdk/lib/_internal/compiler/implementation/resolution/secret_tree_element.dart sdk/lib/_internal/compiler/implementation/resolution/members.dart sdk/lib/_internal/compiler/implementation/ssa/ssa.dart sdk/lib/_internal/compiler/implementation/ssa/bailout.dart sdk/lib/_internal/compiler/implementation/ssa/codegen.dart sdk/lib/_internal/compiler/implementation/ssa/types.dart sdk/lib/_internal/compiler/implementation/ssa/validate.dart sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart sdk/lib/_internal/compiler/implementation/ssa/optimize.dart sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart sdk/lib/_internal/compiler/implementation/ssa/nodes.dart sdk/lib/_internal/compiler/implementation/ssa/value_set.dart sdk/lib/_internal/compiler/implementation/ssa/builder.dart sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart sdk/lib/_internal/compiler/implementation/ssa/tracer.dart sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart sdk/lib/_internal/compiler/implementation/js/precedence.dart sdk/lib/_internal/compiler/implementation/js/nodes.dart sdk/lib/_internal/compiler/implementation/js/builder.dart sdk/lib/_internal/compiler/implementation/js/printer.dart sdk/lib/_internal/compiler/implementation/js/js.dart sdk/lib/_internal/compiler/implementation/types/types.dart sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart sdk/lib/_internal/compiler/implementation/types/type_mask.dart sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart sdk/lib/_internal/compiler/implementation/elements/elements.dart sdk/lib/_internal/compiler/implementation/elements/modelx.dart sdk/lib/_internal/compiler/implementation/universe/side_effects.dart sdk/lib/_internal/compiler/implementation/universe/selector_map.dart sdk/lib/_internal/compiler/implementation/universe/universe.dart sdk/lib/_internal/compiler/implementation/universe/function_set.dart sdk/lib/_internal/compiler/implementation/scanner/byte_array_scanner.dart sdk/lib/_internal/compiler/implementation/scanner/byte_strings.dart sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.dart sdk/lib/_internal/compiler/implementation/scanner/listener.dart sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart sdk/lib/_internal/compiler/implementation/scanner/parser_task.dart sdk/lib/_internal/compiler/implementation/scanner/scanner.dart sdk/lib/_internal/compiler/implementation/scanner/keyword.dart sdk/lib/_internal/compiler/implementation/scanner/scanner_task.dart sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart sdk/lib/_internal/compiler/implementation/scanner/token.dart sdk/lib/_internal/compiler/implementation/scanner/parser.dart sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart sdk/lib/_internal/compiler/implementation/tree/visitors.dart sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart sdk/lib/_internal/compiler/implementation/tree/unparser.dart sdk/lib/_internal/compiler/implementation/tree/tree.dart sdk/lib/_internal/compiler/implementation/tree/nodes.dart sdk/lib/_internal/compiler/implementation/tree/dartstring.dart sdk/lib/_internal/compiler/samples/jsonify/jsonify.dart sdk/lib/_internal/compiler/samples/compile_loop/compile_loop.dart sdk/lib/_internal/compiler/samples/leap/leap_leg.dart sdk/lib/_internal/compiler/samples/leap/request_cache.dart sdk/lib/_internal/compiler/samples/leap/leap_script.dart sdk/lib/_internal/compiler/samples/leap/leap_server.dart sdk/lib/_internal/compiler/samples/leap/leap.dart sdk/lib/_internal/compiler/samples/darttags/darttags.dart pkg/intl/lib/number_symbols.dart pkg/intl/lib/intl.dart pkg/intl/lib/number_format.dart pkg/intl/lib/date_format.dart pkg/intl/lib/number_symbols_data.dart pkg/intl/lib/date_symbol_data_http_request.dart pkg/intl/lib/intl_browser.dart pkg/intl/lib/bidi_utils.dart pkg/intl/lib/date_symbol_data_local.dart pkg/intl/lib/date_time_patterns.dart pkg/intl/lib/message_lookup_by_library.dart pkg/intl/lib/date_symbol_data_file.dart pkg/intl/lib/extract_messages.dart pkg/intl/lib/generate_localized.dart pkg/intl/lib/bidi_formatter.dart pkg/intl/lib/date_symbols.dart pkg/intl/lib/intl_standalone.dart pkg/intl/lib/src/date_format_helpers.dart pkg/intl/lib/src/http_request_data_reader.dart pkg/intl/lib/src/file_data_reader.dart pkg/intl/lib/src/date_format_internal.dart pkg/intl/lib/src/intl_message.dart pkg/intl/lib/src/intl_helpers.dart pkg/intl/lib/src/date_format_field.dart pkg/intl/lib/src/lazy_locale_data.dart pkg/intl/lib/src/data/dates/localeList.dart pkg/intl/test/date_time_format_local_odd_test.dart pkg/intl/test/data_directory.dart pkg/intl/test/date_time_format_local_even_test.dart pkg/intl/test/intl_message_basic_example_test.dart pkg/intl/test/number_test_data.dart pkg/intl/test/bidi_utils_test.dart pkg/intl/test/date_time_format_test_data.dart pkg/intl/test/number_closure_test.dart pkg/intl/test/date_time_format_file_even_test.dart pkg/intl/test/number_format_test.dart pkg/intl/test/intl_test.dart pkg/intl/test/find_default_locale_standalone_test.dart pkg/intl/test/date_time_format_test_core.dart pkg/intl/test/date_time_format_http_request_test.dart pkg/intl/test/date_time_format_uninitialized_test.dart pkg/intl/test/date_time_format_test_stub.dart pkg/intl/test/find_default_locale_browser_test.dart pkg/intl/test/bidi_format_test.dart pkg/intl/test/date_time_format_file_odd_test.dart pkg/intl/test/message_extraction/generate_from_json.dart pkg/intl/test/message_extraction/sample_with_messages.dart pkg/intl/test/message_extraction/make_hardcoded_translation.dart pkg/intl/test/message_extraction/part_of_sample_with_messages.dart pkg/intl/test/message_extraction/extract_to_json.dart pkg/intl/test/message_extraction/message_extraction_test.dart pkg/intl/tool/generate_locale_data_files.dart pkg/intl/example/basic/basic_example_runner.dart pkg/intl/example/basic/basic_example.dart pkg/intl/example/basic/messages_de.dart pkg/intl/example/basic/messages_all.dart pkg/intl/example/basic/messages_th_th.dart pkg/serialization/lib/serialization.dart pkg/serialization/lib/src/format.dart pkg/serialization/lib/src/serialization_rule.dart pkg/serialization/lib/src/serialization_helpers.dart pkg/serialization/lib/src/mirrors_helpers.dart pkg/serialization/lib/src/basic_rule.dart pkg/serialization/lib/src/reader_writer.dart pkg/serialization/test/serialization_test.dart pkg/serialization/test/test_models.dart pkg/serialization/test/polyfill_identity_map_test.dart pkg/serialization/test/no_library_test.dart pkg/analyzer_experimental/bin/analyzer.dart pkg/analyzer_experimental/lib/options.dart pkg/analyzer_experimental/lib/analyzer.dart pkg/analyzer_experimental/lib/src/utils.dart pkg/analyzer_experimental/lib/src/error_formatter.dart pkg/analyzer_experimental/lib/src/analyzer_impl.dart pkg/analyzer_experimental/lib/src/error.dart pkg/analyzer_experimental/lib/src/generated/constant.dart pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart pkg/analyzer_experimental/lib/src/generated/instrumentation.dart pkg/analyzer_experimental/lib/src/generated/source_io.dart pkg/analyzer_experimental/lib/src/generated/ast.dart pkg/analyzer_experimental/lib/src/generated/sdk.dart pkg/analyzer_experimental/lib/src/generated/element.dart pkg/analyzer_experimental/lib/src/generated/engine.dart pkg/analyzer_experimental/lib/src/generated/scanner.dart pkg/analyzer_experimental/lib/src/generated/java_core.dart pkg/analyzer_experimental/lib/src/generated/java_engine.dart pkg/analyzer_experimental/lib/src/generated/java_io.dart pkg/analyzer_experimental/lib/src/generated/parser.dart pkg/analyzer_experimental/lib/src/generated/java_junit.dart pkg/analyzer_experimental/lib/src/generated/sdk_io.dart pkg/analyzer_experimental/lib/src/generated/html.dart pkg/analyzer_experimental/lib/src/generated/java_engine_io.dart pkg/analyzer_experimental/lib/src/generated/error.dart pkg/analyzer_experimental/lib/src/generated/source.dart pkg/analyzer_experimental/lib/src/generated/resolver.dart pkg/analyzer_experimental/test/utils.dart pkg/analyzer_experimental/test/error_test.dart pkg/analyzer_experimental/test/options_test.dart pkg/analyzer_experimental/test/generated/resolver_test.dart pkg/analyzer_experimental/test/generated/scanner_test.dart pkg/analyzer_experimental/test/generated/element_test.dart pkg/analyzer_experimental/test/generated/ast_test.dart pkg/analyzer_experimental/test/generated/test_support.dart pkg/analyzer_experimental/test/generated/parser_test.dart pkg/analyzer_experimental/example/scanner_driver.dart pkg/analyzer_experimental/example/resolver_driver.dart pkg/analyzer_experimental/example/parser_driver.dart pkg/webdriver/lib/webdriver.dart pkg/webdriver/lib/src/base64decoder.dart pkg/webdriver/test/webdriver_test.dart pkg/fixnum/lib/fixnum.dart pkg/fixnum/lib/src/int64.dart pkg/fixnum/lib/src/intx.dart pkg/fixnum/lib/src/int32.dart pkg/fixnum/test/int_32_test.dart pkg/fixnum/test/int_64_vm_test.dart pkg/fixnum/test/int_64_test.dart pkg/pathos/lib/path.dart pkg/pathos/test/pathos_test.dart pkg/pathos/test/pathos_windows_test.dart pkg/pathos/test/pathos_posix_test.dart pkg/crypto/lib/crypto.dart pkg/crypto/lib/src/crypto_utils.dart pkg/crypto/lib/src/hmac.dart pkg/crypto/lib/src/sha1.dart pkg/crypto/lib/src/hash_utils.dart pkg/crypto/lib/src/md5.dart pkg/crypto/lib/src/sha256.dart pkg/meta/lib/meta.dart pkg/oauth2/lib/oauth2.dart pkg/oauth2/lib/src/utils.dart pkg/oauth2/lib/src/expiration_exception.dart pkg/oauth2/lib/src/credentials.dart pkg/oauth2/lib/src/authorization_exception.dart pkg/oauth2/lib/src/authorization_code_grant.dart pkg/oauth2/lib/src/handle_access_token_response.dart pkg/oauth2/lib/src/client.dart pkg/oauth2/test/utils.dart pkg/oauth2/test/handle_access_token_response_test.dart pkg/oauth2/test/authorization_code_grant_test.dart pkg/oauth2/test/client_test.dart pkg/oauth2/test/utils_test.dart pkg/oauth2/test/credentials_test.dart pkg/http/lib/http.dart pkg/http/lib/testing.dart pkg/http/lib/src/io_client.dart pkg/http/lib/src/utils.dart pkg/http/lib/src/base_request.dart pkg/http/lib/src/streamed_response.dart pkg/http/lib/src/byte_stream.dart pkg/http/lib/src/base_client.dart pkg/http/lib/src/streamed_request.dart pkg/http/lib/src/base_response.dart pkg/http/lib/src/mock_client.dart pkg/http/lib/src/response.dart pkg/http/lib/src/request.dart pkg/http/lib/src/client.dart pkg/http/lib/src/multipart_file.dart pkg/http/lib/src/multipart_request.dart pkg/http/test/mock_client_test.dart pkg/http/test/utils.dart pkg/http/test/streamed_request_test.dart pkg/http/test/multipart_test.dart pkg/http/test/client_test.dart pkg/http/test/http_test.dart pkg/http/test/request_test.dart pkg/http/test/response_test.dart pkg/http/test/safe_http_server.dart pkg/expect/lib/expect.dart pkg/mdv_observe/lib/mdv_observe.dart pkg/mdv_observe/lib/src/observable_list.dart pkg/mdv_observe/lib/src/observable_map.dart pkg/mdv_observe/lib/src/observable_box.dart pkg/mdv_observe/test/utils.dart pkg/mdv_observe/test/list_change_test.dart pkg/mdv_observe/test/observable_list_test.dart pkg/mdv_observe/test/observe_test.dart pkg/mdv_observe/test/observable_map_test.dart pkg/logging/lib/logging.dart pkg/logging/test/logging_test.dart pkg/stack_trace/lib/stack_trace.dart pkg/stack_trace/lib/src/utils.dart pkg/stack_trace/lib/src/lazy_trace.dart pkg/stack_trace/lib/src/trace.dart pkg/stack_trace/lib/src/frame.dart pkg/stack_trace/test/frame_test.dart pkg/stack_trace/test/trace_test.dart pkg/yaml/lib/yaml.dart pkg/yaml/lib/src/composer.dart pkg/yaml/lib/src/utils.dart pkg/yaml/lib/src/yaml_exception.dart pkg/yaml/lib/src/deep_equals.dart pkg/yaml/lib/src/visitor.dart pkg/yaml/lib/src/yaml_map.dart pkg/yaml/lib/src/parser.dart pkg/yaml/lib/src/model.dart pkg/yaml/lib/src/constructor.dart pkg/yaml/test/yaml_test.dart pkg/scheduled_test/lib/scheduled_test.dart pkg/scheduled_test/lib/scheduled_process.dart pkg/scheduled_test/lib/scheduled_server.dart pkg/scheduled_test/lib/descriptor.dart pkg/scheduled_test/lib/src/utils.dart pkg/scheduled_test/lib/src/schedule_error.dart pkg/scheduled_test/lib/src/task.dart pkg/scheduled_test/lib/src/substitute_future.dart pkg/scheduled_test/lib/src/scheduled_future_matchers.dart pkg/scheduled_test/lib/src/value_future.dart pkg/scheduled_test/lib/src/mock_clock.dart pkg/scheduled_test/lib/src/future_group.dart pkg/scheduled_test/lib/src/schedule.dart pkg/scheduled_test/lib/src/scheduled_server/handler.dart pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart pkg/scheduled_test/lib/src/descriptor/descriptor.dart pkg/scheduled_test/lib/src/descriptor/file_descriptor.dart pkg/scheduled_test/lib/src/descriptor/pattern_descriptor.dart pkg/scheduled_test/test/utils.dart pkg/scheduled_test/test/substitute_future_test.dart pkg/scheduled_test/test/scheduled_server_test.dart pkg/scheduled_test/test/scheduled_future_matchers_test.dart pkg/scheduled_test/test/metatest.dart pkg/scheduled_test/test/value_future_test.dart pkg/scheduled_test/test/scheduled_process_test.dart pkg/scheduled_test/test/descriptor/utils.dart pkg/scheduled_test/test/descriptor/file_test.dart pkg/scheduled_test/test/descriptor/nothing_test.dart pkg/scheduled_test/test/descriptor/pattern_test.dart pkg/scheduled_test/test/descriptor/directory_test.dart pkg/scheduled_test/test/descriptor/async_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart pkg/scheduled_test/test/scheduled_test/nested_task_test.dart pkg/scheduled_test/test/scheduled_test/on_exception_test.dart pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart pkg/scheduled_test/test/scheduled_test/abort_test.dart pkg/scheduled_test/test/scheduled_test/timeout_test.dart pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart pkg/scheduled_test/test/scheduled_test/signal_error_test.dart pkg/scheduled_test/test/scheduled_test/set_up_test.dart pkg/scheduled_test/test/scheduled_test/on_complete_test.dart pkg/scheduled_test/test/scheduled_test/simple_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart pkg/unittest/lib/unittest.dart pkg/unittest/lib/html_individual_config.dart pkg/unittest/lib/vm_config.dart pkg/unittest/lib/html_enhanced_config.dart pkg/unittest/lib/matcher.dart pkg/unittest/lib/interactive_html_config.dart pkg/unittest/lib/mock.dart pkg/unittest/lib/html_config.dart pkg/unittest/lib/compact_vm_config.dart pkg/unittest/lib/src/expect.dart pkg/unittest/lib/src/basematcher.dart pkg/unittest/lib/src/utils.dart pkg/unittest/lib/src/string_matchers.dart pkg/unittest/lib/src/pretty_print.dart pkg/unittest/lib/src/core_matchers.dart pkg/unittest/lib/src/interfaces.dart pkg/unittest/lib/src/description.dart pkg/unittest/lib/src/future_matchers.dart pkg/unittest/lib/src/numeric_matchers.dart pkg/unittest/lib/src/iterable_matchers.dart pkg/unittest/lib/src/map_matchers.dart pkg/unittest/lib/src/config.dart pkg/unittest/lib/src/test_case.dart pkg/unittest/lib/src/operator_matchers.dart pkg/unittest/test/mock_regexp_negative_test.dart pkg/unittest/test/matchers_minified_test.dart pkg/unittest/test/matchers_test.dart pkg/unittest/test/unittest_test.dart pkg/unittest/test/matchers_unminified_test.dart pkg/unittest/test/test_common.dart pkg/unittest/test/test_utils.dart pkg/unittest/test/pretty_print_test.dart pkg/unittest/test/pretty_print_minified_test.dart pkg/unittest/test/instance_test.dart pkg/unittest/test/pretty_print_unminified_test.dart pkg/unittest/test/mock_test.dart pkg/unittest/test/mock_stepwise_negative_test.dart pkg/args/lib/args.dart pkg/args/lib/src/parser.dart pkg/args/lib/src/usage.dart pkg/args/test/args_test.dart pkg/args/test/usage_test.dart pkg/args/test/command_test.dart pkg/args/test/parse_test.dart pkg/args/example/test_runner.dart pkg/source_maps/lib/span.dart pkg/source_maps/lib/source_maps.dart pkg/source_maps/lib/parser.dart pkg/source_maps/lib/builder.dart pkg/source_maps/lib/printer.dart pkg/source_maps/lib/src/utils.dart pkg/source_maps/lib/src/vlq.dart pkg/source_maps/test/vlq_test.dart pkg/source_maps/test/run.dart pkg/source_maps/test/builder_test.dart pkg/source_maps/test/utils_test.dart pkg/source_maps/test/common.dart pkg/source_maps/test/parser_test.dart pkg/source_maps/test/printer_test.dart pkg/source_maps/test/span_test.dart pkg/source_maps/test/end2end_test.dart FORCE_DO_CMD
+	$(call do_cmd,dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot)
+
+all_deps += $(obj)/gen/pub.dart.snapshot
+action_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot_outputs := $(obj)/gen/pub.dart.snapshot
+
+
+### Rules for final target.
+# Build our special outputs first.
+$(obj).target/utils/pub/pub.stamp: | $(action_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot_outputs)
+
+# Preserve order dependency of special output on deps.
+$(action_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot_outputs): | $(builddir)/dart $(obj).target/pkg/pkg_packages.stamp
+
+$(obj).target/utils/pub/pub.stamp: TOOLSET := $(TOOLSET)
+$(obj).target/utils/pub/pub.stamp: $(builddir)/dart $(obj).target/pkg/pkg_packages.stamp FORCE_DO_CMD
+	$(call do_cmd,touch)
+
+all_deps += $(obj).target/utils/pub/pub.stamp
+# Add target alias
+.PHONY: pub
+pub: $(obj).target/utils/pub/pub.stamp
+
+# Add target alias to "all" target.
+.PHONY: all
+all: pub
+
diff --git a/utils/pub/solver/greedy_solver.dart b/utils/pub/solver/greedy_solver.dart
new file mode 100644
index 0000000..e664ea2
--- /dev/null
+++ b/utils/pub/solver/greedy_solver.dart
@@ -0,0 +1,556 @@
+// Copyright (c) 2012, 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.
+
+/// Attempts to resolve a set of version constraints for a package dependency
+/// graph and select an appropriate set of best specific versions for all
+/// dependent packages. It works iteratively and tries to reach a stable
+/// solution where the constraints of all dependencies are met. If it fails to
+/// reach a solution after a certain number of iterations, it assumes the
+/// dependency graph is unstable and reports and error.
+///
+/// There are two fundamental operations in the process of iterating over the
+/// graph:
+///
+/// 1.  Changing the selected concrete version of some package. (This includes
+///     adding and removing a package too, which is considering changing the
+///     version to or from "none".) In other words, a node has changed.
+/// 2.  Changing the version constraint that one package places on another. In
+///     other words, and edge has changed.
+///
+/// Both of these events have a corresponding (potentional) async operation and
+/// roughly cycle back and forth between each other. When we change the version
+/// of package changes, we asynchronously load the pubspec for the new version.
+/// When that's done, we compare the dependencies of the new version versus the
+/// old one. For everything that differs, we change those constraints between
+/// this package and that dependency.
+///
+/// When a constraint on a package changes, we re-calculate the overall
+/// constraint on that package. I.e. with a shared dependency, we intersect all
+/// of the constraints that its depending packages place on it. If that overall
+/// constraint changes (say from "<3.0.0" to "<2.5.0"), then the currently
+/// picked version for that package may fall outside of the new constraint. If
+/// that happens, we find the new best version that meets the updated constraint
+/// and then the change the package to use that version. That cycles back up to
+/// the beginning again.
+library version_solver1;
+
+import 'dart:async';
+import 'dart:collection' show Queue;
+import 'dart:math' as math;
+
+import '../lock_file.dart';
+import '../log.dart' as log;
+import '../package.dart';
+import '../source.dart';
+import '../source_registry.dart';
+import '../version.dart';
+import 'version_solver.dart';
+
+class GreedyVersionSolver extends VersionSolver {
+  final _packages = <String, DependencyNode>{};
+  final _work = new Queue<WorkItem>();
+  int _numIterations = 0;
+
+  GreedyVersionSolver(SourceRegistry sources, Package root, LockFile lockFile,
+                      List<String> useLatest)
+      : super(sources, root, lockFile, useLatest);
+
+  /// The non-backtracking solver always only tries one solution.
+  int get attemptedSolutions => 1;
+
+  void forceLatestVersion(String package) {
+    // TODO(nweiz): How do we want to detect and handle unknown dependencies
+    // here?
+    getDependency(package).useLatestVersion = true;
+  }
+
+  Future<List<PackageId>> runSolver() {
+    // Kick off the work by adding the root package at its concrete version to
+    // the dependency graph.
+    enqueue(new AddConstraint('(entrypoint)', new PackageRef.root(root)));
+
+    Future processNextWorkItem(_) {
+      while (true) {
+        // Stop if we are done.
+        if (_work.isEmpty) return new Future.value(buildResults());
+
+        // If we appear to be stuck in a loop, then we probably have an unstable
+        // graph, bail. We guess this based on a rough heuristic that it should
+        // only take a certain number of steps to solve a graph with a given
+        // number of connections.
+        // TODO(rnystrom): These numbers here are magic and arbitrary. Tune
+        // when we have a better picture of real-world package topologies.
+        _numIterations++;
+        if (_numIterations > math.max(50, _packages.length * 5)) {
+          throw new CouldNotSolveException();
+        }
+
+        // Run the first work item.
+        var future = _work.removeFirst().process(this);
+
+        // If we have an async operation to perform, chain the loop to resume
+        // when it's done. Otherwise, just loop synchronously.
+        if (future != null) {
+          return future.then(processNextWorkItem);
+        }
+      }
+    }
+
+    return processNextWorkItem(null);
+  }
+
+  void enqueue(WorkItem work) {
+    _work.add(work);
+  }
+
+  DependencyNode getDependency(String package) {
+    // There can be unused dependencies in the graph, so just create an empty
+    // one if needed.
+    _packages.putIfAbsent(package, () => new DependencyNode(package));
+    return _packages[package];
+  }
+
+  /// Sets the best selected version of [package] to [version].
+  void setVersion(String package, Version version) {
+    _packages[package].version = version;
+  }
+
+  /// Returns the most recent version of [dependency] that satisfies all of its
+  /// version constraints.
+  Future<Version> getBestVersion(DependencyNode dependency) {
+    return cache.getVersions(dependency.name,
+        dependency.source, dependency.description).then((versions) {
+      var best = null;
+      for (var ref in versions) {
+        if (dependency.useLatestVersion ||
+            dependency.constraint.allows(ref.version)) {
+          if (best == null || ref.version > best) best = ref.version;
+        }
+      }
+
+      // TODO(rnystrom): Better exception.
+      if (best == null) {
+        if (tryUnlockDepender(dependency)) return null;
+        throw new NoVersionException(dependency.name, dependency.constraint,
+            dependency.toList());
+      } else if (!dependency.constraint.allows(best)) {
+        if (tryUnlockDepender(dependency)) return null;
+        throw new CouldNotUpdateException(
+            dependency.name, dependency.constraint, best);
+      }
+
+      return best;
+    });
+  }
+
+  /// Looks for a package that depends (transitively) on [dependency] and has
+  /// its version locked in the lockfile. If one is found, enqueues an
+  /// [UnlockPackage] work item for it and returns true. Otherwise, returns
+  /// false.
+  ///
+  /// This does a breadth-first search; immediate dependers will be unlocked
+  /// first, followed by transitive dependers.
+  bool tryUnlockDepender(DependencyNode dependency, [Set<String> seen]) {
+    if (seen == null) seen = new Set();
+    // Avoid an infinite loop if there are circular dependencies.
+    if (seen.contains(dependency.name)) return false;
+    seen.add(dependency.name);
+
+    for (var dependerName in dependency.dependers) {
+      var depender = getDependency(dependerName);
+      var locked = lockFile.packages[dependerName];
+      if (locked != null && depender.version == locked.version &&
+          depender.source.name == locked.source.name) {
+        enqueue(new UnlockPackage(depender));
+        return true;
+      }
+    }
+
+    return dependency.dependers.map(getDependency).any((subdependency) =>
+        tryUnlockDepender(subdependency, seen));
+  }
+
+  List<PackageId> buildResults() {
+    return _packages.values
+        .where((dep) => dep.isDependedOn)
+        .map(_dependencyToPackageId)
+        .toList();
+  }
+
+  PackageId _dependencyToPackageId(DependencyNode dep) {
+    var description = dep.description;
+
+    // If the lockfile contains a fully-resolved description for the package,
+    // use that. This allows e.g. Git to ensure that the same commit is used.
+    var lockedPackage = lockFile.packages[dep.name];
+    if (lockedPackage != null && lockedPackage.version == dep.version &&
+        lockedPackage.source.name == dep.source.name &&
+        dep.source.descriptionsEqual(
+            description, lockedPackage.description)) {
+      description = lockedPackage.description;
+    }
+
+    return new PackageId(dep.name, dep.source, dep.version, description);
+  }
+}
+
+/// The constraint solver works by iteratively processing a queue of work items.
+/// Each item is a single atomic change to the dependency graph. Handling them
+/// in a queue lets us handle asynchrony (resolving versions requires
+/// information from servers) as well as avoid deeply nested recursion.
+abstract class WorkItem {
+  /// Processes this work item. Returns a future that completes when the work is
+  /// done. If `null` is returned, that means the work has completed
+  /// synchronously and the next item can be started immediately.
+  Future process(GreedyVersionSolver solver);
+}
+
+/// The best selected version for a package has changed to [version]. If the
+/// previous version of the package is `null`, that means the package is being
+/// added to the graph. If [version] is `null`, it is being removed.
+class ChangeVersion implements WorkItem {
+  /// The name of the package whose version is being changed.
+  final String package;
+
+  /// The source of the package whose version is changing.
+  final Source source;
+
+  /// The description identifying the package whose version is changing.
+  final description;
+
+  /// The new selected version.
+  final Version version;
+
+  ChangeVersion(this.package, this.source, this.description, this.version);
+
+  Future process(GreedyVersionSolver solver) {
+    log.fine("Changing $package to version $version.");
+
+    var dependency = solver.getDependency(package);
+    var oldVersion = dependency.version;
+    solver.setVersion(package, version);
+
+    // The dependencies between the old and new version may be different. Walk
+    // them both and update any constraints that differ between the two.
+    return Future.wait([
+        getDependencyRefs(solver, oldVersion),
+        getDependencyRefs(solver, version)]).then((list) {
+      var oldDependencyRefs = list[0];
+      var newDependencyRefs = list[1];
+
+      for (var oldRef in oldDependencyRefs.values) {
+        if (newDependencyRefs.containsKey(oldRef.name)) {
+          // The dependency is in both versions of this package, but its
+          // constraint may have changed.
+          var newRef = newDependencyRefs.remove(oldRef.name);
+          solver.enqueue(new AddConstraint(package, newRef));
+        } else {
+          // The dependency is not in the new version of the package, so just
+          // remove its constraint.
+          solver.enqueue(new RemoveConstraint(package, oldRef.name));
+        }
+      }
+
+      // Everything that's left is a depdendency that's only in the new
+      // version of the package.
+      for (var newRef in newDependencyRefs.values) {
+        solver.enqueue(new AddConstraint(package, newRef));
+      }
+    });
+  }
+
+  /// Get the dependencies at [version] of the package being changed.
+  Future<Map<String, PackageRef>> getDependencyRefs(VersionSolver solver,
+      Version version) {
+    // If there is no version, it means no package, so no dependencies.
+    if (version == null) {
+      return new Future<Map<String, PackageRef>>.value(<String, PackageRef>{});
+    }
+
+    var id = new PackageId(package, source, version, description);
+    return solver.cache.getPubspec(id).then((pubspec) {
+      var dependencies = <String, PackageRef>{};
+      for (var dependency in pubspec.dependencies) {
+        dependencies[dependency.name] = dependency;
+      }
+
+      // Include dev dependencies only from the root package.
+      if (id.isRoot) {
+        for (var dependency in pubspec.devDependencies) {
+          dependencies[dependency.name] = dependency;
+        }
+      }
+
+      return dependencies;
+    });
+  }
+}
+
+/// A constraint that a depending package places on a dependent package has
+/// changed.
+///
+/// This is an abstract class that contains logic for updating the dependency
+/// graph once a dependency has changed. Changing the dependency is the
+/// responsibility of subclasses.
+abstract class ChangeConstraint implements WorkItem {
+  Future process(GreedyVersionSolver solver);
+
+  void undo(GreedyVersionSolver solver);
+
+  Future _processChange(GreedyVersionSolver solver,
+                        DependencyNode oldDependency,
+                        DependencyNode newDependency) {
+    var name = newDependency.name;
+    var source = oldDependency.source != null ?
+      oldDependency.source : newDependency.source;
+    var description = oldDependency.description != null ?
+      oldDependency.description : newDependency.description;
+    var oldConstraint = oldDependency.constraint;
+    var newConstraint = newDependency.constraint;
+
+    // If the package is over-constrained, i.e. the packages depending have
+    // disjoint constraints, then try unlocking a depender that's locked by the
+    // lockfile. If there are no remaining locked dependencies, throw an error.
+    if (newConstraint != null && newConstraint.isEmpty) {
+      if (solver.tryUnlockDepender(newDependency)) {
+        undo(solver);
+        return null;
+      }
+
+      throw new DisjointConstraintException(name, newDependency.toList());
+    }
+
+    // If this constraint change didn't cause the overall constraint on the
+    // package to change, then we don't need to do any further work.
+    if (oldConstraint == newConstraint) return null;
+
+    // If the dependency has been cut free from the graph, just remove it.
+    if (!newDependency.isDependedOn) {
+      solver.enqueue(new ChangeVersion(name, source, description, null));
+      return null;
+    }
+
+    // If the dependency is on the root package, then we don't need to do
+    // anything since it's already at the best version.
+    if (name == solver.root.name) {
+      solver.enqueue(new ChangeVersion(
+          name, source, description, solver.root.version));
+      return null;
+    }
+
+    // If the dependency is on a package in the lockfile, use the lockfile's
+    // version for that package if it's valid given the other constraints.
+    var lockedPackage = solver.lockFile.packages[name];
+    if (lockedPackage != null && newDependency.source == lockedPackage.source) {
+      var lockedVersion = lockedPackage.version;
+      if (newConstraint.allows(lockedVersion)) {
+        solver.enqueue(
+            new ChangeVersion(name, source, description, lockedVersion));
+        return null;
+      }
+    }
+
+    // The constraint has changed, so see what the best version of the package
+    // that meets the new constraint is.
+    return solver.getBestVersion(newDependency).then((best) {
+      if (best == null) {
+        undo(solver);
+      } else if (newDependency.version != best) {
+        solver.enqueue(new ChangeVersion(name, source, description, best));
+      }
+    });
+  }
+}
+
+/// The constraint given by [ref] is being placed by [depender].
+class AddConstraint extends ChangeConstraint {
+  /// The package that has the dependency.
+  final String depender;
+
+  /// The package being depended on and the constraints being placed on it. The
+  /// source, version, and description in this ref are all considered
+  /// constraints on the dependent package.
+  final PackageRef ref;
+
+  AddConstraint(this.depender, this.ref);
+
+  Future process(GreedyVersionSolver solver) {
+    log.fine("Adding $depender's constraint $ref.");
+
+    var dependency = solver.getDependency(ref.name);
+    var oldDependency = dependency.clone();
+    dependency.placeConstraint(depender, ref);
+    return _processChange(solver, oldDependency, dependency);
+  }
+
+  void undo(GreedyVersionSolver solver) {
+    solver.getDependency(ref.name).removeConstraint(depender);
+  }
+}
+
+/// [depender] is no longer placing a constraint on [dependent].
+class RemoveConstraint extends ChangeConstraint {
+  /// The package that was placing a constraint on [dependent].
+  String depender;
+
+  /// The package that was being depended on.
+  String dependent;
+
+  /// The constraint that was removed.
+  PackageRef _removed;
+
+  RemoveConstraint(this.depender, this.dependent);
+
+  Future process(GreedyVersionSolver solver) {
+    log.fine("Removing $depender's constraint ($_removed) on $dependent.");
+
+    var dependency = solver.getDependency(dependent);
+    var oldDependency = dependency.clone();
+    _removed = dependency.removeConstraint(depender);
+    return _processChange(solver, oldDependency, dependency);
+  }
+
+  void undo(GreedyVersionSolver solver) {
+    solver.getDependency(dependent).placeConstraint(depender, _removed);
+  }
+}
+
+/// [package]'s version is no longer constrained by the lockfile.
+class UnlockPackage implements WorkItem {
+  /// The package being unlocked.
+  DependencyNode package;
+
+  UnlockPackage(this.package);
+
+  Future process(GreedyVersionSolver solver) {
+    log.fine("Unlocking ${package.name}.");
+
+    solver.lockFile.packages.remove(package.name);
+    return solver.getBestVersion(package).then((best) {
+      if (best == null) return null;
+      solver.enqueue(new ChangeVersion(
+          package.name, package.source, package.description, best));
+    });
+  }
+}
+
+/// Describes one [Package] in the [DependencyGraph] and keeps track of which
+/// packages depend on it and what constraints they place on it.
+class DependencyNode {
+  /// The name of the this dependency's package.
+  final String name;
+
+  /// The [PackageRefs] that represent constraints that depending packages have
+  /// placed on this one.
+  final Map<String, PackageRef> _refs;
+
+  /// The currently-selected best version for this dependency.
+  Version version;
+
+  /// Whether this dependency should always select the latest version.
+  bool useLatestVersion = false;
+
+  /// Gets whether or not any other packages are currently depending on this
+  /// one. If `false`, then it means this package is not part of the dependency
+  /// graph and should be omitted.
+  bool get isDependedOn => !_refs.isEmpty;
+
+  /// The names of all the packages that depend on this dependency.
+  Iterable<String> get dependers => _refs.keys;
+
+  /// Gets the overall constraint that all packages are placing on this one.
+  /// If no packages have a constraint on this one (which can happen when this
+  /// package is in the process of being added to the graph), returns `null`.
+  VersionConstraint get constraint {
+    if (_refs.isEmpty) return null;
+    return new VersionConstraint.intersection(
+        _refs.values.map((ref) => ref.constraint));
+  }
+
+  /// The source of this dependency's package.
+  Source get source {
+     var canonical = _canonicalRef();
+     if (canonical == null) return null;
+     return canonical.source;
+  }
+
+  /// The description of this dependency's package.
+  get description {
+     var canonical = _canonicalRef();
+     if (canonical == null) return null;
+     return canonical.description;
+  }
+
+  /// Return the PackageRef that has the canonical source and description for
+  /// this package. If any dependency is on the root package, that will be used;
+  /// otherwise, it will be the source and description that all dependencies
+  /// agree upon.
+  PackageRef _canonicalRef() {
+    if (_refs.isEmpty) return null;
+    var refs = _refs.values;
+    for (var ref in refs) {
+      if (ref.isRoot) return ref;
+    }
+    return refs.first;
+  }
+
+  DependencyNode(this.name)
+      : _refs = <String, PackageRef>{};
+
+  DependencyNode._clone(DependencyNode other)
+      : name = other.name,
+        version = other.version,
+        _refs = new Map<String, PackageRef>.from(other._refs);
+
+  /// Creates a copy of this dependency.
+  DependencyNode clone() => new DependencyNode._clone(this);
+
+  /// Places [ref] as a constraint from [package] onto this.
+  void placeConstraint(String package, PackageRef ref) {
+    var requiredDepender = _requiredDepender();
+    if (requiredDepender != null) {
+      var required = _refs[requiredDepender];
+      if (required.source.name != ref.source.name) {
+        throw new SourceMismatchException(name, [
+            new Dependency(requiredDepender, required),
+            new Dependency(package, ref)]);
+      } else if (!required.descriptionEquals(ref)) {
+        throw new DescriptionMismatchException(name, [
+            new Dependency(requiredDepender, required),
+            new Dependency(package, ref)]);
+      }
+    }
+
+    _refs[package] = ref;
+  }
+
+  /// Returns the name of a package whose constraint source and description
+  /// all other constraints must match. Returns null if there are no
+  /// requirements on new constraints.
+  String _requiredDepender() {
+    if (_refs.isEmpty) return null;
+
+    var dependers = _refs.keys.toList();
+    if (dependers.length == 1) {
+      var depender = dependers[0];
+      if (_refs[depender].isRoot) return null;
+      return depender;
+    }
+
+    return dependers[1];
+  }
+
+  /// Removes the constraint from [package] onto this.
+  PackageRef removeConstraint(String package) => _refs.remove(package);
+
+  /// Converts this to a list of [Dependency] objects like the error types
+  /// expect.
+  List<Dependency> toList() {
+    var result = <Dependency>[];
+    _refs.forEach((name, ref) {
+      result.add(new Dependency(name, ref));
+    });
+    return result;
+  }
+}
