diff --git a/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt index 8778b7d5aa4..35070f1f4b4 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt @@ -129,22 +129,30 @@ class SmartCompletion(val expression: JetSimpleNameExpression, } private fun calcExpectedInfos(expression: JetExpression): Collection? { - // if our expression is initializer of implicitly typed variable - take type of variable from original file - val varDeclaration = expression.getParent() as? JetVariableDeclaration - if (varDeclaration != null && expression == varDeclaration.getInitializer() && varDeclaration.getTypeRef() == null) { - val offset = varDeclaration.getTextRange()!!.getStartOffset() - val originalDeclaration = PsiTreeUtil.findElementOfClassAtOffset(originalFile, offset, javaClass(), true) + // if our expression is initializer of implicitly typed variable - take type of variable from original file (+ the same for function) + val declaration = implicitlyTypedDeclarationFromInitializer(expression) + if (declaration != null) { + val offset = declaration.getTextRange()!!.getStartOffset() + val originalDeclaration = PsiTreeUtil.findElementOfClassAtOffset(originalFile, offset, javaClass(), true) if (originalDeclaration != null) { - val variableDescriptor = originalDeclaration.getLazyResolveSession().resolveToDescriptor(originalDeclaration) as? VariableDescriptor - if (variableDescriptor != null) { - return listOf(ExpectedInfo(variableDescriptor.getType(), null)) - } + val originalDescriptor = originalDeclaration.getLazyResolveSession().resolveToDescriptor(originalDeclaration) as? CallableDescriptor + val returnType = originalDescriptor?.getReturnType() + return if (returnType != null) listOf(ExpectedInfo(returnType, null)) else null } } return ExpectedInfos(bindingContext, moduleDescriptor).calculate(expression) } + private fun implicitlyTypedDeclarationFromInitializer(expression: JetExpression): JetDeclaration? { + val parent = expression.getParent() + when (parent) { + is JetVariableDeclaration -> if (expression == parent.getInitializer() && parent.getTypeRef() == null) return parent + is JetNamedFunction -> if (expression == parent.getInitializer() && parent.getReturnTypeRef() == null) return parent + } + return null + } + private fun calcItemsToSkip(expression: JetExpression): Set { val parent = expression.getParent() when(parent) { diff --git a/idea/testData/completion/smart/ImplicitlyTypedFunBody.kt b/idea/testData/completion/smart/ImplicitlyTypedFunBody.kt new file mode 100644 index 00000000000..fa62c133429 --- /dev/null +++ b/idea/testData/completion/smart/ImplicitlyTypedFunBody.kt @@ -0,0 +1,12 @@ +class C { + fun foo(): String = "" + fun bar(): String = "" + fun zoo(): Any = "" +} + +val c = C() +fun f() = c.foo() + +// EXIST: foo +// EXIST: bar +// ABSENT: zoo \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java index bca734361e7..e50a5c36a01 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java @@ -231,6 +231,11 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT doTest("idea/testData/completion/smart/IfValueInBlock2.kt"); } + @TestMetadata("ImplicitlyTypedFunBody.kt") + public void testImplicitlyTypedFunBody() throws Exception { + doTest("idea/testData/completion/smart/ImplicitlyTypedFunBody.kt"); + } + @TestMetadata("ImplicitlyTypedValInitializer1.kt") public void testImplicitlyTypedValInitializer1() throws Exception { doTest("idea/testData/completion/smart/ImplicitlyTypedValInitializer1.kt");