From 391af972d739f7c22f2999740bdb0a1b6c655ac4 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Fri, 9 Oct 2015 14:33:32 +0300 Subject: [PATCH] CodeFragments: do not add imports from context file --- .../jetbrains/kotlin/psi/JetCodeFragment.kt | 19 ++--------- .../evaluate/KotlinEvaluationBuilder.kt | 16 ++++++--- .../extractFunctionForDebuggerUtil.kt | 33 ++++++++++++------- 3 files changed, 36 insertions(+), 32 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetCodeFragment.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetCodeFragment.kt index ac5d32a456a..0e6935e49e0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetCodeFragment.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetCodeFragment.kt @@ -27,7 +27,7 @@ import com.intellij.testFramework.LightVirtualFile import org.jetbrains.kotlin.idea.JetFileType import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.utils.addToStdlib.check -import java.util.LinkedHashSet +import java.util.* public abstract class JetCodeFragment( private val _project: Project, @@ -48,7 +48,7 @@ public abstract class JetCodeFragment( getViewProvider().forceCachedPsi(this) init(TokenType.CODE_FRAGMENT, elementType) if (context != null) { - initImports(context, imports) + initImports(imports) } } @@ -123,20 +123,7 @@ public abstract class JetCodeFragment( return true } - private fun initImports(context: PsiElement, imports: String?) { - val containingFile = context.getContainingFile() - if (containingFile !is JetFile) return - - val importListForContextElement = containingFile.getImportList() - if (importListForContextElement != null) { - myImports.addAll(importListForContextElement.getImports().map { it.getText() }) - } - - val packageName = containingFile.getPackageDirective()?.getFqName()?.asString() - if (packageName != null && packageName.isNotEmpty()) { - myImports.add("import $packageName.*") - } - + private fun initImports(imports: String?) { if (imports != null && !imports.isEmpty()) { myImports.addAll(imports.split(IMPORT_SEPARATOR).map { it.check { it.startsWith("import ") } ?: "import $it" }) } diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt index dbf76fb7846..e78517a9fd4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt @@ -470,10 +470,18 @@ private val packageInternalName = PackageClassUtils.getPackageClassInternalName( private fun createFileForDebugger(codeFragment: JetCodeFragment, extractedFunction: JetNamedFunction ): JetFile { - var fileText = template.replace("!IMPORT_LIST!", - codeFragment.importsToString() - .split(JetCodeFragment.IMPORT_SEPARATOR) - .joinToString("\n")) + val containingContextFile = (codeFragment.context as? JetElement)?.getContainingJetFile() + val importsFromContextFile = containingContextFile?.importList?.let { it.text + "\n" } ?: "" + val packageFromContextFile = containingContextFile?.packageName?.let { + if (it.isNotBlank()) "import $it.*\n" else null + } ?: "" + + var fileText = template.replace( + "!IMPORT_LIST!", + packageFromContextFile + + importsFromContextFile + + codeFragment.importsToString().split(JetCodeFragment.IMPORT_SEPARATOR).joinToString("\n") + ) val extractedFunctionText = extractedFunction.text assert(extractedFunctionText != null) { "Text of extracted function shouldn't be null" } diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/extractFunctionForDebuggerUtil.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/extractFunctionForDebuggerUtil.kt index ee6bc1567bd..a7d74a1c6f1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/extractFunctionForDebuggerUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/extractFunctionForDebuggerUtil.kt @@ -16,25 +16,24 @@ package org.jetbrains.kotlin.idea.debugger.evaluate -import com.intellij.psi.PsiFile -import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.AnalysisResult.ErrorMessage -import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils -import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode -import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.AnalysisResult.Status import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil -import org.jetbrains.kotlin.idea.util.application.runReadAction +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile import com.intellij.psi.PsiManager import com.intellij.psi.impl.PsiModificationTrackerImpl -import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.idea.intentions.InsertExplicitTypeArgumentsIntention -import org.jetbrains.kotlin.idea.util.psi.patternMatching.toRange import org.jetbrains.kotlin.idea.actions.internal.KotlinInternalMode import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils import org.jetbrains.kotlin.idea.core.refactoring.createTempCopy import org.jetbrains.kotlin.idea.core.replaced +import org.jetbrains.kotlin.idea.intentions.InsertExplicitTypeArgumentsIntention import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.* -import java.util.* +import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.AnalysisResult.ErrorMessage +import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.AnalysisResult.Status +import org.jetbrains.kotlin.idea.util.application.runReadAction +import org.jetbrains.kotlin.idea.util.psi.patternMatching.toRange +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode fun getFunctionForExtractedFragment( codeFragment: JetCodeFragment, @@ -120,7 +119,17 @@ private fun addImportsToFile(newImportList: JetImportList?, tmpFile: JetFile) { tmpFile.addAfter(newImportList, tmpFile.getPackageDirective()) } else { - tmpFileImportList.replace(newImportList) + val tmpFileImports = tmpFileImportList.imports + if (tmpFileImports.isEmpty()) { + tmpFileImportList.replace(newImportList) + } + else { + val lastImport = tmpFileImports.last() + newImportList.imports.forEach { + tmpFileImportList.addAfter(it, lastImport) + } + tmpFileImportList.addAfter(psiFactory.createNewLine(), lastImport) + } } tmpFile.addAfter(psiFactory.createNewLine(), packageDirective) }