diff --git a/tools/@angular/tsc-wrapped/src/collector.ts b/tools/@angular/tsc-wrapped/src/collector.ts index affe5eda8e..cc370e4315 100644 --- a/tools/@angular/tsc-wrapped/src/collector.ts +++ b/tools/@angular/tsc-wrapped/src/collector.ts @@ -128,6 +128,12 @@ export class MetadataCollector { }); } + // Add arity if the type is generic + const typeParameters = classDeclaration.typeParameters; + if (typeParameters && typeParameters.length) { + result.arity = typeParameters.length; + } + // Add class decorators if (classDeclaration.decorators) { result.decorators = getDecorators(classDeclaration.decorators); diff --git a/tools/@angular/tsc-wrapped/src/schema.ts b/tools/@angular/tsc-wrapped/src/schema.ts index 05c2e48ac7..aa1649969a 100644 --- a/tools/@angular/tsc-wrapped/src/schema.ts +++ b/tools/@angular/tsc-wrapped/src/schema.ts @@ -37,6 +37,7 @@ export interface ModuleExportMetadata { export interface ClassMetadata { __symbolic: 'class'; extends?: MetadataSymbolicExpression|MetadataError; + arity?: number; decorators?: (MetadataSymbolicExpression|MetadataError)[]; members?: MetadataMap; statics?: {[name: string]: MetadataValue | FunctionMetadata}; diff --git a/tools/@angular/tsc-wrapped/test/collector.spec.ts b/tools/@angular/tsc-wrapped/test/collector.spec.ts index 8ad1e39c8d..f4dec8aa24 100644 --- a/tools/@angular/tsc-wrapped/test/collector.spec.ts +++ b/tools/@angular/tsc-wrapped/test/collector.spec.ts @@ -9,7 +9,7 @@ import * as ts from 'typescript'; import {MetadataCollector} from '../src/collector'; -import {ClassMetadata, ConstructorMetadata, ModuleMetadata} from '../src/schema'; +import {ClassMetadata, ConstructorMetadata, MetadataEntry, ModuleMetadata, isClassMetadata} from '../src/schema'; import {Directory, Host, expectValidSources} from './typescript.mocks'; @@ -28,6 +28,7 @@ describe('Collector', () => { '/promise.ts', '/unsupported-1.ts', '/unsupported-2.ts', + 'class-arity.ts', 'import-star.ts', 'exported-classes.ts', 'exported-functions.ts', @@ -666,6 +667,27 @@ describe('Collector', () => { } }); }); + + function expectClass(entry: MetadataEntry): entry is ClassMetadata { + const result = isClassMetadata(entry); + expect(result).toBeTruthy(); + return result; + } + + it('should collect the correct arity for a class', () => { + const metadata = collector.getMetadata(program.getSourceFile('/class-arity.ts')); + + const zero = metadata.metadata['Zero']; + if (expectClass(zero)) expect(zero.arity).toBeUndefined(); + const one = metadata.metadata['One']; + if (expectClass(one)) expect(one.arity).toBe(1); + const two = metadata.metadata['Two']; + if (expectClass(two)) expect(two.arity).toBe(2); + const three = metadata.metadata['Three']; + if (expectClass(three)) expect(three.arity).toBe(3); + const nine = metadata.metadata['Nine']; + if (expectClass(nine)) expect(nine.arity).toBe(9); + }); }); function override(fileName: string, content: string) { @@ -867,6 +889,13 @@ const FILES: Directory = { declare var Promise: PromiseConstructor; `, + 'class-arity.ts': ` + export class Zero {} + export class One {} + export class Two {} + export class Three {} + export class Nine {} + `, 'unsupported-1.ts': ` export let {a, b} = {a: 1, b: 2}; export let [c, d] = [1, 2];