Skip to content

Commit 6f18a38

Browse files
committed
feat: display occurrences in std search usage (#642)
Signed-off-by: Andre Dietisheim <[email protected]>
1 parent a61eb75 commit 6f18a38

31 files changed

+3661
-565
lines changed

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/ResourceEditorFactory.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,6 @@ open class ResourceEditorFactory protected constructor(
171171

172172
/* for testing purposes */
173173
protected open fun getTelemetryMessageBuilder(): TelemetryMessageBuilder {
174-
return TelemetryService.instance;
174+
return TelemetryService.instance
175175
}
176176
}

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/ResourceEditorInlayHintsProvider.kt

+25-14
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import com.intellij.codeInsight.hints.InlayHintsProvider
2020
import com.intellij.codeInsight.hints.InlayHintsSink
2121
import com.intellij.codeInsight.hints.NoSettings
2222
import com.intellij.codeInsight.hints.SettingsKey
23+
import com.intellij.codeInsight.hints.presentation.PresentationFactory
2324
import com.intellij.json.psi.JsonFile
24-
import com.intellij.openapi.application.ApplicationManager
2525
import com.intellij.openapi.application.ReadAction
2626
import com.intellij.openapi.editor.Editor
2727
import com.intellij.psi.PsiElement
@@ -30,6 +30,7 @@ import com.intellij.ui.dsl.builder.panel
3030
import com.redhat.devtools.intellij.common.validation.KubernetesTypeInfo
3131
import com.redhat.devtools.intellij.kubernetes.editor.inlay.base64.Base64Presentations
3232
import com.redhat.devtools.intellij.kubernetes.editor.inlay.selector.SelectorPresentations
33+
import com.redhat.devtools.intellij.kubernetes.editor.util.PsiElements
3334
import org.jetbrains.yaml.psi.YAMLFile
3435
import javax.swing.JComponent
3536

@@ -66,35 +67,45 @@ internal class ResourceEditorInlayHintsProvider : InlayHintsProvider<NoSettings>
6667
}
6768
return when(element) {
6869
is YAMLFile -> {
69-
create(element, sink, editor)
70+
create(element, sink, editor, factory)
7071
false
7172
}
7273
is JsonFile -> {
73-
create(element, sink, editor)
74+
create(element, sink, editor, factory)
7475
false
7576
}
7677
else -> true
7778
}
7879
}
7980

80-
private fun create(file: YAMLFile, sink: InlayHintsSink, editor: Editor) {
81+
private fun create(file: YAMLFile, sink: InlayHintsSink, editor: Editor, factory: PresentationFactory) {
8182
return ReadAction.run<Exception> {
82-
file.documents.forEach { document ->
83-
val info = KubernetesTypeInfo.create(document) ?: return@forEach
84-
val element = document.topLevelValue ?: return@forEach
85-
Base64Presentations.create(element, info, sink, editor)
86-
SelectorPresentations.create(element, file, info, sink, editor)
87-
}
83+
file.documents
84+
.mapNotNull { document -> document.topLevelValue }
85+
.forEach { element ->
86+
createPresentations(element, sink, editor, factory)
87+
}
8888
}
8989
}
9090

91-
private fun create(file: JsonFile, sink: InlayHintsSink, editor: Editor) {
91+
private fun create(file: JsonFile, sink: InlayHintsSink, editor: Editor, factory: PresentationFactory) {
9292
return ReadAction.run<Exception> {
93-
val info = KubernetesTypeInfo.create(file) ?: return@run
94-
val element = file.topLevelValue ?: return@run
95-
Base64Presentations.create(element, info, sink, editor)
93+
file.allTopLevelValues.forEach { element ->
94+
createPresentations(element, sink, editor, factory)
95+
}
9696
}
9797
}
9898

99+
private fun createPresentations(element: PsiElement, sink: InlayHintsSink, editor: Editor, factory: PresentationFactory) {
100+
val info = KubernetesTypeInfo.create(element) ?: return
101+
Base64Presentations.create(element, info, sink, editor, factory)
102+
103+
val fileType = editor.virtualFile?.fileType ?: return
104+
val project = editor.project ?: return
105+
//PsiElements.getAll(fileType, project)
106+
val allElements = PsiElements.getAllNoExclusions(fileType, project)
107+
SelectorPresentations.createForSelector(element, allElements, sink, editor, factory)
108+
SelectorPresentations.createForAllLabels(element, allElements, sink, editor, factory)
109+
}
99110
}
100111
}

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/base64/Base64Presentations.kt

