in src/org/jetbrains/r/rinterop/rstudioapi/RStudioApiUtils.kt [130:188]
fun sourceMarkers(rInterop: RInteropImpl, args: RObject) {
val name = args.list.getRObjects(0).rString.getStrings(0)
val markers = args.list.getRObjects(1).list.rObjectsList.map { marker ->
marker.list.rObjectsList
}
val basePath = args.list.getRObjects(2).toStringOrNull()
var autoSelect = args.list.getRObjects(3).rString.getStrings(0).let {
if (it == "none") null
else it
}
val projectMarkers = rInterop.project.getUserData(SOURCE_MARKERS_KEY)
?: rInterop.project.putUserData(SOURCE_MARKERS_KEY, ConcurrentHashMap<String, SourceMarkers>()).let {
rInterop.project.getUserData(SOURCE_MARKERS_KEY) ?: throw Error("projectMarkers is null")
}
val markerMap = hashMapOf<String, MutableList<RStudioAPISourceMarkerInspection.RStudioAPIMarker>>()
if (autoSelect == "error" && markers.none { it[0].rString.getStrings(0) == "error" }) {
autoSelect = "first"
}
for (marker in markers) {
val type = marker[0].rString.getStrings(0)
val file = marker[1].rString.getStrings(0)
val line = marker[2].rInt.getInts(0).toInt()
val column = marker[3].rInt.getInts(0).toInt()
val message = marker[4].rString.getStrings(0)
val filePath = (basePath ?: "") + file
val problemHighlightType = when (type) {
"error" -> ProblemHighlightType.GENERIC_ERROR
"warning", "style" -> ProblemHighlightType.WARNING
"info", "usage" -> ProblemHighlightType.WEAK_WARNING
else -> return
}
if (autoSelect == "first" || (autoSelect == "error" && type == "error")) {
findFileByPathAtHostHelper(rInterop, filePath).then { virtualFile ->
FileEditorManager.getInstance(rInterop.project).openFile(virtualFile ?: return@then, true)
val document = virtualFile.let { FileDocumentManager.getInstance().getDocument(it) }
if (document == null) {
return@then
}
val editors = EditorFactory.getInstance().editors(document, rInterop.project).toList()
for (e in editors) {
val offset = getLineOffset(document, line - 1, column - 1)
e.caretModel.primaryCaret.moveToOffset(offset)
}
ProblemsView.toggleCurrentFileProblems(rInterop.project, virtualFile, document)
}
autoSelect = null
}
val problem = RStudioAPISourceMarkerInspection.RStudioAPIMarker(problemHighlightType, message, line, column)
markerMap[filePath]?.add(problem) ?: markerMap.put(filePath, mutableListOf(problem))
}
markerMap.map {
projectMarkers.putIfAbsent(it.key, SourceMarkers())
projectMarkers[it.key]?.put(name, it.value)
}
}