IDEA-354490 Fixes

GitOrigin-RevId: 9df9d602e6108746d291f5a2d3d04e3f52d20347
This commit is contained in:
Anton Kozub
2024-09-04 15:23:23 +00:00
committed by intellij-monorepo-bot
parent 245479dba8
commit 882595690b
6 changed files with 67 additions and 50 deletions
@@ -1,13 +1,30 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.lang.java.logical
import com.intellij.ide.structureView.logical.ConvertElementsProvider
import com.intellij.ide.structureView.logical.LogicalStructureElementsProvider
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiClassOwner
class ClassOwnerLogicalStructureElementsProvider: LogicalStructureElementsProvider<PsiClassOwner, PsiClass> {
override fun getElements(parent: PsiClassOwner): List<PsiClass> {
return parent.classes.toList()
class ClassOwnerLogicalStructureElementsProvider: LogicalStructureElementsProvider<PsiClassOwner, Any> {
override fun getElements(parent: PsiClassOwner): List<Any> {
val result = mutableListOf<Any>()
var convertedAtLeastOne = false
for (psiClass in parent.classes) {
val convertedModels = LogicalStructureElementsProvider.getProviders(psiClass)
.filterIsInstance<ConvertElementsProvider<PsiClass, Any>>()
.map { it.convert(psiClass) }
.filterNotNull()
if (convertedModels.count() > 0) {
convertedModels.forEach { result.add(it) }
convertedAtLeastOne = true
}
else {
result.add(psiClass)
}
}
if (convertedAtLeastOne) return result
return emptyList()
}
override fun forLogicalModelClass(): Class<PsiClassOwner> = PsiClassOwner::class.java
}
@@ -77,12 +77,6 @@ f:com.intellij.ide.structureView.logical.impl.LogicalStructureViewService
- f:getLogicalStructureBuilder(com.intellij.psi.PsiFile):com.intellij.ide.structureView.StructureViewBuilder
f:com.intellij.ide.structureView.logical.impl.LogicalStructureViewService$Companion
- f:getInstance(com.intellij.openapi.project.Project):com.intellij.ide.structureView.logical.impl.LogicalStructureViewService
com.intellij.ide.structureView.logical.impl.LogicalStructureViewTreeElement
- com.intellij.ide.structureView.StructureViewTreeElement
- a:getLogicalAssembledModel():com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel
f:com.intellij.ide.structureView.logical.impl.LogicalStructureViewTreeElementsKt
- sf:createViewTreeElement(com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel,java.lang.String):com.intellij.ide.structureView.StructureViewTreeElement
- bs:createViewTreeElement$default(com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel,java.lang.String,I,java.lang.Object):com.intellij.ide.structureView.StructureViewTreeElement
f:com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel
- sf:Companion:com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel$Companion
- f:getChildren():java.util.List
@@ -19,10 +19,14 @@
*/
package com.intellij.ide.highlighter;
import com.intellij.ide.structureView.StructureView;
import com.intellij.ide.structureView.StructureViewBuilder;
import com.intellij.ide.structureView.StructureViewBuilderProvider;
import com.intellij.ide.structureView.impl.StructureViewComposite;
import com.intellij.ide.structureView.logical.impl.LogicalStructureViewService;
import com.intellij.lang.LanguageStructureViewBuilder;
import com.intellij.lang.PsiStructureViewFactory;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.LanguageFileType;
import com.intellij.openapi.project.Project;
@@ -44,6 +48,19 @@ public class LanguageFileTypeStructureViewBuilderProvider implements StructureVi
if (psiFile == null) return null;
final PsiStructureViewFactory factory = LanguageStructureViewBuilder.getInstance().forLanguage(psiFile.getLanguage());
return factory == null ? null : factory.getStructureViewBuilder(psiFile);
if (factory == null) return null;
StructureViewBuilder physicalBuilder = factory.getStructureViewBuilder(psiFile);
if (physicalBuilder == null) return null;
StructureViewBuilder logicalBuilder = LogicalStructureViewService.Companion.getInstance(project).getLogicalStructureBuilder(psiFile);
if (logicalBuilder == null) return physicalBuilder;
return new StructureViewBuilder() {
@Override
public @NotNull StructureView createStructureView(@Nullable FileEditor fileEditor, @NotNull Project project) {
return new StructureViewComposite(
new StructureViewComposite.StructureViewDescriptor("Logical", logicalBuilder.createStructureView(fileEditor, project), null),
new StructureViewComposite.StructureViewDescriptor("Physical", physicalBuilder.createStructureView(fileEditor, project), null)
);
}
};
}
}
@@ -2,29 +2,43 @@
package com.intellij.ide.structureView.logical.impl
import com.intellij.ide.TypePresentationService
import com.intellij.ide.structureView.StructureViewModel
import com.intellij.ide.structureView.StructureViewModelBase
import com.intellij.ide.structureView.StructureViewTreeElement
import com.intellij.ide.structureView.impl.common.PsiTreeElementBase
import com.intellij.ide.structureView.logical.LogicalStructureTreeElementProvider
import com.intellij.ide.structureView.logical.PropertyElementProvider
import com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel
import com.intellij.ide.util.treeView.smartTree.TreeElement
import com.intellij.navigation.ColoredItemPresentation
import com.intellij.navigation.ItemPresentation
import com.intellij.openapi.editor.HighlighterColors
import com.intellij.openapi.editor.colors.TextAttributesKey
import com.intellij.openapi.editor.markup.TextAttributes
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiTarget
import java.awt.Font
import javax.swing.Icon
/**
* @param parentKey is needed to distinguish similar nodes in different branches.
* Because the logical model may be recursive or the same element can be present a few times (e.g: two controllers depend on the same service)
* @return structure tree element basing on logical model
* The model's children will be transformed into child tree elements
*/
fun <T> createViewTreeElement(assembledModel: LogicalStructureAssembledModel<T>, parentKey: String = "root"): StructureViewTreeElement {
internal class LogicalStructureViewModel(psiFile: PsiFile, editor: Editor?, assembledModel: LogicalStructureAssembledModel<*>)
: StructureViewModelBase(psiFile, editor, createViewTreeElement(assembledModel, "root")),
StructureViewModel.ElementInfoProvider, StructureViewModel.ExpandInfoProvider {
override fun isAlwaysShowsPlus(element: StructureViewTreeElement?): Boolean {
return element is LogicalGroupStructureElement
}
override fun isAlwaysLeaf(element: StructureViewTreeElement?): Boolean {
return element is PropertyPsiElementStructureElement<*> || element is PropertyStructureElement
}
override fun isAutoExpand(element: StructureViewTreeElement): Boolean {
return false //(element as? LogicalStructureViewTreeElement<*>)?.getLogicalAssembledModel()?.model !is BackReferenceLogicalModel
}
override fun isSmartExpand(): Boolean {
return false
}
}
private fun <T> createViewTreeElement(assembledModel: LogicalStructureAssembledModel<T>, parentKey: String): StructureViewTreeElement {
val model = assembledModel.model
val explicitElement = LogicalStructureTreeElementProvider.getTreeElement(model)
if (explicitElement != null) return explicitElement
@@ -73,7 +87,7 @@ private fun getPsiElement(model: Any?): PsiElement? {
}
}
interface LogicalStructureViewTreeElement<T>: StructureViewTreeElement {
private interface LogicalStructureViewTreeElement<T>: StructureViewTreeElement {
fun getLogicalAssembledModel(): LogicalStructureAssembledModel<T>
@@ -3,7 +3,6 @@ package com.intellij.ide.structureView.logical.impl
import com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel
import com.intellij.ide.structureView.*
import com.intellij.ide.util.treeView.smartTree.Grouper
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.Service
import com.intellij.openapi.editor.Editor
@@ -37,29 +36,4 @@ class LogicalStructureViewService(
}
}
}
private class LogicalStructureViewModel(psiFile: PsiFile, editor: Editor?, assembledModel: LogicalStructureAssembledModel<*>)
: StructureViewModelBase(psiFile, editor, createViewTreeElement(assembledModel)),
StructureViewModel.ElementInfoProvider, StructureViewModel.ExpandInfoProvider {
override fun isAlwaysShowsPlus(element: StructureViewTreeElement?): Boolean {
return false
}
override fun isAlwaysLeaf(element: StructureViewTreeElement?): Boolean {
return false
}
//override fun getGroupers(): Array<Grouper> {
// return arrayOf(LogicalGrouper())
//}
override fun isAutoExpand(element: StructureViewTreeElement): Boolean {
return false
}
override fun isSmartExpand(): Boolean {
return false
}
}
@@ -23,8 +23,9 @@ class LogicalStructureAssembledModel<T> private constructor(
fun getChildren(): List<LogicalStructureAssembledModel<*>> {
return LogicalStructureElementsProvider.getProviders(model!!)
.filter { it !is ConvertElementsProvider }
.flatMap { it.getElements(model) }
.flatMap { ConvertElementsProvider.convert(it) }
//.flatMap { ConvertElementsProvider.convert(it) }
.map { LogicalStructureAssembledModel(project, it) }
.toList()
}