Deprecate unneeded fields from PackageBundle.

Change-Id: I071a44499ef20a32388eea7ba04264c8c9b8e1c9
Reviewed-on: https://dart-review.googlesource.com/73285
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 96a374d..599f424 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -3099,7 +3099,7 @@
   }
 
   @override
-  bool get fallbackMode =>
+  Null get fallbackMode =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -3316,7 +3316,7 @@
   }
 
   @override
-  bool get fallbackMode =>
+  Null get fallbackMode =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -3432,7 +3432,7 @@
   }
 
   @override
-  int get localIndex =>
+  Null get localIndex =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -3580,7 +3580,7 @@
   }
 
   @override
-  int get localIndex =>
+  Null get localIndex =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -3915,8 +3915,6 @@
 class PackageBundleBuilder extends Object
     with _PackageBundleMixin
     implements idl.PackageBundle {
-  String _apiSignature;
-  List<PackageDependencyInfoBuilder> _dependencies;
   List<LinkedLibraryBuilder> _linkedLibraries;
   List<String> _linkedLibraryUris;
   int _majorVersion;
@@ -3925,27 +3923,12 @@
   List<String> _unlinkedUnitUris;
 
   @override
-  String get apiSignature => _apiSignature ??= '';
-
-  /**
-   * MD5 hash of the non-informative fields of the [PackageBundle] (not
-   * including this one).  This can be used to identify when the API of a
-   * package may have changed.
-   */
-  void set apiSignature(String value) {
-    this._apiSignature = value;
-  }
+  Null get apiSignature =>
+      throw new UnimplementedError('attempt to access deprecated field');
 
   @override
-  List<PackageDependencyInfoBuilder> get dependencies =>
-      _dependencies ??= <PackageDependencyInfoBuilder>[];
-
-  /**
-   * Information about the packages this package depends on, if known.
-   */
-  void set dependencies(List<PackageDependencyInfoBuilder> value) {
-    this._dependencies = value;
-  }
+  Null get dependencies =>
+      throw new UnimplementedError('attempt to access deprecated field');
 
   @override
   List<LinkedLibraryBuilder> get linkedLibraries =>
@@ -3994,7 +3977,7 @@
   }
 
   @override
-  List<String> get unlinkedUnitHashes =>
+  Null get unlinkedUnitHashes =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -4019,17 +4002,13 @@
   }
 
   PackageBundleBuilder(
-      {String apiSignature,
-      List<PackageDependencyInfoBuilder> dependencies,
-      List<LinkedLibraryBuilder> linkedLibraries,
+      {List<LinkedLibraryBuilder> linkedLibraries,
       List<String> linkedLibraryUris,
       int majorVersion,
       int minorVersion,
       List<UnlinkedUnitBuilder> unlinkedUnits,
       List<String> unlinkedUnitUris})
-      : _apiSignature = apiSignature,
-        _dependencies = dependencies,
-        _linkedLibraries = linkedLibraries,
+      : _linkedLibraries = linkedLibraries,
         _linkedLibraryUris = linkedLibraryUris,
         _majorVersion = majorVersion,
         _minorVersion = minorVersion,
@@ -4040,7 +4019,6 @@
    * Flush [informative] data recursively.
    */
   void flushInformative() {
-    _dependencies = null;
     _linkedLibraries?.forEach((b) => b.flushInformative());
     _unlinkedUnits?.forEach((b) => b.flushInformative());
   }
@@ -4083,7 +4061,6 @@
     }
     signature.addInt(this._majorVersion ?? 0);
     signature.addInt(this._minorVersion ?? 0);
-    signature.addString(this._apiSignature ?? '');
   }
 
   List<int> toBuffer() {
@@ -4092,19 +4069,10 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_apiSignature;
-    fb.Offset offset_dependencies;
     fb.Offset offset_linkedLibraries;
     fb.Offset offset_linkedLibraryUris;
     fb.Offset offset_unlinkedUnits;
     fb.Offset offset_unlinkedUnitUris;
-    if (_apiSignature != null) {
-      offset_apiSignature = fbBuilder.writeString(_apiSignature);
-    }
-    if (!(_dependencies == null || _dependencies.isEmpty)) {
-      offset_dependencies = fbBuilder
-          .writeList(_dependencies.map((b) => b.finish(fbBuilder)).toList());
-    }
     if (!(_linkedLibraries == null || _linkedLibraries.isEmpty)) {
       offset_linkedLibraries = fbBuilder
           .writeList(_linkedLibraries.map((b) => b.finish(fbBuilder)).toList());
@@ -4122,12 +4090,6 @@
           _unlinkedUnitUris.map((b) => fbBuilder.writeString(b)).toList());
     }
     fbBuilder.startTable();
