1
+ /* ******************************************************************************
2
+ * Copyright (c) 2025 Red Hat, Inc.
3
+ * Distributed under license by Red Hat, Inc. All rights reserved.
4
+ * This program is made available under the terms of the
5
+ * Eclipse Public License v2.0 which accompanies this distribution,
6
+ * and is available at http://www.eclipse.org/legal/epl-v20.html
7
+ *
8
+ * Contributors:
9
+ * Red Hat, Inc. - initial API and implementation
10
+ ******************************************************************************/
11
+ package com.redhat.devtools.intellij.kubernetes.editor.inlay.selector
12
+
13
+ import com.intellij.psi.PsiElement
14
+ import com.intellij.psi.util.PsiElementFilter
15
+ import com.redhat.devtools.intellij.common.validation.KubernetesTypeInfo
16
+ import com.redhat.devtools.intellij.kubernetes.editor.util.areMatchingMatchExpressions
17
+ import com.redhat.devtools.intellij.kubernetes.editor.util.areMatchingMatchLabels
18
+ import com.redhat.devtools.intellij.kubernetes.editor.util.getKubernetesTypeInfo
19
+ import com.redhat.devtools.intellij.kubernetes.editor.util.getLabels
20
+ import com.redhat.devtools.intellij.kubernetes.editor.util.getResource
21
+ import com.redhat.devtools.intellij.kubernetes.editor.util.getTemplate
22
+ import com.redhat.devtools.intellij.kubernetes.editor.util.hasMatchExpressions
23
+ import com.redhat.devtools.intellij.kubernetes.editor.util.hasMatchLabels
24
+ import com.redhat.devtools.intellij.kubernetes.editor.util.hasSelector
25
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isCronJob
26
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isDaemonSet
27
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isDeployment
28
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isJob
29
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isNetworkPolicy
30
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isPersistentVolume
31
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isPersistentVolumeClaim
32
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isPod
33
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isPodDisruptionBudget
34
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isReplicaSet
35
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isService
36
+ import com.redhat.devtools.intellij.kubernetes.editor.util.isStatefulSet
37
+
38
+ /* *
39
+ * A filter that accepts labels, that are matching a given selector.
40
+ */
41
+ class LabelsFilter (selector : PsiElement ): PsiElementFilter {
42
+
43
+ private val selectorResource: PsiElement ? by lazy {
44
+ selector.getResource()
45
+ }
46
+
47
+ private val selectorResourceType: KubernetesTypeInfo ? by lazy {
48
+ selectorResource?.getKubernetesTypeInfo()
49
+ }
50
+
51
+ private val hasSelector: Boolean by lazy {
52
+ selectorResource?.hasSelector() ? : false
53
+ }
54
+
55
+ private val hasMatchLabels: Boolean by lazy {
56
+ selectorResource?.hasMatchLabels() ? : false
57
+ }
58
+
59
+ private val hasMatchExpressions: Boolean by lazy {
60
+ selectorResource?.hasMatchExpressions() ? : false
61
+ }
62
+
63
+ override fun isAccepted (toAccept : PsiElement ): Boolean {
64
+ val selectorResource = selectorResource
65
+ if (selectorResource == null
66
+ || selectorResourceType == null
67
+ || ! hasSelector) {
68
+ return false
69
+ }
70
+
71
+ val labeledResourceType = toAccept.getKubernetesTypeInfo() ? : return false
72
+ if (! canSelect(labeledResourceType)) {
73
+ return false
74
+ }
75
+
76
+ val labels = getLabels(labeledResourceType, toAccept, selectorResourceType) ? : return false
77
+
78
+ return when {
79
+ hasMatchLabels && hasMatchExpressions ->
80
+ selectorResource.areMatchingMatchLabels(labels)
81
+ && selectorResource.areMatchingMatchExpressions(labels)
82
+
83
+ hasMatchLabels ->
84
+ selectorResource.areMatchingMatchLabels(labels)
85
+
86
+ hasMatchExpressions ->
87
+ selectorResource.areMatchingMatchExpressions(labels)
88
+
89
+ else -> false
90
+ }
91
+ }
92
+
93
+ private fun canSelect (type : KubernetesTypeInfo ): Boolean {
94
+ val selectorType = selectorResourceType ? : return false
95
+ return when {
96
+ selectorType.isDeployment() ->
97
+ type.isPod()
98
+ || type.isDeployment() // can select deployment template
99
+
100
+ selectorType.isCronJob() ->
101
+ type.isPod()
102
+ || type.isCronJob() // template
103
+
104
+ selectorType.isDaemonSet() ->
105
+ type.isPod()
106
+ || type.isDaemonSet() // template
107
+
108
+ selectorType.isJob() ->
109
+ type.isPod()
110
+ || type.isJob() // template
111
+
112
+ selectorType.isReplicaSet() ->
113
+ type.isPod()
114
+ || type.isReplicaSet() // template
115
+
116
+ selectorType.isStatefulSet() ->
117
+ type.isPod()
118
+ || type.isStatefulSet() // template
119
+
120
+ selectorType.isNetworkPolicy()
121
+ || selectorType.isPodDisruptionBudget()
122
+ || selectorType.isService() ->
123
+ type.isPod()
124
+
125
+ selectorType.isPersistentVolumeClaim() ->
126
+ type.isPersistentVolume()
127
+ || type.isPersistentVolumeClaim()
128
+
129
+ else ->
130
+ false
131
+ }
132
+ }
133
+
134
+ private fun getLabels (
135
+ labeledType : KubernetesTypeInfo ,
136
+ labeledResource : PsiElement ,
137
+ selectorResourceType : KubernetesTypeInfo ?
138
+ ): PsiElement ? {
139
+ return when {
140
+ selectorResourceType == null ->
141
+ null
142
+
143
+ (selectorResourceType.isCronJob()
144
+ && labeledType.isCronJob())
145
+ || (selectorResourceType.isDaemonSet()
146
+ && labeledType.isDaemonSet())
147
+ || (selectorResourceType.isDeployment()
148
+ && labeledType.isDeployment())
149
+ || (selectorResourceType.isJob()
150
+ && labeledType.isJob())
151
+ || (selectorResourceType.isReplicaSet()
152
+ && labeledType.isReplicaSet())
153
+ || (selectorResourceType.isStatefulSet()
154
+ && labeledType.isStatefulSet()) ->
155
+ labeledResource.getTemplate()
156
+
157
+ else ->
158
+ labeledResource.getLabels()
159
+ }
160
+ }
161
+ }
0 commit comments