feat(bootstrap): remove the need for explicit reflection setup in bootstrap code

BREAKING CHANGES:

Dart applications and TypeScript applications meant to transpile to Dart must now
import `package:angular2/bootstrap.dart` instead of `package:angular2/angular2.dart`
in their bootstrap code. `package:angular2/angular2.dart` no longer export the
bootstrap function. The transformer rewrites imports of `bootstrap.dart` and calls
to `bootstrap` to `bootstrap_static.dart` and `bootstrapStatic` respectively.
This commit is contained in:
yjbanov 2015-07-22 10:18:04 -07:00
parent 55e8dca8de
commit 3531bb7118
119 changed files with 896 additions and 827 deletions

View File

@ -0,0 +1,8 @@
library angular2;
/**
* An all-in-one place to import Angular 2 stuff.
*
* This library does not include `bootstrap`. Import `bootstrap.dart` instead.
*/
export 'package:angular2/angular2_exports.dart';

View File

@ -1,6 +1,12 @@
/** /**
* The `angular2` is the single place to import all of the individual types. * The `angular2` is the single place to import all of the individual types.
*/ */
export {commonBootstrap as bootstrap} from 'angular2/src/core/application_common';
// TODO(someone familiar with systemjs): the exports below are copied from
// angular2_exports.ts. Re-exporting from angular2_exports.ts causes systemjs
// to resolve imports very very very slowly. See also a similar notice in
// bootstrap.ts
export * from 'angular2/annotations'; export * from 'angular2/annotations';
export * from 'angular2/core'; export * from 'angular2/core';
@ -28,34 +34,7 @@ export {
export * from './di'; export * from './di';
export * from './forms'; export * from './forms';
export * from './directives'; export * from './directives';
export {
AbstractControl,
AbstractControlDirective,
Control,
ControlGroup,
ControlArray,
NgControlName,
NgFormControl,
NgModel,
NgControl,
NgControlGroup,
NgFormModel,
NgForm,
ControlValueAccessor,
DefaultValueAccessor,
CheckboxControlValueAccessor,
SelectControlValueAccessor,
formDirectives,
Validators,
NgValidator,
NgRequiredValidator,
FormBuilder,
formInjectables
} from './forms';
export * from './http'; export * from './http';
export { export {
RenderEventDispatcher, RenderEventDispatcher,

View File

@ -0,0 +1,43 @@
export * from 'angular2/annotations';
export * from 'angular2/core';
export {
DehydratedException,
ExpressionChangedAfterItHasBeenChecked,
ChangeDetectionError,
ON_PUSH,
DEFAULT,
ChangeDetectorRef,
Pipes,
WrappedValue,
Pipe,
PipeFactory,
NullPipe,
NullPipeFactory,
defaultPipes,
BasePipe,
Locals
} from './change_detection';
export * from './di';
export * from './forms';
export * from './directives';
export * from './http';
export {
RenderEventDispatcher,
Renderer,
RenderElementRef,
RenderViewRef,
RenderProtoViewRef,
RenderFragmentRef,
RenderViewWithFragments
} from 'angular2/src/render/api';
export {
DomRenderer,
DOCUMENT_TOKEN,
DOM_REFLECT_PROPERTIES_AS_ATTRIBUTES
} from 'angular2/src/render/dom/dom_renderer';

View File

@ -0,0 +1,52 @@
/**
* Contains everything you need to bootstrap your application.
*/
export {bootstrap} from 'angular2/src/core/application';
// TODO(someone familiar with systemjs): the exports below are copied from
// angular2_exports.ts. Re-exporting from angular2_exports.ts causes systemjs
// to resolve imports very very very slowly. See also a similar notice in
// angular2.ts
export * from 'angular2/annotations';
export * from 'angular2/core';
export {
DehydratedException,
ExpressionChangedAfterItHasBeenChecked,
ChangeDetectionError,
ON_PUSH,
DEFAULT,
ChangeDetectorRef,
Pipes,
WrappedValue,
Pipe,
PipeFactory,
NullPipe,
NullPipeFactory,
defaultPipes,
BasePipe,
Locals
} from './change_detection';
export * from './di';
export * from './forms';
export * from './directives';
export * from './http';
export {
RenderEventDispatcher,
Renderer,
RenderElementRef,
RenderViewRef,
RenderProtoViewRef,
RenderFragmentRef,
RenderViewWithFragments
} from 'angular2/src/render/api';
export {
DomRenderer,
DOCUMENT_TOKEN,
DOM_REFLECT_PROPERTIES_AS_ATTRIBUTES
} from 'angular2/src/render/dom/dom_renderer';

View File

@ -0,0 +1,4 @@
library angular2.bootstrap_static;
export 'angular2_exports.dart';
export 'src/core/application_static.dart';

View File

@ -3,8 +3,8 @@
* @description * @description
* Define angular core API here. * Define angular core API here.
*/ */
export {bootstrap, ApplicationRef} from 'angular2/src/core/application';
export {appComponentTypeToken} from 'angular2/src/core/application_tokens'; export {appComponentTypeToken} from 'angular2/src/core/application_tokens';
export {ApplicationRef} from 'angular2/src/core/application_common';
// Compiler Related Dependencies. // Compiler Related Dependencies.

View File

@ -0,0 +1,21 @@
library angular2.application;
import 'dart:async';
import 'package:angular2/src/reflection/reflection.dart' show reflector;
import 'package:angular2/src/reflection/reflection_capabilities.dart' show ReflectionCapabilities;
import 'application_common.dart';
export 'application_common.dart' show ApplicationRef;
/// Starts an application from a root component. This implementation uses
/// mirrors. Angular 2 transformer automatically replaces this method with a
/// static implementation (see `application_static.dart`) that does not use
/// mirrors and produces a faster and more compact JS code.
///
/// See [commonBootstrap] for detailed documentation.
Future<ApplicationRef> bootstrap(Type appComponentType,
[List componentInjectableBindings, Function errorReporter]) {
reflector.reflectionCapabilities = new ReflectionCapabilities();
return commonBootstrap(appComponentType, componentInjectableBindings, errorReporter);
}

View File

@ -1,372 +1 @@
import {Injector, bind, OpaqueToken, Binding} from 'angular2/di'; export {ApplicationRef, commonBootstrap as bootstrap} from './application_common';
import {
NumberWrapper,
Type,
isBlank,
isPresent,
BaseException,
assertionsEnabled,
print,
stringify
} from 'angular2/src/facade/lang';
import {BrowserDomAdapter} from 'angular2/src/dom/browser_adapter';
import {DOM} from 'angular2/src/dom/dom_adapter';
import {Compiler, CompilerCache} from './compiler/compiler';
import {Reflector, reflector} from 'angular2/src/reflection/reflection';
import {
Parser,
Lexer,
ChangeDetection,
DynamicChangeDetection,
JitChangeDetection,
PreGeneratedChangeDetection,
Pipes,
defaultPipes
} from 'angular2/change_detection';
import {ExceptionHandler} from './exception_handler';
import {ViewLoader} from 'angular2/src/render/dom/compiler/view_loader';
import {StyleUrlResolver} from 'angular2/src/render/dom/compiler/style_url_resolver';
import {StyleInliner} from 'angular2/src/render/dom/compiler/style_inliner';
import {ViewResolver} from './compiler/view_resolver';
import {DirectiveResolver} from './compiler/directive_resolver';
import {List, ListWrapper} from 'angular2/src/facade/collection';
import {Promise, PromiseWrapper} from 'angular2/src/facade/async';
import {NgZone} from 'angular2/src/core/zone/ng_zone';
import {LifeCycle} from 'angular2/src/core/life_cycle/life_cycle';
import {ShadowDomStrategy} from 'angular2/src/render/dom/shadow_dom/shadow_dom_strategy';
import {
EmulatedUnscopedShadowDomStrategy
} from 'angular2/src/render/dom/shadow_dom/emulated_unscoped_shadow_dom_strategy';
import {XHR} from 'angular2/src/render/xhr';
import {XHRImpl} from 'angular2/src/render/xhr_impl';
import {EventManager, DomEventsPlugin} from 'angular2/src/render/dom/events/event_manager';
import {KeyEventsPlugin} from 'angular2/src/render/dom/events/key_events';
import {HammerGesturesPlugin} from 'angular2/src/render/dom/events/hammer_gestures';
import {ComponentUrlMapper} from 'angular2/src/core/compiler/component_url_mapper';
import {UrlResolver} from 'angular2/src/services/url_resolver';
import {AppRootUrl} from 'angular2/src/services/app_root_url';
import {
ComponentRef,
DynamicComponentLoader
} from 'angular2/src/core/compiler/dynamic_component_loader';
import {TestabilityRegistry, Testability} from 'angular2/src/core/testability/testability';
import {AppViewPool, APP_VIEW_POOL_CAPACITY} from 'angular2/src/core/compiler/view_pool';
import {AppViewManager} from 'angular2/src/core/compiler/view_manager';
import {AppViewManagerUtils} from 'angular2/src/core/compiler/view_manager_utils';
import {AppViewListener} from 'angular2/src/core/compiler/view_listener';
import {ProtoViewFactory} from 'angular2/src/core/compiler/proto_view_factory';
import {Renderer, RenderCompiler} from 'angular2/src/render/api';
import {
DomRenderer,
DOCUMENT_TOKEN,
DOM_REFLECT_PROPERTIES_AS_ATTRIBUTES
} from 'angular2/src/render/dom/dom_renderer';
import {DefaultDomCompiler} from 'angular2/src/render/dom/compiler/compiler';
import {internalView} from 'angular2/src/core/compiler/view_ref';
import {appComponentRefPromiseToken, appComponentTypeToken} from './application_tokens';
var _rootInjector: Injector;
// Contains everything that is safe to share between applications.
var _rootBindings = [bind(Reflector).toValue(reflector), TestabilityRegistry];
function _injectorBindings(appComponentType): List<Type | Binding | List<any>> {
var bestChangeDetection: Type = DynamicChangeDetection;
if (PreGeneratedChangeDetection.isSupported()) {
bestChangeDetection = PreGeneratedChangeDetection;
} else if (JitChangeDetection.isSupported()) {
bestChangeDetection = JitChangeDetection;
}
return [
bind(DOCUMENT_TOKEN)
.toValue(DOM.defaultDoc()),
bind(DOM_REFLECT_PROPERTIES_AS_ATTRIBUTES).toValue(false),
bind(appComponentTypeToken).toValue(appComponentType),
bind(appComponentRefPromiseToken)
.toFactory(
(dynamicComponentLoader, injector, testability, registry) => {
// TODO(rado): investigate whether to support bindings on root component.
return dynamicComponentLoader.loadAsRoot(appComponentType, null, injector)
.then((componentRef) => {
registry.registerApplication(componentRef.location.nativeElement, testability);
return componentRef;
});
},
[DynamicComponentLoader, Injector, Testability, TestabilityRegistry]),
bind(appComponentType)
.toFactory((p: Promise<any>) => p.then(ref => ref.instance), [appComponentRefPromiseToken]),
bind(LifeCycle)
.toFactory((exceptionHandler) => new LifeCycle(exceptionHandler, null, assertionsEnabled()),
[ExceptionHandler]),
bind(EventManager)
.toFactory(
(ngZone) => {
var plugins =
[new HammerGesturesPlugin(), new KeyEventsPlugin(), new DomEventsPlugin()];
return new EventManager(plugins, ngZone);
},
[NgZone]),
bind(ShadowDomStrategy)
.toFactory((doc) => new EmulatedUnscopedShadowDomStrategy(doc.head), [DOCUMENT_TOKEN]),
DomRenderer,
DefaultDomCompiler,
bind(Renderer).toAlias(DomRenderer),
bind(RenderCompiler).toAlias(DefaultDomCompiler),
ProtoViewFactory,
AppViewPool,
bind(APP_VIEW_POOL_CAPACITY).toValue(10000),
AppViewManager,
AppViewManagerUtils,
AppViewListener,
Compiler,
CompilerCache,
ViewResolver,
bind(Pipes).toValue(defaultPipes),
bind(ChangeDetection).toClass(bestChangeDetection),
ViewLoader,
DirectiveResolver,
Parser,
Lexer,
ExceptionHandler,
bind(XHR).toValue(new XHRImpl()),
ComponentUrlMapper,
UrlResolver,
StyleUrlResolver,
StyleInliner,
DynamicComponentLoader,
Testability,
AppRootUrl
];
}
function _createNgZone(givenReporter: Function): NgZone {
var defaultErrorReporter = (exception, stackTrace) => {
var longStackTrace = ListWrapper.join(stackTrace, "\n\n-----async gap-----\n");
DOM.logError(`${exception}\n\n${longStackTrace}`);
if (exception instanceof BaseException && isPresent(exception.context)) {
print("Error Context:");
print(exception.context);
}
throw exception;
};
var reporter = isPresent(givenReporter) ? givenReporter : defaultErrorReporter;
var zone = new NgZone({enableLongStackTrace: assertionsEnabled()});
zone.overrideOnErrorHandler(reporter);
return zone;
}
/**
* Bootstrapping for Angular applications.
*
* You instantiate an Angular application by explicitly specifying a component to use as the root
* component for your
* application via the `bootstrap()` method.
*
* ## Simple Example
*
* Assuming this `index.html`:
*
* ```html
* <html>
* <!-- load Angular script tags here. -->
* <body>
* <my-app>loading...</my-app>
* </body>
* </html>
* ```
*
* An application is bootstrapped inside an existing browser DOM, typically `index.html`. Unlike
* Angular 1, Angular 2
* does not compile/process bindings in `index.html`. This is mainly for security reasons, as well
* as architectural
* changes in Angular 2. This means that `index.html` can safely be processed using server-side
* technologies such as
* bindings. Bindings can thus use double-curly `{{ syntax }}` without collision from Angular 2
* component double-curly
* `{{ syntax }}`.
*
* We can use this script code:
*
* ```
* @Component({
* selector: 'my-app'
* })
* @View({
* template: 'Hello {{ name }}!'
* })
* class MyApp {
* name:string;
*
* constructor() {
* this.name = 'World';
* }
* }
*
* main() {
* return bootstrap(MyApp);
* }
* ```
*
* When the app developer invokes `bootstrap()` with the root component `MyApp` as its argument,
* Angular performs the
* following tasks:
*
* 1. It uses the component's `selector` property to locate the DOM element which needs to be
* upgraded into
* the angular component.
* 2. It creates a new child injector (from the platform injector). Optionally, you can also
* override the injector configuration for an app by
* invoking `bootstrap` with the `componentInjectableBindings` argument.
* 3. It creates a new `Zone` and connects it to the angular application's change detection domain
* instance.
* 4. It creates a shadow DOM on the selected component's host element and loads the template into
* it.
* 5. It instantiates the specified component.
* 6. Finally, Angular performs change detection to apply the initial data bindings for the
* application.
*
*
* ## Instantiating Multiple Applications on a Single Page
*
* There are two ways to do this.
*
*
* ### Isolated Applications
*
* Angular creates a new application each time that the `bootstrap()` method is invoked. When
* multiple applications
* are created for a page, Angular treats each application as independent within an isolated change
* detection and
* `Zone` domain. If you need to share data between applications, use the strategy described in the
* next
* section, "Applications That Share Change Detection."
*
*
* ### Applications That Share Change Detection
*
* If you need to bootstrap multiple applications that share common data, the applications must
* share a common
* change detection and zone. To do that, create a meta-component that lists the application
* components in its template.
* By only invoking the `bootstrap()` method once, with the meta-component as its argument, you
* ensure that only a
* single change detection zone is created and therefore data can be shared across the applications.
*
*
* ## Platform Injector
*
* When working within a browser window, there are many singleton resources: cookies, title,
* location, and others.
* Angular services that represent these resources must likewise be shared across all Angular
* applications that
* occupy the same browser window. For this reason, Angular creates exactly one global platform
* injector which stores
* all shared services, and each angular application injector has the platform injector as its
* parent.
*
* Each application has its own private injector as well. When there are multiple applications on a
* page, Angular treats
* each application injector's services as private to that application.
*
*
* # API
* - `appComponentType`: The root component which should act as the application. This is a reference
* to a `Type`
* which is annotated with `@Component(...)`.
* - `componentInjectableBindings`: An additional set of bindings that can be added to the app
* injector
* to override default injection behavior.
* - `errorReporter`: `function(exception:any, stackTrace:string)` a default error reporter for
* unhandled exceptions.
*
* Returns a `Promise` of {@link ApplicationRef}.
*/
export function bootstrap(appComponentType: Type,
componentInjectableBindings: List<Type | Binding | List<any>> = null,
errorReporter: Function = null): Promise<ApplicationRef> {
BrowserDomAdapter.makeCurrent();
var bootstrapProcess = PromiseWrapper.completer();
var zone = _createNgZone(errorReporter);
zone.run(() => {
// TODO(rado): prepopulate template cache, so applications with only
// index.html and main.js are possible.
var appInjector = _createAppInjector(appComponentType, componentInjectableBindings, zone);
var compRefToken: Promise<any> =
PromiseWrapper.wrap(() => appInjector.get(appComponentRefPromiseToken));
var tick = (componentRef) => {
var appChangeDetector = internalView(componentRef.hostView).changeDetector;
// retrieve life cycle: may have already been created if injected in root component
var lc = appInjector.get(LifeCycle);
lc.registerWith(zone, appChangeDetector);
lc.tick(); // the first tick that will bootstrap the app
bootstrapProcess.resolve(new ApplicationRef(componentRef, appComponentType, appInjector));
};
PromiseWrapper.then(compRefToken, tick,
(err, stackTrace) => bootstrapProcess.reject(err, stackTrace));
});
return bootstrapProcess.promise;
}
/**
* Represents a Angular's representation of an Application.
*
* `ApplicationRef` represents a running application instance. Use it to retrieve the host
* component, injector,
* or dispose of an application.
*/
export class ApplicationRef {
_hostComponent: ComponentRef;
_injector: Injector;
_hostComponentType: Type;
/**
* @private
*/
constructor(hostComponent: ComponentRef, hostComponentType: Type, injector: Injector) {
this._hostComponent = hostComponent;
this._injector = injector;
this._hostComponentType = hostComponentType;
}
/**
* Returns the current {@link Component} type.
*/
get hostComponentType(): Type { return this._hostComponentType; }
/**
* Returns the current {@link Component} instance.
*/
get hostComponent(): any { return this._hostComponent.instance; }
/**
* Dispose (un-load) the application.
*/
dispose(): void {
// TODO: We also need to clean up the Zone, ... here!
this._hostComponent.dispose();
}
/**
* Returns the root application {@link Injector}.
*/
get injector(): Injector { return this._injector; }
}
function _createAppInjector(appComponentType: Type, bindings: List<Type | Binding | List<any>>,
zone: NgZone): Injector {
if (isBlank(_rootInjector)) _rootInjector = Injector.resolveAndCreate(_rootBindings);
var mergedBindings: any[] =
isPresent(bindings) ? ListWrapper.concat(_injectorBindings(appComponentType), bindings) :
_injectorBindings(appComponentType);
mergedBindings.push(bind(NgZone).toValue(zone));
return _rootInjector.resolveAndCreateChild(mergedBindings);
}

View File

@ -0,0 +1,372 @@
import {Injector, bind, OpaqueToken, Binding} from 'angular2/di';
import {
NumberWrapper,
Type,
isBlank,
isPresent,
BaseException,
assertionsEnabled,
print,
stringify
} from 'angular2/src/facade/lang';
import {BrowserDomAdapter} from 'angular2/src/dom/browser_adapter';
import {DOM} from 'angular2/src/dom/dom_adapter';
import {Compiler, CompilerCache} from './compiler/compiler';
import {Reflector, reflector} from 'angular2/src/reflection/reflection';
import {
Parser,
Lexer,
ChangeDetection,
DynamicChangeDetection,
JitChangeDetection,
PreGeneratedChangeDetection,
Pipes,
defaultPipes
} from 'angular2/change_detection';
import {ExceptionHandler} from './exception_handler';
import {ViewLoader} from 'angular2/src/render/dom/compiler/view_loader';
import {StyleUrlResolver} from 'angular2/src/render/dom/compiler/style_url_resolver';
import {StyleInliner} from 'angular2/src/render/dom/compiler/style_inliner';
import {ViewResolver} from './compiler/view_resolver';
import {DirectiveResolver} from './compiler/directive_resolver';
import {List, ListWrapper} from 'angular2/src/facade/collection';
import {Promise, PromiseWrapper} from 'angular2/src/facade/async';
import {NgZone} from 'angular2/src/core/zone/ng_zone';
import {LifeCycle} from 'angular2/src/core/life_cycle/life_cycle';
import {ShadowDomStrategy} from 'angular2/src/render/dom/shadow_dom/shadow_dom_strategy';
import {
EmulatedUnscopedShadowDomStrategy
} from 'angular2/src/render/dom/shadow_dom/emulated_unscoped_shadow_dom_strategy';
import {XHR} from 'angular2/src/render/xhr';
import {XHRImpl} from 'angular2/src/render/xhr_impl';
import {EventManager, DomEventsPlugin} from 'angular2/src/render/dom/events/event_manager';
import {KeyEventsPlugin} from 'angular2/src/render/dom/events/key_events';
import {HammerGesturesPlugin} from 'angular2/src/render/dom/events/hammer_gestures';
import {ComponentUrlMapper} from 'angular2/src/core/compiler/component_url_mapper';
import {UrlResolver} from 'angular2/src/services/url_resolver';
import {AppRootUrl} from 'angular2/src/services/app_root_url';
import {
ComponentRef,
DynamicComponentLoader
} from 'angular2/src/core/compiler/dynamic_component_loader';
import {TestabilityRegistry, Testability} from 'angular2/src/core/testability/testability';
import {AppViewPool, APP_VIEW_POOL_CAPACITY} from 'angular2/src/core/compiler/view_pool';
import {AppViewManager} from 'angular2/src/core/compiler/view_manager';
import {AppViewManagerUtils} from 'angular2/src/core/compiler/view_manager_utils';
import {AppViewListener} from 'angular2/src/core/compiler/view_listener';
import {ProtoViewFactory} from 'angular2/src/core/compiler/proto_view_factory';
import {Renderer, RenderCompiler} from 'angular2/src/render/api';
import {
DomRenderer,
DOCUMENT_TOKEN,
DOM_REFLECT_PROPERTIES_AS_ATTRIBUTES
} from 'angular2/src/render/dom/dom_renderer';
import {DefaultDomCompiler} from 'angular2/src/render/dom/compiler/compiler';
import {internalView} from 'angular2/src/core/compiler/view_ref';
import {appComponentRefPromiseToken, appComponentTypeToken} from './application_tokens';
var _rootInjector: Injector;
// Contains everything that is safe to share between applications.
var _rootBindings = [bind(Reflector).toValue(reflector), TestabilityRegistry];
function _injectorBindings(appComponentType): List<Type | Binding | List<any>> {
var bestChangeDetection: Type = DynamicChangeDetection;
if (PreGeneratedChangeDetection.isSupported()) {
bestChangeDetection = PreGeneratedChangeDetection;
} else if (JitChangeDetection.isSupported()) {
bestChangeDetection = JitChangeDetection;
}
return [
bind(DOCUMENT_TOKEN)
.toValue(DOM.defaultDoc()),
bind(DOM_REFLECT_PROPERTIES_AS_ATTRIBUTES).toValue(false),
bind(appComponentTypeToken).toValue(appComponentType),
bind(appComponentRefPromiseToken)
.toFactory(
(dynamicComponentLoader, injector, testability, registry) => {
// TODO(rado): investigate whether to support bindings on root component.
return dynamicComponentLoader.loadAsRoot(appComponentType, null, injector)
.then((componentRef) => {
registry.registerApplication(componentRef.location.nativeElement, testability);
return componentRef;
});
},
[DynamicComponentLoader, Injector, Testability, TestabilityRegistry]),
bind(appComponentType)
.toFactory((p: Promise<any>) => p.then(ref => ref.instance), [appComponentRefPromiseToken]),
bind(LifeCycle)
.toFactory((exceptionHandler) => new LifeCycle(exceptionHandler, null, assertionsEnabled()),
[ExceptionHandler]),
bind(EventManager)
.toFactory(
(ngZone) => {
var plugins =
[new HammerGesturesPlugin(), new KeyEventsPlugin(), new DomEventsPlugin()];
return new EventManager(plugins, ngZone);
},
[NgZone]),
bind(ShadowDomStrategy)
.toFactory((doc) => new EmulatedUnscopedShadowDomStrategy(doc.head), [DOCUMENT_TOKEN]),
DomRenderer,
DefaultDomCompiler,
bind(Renderer).toAlias(DomRenderer),
bind(RenderCompiler).toAlias(DefaultDomCompiler),
ProtoViewFactory,
AppViewPool,
bind(APP_VIEW_POOL_CAPACITY).toValue(10000),
AppViewManager,
AppViewManagerUtils,
AppViewListener,
Compiler,
CompilerCache,
ViewResolver,
bind(Pipes).toValue(defaultPipes),
bind(ChangeDetection).toClass(bestChangeDetection),
ViewLoader,
DirectiveResolver,
Parser,
Lexer,
ExceptionHandler,
bind(XHR).toValue(new XHRImpl()),
ComponentUrlMapper,
UrlResolver,
StyleUrlResolver,
StyleInliner,
DynamicComponentLoader,
Testability,
AppRootUrl
];
}
function _createNgZone(givenReporter: Function): NgZone {
var defaultErrorReporter = (exception, stackTrace) => {
var longStackTrace = ListWrapper.join(stackTrace, "\n\n-----async gap-----\n");
DOM.logError(`${exception}\n\n${longStackTrace}`);
if (exception instanceof BaseException && isPresent(exception.context)) {
print("Error Context:");
print(exception.context);
}
throw exception;
};
var reporter = isPresent(givenReporter) ? givenReporter : defaultErrorReporter;
var zone = new NgZone({enableLongStackTrace: assertionsEnabled()});
zone.overrideOnErrorHandler(reporter);
return zone;
}
/**
* Bootstrapping for Angular applications.
*
* You instantiate an Angular application by explicitly specifying a component to use as the root
* component for your
* application via the `bootstrap()` method.
*
* ## Simple Example
*
* Assuming this `index.html`:
*
* ```html
* <html>
* <!-- load Angular script tags here. -->
* <body>
* <my-app>loading...</my-app>
* </body>
* </html>
* ```
*
* An application is bootstrapped inside an existing browser DOM, typically `index.html`. Unlike
* Angular 1, Angular 2
* does not compile/process bindings in `index.html`. This is mainly for security reasons, as well
* as architectural
* changes in Angular 2. This means that `index.html` can safely be processed using server-side
* technologies such as
* bindings. Bindings can thus use double-curly `{{ syntax }}` without collision from Angular 2
* component double-curly
* `{{ syntax }}`.
*
* We can use this script code:
*
* ```
* @Component({
* selector: 'my-app'
* })
* @View({
* template: 'Hello {{ name }}!'
* })
* class MyApp {
* name:string;
*
* constructor() {
* this.name = 'World';
* }
* }
*
* main() {
* return bootstrap(MyApp);
* }
* ```
*
* When the app developer invokes `bootstrap()` with the root component `MyApp` as its argument,
* Angular performs the
* following tasks:
*
* 1. It uses the component's `selector` property to locate the DOM element which needs to be
* upgraded into
* the angular component.
* 2. It creates a new child injector (from the platform injector). Optionally, you can also
* override the injector configuration for an app by
* invoking `bootstrap` with the `componentInjectableBindings` argument.
* 3. It creates a new `Zone` and connects it to the angular application's change detection domain
* instance.
* 4. It creates a shadow DOM on the selected component's host element and loads the template into
* it.
* 5. It instantiates the specified component.
* 6. Finally, Angular performs change detection to apply the initial data bindings for the
* application.
*
*
* ## Instantiating Multiple Applications on a Single Page
*
* There are two ways to do this.
*
*
* ### Isolated Applications
*
* Angular creates a new application each time that the `bootstrap()` method is invoked. When
* multiple applications
* are created for a page, Angular treats each application as independent within an isolated change
* detection and
* `Zone` domain. If you need to share data between applications, use the strategy described in the
* next
* section, "Applications That Share Change Detection."
*
*
* ### Applications That Share Change Detection
*
* If you need to bootstrap multiple applications that share common data, the applications must
* share a common
* change detection and zone. To do that, create a meta-component that lists the application
* components in its template.
* By only invoking the `bootstrap()` method once, with the meta-component as its argument, you
* ensure that only a
* single change detection zone is created and therefore data can be shared across the applications.
*
*
* ## Platform Injector
*
* When working within a browser window, there are many singleton resources: cookies, title,
* location, and others.
* Angular services that represent these resources must likewise be shared across all Angular
* applications that
* occupy the same browser window. For this reason, Angular creates exactly one global platform
* injector which stores
* all shared services, and each angular application injector has the platform injector as its
* parent.
*
* Each application has its own private injector as well. When there are multiple applications on a
* page, Angular treats
* each application injector's services as private to that application.
*
*
* # API
* - `appComponentType`: The root component which should act as the application. This is a reference
* to a `Type`
* which is annotated with `@Component(...)`.
* - `componentInjectableBindings`: An additional set of bindings that can be added to the app
* injector
* to override default injection behavior.
* - `errorReporter`: `function(exception:any, stackTrace:string)` a default error reporter for
* unhandled exceptions.
*
* Returns a `Promise` of {@link ApplicationRef}.
*/
export function commonBootstrap(
appComponentType: Type, componentInjectableBindings: List<Type | Binding | List<any>> = null,
errorReporter: Function = null): Promise<ApplicationRef> {
BrowserDomAdapter.makeCurrent();
var bootstrapProcess = PromiseWrapper.completer();
var zone = _createNgZone(errorReporter);
zone.run(() => {
// TODO(rado): prepopulate template cache, so applications with only
// index.html and main.js are possible.
var appInjector = _createAppInjector(appComponentType, componentInjectableBindings, zone);
var compRefToken: Promise<any> =
PromiseWrapper.wrap(() => appInjector.get(appComponentRefPromiseToken));
var tick = (componentRef) => {
var appChangeDetector = internalView(componentRef.hostView).changeDetector;
// retrieve life cycle: may have already been created if injected in root component
var lc = appInjector.get(LifeCycle);
lc.registerWith(zone, appChangeDetector);
lc.tick(); // the first tick that will bootstrap the app
bootstrapProcess.resolve(new ApplicationRef(componentRef, appComponentType, appInjector));
};
PromiseWrapper.then(compRefToken, tick,
(err, stackTrace) => bootstrapProcess.reject(err, stackTrace));
});
return bootstrapProcess.promise;
}
/**
* Represents a Angular's representation of an Application.
*
* `ApplicationRef` represents a running application instance. Use it to retrieve the host
* component, injector,
* or dispose of an application.
*/
export class ApplicationRef {
_hostComponent: ComponentRef;
_injector: Injector;
_hostComponentType: Type;
/**
* @private
*/
constructor(hostComponent: ComponentRef, hostComponentType: Type, injector: Injector) {
this._hostComponent = hostComponent;
this._injector = injector;
this._hostComponentType = hostComponentType;
}
/**
* Returns the current {@link Component} type.
*/
get hostComponentType(): Type { return this._hostComponentType; }
/**
* Returns the current {@link Component} instance.
*/
get hostComponent(): any { return this._hostComponent.instance; }
/**
* Dispose (un-load) the application.
*/
dispose(): void {
// TODO: We also need to clean up the Zone, ... here!
this._hostComponent.dispose();
}
/**
* Returns the root application {@link Injector}.
*/
get injector(): Injector { return this._injector; }
}
function _createAppInjector(appComponentType: Type, bindings: List<Type | Binding | List<any>>,
zone: NgZone): Injector {
if (isBlank(_rootInjector)) _rootInjector = Injector.resolveAndCreate(_rootBindings);
var mergedBindings: any[] =
isPresent(bindings) ? ListWrapper.concat(_injectorBindings(appComponentType), bindings) :
_injectorBindings(appComponentType);
mergedBindings.push(bind(NgZone).toValue(zone));
return _rootInjector.resolveAndCreateChild(mergedBindings);
}

View File

@ -0,0 +1,14 @@
library angular2.application_static;
import 'dart:async';
import 'application_common.dart';
/// Starts an application from a root component.
///
/// See [commonBootstrap] for detailed documentation.
Future<ApplicationRef> bootstrapStatic(
Type appComponentType,
[List componentInjectableBindings,
Function errorReporter]) {
return commonBootstrap(appComponentType, componentInjectableBindings, errorReporter);
}

View File

@ -1,13 +1,6 @@
import {Directive} from 'angular2/annotations'; import {Directive, LifecycleEvent} from 'angular2/annotations';
import { import {ViewContainerRef, ViewRef, TemplateRef} from 'angular2/core';
ViewContainerRef, import {ChangeDetectorRef, Pipe, Pipes} from 'angular2/change_detection';
ViewRef,
TemplateRef,
Pipes,
LifecycleEvent,
Pipe,
ChangeDetectorRef
} from 'angular2/angular2';
import {isPresent, isBlank} from 'angular2/src/facade/lang'; import {isPresent, isBlank} from 'angular2/src/facade/lang';
/** /**

View File

@ -1,4 +1,4 @@
import {Directive, LifecycleEvent} from 'angular2/angular2'; import {Directive, LifecycleEvent} from 'angular2/annotations';
import {Inject, Ancestor, forwardRef, Binding} from 'angular2/di'; import {Inject, Ancestor, forwardRef, Binding} from 'angular2/di';
import {List, ListWrapper} from 'angular2/src/facade/collection'; import {List, ListWrapper} from 'angular2/src/facade/collection';
import {CONST_EXPR} from 'angular2/src/facade/lang'; import {CONST_EXPR} from 'angular2/src/facade/lang';

View File

@ -2,7 +2,8 @@ import {CONST_EXPR} from 'angular2/src/facade/lang';
import {EventEmitter, ObservableWrapper} from 'angular2/src/facade/async'; import {EventEmitter, ObservableWrapper} from 'angular2/src/facade/async';
import {List, StringMap} from 'angular2/src/facade/collection'; import {List, StringMap} from 'angular2/src/facade/collection';
import {Directive, LifecycleEvent, Query, QueryList} from 'angular2/angular2'; import {QueryList} from 'angular2/core';
import {Query, Directive, LifecycleEvent} from 'angular2/annotations';
import {forwardRef, Ancestor, Binding, Inject} from 'angular2/di'; import {forwardRef, Ancestor, Binding, Inject} from 'angular2/di';
import {ControlContainer} from './control_container'; import {ControlContainer} from './control_container';

View File

@ -1,7 +1,8 @@
import {CONST_EXPR} from 'angular2/src/facade/lang'; import {CONST_EXPR} from 'angular2/src/facade/lang';
import {EventEmitter, ObservableWrapper} from 'angular2/src/facade/async'; import {EventEmitter, ObservableWrapper} from 'angular2/src/facade/async';
import {Directive, LifecycleEvent, Query, QueryList} from 'angular2/angular2'; import {QueryList} from 'angular2/core';
import {Query, Directive, LifecycleEvent} from 'angular2/annotations';
import {forwardRef, Ancestor, Binding} from 'angular2/di'; import {forwardRef, Ancestor, Binding} from 'angular2/di';
import {NgControl} from './ng_control'; import {NgControl} from './ng_control';

View File

@ -2,7 +2,7 @@ import {CONST_EXPR} from 'angular2/src/facade/lang';
import {List, ListWrapper} from 'angular2/src/facade/collection'; import {List, ListWrapper} from 'angular2/src/facade/collection';
import {ObservableWrapper, EventEmitter} from 'angular2/src/facade/async'; import {ObservableWrapper, EventEmitter} from 'angular2/src/facade/async';
import {Directive, LifecycleEvent} from 'angular2/angular2'; import {Directive, LifecycleEvent} from 'angular2/annotations';
import {forwardRef, Binding} from 'angular2/di'; import {forwardRef, Binding} from 'angular2/di';
import {NgControl} from './ng_control'; import {NgControl} from './ng_control';
import {NgControlGroup} from './ng_control_group'; import {NgControlGroup} from './ng_control_group';

View File

@ -1,7 +1,8 @@
import {CONST_EXPR} from 'angular2/src/facade/lang'; import {CONST_EXPR} from 'angular2/src/facade/lang';
import {EventEmitter, ObservableWrapper} from 'angular2/src/facade/async'; import {EventEmitter, ObservableWrapper} from 'angular2/src/facade/async';
import {Directive, LifecycleEvent, QueryList, Query} from 'angular2/angular2'; import {QueryList} from 'angular2/core';
import {Query, Directive, LifecycleEvent} from 'angular2/annotations';
import {forwardRef, Ancestor, Binding} from 'angular2/di'; import {forwardRef, Ancestor, Binding} from 'angular2/di';
import {NgControl} from './ng_control'; import {NgControl} from './ng_control';

View File

@ -1,5 +1,6 @@
import {Renderer} from 'angular2/render'; import {Renderer} from 'angular2/render';
import {ElementRef, QueryList, Directive, Query} from 'angular2/angular2'; import {ElementRef, QueryList} from 'angular2/core';
import {Query, Directive} from 'angular2/annotations';
import {NgControl} from './ng_control'; import {NgControl} from './ng_control';
import {ControlValueAccessor} from './control_value_accessor'; import {ControlValueAccessor} from './control_value_accessor';

View File

@ -84,7 +84,7 @@ function _getAppBindings() {
// The document is only available in browser environment // The document is only available in browser environment
try { try {
appDoc = DOM.defaultDoc(); appDoc = DOM.createHtmlDocument();
} catch (e) { } catch (e) {
appDoc = null; appDoc = null;
} }

View File

@ -14,6 +14,7 @@ const INJECTABLES = const [
'Injectable', 'package:angular2/src/di/decorators.dart'), 'Injectable', 'package:angular2/src/di/decorators.dart'),
const ClassDescriptor('Injectable', 'package:angular2/di.dart'), const ClassDescriptor('Injectable', 'package:angular2/di.dart'),
const ClassDescriptor('Injectable', 'package:angular2/angular2.dart'), const ClassDescriptor('Injectable', 'package:angular2/angular2.dart'),
const ClassDescriptor('Injectable', 'package:angular2/bootstrap_static.dart'),
]; ];
const DIRECTIVES = const [ const DIRECTIVES = const [
@ -32,6 +33,8 @@ const DIRECTIVES = const [
superClass: 'Injectable'), superClass: 'Injectable'),
const ClassDescriptor('Directive', 'package:angular2/core.dart', const ClassDescriptor('Directive', 'package:angular2/core.dart',
superClass: 'Injectable'), superClass: 'Injectable'),
const ClassDescriptor('Directive', 'package:angular2/bootstrap_static.dart',
superClass: 'Injectable'),
]; ];
const COMPONENTS = const [ const COMPONENTS = const [
@ -48,6 +51,8 @@ const COMPONENTS = const [
superClass: 'Directive'), superClass: 'Directive'),
const ClassDescriptor('Component', 'package:angular2/angular2.dart', const ClassDescriptor('Component', 'package:angular2/angular2.dart',
superClass: 'Directive'), superClass: 'Directive'),
const ClassDescriptor('Component', 'package:angular2/bootstrap_static.dart',
superClass: 'Directive'),
const ClassDescriptor('Component', 'package:angular2/core.dart', const ClassDescriptor('Component', 'package:angular2/core.dart',
superClass: 'Directive'), superClass: 'Directive'),
]; ];
@ -55,6 +60,7 @@ const COMPONENTS = const [
const VIEWS = const [ const VIEWS = const [
const ClassDescriptor('View', 'package:angular2/view.dart'), const ClassDescriptor('View', 'package:angular2/view.dart'),
const ClassDescriptor('View', 'package:angular2/angular2.dart'), const ClassDescriptor('View', 'package:angular2/angular2.dart'),
const ClassDescriptor('View', 'package:angular2/bootstrap_static.dart'),
const ClassDescriptor('View', 'package:angular2/core.dart'), const ClassDescriptor('View', 'package:angular2/core.dart'),
const ClassDescriptor( const ClassDescriptor(
'View', 'package:angular2/src/core/annotations/view.dart'), 'View', 'package:angular2/src/core/annotations/view.dart'),
@ -75,24 +81,29 @@ class AnnotationMatcher extends ClassMatcherBase {
..addAll(VIEWS)); ..addAll(VIEWS));
} }
bool _implementsWithWarning( bool _implementsWithWarning(Annotation annotation, AssetId assetId,
ClassDescriptor descriptor, List<ClassDescriptor> interfaces) => List<ClassDescriptor> interfaces) {
implements(descriptor, interfaces, ClassDescriptor descriptor = firstMatch(annotation.name, assetId);
if (descriptor == null) {
throw 'Unable to locate descriptor for ${annotation.name} in ${assetId}';
}
return implements(descriptor, interfaces,
missingSuperClassWarning: 'Missing `custom_annotation` entry for `${descriptor.superClass}`.'); missingSuperClassWarning: 'Missing `custom_annotation` entry for `${descriptor.superClass}`.');
}
/// Checks if an [Annotation] node implements [Injectable]. /// Checks if an [Annotation] node implements [Injectable].
bool isInjectable(Annotation annotation, AssetId assetId) => bool isInjectable(Annotation annotation, AssetId assetId) =>
_implementsWithWarning(firstMatch(annotation.name, assetId), INJECTABLES); _implementsWithWarning(annotation, assetId, INJECTABLES);
/// Checks if an [Annotation] node implements [Directive]. /// Checks if an [Annotation] node implements [Directive].
bool isDirective(Annotation annotation, AssetId assetId) => bool isDirective(Annotation annotation, AssetId assetId) =>
_implementsWithWarning(firstMatch(annotation.name, assetId), DIRECTIVES); _implementsWithWarning(annotation, assetId, DIRECTIVES);
/// Checks if an [Annotation] node implements [Component]. /// Checks if an [Annotation] node implements [Component].
bool isComponent(Annotation annotation, AssetId assetId) => bool isComponent(Annotation annotation, AssetId assetId) =>
_implementsWithWarning(firstMatch(annotation.name, assetId), COMPONENTS); _implementsWithWarning(annotation, assetId, COMPONENTS);
/// Checks if an [Annotation] node implements [View]. /// Checks if an [Annotation] node implements [View].
bool isView(Annotation annotation, AssetId assetId) => bool isView(Annotation annotation, AssetId assetId) =>
_implementsWithWarning(firstMatch(annotation.name, assetId), VIEWS); _implementsWithWarning(annotation, assetId, VIEWS);
} }

View File

@ -1,5 +1,6 @@
library angular2.transform.common.names; library angular2.transform.common.names;
const BOOTSTRAP_NAME = 'bootstrap';
const SETUP_METHOD_NAME = 'initReflector'; const SETUP_METHOD_NAME = 'initReflector';
const REFLECTOR_VAR_NAME = 'reflector'; const REFLECTOR_VAR_NAME = 'reflector';
const TRANSFORM_DYNAMIC_MODE = 'transform_dynamic'; const TRANSFORM_DYNAMIC_MODE = 'transform_dynamic';

View File

@ -15,6 +15,10 @@ class AstTester {
bool isReflectionCapabilitiesImport(ImportDirective node) { bool isReflectionCapabilitiesImport(ImportDirective node) {
return node.uri.stringValue.endsWith("reflection_capabilities.dart"); return node.uri.stringValue.endsWith("reflection_capabilities.dart");
} }
bool isBootstrapImport(ImportDirective node) {
return node.uri.stringValue.endsWith("/bootstrap.dart");
}
} }
/// An object that checks for {@link ReflectionCapabilities} using a fully resolved /// An object that checks for {@link ReflectionCapabilities} using a fully resolved
@ -32,4 +36,8 @@ class ResolvedTester implements AstTester {
bool isReflectionCapabilitiesImport(ImportDirective node) { bool isReflectionCapabilitiesImport(ImportDirective node) {
return node.uriElement == _forbiddenClass.library; return node.uriElement == _forbiddenClass.library;
} }
bool isBootstrapImport(ImportDirective node) {
throw 'Not implemented';
}
} }

View File

@ -1,6 +1,5 @@
library angular2.transform.reflection_remover.codegen; library angular2.transform.reflection_remover.codegen;
import 'package:analyzer/src/generated/ast.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'package:angular2/src/transform/common/names.dart'; import 'package:angular2/src/transform/common/names.dart';
@ -36,45 +35,10 @@ class Codegen {
/// Generates code to call the method which sets up Angular2 reflection /// Generates code to call the method which sets up Angular2 reflection
/// statically. /// statically.
/// String codegenSetupReflectionCall() {
/// If `reflectorAssignment` is provided, it is expected to be the node
/// representing the {@link ReflectionCapabilities} assignment, and we will
/// attempt to parse the access of `reflector` from it so that `reflector` is
/// properly prefixed if necessary.
String codegenSetupReflectionCall(
{AssignmentExpression reflectorAssignment}) {
var reflectorExpression = null;
if (reflectorAssignment != null) {
reflectorExpression = reflectorAssignment.accept(new _ReflectorVisitor());
}
if (reflectorExpression == null) {
reflectorExpression = 'reflector';
}
var count = 0; var count = 0;
return importUris return importUris
.map((_) => '${prefix}${count++}.${SETUP_METHOD_NAME}();') .map((_) => '${prefix}${count++}.${SETUP_METHOD_NAME}();')
.join(''); .join('');
} }
} }
/// A visitor whose job it is to find the access of `reflector`.
class _ReflectorVisitor extends Object with SimpleAstVisitor<Expression> {
@override
Expression visitAssignmentExpression(AssignmentExpression node) {
if (node == null || node.leftHandSide == null) return null;
return node.leftHandSide.accept(this);
}
@override
Expression visitPropertyAccess(PropertyAccess node) {
if (node == null || node.target == null) return null;
return node.target;
}
@override
Expression visitPrefixedIdentifier(PrefixedIdentifier node) {
if (node == null || node.prefix == null) return null;
return node.prefix;
}
}

View File

@ -32,96 +32,11 @@ class Rewriter {
String rewrite(CompilationUnit node) { String rewrite(CompilationUnit node) {
if (node == null) throw new ArgumentError.notNull('node'); if (node == null) throw new ArgumentError.notNull('node');
var visitor = new _FindReflectionCapabilitiesVisitor(_tester); var visitor = new _RewriterVisitor(this);
node.accept(visitor); node.accept(visitor);
if (visitor.reflectionCapabilityImports.isEmpty) {
logger.error('Failed to find ${REFLECTION_CAPABILITIES_NAME} import.');
return _code;
}
if (visitor.reflectionCapabilityAssignments.isEmpty) {
logger.error('Failed to find ${REFLECTION_CAPABILITIES_NAME} '
'instantiation.');
return _code;
}
var compare = (AstNode a, AstNode b) => a.offset - b.offset; return visitor.outputRewrittenCode();
visitor.reflectionCapabilityImports.sort(compare);
visitor.reflectionCapabilityAssignments.sort(compare);
var importAdded = false;
var buf = new StringBuffer();
var idx = visitor.reflectionCapabilityImports.fold(0,
(int lastIdx, ImportDirective node) {
buf.write(_code.substring(lastIdx, node.offset));
if ('${node.prefix}' == _codegen.prefix) {
logger.warning(
'Found import prefix "${_codegen.prefix}" in source file.'
' Transform may not succeed.');
}
if (_mirrorMode != MirrorMode.none) {
buf.write(_importDebugReflectionCapabilities(node));
} else {
buf.write(_commentedNode(node));
}
if (!importAdded && _writeStaticInit) {
buf.write(_codegen.codegenImport());
importAdded = true;
}
return node.end;
});
var setupAdded = false;
idx = visitor.reflectionCapabilityAssignments.fold(idx,
(int lastIdx, AssignmentExpression assignNode) {
var node = assignNode;
while (node.parent is ExpressionStatement) {
node = node.parent;
}
buf.write(_code.substring(lastIdx, node.offset));
switch (_mirrorMode) {
case MirrorMode.debug:
buf.write(node);
break;
case MirrorMode.verbose:
buf.write(_instantiateVerboseReflectionCapabilities(assignNode));
break;
case MirrorMode.none:
default:
buf.write(_commentedNode(node));
break;
}
if (!setupAdded && _writeStaticInit) {
buf.write(_codegen.codegenSetupReflectionCall(
reflectorAssignment: assignNode));
setupAdded = true;
}
return node.end;
});
if (idx < _code.length) buf.write(_code.substring(idx));
return buf.toString();
}
String _instantiateVerboseReflectionCapabilities(
AssignmentExpression assignNode) {
if (assignNode.rightHandSide is! InstanceCreationExpression) {
return '$assignNode;';
}
var rhs = (assignNode.rightHandSide as InstanceCreationExpression);
return '${assignNode.leftHandSide} ${assignNode.operator} '
'new ${rhs.constructorName}(verbose: true);';
}
String _importDebugReflectionCapabilities(ImportDirective node) {
var uri = '${node.uri}';
uri = path
.join(path.dirname(uri), 'debug_${path.basename(uri)}')
.replaceAll('\\', '/');
var asClause = node.prefix != null ? ' as ${node.prefix}' : '';
return 'import $uri$asClause;';
}
String _commentedNode(AstNode node) {
return '/*${_code.substring(node.offset, node.end)}*/';
} }
} }
@ -130,18 +45,31 @@ class Rewriter {
/// ///
/// This breaks our dependency on dart:mirrors, which enables smaller code /// This breaks our dependency on dart:mirrors, which enables smaller code
/// size and better performance. /// size and better performance.
class _FindReflectionCapabilitiesVisitor extends Object class _RewriterVisitor extends Object
with RecursiveAstVisitor<Object> { with RecursiveAstVisitor<Object> {
final reflectionCapabilityImports = new List<ImportDirective>(); final Rewriter _rewriter;
final reflectionCapabilityAssignments = new List<AssignmentExpression>(); final buf = new StringBuffer();
final AstTester _tester; final reflectionCapabilityAssignments = [];
_FindReflectionCapabilitiesVisitor(this._tester); int _currentIndex = 0;
bool _setupAdded = false;
bool _importAdded = false;
_RewriterVisitor(this._rewriter);
@override @override
Object visitImportDirective(ImportDirective node) { Object visitImportDirective(ImportDirective node) {
if (_tester.isReflectionCapabilitiesImport(node)) { buf.write(_rewriter._code.substring(_currentIndex, node.offset));
reflectionCapabilityImports.add(node); _currentIndex = node.offset;
if (_rewriter._tester.isReflectionCapabilitiesImport(node)) {
_rewriteReflectionCapabilitiesImport(node);
} else if (_rewriter._tester.isBootstrapImport(node)) {
_rewriteBootstrapImportToStatic(node);
}
if (!_importAdded && _rewriter._writeStaticInit) {
// Add imports for ng_deps (once)
buf.write(_rewriter._codegen.codegenImport());
_importAdded = true;
} }
return null; return null;
} }
@ -149,19 +77,130 @@ class _FindReflectionCapabilitiesVisitor extends Object
@override @override
Object visitAssignmentExpression(AssignmentExpression node) { Object visitAssignmentExpression(AssignmentExpression node) {
if (node.rightHandSide is InstanceCreationExpression && if (node.rightHandSide is InstanceCreationExpression &&
_tester.isNewReflectionCapabilities(node.rightHandSide)) { _rewriter._tester.isNewReflectionCapabilities(node.rightHandSide)) {
reflectionCapabilityAssignments.add(node); reflectionCapabilityAssignments.add(node);
_rewriteReflectionCapabilitiesAssignment(node);
} }
return super.visitAssignmentExpression(node); return super.visitAssignmentExpression(node);
} }
@override @override
Object visitInstanceCreationExpression(InstanceCreationExpression node) { Object visitInstanceCreationExpression(InstanceCreationExpression node) {
if (_tester.isNewReflectionCapabilities(node) && if (_rewriter._tester.isNewReflectionCapabilities(node) &&
!reflectionCapabilityAssignments.contains(node.parent)) { !reflectionCapabilityAssignments.contains(node.parent)) {
logger.error('Unexpected format in creation of ' logger.error('Unexpected format in creation of '
'${REFLECTION_CAPABILITIES_NAME}'); '${REFLECTION_CAPABILITIES_NAME}');
} }
return super.visitInstanceCreationExpression(node); return super.visitInstanceCreationExpression(node);
} }
@override
Object visitMethodInvocation(MethodInvocation node) {
if (node.methodName.toString() == BOOTSTRAP_NAME) {
_rewriteBootstrapCallToStatic(node);
}
return super.visitMethodInvocation(node);
}
String outputRewrittenCode() {
if (_currentIndex < _rewriter._code.length) {
buf.write(_rewriter._code.substring(_currentIndex));
}
return '$buf';
}
_rewriteBootstrapImportToStatic(ImportDirective node) {
if (_rewriter._writeStaticInit) {
// rewrite `bootstrap.dart` to `bootstrap_static.dart`
buf.write(_rewriter._code.substring(_currentIndex, node.offset));
// TODO(yjbanov): handle import "..." show/hide ...
buf.write("import 'package:angular2/bootstrap_static.dart';");
} else {
// leave it as is
buf.write(_rewriter._code.substring(_currentIndex, node.end));
}
_currentIndex = node.end;
}
_rewriteBootstrapCallToStatic(MethodInvocation node) {
if (_rewriter._writeStaticInit) {
buf.write(_rewriter._code.substring(_currentIndex, node.offset));
_writeStaticReflectorInitOnce();
// rewrite `bootstrap(...)` to `bootstrapStatic(...)`
buf.write('bootstrapStatic${node.argumentList}');
} else {
// leave it as is
buf.write(_rewriter._code.substring(_currentIndex, node.end));
}
_currentIndex = node.end;
}
_writeStaticReflectorInitOnce() {
if (!_setupAdded) {
buf.write(_rewriter._codegen.codegenSetupReflectionCall());
_setupAdded = true;
}
}
_rewriteReflectionCapabilitiesImport(ImportDirective node) {
buf.write(_rewriter._code.substring(_currentIndex, node.offset));
if ('${node.prefix}' == _rewriter._codegen.prefix) {
logger.warning(
'Found import prefix "${_rewriter._codegen.prefix}" in source file.'
' Transform may not succeed.');
}
if (_rewriter._mirrorMode != MirrorMode.none) {
buf.write(_importDebugReflectionCapabilities(node));
} else {
buf.write(_commentedNode(node));
}
_currentIndex = node.end;
}
_rewriteReflectionCapabilitiesAssignment(AssignmentExpression assignNode) {
var node = assignNode;
while (node.parent is ExpressionStatement) {
node = node.parent;
}
buf.write(_rewriter._code.substring(_currentIndex, node.offset));
if (_rewriter._writeStaticInit) {
_writeStaticReflectorInitOnce();
}
switch (_rewriter._mirrorMode) {
case MirrorMode.debug:
buf.write(node);
break;
case MirrorMode.verbose:
buf.write(_instantiateVerboseReflectionCapabilities(assignNode));
break;
case MirrorMode.none:
default:
buf.write(_commentedNode(node));
break;
}
_currentIndex = node.end;
}
String _commentedNode(AstNode node) {
return '/*${_rewriter._code.substring(node.offset, node.end)}*/';
}
}
String _importDebugReflectionCapabilities(ImportDirective node) {
var uri = '${node.uri}';
uri = path
.join(path.dirname(uri), 'debug_${path.basename(uri)}')
.replaceAll('\\', '/');
var asClause = node.prefix != null ? ' as ${node.prefix}' : '';
return 'import $uri$asClause;';
}
String _instantiateVerboseReflectionCapabilities(
AssignmentExpression assignNode) {
if (assignNode.rightHandSide is! InstanceCreationExpression) {
return '$assignNode;';
}
var rhs = (assignNode.rightHandSide as InstanceCreationExpression);
return '${assignNode.leftHandSide} ${assignNode.operator} '
'new ${rhs.constructorName}(verbose: true);';
} }

View File

@ -40,13 +40,13 @@ main() {
const indexCommonContents = ''' const indexCommonContents = '''
library examples.src.hello_world.index_common; library examples.src.hello_world.index_common;
import "package:angular2/angular2.dart" import "package:angular2/bootstrap.dart"
show bootstrap, Component, Decorator, Template, NgElement; show bootstrap, Component, Directive, View, ElementRef;
import "package:angular2/di.dart" show Injectable; import "package:angular2/di.dart" show Injectable;
@Component(selector: "hello-app", services: const [GreetingService]) @Component(selector: "hello-app", services: const [GreetingService])
@Template( @View(
inline: '<div class="greeting">{{greeting}} <span red>world</span>!</div>' template: '<div class="greeting">{{greeting}} <span red>world</span>!</div>'
'<button class="changeButton" (click)="changeGreeting()">' '<button class="changeButton" (click)="changeGreeting()">'
'change greeting</button><ng-content></ng-content>', 'change greeting</button><ng-content></ng-content>',
directives: const [RedDec]) directives: const [RedDec])
@ -60,10 +60,10 @@ class HelloCmp {
} }
} }
@Decorator(selector: "[red]") @Directive(selector: "[red]")
class RedDec { class RedDec {
RedDec(NgElement el) { RedDec(ElementRef el) {
el.domElement.style.color = "red"; el.nativeElement.style.color = "red";
} }
} }