-    if (offset_apiSignature != null) {
-      fbBuilder.addOffset(7, offset_apiSignature);
-    }
-    if (offset_dependencies != null) {
-      fbBuilder.addOffset(8, offset_dependencies);
-    }
     if (offset_linkedLibraries != null) {
       fbBuilder.addOffset(0, offset_linkedLibraries);
     }
@@ -4171,8 +4133,6 @@
 
   _PackageBundleImpl(this._bc, this._bcOffset);
 
-  String _apiSignature;
-  List<idl.PackageDependencyInfo> _dependencies;
   List<idl.LinkedLibrary> _linkedLibraries;
   List<String> _linkedLibraryUris;
   int _majorVersion;
@@ -4181,18 +4141,12 @@
   List<String> _unlinkedUnitUris;
 
   @override
-  String get apiSignature {
-    _apiSignature ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 7, '');
-    return _apiSignature;
-  }
+  Null get apiSignature =>
+      throw new UnimplementedError('attempt to access deprecated field');
 
   @override
-  List<idl.PackageDependencyInfo> get dependencies {
-    _dependencies ??= const fb.ListReader<idl.PackageDependencyInfo>(
-            const _PackageDependencyInfoReader())
-        .vTableGet(_bc, _bcOffset, 8, const <idl.PackageDependencyInfo>[]);
-    return _dependencies;
-  }
+  Null get dependencies =>
+      throw new UnimplementedError('attempt to access deprecated field');
 
   @override
   List<idl.LinkedLibrary> get linkedLibraries {
@@ -4222,7 +4176,7 @@
   }
 
   @override
-  List<String> get unlinkedUnitHashes =>
+  Null get unlinkedUnitHashes =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -4245,10 +4199,6 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (apiSignature != '') _result["apiSignature"] = apiSignature;
-    if (dependencies.isNotEmpty)
-      _result["dependencies"] =
-          dependencies.map((_value) => _value.toJson()).toList();
     if (linkedLibraries.isNotEmpty)
       _result["linkedLibraries"] =
           linkedLibraries.map((_value) => _value.toJson()).toList();
@@ -4266,8 +4216,6 @@
 
   @override
   Map<String, Object> toMap() => {
-        "apiSignature": apiSignature,
-        "dependencies": dependencies,
         "linkedLibraries": linkedLibraries,
         "linkedLibraryUris": linkedLibraryUris,
         "majorVersion": majorVersion,
@@ -4280,231 +4228,6 @@
   String toString() => convert.json.encode(toJson());
 }
 
