@@ -3171,8 +3171,8 @@ namespace ts {
31713171 members = createInstantiatedSymbolTable(source.declaredProperties, mapper, /*mappingThisOnly*/ typeParameters.length === 1);
31723172 callSignatures = instantiateList(source.declaredCallSignatures, mapper, instantiateSignature);
31733173 constructSignatures = instantiateList(source.declaredConstructSignatures, mapper, instantiateSignature);
3174- stringIndexType = source.declaredStringIndexType ? instantiateType(source.declaredStringIndexType, mapper) : undefined ;
3175- numberIndexType = source.declaredNumberIndexType ? instantiateType(source.declaredNumberIndexType, mapper) : undefined ;
3174+ stringIndexType = instantiateType(source.declaredStringIndexType, mapper);
3175+ numberIndexType = instantiateType(source.declaredNumberIndexType, mapper);
31763176 }
31773177 let baseTypes = getBaseTypes(source);
31783178 if (baseTypes.length) {
@@ -3371,15 +3371,22 @@ namespace ts {
33713371 setObjectTypeMembers(type, emptySymbols, callSignatures, constructSignatures, stringIndexType, numberIndexType);
33723372 }
33733373
3374- function resolveAnonymousTypeMembers(type: ObjectType ) {
3374+ function resolveAnonymousTypeMembers(type: AnonymousType ) {
33753375 let symbol = type.symbol;
33763376 let members: SymbolTable;
33773377 let callSignatures: Signature[];
33783378 let constructSignatures: Signature[];
33793379 let stringIndexType: Type;
33803380 let numberIndexType: Type;
33813381
3382- if (symbol.flags & SymbolFlags.TypeLiteral) {
3382+ if (type.target) {
3383+ members = createInstantiatedSymbolTable(getPropertiesOfObjectType(type.target), type.mapper, /*mappingThisOnly*/ false);
3384+ callSignatures = instantiateList(getSignaturesOfType(type.target, SignatureKind.Call), type.mapper, instantiateSignature);
3385+ constructSignatures = instantiateList(getSignaturesOfType(type.target, SignatureKind.Construct), type.mapper, instantiateSignature);
3386+ stringIndexType = instantiateType(getIndexTypeOfType(type.target, IndexKind.String), type.mapper);
3387+ numberIndexType = instantiateType(getIndexTypeOfType(type.target, IndexKind.Number), type.mapper);
3388+ }
3389+ else if (symbol.flags & SymbolFlags.TypeLiteral) {
33833390 members = symbol.members;
33843391 callSignatures = getSignaturesOfSymbol(members["__call"]);
33853392 constructSignatures = getSignaturesOfSymbol(members["__new"]);
@@ -3424,7 +3431,7 @@ namespace ts {
34243431 resolveClassOrInterfaceMembers(<InterfaceType>type);
34253432 }
34263433 else if (type.flags & TypeFlags.Anonymous) {
3427- resolveAnonymousTypeMembers(<ObjectType >type);
3434+ resolveAnonymousTypeMembers(<AnonymousType >type);
34283435 }
34293436 else if (type.flags & TypeFlags.Tuple) {
34303437 resolveTupleTypeMembers(<TupleType>type);
@@ -4543,7 +4550,7 @@ namespace ts {
45434550 }
45444551 let result = createSignature(signature.declaration, freshTypeParameters,
45454552 instantiateList(signature.parameters, mapper, instantiateSymbol),
4546- signature.resolvedReturnType ? instantiateType(signature.resolvedReturnType, mapper) : undefined ,
4553+ instantiateType(signature.resolvedReturnType, mapper),
45474554 freshTypePredicate,
45484555 signature.minArgumentCount, signature.hasRestParameter, signature.hasStringLiterals);
45494556 result.target = signature;
@@ -4575,7 +4582,7 @@ namespace ts {
45754582 return result;
45764583 }
45774584
4578- function instantiateAnonymousType(type: ObjectType , mapper: TypeMapper): ObjectType {
4585+ function instantiateAnonymousType(type: AnonymousType , mapper: TypeMapper): ObjectType {
45794586 if (mapper.instantiations) {
45804587 let cachedType = mapper.instantiations[type.id];
45814588 if (cachedType) {
@@ -4586,27 +4593,21 @@ namespace ts {
45864593 mapper.instantiations = [];
45874594 }
45884595 // Mark the anonymous type as instantiated such that our infinite instantiation detection logic can recognize it
4589- let result = <ResolvedType>createObjectType(TypeFlags.Anonymous | TypeFlags.Instantiated, type.symbol);
4590- result.properties = instantiateList(getPropertiesOfObjectType(type), mapper, instantiateSymbol);
4591- result.members = createSymbolTable(result.properties);
4592- result.callSignatures = instantiateList(getSignaturesOfType(type, SignatureKind.Call), mapper, instantiateSignature);
4593- result.constructSignatures = instantiateList(getSignaturesOfType(type, SignatureKind.Construct), mapper, instantiateSignature);
4594- let stringIndexType = getIndexTypeOfType(type, IndexKind.String);
4595- let numberIndexType = getIndexTypeOfType(type, IndexKind.Number);
4596- if (stringIndexType) result.stringIndexType = instantiateType(stringIndexType, mapper);
4597- if (numberIndexType) result.numberIndexType = instantiateType(numberIndexType, mapper);
4596+ let result = <AnonymousType>createObjectType(TypeFlags.Anonymous | TypeFlags.Instantiated, type.symbol);
4597+ result.target = type;
4598+ result.mapper = mapper;
45984599 mapper.instantiations[type.id] = result;
45994600 return result;
46004601 }
46014602
46024603 function instantiateType(type: Type, mapper: TypeMapper): Type {
4603- if (mapper !== identityMapper) {
4604+ if (type && mapper !== identityMapper) {
46044605 if (type.flags & TypeFlags.TypeParameter) {
46054606 return mapper(<TypeParameter>type);
46064607 }
46074608 if (type.flags & TypeFlags.Anonymous) {
46084609 return type.symbol && type.symbol.flags & (SymbolFlags.Function | SymbolFlags.Method | SymbolFlags.Class | SymbolFlags.TypeLiteral | SymbolFlags.ObjectLiteral) ?
4609- instantiateAnonymousType(<ObjectType >type, mapper) : type;
4610+ instantiateAnonymousType(<AnonymousType >type, mapper) : type;
46104611 }
46114612 if (type.flags & TypeFlags.Reference) {
46124613 return createTypeReference((<TypeReference>type).target, instantiateList((<TypeReference>type).typeArguments, mapper, instantiateType));
@@ -7631,7 +7632,9 @@ namespace ts {
76317632 // Look up the value in the current scope
76327633 if (valueSymbol && valueSymbol !== unknownSymbol) {
76337634 links.jsxFlags |= JsxFlags.ClassElement;
7634- getSymbolLinks(valueSymbol).referenced = true;
7635+ if (valueSymbol.flags & SymbolFlags.Alias) {
7636+ markAliasSymbolAsReferenced(valueSymbol);
7637+ }
76357638 }
76367639
76377640 return valueSymbol || unknownSymbol;
@@ -8564,6 +8567,12 @@ namespace ts {
85648567 case SyntaxKind.SetAccessor:
85658568 // A method or accessor declaration decorator will have two or three arguments (see
85668569 // `PropertyDecorator` and `MethodDecorator` in core.d.ts)
8570+
8571+ // If we are emitting decorators for ES3, we will only pass two arguments.
8572+ if (languageVersion === ScriptTarget.ES3) {
8573+ return 2;
8574+ }
8575+
85678576 // If the method decorator signature only accepts a target and a key, we will only
85688577 // type check those arguments.
85698578 return signature.parameters.length >= 3 ? 3 : 2;
@@ -14917,9 +14926,6 @@ namespace ts {
1491714926 if (!nodeCanBeDecorated(node)) {
1491814927 return grammarErrorOnFirstToken(node, Diagnostics.Decorators_are_not_valid_here);
1491914928 }
14920- else if (languageVersion < ScriptTarget.ES5) {
14921- return grammarErrorOnFirstToken(node, Diagnostics.Decorators_are_only_available_when_targeting_ECMAScript_5_and_higher);
14922- }
1492314929 else if (node.kind === SyntaxKind.GetAccessor || node.kind === SyntaxKind.SetAccessor) {
1492414930 let accessors = getAllAccessorDeclarations((<ClassDeclaration>node.parent).members, <AccessorDeclaration>node);
1492514931 if (accessors.firstAccessor.decorators && node === accessors.secondAccessor) {
0 commit comments