From 052a3d9d73a009e11f26fa8ba99f6e72c63b5e6d Mon Sep 17 00:00:00 2001
From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com>
Date: Thu, 5 Sep 2019 16:16:35 -0700
Subject: [PATCH] Infer void from expr statement usage, not calls
This makes inferences a lot better.
---
src/services/codefixes/inferFromUsage.ts | 8 +++++---
.../cases/fourslash/codeFixInferFromCallInAssignment.ts | 9 +++++++++
.../fourslash/codeFixInferFromExpressionStatement.ts | 8 ++++++++
.../codeFixInferFromUsageCommentAfterParameter.ts | 2 +-
tests/cases/fourslash/codeFixInferFromUsageJSXElement.ts | 2 +-
.../fourslash/codeFixInferFromUsagePropertyAccess.ts | 2 +-
.../fourslash/codeFixInferFromUsagePropertyAccessJS.ts | 2 +-
7 files changed, 26 insertions(+), 7 deletions(-)
create mode 100644 tests/cases/fourslash/codeFixInferFromCallInAssignment.ts
create mode 100644 tests/cases/fourslash/codeFixInferFromExpressionStatement.ts
diff --git a/src/services/codefixes/inferFromUsage.ts b/src/services/codefixes/inferFromUsage.ts
index 0a190e7b379..daa2166103a 100644
--- a/src/services/codefixes/inferFromUsage.ts
+++ b/src/services/codefixes/inferFromUsage.ts
@@ -504,6 +504,9 @@ namespace ts.codefix {
}
switch (node.parent.kind) {
+ case SyntaxKind.ExpressionStatement:
+ addCandidateType(usage, checker.getVoidType());
+ break;
case SyntaxKind.PostfixUnaryExpression:
usage.isNumber = true;
break;
@@ -871,12 +874,11 @@ namespace ts.codefix {
}
if (usage.calls) {
- callSignatures.push(getSignatureFromCalls(usage.calls, checker.getVoidType()));
+ callSignatures.push(getSignatureFromCalls(usage.calls, checker.getAnyType()));
}
if (usage.constructs) {
- // TODO: fallback return should maybe be {}?
- constructSignatures.push(getSignatureFromCalls(usage.constructs, checker.getVoidType()));
+ constructSignatures.push(getSignatureFromCalls(usage.constructs, checker.getAnyType()));
}
if (usage.stringIndex) {
diff --git a/tests/cases/fourslash/codeFixInferFromCallInAssignment.ts b/tests/cases/fourslash/codeFixInferFromCallInAssignment.ts
new file mode 100644
index 00000000000..85e1d3bc509
--- /dev/null
+++ b/tests/cases/fourslash/codeFixInferFromCallInAssignment.ts
@@ -0,0 +1,9 @@
+///
+
+// @noImplicitAny: true
+//// function inferAny( [| app |] ) {
+//// const result = app.use('hi')
+//// return result
+//// }
+
+verify.rangeAfterCodeFix("app: { use: (arg0: string) => any; }");
diff --git a/tests/cases/fourslash/codeFixInferFromExpressionStatement.ts b/tests/cases/fourslash/codeFixInferFromExpressionStatement.ts
new file mode 100644
index 00000000000..b5969c79378
--- /dev/null
+++ b/tests/cases/fourslash/codeFixInferFromExpressionStatement.ts
@@ -0,0 +1,8 @@
+///
+
+// @noImplicitAny: true
+//// function inferVoid( [| app |] ) {
+//// app.use('hi')
+//// }
+
+verify.rangeAfterCodeFix("app: { use: (arg0: string) => void; }");
diff --git a/tests/cases/fourslash/codeFixInferFromUsageCommentAfterParameter.ts b/tests/cases/fourslash/codeFixInferFromUsageCommentAfterParameter.ts
index bdefd2b5dea..866bfe04c13 100644
--- a/tests/cases/fourslash/codeFixInferFromUsageCommentAfterParameter.ts
+++ b/tests/cases/fourslash/codeFixInferFromUsageCommentAfterParameter.ts
@@ -16,7 +16,7 @@ verify.codeFix({
index: 0,
newFileContent:
`/**
- * @param {(arg0: any) => void} callback
+ * @param {(arg0: any) => any} callback
*/
function coll(callback /*, name1, name2, ... */) {
return callback(this);
diff --git a/tests/cases/fourslash/codeFixInferFromUsageJSXElement.ts b/tests/cases/fourslash/codeFixInferFromUsageJSXElement.ts
index 3200fffafb8..abe35fe46c8 100644
--- a/tests/cases/fourslash/codeFixInferFromUsageJSXElement.ts
+++ b/tests/cases/fourslash/codeFixInferFromUsageJSXElement.ts
@@ -30,4 +30,4 @@
//// }
-verify.rangeAfterCodeFix("props: { isLoading: any; update: (arg0: any) => void; }",/*includeWhiteSpace*/ undefined, /*errorCode*/ undefined, 0);
+verify.rangeAfterCodeFix("props: { isLoading: any; update: (arg0: any) => any; }",/*includeWhiteSpace*/ undefined, /*errorCode*/ undefined, 0);
diff --git a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts
index c8b85ee11e8..44d2e2d7b1c 100644
--- a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts
+++ b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts
@@ -12,4 +12,4 @@
//// return x.y.z
////}
-verify.rangeAfterCodeFix("a: { b: { c: any; }; }, m: { n: () => number; }, x: { y: { z: number[]; }; }", /*includeWhiteSpace*/ undefined, /*errorCode*/ undefined, /*index*/0);
\ No newline at end of file
+verify.rangeAfterCodeFix("a: { b: { c: void; }; }, m: { n: () => number; }, x: { y: { z: number[]; }; }", /*includeWhiteSpace*/ undefined, /*errorCode*/ undefined, /*index*/0);
diff --git a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccessJS.ts b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccessJS.ts
index ed9d4b33b37..357b1a991ba 100644
--- a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccessJS.ts
+++ b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccessJS.ts
@@ -21,7 +21,7 @@ verify.codeFix({
index: 0,
newFileContent:
`/**
- * @param {{ b: { c: any; }; }} a
+ * @param {{ b: { c: void; }; }} a
* @param {{ n: () => number; }} m
* @param {{ y: { z: number[]; }; }} x
*/