-class PackageDependencyInfoBuilder extends Object
-    with _PackageDependencyInfoMixin
-    implements idl.PackageDependencyInfo {
-  String _apiSignature;
-  List<String> _includedPackageNames;
-  bool _includesDartUris;
-  bool _includesFileUris;
-  String _summaryPath;
-
-  @override
-  String get apiSignature => _apiSignature ??= '';
-
-  /**
-   * API signature of this dependency.
-   */
-  void set apiSignature(String value) {
-    this._apiSignature = value;
-  }
-
-  @override
-  List<String> get includedPackageNames => _includedPackageNames ??= <String>[];
-
-  /**
-   * If this dependency summarizes any files whose URI takes the form
-   * "package:<package_name>/...", a list of all such package names, sorted
-   * lexicographically.  Otherwise empty.
-   */
-  void set includedPackageNames(List<String> value) {
-    this._includedPackageNames = value;
-  }
-
-  @override
-  bool get includesDartUris => _includesDartUris ??= false;
-
-  /**
-   * Indicates whether this dependency summarizes any files whose URI takes the
-   * form "dart:...".
-   */
-  void set includesDartUris(bool value) {
-    this._includesDartUris = value;
-  }
-
-  @override
-  bool get includesFileUris => _includesFileUris ??= false;
-
-  /**
-   * Indicates whether this dependency summarizes any files whose URI takes the
-   * form "file:...".
-   */
-  void set includesFileUris(bool value) {
-    this._includesFileUris = value;
-  }
-
-  @override
-  String get summaryPath => _summaryPath ??= '';
-
-  /**
-   * Relative path to the summary file for this dependency.  This is intended as
-   * a hint to help the analysis server locate summaries of dependencies.  We
-   * don't specify precisely what this path is relative to, but we expect it to
-   * be relative to a directory the analysis server can find (e.g. for projects
-   * built using Bazel, it would be relative to the "bazel-bin" directory).
-   *
-   * Absent if the path is not known.
-   */
-  void set summaryPath(String value) {
-    this._summaryPath = value;
-  }
-
-  PackageDependencyInfoBuilder(
-      {String apiSignature,
-      List<String> includedPackageNames,
-      bool includesDartUris,
-      bool includesFileUris,
-      String summaryPath})
-      : _apiSignature = apiSignature,
-        _includedPackageNames = includedPackageNames,
-        _includesDartUris = includesDartUris,
-        _includesFileUris = includesFileUris,
-        _summaryPath = summaryPath;
-
-  /**
-   * Flush [informative] data recursively.
-   */
-  void flushInformative() {}
-
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    signature.addString(this._apiSignature ?? '');
-    signature.addString(this._summaryPath ?? '');
-    if (this._includedPackageNames == null) {
-      signature.addInt(0);
-    } else {
-      signature.addInt(this._includedPackageNames.length);
-      for (var x in this._includedPackageNames) {
-        signature.addString(x);
-      }
-    }
-    signature.addBool(this._includesFileUris == true);
-    signature.addBool(this._includesDartUris == true);
-  }
-
-  fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_apiSignature;
-    fb.Offset offset_includedPackageNames;
-    fb.Offset offset_summaryPath;
-    if (_apiSignature != null) {
-      offset_apiSignature = fbBuilder.writeString(_apiSignature);
-    }
-    if (!(_includedPackageNames == null || _includedPackageNames.isEmpty)) {
-      offset_includedPackageNames = fbBuilder.writeList(
-          _includedPackageNames.map((b) => fbBuilder.writeString(b)).toList());
-    }
-    if (_summaryPath != null) {
-      offset_summaryPath = fbBuilder.writeString(_summaryPath);
-    }
-    fbBuilder.startTable();
-    if (offset_apiSignature != null) {
-      fbBuilder.addOffset(0, offset_apiSignature);
-    }
-    if (offset_includedPackageNames != null) {
-      fbBuilder.addOffset(2, offset_includedPackageNames);
-    }
-    if (_includesDartUris == true) {
-      fbBuilder.addBool(4, true);
-    }
-    if (_includesFileUris == true) {
-      fbBuilder.addBool(3, true);
-    }
-    if (offset_summaryPath != null) {
-      fbBuilder.addOffset(1, offset_summaryPath);
-    }
-    return fbBuilder.endTable();
-  }
-}
-
-class _PackageDependencyInfoReader
-    extends fb.TableReader<_PackageDependencyInfoImpl> {
-  const _PackageDependencyInfoReader();
-
-  @override
-  _PackageDependencyInfoImpl createObject(fb.BufferContext bc, int offset) =>
-      new _PackageDependencyInfoImpl(bc, offset);
-}
-
-class _PackageDependencyInfoImpl extends Object
-    with _PackageDependencyInfoMixin
-    implements idl.PackageDependencyInfo {
-  final fb.BufferContext _bc;
-  final int _bcOffset;
-
-  _PackageDependencyInfoImpl(this._bc, this._bcOffset);
-
-  String _apiSignature;
-  List<String> _includedPackageNames;
-  bool _includesDartUris;
-  bool _includesFileUris;
-  String _summaryPath;
-
-  @override
-  String get apiSignature {
-    _apiSignature ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
-    return _apiSignature;
-  }
-
-  @override
-  List<String> get includedPackageNames {
-    _includedPackageNames ??=
-        const fb.ListReader<String>(const fb.StringReader())
-            .vTableGet(_bc, _bcOffset, 2, const <String>[]);
-    return _includedPackageNames;
-  }
-
-  @override
-  bool get includesDartUris {
-    _includesDartUris ??=
-        const fb.BoolReader().vTableGet(_bc, _bcOffset, 4, false);
-    return _includesDartUris;
-  }
-
-  @override
-  bool get includesFileUris {
-    _includesFileUris ??=
-        const fb.BoolReader().vTableGet(_bc, _bcOffset, 3, false);
-    return _includesFileUris;
-  }
-
-  @override
-  String get summaryPath {
-    _summaryPath ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
-    return _summaryPath;
-  }
-}
-
-abstract class _PackageDependencyInfoMixin
-    implements idl.PackageDependencyInfo {
-  @override
-  Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
-    if (apiSignature != '') _result["apiSignature"] = apiSignature;
-    if (includedPackageNames.isNotEmpty)
-      _result["includedPackageNames"] = includedPackageNames;
-    if (includesDartUris != false)
-      _result["includesDartUris"] = includesDartUris;
-    if (includesFileUris != false)
-      _result["includesFileUris"] = includesFileUris;
-    if (summaryPath != '') _result["summaryPath"] = summaryPath;
-    return _result;
-  }
-
-  @override
-  Map<String, Object> toMap() => {
-        "apiSignature": apiSignature,
-        "includedPackageNames": includedPackageNames,
-        "includesDartUris": includesDartUris,
-        "includesFileUris": includesFileUris,
-        "summaryPath": summaryPath,
-      };
-
-  @override
-  String toString() => convert.json.encode(toJson());
-}
-
 class PackageIndexBuilder extends Object
     with _PackageIndexMixin
     implements idl.PackageIndex {
@@ -6890,11 +6613,11 @@
   String _text;
 
   @override
-  int get length =>
+  Null get length =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
-  int get offset =>
+  Null get offset =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -6958,11 +6681,11 @@
   String _text;
 
   @override
-  int get length =>
+  Null get length =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
-  int get offset =>
+  Null get offset =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -7676,11 +7399,11 @@
   }
 
   @override
