From d10c3ffbe424a44d6e5b4f05a8c5fc7509b5e649 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Fri, 4 Dec 2015 11:07:14 +0300 Subject: [PATCH] Fix exception in EE for inline function invocation #KT-10217 Fixed --- .../debugger/evaluate/KotlinEvaluationBuilder.kt | 13 ++++++++----- .../debugger/tinyApp/outs/inlineFunction.out | 1 + .../src/evaluate/singleBreakpoint/inlineFunction.kt | 5 +++++ .../idea/debugger/KotlinDebuggerTestCase.java | 4 +++- 4 files changed, 17 insertions(+), 6 deletions(-) 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 0a2cc14a4ab..7af1d3c452a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt @@ -173,7 +173,7 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour companion object { private fun extractAndCompile(codeFragment: KtCodeFragment, sourcePosition: SourcePosition, context: EvaluationContextImpl): CompiledDataDescriptor { - codeFragment.checkForErrors(false) + codeFragment.checkForErrors() val extractionResult = getFunctionForExtractedFragment(codeFragment, sourcePosition.file, sourcePosition.line) ?: throw IllegalStateException("Code fragment cannot be extracted to function: ${codeFragment.text}") @@ -360,7 +360,7 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour LOG.debug("File for eval4j:\n${runReadAction { jetFile.text }}") } - val (bindingContext, moduleDescriptor, files) = jetFile.checkForErrors(true) + val (bindingContext, moduleDescriptor, files) = jetFile.checkForErrors(true, codeFragment.getContextContainingFile()) val generateClassFilter = object : GenerationState.GenerateClassFilter() { override fun shouldGeneratePackagePart(jetFile: KtFile) = jetFile == jetFile @@ -431,7 +431,8 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour throw EvaluateExceptionUtil.createEvaluateException(e) } - private fun KtFile.checkForErrors(analyzeInlineFunctions: Boolean): ExtendedAnalysisResult { + // contextFile must be NotNull when analyzeInlineFunctions = true + private fun KtFile.checkForErrors(analyzeInlineFunctions: Boolean = false, contextFile: KtFile? = null): ExtendedAnalysisResult { return runReadAction { try { AnalyzingUtils.checkForSyntacticErrors(this) @@ -440,8 +441,10 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour throw EvaluateExceptionUtil.createEvaluateException(e.message) } - val resolutionFacade = KotlinCacheService.getInstance(project).getResolutionFacade(listOf(this, createFlexibleTypesFile())) - val analysisResult = resolutionFacade.analyzeFullyAndGetResult(Collections.singletonList(this)) + val filesToAnalyze = if (contextFile == null) listOf(this) else listOf(this, contextFile) + val resolutionFacade = KotlinCacheService.getInstance(project).getResolutionFacade(filesToAnalyze + createFlexibleTypesFile()) + val analysisResult = resolutionFacade.analyzeFullyAndGetResult(filesToAnalyze) + if (analysisResult.isError()) { throw EvaluateExceptionUtil.createEvaluateException(analysisResult.error) } diff --git a/idea/testData/debugger/tinyApp/outs/inlineFunction.out b/idea/testData/debugger/tinyApp/outs/inlineFunction.out index 9a6eadf0c6c..aee6f8c3130 100644 --- a/idea/testData/debugger/tinyApp/outs/inlineFunction.out +++ b/idea/testData/debugger/tinyApp/outs/inlineFunction.out @@ -3,6 +3,7 @@ LineBreakpoint created at inlineFunction.kt:7 Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' inlineFunction.kt:7 Compile bytecode for myFun { 1 } +Compile bytecode for foo() Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' Process finished with exit code 0 diff --git a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineFunction.kt b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineFunction.kt index 3e15b696803..d436f68ca20 100644 --- a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineFunction.kt +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineFunction.kt @@ -7,5 +7,10 @@ fun main(args: Array) { val a = 1 } +inline fun foo() = 1 + // EXPRESSION: myFun { 1 } +// RESULT: 1: I + +// EXPRESSION: foo() // RESULT: 1: I \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinDebuggerTestCase.java b/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinDebuggerTestCase.java index eaf5c0be850..ced09511e18 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinDebuggerTestCase.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinDebuggerTestCase.java @@ -35,6 +35,7 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.testFramework.EdtTestUtil; import com.intellij.testFramework.IdeaTestUtil; import com.intellij.util.ThrowableRunnable; +import com.intellij.util.indexing.FileBasedIndex; import com.intellij.xdebugger.XDebugSession; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.asJava.FakeLightClassForFileOfPackage; @@ -220,8 +221,9 @@ public abstract class KotlinDebuggerTestCase extends DescriptorTestCase { @SuppressWarnings("MethodMayBeStatic") protected void createDebugProcess(@NotNull String path) throws Exception { - VfsUtil.markDirty(true, true, VfsUtil.findFileByIoFile(new File(TINY_APP), true)); File file = new File(path); + //noinspection ConstantConditions + FileBasedIndex.getInstance().requestReindex(VfsUtil.findFileByIoFile(file, true)); String packageName = file.getName().replace(".kt", ""); FqName packageFQN = new FqName(packageName); String mainClassName = PackagePartClassUtils.getPackagePartFqName(packageFQN, file.getName()).asString();