View File

@ -23,7 +23,7 @@ Future runBenchmark() async {
const indexContents = ''' const indexContents = '''
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';

View File

@ -11,7 +11,7 @@ import {
xit, xit,
} from 'angular2/test_lib'; } from 'angular2/test_lib';
import {bootstrap} from 'angular2/core'; import {bootstrap} from 'angular2/bootstrap';
import {Component, Directive, View} from 'angular2/annotations'; import {Component, Directive, View} from 'angular2/annotations';
import {DOM} from 'angular2/src/dom/dom_adapter'; import {DOM} from 'angular2/src/dom/dom_adapter';
import {bind} from 'angular2/di'; import {bind} from 'angular2/di';

View File

@ -1,7 +1,7 @@
library web_foo.ng_deps.dart; library web_foo.ng_deps.dart;
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap_static.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart'; import 'bar.dart';
import 'bar.ng_deps.dart' as i0; import 'bar.ng_deps.dart' as i0;

View File

@ -1,7 +1,7 @@
library web_foo.ng_deps.dart; library web_foo.ng_deps.dart;
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap_static.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart'; import 'bar.dart';

View File

@ -1,7 +1,7 @@
library web_foo.ng_deps.dart; library web_foo.ng_deps.dart;
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap_static.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart'; import 'bar.dart';
import 'bar.ng_deps.dart' as i0; import 'bar.ng_deps.dart' as i0;

