diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt index c3c48164c73..2a81cc2cfa1 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt @@ -92,7 +92,7 @@ open class KJvmReplCompilerBase protected cons snippet, messageCollector, compilationState, - checkSyntaxErrors = true + failOnSyntaxErrors = true ).valueOr { return@withMessageCollector it } val (sourceFiles, sourceDependencies) = collectRefinedSourcesAndUpdateEnvironment( @@ -242,7 +242,7 @@ open class KJvmReplCompilerBase protected cons snippet: SourceCode, parentMessageCollector: MessageCollector, compilationState: JvmReplCompilerState.Compilation, - checkSyntaxErrors: Boolean + failOnSyntaxErrors: Boolean ): ResultWithDiagnostics = withMessageCollector( snippet, @@ -269,15 +269,11 @@ open class KJvmReplCompilerBase protected cons ) .valueOr { return it } - if (checkSyntaxErrors) { - val syntaxErrorReport = AnalyzerWithCompilerReport.reportSyntaxErrors(snippetKtFile, errorHolder) - if (syntaxErrorReport.isHasErrors && syntaxErrorReport.isAllErrorsAtEof) return failure( - messageCollector, ScriptDiagnostic(ScriptDiagnostic.incompleteCode, "Incomplete code") - ) - if (syntaxErrorReport.isHasErrors) return failure( - messageCollector - ) + val syntaxErrorReport = AnalyzerWithCompilerReport.reportSyntaxErrors(snippetKtFile, errorHolder) + if (syntaxErrorReport.isHasErrors && syntaxErrorReport.isAllErrorsAtEof) { + messageCollector.report(ScriptDiagnostic(ScriptDiagnostic.incompleteCode, "Incomplete code")) } + if (failOnSyntaxErrors && syntaxErrorReport.isHasErrors) return failure(messageCollector) return AnalyzePreparationResult( context, diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/errorReporting.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/errorReporting.kt index 3231113d89f..9bfe07b87fa 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/errorReporting.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/errorReporting.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.scripting.compiler.plugin.impl import org.jetbrains.kotlin.cli.common.arguments.Argument import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSourceLocation import org.jetbrains.kotlin.cli.common.messages.MessageCollector @@ -58,6 +59,28 @@ class ScriptDiagnosticsMessageCollector(private val parentMessageCollector: Mess } parentMessageCollector?.report(severity, message, location) } + + fun report(diagnostic: ScriptDiagnostic) { + _diagnostics.add(diagnostic) + + if (parentMessageCollector == null) return + if (parentMessageCollector is ScriptDiagnosticsMessageCollector) { + parentMessageCollector.report(diagnostic) + return + } + + val locationStart = diagnostic.location?.start + parentMessageCollector.report( + diagnostic.severity.toCompilerMessageSeverity(), + diagnostic.message, + CompilerMessageLocation.create( + null, + locationStart?.line ?: -1, + locationStart?.col ?: -1, + null + ) + ) + } } private fun CompilerMessageSeverity.toScriptingSeverity(): ScriptDiagnostic.Severity? = when (this) { diff --git a/plugins/scripting/scripting-ide-services-test/test/org/jetbrains/kotlin/scripting/ide_services/ReplCompletionAndErrorsAnalysisTest.kt b/plugins/scripting/scripting-ide-services-test/test/org/jetbrains/kotlin/scripting/ide_services/ReplCompletionAndErrorsAnalysisTest.kt index 6fd33962c34..95c45948cc6 100644 --- a/plugins/scripting/scripting-ide-services-test/test/org/jetbrains/kotlin/scripting/ide_services/ReplCompletionAndErrorsAnalysisTest.kt +++ b/plugins/scripting/scripting-ide-services-test/test/org/jetbrains/kotlin/scripting/ide_services/ReplCompletionAndErrorsAnalysisTest.kt @@ -198,6 +198,20 @@ class ReplCompletionAndErrorsAnalysisTest : TestCase() { } } + @Test + fun testIncompleteCode() = test { + run { + doErrorCheck + + code = "fun g(): Int { return 1" + + expect { + addError(1, 24, 1, 24, "Expecting '}'", "ERROR") + errors.add(ScriptDiagnostic(ScriptDiagnostic.incompleteCode, "Incomplete code")) + } + } + } + @Test fun testCompletionDuplication() = test { for (i in 1..6) { diff --git a/plugins/scripting/scripting-ide-services-test/test/org/jetbrains/kotlin/scripting/ide_services/test_util/testConfiguration.kt b/plugins/scripting/scripting-ide-services-test/test/org/jetbrains/kotlin/scripting/ide_services/test_util/testConfiguration.kt index 9394381c0fc..0a702307e9f 100644 --- a/plugins/scripting/scripting-ide-services-test/test/org/jetbrains/kotlin/scripting/ide_services/test_util/testConfiguration.kt +++ b/plugins/scripting/scripting-ide-services-test/test/org/jetbrains/kotlin/scripting/ide_services/test_util/testConfiguration.kt @@ -283,7 +283,7 @@ private suspend fun checkEvaluateInRepl( checkLists(index, "completions", expectedCompletions.list, completionsRes, expectedCompletions) val expectedErrorsWithPath = expectedErrors.list.map { - it.copy(sourcePath = errorsRes.firstOrNull()?.sourcePath) + if (it.location != null) it.copy(sourcePath = errorsRes.firstOrNull()?.sourcePath) else it } checkLists(index, "errors", expectedErrorsWithPath, errorsRes, expectedErrors) TestCase.assertEquals("Analysis result types are different", expectedResultType, resultType) diff --git a/plugins/scripting/scripting-ide-services/src/org/jetbrains/kotlin/scripting/ide_services/compiler/KJvmReplCompilerWithIdeServices.kt b/plugins/scripting/scripting-ide-services/src/org/jetbrains/kotlin/scripting/ide_services/compiler/KJvmReplCompilerWithIdeServices.kt index 0e87b9c9dd2..634e641ca3d 100644 --- a/plugins/scripting/scripting-ide-services/src/org/jetbrains/kotlin/scripting/ide_services/compiler/KJvmReplCompilerWithIdeServices.kt +++ b/plugins/scripting/scripting-ide-services/src/org/jetbrains/kotlin/scripting/ide_services/compiler/KJvmReplCompilerWithIdeServices.kt @@ -111,7 +111,7 @@ class KJvmReplCompilerWithIdeServices(hostConfiguration: ScriptingHostConfigurat newSnippet, messageCollector, compilationState, - checkSyntaxErrors = false + failOnSyntaxErrors = false ).valueOr { return it } val analysisResult =