diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt index 69b1a8f9bc8..df14c0daf4b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt @@ -29,6 +29,7 @@ import com.intellij.psi.PsiFile import com.intellij.psi.util.PsiModificationTracker import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility +import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.Errors @@ -122,7 +123,7 @@ internal abstract class ImportFixBase(expression: T) : } } - fun computeSuggestionsForName(name: Name, callTypeAndReceiver: CallTypeAndReceiver<*, *>): + private fun computeSuggestionsForName(name: Name, callTypeAndReceiver: CallTypeAndReceiver<*, *>): Collection { val nameStr = name.asString() if (nameStr.isEmpty()) return emptyList() @@ -149,7 +150,15 @@ internal abstract class ImportFixBase(expression: T) : val indicesHelper = KotlinIndicesHelper(resolutionFacade, searchScope, ::isVisible) - val result = fillCandidates(nameStr, callTypeAndReceiver, bindingContext, indicesHelper) + var result = fillCandidates(nameStr, callTypeAndReceiver, bindingContext, indicesHelper) + + // for CallType.DEFAULT do not include functions if there is no parenthesis + if (callTypeAndReceiver is CallTypeAndReceiver.DEFAULT) { + val isCall = element.parent is KtCallExpression + if (!isCall) { + result = result.filter { it !is FunctionDescriptor } + } + } return if (result.size > 1) reduceCandidatesBasedOnDependencyRuleViolation(result, file) diff --git a/idea/testData/quickfix/autoImports/noFunctionImportOnSimpleName.test b/idea/testData/quickfix/autoImports/noFunctionImportOnSimpleName.test new file mode 100644 index 00000000000..c842531c7a8 --- /dev/null +++ b/idea/testData/quickfix/autoImports/noFunctionImportOnSimpleName.test @@ -0,0 +1,23 @@ +// FILE: main.before.kt +// "Import" "false" +// ACTION: Create local variable 'foobar' +// ACTION: Create object 'foobar' +// ACTION: Create parameter 'foobar' +// ACTION: Create property 'foobar' +// ACTION: Rename reference +// ERROR: Unresolved reference: foobar + +//KT-9009 + +package foo + +fun f() { + foobar +} + + +// FILE: dependency.before.kt +package bar + +fun foobar() { +} diff --git a/idea/testData/quickfix/autoImports/noMemberFunctionImportOnSimpleName.test b/idea/testData/quickfix/autoImports/noMemberFunctionImportOnSimpleName.test new file mode 100644 index 00000000000..75d12dee7b8 --- /dev/null +++ b/idea/testData/quickfix/autoImports/noMemberFunctionImportOnSimpleName.test @@ -0,0 +1,25 @@ +// FILE: main.before.kt +// "Import member" "false" +// ACTION: Create local variable 'foobar' +// ACTION: Create object 'foobar' +// ACTION: Create parameter 'foobar' +// ACTION: Create property 'foobar' +// ACTION: Rename reference +// ERROR: Unresolved reference: foobar + +//KT-9009 + +package foo + +fun f() { + foobar +} + + +// FILE: dependency.before.kt +package bar + +object Foo { + fun foobar() { + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.java index b243ff0431d..76153f01bbd 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.java @@ -261,10 +261,11 @@ public abstract class AbstractQuickFixMultiFileTest extends KotlinDaemonAnalyzer }); assert beforeFile != null; - assert afterFile != null; - subFiles.remove(afterFile); subFiles.remove(beforeFile); + if (afterFile != null) { + subFiles.remove(afterFile); + } configureMultiFileTest(subFiles, beforeFile); @@ -288,15 +289,18 @@ public abstract class AbstractQuickFixMultiFileTest extends KotlinDaemonAnalyzer String actualText = getFile().getText(); String afterText = new StringBuilder(actualText).insert(getEditor().getCaretModel().getOffset(), "").toString(); - if (pair.second && !afterText.equals(afterFile.content)) { - StringBuilder actualTestFile = new StringBuilder(); - actualTestFile.append("// FILE: ").append(beforeFile.path).append("\n").append(beforeFile.content); - for (TestFile file : subFiles) { - actualTestFile.append("// FILE: ").append(file.path).append("\n").append(file.content); - } - actualTestFile.append("// FILE: ").append(afterFile.path).append("\n").append(afterText); + if (pair.second) { + assertNotNull(".after file should exist", afterFile); + if (!afterText.equals(afterFile.content)) { + StringBuilder actualTestFile = new StringBuilder(); + actualTestFile.append("// FILE: ").append(beforeFile.path).append("\n").append(beforeFile.content); + for (TestFile file : subFiles) { + actualTestFile.append("// FILE: ").append(file.path).append("\n").append(file.content); + } + actualTestFile.append("// FILE: ").append(afterFile.path).append("\n").append(afterText); - KotlinTestUtils.assertEqualsToFile(new File(beforeFileName), actualTestFile.toString()); + KotlinTestUtils.assertEqualsToFile(new File(beforeFileName), actualTestFile.toString()); + } } } catch (ComparisonFailure e) { diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index 80ace1f0d65..62802c49707 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -347,6 +347,12 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes doTestWithExtraFile(fileName); } + @TestMetadata("noFunctionImportOnSimpleName.test") + public void testNoFunctionImportOnSimpleName() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/noFunctionImportOnSimpleName.test"); + doTestWithExtraFile(fileName); + } + @TestMetadata("noImportForFunInQualifiedNotFirst.before.Main.kt") public void testNoImportForFunInQualifiedNotFirst() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/noImportForFunInQualifiedNotFirst.before.Main.kt"); @@ -407,6 +413,12 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes doTestWithExtraFile(fileName); } + @TestMetadata("noMemberFunctionImportOnSimpleName.test") + public void testNoMemberFunctionImportOnSimpleName() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/noMemberFunctionImportOnSimpleName.test"); + doTestWithExtraFile(fileName); + } + @TestMetadata("notExcludedClass.before.Main.kt") public void testNotExcludedClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/notExcludedClass.before.Main.kt");