diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicLookupElementFactory.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicLookupElementFactory.kt index 6d3159c08ca..2b842b1ac77 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicLookupElementFactory.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicLookupElementFactory.kt @@ -52,8 +52,12 @@ class BasicLookupElementFactory( includeClassTypeArguments: Boolean = true, parametersAndTypeGrayed: Boolean = false ): LookupElement { - val _descriptor = descriptor.unwrapIfFakeOverride() - return createLookupElementUnwrappedDescriptor(_descriptor, qualifyNestedClasses, includeClassTypeArguments, parametersAndTypeGrayed) + return createLookupElementUnwrappedDescriptor( + descriptor.unwrapIfFakeOverride(), + qualifyNestedClasses, + includeClassTypeArguments, + parametersAndTypeGrayed + ) } fun createLookupElementForJavaClass( diff --git a/idea/resources-en/messages/KotlinBundle.properties b/idea/resources-en/messages/KotlinBundle.properties index b47b70d3527..8b14450acc6 100644 --- a/idea/resources-en/messages/KotlinBundle.properties +++ b/idea/resources-en/messages/KotlinBundle.properties @@ -2220,4 +2220,5 @@ button.add.package=Add Package listbox.import.package=Package listbox.import.with.subpackages=With Subpackages title.import.layout=Import Layout -title.packages.to.use.import.with=Packages to Use Import with '*' \ No newline at end of file +title.packages.to.use.import.with=Packages to Use Import with '*' +redundant.qualifier.unnecessary.non.direct.parent.class.qualifier=Unnecessary non-direct parent classes qualifiers \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveRedundantQualifierNameInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveRedundantQualifierNameInspection.kt index 6041a8b3e6f..ddca6e45001 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveRedundantQualifierNameInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveRedundantQualifierNameInspection.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.inspections import com.intellij.codeInspection.* +import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel import com.intellij.openapi.project.Project import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElementVisitor @@ -16,6 +17,7 @@ import org.jetbrains.kotlin.idea.analysis.analyzeAsReplacement import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.compareDescriptors +import org.jetbrains.kotlin.idea.core.unwrapIfFakeOverride import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.intentions.callExpression import org.jetbrains.kotlin.idea.references.mainReference @@ -30,12 +32,28 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject import org.jetbrains.kotlin.resolve.scopes.utils.findFirstClassifierWithDeprecationStatus import org.jetbrains.kotlin.utils.addToStdlib.safeAs +import javax.swing.JComponent class RemoveRedundantQualifierNameInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool { companion object { private val ENUM_STATIC_METHODS = listOf("values", "valueOf") } + /** + * In order to detect that `foo()` and `GrandBase.foo()` point to the same method, + * we need to unwrap fake overrides from descriptors. If we don't do that, they will + * have different `fqName`s, and the inspection will not detect `GrandBase` as a + * redundant qualifier. + */ + var unwrapFakeOverrides: Boolean = false + + override fun createOptionsPanel(): JComponent = + SingleCheckboxOptionsPanel( + KotlinBundle.message("redundant.qualifier.unnecessary.non.direct.parent.class.qualifier"), + this, + ::unwrapFakeOverrides.name + ) + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor = object : KtVisitorVoid() { override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) { @@ -67,7 +85,7 @@ class RemoveRedundantQualifierNameInspection : AbstractKotlinInspection(), Clean ?.firstOrNull() ?: return val applicableExpression = expressionForAnalyze.firstApplicableExpression( - validator = { applicableExpression(originalExpression, context, originalDescriptor) }, + validator = { applicableExpression(originalExpression, context, originalDescriptor, unwrapFakeOverrides) }, generator = { firstChild as? KtDotQualifiedExpression } ) ?: return @@ -106,7 +124,8 @@ private tailrec fun T.firstApplicableExpression(validator: T.() private fun KtDotQualifiedExpression.applicableExpression( originalExpression: KtExpression, oldContext: BindingContext, - originalDescriptor: DeclarationDescriptor + originalDescriptor: DeclarationDescriptor, + unwrapFakeOverrides: Boolean ): KtDotQualifiedExpression? { if (!receiverExpression.isApplicableReceiver(oldContext) || !ShortenReferences.canBePossibleToDropReceiver(this, oldContext)) { return null @@ -119,12 +138,19 @@ private fun KtDotQualifiedExpression.applicableExpression( ?.mainReference?.resolveToDescriptors(newContext) ?.firstOrNull() ?: return null - return takeIf { - originalDescriptor.fqNameSafe == newDescriptor.fqNameSafe && - if (newDescriptor is ImportedFromObjectCallableDescriptor<*>) - compareDescriptors(project, newDescriptor.callableFromObject, originalDescriptor) - else - compareDescriptors(project, newDescriptor, originalDescriptor) + fun DeclarationDescriptor.unwrapFakeOverrideIfNecessary(): DeclarationDescriptor { + return if (unwrapFakeOverrides) this.unwrapIfFakeOverride() else this + } + + val originalDescriptorFqName = originalDescriptor.unwrapFakeOverrideIfNecessary().fqNameSafe + val newDescriptorFqName = newDescriptor.unwrapFakeOverrideIfNecessary().fqNameSafe + if (originalDescriptorFqName != newDescriptorFqName) return null + + return this.takeIf { + if (newDescriptor is ImportedFromObjectCallableDescriptor<*>) + compareDescriptors(project, newDescriptor.callableFromObject, originalDescriptor) + else + compareDescriptors(project, newDescriptor, originalDescriptor) } } diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/after/my/Reproducer.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/after/my/Reproducer.java new file mode 100644 index 00000000000..0f2b19601be --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/after/my/Reproducer.java @@ -0,0 +1,4 @@ +package my; + +public class Reproducer extends ReproducerBase { +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/after/my/ReproducerBase.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/after/my/ReproducerBase.java new file mode 100644 index 00000000000..7d5f0d32b0a --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/after/my/ReproducerBase.java @@ -0,0 +1,5 @@ +package my; + +public class ReproducerBase { + public static void test() {} +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/after/test.kt b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/after/test.kt new file mode 100644 index 00000000000..8891a24b7f2 --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/after/test.kt @@ -0,0 +1,10 @@ +package my.simple.name + +import my.Reproducer +import my.ReproducerBase + +class Test : Reproducer() { + init { + test() + } +} diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/before/my/Reproducer.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/before/my/Reproducer.java new file mode 100644 index 00000000000..0f2b19601be --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/before/my/Reproducer.java @@ -0,0 +1,4 @@ +package my; + +public class Reproducer extends ReproducerBase { +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/before/my/ReproducerBase.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/before/my/ReproducerBase.java new file mode 100644 index 00000000000..7d5f0d32b0a --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/before/my/ReproducerBase.java @@ -0,0 +1,5 @@ +package my; + +public class ReproducerBase { + public static void test() {} +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/before/test.kt b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/before/test.kt new file mode 100644 index 00000000000..ed87fa1cce1 --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/before/test.kt @@ -0,0 +1,10 @@ +package my.simple.name + +import my.Reproducer +import my.ReproducerBase + +class Test : Reproducer() { + init { + ReproducerBase.test() + } +} diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/fromKotlinTest.test b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/fromKotlinTest.test new file mode 100644 index 00000000000..dc6b7c5047a --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/fromKotlinTest.test @@ -0,0 +1,4 @@ +{ + "inspectionClass": "org.jetbrains.kotlin.idea.inspections.RemoveRedundantQualifierNameInspection", + "mainFile": "test.kt" +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/settings.xml b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/settings.xml new file mode 100644 index 00000000000..2b646ab9a51 --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/settings.xml @@ -0,0 +1,3 @@ + + diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/after/my/Reproducer.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/after/my/Reproducer.java new file mode 100644 index 00000000000..1ec15d5c08a --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/after/my/Reproducer.java @@ -0,0 +1,5 @@ +package my; + +public class Reproducer extends ReproducerBase { + public static void test() {} +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/after/my/ReproducerBase.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/after/my/ReproducerBase.java new file mode 100644 index 00000000000..7d5f0d32b0a --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/after/my/ReproducerBase.java @@ -0,0 +1,5 @@ +package my; + +public class ReproducerBase { + public static void test() {} +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/after/test.kt b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/after/test.kt new file mode 100644 index 00000000000..86bb6c9615c --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/after/test.kt @@ -0,0 +1,10 @@ +package my.simple.name + +import my.Reproducer +import my.ReproducerBase + +class Test : Reproducer() { + init { + ReproducerBase.test() + } +} diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/before/my/Reproducer.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/before/my/Reproducer.java new file mode 100644 index 00000000000..1ec15d5c08a --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/before/my/Reproducer.java @@ -0,0 +1,5 @@ +package my; + +public class Reproducer extends ReproducerBase { + public static void test() {} +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/before/my/ReproducerBase.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/before/my/ReproducerBase.java new file mode 100644 index 00000000000..7d5f0d32b0a --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/before/my/ReproducerBase.java @@ -0,0 +1,5 @@ +package my; + +public class ReproducerBase { + public static void test() {} +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/before/test.kt b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/before/test.kt new file mode 100644 index 00000000000..ed87fa1cce1 --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/before/test.kt @@ -0,0 +1,10 @@ +package my.simple.name + +import my.Reproducer +import my.ReproducerBase + +class Test : Reproducer() { + init { + ReproducerBase.test() + } +} diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/fromKotlinTest.test b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/fromKotlinTest.test new file mode 100644 index 00000000000..4bca2ef4758 --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/fromKotlinTest.test @@ -0,0 +1,5 @@ +{ + "inspectionClass": "org.jetbrains.kotlin.idea.inspections.RemoveRedundantQualifierNameInspection", + "problem": "none", + "mainFile": "test.kt" +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/settings.xml b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/settings.xml new file mode 100644 index 00000000000..2b646ab9a51 --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/settings.xml @@ -0,0 +1,3 @@ + + diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/after/my/Reproducer.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/after/my/Reproducer.java new file mode 100644 index 00000000000..0f2b19601be --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/after/my/Reproducer.java @@ -0,0 +1,4 @@ +package my; + +public class Reproducer extends ReproducerBase { +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/after/my/ReproducerBase.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/after/my/ReproducerBase.java new file mode 100644 index 00000000000..7d5f0d32b0a --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/after/my/ReproducerBase.java @@ -0,0 +1,5 @@ +package my; + +public class ReproducerBase { + public static void test() {} +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/after/test.kt b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/after/test.kt new file mode 100644 index 00000000000..86bb6c9615c --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/after/test.kt @@ -0,0 +1,10 @@ +package my.simple.name + +import my.Reproducer +import my.ReproducerBase + +class Test : Reproducer() { + init { + ReproducerBase.test() + } +} diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/before/my/Reproducer.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/before/my/Reproducer.java new file mode 100644 index 00000000000..0f2b19601be --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/before/my/Reproducer.java @@ -0,0 +1,4 @@ +package my; + +public class Reproducer extends ReproducerBase { +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/before/my/ReproducerBase.java b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/before/my/ReproducerBase.java new file mode 100644 index 00000000000..7d5f0d32b0a --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/before/my/ReproducerBase.java @@ -0,0 +1,5 @@ +package my; + +public class ReproducerBase { + public static void test() {} +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/before/test.kt b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/before/test.kt new file mode 100644 index 00000000000..ed87fa1cce1 --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/before/test.kt @@ -0,0 +1,10 @@ +package my.simple.name + +import my.Reproducer +import my.ReproducerBase + +class Test : Reproducer() { + init { + ReproducerBase.test() + } +} diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/fromKotlinTest.test b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/fromKotlinTest.test new file mode 100644 index 00000000000..4bca2ef4758 --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/fromKotlinTest.test @@ -0,0 +1,5 @@ +{ + "inspectionClass": "org.jetbrains.kotlin.idea.inspections.RemoveRedundantQualifierNameInspection", + "problem": "none", + "mainFile": "test.kt" +} \ No newline at end of file diff --git a/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/settings.xml b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/settings.xml new file mode 100644 index 00000000000..9efae54d67e --- /dev/null +++ b/idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/settings.xml @@ -0,0 +1,3 @@ + + diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractLocalInspectionTest.kt b/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractLocalInspectionTest.kt index 259c6d84308..ab1d14fd2c7 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractLocalInspectionTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractLocalInspectionTest.kt @@ -17,6 +17,7 @@ import com.intellij.profile.codeInspection.ProjectInspectionProfileManager import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl import junit.framework.ComparisonFailure import junit.framework.TestCase +import org.jdom.Element import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager import org.jetbrains.kotlin.idea.test.DirectiveBasedActionUtils import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase @@ -128,7 +129,8 @@ abstract class AbstractLocalInspectionTest : KotlinLightCodeInsightFixtureTestCa inspection: AbstractKotlinInspection, expectedProblemString: String?, expectedHighlightString: String?, - localFixTextString: String? + localFixTextString: String?, + inspectionSettings: Element? = null ): Boolean { val problemExpected = expectedProblemString == null || expectedProblemString != "none" myFixture.enableInspections(inspection::class.java) @@ -139,6 +141,10 @@ abstract class AbstractLocalInspectionTest : KotlinLightCodeInsightFixtureTestCa val state = inspectionProfile.getToolDefaultState(inspection.shortName, project) state.level = HighlightDisplayLevel.WARNING + if (inspectionSettings != null) { + state.tool.tool.readSettings(inspectionSettings) + } + val caretOffset = myFixture.caretOffset val highlightInfos = CodeInsightTestFixtureImpl.instantiateAndRun( file, editor, intArrayOf( diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractMultiFileLocalInspectionTest.kt b/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractMultiFileLocalInspectionTest.kt index 89ed1f11f5a..952d0b39f5e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractMultiFileLocalInspectionTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractMultiFileLocalInspectionTest.kt @@ -16,6 +16,8 @@ import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.PlatformTestUtil import com.intellij.testFramework.UsefulTestCase import junit.framework.TestCase +import org.jdom.Document +import org.jdom.input.SAXBuilder import org.jetbrains.kotlin.idea.jsonUtils.getString import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor @@ -47,10 +49,15 @@ abstract class AbstractMultiFileLocalInspectionTest : AbstractLocalInspectionTes val problemExpectedString = config["problem"]?.asString // null means "some problem", "none" means no problem val localFixTextString = config["fix"]?.asString // null means "some single fix" or "none" if no problem expected + val inspectionSettings = File(testFile.parentFile, "settings.xml") + .takeIf { it.exists() } + ?.let { (SAXBuilder().build(it) as Document).rootElement } + + doTest(path) test@{ _ -> myFixture.configureFromTempProjectFile(mainFilePath) - runInspectionWithFixesAndCheck(inspection, problemExpectedString, null, localFixTextString) + runInspectionWithFixesAndCheck(inspection, problemExpectedString, null, localFixTextString, inspectionSettings) } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/MultiFileLocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/MultiFileLocalInspectionTestGenerated.java index ddffa7586df..f4509b6c9ea 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/MultiFileLocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/MultiFileLocalInspectionTestGenerated.java @@ -98,6 +98,21 @@ public class MultiFileLocalInspectionTestGenerated extends AbstractMultiFileLoca runTest("idea/testData/multiFileLocalInspections/redundantQualifierName/javaStatic/fromKotlinTest.test"); } + @TestMetadata("redundantQualifierName/unnecessaryNonDirectParentClassQualifier/fromKotlinTest.test") + public void testRedundantQualifierName_unnecessaryNonDirectParentClassQualifier_FromKotlinTest() throws Exception { + runTest("idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifier/fromKotlinTest.test"); + } + + @TestMetadata("redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/fromKotlinTest.test") + public void testRedundantQualifierName_unnecessaryNonDirectParentClassQualifierAmbiguous_FromKotlinTest() throws Exception { + runTest("idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierAmbiguous/fromKotlinTest.test"); + } + + @TestMetadata("redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/fromKotlinTest.test") + public void testRedundantQualifierName_unnecessaryNonDirectParentClassQualifierDisabled_FromKotlinTest() throws Exception { + runTest("idea/testData/multiFileLocalInspections/redundantQualifierName/unnecessaryNonDirectParentClassQualifierDisabled/fromKotlinTest.test"); + } + @TestMetadata("unusedSymbol/fromKotlinTest/fromKotlinTest.test") public void testUnusedSymbol_fromKotlinTest_FromKotlinTest() throws Exception { runTest("idea/testData/multiFileLocalInspections/unusedSymbol/fromKotlinTest/fromKotlinTest.test"); diff --git a/nj2k/testData/newJ2k/issues/kt-19652.kt b/nj2k/testData/newJ2k/issues/kt-19652.kt index 7bf0801ae47..51a80672445 100644 --- a/nj2k/testData/newJ2k/issues/kt-19652.kt +++ b/nj2k/testData/newJ2k/issues/kt-19652.kt @@ -1,8 +1,7 @@ import java.awt.image.AreaAveragingScaleFilter -import java.awt.image.ImageConsumer class TestInterfaceStaticFieldReference(width: Int, height: Int) : AreaAveragingScaleFilter(width, height) { fun test() { - println(ImageConsumer.TOPDOWNLEFTRIGHT) + println(TOPDOWNLEFTRIGHT) } } \ No newline at end of file