Skip to content

Commit d9bd688

Browse files
committed
fix: search result for selector is template labels (#642)
1 parent 1bcfbe4 commit d9bd688

File tree

4 files changed

+34
-18
lines changed

4 files changed

+34
-18
lines changed

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/usage/LabelsFilter.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import com.redhat.devtools.intellij.kubernetes.editor.util.isStatefulSet
3838
/**
3939
* A filter that accepts labels, that are matching a given selector.
4040
*/
41-
class LabelsFilter(selector: PsiElement): PsiElementFilter {
41+
class LabelsFilter(selector: PsiElement): PsiElementFilter, MatchingElementMapping {
4242

4343
private val selectorResource: PsiElement? by lazy {
4444
selector.getResource()
@@ -129,6 +129,11 @@ class LabelsFilter(selector: PsiElement): PsiElementFilter {
129129
}
130130
}
131131

132+
override fun getMatchingElement(element: PsiElement): PsiElement? {
133+
val labeledType = element.getKubernetesTypeInfo() ?: return null
134+
return getLabels(labeledType, element, selectorResourceType)
135+
}
136+
132137
private fun getLabels(
133138
labeledType: KubernetesTypeInfo,
134139
labeledResource: PsiElement,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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.usage
12+
13+
import com.intellij.psi.PsiElement
14+
15+
interface MatchingElementMapping {
16+
fun getMatchingElement(element: PsiElement): PsiElement?
17+
}

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/usage/SelectorUsageSearcher.kt

+5-16
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ import com.intellij.usages.Usage
2020
import com.intellij.usages.UsageInfo2UsageAdapter
2121
import com.intellij.util.Processor
2222
import com.redhat.devtools.intellij.kubernetes.editor.util.PsiElements
23-
import com.redhat.devtools.intellij.kubernetes.editor.util.getLabels
2423
import com.redhat.devtools.intellij.kubernetes.editor.util.getResource
25-
import com.redhat.devtools.intellij.kubernetes.editor.util.getSelector
2624
import com.redhat.devtools.intellij.kubernetes.editor.util.isLabels
2725
import com.redhat.devtools.intellij.kubernetes.editor.util.isSelector
2826

@@ -53,9 +51,11 @@ class SelectorUsageSearcher : CustomUsageSearcher() {
5351
**/
5452
//val searchScope = options.searchScope
5553
//if (searchScope.contains(file.virtualFile)) {
56-
getAllMatching(searchParameter)
54+
val filter = getFilter(searchParameter) ?: return@run
55+
val mapping = filter as? MatchingElementMapping ?: return@run
56+
getAllMatching(searchParameter, filter)
5757
.forEach { matchingElement ->
58-
val searchResult = getMatchingAttribute(searchParameter, matchingElement)
58+
val searchResult = mapping.getMatchingElement(matchingElement)?.parent
5959
if (searchResult != null) {
6060
processor.process(
6161
UsageInfo2UsageAdapter(UsageInfo(searchResult))
@@ -65,10 +65,9 @@ class SelectorUsageSearcher : CustomUsageSearcher() {
6565
}
6666
}
6767

68-
private fun getAllMatching(searchParameter: PsiElement): Collection<PsiElement> {
68+
private fun getAllMatching(searchParameter: PsiElement, filter: PsiElementFilter): Collection<PsiElement> {
6969
val fileType = searchParameter.containingFile.fileType
7070
val project = searchParameter.project
71-
val filter = getFilter(searchParameter) ?: return emptyList()
7271
return PsiElements.getAllNoExclusions(fileType, project)
7372
.filter(filter::isAccepted)
7473
}
@@ -87,14 +86,4 @@ class SelectorUsageSearcher : CustomUsageSearcher() {
8786
}
8887
}
8988

90-
private fun getMatchingAttribute(searchParameter: PsiElement, matchingElement: PsiElement): PsiElement? {
91-
return when {
92-
searchParameter.isSelector() ->
93-
matchingElement.getLabels()?.parent // beginning of labels block/property
94-
searchParameter.isLabels() ->
95-
matchingElement.getSelector()?.parent // beginning of selector block/property
96-
else ->
97-
null
98-
}
99-
}
10089
}

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/usage/SelectorsFilter.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ import com.intellij.psi.PsiElement
1414
import com.intellij.psi.util.PsiElementFilter
1515
import com.redhat.devtools.intellij.common.validation.KubernetesTypeInfo
1616
import com.redhat.devtools.intellij.kubernetes.editor.util.getKubernetesTypeInfo
17+
import com.redhat.devtools.intellij.kubernetes.editor.util.getSelector
1718
import com.redhat.devtools.intellij.kubernetes.editor.util.hasLabels
1819
import com.redhat.devtools.intellij.kubernetes.editor.util.hasSelector
1920
import com.redhat.devtools.intellij.kubernetes.editor.util.hasTemplateLabels
2021

2122
/**
2223
* A filter that accepts selectors that are matching a given label
2324
*/
24-
class SelectorsFilter(private val labeledResource: PsiElement): PsiElementFilter {
25+
class SelectorsFilter(private val labeledResource: PsiElement): PsiElementFilter, MatchingElementMapping {
2526

2627
private val labeledResourceType: KubernetesTypeInfo? by lazy {
2728
labeledResource.getKubernetesTypeInfo()
@@ -32,6 +33,10 @@ class SelectorsFilter(private val labeledResource: PsiElement): PsiElementFilter
3233
|| labeledResource.hasTemplateLabels()
3334
}
3435

36+
override fun getMatchingElement(element: PsiElement): PsiElement? {
37+
return element.getSelector()
38+
}
39+
3540
override fun isAccepted(toAccept: PsiElement): Boolean {
3641
if (labeledResourceType == null
3742
|| !hasLabels

0 commit comments

Comments
 (0)