Scripts: switch ScriptReportSink to new scripting API

Use ScriptDiagnostic instead of ScripReport
This commit is contained in:
Natalia Selezneva
2019-07-09 12:58:28 +03:00
parent bd0f947222
commit e4d0c2cb0e
7 changed files with 53 additions and 51 deletions
@@ -38,7 +38,8 @@ import com.intellij.psi.PsiFile
import com.intellij.util.ui.UIUtil import com.intellij.util.ui.UIUtil
import org.jetbrains.kotlin.idea.core.script.IdeScriptReportSink import org.jetbrains.kotlin.idea.core.script.IdeScriptReportSink
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import kotlin.script.experimental.dependencies.ScriptReport import kotlin.script.experimental.api.ScriptDiagnostic
import kotlin.script.experimental.api.SourceCode
class ScriptExternalHighlightingPass( class ScriptExternalHighlightingPass(
private val file: KtFile, private val file: KtFile,
@@ -53,8 +54,8 @@ class ScriptExternalHighlightingPass(
val reports = IdeScriptReportSink.getReports(file.virtualFile) val reports = IdeScriptReportSink.getReports(file.virtualFile)
val annotations = reports.mapNotNull { (message, severity, position) -> val annotations = reports.mapNotNull { (message, severity, _ , location) ->
val (startOffset, endOffset) = position?.let { computeOffsets(document, position) } ?: 0 to 0 val (startOffset, endOffset) = location?.let { computeOffsets(document, it) } ?: 0 to 0
val annotation = Annotation( val annotation = Annotation(
startOffset, startOffset,
endOffset, endOffset,
@@ -73,14 +74,14 @@ class ScriptExternalHighlightingPass(
UpdateHighlightersUtil.setHighlightersToEditor(myProject, myDocument!!, 0, file.textLength, infos, colorsScheme, id) UpdateHighlightersUtil.setHighlightersToEditor(myProject, myDocument!!, 0, file.textLength, infos, colorsScheme, id)
} }
private fun computeOffsets(document: Document, position: ScriptReport.Position): Pair<Int, Int> { private fun computeOffsets(document: Document, position: SourceCode.Location): Pair<Int, Int> {
val startLine = position.startLine.coerceLineIn(document) val startLine = position.start.line.coerceLineIn(document)
val startOffset = document.offsetBy(startLine, position.startColumn) val startOffset = document.offsetBy(startLine, position.start.col)
val endLine = position.endLine?.coerceAtLeast(startLine)?.coerceLineIn(document) ?: startLine val endLine = position.end?.line?.coerceAtLeast(startLine)?.coerceLineIn(document) ?: startLine
val endOffset = document.offsetBy( val endOffset = document.offsetBy(
endLine, endLine,
position.endColumn ?: document.getLineEndOffset(endLine) position.end?.col ?: document.getLineEndOffset(endLine)
).coerceAtLeast(startOffset) ).coerceAtLeast(startOffset)
return startOffset to endOffset return startOffset to endOffset
@@ -92,13 +93,13 @@ class ScriptExternalHighlightingPass(
return (getLineStartOffset(line) + col).coerceIn(getLineStartOffset(line), getLineEndOffset(line)) return (getLineStartOffset(line) + col).coerceIn(getLineStartOffset(line), getLineEndOffset(line))
} }
private fun ScriptReport.Severity.convertSeverity(): HighlightSeverity? { private fun ScriptDiagnostic.Severity.convertSeverity(): HighlightSeverity? {
return when (this) { return when (this) {
ScriptReport.Severity.FATAL -> ERROR ScriptDiagnostic.Severity.FATAL -> ERROR
ScriptReport.Severity.ERROR -> ERROR ScriptDiagnostic.Severity.ERROR -> ERROR
ScriptReport.Severity.WARNING -> WARNING ScriptDiagnostic.Severity.WARNING -> WARNING
ScriptReport.Severity.INFO -> INFORMATION ScriptDiagnostic.Severity.INFO -> INFORMATION
ScriptReport.Severity.DEBUG -> if (ApplicationManager.getApplication().isInternal) INFORMATION else null ScriptDiagnostic.Severity.DEBUG -> if (ApplicationManager.getApplication().isInternal) INFORMATION else null
} }
} }
@@ -41,7 +41,8 @@ import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager
import org.jetbrains.kotlin.idea.core.script.ScriptsCompilationConfigurationUpdater import org.jetbrains.kotlin.idea.core.script.ScriptsCompilationConfigurationUpdater
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import kotlin.script.experimental.dependencies.ScriptReport import kotlin.script.experimental.api.ScriptDiagnostic
import kotlin.script.experimental.api.SourceCode
class ScriptExternalHighlightingPass( class ScriptExternalHighlightingPass(
private val file: KtFile, private val file: KtFile,
@@ -74,8 +75,8 @@ class ScriptExternalHighlightingPass(
val reports = IdeScriptReportSink.getReports(file.virtualFile) val reports = IdeScriptReportSink.getReports(file.virtualFile)
val annotations = reports.mapNotNull { (message, severity, position) -> val annotations = reports.mapNotNull { (message, severity, _ , location) ->
val (startOffset, endOffset) = position?.let { computeOffsets(document, position) } ?: 0 to 0 val (startOffset, endOffset) = location?.let { computeOffsets(document, it) } ?: 0 to 0
val annotation = Annotation( val annotation = Annotation(
startOffset, startOffset,
endOffset, endOffset,
@@ -94,14 +95,14 @@ class ScriptExternalHighlightingPass(
UpdateHighlightersUtil.setHighlightersToEditor(myProject, myDocument!!, 0, file.textLength, infos, colorsScheme, id) UpdateHighlightersUtil.setHighlightersToEditor(myProject, myDocument!!, 0, file.textLength, infos, colorsScheme, id)
} }
private fun computeOffsets(document: Document, position: ScriptReport.Position): Pair<Int, Int> { private fun computeOffsets(document: Document, position: SourceCode.Location): Pair<Int, Int> {
val startLine = position.startLine.coerceLineIn(document) val startLine = position.start.line.coerceLineIn(document)
val startOffset = document.offsetBy(startLine, position.startColumn) val startOffset = document.offsetBy(startLine, position.start.col)
val endLine = position.endLine?.coerceAtLeast(startLine)?.coerceLineIn(document) ?: startLine val endLine = position.end?.line?.coerceAtLeast(startLine)?.coerceLineIn(document) ?: startLine
val endOffset = document.offsetBy( val endOffset = document.offsetBy(
endLine, endLine,
position.endColumn ?: document.getLineEndOffset(endLine) position.end?.col ?: document.getLineEndOffset(endLine)
).coerceAtLeast(startOffset) ).coerceAtLeast(startOffset)
return startOffset to endOffset return startOffset to endOffset
@@ -113,13 +114,13 @@ class ScriptExternalHighlightingPass(
return (getLineStartOffset(line) + col).coerceIn(getLineStartOffset(line), getLineEndOffset(line)) return (getLineStartOffset(line) + col).coerceIn(getLineStartOffset(line), getLineEndOffset(line))
} }
private fun ScriptReport.Severity.convertSeverity(): HighlightSeverity? { private fun ScriptDiagnostic.Severity.convertSeverity(): HighlightSeverity? {
return when (this) { return when (this) {
ScriptReport.Severity.FATAL -> ERROR ScriptDiagnostic.Severity.FATAL -> ERROR
ScriptReport.Severity.ERROR -> ERROR ScriptDiagnostic.Severity.ERROR -> ERROR
ScriptReport.Severity.WARNING -> WARNING ScriptDiagnostic.Severity.WARNING -> WARNING
ScriptReport.Severity.INFO -> INFORMATION ScriptDiagnostic.Severity.INFO -> INFORMATION
ScriptReport.Severity.DEBUG -> if (ApplicationManager.getApplication().isInternal) INFORMATION else null ScriptDiagnostic.Severity.DEBUG -> if (ApplicationManager.getApplication().isInternal) INFORMATION else null
} }
} }
@@ -25,14 +25,14 @@ import com.intellij.psi.PsiManager
import com.intellij.ui.EditorNotifications import com.intellij.ui.EditorNotifications
import org.jetbrains.kotlin.psi.UserDataProperty import org.jetbrains.kotlin.psi.UserDataProperty
import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink
import kotlin.script.experimental.dependencies.ScriptReport import kotlin.script.experimental.api.ScriptDiagnostic
class IdeScriptReportSink(val project: Project) : ScriptReportSink { class IdeScriptReportSink(val project: Project) : ScriptReportSink {
override fun attachReports(scriptFile: VirtualFile, reports: List<ScriptReport>) { override fun attachReports(scriptFile: VirtualFile, reports: List<ScriptDiagnostic>) {
if (getReports(scriptFile) == reports) return if (getReports(scriptFile) == reports) return
// TODO: persist errors between launches? // TODO: persist errors between launches?
scriptFile.scriptReports = reports scriptFile.scriptDiagnostics = reports
ApplicationManager.getApplication().invokeLater { ApplicationManager.getApplication().invokeLater {
if (scriptFile.isValid && !project.isDisposed) { if (scriptFile.isValid && !project.isDisposed) {
@@ -45,10 +45,10 @@ class IdeScriptReportSink(val project: Project) : ScriptReportSink {
} }
companion object { companion object {
fun getReports(file: VirtualFile): List<ScriptReport> { fun getReports(file: VirtualFile): List<ScriptDiagnostic> {
return file.scriptReports ?: emptyList() return file.scriptDiagnostics ?: emptyList()
} }
private var VirtualFile.scriptReports: List<ScriptReport>? by UserDataProperty(Key.create("KOTLIN_SCRIPT_REPORTS")) private var VirtualFile.scriptDiagnostics: List<ScriptDiagnostic>? by UserDataProperty(Key.create("KOTLIN_SCRIPT_DIAGNOSTICS"))
} }
} }
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrap
import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink
import kotlin.script.experimental.api.ResultWithDiagnostics import kotlin.script.experimental.api.ResultWithDiagnostics
import kotlin.script.experimental.api.valueOrNull import kotlin.script.experimental.api.valueOrNull
import kotlin.script.experimental.jvm.compat.mapToLegacyReports
// TODO: rename and provide alias for compatibility - this is not only about dependencies anymore // TODO: rename and provide alias for compatibility - this is not only about dependencies anymore
abstract class ScriptDependenciesLoader(protected val project: Project) { abstract class ScriptDependenciesLoader(protected val project: Project) {
@@ -77,7 +76,7 @@ abstract class ScriptDependenciesLoader(protected val project: Project) {
} }
private fun attachReportsIfChanged(result: ResultWithDiagnostics<*>, file: VirtualFile) { private fun attachReportsIfChanged(result: ResultWithDiagnostics<*>, file: VirtualFile) {
reporter.attachReports(file, result.reports.mapToLegacyReports()) reporter.attachReports(file, result.reports)
} }
private fun save(compilationConfigurationResult: ScriptCompilationConfigurationResult?, file: VirtualFile) { private fun save(compilationConfigurationResult: ScriptCompilationConfigurationResult?, file: VirtualFile) {
@@ -17,8 +17,8 @@
package org.jetbrains.kotlin.scripting.resolve package org.jetbrains.kotlin.scripting.resolve
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import kotlin.script.experimental.dependencies.ScriptReport import kotlin.script.experimental.api.ScriptDiagnostic
interface ScriptReportSink { interface ScriptReportSink {
fun attachReports(scriptFile: VirtualFile, reports: List<ScriptReport>) fun attachReports(scriptFile: VirtualFile, reports: List<ScriptDiagnostic>)
} }
@@ -39,7 +39,7 @@ class CliScriptDependenciesProvider(private val project: Project) : ScriptDepend
if (scriptDef != null) { if (scriptDef != null) {
val result = refineScriptCompilationConfiguration(VirtualFileScriptSource(file), scriptDef, project) val result = refineScriptCompilationConfiguration(VirtualFileScriptSource(file), scriptDef, project)
ServiceManager.getService(project, ScriptReportSink::class.java)?.attachReports(file, result.reports.mapToLegacyReports()) ServiceManager.getService(project, ScriptReportSink::class.java)?.attachReports(file, result.reports)
if (result is ResultWithDiagnostics.Success) { if (result is ResultWithDiagnostics.Success) {
log.info("[kts] new cached deps for $path: ${result.value.dependenciesClassPath.joinToString(File.pathSeparator)}") log.info("[kts] new cached deps for $path: ${result.value.dependenciesClassPath.joinToString(File.pathSeparator)}")
@@ -10,27 +10,28 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink
import kotlin.script.experimental.dependencies.ScriptReport import kotlin.script.experimental.api.ScriptDiagnostic
import kotlin.script.experimental.api.SourceCode
internal class CliScriptReportSink(private val messageCollector: MessageCollector) : internal class CliScriptReportSink(private val messageCollector: MessageCollector) :
ScriptReportSink { ScriptReportSink {
override fun attachReports(scriptFile: VirtualFile, reports: List<ScriptReport>) { override fun attachReports(scriptFile: VirtualFile, reports: List<ScriptDiagnostic>) {
reports.forEach { reports.forEach {
messageCollector.report(it.severity.convertSeverity(), it.message, location(scriptFile, it.position)) messageCollector.report(it.severity.convertSeverity(), it.message, location(scriptFile, it.location))
} }
} }
private fun location(scriptFile: VirtualFile, position: ScriptReport.Position?): CompilerMessageLocation? { private fun location(scriptFile: VirtualFile, location: SourceCode.Location?): CompilerMessageLocation? {
if (position == null) return CompilerMessageLocation.create(scriptFile.path) if (location == null) return CompilerMessageLocation.create(scriptFile.path)
return CompilerMessageLocation.create(scriptFile.path, position.startLine, position.startColumn, null) return CompilerMessageLocation.create(scriptFile.path, location.start.line, location.start.col, null)
} }
private fun ScriptReport.Severity.convertSeverity(): CompilerMessageSeverity = when (this) { private fun ScriptDiagnostic.Severity.convertSeverity(): CompilerMessageSeverity = when (this) {
ScriptReport.Severity.FATAL -> CompilerMessageSeverity.ERROR ScriptDiagnostic.Severity.FATAL -> CompilerMessageSeverity.ERROR
ScriptReport.Severity.ERROR -> CompilerMessageSeverity.ERROR ScriptDiagnostic.Severity.ERROR -> CompilerMessageSeverity.ERROR
ScriptReport.Severity.WARNING -> CompilerMessageSeverity.WARNING ScriptDiagnostic.Severity.WARNING -> CompilerMessageSeverity.WARNING
ScriptReport.Severity.INFO -> CompilerMessageSeverity.INFO ScriptDiagnostic.Severity.INFO -> CompilerMessageSeverity.INFO
ScriptReport.Severity.DEBUG -> CompilerMessageSeverity.LOGGING ScriptDiagnostic.Severity.DEBUG -> CompilerMessageSeverity.LOGGING
} }
} }