From 218c0cfff7326259b1c37a7f7f61ea9af86de2a8 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 3 Nov 2015 14:11:01 +0300 Subject: [PATCH] KT-9875 False unused import in kotlinSpacingRules.kt #KT-9875 Fixed --- .../idea/imports/KotlinImportOptimizer.kt | 7 +++++-- idea/testData/editor/optimizeImports/KT9875.kt | 18 ++++++++++++++++++ .../editor/optimizeImports/KT9875.kt.after | 17 +++++++++++++++++ .../imports/OptimizeImportsTestGenerated.java | 6 ++++++ 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 idea/testData/editor/optimizeImports/KT9875.kt create mode 100644 idea/testData/editor/optimizeImports/KT9875.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt b/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt index 6dae9e01c97..9404ce44b5c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt @@ -136,8 +136,11 @@ public class KotlinImportOptimizer() : ImportOptimizer { val resolutionScope = place.getResolutionScope(bindingContext, place.getResolutionFacade()) val noImportsScope = resolutionScope.replaceImportingScopes(null) - return isInScope(noImportsScope) - || resolutionScope.getImplicitReceiversHierarchy().any { isInScope(it.type.memberScope.memberScopeAsImportingScope()) } + if (isInScope(noImportsScope)) return true + if (target !is ClassDescriptor) { // classes not accessible through receivers, only their constructors + if (resolutionScope.getImplicitReceiversHierarchy().any { isInScope(it.type.memberScope.memberScopeAsImportingScope()) }) return true + } + return false } } diff --git a/idea/testData/editor/optimizeImports/KT9875.kt b/idea/testData/editor/optimizeImports/KT9875.kt new file mode 100644 index 00000000000..6c8c02db9a3 --- /dev/null +++ b/idea/testData/editor/optimizeImports/KT9875.kt @@ -0,0 +1,18 @@ +package p + +import p.Outer.Inner1 +import p.Outer.Inner2 + +class Outer { + inner class Inner1 + inner class Inner2 +} + +fun foo(p: Outer.() -> Unit){} + +fun bar() { + foo { + fun Inner1.f() {} + Inner2() + } +} diff --git a/idea/testData/editor/optimizeImports/KT9875.kt.after b/idea/testData/editor/optimizeImports/KT9875.kt.after new file mode 100644 index 00000000000..e536e17014f --- /dev/null +++ b/idea/testData/editor/optimizeImports/KT9875.kt.after @@ -0,0 +1,17 @@ +package p + +import p.Outer.Inner1 + +class Outer { + inner class Inner1 + inner class Inner2 +} + +fun foo(p: Outer.() -> Unit){} + +fun bar() { + foo { + fun Inner1.f() {} + Inner2() + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/imports/OptimizeImportsTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/imports/OptimizeImportsTestGenerated.java index d0492b7555d..2aa136fa406 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/imports/OptimizeImportsTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/imports/OptimizeImportsTestGenerated.java @@ -137,6 +137,12 @@ public class OptimizeImportsTestGenerated extends AbstractOptimizeImportsTest { doTest(fileName); } + @TestMetadata("KT9875.kt") + public void testKT9875() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/editor/optimizeImports/KT9875.kt"); + doTest(fileName); + } + @TestMetadata("KeywordNames.kt") public void testKeywordNames() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/optimizeImports/KeywordNames.kt");