From fcadbf4bf6d00ea5b250a8069e05b3e4bd000a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mis=CC=8Cko=20Hevery?= Date: Thu, 3 Aug 2017 12:33:29 -0700 Subject: [PATCH] perf: switch angular to use StaticInjector instead of ReflectiveInjector This change allows ReflectiveInjector to be tree shaken resulting in not needed Reflect polyfil and smaller bundles. Code savings for HelloWorld using Closure: Reflective: bundle.js: 105,864(34,190 gzip) Static: bundle.js: 154,889(33,555 gzip) 645( 2%) BREAKING CHANGE: `platformXXXX()` no longer accepts providers which depend on reflection. Specifically the method signature when from `Provider[]` to `StaticProvider[]`. Example: Before: ``` [ MyClass, {provide: ClassA, useClass: SubClassA} ] ``` After: ``` [ {provide: MyClass, deps: [Dep1,...]}, {provide: ClassA, useClass: SubClassA, deps: [Dep1,...]} ] ``` NOTE: This only applies to platform creation and providers for the JIT compiler. It does not apply to `@Compotent` or `@NgModule` provides declarations. Benchpress note: Previously Benchpress also supported reflective provides, which now require static providers. DEPRECATION: - `ReflectiveInjector` is now deprecated as it will be remove. Use `Injector.create` as a replacement. closes #18496 --- modules/e2e_util/perf_util.ts | 4 +- modules/playground/README.md | 2 + packages/benchpress/index.ts | 2 +- .../benchpress/src/metric/perflog_metric.ts | 9 ++- packages/benchpress/src/metric/user_metric.ts | 5 +- .../src/reporter/console_reporter.ts | 6 +- .../src/reporter/json_file_reporter.ts | 8 ++- packages/benchpress/src/runner.ts | 12 ++-- packages/benchpress/src/sampler.ts | 10 ++- .../validator/regression_slope_validator.ts | 6 +- .../src/validator/size_validator.ts | 5 +- .../src/webdriver/chrome_driver_extension.ts | 7 +- .../src/webdriver/firefox_driver_extension.ts | 2 +- .../src/webdriver/ios_driver_extension.ts | 2 +- .../webdriver/selenium_webdriver_adapter.ts | 8 ++- .../test/metric/multi_metric_spec.ts | 7 +- .../test/metric/perflog_metric_spec.ts | 8 +-- .../test/metric/user_metric_spec.ts | 6 +- .../test/reporter/console_reporter_spec.ts | 8 +-- .../test/reporter/json_file_reporter_spec.ts | 4 +- .../test/reporter/multi_reporter_spec.ts | 6 +- packages/benchpress/test/runner_spec.ts | 6 +- packages/benchpress/test/sampler_spec.ts | 4 +- .../regression_slope_validator_spec.ts | 6 +- .../test/validator/size_validator_spec.ts | 6 +- .../test/web_driver_extension_spec.ts | 6 +- .../webdriver/chrome_driver_extension_spec.ts | 6 +- .../webdriver/ios_driver_extension_spec.ts | 6 +- .../src/directives/ng_component_outlet.ts | 3 +- .../directives/ng_component_outlet_spec.ts | 4 +- .../compiler/src/aot/summary_serializer.ts | 2 +- packages/compiler/src/jit/compiler_factory.ts | 67 ++++++++++++------- .../src/view_compiler/view_compiler.ts | 2 +- .../test/directive_normalizer_spec.ts | 5 +- .../compiler/test/i18n/integration_common.ts | 1 + .../test/i18n/integration_xliff2_spec.ts | 4 +- .../test/i18n/integration_xliff_spec.ts | 4 +- .../test/i18n/integration_xmb_xtb_spec.ts | 4 +- .../compiler/test/runtime_compiler_spec.ts | 9 +-- packages/compiler/test/spies.ts | 1 + .../template_parser/template_parser_spec.ts | 2 +- .../compiler/testing/src/test_bindings.ts | 4 +- packages/compiler/testing/src/testing.ts | 14 ++-- packages/core/src/application_ref.ts | 14 ++-- .../differs/iterable_differs.ts | 5 +- .../differs/keyvalue_differs.ts | 4 +- packages/core/src/linker/compiler.ts | 5 +- packages/core/src/platform_core_providers.ts | 16 ++--- packages/core/src/view/query.ts | 2 +- packages/core/src/view/view.ts | 2 +- .../differs/iterable_differs_spec.ts | 9 ++- packages/core/test/linker/integration_spec.ts | 5 +- packages/core/test/view/provider_spec.ts | 15 ++++- packages/core/testing/src/test_bed.ts | 6 +- .../src/directives/range_value_accessor.ts | 4 +- .../select_control_value_accessor.ts | 5 +- .../select_multiple_control_value_accessor.ts | 5 +- packages/forms/src/directives/validators.ts | 8 ++- .../http/test/backends/jsonp_backend_spec.ts | 10 +-- .../http/test/backends/mock_backend_spec.ts | 8 ++- packages/http/test/http_spec.ts | 6 +- packages/http/testing/src/mock_backend.ts | 8 +-- .../src/platform-browser-dynamic.ts | 2 +- .../src/platform_providers.ts | 6 +- .../resource_loader_cache_spec.ts | 4 +- .../testing/src/testing.ts | 2 +- packages/platform-browser/src/browser.ts | 12 ++-- .../src/browser/server-transition.ts | 4 +- .../test/browser/bootstrap_spec.ts | 6 +- .../test/browser/tools/spies.ts | 6 +- .../platform-browser/testing/src/browser.ts | 4 +- packages/platform-server/src/server.ts | 14 ++-- packages/platform-server/src/utils.ts | 13 ++-- .../platform-server/testing/src/server.ts | 2 +- .../src/platform-webworker-dynamic.ts | 2 +- .../src/platform-webworker.ts | 4 +- .../src/web_workers/ui/location_providers.ts | 15 +++-- packages/platform-webworker/src/worker_app.ts | 3 +- .../platform-webworker/src/worker_render.ts | 54 ++++++++++----- .../src/common/downgrade_component_adapter.ts | 6 +- .../upgrade/src/dynamic/upgrade_adapter.ts | 4 +- .../upgrade/src/static/angular1_providers.ts | 2 +- .../upgrade/src/static/downgrade_module.ts | 6 +- .../integration/downgrade_module_spec.ts | 16 ++--- tools/public_api_guard/core/core.d.ts | 12 ++-- .../platform-browser-dynamic.d.ts | 2 +- .../platform-browser-dynamic/testing.d.ts | 2 +- .../platform-browser/platform-browser.d.ts | 2 +- .../platform-browser/testing.d.ts | 2 +- .../platform-server/platform-server.d.ts | 8 +-- .../platform-server/testing.d.ts | 2 +- .../platform-webworker-dynamic.d.ts | 2 +- .../platform-webworker.d.ts | 8 +-- tools/public_api_guard/upgrade/static.d.ts | 2 +- 94 files changed, 380 insertions(+), 279 deletions(-) diff --git a/modules/e2e_util/perf_util.ts b/modules/e2e_util/perf_util.ts index f49dd92475..d5673ff587 100644 --- a/modules/e2e_util/perf_util.ts +++ b/modules/e2e_util/perf_util.ts @@ -11,7 +11,7 @@ const yargs = require('yargs'); const nodeUuid = require('node-uuid'); import * as fs from 'fs-extra'; -import {SeleniumWebDriverAdapter, Options, JsonFileReporter, Validator, RegressionSlopeValidator, ConsoleReporter, SizeValidator, MultiReporter, MultiMetric, Runner, Provider} from '@angular/benchpress'; +import {SeleniumWebDriverAdapter, Options, JsonFileReporter, Validator, RegressionSlopeValidator, ConsoleReporter, SizeValidator, MultiReporter, MultiMetric, Runner, StaticProvider} from '@angular/benchpress'; import {readCommandLine as readE2eCommandLine, openBrowser} from './e2e_util'; let cmdArgs: {'sample-size': number, 'force-gc': boolean, 'dryrun': boolean, 'bundles': boolean}; @@ -59,7 +59,7 @@ function createBenchpressRunner(): Runner { } const resultsFolder = './dist/benchmark_results'; fs.ensureDirSync(resultsFolder); - const providers: Provider[] = [ + const providers: StaticProvider[] = [ SeleniumWebDriverAdapter.PROTRACTOR_PROVIDERS, {provide: Options.FORCE_GC, useValue: cmdArgs['force-gc']}, {provide: Options.DEFAULT_DESCRIPTION, useValue: {'runId': runId}}, JsonFileReporter.PROVIDERS, diff --git a/modules/playground/README.md b/modules/playground/README.md index 0f8e32d516..213a5faafb 100644 --- a/modules/playground/README.md +++ b/modules/playground/README.md @@ -1,6 +1,8 @@ # How to run the examples locally +``` $ cp -r ./modules/playground ./dist/all/ $ ./node_modules/.bin/tsc -p modules --emitDecoratorMetadata -w $ gulp serve $ open http://localhost:8000/all/playground/src/hello_world/index.html?bundles=false +``` \ No newline at end of file diff --git a/packages/benchpress/index.ts b/packages/benchpress/index.ts index f91106e540..1b11272642 100644 --- a/packages/benchpress/index.ts +++ b/packages/benchpress/index.ts @@ -9,7 +9,7 @@ // Must be imported first, because Angular decorators throw on load. import 'reflect-metadata'; -export {InjectionToken, Injector, Provider, ReflectiveInjector} from '@angular/core'; +export {InjectionToken, Injector, Provider, ReflectiveInjector, StaticProvider} from '@angular/core'; export {Options} from './src/common_options'; export {MeasureValues} from './src/measure_values'; export {Metric} from './src/metric'; diff --git a/packages/benchpress/src/metric/perflog_metric.ts b/packages/benchpress/src/metric/perflog_metric.ts index 3ef69f9061..f31fc6186d 100644 --- a/packages/benchpress/src/metric/perflog_metric.ts +++ b/packages/benchpress/src/metric/perflog_metric.ts @@ -20,7 +20,14 @@ import {PerfLogEvent, PerfLogFeatures, WebDriverExtension} from '../web_driver_e export class PerflogMetric extends Metric { static SET_TIMEOUT = new InjectionToken('PerflogMetric.setTimeout'); static PROVIDERS = [ - PerflogMetric, { + { + provide: PerflogMetric, + deps: [ + WebDriverExtension, PerflogMetric.SET_TIMEOUT, Options.MICRO_METRICS, Options.FORCE_GC, + Options.CAPTURE_FRAMES, Options.RECEIVED_DATA, Options.REQUEST_COUNT + ] + }, + { provide: PerflogMetric.SET_TIMEOUT, useValue: (fn: Function, millis: number) => setTimeout(fn, millis) } diff --git a/packages/benchpress/src/metric/user_metric.ts b/packages/benchpress/src/metric/user_metric.ts index 19b8d57dfe..fe253d913d 100644 --- a/packages/benchpress/src/metric/user_metric.ts +++ b/packages/benchpress/src/metric/user_metric.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Inject, Injectable} from '@angular/core'; +import {Inject, Injectable, StaticProvider} from '@angular/core'; import {Options} from '../common_options'; import {Metric} from '../metric'; @@ -14,7 +14,8 @@ import {WebDriverAdapter} from '../web_driver_adapter'; @Injectable() export class UserMetric extends Metric { - static PROVIDERS = [UserMetric]; + static PROVIDERS = + [{provide: UserMetric, deps: [Options.USER_METRICS, WebDriverAdapter]}]; constructor( @Inject(Options.USER_METRICS) private _userMetrics: {[key: string]: string}, diff --git a/packages/benchpress/src/reporter/console_reporter.ts b/packages/benchpress/src/reporter/console_reporter.ts index 72fd545175..1659640010 100644 --- a/packages/benchpress/src/reporter/console_reporter.ts +++ b/packages/benchpress/src/reporter/console_reporter.ts @@ -22,7 +22,11 @@ export class ConsoleReporter extends Reporter { static PRINT = new InjectionToken('ConsoleReporter.print'); static COLUMN_WIDTH = new InjectionToken('ConsoleReporter.columnWidth'); static PROVIDERS = [ - ConsoleReporter, {provide: ConsoleReporter.COLUMN_WIDTH, useValue: 18}, { + { + provide: ConsoleReporter, + deps: [ConsoleReporter.COLUMN_WIDTH, SampleDescription, ConsoleReporter.PRINT] + }, + {provide: ConsoleReporter.COLUMN_WIDTH, useValue: 18}, { provide: ConsoleReporter.PRINT, useValue: function(v: any) { // tslint:disable-next-line:no-console diff --git a/packages/benchpress/src/reporter/json_file_reporter.ts b/packages/benchpress/src/reporter/json_file_reporter.ts index 2a8d0fb629..aaca71e916 100644 --- a/packages/benchpress/src/reporter/json_file_reporter.ts +++ b/packages/benchpress/src/reporter/json_file_reporter.ts @@ -22,7 +22,13 @@ import {formatStats, sortedProps} from './util'; @Injectable() export class JsonFileReporter extends Reporter { static PATH = new InjectionToken('JsonFileReporter.path'); - static PROVIDERS = [JsonFileReporter, {provide: JsonFileReporter.PATH, useValue: '.'}]; + static PROVIDERS = [ + { + provide: JsonFileReporter, + deps: [SampleDescription, JsonFileReporter.PATH, Options.WRITE_FILE, Options.NOW] + }, + {provide: JsonFileReporter.PATH, useValue: '.'} + ]; constructor( private _description: SampleDescription, @Inject(JsonFileReporter.PATH) private _path: string, diff --git a/packages/benchpress/src/runner.ts b/packages/benchpress/src/runner.ts index 97a188f4d5..0d9a201f8d 100644 --- a/packages/benchpress/src/runner.ts +++ b/packages/benchpress/src/runner.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Provider, ReflectiveInjector} from '@angular/core'; +import {Injector, StaticProvider} from '@angular/core'; import {Options} from './common_options'; import {Metric} from './metric'; @@ -34,17 +34,17 @@ import {IOsDriverExtension} from './webdriver/ios_driver_extension'; * It provides defaults, creates the injector and calls the sampler. */ export class Runner { - constructor(private _defaultProviders: Provider[] = []) {} + constructor(private _defaultProviders: StaticProvider[] = []) {} sample({id, execute, prepare, microMetrics, providers, userMetrics}: { id: string, execute?: Function, prepare?: Function, microMetrics?: {[key: string]: string}, - providers?: Provider[], + providers?: StaticProvider[], userMetrics?: {[key: string]: string} }): Promise { - const sampleProviders: Provider[] = [ + const sampleProviders: StaticProvider[] = [ _DEFAULT_PROVIDERS, this._defaultProviders, {provide: Options.SAMPLE_ID, useValue: id}, {provide: Options.EXECUTE, useValue: execute} ]; @@ -61,7 +61,7 @@ export class Runner { sampleProviders.push(providers); } - const inj = ReflectiveInjector.resolveAndCreate(sampleProviders); + const inj = Injector.create(sampleProviders); const adapter: WebDriverAdapter = inj.get(WebDriverAdapter); return Promise @@ -75,7 +75,7 @@ export class Runner { // Only WebDriverAdapter is reused. // TODO vsavkin consider changing it when toAsyncFactory is added back or when child // injectors are handled better. - const injector = ReflectiveInjector.resolveAndCreate([ + const injector = Injector.create([ sampleProviders, {provide: Options.CAPABILITIES, useValue: capabilities}, {provide: Options.USER_AGENT, useValue: userAgent}, {provide: WebDriverAdapter, useValue: adapter} diff --git a/packages/benchpress/src/sampler.ts b/packages/benchpress/src/sampler.ts index beb190852c..bd9d0fc868 100644 --- a/packages/benchpress/src/sampler.ts +++ b/packages/benchpress/src/sampler.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Inject, Injectable} from '@angular/core'; +import {Inject, Injectable, StaticProvider} from '@angular/core'; import {Options} from './common_options'; import {MeasureValues} from './measure_values'; @@ -26,8 +26,12 @@ import {WebDriverAdapter} from './web_driver_adapter'; */ @Injectable() export class Sampler { - static PROVIDERS = [Sampler]; - + static PROVIDERS = [{ + provide: Sampler, + deps: [ + WebDriverAdapter, Metric, Reporter, Validator, Options.PREPARE, Options.EXECUTE, Options.NOW + ] + }]; constructor( private _driver: WebDriverAdapter, private _metric: Metric, private _reporter: Reporter, private _validator: Validator, @Inject(Options.PREPARE) private _prepare: Function, diff --git a/packages/benchpress/src/validator/regression_slope_validator.ts b/packages/benchpress/src/validator/regression_slope_validator.ts index f0e2fa0980..8f590e2b24 100644 --- a/packages/benchpress/src/validator/regression_slope_validator.ts +++ b/packages/benchpress/src/validator/regression_slope_validator.ts @@ -21,7 +21,11 @@ export class RegressionSlopeValidator extends Validator { static SAMPLE_SIZE = new InjectionToken('RegressionSlopeValidator.sampleSize'); static METRIC = new InjectionToken('RegressionSlopeValidator.metric'); static PROVIDERS = [ - RegressionSlopeValidator, {provide: RegressionSlopeValidator.SAMPLE_SIZE, useValue: 10}, + { + provide: RegressionSlopeValidator, + deps: [RegressionSlopeValidator.SAMPLE_SIZE, RegressionSlopeValidator.METRIC] + }, + {provide: RegressionSlopeValidator.SAMPLE_SIZE, useValue: 10}, {provide: RegressionSlopeValidator.METRIC, useValue: 'scriptTime'} ]; diff --git a/packages/benchpress/src/validator/size_validator.ts b/packages/benchpress/src/validator/size_validator.ts index 711eb9edbb..7d546c186a 100644 --- a/packages/benchpress/src/validator/size_validator.ts +++ b/packages/benchpress/src/validator/size_validator.ts @@ -17,7 +17,10 @@ import {Validator} from '../validator'; @Injectable() export class SizeValidator extends Validator { static SAMPLE_SIZE = new InjectionToken('SizeValidator.sampleSize'); - static PROVIDERS = [SizeValidator, {provide: SizeValidator.SAMPLE_SIZE, useValue: 10}]; + static PROVIDERS = [ + {provide: SizeValidator, deps: [SizeValidator.SAMPLE_SIZE]}, + {provide: SizeValidator.SAMPLE_SIZE, useValue: 10} + ]; constructor(@Inject(SizeValidator.SAMPLE_SIZE) private _sampleSize: number) { super(); } diff --git a/packages/benchpress/src/webdriver/chrome_driver_extension.ts b/packages/benchpress/src/webdriver/chrome_driver_extension.ts index 0cf41cb38d..d1ceba67b1 100644 --- a/packages/benchpress/src/webdriver/chrome_driver_extension.ts +++ b/packages/benchpress/src/webdriver/chrome_driver_extension.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Inject, Injectable} from '@angular/core'; +import {Inject, Injectable, StaticProvider} from '@angular/core'; import {Options} from '../common_options'; import {WebDriverAdapter} from '../web_driver_adapter'; @@ -21,7 +21,10 @@ import {PerfLogEvent, PerfLogFeatures, WebDriverExtension} from '../web_driver_e */ @Injectable() export class ChromeDriverExtension extends WebDriverExtension { - static PROVIDERS = [ChromeDriverExtension]; + static PROVIDERS = [{ + provide: ChromeDriverExtension, + deps: [WebDriverAdapter, Options.USER_AGENT] + }]; private _majorChromeVersion: number; private _firstRun = true; diff --git a/packages/benchpress/src/webdriver/firefox_driver_extension.ts b/packages/benchpress/src/webdriver/firefox_driver_extension.ts index 9c895259cb..2d34742505 100644 --- a/packages/benchpress/src/webdriver/firefox_driver_extension.ts +++ b/packages/benchpress/src/webdriver/firefox_driver_extension.ts @@ -13,7 +13,7 @@ import {PerfLogEvent, PerfLogFeatures, WebDriverExtension} from '../web_driver_e @Injectable() export class FirefoxDriverExtension extends WebDriverExtension { - static PROVIDERS = [FirefoxDriverExtension]; + static PROVIDERS = [{provide: FirefoxDriverExtension, deps: [WebDriverAdapter]}]; private _profilerStarted: boolean; diff --git a/packages/benchpress/src/webdriver/ios_driver_extension.ts b/packages/benchpress/src/webdriver/ios_driver_extension.ts index 8ceb3e2eeb..fefef6314c 100644 --- a/packages/benchpress/src/webdriver/ios_driver_extension.ts +++ b/packages/benchpress/src/webdriver/ios_driver_extension.ts @@ -13,7 +13,7 @@ import {PerfLogEvent, PerfLogFeatures, WebDriverExtension} from '../web_driver_e @Injectable() export class IOsDriverExtension extends WebDriverExtension { - static PROVIDERS = [IOsDriverExtension]; + static PROVIDERS = [{provide: IOsDriverExtension, deps: [WebDriverAdapter]}]; constructor(private _driver: WebDriverAdapter) { super(); } diff --git a/packages/benchpress/src/webdriver/selenium_webdriver_adapter.ts b/packages/benchpress/src/webdriver/selenium_webdriver_adapter.ts index efb1d91f4b..4aa0ad27e0 100644 --- a/packages/benchpress/src/webdriver/selenium_webdriver_adapter.ts +++ b/packages/benchpress/src/webdriver/selenium_webdriver_adapter.ts @@ -6,15 +6,19 @@ * found in the LICENSE file at https://angular.io/license */ +import {StaticProvider} from '@angular/core'; + import {WebDriverAdapter} from '../web_driver_adapter'; + /** * Adapter for the selenium-webdriver. */ export class SeleniumWebDriverAdapter extends WebDriverAdapter { - static PROTRACTOR_PROVIDERS = [{ + static PROTRACTOR_PROVIDERS = [{ provide: WebDriverAdapter, - useFactory: () => new SeleniumWebDriverAdapter((global).browser) + useFactory: () => new SeleniumWebDriverAdapter((global).browser), + deps: [] }]; constructor(private _driver: any) { super(); } diff --git a/packages/benchpress/test/metric/multi_metric_spec.ts b/packages/benchpress/test/metric/multi_metric_spec.ts index 53f2892bbd..3d8ff95467 100644 --- a/packages/benchpress/test/metric/multi_metric_spec.ts +++ b/packages/benchpress/test/metric/multi_metric_spec.ts @@ -7,12 +7,13 @@ */ import {AsyncTestCompleter, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal'; -import {Metric, MultiMetric, ReflectiveInjector} from '../../index'; + +import {Injector, Metric, MultiMetric} from '../../index'; export function main() { function createMetric(ids: any[]) { - const m = ReflectiveInjector - .resolveAndCreate([ + const m = Injector + .create([ ids.map(id => ({provide: id, useValue: new MockMetric(id)})), MultiMetric.provideWith(ids) ]) diff --git a/packages/benchpress/test/metric/perflog_metric_spec.ts b/packages/benchpress/test/metric/perflog_metric_spec.ts index 66b81cc160..68822092f9 100644 --- a/packages/benchpress/test/metric/perflog_metric_spec.ts +++ b/packages/benchpress/test/metric/perflog_metric_spec.ts @@ -6,10 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ -import {Provider} from '@angular/core'; +import {StaticProvider} from '@angular/core'; import {AsyncTestCompleter, beforeEach, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal'; -import {Metric, Options, PerfLogEvent, PerfLogFeatures, PerflogMetric, ReflectiveInjector, WebDriverExtension} from '../../index'; +import {Injector, Metric, Options, PerfLogEvent, PerfLogFeatures, PerflogMetric, WebDriverExtension} from '../../index'; import {TraceEventFactory} from '../trace_event_factory'; export function main() { @@ -33,7 +33,7 @@ export function main() { if (!microMetrics) { microMetrics = {}; } - const providers: Provider[] = [ + const providers: StaticProvider[] = [ Options.DEFAULT_PROVIDERS, PerflogMetric.PROVIDERS, {provide: Options.MICRO_METRICS, useValue: microMetrics}, { provide: PerflogMetric.SET_TIMEOUT, @@ -59,7 +59,7 @@ export function main() { if (requestCount != null) { providers.push({provide: Options.REQUEST_COUNT, useValue: requestCount}); } - return ReflectiveInjector.resolveAndCreate(providers).get(PerflogMetric); + return Injector.create(providers).get(PerflogMetric); } describe('perflog metric', () => { diff --git a/packages/benchpress/test/metric/user_metric_spec.ts b/packages/benchpress/test/metric/user_metric_spec.ts index fe0c382efd..6884620b68 100644 --- a/packages/benchpress/test/metric/user_metric_spec.ts +++ b/packages/benchpress/test/metric/user_metric_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Provider, ReflectiveInjector} from '@angular/core'; +import {Injector, StaticProvider} from '@angular/core'; import {AsyncTestCompleter, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal'; import {Options, PerfLogEvent, PerfLogFeatures, UserMetric, WebDriverAdapter} from '../../index'; @@ -25,12 +25,12 @@ export function main() { userMetrics = {}; } wdAdapter = new MockDriverAdapter(); - const providers: Provider[] = [ + const providers: StaticProvider[] = [ Options.DEFAULT_PROVIDERS, UserMetric.PROVIDERS, {provide: Options.USER_METRICS, useValue: userMetrics}, {provide: WebDriverAdapter, useValue: wdAdapter} ]; - return ReflectiveInjector.resolveAndCreate(providers).get(UserMetric); + return Injector.create(providers).get(UserMetric); } describe('user metric', () => { diff --git a/packages/benchpress/test/reporter/console_reporter_spec.ts b/packages/benchpress/test/reporter/console_reporter_spec.ts index bfe30e7547..7e3c15b6cb 100644 --- a/packages/benchpress/test/reporter/console_reporter_spec.ts +++ b/packages/benchpress/test/reporter/console_reporter_spec.ts @@ -6,10 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ -import {Provider} from '@angular/core'; +import {StaticProvider} from '@angular/core'; import {describe, expect, it} from '@angular/core/testing/src/testing_internal'; -import {ConsoleReporter, MeasureValues, ReflectiveInjector, SampleDescription} from '../../index'; +import {ConsoleReporter, Injector, MeasureValues, SampleDescription} from '../../index'; export function main() { describe('console reporter', () => { @@ -30,7 +30,7 @@ export function main() { if (sampleId == null) { sampleId = 'null'; } - const providers: Provider[] = [ + const providers: StaticProvider[] = [ ConsoleReporter.PROVIDERS, { provide: SampleDescription, useValue: new SampleDescription(sampleId, descriptions, metrics !) @@ -40,7 +40,7 @@ export function main() { if (columnWidth != null) { providers.push({provide: ConsoleReporter.COLUMN_WIDTH, useValue: columnWidth}); } - reporter = ReflectiveInjector.resolveAndCreate(providers).get(ConsoleReporter); + reporter = Injector.create(providers).get(ConsoleReporter); } it('should print the sample id, description and table header', () => { diff --git a/packages/benchpress/test/reporter/json_file_reporter_spec.ts b/packages/benchpress/test/reporter/json_file_reporter_spec.ts index 27c4b25584..cbdbf5d9d4 100644 --- a/packages/benchpress/test/reporter/json_file_reporter_spec.ts +++ b/packages/benchpress/test/reporter/json_file_reporter_spec.ts @@ -8,7 +8,7 @@ import {AsyncTestCompleter, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal'; -import {JsonFileReporter, MeasureValues, Options, ReflectiveInjector, SampleDescription} from '../../index'; +import {Injector, JsonFileReporter, MeasureValues, Options, SampleDescription} from '../../index'; export function main() { describe('file reporter', () => { @@ -34,7 +34,7 @@ export function main() { } } ]; - return ReflectiveInjector.resolveAndCreate(providers).get(JsonFileReporter); + return Injector.create(providers).get(JsonFileReporter); } it('should write all data into a file', diff --git a/packages/benchpress/test/reporter/multi_reporter_spec.ts b/packages/benchpress/test/reporter/multi_reporter_spec.ts index 1ee54f2cde..aa1502e36b 100644 --- a/packages/benchpress/test/reporter/multi_reporter_spec.ts +++ b/packages/benchpress/test/reporter/multi_reporter_spec.ts @@ -8,12 +8,12 @@ import {AsyncTestCompleter, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal'; -import {MeasureValues, MultiReporter, ReflectiveInjector, Reporter} from '../../index'; +import {Injector, MeasureValues, MultiReporter, Reporter} from '../../index'; export function main() { function createReporters(ids: any[]) { - const r = ReflectiveInjector - .resolveAndCreate([ + const r = Injector + .create([ ids.map(id => ({provide: id, useValue: new MockReporter(id)})), MultiReporter.provideWith(ids) ]) diff --git a/packages/benchpress/test/runner_spec.ts b/packages/benchpress/test/runner_spec.ts index 7c4ee88847..27683730c5 100644 --- a/packages/benchpress/test/runner_spec.ts +++ b/packages/benchpress/test/runner_spec.ts @@ -8,11 +8,11 @@ import {AsyncTestCompleter, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal'; -import {Injector, Metric, Options, ReflectiveInjector, Runner, SampleDescription, SampleState, Sampler, Validator, WebDriverAdapter} from '../index'; +import {Injector, Metric, Options, Runner, SampleDescription, SampleState, Sampler, Validator, WebDriverAdapter} from '../index'; export function main() { describe('runner', () => { - let injector: ReflectiveInjector; + let injector: Injector; let runner: Runner; function createRunner(defaultProviders?: any[]): Runner { @@ -22,7 +22,7 @@ export function main() { runner = new Runner([ defaultProviders, { provide: Sampler, - useFactory: (_injector: ReflectiveInjector) => { + useFactory: (_injector: Injector) => { injector = _injector; return new MockSampler(); }, diff --git a/packages/benchpress/test/sampler_spec.ts b/packages/benchpress/test/sampler_spec.ts index e7e8339ee7..82ca5d6d64 100644 --- a/packages/benchpress/test/sampler_spec.ts +++ b/packages/benchpress/test/sampler_spec.ts @@ -8,7 +8,7 @@ import {AsyncTestCompleter, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal'; -import {MeasureValues, Metric, Options, ReflectiveInjector, Reporter, Sampler, Validator, WebDriverAdapter} from '../index'; +import {Injector, MeasureValues, Metric, Options, Reporter, Sampler, Validator, WebDriverAdapter} from '../index'; export function main() { const EMPTY_EXECUTE = () => {}; @@ -44,7 +44,7 @@ export function main() { providers.push({provide: Options.PREPARE, useValue: prepare}); } - sampler = ReflectiveInjector.resolveAndCreate(providers).get(Sampler); + sampler = Injector.create(providers).get(Sampler); } it('should call the prepare and execute callbacks using WebDriverAdapter.waitFor', diff --git a/packages/benchpress/test/validator/regression_slope_validator_spec.ts b/packages/benchpress/test/validator/regression_slope_validator_spec.ts index 75be174bef..3b8c3e02ce 100644 --- a/packages/benchpress/test/validator/regression_slope_validator_spec.ts +++ b/packages/benchpress/test/validator/regression_slope_validator_spec.ts @@ -8,15 +8,15 @@ import {describe, expect, it} from '@angular/core/testing/src/testing_internal'; -import {MeasureValues, ReflectiveInjector, RegressionSlopeValidator} from '../../index'; +import {Injector, MeasureValues, RegressionSlopeValidator} from '../../index'; export function main() { describe('regression slope validator', () => { let validator: RegressionSlopeValidator; function createValidator({size, metric}: {size: number, metric: string}) { - validator = ReflectiveInjector - .resolveAndCreate([ + validator = Injector + .create([ RegressionSlopeValidator.PROVIDERS, {provide: RegressionSlopeValidator.METRIC, useValue: metric}, {provide: RegressionSlopeValidator.SAMPLE_SIZE, useValue: size} diff --git a/packages/benchpress/test/validator/size_validator_spec.ts b/packages/benchpress/test/validator/size_validator_spec.ts index 99bc4b9951..da5a14ad57 100644 --- a/packages/benchpress/test/validator/size_validator_spec.ts +++ b/packages/benchpress/test/validator/size_validator_spec.ts @@ -8,7 +8,7 @@ import {describe, expect, it} from '@angular/core/testing/src/testing_internal'; -import {MeasureValues, ReflectiveInjector, SizeValidator} from '../../index'; +import {Injector, MeasureValues, SizeValidator} from '../../index'; export function main() { describe('size validator', () => { @@ -16,8 +16,8 @@ export function main() { function createValidator(size: number) { validator = - ReflectiveInjector - .resolveAndCreate( + Injector + .create( [SizeValidator.PROVIDERS, {provide: SizeValidator.SAMPLE_SIZE, useValue: size}]) .get(SizeValidator); } diff --git a/packages/benchpress/test/web_driver_extension_spec.ts b/packages/benchpress/test/web_driver_extension_spec.ts index 37fdab29ab..178f851262 100644 --- a/packages/benchpress/test/web_driver_extension_spec.ts +++ b/packages/benchpress/test/web_driver_extension_spec.ts @@ -8,14 +8,14 @@ import {AsyncTestCompleter, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal'; -import {Options, ReflectiveInjector, WebDriverExtension} from '../index'; +import {Injector, Options, WebDriverExtension} from '../index'; export function main() { function createExtension(ids: any[], caps: any) { return new Promise((res, rej) => { try { - res(ReflectiveInjector - .resolveAndCreate([ + res(Injector + .create([ ids.map((id) => ({provide: id, useValue: new MockExtension(id)})), {provide: Options.CAPABILITIES, useValue: caps}, WebDriverExtension.provideFirstSupported(ids) diff --git a/packages/benchpress/test/webdriver/chrome_driver_extension_spec.ts b/packages/benchpress/test/webdriver/chrome_driver_extension_spec.ts index f12d8a8bd6..ebb17e3d9b 100644 --- a/packages/benchpress/test/webdriver/chrome_driver_extension_spec.ts +++ b/packages/benchpress/test/webdriver/chrome_driver_extension_spec.ts @@ -8,7 +8,7 @@ import {AsyncTestCompleter, describe, expect, iit, inject, it} from '@angular/core/testing/src/testing_internal'; -import {ChromeDriverExtension, Options, ReflectiveInjector, WebDriverAdapter, WebDriverExtension} from '../../index'; +import {ChromeDriverExtension, Injector, Options, WebDriverAdapter, WebDriverExtension} from '../../index'; import {TraceEventFactory} from '../trace_event_factory'; export function main() { @@ -41,8 +41,8 @@ export function main() { userAgent = CHROME45_USER_AGENT; } log = []; - extension = ReflectiveInjector - .resolveAndCreate([ + extension = Injector + .create([ ChromeDriverExtension.PROVIDERS, { provide: WebDriverAdapter, useValue: new MockDriverAdapter(log, perfRecords, messageMethod) diff --git a/packages/benchpress/test/webdriver/ios_driver_extension_spec.ts b/packages/benchpress/test/webdriver/ios_driver_extension_spec.ts index a91fc2982d..7ff0cd6b13 100644 --- a/packages/benchpress/test/webdriver/ios_driver_extension_spec.ts +++ b/packages/benchpress/test/webdriver/ios_driver_extension_spec.ts @@ -8,7 +8,7 @@ import {AsyncTestCompleter, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal'; -import {IOsDriverExtension, ReflectiveInjector, WebDriverAdapter, WebDriverExtension} from '../../index'; +import {IOsDriverExtension, Injector, WebDriverAdapter, WebDriverExtension} from '../../index'; import {TraceEventFactory} from '../trace_event_factory'; export function main() { @@ -24,8 +24,8 @@ export function main() { } log = []; extension = - ReflectiveInjector - .resolveAndCreate([ + Injector + .create([ IOsDriverExtension.PROVIDERS, {provide: WebDriverAdapter, useValue: new MockDriverAdapter(log, perfRecords)} ]) diff --git a/packages/common/src/directives/ng_component_outlet.ts b/packages/common/src/directives/ng_component_outlet.ts index 34e32c8e71..3c018a7803 100644 --- a/packages/common/src/directives/ng_component_outlet.ts +++ b/packages/common/src/directives/ng_component_outlet.ts @@ -6,7 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ -import {ComponentFactoryResolver, ComponentRef, Directive, Injector, Input, NgModuleFactory, NgModuleRef, OnChanges, OnDestroy, Provider, SimpleChanges, Type, ViewContainerRef} from '@angular/core'; +import {ComponentFactoryResolver, ComponentRef, Directive, Injector, Input, NgModuleFactory, NgModuleRef, OnChanges, OnDestroy, SimpleChanges, StaticProvider, Type, ViewContainerRef} from '@angular/core'; + /** * Instantiates a single {@link Component} type and inserts its Host View into current View. diff --git a/packages/common/test/directives/ng_component_outlet_spec.ts b/packages/common/test/directives/ng_component_outlet_spec.ts index 0d897a97c1..45f2c5e8b3 100644 --- a/packages/common/test/directives/ng_component_outlet_spec.ts +++ b/packages/common/test/directives/ng_component_outlet_spec.ts @@ -8,7 +8,7 @@ import {CommonModule} from '@angular/common'; import {NgComponentOutlet} from '@angular/common/src/directives/ng_component_outlet'; -import {Compiler, Component, ComponentRef, Inject, InjectionToken, Injector, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory, Optional, Provider, QueryList, ReflectiveInjector, TemplateRef, Type, ViewChild, ViewChildren, ViewContainerRef} from '@angular/core'; +import {Compiler, Component, ComponentRef, Inject, InjectionToken, Injector, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory, Optional, QueryList, StaticProvider, TemplateRef, Type, ViewChild, ViewChildren, ViewContainerRef} from '@angular/core'; import {TestBed, async, fakeAsync} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/src/matchers'; @@ -96,7 +96,7 @@ export function main() { const uniqueValue = {}; fixture.componentInstance.currentComponent = InjectedComponent; - fixture.componentInstance.injector = ReflectiveInjector.resolveAndCreate( + fixture.componentInstance.injector = Injector.create( [{provide: TEST_TOKEN, useValue: uniqueValue}], fixture.componentRef.injector); fixture.detectChanges(); diff --git a/packages/compiler/src/aot/summary_serializer.ts b/packages/compiler/src/aot/summary_serializer.ts index f5d9432374..11e420a2d1 100644 --- a/packages/compiler/src/aot/summary_serializer.ts +++ b/packages/compiler/src/aot/summary_serializer.ts @@ -345,4 +345,4 @@ class FromJsonDeserializer extends ValueTransformer { return super.visitStringMap(map, context); } } -} \ No newline at end of file +} diff --git a/packages/compiler/src/jit/compiler_factory.ts b/packages/compiler/src/jit/compiler_factory.ts index fc2458ea0d..1e51157f0d 100644 --- a/packages/compiler/src/jit/compiler_factory.ts +++ b/packages/compiler/src/jit/compiler_factory.ts @@ -6,8 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -import {COMPILER_OPTIONS, Compiler, CompilerFactory, CompilerOptions, Inject, InjectionToken, MissingTranslationStrategy, Optional, PlatformRef, Provider, ReflectiveInjector, TRANSLATIONS, TRANSLATIONS_FORMAT, Type, ViewEncapsulation, createPlatformFactory, isDevMode, platformCore, ɵConsole as Console} from '@angular/core'; +import {COMPILER_OPTIONS, Compiler, CompilerFactory, CompilerOptions, Inject, InjectionToken, Injector, MissingTranslationStrategy, Optional, PACKAGE_ROOT_URL, PlatformRef, StaticProvider, TRANSLATIONS, TRANSLATIONS_FORMAT, Type, ViewEncapsulation, createPlatformFactory, isDevMode, platformCore, ɵConsole as Console} from '@angular/core'; +import {StaticSymbolCache} from '../aot/static_symbol'; import {CompileReflector} from '../compile_reflector'; import {CompilerConfig} from '../config'; import {DirectiveNormalizer} from '../directive_normalizer'; @@ -16,7 +17,7 @@ import {Lexer} from '../expression_parser/lexer'; import {Parser} from '../expression_parser/parser'; import * as i18n from '../i18n/index'; import {CompilerInjectable} from '../injectable'; -import {CompileMetadataResolver} from '../metadata_resolver'; +import {CompileMetadataResolver, ERROR_COLLECTOR_TOKEN} from '../metadata_resolver'; import {HtmlParser} from '../ml_parser/html_parser'; import {NgModuleCompiler} from '../ng_module_compiler'; import {NgModuleResolver} from '../ng_module_resolver'; @@ -26,7 +27,7 @@ import {DomElementSchemaRegistry} from '../schema/dom_element_schema_registry'; import {ElementSchemaRegistry} from '../schema/element_schema_registry'; import {StyleCompiler} from '../style_compiler'; import {JitSummaryResolver, SummaryResolver} from '../summary_resolver'; -import {TemplateParser} from '../template_parser/template_parser'; +import {TEMPLATE_TRANSFORMS, TemplateParser} from '../template_parser/template_parser'; import {DEFAULT_PACKAGE_URL_PROVIDER, UrlResolver} from '../url_resolver'; import {ViewCompiler} from '../view_compiler/view_compiler'; @@ -45,17 +46,18 @@ const baseHtmlParser = new InjectionToken('HtmlParser'); * A set of providers that provide `JitCompiler` and its dependencies to use for * template compilation. */ -export const COMPILER_PROVIDERS: Array|{[k: string]: any}|any[]> = [ +export const COMPILER_PROVIDERS = [ {provide: CompileReflector, useValue: new JitReflector()}, {provide: ResourceLoader, useValue: _NO_RESOURCE_LOADER}, - JitSummaryResolver, + {provide: JitSummaryResolver, deps: []}, {provide: SummaryResolver, useExisting: JitSummaryResolver}, - Console, - Lexer, - Parser, + {provide: Console, deps: []}, + {provide: Lexer, deps: []}, + {provide: Parser, deps: [Lexer]}, { provide: baseHtmlParser, useClass: HtmlParser, + deps: [], }, { provide: i18n.I18NHtmlParser, @@ -78,22 +80,37 @@ export const COMPILER_PROVIDERS: Array|{[k: string]: any}|any[]> = provide: HtmlParser, useExisting: i18n.I18NHtmlParser, }, - TemplateParser, - DirectiveNormalizer, - CompileMetadataResolver, + { + provide: TemplateParser, deps: [CompilerConfig, CompileReflector, + Parser, ElementSchemaRegistry, + i18n.I18NHtmlParser, Console, [Optional, TEMPLATE_TRANSFORMS]] + }, + { provide: DirectiveNormalizer, deps: [ResourceLoader, UrlResolver, HtmlParser, CompilerConfig]}, + { provide: CompileMetadataResolver, deps: [CompilerConfig, NgModuleResolver, + DirectiveResolver, PipeResolver, + SummaryResolver, + ElementSchemaRegistry, + DirectiveNormalizer, Console, + [Optional, StaticSymbolCache], + CompileReflector, + [Optional, ERROR_COLLECTOR_TOKEN]]}, DEFAULT_PACKAGE_URL_PROVIDER, - StyleCompiler, - ViewCompiler, - NgModuleCompiler, - {provide: CompilerConfig, useValue: new CompilerConfig()}, - JitCompiler, - {provide: Compiler, useExisting: JitCompiler}, - DomElementSchemaRegistry, - {provide: ElementSchemaRegistry, useExisting: DomElementSchemaRegistry}, - UrlResolver, - DirectiveResolver, - PipeResolver, - NgModuleResolver, + { provide: StyleCompiler, deps: [UrlResolver]}, + { provide: ViewCompiler, deps: [CompilerConfig, CompileReflector, ElementSchemaRegistry]}, + { provide: NgModuleCompiler, deps: [CompileReflector] }, + { provide: CompilerConfig, useValue: new CompilerConfig()}, + { provide: JitCompiler, deps: [Injector, CompileMetadataResolver, + TemplateParser, StyleCompiler, + ViewCompiler, NgModuleCompiler, + SummaryResolver, CompilerConfig, + Console]}, + { provide: Compiler, useExisting: JitCompiler}, + { provide: DomElementSchemaRegistry, deps: []}, + { provide: ElementSchemaRegistry, useExisting: DomElementSchemaRegistry}, + { provide: UrlResolver, deps: [PACKAGE_ROOT_URL]}, + { provide: DirectiveResolver, deps: [CompileReflector]}, + { provide: PipeResolver, deps: [CompileReflector]}, + { provide: NgModuleResolver, deps: [CompileReflector]}, ]; @CompilerInjectable() @@ -112,7 +129,7 @@ export class JitCompilerFactory implements CompilerFactory { } createCompiler(options: CompilerOptions[] = []): Compiler { const opts = _mergeOptions(this._defaultOptions.concat(options)); - const injector = ReflectiveInjector.resolveAndCreate([ + const injector = Injector.create([ COMPILER_PROVIDERS, { provide: CompilerConfig, useFactory: () => { @@ -142,7 +159,7 @@ export class JitCompilerFactory implements CompilerFactory { */ export const platformCoreDynamic = createPlatformFactory(platformCore, 'coreDynamic', [ {provide: COMPILER_OPTIONS, useValue: {}, multi: true}, - {provide: CompilerFactory, useClass: JitCompilerFactory}, + {provide: CompilerFactory, useClass: JitCompilerFactory, deps: [COMPILER_OPTIONS]}, ]); function _mergeOptions(optionsArr: CompilerOptions[]): CompilerOptions { diff --git a/packages/compiler/src/view_compiler/view_compiler.ts b/packages/compiler/src/view_compiler/view_compiler.ts index 6398c06199..f0dca508b5 100644 --- a/packages/compiler/src/view_compiler/view_compiler.ts +++ b/packages/compiler/src/view_compiler/view_compiler.ts @@ -1071,4 +1071,4 @@ function calcStaticDynamicQueryFlags( flags |= NodeFlags.DynamicQuery; } return flags; -} \ No newline at end of file +} diff --git a/packages/compiler/test/directive_normalizer_spec.ts b/packages/compiler/test/directive_normalizer_spec.ts index 114f2672a0..bd68115eb1 100644 --- a/packages/compiler/test/directive_normalizer_spec.ts +++ b/packages/compiler/test/directive_normalizer_spec.ts @@ -328,10 +328,7 @@ export function main() { describe('normalizeExternalStylesheets', () => { - beforeEach(() => { - TestBed.configureCompiler( - {providers: [{provide: ResourceLoader, useClass: SpyResourceLoader}]}); - }); + beforeEach(() => { TestBed.configureCompiler({providers: [SpyResourceLoader.PROVIDE]}); }); it('should load an external stylesheet', inject( diff --git a/packages/compiler/test/i18n/integration_common.ts b/packages/compiler/test/i18n/integration_common.ts index b2abdb8d0d..4d7e37d620 100644 --- a/packages/compiler/test/i18n/integration_common.ts +++ b/packages/compiler/test/i18n/integration_common.ts @@ -26,6 +26,7 @@ export class I18nComponent { } export class FrLocalization extends NgLocalization { + public static PROVIDE = {provide: NgLocalization, useClass: FrLocalization, deps: []}; getPluralCategory(value: number): string { switch (value) { case 0: diff --git a/packages/compiler/test/i18n/integration_xliff2_spec.ts b/packages/compiler/test/i18n/integration_xliff2_spec.ts index 3594db225a..add927a8c1 100644 --- a/packages/compiler/test/i18n/integration_xliff2_spec.ts +++ b/packages/compiler/test/i18n/integration_xliff2_spec.ts @@ -26,8 +26,8 @@ export function main() { beforeEach(async(() => { TestBed.configureCompiler({ providers: [ - {provide: ResourceLoader, useClass: SpyResourceLoader}, - {provide: NgLocalization, useClass: FrLocalization}, + SpyResourceLoader.PROVIDE, + FrLocalization.PROVIDE, {provide: TRANSLATIONS, useValue: XLIFF2_TOMERGE}, {provide: TRANSLATIONS_FORMAT, useValue: 'xlf2'}, ] diff --git a/packages/compiler/test/i18n/integration_xliff_spec.ts b/packages/compiler/test/i18n/integration_xliff_spec.ts index 1bcc2f0cc6..7355fff485 100644 --- a/packages/compiler/test/i18n/integration_xliff_spec.ts +++ b/packages/compiler/test/i18n/integration_xliff_spec.ts @@ -26,8 +26,8 @@ export function main() { beforeEach(async(() => { TestBed.configureCompiler({ providers: [ - {provide: ResourceLoader, useClass: SpyResourceLoader}, - {provide: NgLocalization, useClass: FrLocalization}, + SpyResourceLoader.PROVIDE, + FrLocalization.PROVIDE, {provide: TRANSLATIONS, useValue: XLIFF_TOMERGE}, {provide: TRANSLATIONS_FORMAT, useValue: 'xliff'}, ] diff --git a/packages/compiler/test/i18n/integration_xmb_xtb_spec.ts b/packages/compiler/test/i18n/integration_xmb_xtb_spec.ts index ebd7c324f7..88f249a346 100644 --- a/packages/compiler/test/i18n/integration_xmb_xtb_spec.ts +++ b/packages/compiler/test/i18n/integration_xmb_xtb_spec.ts @@ -26,8 +26,8 @@ export function main() { beforeEach(async(() => { TestBed.configureCompiler({ providers: [ - {provide: ResourceLoader, useClass: SpyResourceLoader}, - {provide: NgLocalization, useClass: FrLocalization}, + SpyResourceLoader.PROVIDE, + FrLocalization.PROVIDE, {provide: TRANSLATIONS, useValue: XTB}, {provide: TRANSLATIONS_FORMAT, useValue: 'xtb'}, ] diff --git a/packages/compiler/test/runtime_compiler_spec.ts b/packages/compiler/test/runtime_compiler_spec.ts index 318ca06a1b..199e9e2827 100644 --- a/packages/compiler/test/runtime_compiler_spec.ts +++ b/packages/compiler/test/runtime_compiler_spec.ts @@ -36,7 +36,7 @@ export function main() { beforeEach(() => { TestBed.configureCompiler( - {providers: [{provide: ResourceLoader, useClass: StubResourceLoader}]}); + {providers: [{provide: ResourceLoader, useClass: StubResourceLoader, deps: []}]}); }); it('should throw when using a templateUrl that has not been compiled before', async(() => { @@ -68,7 +68,7 @@ export function main() { beforeEach(() => { TestBed.configureCompiler( - {providers: [{provide: ResourceLoader, useClass: StubResourceLoader}]}); + {providers: [{provide: ResourceLoader, useClass: StubResourceLoader, deps: []}]}); }); it('should allow to use templateUrl components that have been loaded before', async(() => { @@ -88,10 +88,7 @@ export function main() { let dirResolver: MockDirectiveResolver; let injector: Injector; - beforeEach(() => { - TestBed.configureCompiler( - {providers: [{provide: ResourceLoader, useClass: SpyResourceLoader}]}); - }); + beforeEach(() => { TestBed.configureCompiler({providers: [SpyResourceLoader.PROVIDE]}); }); beforeEach(fakeAsync(inject( [Compiler, ResourceLoader, DirectiveResolver, Injector], diff --git a/packages/compiler/test/spies.ts b/packages/compiler/test/spies.ts index b86939489a..54c2263c4a 100644 --- a/packages/compiler/test/spies.ts +++ b/packages/compiler/test/spies.ts @@ -11,5 +11,6 @@ import {ResourceLoader} from '@angular/compiler/src/resource_loader'; import {SpyObject} from '@angular/core/testing/src/testing_internal'; export class SpyResourceLoader extends SpyObject { + public static PROVIDE = {provide: ResourceLoader, useClass: SpyResourceLoader, deps: []}; constructor() { super(ResourceLoader); } } diff --git a/packages/compiler/test/template_parser/template_parser_spec.ts b/packages/compiler/test/template_parser/template_parser_spec.ts index c0a2fe8335..8204b2f67c 100644 --- a/packages/compiler/test/template_parser/template_parser_spec.ts +++ b/packages/compiler/test/template_parser/template_parser_spec.ts @@ -308,7 +308,7 @@ export function main() { TestBed.configureCompiler({ providers: [ TEST_COMPILER_PROVIDERS, - {provide: ElementSchemaRegistry, useClass: DomElementSchemaRegistry} + {provide: ElementSchemaRegistry, useClass: DomElementSchemaRegistry, deps: []} ] }); }); diff --git a/packages/compiler/testing/src/test_bindings.ts b/packages/compiler/testing/src/test_bindings.ts index 8812ac8ecb..4956bf64f4 100644 --- a/packages/compiler/testing/src/test_bindings.ts +++ b/packages/compiler/testing/src/test_bindings.ts @@ -20,6 +20,6 @@ export function createUrlResolverWithoutPackagePrefix(): UrlResolver { // TODO: get rid of it or move to a separate @angular/internal_testing package export const TEST_COMPILER_PROVIDERS: Provider[] = [ {provide: ElementSchemaRegistry, useValue: new MockSchemaRegistry({}, {}, {}, [], [])}, - {provide: ResourceLoader, useClass: MockResourceLoader}, - {provide: UrlResolver, useFactory: createUrlResolverWithoutPackagePrefix} + {provide: ResourceLoader, useClass: MockResourceLoader, deps: []}, + {provide: UrlResolver, useFactory: createUrlResolverWithoutPackagePrefix, deps: []} ]; diff --git a/packages/compiler/testing/src/testing.ts b/packages/compiler/testing/src/testing.ts index c77be42fd8..0d259fa709 100644 --- a/packages/compiler/testing/src/testing.ts +++ b/packages/compiler/testing/src/testing.ts @@ -28,7 +28,7 @@ export * from './pipe_resolver_mock'; import {createPlatformFactory, ModuleWithComponentFactories, Injectable, CompilerOptions, COMPILER_OPTIONS, CompilerFactory, ComponentFactory, NgModuleFactory, Injector, NgModule, Component, Directive, Pipe, Type, PlatformRef, ɵstringify} from '@angular/core'; import {MetadataOverride, ɵTestingCompilerFactory as TestingCompilerFactory, ɵTestingCompiler as TestingCompiler} from '@angular/core/testing'; -import {platformCoreDynamic, JitCompiler, DirectiveResolver, NgModuleResolver, PipeResolver, CompileMetadataResolver} from '@angular/compiler'; +import {platformCoreDynamic, JitCompiler, DirectiveResolver, NgModuleResolver, PipeResolver, CompileMetadataResolver, CompileReflector} from '@angular/compiler'; import {MockDirectiveResolver} from './directive_resolver_mock'; import {MockNgModuleResolver} from './ng_module_resolver_mock'; import {MockPipeResolver} from './pipe_resolver_mock'; @@ -124,15 +124,19 @@ export const platformCoreDynamicTesting: (extraProviders?: any[]) => PlatformRef provide: COMPILER_OPTIONS, useValue: { providers: [ - MockPipeResolver, + {provide: MockPipeResolver, deps: [Injector, CompileReflector]}, {provide: PipeResolver, useExisting: MockPipeResolver}, - MockDirectiveResolver, + {provide: MockDirectiveResolver, deps: [Injector, CompileReflector]}, {provide: DirectiveResolver, useExisting: MockDirectiveResolver}, - MockNgModuleResolver, + {provide: MockNgModuleResolver, deps: [Injector, CompileReflector]}, {provide: NgModuleResolver, useExisting: MockNgModuleResolver}, ] }, multi: true }, - {provide: TestingCompilerFactory, useClass: TestingCompilerFactoryImpl} + { + provide: TestingCompilerFactory, + useClass: TestingCompilerFactoryImpl, + deps: [CompilerFactory] + } ]); diff --git a/packages/core/src/application_ref.ts b/packages/core/src/application_ref.ts index ebb6a28b2d..a3dd39d563 100644 --- a/packages/core/src/application_ref.ts +++ b/packages/core/src/application_ref.ts @@ -19,7 +19,7 @@ import {isPromise} from '../src/util/lang'; import {ApplicationInitStatus} from './application_init'; import {APP_BOOTSTRAP_LISTENER, PLATFORM_INITIALIZER} from './application_tokens'; import {Console} from './console'; -import {Injectable, InjectionToken, Injector, Provider, ReflectiveInjector} from './di'; +import {Injectable, InjectionToken, Injector, StaticProvider} from './di'; import {CompilerFactory, CompilerOptions} from './linker/compiler'; import {ComponentFactory, ComponentRef} from './linker/component_factory'; import {ComponentFactoryBoundToModule, ComponentFactoryResolver} from './linker/component_factory_resolver'; @@ -99,17 +99,18 @@ export function createPlatform(injector: Injector): PlatformRef { * @experimental APIs related to application bootstrap are currently under review. */ export function createPlatformFactory( - parentPlatformFactory: ((extraProviders?: Provider[]) => PlatformRef) | null, name: string, - providers: Provider[] = []): (extraProviders?: Provider[]) => PlatformRef { + parentPlatformFactory: ((extraProviders?: StaticProvider[]) => PlatformRef) | null, + name: string, providers: StaticProvider[] = []): (extraProviders?: StaticProvider[]) => + PlatformRef { const marker = new InjectionToken(`Platform: ${name}`); - return (extraProviders: Provider[] = []) => { + return (extraProviders: StaticProvider[] = []) => { let platform = getPlatform(); if (!platform || platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) { if (parentPlatformFactory) { parentPlatformFactory( providers.concat(extraProviders).concat({provide: marker, useValue: true})); } else { - createPlatform(ReflectiveInjector.resolveAndCreate( + createPlatform(Injector.create( providers.concat(extraProviders).concat({provide: marker, useValue: true}))); } } @@ -292,8 +293,7 @@ export class PlatformRef_ extends PlatformRef { // Attention: Don't use ApplicationRef.run here, // as we want to be sure that all possible constructor calls are inside `ngZone.run`! return ngZone.run(() => { - const ngZoneInjector = - ReflectiveInjector.resolveAndCreate([{provide: NgZone, useValue: ngZone}], this.injector); + const ngZoneInjector = Injector.create([{provide: NgZone, useValue: ngZone}], this.injector); const moduleRef = >moduleFactory.create(ngZoneInjector); const exceptionHandler: ErrorHandler = moduleRef.injector.get(ErrorHandler, null); if (!exceptionHandler) { diff --git a/packages/core/src/change_detection/differs/iterable_differs.ts b/packages/core/src/change_detection/differs/iterable_differs.ts index 72bad7296b..d1daadc3b5 100644 --- a/packages/core/src/change_detection/differs/iterable_differs.ts +++ b/packages/core/src/change_detection/differs/iterable_differs.ts @@ -6,9 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ -import {Optional, Provider, SkipSelf} from '../../di'; +import {Optional, SkipSelf, StaticProvider} from '../../di'; import {ChangeDetectorRef} from '../change_detector_ref'; + /** * A type describing supported iterable types. * @@ -181,7 +182,7 @@ export class IterableDiffers { * }) * ``` */ - static extend(factories: IterableDifferFactory[]): Provider { + static extend(factories: IterableDifferFactory[]): StaticProvider { return { provide: IterableDiffers, useFactory: (parent: IterableDiffers) => { diff --git a/packages/core/src/change_detection/differs/keyvalue_differs.ts b/packages/core/src/change_detection/differs/keyvalue_differs.ts index f401ab8389..c6637ecf9d 100644 --- a/packages/core/src/change_detection/differs/keyvalue_differs.ts +++ b/packages/core/src/change_detection/differs/keyvalue_differs.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Optional, Provider, SkipSelf} from '../../di'; +import {Optional, SkipSelf, StaticProvider} from '../../di'; import {ChangeDetectorRef} from '../change_detector_ref'; @@ -156,7 +156,7 @@ export class KeyValueDiffers { * }) * ``` */ - static extend(factories: KeyValueDifferFactory[]): Provider { + static extend(factories: KeyValueDifferFactory[]): StaticProvider { return { provide: KeyValueDiffers, useFactory: (parent: KeyValueDiffers) => { diff --git a/packages/core/src/linker/compiler.ts b/packages/core/src/linker/compiler.ts index 28320877b8..f92bfc1f87 100644 --- a/packages/core/src/linker/compiler.ts +++ b/packages/core/src/linker/compiler.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Injectable, InjectionToken} from '../di'; +import {Injectable, InjectionToken, StaticProvider} from '../di'; import {MissingTranslationStrategy} from '../i18n/tokens'; import {ViewEncapsulation} from '../metadata'; import {Type} from '../type'; @@ -14,6 +14,7 @@ import {Type} from '../type'; import {ComponentFactory} from './component_factory'; import {NgModuleFactory} from './ng_module_factory'; + /** * Combination of NgModuleFactory and ComponentFactorys. * @@ -101,7 +102,7 @@ export type CompilerOptions = { useDebug?: boolean, useJit?: boolean, defaultEncapsulation?: ViewEncapsulation, - providers?: any[], + providers?: StaticProvider[], missingTranslation?: MissingTranslationStrategy, // Whether to support the `