From fd94a2e0ff9c0f6660267f64fd6641e1d74ab2b8 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Thu, 14 May 2020 20:10:31 +0300 Subject: [PATCH] IDEA-238791: rearrange nodes GitOrigin-RevId: 00534e2c70577a2b74de01de7ecb500abad2e600 --- .../problemsView/toolWindow/FileProblems.kt | 40 ++++++++++++++----- .../toolWindow/HighlightingFileRoot.kt | 17 ++++---- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/analysis/problemsView/toolWindow/FileProblems.kt b/platform/lang-impl/src/com/intellij/analysis/problemsView/toolWindow/FileProblems.kt index caa62cbaa3de..75e8789cd357 100644 --- a/platform/lang-impl/src/com/intellij/analysis/problemsView/toolWindow/FileProblems.kt +++ b/platform/lang-impl/src/com/intellij/analysis/problemsView/toolWindow/FileProblems.kt @@ -1,22 +1,40 @@ // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.analysis.problemsView.toolWindow -internal class FileProblems { +import com.intellij.openapi.vfs.VirtualFile + +internal class FileProblems(val file: VirtualFile) { private val problems = mutableSetOf() private val nodes = mutableMapOf() + private var fileNode: FileNode? = null - fun getNodes(parent: FileNode): Collection { - problems.forEach { problem -> - var node = nodes[problem] - if (node == null || parent !== node.parentDescriptor) { - node = ProblemNode(parent, problem) - nodes[problem] = node - } - } - return nodes.values + fun getFileNode(parent: Node): FileNode { + val oldNode = fileNode + if (oldNode?.parentDescriptor === parent) return oldNode + val newNode = FileNode(parent, file) + fileNode = newNode + nodes.clear() + return newNode } - fun findNode(problem: Problem) = nodes[problem] + private fun getProblemNode(parent: FileNode, problem: Problem): ProblemNode { + val oldNode = nodes[problem] + if (oldNode?.parentDescriptor === parent) return oldNode + val newNode = ProblemNode(parent, problem) + nodes[problem] = newNode + return newNode + } + + fun getProblemNodes(): Collection { + if (problems.isEmpty()) return emptyList() + val parent = fileNode ?: return emptyList() + return problems.map { getProblemNode(parent, it) } + } + + fun findProblemNode(problem: Problem): ProblemNode? { + val parent = fileNode ?: return null + return getProblemNode(parent, problem) + } fun add(problem: Problem) = problems.add(problem) diff --git a/platform/lang-impl/src/com/intellij/analysis/problemsView/toolWindow/HighlightingFileRoot.kt b/platform/lang-impl/src/com/intellij/analysis/problemsView/toolWindow/HighlightingFileRoot.kt index 382ce2febd4e..6366acc4e9ad 100644 --- a/platform/lang-impl/src/com/intellij/analysis/problemsView/toolWindow/HighlightingFileRoot.kt +++ b/platform/lang-impl/src/com/intellij/analysis/problemsView/toolWindow/HighlightingFileRoot.kt @@ -13,24 +13,23 @@ import com.intellij.ui.tree.LeafState internal class HighlightingFileRoot(panel: ProblemsViewPanel, val file: VirtualFile) : Root(panel), LeafState.Supplier, MarkupModelListener, Disposable { - private val myProblems = FileProblems() - private val myFileNode = FileNode(this, file) + private val problems = FileProblems(file) init { refreshChildren() } override fun getChildren(): Collection { - return listOf(myFileNode) + return synchronized(problems) { listOf(problems.getFileNode(this)) } } override fun getChildren(file: VirtualFile): Collection { - return synchronized(myProblems) { myProblems.getNodes(myFileNode).toList() } + return synchronized(problems) { problems.getProblemNodes() } } fun findProblemNode(info: HighlightInfo?): ProblemNode? { val problem = getProblem(info) ?: return null - return synchronized(myProblems) { myProblems.findNode(problem) } + return synchronized(problems) { problems.findProblemNode(problem) } } private fun refreshChildren() { @@ -45,13 +44,13 @@ internal class HighlightingFileRoot(panel: ProblemsViewPanel, val file: VirtualF override fun afterAdded(highlighter: RangeHighlighterEx) { val problem = getProblem(highlighter) ?: return - synchronized(myProblems) { myProblems.add(problem) } + synchronized(problems) { problems.add(problem) } structureChanged() } override fun beforeRemoved(highlighter: RangeHighlighterEx) { val problem = getProblem(highlighter) ?: return - synchronized(myProblems) { myProblems.remove(problem) } + synchronized(problems) { problems.remove(problem) } structureChanged() } @@ -72,7 +71,7 @@ internal class HighlightingFileRoot(panel: ProblemsViewPanel, val file: VirtualF return if (info?.description == null) null else HighlightingProblem(info) } - override fun getProblemsCount() = synchronized(myProblems) { myProblems.count() } + override fun getProblemsCount() = synchronized(problems) { problems.count() } - override fun getProblemsCount(file: VirtualFile, severity: Severity) = synchronized(myProblems) { myProblems.count(severity) } + override fun getProblemsCount(file: VirtualFile, severity: Severity) = synchronized(problems) { problems.count(severity) } }