Use the element type annotated on the setter when doing indexed sets

This commit is contained in:
dcodeIO
2018-04-23 16:17:33 +02:00
parent 78a3dcfaf0
commit 88b00c1689
7 changed files with 1499 additions and 2258 deletions

View File

@ -4281,15 +4281,24 @@ export class Compiler extends DiagnosticEmitter {
}
case ElementKind.CLASS: {
if (program.resolvedElementExpression) { // indexed access
let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET);
if (!indexedGet) {
this.error(
DiagnosticCode.Index_signature_is_missing_in_type_0,
expression.range, (<Class>target).internalName
);
let indexedSet = (<Class>target).lookupOverload(OperatorKind.INDEXED_SET);
if (!indexedSet) {
let indexedGet = (<Class>target).lookupOverload(OperatorKind.INDEXED_GET);
if (!indexedGet) {
this.error(
DiagnosticCode.Index_signature_is_missing_in_type_0,
expression.range, (<Class>target).internalName
);
} else {
this.error(
DiagnosticCode.Index_signature_in_type_0_only_permits_reading,
expression.range, (<Class>target).internalName
);
}
return this.module.createUnreachable();
}
elementType = indexedGet.signature.returnType;
assert(indexedSet.signature.parameterTypes.length == 2); // parser must guarantee this
elementType = indexedSet.signature.parameterTypes[1]; // 2nd parameter is the element
break;
}
// fall-through