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:
parent
55e8dca8de
commit
3531bb7118
8
modules/angular2/angular2.dart
Normal file
8
modules/angular2/angular2.dart
Normal 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';
|
@ -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,
|
||||||
|
43
modules/angular2/angular2_exports.ts
Normal file
43
modules/angular2/angular2_exports.ts
Normal 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';
|
52
modules/angular2/bootstrap.ts
Normal file
52
modules/angular2/bootstrap.ts
Normal 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';
|
4
modules/angular2/bootstrap_static.dart
Normal file
4
modules/angular2/bootstrap_static.dart
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
library angular2.bootstrap_static;
|
||||||
|
|
||||||
|
export 'angular2_exports.dart';
|
||||||
|
export 'src/core/application_static.dart';
|
@ -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.
|
||||||
|
21
modules/angular2/src/core/application.dart
Normal file
21
modules/angular2/src/core/application.dart
Normal 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);
|
||||||
|
}
|
@ -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);
|
|
||||||
}
|
|
||||||
|
372
modules/angular2/src/core/application_common.ts
Normal file
372
modules/angular2/src/core/application_common.ts
Normal 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);
|
||||||
|
}
|
14
modules/angular2/src/core/application_static.dart
Normal file
14
modules/angular2/src/core/application_static.dart
Normal 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);
|
||||||
|
}
|
@ -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';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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';
|
||||||
|
@ -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';
|
||||||
|
@ -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';
|
||||||
|
@ -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';
|
||||||
|
@ -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';
|
||||||
|
@ -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';
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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';
|
||||||
|
@ -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';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -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);';
|
||||||
}
|
}
|
||||||
|
@ -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";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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';
|
||||||
|
@ -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;
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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() {
|
||||||
|
@ -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(
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
||||||
|
@ -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() {
|
||||||
|
@ -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(
|
||||||
|
@ -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() {
|
||||||
|
@ -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(
|
||||||
|
@ -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() {
|
||||||
|
@ -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(
|
||||||
|
@ -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() {
|
||||||
|
@ -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')
|
||||||
|
@ -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() {
|
||||||
|
@ -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')
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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';
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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.
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
""";
|
""";
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
""";
|
""";
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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';*/
|
||||||
|
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
""";
|
""";
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
""";
|
""";
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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)); }
|
||||||
|
@ -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) => {
|
||||||
|
@ -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';
|
||||||
|
@ -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>');
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user