Added call to ImportFilter in import quickfix (KT-14439)

#KT-14439 Fixed
This commit is contained in:
Vyacheslav Gerasimov
2016-10-28 16:17:46 +03:00
parent fd6d4c352c
commit 387d5ffd73
9 changed files with 156 additions and 0 deletions

View File

@@ -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<String>) {
testClass<AbstractAndroidResourceIntentionTest> {
model("android/resourceIntentions", extension = "test", singleClass = true)
}
testClass<AbstractAndroidQuickFixMultiFileTest>() {
model("android/quickfix", pattern = """^(\w+)\.((before\.Main\.\w+)|(test))$""", testMethod = "doTestWithExtraFile")
}
}
testGroup("plugins/plugins-tests/tests", "plugins/android-extensions/android-extensions-jps/testData") {

View File

@@ -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");
}
}

View File

@@ -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);
}
}
}

View File

@@ -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<T : KtExpression> protected constructor(
}
}
result = result.filter { ImportFilter.shouldImport(file, it.fqNameSafe.asString()) }
return if (result.size > 1)
reduceCandidatesBasedOnDependencyRuleViolation(result, file)
else

View File

@@ -0,0 +1,10 @@
// "Import" "true"
// ERROR: Unresolved reference: R
package com.myapp.activity
import com.myapp.R
fun test() {
val a = <caret>R.layout.activity_test_kotlin
}

View File

@@ -0,0 +1,5 @@
package com.myapp
public class R {
}

View File

@@ -0,0 +1,5 @@
package android
public class R {
}

View File

@@ -0,0 +1,5 @@
package android.support.v7.appcompat
public class R {
}

View File

@@ -0,0 +1,8 @@
// "Import" "true"
// ERROR: Unresolved reference: R
package com.myapp.activity
fun test() {
val a = <caret>R.layout.activity_test_kotlin
}