fun sourceMarkers()

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)
    }
  }