1+ package com.github.tempest.framework
2+
3+ import com.intellij.openapi.vfs.findPsiFile
4+ import com.intellij.patterns.PlatformPatterns
5+ import com.intellij.psi.PsiElement
6+ import com.intellij.psi.PsiReference
7+ import com.intellij.psi.PsiReferenceBase
8+ import com.intellij.psi.PsiReferenceContributor
9+ import com.intellij.psi.PsiReferenceProvider
10+ import com.intellij.psi.PsiReferenceRegistrar
11+ import com.intellij.psi.html.HtmlTag
12+ import com.intellij.psi.search.FilenameIndex
13+ import com.intellij.psi.search.GlobalSearchScope
14+ import com.intellij.psi.xml.XmlChildRole
15+ import com.intellij.util.ProcessingContext
16+
17+ private const val TEMPLATE_PREFIX = " .view.php"
18+
19+ class ComponentReferenceContributor : PsiReferenceContributor () {
20+ override fun registerReferenceProviders (registrar : PsiReferenceRegistrar ) {
21+ registrar.registerReferenceProvider(
22+ PlatformPatterns .psiElement(HtmlTag ::class .java),
23+ object : PsiReferenceProvider () {
24+ override fun getReferencesByElement (
25+ element : PsiElement ,
26+ context : ProcessingContext
27+ ): Array <out PsiReference > {
28+ if (element !is HtmlTag ) return emptyArray()
29+ if (! element.name.startsWith(" x-" )) return emptyArray()
30+
31+ val nameElement = XmlChildRole .START_TAG_NAME_FINDER .findChild(element.node) ? : return emptyArray()
32+
33+ val project = element.project
34+
35+ val result = mutableListOf<PsiReference >()
36+
37+ FilenameIndex .processFilesByName(
38+ element.name + TEMPLATE_PREFIX ,
39+ true ,
40+ GlobalSearchScope .projectScope(project),
41+ {
42+ val psiFile = it.findPsiFile(project) ? : return @processFilesByName true
43+ result.add(
44+ object : PsiReferenceBase <PsiElement >(element, nameElement.textRange, false ) {
45+ override fun resolve () = psiFile
46+ }
47+ )
48+
49+ true
50+ })
51+
52+ return result.toTypedArray()
53+ }
54+ }
55+ )
56+ }
57+ }
0 commit comments