From b80720209edca797b2a05c560c1c9e547cca26d7 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 11 Sep 2015 15:03:23 +0300 Subject: [PATCH] Extraction Engine: Skip containers enclosing object declaration (aside of other object declarations and containing file) --- .../idea/refactoring/jetRefactoringUtil.kt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt index d6f72c0a1d2..bc80ebe7d82 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt @@ -137,13 +137,20 @@ public inline fun JetFile.createTempCopy(textTransform: (String) -> String): Jet public fun PsiElement.getAllExtractionContainers(strict: Boolean = true): List { val containers = ArrayList() - var element: PsiElement? = if (strict) getParent() else this - while (element != null) { - when (element) { - is JetBlockExpression, is JetClassBody, is JetFile -> containers.add(element as JetElement) + var objectFound = false + val parents = if (strict) parents else parentsWithSelf + for (element in parents) { + val isValidContainer = when (element) { + is JetFile -> true + is JetClassBody -> !objectFound || element.parent is JetObjectDeclaration + is JetBlockExpression -> !objectFound + else -> false } + if (!isValidContainer) continue - element = element.getParent() + containers.add(element as JetElement) + + ((element as? JetClassBody)?.parent as? JetObjectDeclaration)?.let { objectFound = true } } return containers