From 3788c54d61f8c882254f82a0229d2058fce44b18 Mon Sep 17 00:00:00 2001
From: James deBoer <james@huronbox.com>
Date: Fri, 24 Jan 2014 13:36:24 -0800
Subject: [PATCH] feat(js size): Add a default @MirrorsUsed to Angular.

Closes #409, #237
---
 demo/todo/web/todo.dart         |  4 ++++
 lib/angular.dart                | 37 +++++++++++++++++++++++++++++++++
 lib/playback/playback_http.dart |  2 ++
 3 files changed, 43 insertions(+)

diff --git a/demo/todo/web/todo.dart b/demo/todo/web/todo.dart
index ff3db815c..edba59764 100644
--- a/demo/todo/web/todo.dart
+++ b/demo/todo/web/todo.dart
@@ -2,6 +2,10 @@ library todo;
 
 import 'package:angular/angular.dart';
 
+// Everything in this library should be preserved by MirrorsUsed
+@MirrorsUsed(targets: const['todo'])
+import 'dart:mirrors';
+
 class Item {
   String text;
   bool done;
diff --git a/lib/angular.dart b/lib/angular.dart
index 904efd6ac..dab61a6f8 100644
--- a/lib/angular.dart
+++ b/lib/angular.dart
@@ -15,6 +15,43 @@ import 'dart:js' as js;
 import 'package:di/di.dart';
 import 'package:di/dynamic_injector.dart';
 
+/**
+* This @MirrorsUsed annotation is doing two things:
+*   - setting "override: *", which will cause any library that is not tagged
+*     with @MirrorsUsed to be potentially shaken out of the production binary.
+*   - setting targets.  All classes inside of Angular will be preserved, as
+*     well as any class tagged with the annotations listed in metaTargets.
+*
+* If you are writing code accessed from Angular expressions, you must include
+* your own @MirrorsUsed annotation or ensure that everything is tagged with
+* the Ng annotations.
+*
+* This is a short-term fix until we implement a transformer-based solution
+* which does not rely on mirrors.
+*/
+@MirrorsUsed(targets: const[
+    'angular',
+    'angular.core',
+    'angular.core.dom',
+    'angular.filter',
+    'angular.perf',
+    'angular.directive',
+    'angular.routing',
+    'angular.core.parser.dynamic_parser',
+    'angular.core.parser.lexer',
+    'perf_api',
+    'List',
+    'NodeTreeSanitizer',
+],
+metaTargets: const[
+  'NgInjectableService',
+  'NgDirective',
+  'NgController',
+  'NgComponent'
+],
+override: '*')
+import 'dart:mirrors';
+
 import 'package:angular/core/module.dart';
 import 'package:angular/core_dom/module.dart';
 import 'package:angular/directive/module.dart';
diff --git a/lib/playback/playback_http.dart b/lib/playback/playback_http.dart
index 0298c3235..e9ec44cbe 100644
--- a/lib/playback/playback_http.dart
+++ b/lib/playback/playback_http.dart
@@ -5,10 +5,12 @@ import 'dart:convert' show JSON;
 import 'dart:html';
 
 import 'package:angular/core_dom/module.dart';
+import 'package:angular/core/service.dart';
 import 'package:angular/mock/module.dart' as mock;
 
 import 'playback_data.dart' as playback_data;
 
+@NgInjectableService()
 class PlaybackHttpBackendConfig {
   requestKey(String url,
                  {String method, bool withCredentials, String responseType,