+39-23
Original file line numberDiff line numberDiff line change
@@ -40,26 +40,41 @@ object Base64Presentations {
4040
private const val SECRET_RESOURCE_KIND = "Secret"
4141
private const val CONFIGMAP_RESOURCE_KIND = "ConfigMap"
4242

43-
fun create(element: PsiElement, info: KubernetesTypeInfo, sink: InlayHintsSink, editor: Editor): Collection<InlayPresentation>? {
44-
return when {
43+
fun create(
44+
element: PsiElement,
45+
info: KubernetesTypeInfo,
46+
sink: InlayHintsSink,
47+
editor: Editor,
48+
factory: PresentationFactory,
49+
/* for testing purposes */
50+
stringPresentationFactory: (element: PsiElement, sink: InlayHintsSink, editor: Editor, factory: PresentationFactory) -> Unit
51+
= { element, sink, editor, factory ->
52+
StringPresentationsFactory(element, sink, editor, factory).create()
53+
},
54+
/* for testing purposes */
55+
binaryPresentationFactory: (element: PsiElement, sink: InlayHintsSink, editor: Editor, factory: PresentationFactory) -> Unit
56+
= { element, sink, editor, factory ->
57+
BinaryPresentationsFactory(element, sink, editor, factory).create()
58+
},
59+
) {
60+
when {
4561
isKubernetesResource(SECRET_RESOURCE_KIND, info) -> {
46-
val data = getDataValue(element) ?: return null
47-
StringPresentationsFactory(data, sink, editor).create()
62+
val data = element.getDataValue() ?: return
63+
stringPresentationFactory.invoke(data, sink, editor, factory)
4864
}
4965

5066
isKubernetesResource(CONFIGMAP_RESOURCE_KIND, info) -> {
51-
val binaryData = getBinaryData(element) ?: return null
52-
BinaryPresentationsFactory(binaryData, sink, editor).create()
67+
val binaryData = element.getBinaryData() ?: return
68+
binaryPresentationFactory.invoke(binaryData, sink, editor, factory)
5369
}
54-
55-
else -> null
5670
}
5771
}
5872

5973
abstract class InlayPresentationsFactory(
6074
private val element: PsiElement,
6175
protected val sink: InlayHintsSink,
62-
protected val editor: Editor
76+
protected val editor: Editor,
77+
protected val factory: PresentationFactory
6378
) {
6479

6580
protected companion object {
@@ -74,11 +89,10 @@ object Base64Presentations {
7489
}
7590

7691
protected abstract fun create(adapter: Base64ValueAdapter): InlayPresentation?
77-
7892
}
7993

80-
class StringPresentationsFactory(element: PsiElement, sink: InlayHintsSink, editor: Editor)
81-
: InlayPresentationsFactory(element, sink, editor) {
94+
class StringPresentationsFactory(element: PsiElement, sink: InlayHintsSink, editor: Editor, factory: PresentationFactory)
95+
: InlayPresentationsFactory(element, sink, editor, factory) {
8296

8397
override fun create(adapter: Base64ValueAdapter): InlayPresentation? {
8498
val decoded = adapter.getDecoded() ?: return null
@@ -88,20 +102,22 @@ object Base64Presentations {
88102
onValidValue(adapter::set, editor.project),
89103
editor
90104
)::show
91-
val presentation = create(decoded, onClick, editor) ?: return null
105+
val presentation = create(decoded, onClick, factory) ?: return null
92106
sink.addInlineElement(offset, false, presentation, false)
93107
return presentation
94108
}
95109

96-
private fun create(text: String, onClick: (event: MouseEvent) -> Unit, editor: Editor): InlayPresentation? {
97-
val factory = PresentationFactory(editor)
110+
private fun create(text: String, onClick: (event: MouseEvent) -> Unit, factory: PresentationFactory): InlayPresentation? {
98111
val trimmed = trimWithEllipsis(text, INLAY_HINT_MAX_WIDTH) ?: return null
99-
val textPresentation = factory.smallText(trimmed)
100-
val hoverPresentation = factory.referenceOnHover(textPresentation) { event, _ ->
101-
onClick.invoke(event)
102-
}
103-
val tooltipPresentation = factory.withTooltip("Click to change value", hoverPresentation)
104-
return factory.roundWithBackground(tooltipPresentation)
112+
return factory.roundWithBackground(
113+
factory.withTooltip(
114+
"Click to change value",
115+
factory.referenceOnHover(
116+
factory.smallText(trimmed)) { event, _ ->
117+
onClick.invoke(event)
118+
}
119+
)
120+
)
105121
}
106122

107123
private fun onValidValue(setter: (value: String, wrapAt: Int) -> Unit, project: Project?)
@@ -117,8 +133,8 @@ object Base64Presentations {
117133

118134
}
119135

120-
class BinaryPresentationsFactory(element: PsiElement, sink: InlayHintsSink, editor: Editor)
121-
: InlayPresentationsFactory(element, sink, editor) {
136+
class BinaryPresentationsFactory(element: PsiElement, sink: InlayHintsSink, editor: Editor, factory: PresentationFactory)
137+
: InlayPresentationsFactory(element, sink, editor, factory) {
122138

123139
override fun create(adapter: Base64ValueAdapter): InlayPresentation? {
124140
val decoded = adapter.getDecodedBytes() ?: return null

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/base64/Base64ValueAdapter.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
******************************************************************************/
1111
package com.redhat.devtools.intellij.kubernetes.editor.inlay.base64
1212

13+
import com.intellij.json.psi.JsonProperty
1314
import com.intellij.psi.PsiElement
1415
import com.redhat.devtools.intellij.kubernetes.editor.util.decodeBase64
1516
import com.redhat.devtools.intellij.kubernetes.editor.util.decodeBase64ToBytes
1617
import com.redhat.devtools.intellij.kubernetes.editor.util.encodeBase64
1718
import com.redhat.devtools.intellij.kubernetes.editor.util.getValue
1819
import com.redhat.devtools.intellij.kubernetes.editor.util.setValue
20+
import org.jetbrains.yaml.psi.YAMLKeyValue
1921

2022
class Base64ValueAdapter(private val element: PsiElement) {
2123

@@ -80,6 +82,10 @@ class Base64ValueAdapter(private val element: PsiElement) {
8082
}
8183

8284
fun getStartOffset(): Int? {
83-
return com.redhat.devtools.intellij.kubernetes.editor.util.getStartOffset(element)
85+
return when(element) {
86+
is YAMLKeyValue -> element.value?.textRange?.startOffset
87+
is JsonProperty -> element.value?.textRange?.startOffset
88+
else -> null
89+
}
8490
}
8591
}

0 commit comments

Comments
 (0)