Merge pull request #9574 from Microsoft/fix-union-of-salsa-property-types

Fix type union of differing Salsa assignment-properties
This commit is contained in:
Nathan Shively-Sanders 2016-07-11 11:29:02 -07:00 committed by GitHub
commit 135cc12218
5 changed files with 84 additions and 11 deletions

View file

@ -3166,17 +3166,17 @@ namespace ts {
}
let type: Type = undefined;
// Handle module.exports = expr or this.p = expr
if (declaration.kind === SyntaxKind.BinaryExpression) {
type = getUnionType(map(symbol.declarations, (decl: BinaryExpression) => checkExpressionCached(decl.right)));
}
else if (declaration.kind === SyntaxKind.PropertyAccessExpression) {
// Declarations only exist for property access expressions for certain
// special assignment kinds
if (declaration.parent.kind === SyntaxKind.BinaryExpression) {
// Handle exports.p = expr or className.prototype.method = expr
type = checkExpressionCached((<BinaryExpression>declaration.parent).right);
}
// Handle certain special assignment kinds, which happen to union across multiple declarations:
// * module.exports = expr
// * exports.p = expr
// * this.p = expr
// * className.prototype.method = expr
if (declaration.kind === SyntaxKind.BinaryExpression ||
declaration.kind === SyntaxKind.PropertyAccessExpression && declaration.parent.kind === SyntaxKind.BinaryExpression) {
type = getUnionType(map(symbol.declarations,
decl => decl.kind === SyntaxKind.BinaryExpression ?
checkExpressionCached((<BinaryExpression>decl).right) :
checkExpressionCached((<BinaryExpression>decl.parent).right)));
}
if (type === undefined) {

View file

@ -0,0 +1,17 @@
//// [input.js]
function C() {
this.m = null;
}
C.prototype.m = function() {
this.nothing();
};
//// [output.js]
function C() {
this.m = null;
}
C.prototype.m = function () {
this.nothing();
};

View file

@ -0,0 +1,17 @@
=== tests/cases/conformance/salsa/input.js ===
function C() {
>C : Symbol(C, Decl(input.js, 0, 0))
this.m = null;
>m : Symbol(C.m, Decl(input.js, 1, 14), Decl(input.js, 3, 1))
}
C.prototype.m = function() {
>C.prototype : Symbol(C.m, Decl(input.js, 1, 14), Decl(input.js, 3, 1))
>C : Symbol(C, Decl(input.js, 0, 0))
>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --))
>m : Symbol(C.m, Decl(input.js, 1, 14), Decl(input.js, 3, 1))
this.nothing();
};

View file

@ -0,0 +1,29 @@
=== tests/cases/conformance/salsa/input.js ===
function C() {
>C : () => void
this.m = null;
>this.m = null : null
>this.m : any
>this : any
>m : any
>null : null
}
C.prototype.m = function() {
>C.prototype.m = function() { this.nothing();} : () => void
>C.prototype.m : any
>C.prototype : any
>C : () => void
>prototype : any
>m : any
>function() { this.nothing();} : () => void
this.nothing();
>this.nothing() : any
>this.nothing : any
>this : { m: () => void; }
>nothing : any
};

View file

@ -0,0 +1,10 @@
// @filename: input.js
// @out: output.js
// @allowJs: true
function C() {
this.m = null;
}
C.prototype.m = function() {
this.nothing();
};