Revert "feat(transformers): changes transformers to collect information about providers and resolve identifiers during linking"
This reverts commit 4e9809bcb2.
This commit is contained in:
@@ -1,16 +1,13 @@
|
||||
import {
|
||||
isPresent,
|
||||
isBlank,
|
||||
isNumber,
|
||||
isBoolean,
|
||||
normalizeBool,
|
||||
normalizeBlank,
|
||||
serializeEnum,
|
||||
Type,
|
||||
isString,
|
||||
RegExpWrapper,
|
||||
StringWrapper,
|
||||
isArray
|
||||
StringWrapper
|
||||
} from 'angular2/src/facade/lang';
|
||||
import {unimplemented} from 'angular2/src/facade/exceptions';
|
||||
import {StringMapWrapper} from 'angular2/src/facade/collection';
|
||||
@@ -28,12 +25,20 @@ import {LifecycleHooks, LIFECYCLE_HOOKS_VALUES} from 'angular2/src/core/linker/i
|
||||
var HOST_REG_EXP = /^(?:(?:\[([^\]]+)\])|(?:\(([^\)]+)\)))$/g;
|
||||
|
||||
export abstract class CompileMetadataWithIdentifier {
|
||||
static fromJson(data: {[key: string]: any}): CompileMetadataWithIdentifier {
|
||||
return _COMPILE_METADATA_FROM_JSON[data['class']](data);
|
||||
}
|
||||
|
||||
abstract toJson(): {[key: string]: any};
|
||||
|
||||
get identifier(): CompileIdentifierMetadata { return <CompileIdentifierMetadata>unimplemented(); }
|
||||
}
|
||||
|
||||
export abstract class CompileMetadataWithType extends CompileMetadataWithIdentifier {
|
||||
static fromJson(data: {[key: string]: any}): CompileMetadataWithType {
|
||||
return _COMPILE_METADATA_FROM_JSON[data['class']](data);
|
||||
}
|
||||
|
||||
abstract toJson(): {[key: string]: any};
|
||||
|
||||
get type(): CompileTypeMetadata { return <CompileTypeMetadata>unimplemented(); }
|
||||
@@ -41,57 +46,43 @@ export abstract class CompileMetadataWithType extends CompileMetadataWithIdentif
|
||||
get identifier(): CompileIdentifierMetadata { return <CompileIdentifierMetadata>unimplemented(); }
|
||||
}
|
||||
|
||||
export function metadataFromJson(data: {[key: string]: any}): any {
|
||||
return _COMPILE_METADATA_FROM_JSON[data['class']](data);
|
||||
}
|
||||
|
||||
export class CompileIdentifierMetadata implements CompileMetadataWithIdentifier {
|
||||
runtime: any;
|
||||
name: string;
|
||||
prefix: string;
|
||||
moduleUrl: string;
|
||||
constConstructor: boolean;
|
||||
value: any;
|
||||
|
||||
constructor({runtime, name, moduleUrl, prefix, constConstructor, value}: {
|
||||
constructor({runtime, name, moduleUrl, prefix, constConstructor}: {
|
||||
runtime?: any,
|
||||
name?: string,
|
||||
staticMethodName?: string,
|
||||
moduleUrl?: string,
|
||||
prefix?: string,
|
||||
constConstructor?: boolean,
|
||||
value?: any
|
||||
constConstructor?: boolean
|
||||
} = {}) {
|
||||
this.runtime = runtime;
|
||||
this.name = name;
|
||||
this.prefix = prefix;
|
||||
this.moduleUrl = moduleUrl;
|
||||
this.constConstructor = constConstructor;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
static fromJson(data: {[key: string]: any}): CompileIdentifierMetadata {
|
||||
let value = isArray(data['value']) ? arrayFromJson(data['value'], metadataFromJson) :
|
||||
objFromJson(data['value'], metadataFromJson);
|
||||
return new CompileIdentifierMetadata({
|
||||
name: data['name'],
|
||||
prefix: data['prefix'],
|
||||
moduleUrl: data['moduleUrl'],
|
||||
constConstructor: data['constConstructor'],
|
||||
value: value
|
||||
constConstructor: data['constConstructor']
|
||||
});
|
||||
}
|
||||
|
||||
toJson(): {[key: string]: any} {
|
||||
let value = isArray(this.value) ? arrayToJson(this.value) : objToJson(this.value);
|
||||
return {
|
||||
// Note: Runtime type can't be serialized...
|
||||
'class': 'Identifier',
|
||||
'name': this.name,
|
||||
'moduleUrl': this.moduleUrl,
|
||||
'prefix': this.prefix,
|
||||
'constConstructor': this.constConstructor,
|
||||
'value': value
|
||||
'constConstructor': this.constConstructor
|
||||
};
|
||||
}
|
||||
|
||||
@@ -186,78 +177,44 @@ export class CompileProviderMetadata {
|
||||
static fromJson(data: {[key: string]: any}): CompileProviderMetadata {
|
||||
return new CompileProviderMetadata({
|
||||
token: objFromJson(data['token'], CompileIdentifierMetadata.fromJson),
|
||||
useClass: objFromJson(data['useClass'], CompileTypeMetadata.fromJson),
|
||||
useExisting: objFromJson(data['useExisting'], CompileIdentifierMetadata.fromJson),
|
||||
useValue: objFromJson(data['useValue'], CompileIdentifierMetadata.fromJson),
|
||||
useFactory: objFromJson(data['useFactory'], CompileFactoryMetadata.fromJson)
|
||||
useClass: objFromJson(data['useClass'], CompileTypeMetadata.fromJson)
|
||||
});
|
||||
}
|
||||
|
||||
toJson(): {[key: string]: any} {
|
||||
return {
|
||||
// Note: Runtime type can't be serialized...
|
||||
'class': 'Provider',
|
||||
'token': objToJson(this.token),
|
||||
'useClass': objToJson(this.useClass),
|
||||
'useExisting': objToJson(this.useExisting),
|
||||
'useValue': objToJson(this.useValue),
|
||||
'useFactory': objToJson(this.useFactory)
|
||||
'useClass': objToJson(this.useClass)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export class CompileFactoryMetadata implements CompileIdentifierMetadata,
|
||||
CompileMetadataWithIdentifier {
|
||||
export class CompileFactoryMetadata implements CompileIdentifierMetadata {
|
||||
runtime: Function;
|
||||
name: string;
|
||||
prefix: string;
|
||||
moduleUrl: string;
|
||||
constConstructor: boolean;
|
||||
value: any;
|
||||
diDeps: CompileDiDependencyMetadata[];
|
||||
|
||||
constructor({runtime, name, moduleUrl, prefix, constConstructor, diDeps, value}: {
|
||||
constructor({runtime, name, moduleUrl, constConstructor, diDeps}: {
|
||||
runtime?: Function,
|
||||
name?: string,
|
||||
prefix?: string,
|
||||
moduleUrl?: string,
|
||||
constConstructor?: boolean,
|
||||
value?: boolean,
|
||||
diDeps?: CompileDiDependencyMetadata[]
|
||||
}) {
|
||||
this.runtime = runtime;
|
||||
this.name = name;
|
||||
this.prefix = prefix;
|
||||
this.moduleUrl = moduleUrl;
|
||||
this.diDeps = diDeps;
|
||||
this.constConstructor = constConstructor;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
get identifier(): CompileIdentifierMetadata { return this; }
|
||||
|
||||
static fromJson(data: {[key: string]: any}): CompileFactoryMetadata {
|
||||
return new CompileFactoryMetadata({
|
||||
name: data['name'],
|
||||
prefix: data['prefix'],
|
||||
moduleUrl: data['moduleUrl'],
|
||||
constConstructor: data['constConstructor'],
|
||||
value: data['value'],
|
||||
diDeps: arrayFromJson(data['diDeps'], CompileDiDependencyMetadata.fromJson)
|
||||
});
|
||||
}
|
||||
|
||||
toJson(): {[key: string]: any} {
|
||||
return {
|
||||
'class': 'Factory',
|
||||
'name': this.name,
|
||||
'prefix': this.prefix,
|
||||
'moduleUrl': this.moduleUrl,
|
||||
'constConstructor': this.constConstructor,
|
||||
'value': this.value,
|
||||
'diDeps': arrayToJson(this.diDeps)
|
||||
};
|
||||
}
|
||||
toJson() { return null; }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -270,17 +227,15 @@ export class CompileTypeMetadata implements CompileIdentifierMetadata, CompileMe
|
||||
moduleUrl: string;
|
||||
isHost: boolean;
|
||||
constConstructor: boolean;
|
||||
value: any;
|
||||
diDeps: CompileDiDependencyMetadata[];
|
||||
|
||||
constructor({runtime, name, moduleUrl, prefix, isHost, constConstructor, value, diDeps}: {
|
||||
constructor({runtime, name, moduleUrl, prefix, isHost, constConstructor, diDeps}: {
|
||||
runtime?: Type,
|
||||
name?: string,
|
||||
moduleUrl?: string,
|
||||
prefix?: string,
|
||||
isHost?: boolean,
|
||||
constConstructor?: boolean,
|
||||
value?: any,
|
||||
diDeps?: CompileDiDependencyMetadata[]
|
||||
} = {}) {
|
||||
this.runtime = runtime;
|
||||
@@ -289,7 +244,6 @@ export class CompileTypeMetadata implements CompileIdentifierMetadata, CompileMe
|
||||
this.prefix = prefix;
|
||||
this.isHost = normalizeBool(isHost);
|
||||
this.constConstructor = constConstructor;
|
||||
this.value = value;
|
||||
this.diDeps = normalizeBlank(diDeps);
|
||||
}
|
||||
|
||||
@@ -300,7 +254,6 @@ export class CompileTypeMetadata implements CompileIdentifierMetadata, CompileMe
|
||||
prefix: data['prefix'],
|
||||
isHost: data['isHost'],
|
||||
constConstructor: data['constConstructor'],
|
||||
value: data['value'],
|
||||
diDeps: arrayFromJson(data['diDeps'], CompileDiDependencyMetadata.fromJson)
|
||||
});
|
||||
}
|
||||
@@ -317,7 +270,6 @@ export class CompileTypeMetadata implements CompileIdentifierMetadata, CompileMe
|
||||
'prefix': this.prefix,
|
||||
'isHost': this.isHost,
|
||||
'constConstructor': this.constConstructor,
|
||||
'value': this.value,
|
||||
'diDeps': arrayToJson(this.diDeps)
|
||||
};
|
||||
}
|
||||
@@ -430,10 +382,8 @@ export class CompileDirectiveMetadata implements CompileMetadataWithType {
|
||||
outputs?: string[],
|
||||
host?: {[key: string]: string},
|
||||
lifecycleHooks?: LifecycleHooks[],
|
||||
providers?:
|
||||
Array<CompileProviderMetadata | CompileTypeMetadata | CompileIdentifierMetadata | any[]>,
|
||||
viewProviders?:
|
||||
Array<CompileProviderMetadata | CompileTypeMetadata | CompileIdentifierMetadata | any[]>,
|
||||
providers?: Array<CompileProviderMetadata | CompileTypeMetadata | any[]>,
|
||||
viewProviders?: Array<CompileProviderMetadata | CompileTypeMetadata | any[]>,
|
||||
queries?: CompileQueryMetadata[],
|
||||
viewQueries?: CompileQueryMetadata[],
|
||||
template?: CompileTemplateMetadata
|
||||
@@ -524,10 +474,8 @@ export class CompileDirectiveMetadata implements CompileMetadataWithType {
|
||||
hostProperties?: {[key: string]: string},
|
||||
hostAttributes?: {[key: string]: string},
|
||||
lifecycleHooks?: LifecycleHooks[],
|
||||
providers?:
|
||||
Array<CompileProviderMetadata | CompileTypeMetadata | CompileIdentifierMetadata | any[]>,
|
||||
viewProviders?:
|
||||
Array<CompileProviderMetadata | CompileTypeMetadata | CompileIdentifierMetadata | any[]>,
|
||||
providers?: Array<CompileProviderMetadata | CompileTypeMetadata | any[]>,
|
||||
viewProviders?: Array<CompileProviderMetadata | CompileTypeMetadata | any[]>,
|
||||
queries?: CompileQueryMetadata[],
|
||||
viewQueries?: CompileQueryMetadata[],
|
||||
template?: CompileTemplateMetadata
|
||||
@@ -546,8 +494,8 @@ export class CompileDirectiveMetadata implements CompileMetadataWithType {
|
||||
this.lifecycleHooks = lifecycleHooks;
|
||||
this.providers = normalizeBlank(providers);
|
||||
this.viewProviders = normalizeBlank(viewProviders);
|
||||
this.queries = normalizeBlank(queries);
|
||||
this.viewQueries = normalizeBlank(viewQueries);
|
||||
this.queries = queries;
|
||||
this.viewQueries = viewQueries;
|
||||
this.template = template;
|
||||
}
|
||||
|
||||
@@ -572,10 +520,7 @@ export class CompileDirectiveMetadata implements CompileMetadataWithType {
|
||||
(<any[]>data['lifecycleHooks']).map(hookValue => LIFECYCLE_HOOKS_VALUES[hookValue]),
|
||||
template: isPresent(data['template']) ? CompileTemplateMetadata.fromJson(data['template']) :
|
||||
data['template'],
|
||||
providers: arrayFromJson(data['providers'], metadataFromJson),
|
||||
viewProviders: arrayFromJson(data['viewProviders'], metadataFromJson),
|
||||
queries: arrayFromJson(data['queries'], CompileQueryMetadata.fromJson),
|
||||
viewQueries: arrayFromJson(data['viewQueries'], CompileQueryMetadata.fromJson)
|
||||
providers: arrayFromJson(data['providers'], CompileProviderMetadata.fromJson)
|
||||
});
|
||||
}
|
||||
|
||||
@@ -596,10 +541,7 @@ export class CompileDirectiveMetadata implements CompileMetadataWithType {
|
||||
'hostAttributes': this.hostAttributes,
|
||||
'lifecycleHooks': this.lifecycleHooks.map(hook => serializeEnum(hook)),
|
||||
'template': isPresent(this.template) ? this.template.toJson() : this.template,
|
||||
'providers': arrayToJson(this.providers),
|
||||
'viewProviders': arrayToJson(this.viewProviders),
|
||||
'queries': arrayToJson(this.queries),
|
||||
'viewQueries': arrayToJson(this.viewQueries)
|
||||
'providers': arrayToJson(this.providers)
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -669,9 +611,7 @@ var _COMPILE_METADATA_FROM_JSON = {
|
||||
'Directive': CompileDirectiveMetadata.fromJson,
|
||||
'Pipe': CompilePipeMetadata.fromJson,
|
||||
'Type': CompileTypeMetadata.fromJson,
|
||||
'Provider': CompileProviderMetadata.fromJson,
|
||||
'Identifier': CompileIdentifierMetadata.fromJson,
|
||||
'Factory': CompileFactoryMetadata.fromJson
|
||||
'Identifier': CompileIdentifierMetadata.fromJson
|
||||
};
|
||||
|
||||
function arrayFromJson(obj: any[], fn: (a: {[key: string]: any}) => any): any {
|
||||
@@ -683,9 +623,9 @@ function arrayToJson(obj: any[]): string | {[key: string]: any} {
|
||||
}
|
||||
|
||||
function objFromJson(obj: any, fn: (a: {[key: string]: any}) => any): any {
|
||||
return (isString(obj) || isBlank(obj) || isBoolean(obj) || isNumber(obj)) ? obj : fn(obj);
|
||||
return (isString(obj) || isBlank(obj)) ? obj : fn(obj);
|
||||
}
|
||||
|
||||
function objToJson(obj: any): string | {[key: string]: any} {
|
||||
return (isString(obj) || isBlank(obj) || isBoolean(obj) || isNumber(obj)) ? obj : obj.toJson();
|
||||
return (isString(obj) || isBlank(obj)) ? obj : obj.toJson();
|
||||
}
|
||||
|
||||
@@ -110,9 +110,6 @@ export class TemplateCompiler {
|
||||
hostAttributes: directive.hostAttributes,
|
||||
lifecycleHooks: directive.lifecycleHooks,
|
||||
providers: directive.providers,
|
||||
viewProviders: directive.viewProviders,
|
||||
queries: directive.queries,
|
||||
viewQueries: directive.viewQueries,
|
||||
template: normalizedTemplate
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -33,7 +33,6 @@ bool isStringMap(Object obj) => obj is Map;
|
||||
bool isArray(Object obj) => obj is List;
|
||||
bool isPromise(Object obj) => obj is Future;
|
||||
bool isNumber(Object obj) => obj is num;
|
||||
bool isBoolean(Object obj) => obj is bool;
|
||||
bool isDate(Object obj) => obj is DateTime;
|
||||
|
||||
String stringify(obj) {
|
||||
|
||||
@@ -124,14 +124,6 @@ export function isBlank(obj: any): boolean {
|
||||
return obj === undefined || obj === null;
|
||||
}
|
||||
|
||||
export function isBoolean(obj: any): boolean {
|
||||
return typeof obj === "boolean";
|
||||
}
|
||||
|
||||
export function isNumber(obj: any): boolean {
|
||||
return typeof obj === "number";
|
||||
}
|
||||
|
||||
export function isString(obj: any): boolean {
|
||||
return typeof obj === "string";
|
||||
}
|
||||
@@ -156,6 +148,10 @@ export function isArray(obj: any): boolean {
|
||||
return Array.isArray(obj);
|
||||
}
|
||||
|
||||
export function isNumber(obj): boolean {
|
||||
return typeof obj === 'number';
|
||||
}
|
||||
|
||||
export function isDate(obj): boolean {
|
||||
return obj instanceof Date && !isNaN(obj.valueOf());
|
||||
}
|
||||
|
||||
@@ -18,9 +18,7 @@ import {
|
||||
CompileTemplateMetadata,
|
||||
CompileProviderMetadata,
|
||||
CompileDiDependencyMetadata,
|
||||
CompileQueryMetadata,
|
||||
CompileIdentifierMetadata,
|
||||
CompileFactoryMetadata
|
||||
CompileQueryMetadata
|
||||
} from 'angular2/src/compiler/directive_metadata';
|
||||
import {ViewEncapsulation} from 'angular2/src/core/metadata/view';
|
||||
import {ChangeDetectionStrategy} from 'angular2/src/core/change_detection';
|
||||
@@ -33,21 +31,25 @@ export function main() {
|
||||
var fullDirectiveMeta: CompileDirectiveMetadata;
|
||||
|
||||
beforeEach(() => {
|
||||
var diDep = new CompileDiDependencyMetadata({
|
||||
isAttribute: true,
|
||||
isSelf: true,
|
||||
fullTypeMeta = new CompileTypeMetadata({
|
||||
name: 'SomeType',
|
||||
moduleUrl: 'someUrl',
|
||||
isHost: true,
|
||||
isSkipSelf: true,
|
||||
isOptional: true,
|
||||
token: 'someToken',
|
||||
query: new CompileQueryMetadata(
|
||||
{selectors: ['one'], descendants: true, first: true, propertyName: 'one'}),
|
||||
viewQuery: new CompileQueryMetadata(
|
||||
{selectors: ['one'], descendants: true, first: true, propertyName: 'one'})
|
||||
diDeps: [
|
||||
new CompileDiDependencyMetadata({
|
||||
isAttribute: true,
|
||||
isSelf: true,
|
||||
isHost: true,
|
||||
isSkipSelf: true,
|
||||
isOptional: true,
|
||||
token: 'someToken',
|
||||
query: new CompileQueryMetadata(
|
||||
{selectors: ['one'], descendants: true, first: true, propertyName: 'one'}),
|
||||
viewQuery: new CompileQueryMetadata(
|
||||
{selectors: ['one'], descendants: true, first: true, propertyName: 'one'})
|
||||
})
|
||||
]
|
||||
});
|
||||
|
||||
fullTypeMeta = new CompileTypeMetadata(
|
||||
{name: 'SomeType', moduleUrl: 'someUrl', isHost: true, diDeps: [diDep]});
|
||||
fullTemplateMeta = new CompileTemplateMetadata({
|
||||
encapsulation: ViewEncapsulation.Emulated,
|
||||
template: '<a></a>',
|
||||
@@ -67,32 +69,7 @@ export function main() {
|
||||
outputs: ['someEvent'],
|
||||
host: {'(event1)': 'handler1', '[prop1]': 'expr1', 'attr1': 'attrValue2'},
|
||||
lifecycleHooks: [LifecycleHooks.OnChanges],
|
||||
providers: [
|
||||
new CompileProviderMetadata({
|
||||
token: 'token',
|
||||
useClass: fullTypeMeta,
|
||||
useExisting: new CompileIdentifierMetadata({name: 'someName'}),
|
||||
useFactory: new CompileFactoryMetadata({name: 'someName', diDeps: [diDep]}),
|
||||
useValue: 'someValue',
|
||||
})
|
||||
],
|
||||
viewProviders: [
|
||||
new CompileProviderMetadata({
|
||||
token: 'token',
|
||||
useClass: fullTypeMeta,
|
||||
useExisting: new CompileIdentifierMetadata({name: 'someName'}),
|
||||
useFactory: new CompileFactoryMetadata({name: 'someName', diDeps: [diDep]}),
|
||||
useValue: 'someValue',
|
||||
})
|
||||
],
|
||||
queries: [
|
||||
new CompileQueryMetadata(
|
||||
{selectors: ['selector'], descendants: true, first: false, propertyName: 'prop'})
|
||||
],
|
||||
viewQueries: [
|
||||
new CompileQueryMetadata(
|
||||
{selectors: ['selector'], descendants: true, first: false, propertyName: 'prop'})
|
||||
]
|
||||
providers: [new CompileProviderMetadata({token: 'token', useClass: fullTypeMeta})]
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -166,11 +166,11 @@ abstract class NgDepsWriterMixin
|
||||
..writeln('void ${SETUP_METHOD_NAME}() {')
|
||||
..writeln('if (_visited) return; _visited = true;');
|
||||
|
||||
final needsReceiver =
|
||||
(model.reflectables != null && model.reflectables.isNotEmpty) ||
|
||||
(model.getters != null && model.getters.isNotEmpty) ||
|
||||
(model.setters != null && model.setters.isNotEmpty) ||
|
||||
(model.methods != null && model.methods.isNotEmpty);
|
||||
final needsReceiver = (model.reflectables != null &&
|
||||
model.reflectables.isNotEmpty) ||
|
||||
(model.getters != null && model.getters.isNotEmpty) ||
|
||||
(model.setters != null && model.setters.isNotEmpty) ||
|
||||
(model.methods != null && model.methods.isNotEmpty);
|
||||
|
||||
if (needsReceiver) {
|
||||
buffer.writeln('$REFLECTOR_PREFIX.$REFLECTOR_VAR_NAME');
|
||||
|
||||
@@ -74,50 +74,6 @@ class PrintLogger implements TransformLogger {
|
||||
}
|
||||
}
|
||||
|
||||
/// Wraps the logger and prints the messages
|
||||
/// only if they have not been printed before
|
||||
class DeduppingLogger implements TransformLogger {
|
||||
Set<String> _printedMessages;
|
||||
|
||||
final TransformLogger _logger;
|
||||
|
||||
DeduppingLogger(this._logger, this._printedMessages);
|
||||
|
||||
String _key(msg, AssetId asset) => "$msg $asset";
|
||||
|
||||
@override
|
||||
void info(msg, {AssetId asset, SourceSpan span}) {
|
||||
if (!_printedMessages.contains(_key(msg, asset))) {
|
||||
_printedMessages.add(_key(msg, asset));
|
||||
_logger.info(msg, asset: asset, span: span);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void fine(msg, {AssetId asset, SourceSpan span}) {
|
||||
if (!_printedMessages.contains(_key(msg, asset))) {
|
||||
_printedMessages.add(_key(msg, asset));
|
||||
_logger.fine(msg, asset: asset, span: span);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void warning(msg, {AssetId asset, SourceSpan span}) {
|
||||
if (!_printedMessages.contains(_key(msg, asset))) {
|
||||
_printedMessages.add(_key(msg, asset));
|
||||
_logger.warning(msg, asset: asset, span: span);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void error(msg, {AssetId asset, SourceSpan span}) {
|
||||
if (!_printedMessages.contains(_key(msg, asset))) {
|
||||
_printedMessages.add(_key(msg, asset));
|
||||
_logger.error(msg, asset: asset, span: span);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class PrintLoggerError extends Error {
|
||||
final String message;
|
||||
final AssetId asset;
|
||||
|
||||
@@ -23,8 +23,8 @@ class NamedParameter extends GeneratedMessage {
|
||||
static PbList<NamedParameter> createRepeated() =>
|
||||
new PbList<NamedParameter>();
|
||||
static NamedParameter getDefault() {
|
||||
if (_defaultInstance == null)
|
||||
_defaultInstance = new _ReadonlyNamedParameter();
|
||||
if (_defaultInstance == null) _defaultInstance =
|
||||
new _ReadonlyNamedParameter();
|
||||
return _defaultInstance;
|
||||
}
|
||||
|
||||
@@ -78,8 +78,8 @@ class AnnotationModel extends GeneratedMessage {
|
||||
static PbList<AnnotationModel> createRepeated() =>
|
||||
new PbList<AnnotationModel>();
|
||||
static AnnotationModel getDefault() {
|
||||
if (_defaultInstance == null)
|
||||
_defaultInstance = new _ReadonlyAnnotationModel();
|
||||
if (_defaultInstance == null) _defaultInstance =
|
||||
new _ReadonlyAnnotationModel();
|
||||
return _defaultInstance;
|
||||
}
|
||||
|
||||
|
||||
@@ -26,8 +26,8 @@ class ParameterModel extends GeneratedMessage {
|
||||
static PbList<ParameterModel> createRepeated() =>
|
||||
new PbList<ParameterModel>();
|
||||
static ParameterModel getDefault() {
|
||||
if (_defaultInstance == null)
|
||||
_defaultInstance = new _ReadonlyParameterModel();
|
||||
if (_defaultInstance == null) _defaultInstance =
|
||||
new _ReadonlyParameterModel();
|
||||
return _defaultInstance;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,15 +27,15 @@ class PropertyMetadataModel extends GeneratedMessage {
|
||||
static PbList<PropertyMetadataModel> createRepeated() =>
|
||||
new PbList<PropertyMetadataModel>();
|
||||
static PropertyMetadataModel getDefault() {
|
||||
if (_defaultInstance == null)
|
||||
_defaultInstance = new _ReadonlyPropertyMetadataModel();
|
||||
if (_defaultInstance == null) _defaultInstance =
|
||||
new _ReadonlyPropertyMetadataModel();
|
||||
return _defaultInstance;
|
||||
}
|
||||
|
||||
static PropertyMetadataModel _defaultInstance;
|
||||
static void $checkItem(PropertyMetadataModel v) {
|
||||
if (v is! PropertyMetadataModel)
|
||||
checkItemFailed(v, 'PropertyMetadataModel');
|
||||
if (v
|
||||
is! PropertyMetadataModel) checkItemFailed(v, 'PropertyMetadataModel');
|
||||
}
|
||||
|
||||
String get name => $_get(0, 1, '');
|
||||
@@ -70,8 +70,8 @@ class PrefixedType extends GeneratedMessage {
|
||||
static PrefixedType create() => new PrefixedType();
|
||||
static PbList<PrefixedType> createRepeated() => new PbList<PrefixedType>();
|
||||
static PrefixedType getDefault() {
|
||||
if (_defaultInstance == null)
|
||||
_defaultInstance = new _ReadonlyPrefixedType();
|
||||
if (_defaultInstance == null) _defaultInstance =
|
||||
new _ReadonlyPrefixedType();
|
||||
return _defaultInstance;
|
||||
}
|
||||
|
||||
@@ -130,8 +130,8 @@ class ReflectionInfoModel extends GeneratedMessage {
|
||||
static PbList<ReflectionInfoModel> createRepeated() =>
|
||||
new PbList<ReflectionInfoModel>();
|
||||
static ReflectionInfoModel getDefault() {
|
||||
if (_defaultInstance == null)
|
||||
_defaultInstance = new _ReadonlyReflectionInfoModel();
|
||||
if (_defaultInstance == null) _defaultInstance =
|
||||
new _ReadonlyReflectionInfoModel();
|
||||
return _defaultInstance;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,8 +28,10 @@ import 'url_resolver.dart' show isDartCoreUri;
|
||||
/// `.ng_meta.json` files as intermediate assets during the compilation process.
|
||||
class NgMeta {
|
||||
static const _ALIAS_VALUE = 'alias';
|
||||
static const _KIND_KEY = 'kind';
|
||||
static const _NG_DEPS_KEY = 'ngDeps';
|
||||
static const _TYPE_VALUE = 'type';
|
||||
static const _VALUE_KEY = 'value';
|
||||
|
||||
/// Metadata for each identifier
|
||||
/// Type: [CompileDirectiveMetadata]|[CompilePipeMetadata]|[CompileTypeMetadata]|[CompileIdentifierMetadata]
|
||||
@@ -41,9 +43,11 @@ class NgMeta {
|
||||
// The NgDeps generated from
|
||||
final NgDepsModel ngDeps;
|
||||
|
||||
bool definesAlias;
|
||||
|
||||
NgMeta({Map<String, List<String>> aliases,
|
||||
Map<String, dynamic> identifiers,
|
||||
this.ngDeps: null})
|
||||
Map<String, dynamic> identifiers,
|
||||
this.ngDeps: null, this.definesAlias: false})
|
||||
:this.aliases = aliases != null ? aliases : {},
|
||||
this.identifiers = identifiers != null ? identifiers : {};
|
||||
|
||||
@@ -68,43 +72,48 @@ class NgMeta {
|
||||
|
||||
bool get isEmpty => identifiers.isEmpty && aliases.isEmpty && isNgDepsEmpty;
|
||||
|
||||
bool get needsResolution {
|
||||
return identifiers.values.any((id) =>
|
||||
id is CompileDirectiveMetadata || id is CompilePipeMetadata || id is CompileTypeMetadata
|
||||
|| (id is CompileIdentifierMetadata && id.value != null));
|
||||
List<String> get linkingUris {
|
||||
final r = ngDeps.exports.map((r) => r.uri).toList();
|
||||
if (definesAlias) {
|
||||
r.addAll(ngDeps.imports.map((r) => r.uri));
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/// Parse from the serialized form produced by [toJson].
|
||||
factory NgMeta.fromJson(Map json) {
|
||||
var ngDeps = null;
|
||||
|
||||
if (json.containsKey(_NG_DEPS_KEY)) {
|
||||
var ngDepsJsonMap = json[_NG_DEPS_KEY];
|
||||
if (ngDepsJsonMap != null) {
|
||||
final aliases = {};
|
||||
final identifiers = {};
|
||||
var definesAlias = false;
|
||||
for (var key in json.keys) {
|
||||
if (key == _NG_DEPS_KEY) {
|
||||
var ngDepsJsonMap = json[key];
|
||||
if (ngDepsJsonMap == null) continue;
|
||||
if (ngDepsJsonMap is! Map) {
|
||||
log.warning(
|
||||
'Unexpected value $ngDepsJsonMap for key "$_NG_DEPS_KEY" in NgMeta.');
|
||||
} else {
|
||||
ngDeps = new NgDepsModel()..mergeFromJsonMap(ngDepsJsonMap);
|
||||
'Unexpected value $ngDepsJsonMap for key "$key" in NgMeta.');
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
ngDeps = new NgDepsModel()
|
||||
..mergeFromJsonMap(ngDepsJsonMap);
|
||||
} else if (key == 'definesAlias') {
|
||||
definesAlias = json[key];
|
||||
|
||||
final aliases = json[_ALIAS_VALUE] != null ? json[_ALIAS_VALUE] : {};
|
||||
|
||||
final identifiers = {};
|
||||
if (json.containsKey(_TYPE_VALUE)) {
|
||||
for (var key in json[_TYPE_VALUE].keys) {
|
||||
var entry = json[_TYPE_VALUE][key];
|
||||
} else {
|
||||
var entry = json[key];
|
||||
if (entry is! Map) {
|
||||
log.warning('Unexpected value $entry for key "$key" in NgMeta.');
|
||||
continue;
|
||||
}
|
||||
identifiers[key] = metadataFromJson(entry);
|
||||
if (entry[_KIND_KEY] == _TYPE_VALUE) {
|
||||
identifiers[key] = CompileMetadataWithIdentifier.fromJson(entry[_VALUE_KEY]);
|
||||
} else if (entry[_KIND_KEY] == _ALIAS_VALUE) {
|
||||
aliases[key] = entry[_VALUE_KEY];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new NgMeta(identifiers: identifiers, aliases: aliases, ngDeps: ngDeps);
|
||||
return new NgMeta(identifiers: identifiers, aliases: aliases, ngDeps: ngDeps, definesAlias: definesAlias);
|
||||
}
|
||||
|
||||
/// Serialized representation of this instance.
|
||||
@@ -112,11 +121,16 @@ class NgMeta {
|
||||
var result = {};
|
||||
result[_NG_DEPS_KEY] = isNgDepsEmpty ? null : ngDeps.writeToJsonMap();
|
||||
|
||||
result[_TYPE_VALUE] = {};
|
||||
identifiers.forEach((k, v) {
|
||||
result[_TYPE_VALUE][k] = v.toJson();
|
||||
result[k] = {_KIND_KEY: _TYPE_VALUE, _VALUE_KEY: v.toJson()};
|
||||
});
|
||||
result[_ALIAS_VALUE] = aliases;
|
||||
|
||||
aliases.forEach((k, v) {
|
||||
result[k] = {_KIND_KEY: _ALIAS_VALUE, _VALUE_KEY: v};
|
||||
});
|
||||
|
||||
result['definesAlias'] = definesAlias;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -136,10 +150,10 @@ class NgMeta {
|
||||
log.error('Circular alias dependency for "$name". Cycle: ${newPath.join(' -> ')}.');
|
||||
return;
|
||||
}
|
||||
if (aliases.containsKey(name)) {
|
||||
aliases[name].forEach((n) => helper(n, newPath));
|
||||
} else if (identifiers.containsKey(name)) {
|
||||
if (identifiers.containsKey(name)) {
|
||||
result.add(identifiers[name]);
|
||||
} else if (aliases.containsKey(name)) {
|
||||
aliases[name].forEach((n) => helper(n, newPath));
|
||||
} else {
|
||||
log.error('Unknown alias: ${newPath.join(' -> ')}. Make sure you export ${name} from the file where ${path.last} is defined.');
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import 'mirror_mode.dart';
|
||||
import 'options.dart';
|
||||
import './url_resolver.dart';
|
||||
|
||||
TransformerOptions parseBarbackSettings(BarbackSettings settings) {
|
||||
TransformerOptions parseBarbackSettings(BarbackSettings settings) {
|
||||
var config = settings.configuration;
|
||||
var entryPoints = _readStringList(config, ENTRY_POINT_PARAM);
|
||||
var initReflector =
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -13,8 +13,8 @@ class TransformerUrlResolver implements UrlResolver {
|
||||
|
||||
if (!uri.isAbsolute) {
|
||||
if (baseUrl == null) throw new ArgumentError.notNull('baseUrl');
|
||||
if (baseUrl.isEmpty)
|
||||
throw new ArgumentError.value('(empty string)', 'baseUrl');
|
||||
if (baseUrl.isEmpty) throw new ArgumentError.value(
|
||||
'(empty string)', 'baseUrl');
|
||||
uri = Uri.parse(baseUrl).resolveUri(uri);
|
||||
}
|
||||
|
||||
@@ -29,8 +29,8 @@ String toAssetUri(AssetId assetId) {
|
||||
|
||||
AssetId fromUri(String assetUri) {
|
||||
if (assetUri == null) throw new ArgumentError.notNull('assetUri');
|
||||
if (assetUri.isEmpty)
|
||||
throw new ArgumentError.value('(empty string)', 'assetUri');
|
||||
if (assetUri.isEmpty) throw new ArgumentError.value(
|
||||
'(empty string)', 'assetUri');
|
||||
var uri = toAssetScheme(Uri.parse(assetUri));
|
||||
return new AssetId(
|
||||
uri.pathSegments.first, uri.pathSegments.skip(1).join('/'));
|
||||
|
||||
+15
-15
@@ -64,20 +64,20 @@ Future<Map<String, String>> _processNgImports(NgDepsModel model,
|
||||
return Future
|
||||
.wait(
|
||||
importsAndExports.where(_isNotDartDirective).map((dynamic directive) {
|
||||
// Check whether the import or export generated summary NgMeta information.
|
||||
final summaryJsonUri =
|
||||
resolver.resolve(assetUri, toSummaryExtension(directive.uri));
|
||||
return reader.hasInput(fromUri(summaryJsonUri)).then((hasInput) {
|
||||
if (hasInput) {
|
||||
retVal[directive.uri] = summaryJsonUri;
|
||||
}
|
||||
}, onError: (err, stack) {
|
||||
log.warning(
|
||||
'Error while looking for $summaryJsonUri. '
|
||||
'Message: $err\n'
|
||||
'Stack: $stack',
|
||||
asset: assetId);
|
||||
});
|
||||
}))
|
||||
// Check whether the import or export generated summary NgMeta information.
|
||||
final summaryJsonUri =
|
||||
resolver.resolve(assetUri, toSummaryExtension(directive.uri));
|
||||
return reader.hasInput(fromUri(summaryJsonUri)).then((hasInput) {
|
||||
if (hasInput) {
|
||||
retVal[directive.uri] = summaryJsonUri;
|
||||
}
|
||||
}, onError: (err, stack) {
|
||||
log.warning(
|
||||
'Error while looking for $summaryJsonUri. '
|
||||
'Message: $err\n'
|
||||
'Stack: $stack',
|
||||
asset: assetId);
|
||||
});
|
||||
}))
|
||||
.then((_) => retVal);
|
||||
}
|
||||
|
||||
+42
-394
File diff suppressed because it is too large
Load Diff
+2
-14
@@ -8,8 +8,6 @@ import 'package:barback/barback.dart';
|
||||
import 'package:angular2/src/transform/common/asset_reader.dart';
|
||||
import 'package:angular2/src/transform/common/names.dart';
|
||||
import 'package:angular2/src/transform/common/zone.dart' as zone;
|
||||
import 'package:angular2/src/transform/common/options.dart';
|
||||
import 'package:angular2/src/transform/common/logging.dart';
|
||||
|
||||
import 'ng_meta_linker.dart';
|
||||
|
||||
@@ -35,12 +33,6 @@ import 'ng_meta_linker.dart';
|
||||
class DirectiveMetadataLinker extends Transformer implements LazyTransformer {
|
||||
final _encoder = const JsonEncoder.withIndent(' ');
|
||||
|
||||
final TransformerOptions options;
|
||||
final Map ngMetasCache = {};
|
||||
final Set<String> errorMessages = new Set<String>();
|
||||
|
||||
DirectiveMetadataLinker(this.options);
|
||||
|
||||
@override
|
||||
bool isPrimary(AssetId id) => id.path.endsWith(SUMMARY_META_EXTENSION);
|
||||
|
||||
@@ -55,11 +47,7 @@ class DirectiveMetadataLinker extends Transformer implements LazyTransformer {
|
||||
var primaryId = transform.primaryInput.id;
|
||||
|
||||
return linkDirectiveMetadata(
|
||||
new AssetReader.fromTransform(transform),
|
||||
primaryId,
|
||||
_ngLinkedAssetId(primaryId),
|
||||
options.resolvedIdentifiers,
|
||||
ngMetasCache).then((ngMeta) {
|
||||
new AssetReader.fromTransform(transform), primaryId).then((ngMeta) {
|
||||
if (ngMeta != null) {
|
||||
final outputId = _ngLinkedAssetId(primaryId);
|
||||
// Not outputting an asset could confuse barback.
|
||||
@@ -67,7 +55,7 @@ class DirectiveMetadataLinker extends Transformer implements LazyTransformer {
|
||||
transform.addOutput(new Asset.fromString(outputId, output));
|
||||
}
|
||||
});
|
||||
}, log: new DeduppingLogger(transform.logger, errorMessages));
|
||||
}, log: transform.logger);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,8 +5,7 @@ import 'dart:async';
|
||||
import 'package:analyzer/analyzer.dart';
|
||||
import 'package:barback/barback.dart' show AssetId;
|
||||
|
||||
import 'package:angular2/src/compiler/directive_metadata.dart'
|
||||
show CompileIdentifierMetadata, CompileProviderMetadata;
|
||||
import 'package:angular2/src/compiler/directive_metadata.dart' show CompileIdentifierMetadata;
|
||||
import 'package:angular2/src/compiler/template_compiler.dart';
|
||||
import 'package:angular2/src/transform/common/annotation_matcher.dart';
|
||||
import 'package:angular2/src/transform/common/asset_reader.dart';
|
||||
@@ -91,15 +90,13 @@ class _NgMetaVisitor extends Object with SimpleAstVisitor<Object> {
|
||||
|
||||
@override
|
||||
Object visitClassDeclaration(ClassDeclaration node) {
|
||||
_normalizations.add(_reader
|
||||
.readTypeMetadata(node, assetId)
|
||||
.then((compileMetadataWithIdentifier) {
|
||||
if (compileMetadataWithIdentifier != null) {
|
||||
_normalizations.add(
|
||||
_reader.readTypeMetadata(node, assetId).then((compileMetadataWithIdentifier) {
|
||||
if (compileMetadataWithIdentifier!= null) {
|
||||
ngMeta.identifiers[compileMetadataWithIdentifier.identifier.name] =
|
||||
compileMetadataWithIdentifier;
|
||||
} else {
|
||||
ngMeta.identifiers[node.name.name] = new CompileIdentifierMetadata(
|
||||
name: node.name.name, moduleUrl: toAssetUri(assetId));
|
||||
ngMeta.identifiers[node.name.name] = new CompileIdentifierMetadata(name: node.name.name, moduleUrl: toAssetUri(assetId));
|
||||
}
|
||||
}).catchError((err) {
|
||||
log.error('ERROR: $err', asset: assetId);
|
||||
@@ -117,8 +114,8 @@ class _NgMetaVisitor extends Object with SimpleAstVisitor<Object> {
|
||||
// angular/angular#1747 and angular/ts2dart#249 for context).
|
||||
outer: for (var variable in node.variables.variables) {
|
||||
if (variable.isConst) {
|
||||
final id = _reader.readIdentifierMetadata(variable, assetId);
|
||||
ngMeta.identifiers[variable.name.name] = id;
|
||||
ngMeta.identifiers[variable.name.name] =
|
||||
new CompileIdentifierMetadata(name: variable.name.name, moduleUrl: toAssetUri(assetId));
|
||||
}
|
||||
|
||||
var initializer = variable.initializer;
|
||||
@@ -130,6 +127,7 @@ class _NgMetaVisitor extends Object with SimpleAstVisitor<Object> {
|
||||
if (exp is! SimpleIdentifier) continue outer;
|
||||
otherNames.add(exp.name);
|
||||
}
|
||||
ngMeta.definesAlias = true;
|
||||
ngMeta.aliases[variable.name.name] = otherNames;
|
||||
}
|
||||
}
|
||||
@@ -138,33 +136,15 @@ class _NgMetaVisitor extends Object with SimpleAstVisitor<Object> {
|
||||
|
||||
@override
|
||||
Object visitFunctionTypeAlias(FunctionTypeAlias node) {
|
||||
ngMeta.identifiers[node.name.name] = new CompileIdentifierMetadata(
|
||||
name: node.name.name, moduleUrl: toAssetUri(assetId));
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
Object visitFunctionDeclaration(FunctionDeclaration node) {
|
||||
_normalizations.add(_reader
|
||||
.readFactoryMetadata(node, assetId)
|
||||
.then((compileMetadataWithIdentifier) {
|
||||
if (compileMetadataWithIdentifier != null) {
|
||||
ngMeta.identifiers[compileMetadataWithIdentifier.identifier.name] =
|
||||
compileMetadataWithIdentifier;
|
||||
} else {
|
||||
ngMeta.identifiers[node.name.name] = new CompileIdentifierMetadata(
|
||||
name: node.name.name, moduleUrl: toAssetUri(assetId));
|
||||
}
|
||||
}).catchError((err) {
|
||||
log.error('ERROR: $err', asset: assetId);
|
||||
}));
|
||||
ngMeta.identifiers[node.name.name] =
|
||||
new CompileIdentifierMetadata(name: node.name.name, moduleUrl: toAssetUri(assetId));
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
Object visitEnumDeclaration(EnumDeclaration node) {
|
||||
ngMeta.identifiers[node.name.name] = new CompileIdentifierMetadata(
|
||||
name: node.name.name, moduleUrl: toAssetUri(assetId));
|
||||
ngMeta.identifiers[node.name.name] =
|
||||
new CompileIdentifierMetadata(name: node.name.name, moduleUrl: toAssetUri(assetId));
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -123,8 +123,8 @@ class _CodegenState {
|
||||
|
||||
var names = new CodegenNameUtil(
|
||||
protoRecords, eventBindings, def.directiveRecords, '$genPrefix$_UTIL');
|
||||
var logic =
|
||||
new CodegenLogicUtil(names, '$genPrefix$_UTIL', '$genPrefix$_STATE');
|
||||
var logic = new CodegenLogicUtil(
|
||||
names, '$genPrefix$_UTIL', '$genPrefix$_STATE');
|
||||
return new _CodegenState._(
|
||||
genPrefix,
|
||||
def.id,
|
||||
|
||||
+112
-18
@@ -29,18 +29,20 @@ Future<CompileDataResults> createCompileData(
|
||||
AssetReader reader,
|
||||
AssetId assetId,
|
||||
List<String> platformDirectives,
|
||||
List<String> platformPipes) async {
|
||||
List<String> platformPipes,
|
||||
Map<String, String> resolvedIdentifiers
|
||||
) async {
|
||||
return logElapsedAsync(() async {
|
||||
final creator = await _CompileDataCreator.create(
|
||||
reader, assetId, platformDirectives, platformPipes);
|
||||
reader, assetId, platformDirectives, platformPipes, resolvedIdentifiers);
|
||||
return creator != null ? creator.createCompileData() : null;
|
||||
}, operationName: 'createCompileData', assetId: assetId);
|
||||
}
|
||||
|
||||
class CompileDataResults {
|
||||
final NgMeta ngMeta;
|
||||
final Map<ReflectionInfoModel, NormalizedComponentWithViewDirectives>
|
||||
viewDefinitions;
|
||||
final Map<ReflectionInfoModel,
|
||||
NormalizedComponentWithViewDirectives> viewDefinitions;
|
||||
|
||||
CompileDataResults._(this.ngMeta, this.viewDefinitions);
|
||||
}
|
||||
@@ -53,19 +55,20 @@ class _CompileDataCreator {
|
||||
final NgMeta ngMeta;
|
||||
final List<String> platformDirectives;
|
||||
final List<String> platformPipes;
|
||||
final Map<String, String> resolvedIdentifiers;
|
||||
|
||||
_CompileDataCreator(this.reader, this.entryPoint, this.ngMeta,
|
||||
this.platformDirectives, this.platformPipes);
|
||||
this.platformDirectives, this.platformPipes, this.resolvedIdentifiers);
|
||||
|
||||
static Future<_CompileDataCreator> create(AssetReader reader, AssetId assetId,
|
||||
List<String> platformDirectives, List<String> platformPipes) async {
|
||||
List<String> platformDirectives, List<String> platformPipes, Map<String, String> resolvedIdentifiers) async {
|
||||
if (!(await reader.hasInput(assetId))) return null;
|
||||
final json = await reader.readAsString(assetId);
|
||||
if (json == null || json.isEmpty) return null;
|
||||
|
||||
final ngMeta = new NgMeta.fromJson(JSON.decode(json));
|
||||
return new _CompileDataCreator(
|
||||
reader, assetId, ngMeta, platformDirectives, platformPipes);
|
||||
reader, assetId, ngMeta, platformDirectives, platformPipes, resolvedIdentifiers);
|
||||
}
|
||||
|
||||
NgDepsModel get ngDeps => ngMeta.ngDeps;
|
||||
@@ -81,15 +84,14 @@ class _CompileDataCreator {
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
if (!hasTemplate) return new CompileDataResults._(ngMeta, const {});
|
||||
|
||||
final compileData =
|
||||
<ReflectionInfoModel, NormalizedComponentWithViewDirectives>{};
|
||||
final ngMetaMap = await _extractNgMeta();
|
||||
final platformDirectives =
|
||||
await _readPlatformTypes(this.platformDirectives, 'directives');
|
||||
final platformPipes = await _readPlatformTypes(this.platformPipes, 'pipes');
|
||||
final ngMetaMap = await _extractNgMeta();
|
||||
|
||||
for (var reflectable in ngDeps.reflectables) {
|
||||
if (ngMeta.identifiers.containsKey(reflectable.name)) {
|
||||
@@ -107,6 +109,9 @@ class _CompileDataCreator {
|
||||
compileDatum.pipes
|
||||
.addAll(_resolveTypeMetadata(ngMetaMap, reflectable.pipes));
|
||||
compileData[reflectable] = compileDatum;
|
||||
|
||||
_resolveDiDependencyMetadata(ngMetaMap, compileDirectiveMetadata.type, compileDirectiveMetadata.type.diDeps);
|
||||
_resolveProviderMetadata(ngMetaMap, compileDirectiveMetadata);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -125,12 +130,11 @@ class _CompileDataCreator {
|
||||
return null;
|
||||
}
|
||||
final depNgMeta = ngMetaMap[dep.prefix];
|
||||
if (depNgMeta.aliases.containsKey(dep.name)) {
|
||||
resolvedMetadata.addAll(depNgMeta.flatten(dep.name));
|
||||
|
||||
} else if (depNgMeta.identifiers.containsKey(dep.name)) {
|
||||
if (depNgMeta.identifiers.containsKey(dep.name)) {
|
||||
resolvedMetadata.add(depNgMeta.identifiers[dep.name]);
|
||||
|
||||
} else if (depNgMeta.aliases.containsKey(dep.name)) {
|
||||
resolvedMetadata.addAll(depNgMeta.flatten(dep.name));
|
||||
} else {
|
||||
log.error(
|
||||
'Could not find Directive/Pipe entry for $dep. '
|
||||
@@ -143,6 +147,98 @@ class _CompileDataCreator {
|
||||
return resolvedMetadata;
|
||||
}
|
||||
|
||||
void _resolveProviderMetadata(Map<String, NgMeta> ngMetaMap, CompileDirectiveMetadata dirMeta) {
|
||||
final neededBy = dirMeta.type;
|
||||
|
||||
if (dirMeta.providers == null) return;
|
||||
|
||||
final resolvedProviders = [];
|
||||
for (var provider in dirMeta.providers) {
|
||||
final alias = _resolveAlias(ngMetaMap, neededBy, provider.token);
|
||||
if (alias != null) {
|
||||
resolvedProviders.addAll(alias.map((a) => new CompileProviderMetadata(token:a)));
|
||||
} else {
|
||||
provider.token = _resolveIdentifier(ngMetaMap, neededBy, provider.token);
|
||||
if (provider.useClass != null) {
|
||||
provider.useClass = _resolveIdentifier(ngMetaMap, neededBy, provider.useClass);
|
||||
}
|
||||
resolvedProviders.add(provider);
|
||||
}
|
||||
}
|
||||
|
||||
dirMeta.providers = resolvedProviders;
|
||||
}
|
||||
|
||||
void _resolveDiDependencyMetadata(
|
||||
Map<String, NgMeta> ngMetaMap,CompileTypeMetadata neededBy, List<CompileDiDependencyMetadata> deps) {
|
||||
if (deps == null) return;
|
||||
for (var dep in deps) {
|
||||
dep.token = _resolveIdentifier(ngMetaMap, neededBy, dep.token);
|
||||
if (dep.query != null) {
|
||||
dep.query.selectors = dep.query.selectors.map((s) => _resolveIdentifier(ngMetaMap, neededBy, s)).toList();
|
||||
}
|
||||
if (dep.viewQuery != null) {
|
||||
dep.viewQuery.selectors = dep.viewQuery.selectors.map((s) => _resolveIdentifier(ngMetaMap, neededBy, s)).toList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dynamic _resolveAlias(Map<String, NgMeta> ngMetaMap, CompileTypeMetadata neededBy, dynamic id) {
|
||||
if (id is String || id == null) return null;
|
||||
|
||||
final prefix = id.prefix == null ? "" : id.prefix;
|
||||
|
||||
if (!ngMetaMap.containsKey(prefix)) {
|
||||
log.error(
|
||||
'Missing prefix "${prefix}" '
|
||||
'needed by "${neededBy.name}" from metadata map',
|
||||
asset: entryPoint);
|
||||
return null;
|
||||
}
|
||||
|
||||
final depNgMeta = ngMetaMap[prefix];
|
||||
if (depNgMeta.aliases.containsKey(id.name)) {
|
||||
return depNgMeta.flatten(id.name);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
dynamic _resolveIdentifier(Map<String, NgMeta> ngMetaMap, CompileTypeMetadata neededBy, dynamic id) {
|
||||
if (id is String || id == null) return id;
|
||||
|
||||
final prefix = id.prefix == null ? "" : id.prefix;
|
||||
|
||||
if (!ngMetaMap.containsKey(prefix)) {
|
||||
log.error(
|
||||
'Missing prefix "${prefix}" '
|
||||
'needed by "${neededBy.name}" from metadata map',
|
||||
asset: entryPoint);
|
||||
return null;
|
||||
}
|
||||
|
||||
final depNgMeta = ngMetaMap[prefix];
|
||||
if (depNgMeta.identifiers.containsKey(id.name)) {
|
||||
return depNgMeta.identifiers[id.name];
|
||||
|
||||
} else if (_isPrimitive(id.name)) {
|
||||
return id;
|
||||
|
||||
} else if (resolvedIdentifiers != null && resolvedIdentifiers.containsKey(id.name)) {
|
||||
return new CompileIdentifierMetadata(name: id.name, moduleUrl: resolvedIdentifiers[id.name]);
|
||||
|
||||
} else {
|
||||
log.error(
|
||||
'Missing identifier "${id.name}" '
|
||||
'needed by "${neededBy.name}" from metadata map',
|
||||
asset: entryPoint);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
bool _isPrimitive(String typeName) =>
|
||||
typeName == "String" || typeName == "Object" || typeName == "num" || typeName == "int" || typeName == "double" || typeName == "bool";
|
||||
|
||||
Future<List<dynamic>> _readPlatformTypes(
|
||||
List<String> inputPlatformTypes, String configOption) async {
|
||||
if (inputPlatformTypes == null) return const [];
|
||||
@@ -170,12 +266,10 @@ class _CompileDataCreator {
|
||||
if (jsonString != null && jsonString.isNotEmpty) {
|
||||
var newMetadata = new NgMeta.fromJson(JSON.decode(jsonString));
|
||||
|
||||
if (newMetadata.aliases.containsKey(token)) {
|
||||
return newMetadata.flatten(token);
|
||||
|
||||
} else if (newMetadata.identifiers.containsKey(token)) {
|
||||
if (newMetadata.identifiers.containsKey(token)) {
|
||||
return [newMetadata.identifiers[token]];
|
||||
|
||||
} else if (newMetadata.aliases.containsKey(token)) {
|
||||
return newMetadata.flatten(token);
|
||||
} else {
|
||||
log.warning('Could not resolve platform type ${token} in ${uri}',
|
||||
asset: metaAssetId);
|
||||
|
||||
@@ -44,7 +44,7 @@ Future<Outputs> processTemplates(AssetReader reader, AssetId assetId,
|
||||
Map<String, String> resolvedIdentifiers
|
||||
}) async {
|
||||
var viewDefResults = await createCompileData(
|
||||
reader, assetId, platformDirectives, platformPipes);
|
||||
reader, assetId, platformDirectives, platformPipes, resolvedIdentifiers);
|
||||
if (viewDefResults == null) return null;
|
||||
final compileTypeMetadatas = viewDefResults.ngMeta.identifiers.values;
|
||||
if (compileTypeMetadatas.isNotEmpty) {
|
||||
@@ -106,4 +106,4 @@ class Outputs {
|
||||
final SourceModule templatesSource;
|
||||
|
||||
Outputs._(this.ngDeps, this.templatesSource);
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,7 @@ class AngularTransformerGroup extends TransformerGroup {
|
||||
} else {
|
||||
phases = [
|
||||
[new DirectiveProcessor(options)],
|
||||
[new DirectiveMetadataLinker(options)],
|
||||
[new DirectiveMetadataLinker()],
|
||||
[new ReflectionRemover(options)],
|
||||
[
|
||||
new DeferredRewriter(),
|
||||
|
||||
@@ -39,7 +39,7 @@ class CodegenTransformer extends TransformerGroup {
|
||||
} else {
|
||||
phases = [
|
||||
[new DirectiveProcessor(options)],
|
||||
[new DirectiveMetadataLinker(options)],
|
||||
[new DirectiveMetadataLinker()],
|
||||
[new StylesheetCompiler(), new TemplateCompiler(options),],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -82,4 +82,4 @@ CompileDirectiveMetadata createBaz([String moduleBase = 'asset:a']) =>
|
||||
name: 'BazComponent',
|
||||
moduleUrl: '$moduleBase/export_cycle_files/baz.dart',
|
||||
selector: 'baz',
|
||||
template: 'Baz');
|
||||
template: 'Baz');
|
||||
@@ -55,8 +55,7 @@ void allTests() {
|
||||
a.aliases['a3'] = ['T3', 'a2'];
|
||||
a.aliases['a4'] = ['a3', 'T0'];
|
||||
|
||||
expect(a.flatten('a4'),
|
||||
equals([mockDirMetadata[3], mockDirMetadata[1], mockDirMetadata[0]]));
|
||||
expect(a.flatten('a4'), equals([mockDirMetadata[3], mockDirMetadata[1], mockDirMetadata[0]]));
|
||||
});
|
||||
|
||||
test('should detect cycles.', () {
|
||||
@@ -65,10 +64,7 @@ void allTests() {
|
||||
a.aliases['a1'] = ['T0', 'a2'];
|
||||
a.aliases['a2'] = ['a1'];
|
||||
|
||||
expect(
|
||||
() => a.flatten('a1'),
|
||||
throwsA(predicate((ex) =>
|
||||
new RegExp('Cycle: a1 -> a2 -> a1.').hasMatch(ex.message))));
|
||||
expect(() => a.flatten('a1'), throwsA(predicate((ex) => new RegExp('Cycle: a1 -> a2 -> a1.').hasMatch(ex.message))));
|
||||
});
|
||||
|
||||
test('should allow duplicates.', () {
|
||||
@@ -102,38 +98,6 @@ void allTests() {
|
||||
expect(a.aliases['b'], equals(['y']));
|
||||
});
|
||||
});
|
||||
|
||||
group('needsResolution', () {
|
||||
test('should be true if there is a provider', () {
|
||||
var a = new NgMeta.empty();
|
||||
a.identifiers["MyIdentifier"] = new CompileIdentifierMetadata(name: 'MyIdentifier', value: new CompileProviderMetadata());
|
||||
expect(a.needsResolution, isTrue);
|
||||
});
|
||||
|
||||
test('should be true if there is an injectable service', () {
|
||||
var a = new NgMeta.empty();
|
||||
a.identifiers["MyIdentifier"] = new CompileTypeMetadata();
|
||||
expect(a.needsResolution, isTrue);
|
||||
});
|
||||
|
||||
test('should be true if there is an directive', () {
|
||||
var a = new NgMeta.empty();
|
||||
a.identifiers["MyIdentifier"] = new CompileDirectiveMetadata();
|
||||
expect(a.needsResolution, isTrue);
|
||||
});
|
||||
|
||||
test('should be true if there is a pipe', () {
|
||||
var a = new NgMeta.empty();
|
||||
a.identifiers["MyIdentifier"] = new CompilePipeMetadata();
|
||||
expect(a.needsResolution, isTrue);
|
||||
});
|
||||
|
||||
test('should be false otherwise', () {
|
||||
var a = new NgMeta.empty();
|
||||
a.identifiers["MyIdentifier"] = "some value";
|
||||
expect(a.needsResolution, isFalse);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
_checkSimilar(NgMeta a, NgMeta b) {
|
||||
|
||||
@@ -41,10 +41,6 @@ class TestAssetReader implements AssetReader {
|
||||
return new Future.value(exists);
|
||||
}
|
||||
|
||||
void clear() {
|
||||
this._overrideAssets.clear();
|
||||
}
|
||||
|
||||
void addAsset(AssetId id, String contents) {
|
||||
_overrideAssets[id] = contents;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -4,7 +4,7 @@ import 'package:angular2/angular2.dart' show Injectable;
|
||||
|
||||
@Injectable()
|
||||
abstract class Service {
|
||||
factory Service() {
|
||||
factory Service(){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
+14
-142
@@ -1,7 +1,7 @@
|
||||
library angular2.test.transform.directive_processor.directive_files.components;
|
||||
|
||||
import 'package:angular2/angular2.dart'
|
||||
show Component, Directive, View, NgElement, Output, Input, Provider, ContentChild, ContentChildren, ViewChild, ViewChildren;
|
||||
show Component, Directive, View, NgElement, Output, Input, Provider;
|
||||
import 'dep1.dart';
|
||||
import 'dep2.dart' as dep2;
|
||||
|
||||
@@ -91,24 +91,6 @@ class ComponentWithHostListeners {
|
||||
providers: [ServiceDep, dep2.ServiceDep])
|
||||
class ComponentWithProvidersTypes {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-view-providers-types',
|
||||
template: '',
|
||||
viewProviders: [ServiceDep])
|
||||
class ComponentWithViewProvidersTypes {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-bindings-types',
|
||||
template: '',
|
||||
bindings: [ServiceDep])
|
||||
class ComponentWithBindingsTypes {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-view-bindings-types',
|
||||
template: '',
|
||||
viewBindings: [ServiceDep])
|
||||
class ComponentWithViewBindingsTypes {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-string-token',
|
||||
template: '',
|
||||
@@ -129,135 +111,25 @@ class ComponentWithProvidersConstToken {
|
||||
providers: [const Provider(ServiceDep, useClass: ServiceDep)])
|
||||
class ComponentWithProvidersUseClass {}
|
||||
|
||||
@Component(selector: 'component-with-di-deps', template: '')
|
||||
@Component(
|
||||
selector: 'component-with-di-deps',
|
||||
template: '')
|
||||
class ComponentWithDiDeps {
|
||||
ServiceDep arg11;
|
||||
ServiceDep arg13;
|
||||
|
||||
ComponentWithDiDeps(
|
||||
ServiceDep arg1,
|
||||
@Inject(ServiceDep) arg2,
|
||||
@Attribute('one') arg3,
|
||||
@Self() ServiceDep arg4,
|
||||
@SkipSelf() ServiceDep arg5,
|
||||
@Optional() ServiceDep arg6,
|
||||
@Query(ServiceDep, descendants: true) arg7,
|
||||
@ContentChildren(ServiceDep) arg8,
|
||||
@ViewQuery("one,two") arg9,
|
||||
@ViewChildren("one,two") arg10,
|
||||
this.arg11,
|
||||
[@Optional() ServiceDep arg12,
|
||||
@Optional() this.arg13]
|
||||
ServiceDep arg1,
|
||||
@Inject(ServiceDep) arg2,
|
||||
@Attribute('one') arg3,
|
||||
@Self() ServiceDep arg4,
|
||||
@SkipSelf() ServiceDep arg5,
|
||||
@Optional() ServiceDep arg6,
|
||||
@Query(ServiceDep, descendants:true) arg6,
|
||||
@ViewQuery("one,two") arg7
|
||||
);
|
||||
}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-use-class',
|
||||
template: '',
|
||||
providers: [const Provider(ServiceDep, useClass: ServiceDep)])
|
||||
class ComponentWithProvidersUseClass {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-to-class',
|
||||
template: '',
|
||||
providers: [const Binding(ServiceDep, toClass: ServiceDep)])
|
||||
class ComponentWithProvidersToClass {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-use-existing',
|
||||
template: '',
|
||||
providers: [const Provider(ServiceDep, useExisting: ServiceDep)])
|
||||
class ComponentWithProvidersUseExisting {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-to-alias',
|
||||
template: '',
|
||||
providers: [const Binding(ServiceDep, toAlias: ServiceDep)])
|
||||
class ComponentWithProvidersToAlias {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-use-existing-string',
|
||||
template: '',
|
||||
providers: [const Provider(ServiceDep, useExisting: 'StrToken')])
|
||||
class ComponentWithProvidersUseExistingStr {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-use-value',
|
||||
template: '',
|
||||
providers: [const Provider(ServiceDep, useValue: ServiceDep)])
|
||||
class ComponentWithProvidersUseValue {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-to-value',
|
||||
template: '',
|
||||
providers: [const Binding(ServiceDep, toValue: ServiceDep)])
|
||||
class ComponentWithProvidersToValue {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-use-value-string',
|
||||
template: '',
|
||||
providers: [const Provider(ServiceDep, useValue: 'StrToken')])
|
||||
class ComponentWithProvidersUseValueStr {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-use-value-num',
|
||||
template: '',
|
||||
providers: [const Provider(ServiceDep, useValue: 42)])
|
||||
class ComponentWithProvidersUseValueNum {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-use-value-bool',
|
||||
template: '',
|
||||
providers: [const Provider(ServiceDep, useValue: true)])
|
||||
class ComponentWithProvidersUseValueBool {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-use-value-null',
|
||||
template: '',
|
||||
providers: [const Provider(ServiceDep, useValue: null)])
|
||||
class ComponentWithProvidersUseValueNull {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-use-factory',
|
||||
template: '',
|
||||
providers: [
|
||||
const Provider(ServiceDep, useFactory: funcDep, deps: const [
|
||||
ServiceDep,
|
||||
"Str",
|
||||
[const Inject(ServiceDep)],
|
||||
[ServiceDep, const Self()],
|
||||
[ServiceDep, const SkipSelf()],
|
||||
[ServiceDep, const Optional()]
|
||||
])
|
||||
])
|
||||
class ComponentWithProvidersUseFactory {}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-providers-to-factory',
|
||||
template: '',
|
||||
providers: [const Binding(ServiceDep, toFactory: funcDep)])
|
||||
class ComponentWithProvidersToFactory {}
|
||||
|
||||
@Component(selector: 'component-with-di-deps-string-token', template: '')
|
||||
selector: 'component-with-di-deps-string-token',
|
||||
template: '')
|
||||
class ComponentWithDiDepsStrToken {
|
||||
ComponentWithDiDepsStrToken(@Inject("StringDep") arg1);
|
||||
}
|
||||
|
||||
@Component(
|
||||
selector: 'component-with-queries',
|
||||
template: '')
|
||||
class ComponentWithQueries {
|
||||
@ContentChild('child') var contentChild;
|
||||
@ContentChildren('child', descendants: true) var contentChildren;
|
||||
|
||||
@ViewChild('child') var viewChild;
|
||||
@ViewChildren('child') var viewChildren;
|
||||
|
||||
@ContentChild('child') set contentChildSetter(s){}
|
||||
@ContentChildren('child', descendants: true) set contentChildrenSetter(s){}
|
||||
|
||||
@ViewChild('child') set viewChildSetter(s){}
|
||||
@ViewChildren('child') set viewChildrenSetter(s){}
|
||||
}
|
||||
|
||||
funcDep() {}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user