1
+ @file:Suppress(" UnstableApiUsage" )
2
+
3
+ package com.redhat.devtools.intellij.kubernetes.editor.inlay
4
+
5
+ import com.intellij.codeInsight.hints.ChangeListener
6
+ import com.intellij.codeInsight.hints.FactoryInlayHintsCollector
7
+ import com.intellij.codeInsight.hints.ImmediateConfigurable
8
+ import com.intellij.codeInsight.hints.InlayHintsCollector
9
+ import com.intellij.codeInsight.hints.InlayHintsProvider
10
+ import com.intellij.codeInsight.hints.InlayHintsSink
11
+ import com.intellij.codeInsight.hints.NoSettings
12
+ import com.intellij.codeInsight.hints.SettingsKey
13
+ import com.intellij.codeInsight.hints.presentation.PresentationFactory
14
+ import com.intellij.json.psi.JsonProperty
15
+ import com.intellij.openapi.editor.Editor
16
+ import com.intellij.openapi.editor.impl.EditorImpl
17
+ import com.intellij.psi.PsiElement
18
+ import com.intellij.psi.PsiFile
19
+ import com.intellij.refactoring.suggested.endOffset
20
+ import com.intellij.refactoring.suggested.startOffset
21
+ import com.intellij.ui.dsl.builder.panel
22
+ import com.redhat.devtools.intellij.kubernetes.editor.util.decodeBase64
23
+ import com.redhat.devtools.intellij.kubernetes.editor.util.getContent
24
+ import com.redhat.devtools.intellij.kubernetes.editor.util.getData
25
+ import com.redhat.devtools.intellij.kubernetes.editor.util.getKubernetesResourceInfo
26
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isKubernetesResource
27
+ import org.jetbrains.yaml.psi.YAMLKeyValue
28
+ import javax.swing.JComponent
29
+
30
+ internal class Base64InlayHintsProvider : InlayHintsProvider <NoSettings > {
31
+
32
+ override val key: SettingsKey <NoSettings > = SettingsKey (" LSP.hints" )
33
+ override val name: String = " Kubernetes"
34
+ override val previewText: String = " Preview"
35
+
36
+ override fun createSettings (): NoSettings {
37
+ return NoSettings ()
38
+ }
39
+
40
+ override fun createConfigurable (settings : NoSettings ): ImmediateConfigurable {
41
+ return object : ImmediateConfigurable {
42
+ override fun createComponent (listener : ChangeListener ): JComponent = panel {}
43
+
44
+ override val mainCheckboxText: String = " Show hints for:"
45
+
46
+ override val cases: List <ImmediateConfigurable .Case > = emptyList()
47
+ }
48
+ }
49
+
50
+ override fun getCollectorFor (
51
+ file : PsiFile ,
52
+ editor : Editor ,
53
+ settings : NoSettings ,
54
+ sink : InlayHintsSink
55
+ ): InlayHintsCollector ? {
56
+ val project = editor.project ? : return null
57
+ val virtualFile = file.virtualFile ? : return null
58
+ val info = getKubernetesResourceInfo(virtualFile, project)
59
+ if (! isKubernetesResource(" Secret" , info)
60
+ && ! isKubernetesResource(" ConfigMap" , info)
61
+ ) {
62
+ return null
63
+ }
64
+ return Collector (editor)
65
+ }
66
+
67
+ private class Collector (editor : Editor ): FactoryInlayHintsCollector(editor) {
68
+ override fun collect (element : PsiElement , editor : Editor , sink : InlayHintsSink ): Boolean {
69
+ if (! element.isValid) {
70
+ return true
71
+ }
72
+ val content = getContent(element) ? : return true
73
+ val data = getData(content) ? : return true
74
+ data.children.toList()
75
+ .forEach { child ->
76
+ val value = when (child) {
77
+ is YAMLKeyValue ->
78
+ child.value?.text
79
+ is JsonProperty ->
80
+ child.value?.text
81
+ else -> null
82
+ }
83
+ val decoded = decodeBase64(value)
84
+ if (decoded != null ) {
85
+ val presentation = PresentationFactory (editor as EditorImpl ).smallText(decoded)
86
+ sink.addInlineElement(child.endOffset, true , presentation, false )
87
+ }
88
+ }
89
+
90
+ return true
91
+ }
92
+
93
+ }
94
+ }
0 commit comments