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 ecde68af484..766ce2208d8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt @@ -52,6 +52,8 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies +import org.jetbrains.kotlin.diagnostics.DiagnosticFactory +import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.idea.KotlinLanguage @@ -78,6 +80,7 @@ import org.jetbrains.kotlin.resolve.AnalyzingUtils import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.jvm.JvmClassName +import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm import org.jetbrains.org.objectweb.asm.* import org.jetbrains.org.objectweb.asm.Opcodes.ASM5 import org.jetbrains.org.objectweb.asm.Type @@ -524,6 +527,8 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour private fun exception(e: Throwable): Nothing = throw EvaluateExceptionUtil.createEvaluateException(e) + private val IGNORED_DIAGNOSTICS: Set> = Errors.INVISIBLE_REFERENCE_DIAGNOSTICS + // contextFile must be NotNull when analyzeInlineFunctions = true private fun KtFile.checkForErrors(analyzeInlineFunctions: Boolean = false, contextFile: KtFile? = null): ExtendedAnalysisResult { return runInReadActionWithWriteActionPriorityWithPCE { @@ -543,7 +548,8 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour } val bindingContext = analysisResult.bindingContext - bindingContext.diagnostics.firstOrNull { it.severity == Severity.ERROR }?.let { + val filteredDiagnostics = bindingContext.diagnostics.filter { it.factory !in IGNORED_DIAGNOSTICS } + filteredDiagnostics.firstOrNull { it.severity == Severity.ERROR }?.let { if (it.psiElement.containingFile == this) { exception(DefaultErrorMessages.render(it)) } diff --git a/idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/invisibleDeclarations.kt b/idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/invisibleDeclarations.kt new file mode 100644 index 00000000000..a22dcbf6601 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/invisibleDeclarations.kt @@ -0,0 +1,18 @@ +package invisibleDeclarations + +fun main(args: Array) { + A() +} + +class A() { + private companion object { + val test = 5 + } + + init { + // EXPRESSION: test + // RESULT: 5: I + //Breakpoint! + val a = 1 + } +} diff --git a/idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/invisibleDeclarations.out b/idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/invisibleDeclarations.out new file mode 100644 index 00000000000..136b9a34672 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/invisibleDeclarations.out @@ -0,0 +1,8 @@ +LineBreakpoint created at invisibleDeclarations.kt:16 +Run Java +Connected to the target VM +invisibleDeclarations.kt:16 +Compile bytecode for test +Disconnected from the target VM + +Process finished with exit code 0 diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java index 0247dfbf6f3..7893776afcf 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java @@ -947,6 +947,12 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat doMultipleBreakpointsTest(fileName); } + @TestMetadata("invisibleDeclarations.kt") + public void testInvisibleDeclarations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/invisibleDeclarations.kt"); + doMultipleBreakpointsTest(fileName); + } + @TestMetadata("isInsideInlineLambda.kt") public void testIsInsideInlineLambda() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/isInsideInlineLambda.kt");