Check return code paths on getters (#10102)

* Check return paths on getters

* Remove TODO comment
This commit is contained in:
Wesley Wigham
2016-08-19 13:34:06 -07:00
committed by GitHub
parent 7f6e36c7e1
commit 0168ab2051
4 changed files with 99 additions and 7 deletions

View File

@@ -14126,12 +14126,7 @@ namespace ts {
checkSignatureDeclaration(node);
if (node.kind === SyntaxKind.GetAccessor) {
if (!isInAmbientContext(node) && nodeIsPresent(node.body) && (node.flags & NodeFlags.HasImplicitReturn)) {
if (node.flags & NodeFlags.HasExplicitReturn) {
if (compilerOptions.noImplicitReturns) {
error(node.name, Diagnostics.Not_all_code_paths_return_a_value);
}
}
else {
if (!(node.flags & NodeFlags.HasExplicitReturn)) {
error(node.name, Diagnostics.A_get_accessor_must_return_a_value);
}
}
@@ -14161,7 +14156,10 @@ namespace ts {
checkAccessorDeclarationTypesIdentical(node, otherAccessor, getThisTypeOfDeclaration, Diagnostics.get_and_set_accessor_must_have_the_same_this_type);
}
}
getTypeOfAccessors(getSymbolOfNode(node));
const returnType = getTypeOfAccessors(getSymbolOfNode(node));
if (node.kind === SyntaxKind.GetAccessor) {
checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnType);
}
}
if (node.parent.kind !== SyntaxKind.ObjectLiteralExpression) {
checkSourceElement(node.body);

View File

@@ -0,0 +1,27 @@
tests/cases/compiler/getterControlFlowStrictNull.ts(2,9): error TS2366: Function lacks ending return statement and return type does not include 'undefined'.
tests/cases/compiler/getterControlFlowStrictNull.ts(11,14): error TS2366: Function lacks ending return statement and return type does not include 'undefined'.
==== tests/cases/compiler/getterControlFlowStrictNull.ts (2 errors) ====
class A {
a(): string | null {
~~~~~~~~~~~~~
!!! error TS2366: Function lacks ending return statement and return type does not include 'undefined'.
if (Math.random() > 0.5) {
return '';
}
// it does error here as expected
}
}
class B {
get a(): string | null {
~~~~~~~~~~~~~
!!! error TS2366: Function lacks ending return statement and return type does not include 'undefined'.
if (Math.random() > 0.5) {
return '';
}
// it should error here because it returns undefined
}
}

View File

@@ -0,0 +1,47 @@
//// [getterControlFlowStrictNull.ts]
class A {
a(): string | null {
if (Math.random() > 0.5) {
return '';
}
// it does error here as expected
}
}
class B {
get a(): string | null {
if (Math.random() > 0.5) {
return '';
}
// it should error here because it returns undefined
}
}
//// [getterControlFlowStrictNull.js]
var A = (function () {
function A() {
}
A.prototype.a = function () {
if (Math.random() > 0.5) {
return '';
}
// it does error here as expected
};
return A;
}());
var B = (function () {
function B() {
}
Object.defineProperty(B.prototype, "a", {
get: function () {
if (Math.random() > 0.5) {
return '';
}
// it should error here because it returns undefined
},
enumerable: true,
configurable: true
});
return B;
}());

View File

@@ -0,0 +1,20 @@
//@strictNullChecks: true
//@target: ES5
class A {
a(): string | null {
if (Math.random() > 0.5) {
return '';
}
// it does error here as expected
}
}
class B {
get a(): string | null {
if (Math.random() > 0.5) {
return '';
}
// it should error here because it returns undefined
}
}