-  List<String> get localLabels =>
+  Null get localLabels =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
-  List<UnlinkedVariableBuilder> get localVariables =>
+  Null get localVariables =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -8269,11 +7992,11 @@
   }
 
   @override
-  List<String> get localLabels =>
+  Null get localLabels =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
-  List<idl.UnlinkedVariable> get localVariables =>
+  Null get localVariables =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -11506,7 +11229,7 @@
   }
 
   @override
-  String get fallbackModePath =>
+  Null get fallbackModePath =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -12077,7 +11800,7 @@
   }
 
   @override
-  String get fallbackModePath =>
+  Null get fallbackModePath =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
@@ -12444,11 +12167,11 @@
   }
 
   @override
-  int get visibleLength =>
+  Null get visibleLength =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
-  int get visibleOffset =>
+  Null get visibleOffset =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   UnlinkedVariableBuilder(
@@ -12715,11 +12438,11 @@
   }
 
   @override
-  int get visibleLength =>
+  Null get visibleLength =>
       throw new UnimplementedError('attempt to access deprecated field');
 
   @override
-  int get visibleOffset =>
+  Null get visibleOffset =>
       throw new UnimplementedError('attempt to access deprecated field');
 }
 
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index b804769..542ec79 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -1548,12 +1548,12 @@
    * including this one).  This can be used to identify when the API of a
    * package may have changed.
    */
-  apiSignature:string (id: 7);
+  apiSignature:string (id: 7, deprecated);
 
   /**
    * Information about the packages this package depends on, if known.
    */
-  dependencies:[PackageDependencyInfo] (id: 8);
+  dependencies:[PackageDependencyInfo] (id: 8, deprecated);
 
   /**
    * Linked libraries.
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 4b42d06..ee9df47 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -944,6 +944,7 @@
    * package may have changed.
    */
   @Id(7)
+  @deprecated
   String get apiSignature;
 
   /**
@@ -951,6 +952,7 @@
    */
   @Id(8)
   @informative
+  @deprecated
   List<PackageDependencyInfo> get dependencies;
 
   /**
@@ -1005,6 +1007,7 @@
 /**
  * Information about a single dependency of a summary package.
  */