View File

@ -1,7 +1,7 @@
library web_foo.ng_deps.dart; library web_foo.ng_deps.dart;
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap_static.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart'; import 'bar.dart';

View File

@ -3,7 +3,6 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show show
bootstrap,
Component, Component,
Directive, Directive,
View, View,

View File

@ -3,7 +3,6 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show show
bootstrap,
Component, Component,
Directive, Directive,
View, View,

View File

@ -3,7 +3,6 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show show
bootstrap,
Component, Component,
Directive, Directive,
View, View,

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -3,7 +3,6 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show show
bootstrap,
Component, Component,
Directive, Directive,
View, View,

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -4,7 +4,7 @@ import 'hello.dart';
export 'hello.dart'; export 'hello.dart';
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector() { void initReflector() {

View File

@ -1,7 +1,7 @@
library examples.src.hello_world.absolute_url_expression_files; library examples.src.hello_world.absolute_url_expression_files;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
@Component(selector: 'hello-app') @Component(selector: 'hello-app')
@View( @View(

View File

@ -116,8 +116,10 @@ void allTests() {
void _testNgDeps(String name, String inputPath, void _testNgDeps(String name, String inputPath,
{List<AnnotationDescriptor> customDescriptors: const [], AssetId assetId, {List<AnnotationDescriptor> customDescriptors: const [], AssetId assetId,
AssetReader reader, List<String> expectedLogs, bool inlineViews: true}) { AssetReader reader, List<String> expectedLogs, bool inlineViews: true,
it(name, () async { bool isolate: false}) {
var testFn = isolate ? iit : it;
testFn(name, () async {
if (expectedLogs != null) { if (expectedLogs != null) {
log.setLogger(new RecordingLogger()); log.setLogger(new RecordingLogger());
} }

View File

@ -4,7 +4,7 @@ import 'hello.dart';
export 'hello.dart'; export 'hello.dart';
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector() { void initReflector() {

View File

@ -4,7 +4,7 @@ import 'hello.dart';
export 'hello.dart'; export 'hello.dart';
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector() { void initReflector() {

View File

@ -1,7 +1,7 @@
library test.transform.directive_processor.invalid_url_files.hello; library test.transform.directive_processor.invalid_url_files.hello;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
@Component(selector: 'hello-app') @Component(selector: 'hello-app')
@View( @View(

View File

@ -4,7 +4,7 @@ import 'hello.dart';
export 'hello.dart'; export 'hello.dart';
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector() { void initReflector() {

View File

@ -1,7 +1,7 @@
library examples.src.hello_world.multiple_style_urls_files; library examples.src.hello_world.multiple_style_urls_files;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
@Component(selector: 'hello-app') @Component(selector: 'hello-app')
@View( @View(

View File

@ -4,7 +4,7 @@ import 'hello.dart';
export 'hello.dart'; export 'hello.dart';
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector() { void initReflector() {

View File

@ -1,7 +1,7 @@
library examples.src.hello_world.multiple_style_urls_not_inlined_files; library examples.src.hello_world.multiple_style_urls_not_inlined_files;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
@Component(selector: 'hello-app') @Component(selector: 'hello-app')
@View( @View(

View File

@ -4,7 +4,7 @@ import 'hello.dart';
export 'hello.dart'; export 'hello.dart';
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector() { void initReflector() {

View File

@ -1,7 +1,7 @@
library examples.src.hello_world.split_url_expression_files; library examples.src.hello_world.split_url_expression_files;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
@Component(selector: 'hello-app') @Component(selector: 'hello-app')
@View(templateUrl: 'templ' 'ate.html') @View(templateUrl: 'templ' 'ate.html')

View File

@ -4,7 +4,7 @@ import 'hello.dart';
export 'hello.dart'; export 'hello.dart';
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector() { void initReflector() {

View File

@ -1,7 +1,7 @@
library examples.src.hello_world.url_expression_files; library examples.src.hello_world.url_expression_files;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
@Component(selector: 'hello-app') @Component(selector: 'hello-app')
@View(templateUrl: 'template.html') @View(templateUrl: 'template.html')

View File

@ -1,6 +1,6 @@
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart'; import 'bar.dart';

View File

@ -3,9 +3,9 @@ library web_foo.ng_deps.dart;
import 'index.dart'; import 'index.dart';
export 'index.dart'; export 'index.dart';
import 'package:angular2/src/reflection/reflection.dart' as _ngRef; import 'package:angular2/src/reflection/reflection.dart' as _ngRef;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap_static.dart';
import 'package:angular2/src/reflection/reflection.dart';
import 'index.ng_deps.dart' as ngStaticInit0; import 'index.ng_deps.dart' as ngStaticInit0;
import 'package:angular2/src/reflection/reflection.dart';
import 'bar.dart'; import 'bar.dart';
import 'bar.ng_deps.dart' as i0; import 'bar.ng_deps.dart' as i0;

View File

@ -1,6 +1,6 @@
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart'; import 'bar.dart';

View File

@ -1,6 +1,6 @@
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart'; import 'bar.dart';

View File

@ -1,6 +1,6 @@
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart'; import 'bar.dart';

View File

@ -1,6 +1,6 @@
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart'; import 'bar.dart';

View File

@ -1,7 +1,5 @@
Tests that the reflection removal step: Tests that the reflection removal step:
1. Comments out the import of reflection_capabilities.dart * Adds the appropriate ng_deps import.
2. Comments out the instantiation of `ReflectionCapabilities` * Adds the call to `initReflector`
3. Adds the appropriate import. * Does not change line numbers in the source.
4. Adds the call to `initReflector` * Makes minimal changes to source offsets.
5. Does not change line numbers in the source.
6. Makes minimal changes to source offsets.

View File

@ -11,12 +11,12 @@ library angular2.test.transform.debug_reflection_remover_files;
var code = """ var code = """
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';import 'index.ng_deps.dart' as ngStaticInit0;
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/reflection/debug_reflection_capabilities.dart';import 'index.ng_deps.dart' as ngStaticInit0; import 'package:angular2/src/reflection/debug_reflection_capabilities.dart';
void main() { void main() {
reflector.reflectionCapabilities = new ReflectionCapabilities();ngStaticInit0.initReflector(); reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(MyComponent); ngStaticInit0.initReflector();bootstrap(MyComponent);
} }
"""; """;

View File

@ -1,6 +1,6 @@
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';

View File

@ -11,12 +11,12 @@ library angular2.test.transform.reflection_remover.debug_mirrors_files.expected;
var code = """ var code = """
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap_static.dart';import 'index.ng_deps.dart' as ngStaticInit0;
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/reflection/debug_reflection_capabilities.dart';import 'index.ng_deps.dart' as ngStaticInit0; import 'package:angular2/src/reflection/debug_reflection_capabilities.dart';
void main() { void main() {
reflector.reflectionCapabilities = new ReflectionCapabilities();ngStaticInit0.initReflector(); ngStaticInit0.initReflector();reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(MyComponent); bootstrapStatic(MyComponent);
} }
"""; """;

View File

@ -1,6 +1,6 @@
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';

View File

@ -1,6 +1,6 @@
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';

View File

@ -11,7 +11,7 @@ library angular2.test.transform.log_mirrors_files.expected;
var code = """ var code = """
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
/*import 'package:angular2/src/reflection/reflection_capabilities.dart';*/ /*import 'package:angular2/src/reflection/reflection_capabilities.dart';*/

View File

@ -1,6 +1,6 @@
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';

View File

@ -11,12 +11,12 @@ library angular2.test.transform.reflection_remover.reflection_remover_files;
var code = """ var code = """
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap_static.dart';import 'index.ng_deps.dart' as ngStaticInit0;
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
/*import 'package:angular2/src/reflection/reflection_capabilities.dart';*/import 'index.ng_deps.dart' as ngStaticInit0; /*import 'package:angular2/src/reflection/reflection_capabilities.dart';*/
void main() { void main() {
/*reflector.reflectionCapabilities = new ReflectionCapabilities();*/ngStaticInit0.initReflector(); ngStaticInit0.initReflector();/*reflector.reflectionCapabilities = new ReflectionCapabilities();*/
bootstrap(MyComponent); bootstrapStatic(MyComponent);
} }
"""; """;

View File

@ -1,6 +1,6 @@
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap.dart';
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart'; import 'package:angular2/src/reflection/reflection_capabilities.dart';

View File

@ -11,12 +11,12 @@ library angular2.test.transform.reflection_remover.verbose_files.expected;
var code = """ var code = """
library web_foo; library web_foo;
import 'package:angular2/src/core/application.dart'; import 'package:angular2/bootstrap_static.dart';import 'index.ng_deps.dart' as ngStaticInit0;
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/reflection/debug_reflection_capabilities.dart';import 'index.ng_deps.dart' as ngStaticInit0; import 'package:angular2/src/reflection/debug_reflection_capabilities.dart';
void main() { void main() {
reflector.reflectionCapabilities = new ReflectionCapabilities(verbose: true);ngStaticInit0.initReflector(); ngStaticInit0.initReflector();reflector.reflectionCapabilities = new ReflectionCapabilities(verbose: true);
bootstrap(MyComponent); bootstrapStatic(MyComponent);
} }
"""; """;

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library test.src.transform.template_compiler.ng_for_files.hello.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.src.hello_world.index_common_dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.src.hello_world.index_common_dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.src.hello_world.index_common_dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.src.hello_world.index_common_dart;
import 'hello.dart'; import 'hello.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'goodbye.dart'; import 'goodbye.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -4,7 +4,7 @@ import 'hello.dart';
import 'goodbye.dart' as prefix; import 'goodbye.dart' as prefix;
import 'goodbye.ng_deps.dart' as i0; import 'goodbye.ng_deps.dart' as i0;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library angular2.test.transform.template_compiler.with_prefix_files.ng2_prefix.n
import 'ng2_prefix.dart'; import 'ng2_prefix.dart';
import 'package:angular2/angular2.dart' as ng2 import 'package:angular2/angular2.dart' as ng2
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library examples.hello_world.index_common_dart.ng_deps.dart;
import 'goodbye.dart'; import 'goodbye.dart';
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -4,7 +4,7 @@ import 'hello.dart';
import 'goodbye.dart' as prefix; import 'goodbye.dart' as prefix;
import 'goodbye.ng_deps.dart' as i0; import 'goodbye.ng_deps.dart' as i0;
import 'package:angular2/angular2.dart' import 'package:angular2/angular2.dart'
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -2,7 +2,7 @@ library angular2.test.transform.template_compiler.with_prefix_files.ng2_prefix.n
import 'ng2_prefix.dart'; import 'ng2_prefix.dart';
import 'package:angular2/angular2.dart' as ng2 import 'package:angular2/angular2.dart' as ng2
show bootstrap, Component, Directive, View, NgElement; show Component, Directive, View, NgElement;
var _visited = false; var _visited = false;
void initReflector(reflector) { void initReflector(reflector) {

View File

@ -5,18 +5,15 @@ import {
DynamicComponentLoader, DynamicComponentLoader,
ElementRef, ElementRef,
View View
} from 'angular2/angular2'; } from 'angular2/bootstrap';
import {LifeCycle} from 'angular2/src/core/life_cycle/life_cycle'; import {LifeCycle} from 'angular2/src/core/life_cycle/life_cycle';
import {List, ListWrapper} from 'angular2/src/facade/collection'; import {List, ListWrapper} from 'angular2/src/facade/collection';
import {reflector} from 'angular2/src/reflection/reflection';
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
import {getIntParameter, bindAction} from 'angular2/src/test_lib/benchmark_util'; import {getIntParameter, bindAction} from 'angular2/src/test_lib/benchmark_util';
import {NgIf, NgFor} from 'angular2/directives'; import {NgIf, NgFor} from 'angular2/directives';
var testList = null; var testList = null;
export function main() { export function main() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
var size = getIntParameter('size'); var size = getIntParameter('size');
testList = ListWrapper.createFixedSize(size); testList = ListWrapper.createFixedSize(size);

View File

@ -14,6 +14,7 @@ export function main() {
BrowserDomAdapter.makeCurrent(); BrowserDomAdapter.makeCurrent();
var iterations = getIntParameter('iterations'); var iterations = getIntParameter('iterations');
// This benchmark does not use bootstrap and needs to create a reflector
setupReflector(); setupReflector();
var bindings = [A, B, C, D, E]; var bindings = [A, B, C, D, E];
var injector = Injector.resolveAndCreate(bindings); var injector = Injector.resolveAndCreate(bindings);

View File

@ -1,9 +1,7 @@
import {bootstrap, Component, Directive, View} from 'angular2/angular2'; import {bootstrap, Component, Directive, View} from 'angular2/bootstrap';
import {LifeCycle} from 'angular2/src/core/life_cycle/life_cycle'; import {LifeCycle} from 'angular2/src/core/life_cycle/life_cycle';
import {reflector} from 'angular2/src/reflection/reflection';
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
import {DOM} from 'angular2/src/dom/dom_adapter'; import {DOM} from 'angular2/src/dom/dom_adapter';
import {window, document, gc} from 'angular2/src/facade/browser'; import {window, document, gc} from 'angular2/src/facade/browser';
import { import {
@ -22,6 +20,7 @@ import {ListWrapper} from 'angular2/src/facade/collection';
import {bind} from 'angular2/di'; import {bind} from 'angular2/di';
import {Inject} from 'angular2/src/di/decorators'; import {Inject} from 'angular2/src/di/decorators';
import {reflector} from 'angular2/src/reflection/reflection';
export const BENCHMARK_TYPE = 'LargetableComponent.benchmarkType'; export const BENCHMARK_TYPE = 'LargetableComponent.benchmarkType';
export const LARGETABLE_ROWS = 'LargetableComponent.rows'; export const LARGETABLE_ROWS = 'LargetableComponent.rows';
@ -41,8 +40,6 @@ function _createBindings() {
var BASELINE_LARGETABLE_TEMPLATE; var BASELINE_LARGETABLE_TEMPLATE;
function setupReflector() { function setupReflector() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
// TODO(kegluneq): Generate these. // TODO(kegluneq): Generate these.
reflector.registerGetters({ reflector.registerGetters({
'benchmarktype': (o) => o.benchmarktype, 'benchmarktype': (o) => o.benchmarktype,
@ -62,8 +59,6 @@ export function main() {
var totalColumns = getIntParameter('columns'); var totalColumns = getIntParameter('columns');
BASELINE_LARGETABLE_TEMPLATE = DOM.createTemplate('<table></table>'); BASELINE_LARGETABLE_TEMPLATE = DOM.createTemplate('<table></table>');
setupReflector();
var app; var app;
var lifecycle; var lifecycle;
var baselineRootLargetableComponent; var baselineRootLargetableComponent;
@ -132,6 +127,7 @@ export function main() {
bindAction('#ng2UpdateDomProfile', profile(ng2CreateDom, noop, 'ng2-update')); bindAction('#ng2UpdateDomProfile', profile(ng2CreateDom, noop, 'ng2-update'));
bindAction('#ng2CreateDomProfile', profile(ng2CreateDom, ng2DestroyDom, 'ng2-create')); bindAction('#ng2CreateDomProfile', profile(ng2CreateDom, ng2DestroyDom, 'ng2-create'));
}); });
setupReflector();
} }
function baselineDestroyDom() { baselineRootLargetableComponent.update(buildTable(0, 0)); } function baselineDestroyDom() { baselineRootLargetableComponent.update(buildTable(0, 0)); }

View File

@ -1,8 +1,7 @@
import {MapWrapper} from 'angular2/src/facade/collection'; import {MapWrapper} from 'angular2/src/facade/collection';
import {bootstrap} from 'angular2/angular2'; import {bootstrap} from 'angular2/bootstrap';
import {reflector} from 'angular2/src/reflection/reflection'; import {reflector} from 'angular2/src/reflection/reflection';
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
import {App} from './app'; import {App} from './app';
@ -10,8 +9,8 @@ import {APP_VIEW_POOL_CAPACITY} from 'angular2/src/core/compiler/view_pool';
import {bind} from 'angular2/di'; import {bind} from 'angular2/di';
export function main() { export function main() {
setupReflector();
bootstrap(App, createBindings()); bootstrap(App, createBindings());
setupReflector();
} }
function createBindings(): List { function createBindings(): List {
@ -19,8 +18,6 @@ function createBindings(): List {
} }
export function setupReflector() { export function setupReflector() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
// TODO(kegluneq): Generate this. // TODO(kegluneq): Generate this.
reflector.registerSetters({ reflector.registerSetters({
'style': (o, m) => { 'style': (o, m) => {

View File

@ -1,4 +1,11 @@
import {bootstrap, Compiler, Component, Directive, View, ViewContainerRef} from 'angular2/angular2'; import {
bootstrap,
Compiler,
Component,
Directive,
View,
ViewContainerRef
} from 'angular2/bootstrap';
import {LifeCycle} from 'angular2/src/core/life_cycle/life_cycle'; import {LifeCycle} from 'angular2/src/core/life_cycle/life_cycle';
import {reflector} from 'angular2/src/reflection/reflection'; import {reflector} from 'angular2/src/reflection/reflection';

View File

@ -1,8 +1,13 @@
import {bootstrap, Compiler, Component, Directive, View, ViewContainerRef} from 'angular2/angular2'; import {
bootstrap,
Compiler,
Component,
Directive,
View,
ViewContainerRef
} from 'angular2/bootstrap';
import {LifeCycle} from 'angular2/src/core/life_cycle/life_cycle'; import {LifeCycle} from 'angular2/src/core/life_cycle/life_cycle';
import {reflector} from 'angular2/src/reflection/reflection';
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
import {DOM} from 'angular2/src/dom/dom_adapter'; import {DOM} from 'angular2/src/dom/dom_adapter';
import {isPresent} from 'angular2/src/facade/lang'; import {isPresent} from 'angular2/src/facade/lang';
import {List} from 'angular2/src/facade/collection'; import {List} from 'angular2/src/facade/collection';
@ -24,10 +29,6 @@ function createBindings(): List<Binding> {
return [bind(APP_VIEW_POOL_CAPACITY).toValue(viewCacheCapacity)]; return [bind(APP_VIEW_POOL_CAPACITY).toValue(viewCacheCapacity)];
} }
function setupReflector() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
}
var BASELINE_TREE_TEMPLATE; var BASELINE_TREE_TEMPLATE;
var BASELINE_IF_TEMPLATE; var BASELINE_IF_TEMPLATE;
@ -35,8 +36,6 @@ export function main() {
BrowserDomAdapter.makeCurrent(); BrowserDomAdapter.makeCurrent();
var maxDepth = getIntParameter('depth'); var maxDepth = getIntParameter('depth');
setupReflector();
BASELINE_TREE_TEMPLATE = DOM.createTemplate( BASELINE_TREE_TEMPLATE = DOM.createTemplate(
'<span>_<template class="ng-binding"></template><template class="ng-binding"></template></span>'); '<span>_<template class="ng-binding"></template><template class="ng-binding"></template></span>');
BASELINE_IF_TEMPLATE = DOM.createTemplate('<span template="if"><tree></tree></span>'); BASELINE_IF_TEMPLATE = DOM.createTemplate('<span template="if"><tree></tree></span>');

View File

@ -1,6 +1,4 @@
import {bootstrap, Component, View} from 'angular2/angular2'; import {bootstrap, Component, View} from 'angular2/bootstrap';
import {reflector} from 'angular2/src/reflection/reflection';
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
@Component({selector: 'gestures-app'}) @Component({selector: 'gestures-app'})
@View({templateUrl: 'template.html'}) @View({templateUrl: 'template.html'})
@ -17,6 +15,5 @@ class GesturesCmp {
} }
export function main() { export function main() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(GesturesCmp); bootstrap(GesturesCmp);
} }

View File

@ -1,18 +1,7 @@
import {HelloCmp} from './index_common'; import {HelloCmp} from './index_common';
import {bootstrap} from 'angular2/angular2'; import {bootstrap} from 'angular2/bootstrap';
import {reflector} from 'angular2/src/reflection/reflection';
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
export function main() { export function main() {
// For Dart users: Initializing the reflector is only required for the Dart version of the
// application. When using Dart, the reflection information is not embedded by default in the
// source code to keep the size of the generated file small. Importing ReflectionCapabilities and
// initializing the reflector is required to use the reflection information from Dart mirrors.
// Dart mirrors are not intended to be use in production code.
// Angular 2 provides a transformer which generates static code rather than rely on reflection.
// For an example, run `pub serve` on the Dart application and inspect this file in your browser.
reflector.reflectionCapabilities = new ReflectionCapabilities();
// Bootstrapping only requires specifying a root component. // Bootstrapping only requires specifying a root component.
// The boundary between the Angular application and the rest of the page is // The boundary between the Angular application and the rest of the page is
// the shadowDom of this root component. // the shadowDom of this root component.

View File

@ -1,11 +1,8 @@
import {HelloCmp} from './index_common'; import {HelloCmp} from './index_common';
import {bootstrap} from 'angular2/angular2'; import {bootstrap} from 'angular2/bootstrap';
import {reflector} from 'angular2/src/reflection/reflection';
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
// This entry point is not transformed and exists for testing dynamic runtime
// mode.
export function main() { export function main() {
// This entry point is not transformed and exists for testing purposes.
// See index.js for an explanation.
reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(HelloCmp); bootstrap(HelloCmp);
} }

View File

@ -1,12 +1,9 @@
/// <reference path="../../../angular2/typings/rx/rx.all.d.ts" /> /// <reference path="../../../angular2/typings/rx/rx.all.d.ts" />
import {bootstrap} from 'angular2/angular2'; import {bootstrap} from 'angular2/bootstrap';
import {reflector} from 'angular2/src/reflection/reflection';
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
import {httpInjectables} from 'angular2/http'; import {httpInjectables} from 'angular2/http';
import {HttpCmp} from './http_comp'; import {HttpCmp} from './http_comp';
export function main() { export function main() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(HttpCmp, [httpInjectables]); bootstrap(HttpCmp, [httpInjectables]);
} }

View File

@ -1,13 +1,8 @@
import {HttpCmp} from './http_comp'; import {HttpCmp} from './http_comp';
import {bootstrap} from 'angular2/angular2'; import {bootstrap} from 'angular2/bootstrap';
import {reflector} from 'angular2/src/reflection/reflection';
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
import {httpInjectables} from 'angular2/http'; import {httpInjectables} from 'angular2/http';
export function main() { export function main() {
// This entry point is not transformed and exists for testing purposes. // This entry point is not transformed and exists for testing dynamic mode.
// See index.js for an explanation.
reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(HttpCmp, [httpInjectables]); bootstrap(HttpCmp, [httpInjectables]);
} }

View File

@ -1,12 +1,9 @@
/// <reference path="../../../angular2/typings/rx/rx.all.d.ts" /> /// <reference path="../../../angular2/typings/rx/rx.all.d.ts" />
import {bootstrap} from 'angular2/angular2'; import {bootstrap} from 'angular2/bootstrap';
import {reflector} from 'angular2/src/reflection/reflection';
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
import {jsonpInjectables} from 'angular2/http'; import {jsonpInjectables} from 'angular2/http';
import {JsonpCmp} from './jsonp_comp'; import {JsonpCmp} from './jsonp_comp';
export function main() { export function main() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(JsonpCmp, [jsonpInjectables]); bootstrap(JsonpCmp, [jsonpInjectables]);
} }

Some files were not shown because too many files have changed in this diff Show More