From 225df9a0c07e8cd849296dea971e2b766c71f071 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 17 Oct 2017 14:45:02 -0700 Subject: [PATCH 1/3] Fix #19257: Ensure a generated signature has a return type --- src/services/codefixes/inferFromUsage.ts | 2 +- tests/cases/fourslash/codeFixInferFromUsageCall.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/codeFixInferFromUsageCall.ts diff --git a/src/services/codefixes/inferFromUsage.ts b/src/services/codefixes/inferFromUsage.ts index 046eb915c1ef6..4eba3e1e45d96 100644 --- a/src/services/codefixes/inferFromUsage.ts +++ b/src/services/codefixes/inferFromUsage.ts @@ -636,7 +636,7 @@ namespace ts.codefix { symbol.type = checker.getWidenedType(checker.getBaseTypeOfLiteralType(callContext.argumentTypes[i])); parameters.push(symbol); } - const returnType = getTypeFromUsageContext(callContext.returnType, checker); + const returnType = getTypeFromUsageContext(callContext.returnType, checker) || checker.getVoidType(); return checker.createSignature(/*declaration*/ undefined, /*typeParameters*/ undefined, /*thisParameter*/ undefined, parameters, returnType, /*typePredicate*/ undefined, callContext.argumentTypes.length, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false); } diff --git a/tests/cases/fourslash/codeFixInferFromUsageCall.ts b/tests/cases/fourslash/codeFixInferFromUsageCall.ts new file mode 100644 index 0000000000000..e74b6faf7d3f9 --- /dev/null +++ b/tests/cases/fourslash/codeFixInferFromUsageCall.ts @@ -0,0 +1,8 @@ +/// + +// @noImplicitAny: true +////function wat([|b |]) { +//// b(); +////} + +verify.rangeAfterCodeFix("b: () => void"); \ No newline at end of file From ca09f3dda28d9c4235181e1e0af78658b24a42c4 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 17 Oct 2017 15:17:54 -0700 Subject: [PATCH 2/3] Ensure generated properties have types --- src/services/codefixes/inferFromUsage.ts | 2 +- .../fourslash/codeFixInferFromUsagePropertyAccess.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts diff --git a/src/services/codefixes/inferFromUsage.ts b/src/services/codefixes/inferFromUsage.ts index 4eba3e1e45d96..b4eec6bceb1dc 100644 --- a/src/services/codefixes/inferFromUsage.ts +++ b/src/services/codefixes/inferFromUsage.ts @@ -575,7 +575,7 @@ namespace ts.codefix { if (usageContext.properties) { usageContext.properties.forEach((context, name) => { const symbol = checker.createSymbol(SymbolFlags.Property, name); - symbol.type = getTypeFromUsageContext(context, checker); + symbol.type = getTypeFromUsageContext(context, checker) || checker.getAnyType(); members.set(name, symbol); }); } diff --git a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts new file mode 100644 index 0000000000000..c6ce6d3ba30e0 --- /dev/null +++ b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts @@ -0,0 +1,8 @@ +/// + +// @noImplicitAny: true +////function foo([|x |]) { +//// return x.y.z +////} + +verify.rangeAfterCodeFix("x: { y: { z: any; }; }"); \ No newline at end of file From 4729f75375e61b5a7b9d963731ca6fb5fd326f53 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 17 Oct 2017 16:13:21 -0700 Subject: [PATCH 3/3] Use the same context for multiple inferences to the same property access --- src/services/codefixes/inferFromUsage.ts | 2 +- .../fourslash/codeFixInferFromUsagePropertyAccess.ts | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/services/codefixes/inferFromUsage.ts b/src/services/codefixes/inferFromUsage.ts index b4eec6bceb1dc..b952cc5a98db2 100644 --- a/src/services/codefixes/inferFromUsage.ts +++ b/src/services/codefixes/inferFromUsage.ts @@ -521,7 +521,7 @@ namespace ts.codefix { if (!usageContext.properties) { usageContext.properties = createUnderscoreEscapedMap(); } - const propertyUsageContext = {}; + const propertyUsageContext = usageContext.properties.get(name) || { }; inferTypeFromContext(parent, checker, propertyUsageContext); usageContext.properties.set(name, propertyUsageContext); } diff --git a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts index c6ce6d3ba30e0..c8b85ee11e88d 100644 --- a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts +++ b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts @@ -1,8 +1,15 @@ /// // @noImplicitAny: true -////function foo([|x |]) { +////function foo([|a, m, x |]) { +//// a.b.c; +//// +//// var numeric = 0; +//// numeric = m.n(); +//// +//// x.y.z +//// x.y.z.push(0); //// return x.y.z ////} -verify.rangeAfterCodeFix("x: { y: { z: any; }; }"); \ No newline at end of file +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