+@deprecated
 abstract class PackageDependencyInfo extends base.SummaryClass {
   /**
    * API signature of this dependency.
diff --git a/pkg/analyzer/lib/src/summary/summarize_elements.dart b/pkg/analyzer/lib/src/summary/summarize_elements.dart
index 0bf4716..30964d4 100644
--- a/pkg/analyzer/lib/src/summary/summarize_elements.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_elements.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
-import 'package:front_end/src/base/api_signature.dart';
 
 /**
  * Object that gathers information uses it to assemble a new
@@ -63,19 +62,6 @@
         unlinkedUnitUris: _unlinkedUnitUris,
         unlinkedUnits: _unlinkedUnits,
         majorVersion: currentMajorVersion,
-        minorVersion: currentMinorVersion,
-        apiSignature: _computeApiSignature());
-  }
-
-  /**
-   * Compute the API signature for this package bundle.
-   */
-  String _computeApiSignature() {
-    ApiSignature apiSignature = new ApiSignature();
-    for (String unitUri in _unlinkedUnitMap.keys.toList()..sort()) {
-      apiSignature.addString(unitUri);
-      _unlinkedUnitMap[unitUri].collectApiSignature(apiSignature);
-    }
-    return apiSignature.toHex();
+        minorVersion: currentMinorVersion);
   }
 }
diff --git a/pkg/analyzer/test/src/summary/linker_test.dart b/pkg/analyzer/test/src/summary/linker_test.dart
index e738436..12b8e8c 100644
--- a/pkg/analyzer/test/src/summary/linker_test.dart
+++ b/pkg/analyzer/test/src/summary/linker_test.dart
@@ -33,60 +33,6 @@
     return linker.getLibrary(Uri.parse(uri));
   }
 
