From 387d5ffd73d2d56cd3f5563dd5dfb71b6185fc9d Mon Sep 17 00:00:00 2001 From: Vyacheslav Gerasimov Date: Fri, 28 Oct 2016 16:17:46 +0300 Subject: [PATCH] Added call to ImportFilter in import quickfix (KT-14439) #KT-14439 Fixed --- .../kotlin/generators/tests/GenerateTests.kt | 5 ++ .../AbstractAndroidQuickFixMultiFileTest.java | 62 +++++++++++++++++++ ...AndroidQuickFixMultiFileTestGenerated.java | 52 ++++++++++++++++ .../kotlin/idea/quickfix/ImportFix.kt | 4 ++ .../autoImports/androidRImport.after.kt | 10 +++ .../androidRImport.before.Dependency1.kt | 5 ++ .../androidRImport.before.Dependency2.kt | 5 ++ .../androidRImport.before.Dependency3.kt | 5 ++ .../autoImports/androidRImport.before.Main.kt | 8 +++ 9 files changed, 156 insertions(+) create mode 100644 idea/idea-android/tests/org/jetbrains/kotlin/android/quickfixes/AbstractAndroidQuickFixMultiFileTest.java create mode 100644 idea/idea-android/tests/org/jetbrains/kotlin/android/quickfixes/AndroidQuickFixMultiFileTestGenerated.java create mode 100644 idea/testData/android/quickfix/autoImports/androidRImport.after.kt create mode 100644 idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency1.kt create mode 100644 idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency2.kt create mode 100644 idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency3.kt create mode 100644 idea/testData/android/quickfix/autoImports/androidRImport.before.Main.kt diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 68e166d5485..54dd1194003 100755 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -21,6 +21,7 @@ import org.intellij.lang.annotations.Language import org.jetbrains.kotlin.AbstractDataFlowValueRenderingTest import org.jetbrains.kotlin.addImport.AbstractAddImportTest import org.jetbrains.kotlin.android.* +import org.jetbrains.kotlin.android.quickfixes.AbstractAndroidQuickFixMultiFileTest import org.jetbrains.kotlin.android.configure.AbstractConfigureProjectTest import org.jetbrains.kotlin.android.intentions.AbstractAndroidResourceIntentionTest import org.jetbrains.kotlin.annotation.AbstractAnnotationProcessorBoxTest @@ -1158,6 +1159,10 @@ fun main(args: Array) { testClass { model("android/resourceIntentions", extension = "test", singleClass = true) } + + testClass() { + model("android/quickfix", pattern = """^(\w+)\.((before\.Main\.\w+)|(test))$""", testMethod = "doTestWithExtraFile") + } } testGroup("plugins/plugins-tests/tests", "plugins/android-extensions/android-extensions-jps/testData") { diff --git a/idea/idea-android/tests/org/jetbrains/kotlin/android/quickfixes/AbstractAndroidQuickFixMultiFileTest.java b/idea/idea-android/tests/org/jetbrains/kotlin/android/quickfixes/AbstractAndroidQuickFixMultiFileTest.java new file mode 100644 index 00000000000..f13d6a6fed9 --- /dev/null +++ b/idea/idea-android/tests/org/jetbrains/kotlin/android/quickfixes/AbstractAndroidQuickFixMultiFileTest.java @@ -0,0 +1,62 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.android.quickfixes; + +import com.intellij.facet.FacetManager; +import com.intellij.facet.ModifiableFacetModel; +import com.intellij.openapi.application.ApplicationManager; +import org.jetbrains.android.facet.AndroidFacet; +import org.jetbrains.kotlin.idea.quickfix.AbstractQuickFixMultiFileTest; + +public abstract class AbstractAndroidQuickFixMultiFileTest extends AbstractQuickFixMultiFileTest { + + @Override + protected void setUp() throws Exception { + super.setUp(); + addAndroidFacet(); + } + + @Override + protected void doTestWithExtraFile(String beforeFileName) throws Exception { + addManifest(); + super.doTestWithExtraFile(beforeFileName); + } + + @Override + protected void doTestWithoutExtraFile(String beforeFileName) throws Exception { + addManifest(); + super.doTestWithoutExtraFile(beforeFileName); + } + + private void addAndroidFacet() { + FacetManager facetManager = FacetManager.getInstance(myModule); + AndroidFacet facet = facetManager.createFacet(AndroidFacet.getFacetType(), "Android", null); + + final ModifiableFacetModel facetModel = facetManager.createModifiableModel(); + facetModel.addFacet(facet); + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + facetModel.commit(); + } + }); + } + + private void addManifest() throws Exception { + configureByFile("idea/testData/android/AndroidManifest.xml"); + } +} diff --git a/idea/idea-android/tests/org/jetbrains/kotlin/android/quickfixes/AndroidQuickFixMultiFileTestGenerated.java b/idea/idea-android/tests/org/jetbrains/kotlin/android/quickfixes/AndroidQuickFixMultiFileTestGenerated.java new file mode 100644 index 00000000000..65d7a8688dc --- /dev/null +++ b/idea/idea-android/tests/org/jetbrains/kotlin/android/quickfixes/AndroidQuickFixMultiFileTestGenerated.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.android.quickfixes; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("idea/testData/android/quickfix") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class AndroidQuickFixMultiFileTestGenerated extends AbstractAndroidQuickFixMultiFileTest { + public void testAllFilesPresentInQuickfix() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/android/quickfix"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), true); + } + + @TestMetadata("idea/testData/android/quickfix/autoImports") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class AutoImports extends AbstractAndroidQuickFixMultiFileTest { + public void testAllFilesPresentInAutoImports() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/android/quickfix/autoImports"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), true); + } + + @TestMetadata("androidRImport.before.Main.kt") + public void testAndroidRImport() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/quickfix/autoImports/androidRImport.before.Main.kt"); + doTestWithExtraFile(fileName); + } + } +} diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt index c6030460da7..344323db231 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.quickfix +import com.intellij.codeInsight.ImportFilter import com.intellij.codeInsight.hint.HintManager import com.intellij.codeInsight.intention.HighPriorityAction import com.intellij.codeInsight.intention.IntentionAction @@ -66,6 +67,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo import org.jetbrains.kotlin.resolve.calls.callUtil.getParentCall import org.jetbrains.kotlin.resolve.calls.context.ContextDependency +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.ExplicitImportsScope import org.jetbrains.kotlin.resolve.scopes.utils.addImportingScope @@ -176,6 +178,8 @@ internal abstract class ImportFixBase protected constructor( } } + result = result.filter { ImportFilter.shouldImport(file, it.fqNameSafe.asString()) } + return if (result.size > 1) reduceCandidatesBasedOnDependencyRuleViolation(result, file) else diff --git a/idea/testData/android/quickfix/autoImports/androidRImport.after.kt b/idea/testData/android/quickfix/autoImports/androidRImport.after.kt new file mode 100644 index 00000000000..91cdea094a7 --- /dev/null +++ b/idea/testData/android/quickfix/autoImports/androidRImport.after.kt @@ -0,0 +1,10 @@ +// "Import" "true" +// ERROR: Unresolved reference: R + +package com.myapp.activity + +import com.myapp.R + +fun test() { + val a = R.layout.activity_test_kotlin +} \ No newline at end of file diff --git a/idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency1.kt b/idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency1.kt new file mode 100644 index 00000000000..2301bec4b1d --- /dev/null +++ b/idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency1.kt @@ -0,0 +1,5 @@ +package com.myapp + +public class R { + +} \ No newline at end of file diff --git a/idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency2.kt b/idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency2.kt new file mode 100644 index 00000000000..37ef4ebe241 --- /dev/null +++ b/idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency2.kt @@ -0,0 +1,5 @@ +package android + +public class R { + +} \ No newline at end of file diff --git a/idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency3.kt b/idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency3.kt new file mode 100644 index 00000000000..37be2f9a500 --- /dev/null +++ b/idea/testData/android/quickfix/autoImports/androidRImport.before.Dependency3.kt @@ -0,0 +1,5 @@ +package android.support.v7.appcompat + +public class R { + +} \ No newline at end of file diff --git a/idea/testData/android/quickfix/autoImports/androidRImport.before.Main.kt b/idea/testData/android/quickfix/autoImports/androidRImport.before.Main.kt new file mode 100644 index 00000000000..9256ae6764b --- /dev/null +++ b/idea/testData/android/quickfix/autoImports/androidRImport.before.Main.kt @@ -0,0 +1,8 @@ +// "Import" "true" +// ERROR: Unresolved reference: R + +package com.myapp.activity + +fun test() { + val a = R.layout.activity_test_kotlin +} \ No newline at end of file