Skip to content

Commit 8b6b043

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

File tree

4 files changed

+35
-20
lines changed

4 files changed

+35
-20
lines changed

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
package com.redhat.devtools.intellij.kubernetes.usage
1212

1313
import com.intellij.psi.PsiElement
14-
import com.intellij.psi.util.PsiElementFilter
1514
import com.redhat.devtools.intellij.common.validation.KubernetesTypeInfo
1615
import com.redhat.devtools.intellij.kubernetes.editor.util.areMatchingMatchExpressions
1716
import com.redhat.devtools.intellij.kubernetes.editor.util.areMatchingMatchLabels
@@ -38,7 +37,7 @@ import com.redhat.devtools.intellij.kubernetes.editor.util.isStatefulSet
3837
/**
3938
* A filter that accepts labels, that are matching a given selector.
4039
*/
41-
class LabelsFilter(selector: PsiElement): PsiElementFilter {
40+
class LabelsFilter(selector: PsiElement): PsiElementMappingsFilter {
4241

4342
private val selectorResource: PsiElement? by lazy {
4443
selector.getResource()
@@ -129,6 +128,11 @@ class LabelsFilter(selector: PsiElement): PsiElementFilter {
129128
}
130129
}
131130

131+
override fun getMatchingElement(element: PsiElement): PsiElement? {
132+
val labeledType = element.getKubernetesTypeInfo() ?: return null
133+
return getLabels(labeledType, element, selectorResourceType)
134+
}
135+
132136
private fun getLabels(
133137
labeledType: KubernetesTypeInfo,
134138
labeledResource: PsiElement,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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+
import com.intellij.psi.util.PsiElementFilter
15+
16+
interface PsiElementMappingsFilter: PsiElementFilter {
17+
fun getMatchingElement(element: PsiElement): PsiElement?
18+
}

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

+5-17
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,10 @@ 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+
getAllMatching(searchParameter, filter)
5756
.forEach { matchingElement ->
58-
val searchResult = getMatchingAttribute(searchParameter, matchingElement)
57+
val searchResult = filter.getMatchingElement(matchingElement)?.parent
5958
if (searchResult != null) {
6059
processor.process(
6160
UsageInfo2UsageAdapter(UsageInfo(searchResult))
@@ -65,15 +64,14 @@ class SelectorUsageSearcher : CustomUsageSearcher() {
6564
}
6665
}
6766

68-
private fun getAllMatching(searchParameter: PsiElement): Collection<PsiElement> {
67+
private fun getAllMatching(searchParameter: PsiElement, filter: PsiElementFilter): Collection<PsiElement> {
6968
val fileType = searchParameter.containingFile.fileType
7069
val project = searchParameter.project
71-
val filter = getFilter(searchParameter) ?: return emptyList()
7270
return PsiElements.getAllNoExclusions(fileType, project)
7371
.filter(filter::isAccepted)
7472
}
7573

76-
private fun getFilter(searchParameter: PsiElement): PsiElementFilter? {
74+
private fun getFilter(searchParameter: PsiElement): PsiElementMappingsFilter? {
7775
val resource = searchParameter.getResource() ?: return null
7876
return when {
7977
searchParameter.isSelector() ->
@@ -87,14 +85,4 @@ class SelectorUsageSearcher : CustomUsageSearcher() {
8785
}
8886
}
8987

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-
}
10088
}

Diff for: 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): PsiElementMappingsFilter {
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)