-  void test_apiSignature_apiChanges() {
-    var bundle0 =
-        createPackageBundle('f(int i) { print(i); }', path: '/test.dart');
-    var bundle1 =
-        createPackageBundle('f(String s) { print(s); }', path: '/test.dart');
-    expect(bundle0.apiSignature, isNotEmpty);
-    expect(bundle1.apiSignature, isNotEmpty);
-    expect(bundle0.apiSignature, isNot(bundle1.apiSignature));
-  }
-
-  void test_apiSignature_localChanges() {
-    var bundle0 = createPackageBundle('f() { print(0); }', path: '/test.dart');
-    var bundle1 = createPackageBundle('f() { print(1); }', path: '/test.dart');
-    expect(bundle0.apiSignature, isNotEmpty);
-    expect(bundle1.apiSignature, isNotEmpty);
-    expect(bundle0.apiSignature, bundle1.apiSignature);
-  }
-
-  void test_apiSignature_orderChange() {
-    // A change to the order in which files are processed should not affect the
-    // API signature.
-    addNamedSource('/a.dart', 'class A {}');
-    var bundle0 = createPackageBundle('class B {}', path: '/b.dart');
-    addNamedSource('/b.dart', 'class B {}');
-    var bundle1 = createPackageBundle('class A {}', path: '/a.dart');
-    expect(bundle0.apiSignature, isNotEmpty);
-    expect(bundle1.apiSignature, isNotEmpty);
-    expect(bundle0.apiSignature, bundle1.apiSignature);
-  }
-
-  void test_apiSignature_unlinkedOnly() {
-    // The API signature of a package bundle should only contain unlinked
-    // information.  In this test, the linked information for bundle2 and
-    // bundle3 refer to class C as existing in different files.  But the
-    // unlinked information for bundle2 and bundle3 should be the same, so their
-    // API signatures should be the same.
-    addNamedSource('/a.dart', 'class C {}');
-    var bundle0 = createPackageBundle('', path: '/b.dart');
-    addNamedSource('/a.dart', '');
-    var bundle1 = createPackageBundle('class C {}', path: '/b.dart');
-    var text = '''
-import 'a.dart';
-import 'b.dart';
-class D extends C {}
-''';
-    addBundle('/bundle0.ds', bundle0);
-    var bundle2 = createPackageBundle(text, path: '/c.dart');
-    addBundle('/bundle1.ds', bundle1);
-    var bundle3 = createPackageBundle(text, path: '/c.dart');
-    expect(bundle2.apiSignature, isNotEmpty);
-    expect(bundle3.apiSignature, isNotEmpty);
-    expect(bundle2.apiSignature, bundle3.apiSignature);
-  }
-
   void test_baseClass_genericWithAccessor() {
     createLinker('''
 class B<T> {
diff --git a/pkg/analyzer/tool/summary/generate.dart b/pkg/analyzer/tool/summary/generate.dart
index 1604d01..97495b4 100644
--- a/pkg/analyzer/tool/summary/generate.dart
+++ b/pkg/analyzer/tool/summary/generate.dart
@@ -215,6 +215,7 @@
     for (CompilationUnitMember decl in idlParsed.declarations) {
       if (decl is ClassDeclaration) {
         bool isTopLevel = false;
+        bool isDeprecated = false;
         String fileIdentifier;
         String clsName = decl.name;
         for (Annotation annotation in decl.metadata) {
@@ -222,14 +223,6 @@
               annotation.name == 'TopLevel' &&
               annotation.constructorName == null) {
             isTopLevel = true;
-            if (annotation.arguments == null) {
-              throw new Exception(
-                  'Class `$clsName`: TopLevel requires parenthesis');
-            }
-            if (annotation.constructorName != null) {
-              throw new Exception(
-                  "Class `$clsName`: TopLevel doesn't have named constructors");
-            }
             if (annotation.arguments.length == 1) {
               Expression arg = annotation.arguments[0];
               if (arg is StringLiteral) {
@@ -243,11 +236,15 @@
               throw new Exception(
                   'Class `$clsName`: TopLevel requires 0 or 1 arguments');
             }
+          } else if (annotation.arguments == null &&
+              annotation.name == 'deprecated' &&
+              annotation.constructorName == null) {
+            isDeprecated = true;
           }
         }
         String doc = _getNodeDoc(decl);
         idlModel.ClassDeclaration cls = new idlModel.ClassDeclaration(
-            doc, clsName, isTopLevel, fileIdentifier);
+            doc, clsName, isTopLevel, fileIdentifier, isDeprecated);
         _idl.classes[clsName] = cls;
         String expectedBase = 'base.SummaryClass';
         if (decl.superclass == null || decl.superclass.name != expectedBase) {
@@ -445,18 +442,22 @@
       out();
     }
     for (idlModel.ClassDeclaration cls in _idl.classes.values) {
-      _generateBuilder(cls);
-      out();
+      if (!cls.isDeprecated) {
+        _generateBuilder(cls);
+        out();
+      }
       if (cls.isTopLevel) {
         _generateReadFunction(cls);
         out();
       }
-      _generateReader(cls);
-      out();
-      _generateImpl(cls);
-      out();
-      _generateMixin(cls);
-      out();
+      if (!cls.isDeprecated) {
+        _generateReader(cls);
+        out();
+        _generateImpl(cls);
+        out();
+        _generateMixin(cls);
+        out();
+      }
     }
   }
 
@@ -529,8 +530,9 @@
     String builderName = name + 'Builder';
     String mixinName = '_${name}Mixin';
     List<String> constructorParams = <String>[];
-    out('class $builderName extends Object with $mixinName '
-        'implements ${idlPrefix(name)} {');
+    var implementsClause =
+        cls.isDeprecated ? '' : ' implements ${idlPrefix(name)}';
+    out('class $builderName extends Object with $mixinName$implementsClause {');
     indent(() {
       // Generate fields.
       for (idlModel.FieldDeclaration field in cls.fields) {
@@ -549,7 +551,7 @@
         out();
         out('@override');
         if (field.isDeprecated) {
-          out('$typeStr get $fieldName => $_throwDeprecated;');
+          out('Null get $fieldName => $_throwDeprecated;');
         } else {
           out('$typeStr get $fieldName => _$fieldName$defSuffix;');
           out();
@@ -842,7 +844,7 @@
         out('@override');
         String returnType = dartType(type);
         if (field.isDeprecated) {
-          out('$returnType get $fieldName => $_throwDeprecated;');
+          out('Null get $fieldName => $_throwDeprecated;');
         } else {
           out('$returnType get $fieldName {');
           indent(() {
diff --git a/pkg/analyzer/tool/summary/idl_model.dart b/pkg/analyzer/tool/summary/idl_model.dart
index 375dcb2..79bae0e 100644
--- a/pkg/analyzer/tool/summary/idl_model.dart
+++ b/pkg/analyzer/tool/summary/idl_model.dart
@@ -29,8 +29,13 @@
    */
   final String fileIdentifier;
 
-  ClassDeclaration(
-      String documentation, String name, this.isTopLevel, this.fileIdentifier)
+  /**
+   * Indicates whether the class has the `deprecated` annotation.
+   */
+  final bool isDeprecated;
+
+  ClassDeclaration(String documentation, String name, this.isTopLevel,
+      this.fileIdentifier, this.isDeprecated)
       : super(documentation, name);
 
   /**