From 112e4b1e80c132eed27f20af9f17d4dc0271dfca Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Thu, 17 Mar 2016 14:40:05 -0700 Subject: [PATCH] Addressed PR feedback --- src/services/services.ts | 13 +++++++++--- .../objectLiteralBindingInParameter.ts | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index 08d3fc843ca..72255b55479 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3506,9 +3506,16 @@ namespace ts { // through type declaration or inference. // Also proceed if rootDeclaration is parameter and if its containing function expression\arrow function is contextually typed - // type of parameter will flow in from the contextual type of the function - if (rootDeclaration.initializer || - rootDeclaration.type || - (rootDeclaration.kind === SyntaxKind.Parameter && isExpression(rootDeclaration.parent) && typeChecker.getContextualType(rootDeclaration.parent))) { + let canGetType = !!(rootDeclaration.initializer || rootDeclaration.type); + if (!canGetType && rootDeclaration.kind === SyntaxKind.Parameter) { + if (isExpression(rootDeclaration.parent)) { + canGetType = !!typeChecker.getContextualType(rootDeclaration.parent); + } + else if (rootDeclaration.parent.kind === SyntaxKind.MethodDeclaration || rootDeclaration.parent.kind === SyntaxKind.SetAccessor) { + canGetType = isExpression(rootDeclaration.parent.parent) && !!typeChecker.getContextualType(rootDeclaration.parent.parent); + } + } + if (canGetType) { typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer); existingMembers = (objectLikeContainer).elements; } diff --git a/tests/cases/fourslash/objectLiteralBindingInParameter.ts b/tests/cases/fourslash/objectLiteralBindingInParameter.ts index dfde6095bb9..b1cbd21d929 100644 --- a/tests/cases/fourslash/objectLiteralBindingInParameter.ts +++ b/tests/cases/fourslash/objectLiteralBindingInParameter.ts @@ -6,10 +6,30 @@ ////[null].reduce(({/*2*/}, b) => b); +////interface Foo { +//// m(x: { x1: number, x2: number }): void; +//// prop: I; +////} +////let x: Foo = { +//// m({ /*3*/ }) { +//// }, +//// get prop(): I { return undefined; }, +//// set prop({ /*4*/ }) { +//// } +////}; + goTo.marker("1"); verify.completionListContains("x1"); verify.completionListContains("x2"); goTo.marker("2"); verify.completionListContains("x1"); +verify.completionListContains("x2"); + +goTo.marker("3"); +verify.completionListContains("x1"); +verify.completionListContains("x2"); + +goTo.marker("4"); +verify.completionListContains("x1"); verify.completionListContains("x2"); \ No newline at end of file