Skip to content

Commit cac2ed2

Browse files
committed
refactor: separate collecting declarations
1 parent 98af81d commit cac2ed2

File tree

1 file changed

+30
-28
lines changed

1 file changed

+30
-28
lines changed

src/main/kotlin/com/github/tempest/framework/views/injection/PHPLanguageInjector.kt

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,47 @@ import com.intellij.psi.PsiElement
99
import com.intellij.psi.PsiLanguageInjectionHost
1010
import com.intellij.psi.html.HtmlTag
1111
import com.intellij.psi.impl.source.html.HtmlRawTextImpl
12+
import com.intellij.psi.impl.source.xml.XmlAttributeValueImpl
13+
import com.intellij.psi.impl.source.xml.XmlTextImpl
1214
import com.intellij.psi.util.PsiTreeUtil
1315
import com.intellij.psi.xml.XmlAttribute
14-
import com.intellij.psi.xml.XmlAttributeValue
15-
import com.intellij.psi.xml.XmlText
1616
import com.intellij.psi.xml.XmlToken
1717
import com.jetbrains.php.lang.PhpLanguage
1818
import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment
1919

2020
class PHPLanguageInjector : MultiHostInjector {
21-
private val templateTags = mapOf(
22-
"{!!" to "!!}",
23-
"{{" to "}}",
21+
companion object {
22+
private val templateTags = mapOf(
23+
"{!!" to "!!}",
24+
"{{" to "}}",
25+
)
26+
}
27+
28+
override fun elementsToInjectIn() = listOf(
29+
XmlAttributeValueImpl::class.java,
30+
XmlTextImpl::class.java,
31+
HtmlTag::class.java,
2432
)
2533

2634
override fun getLanguagesToInject(registrar: MultiHostRegistrar, element: PsiElement) {
35+
val file = element.containingFile ?: return
36+
if (!file.name.endsWith(TempestFrameworkUtil.TEMPLATE_SUFFIX)) return
37+
2738
when (element) {
28-
is XmlAttributeValue -> injectIntoAttribute(element, registrar)
39+
is XmlAttributeValueImpl -> injectIntoAttribute(element, registrar)
40+
is XmlTextImpl -> injectIntoText(element, registrar)
2941
is HtmlTag -> injectIntoHtmlTag(element, registrar)
30-
is XmlText -> (element as? PsiLanguageInjectionHost)?.let { injectIntoText(it, registrar) }
3142
}
3243
}
3344

34-
private fun injectIntoAttribute(element: XmlAttributeValue, registrar: MultiHostRegistrar) {
45+
private fun injectIntoAttribute(element: XmlAttributeValueImpl, registrar: MultiHostRegistrar) {
3546
val attribute = element.parent as? XmlAttribute ?: return
3647
if (!attribute.name.startsWith(':')) return
3748

38-
val host = element as? PsiLanguageInjectionHost ?: return
39-
49+
val variableDeclarations = collectVariableDeclarations(element)
4050
registrar
4151
.startInjecting(PhpLanguage.INSTANCE)
42-
.addPlace(getVarDeclarationsPrefix(element), "?>", host, TextRange(0, host.textLength))
52+
.addPlace("$variableDeclarations<?=", "?>", element, element.textRange.shiftLeft(element.startOffset))
4353
.doneInjecting()
4454
}
4555

@@ -59,31 +69,23 @@ class PHPLanguageInjector : MultiHostInjector {
5969
val closeTag = tokens.find { it.text == templateTags[openTag.text] }?.psi ?: return
6070
val range = TextRange(openTag.textRangeInParent.endOffset, closeTag.startOffsetInParent)
6171

72+
val variableDeclarations = collectVariableDeclarations(element)
73+
6274
registrar
6375
.startInjecting(PhpLanguage.INSTANCE)
64-
.addPlace(getVarDeclarationsPrefix(element), "?>", element, range)
76+
.addPlace("$variableDeclarations<?=", "?>", element, range)
6577
.doneInjecting()
6678
}
6779

68-
override fun elementsToInjectIn() = listOf(
69-
XmlAttributeValue::class.java,
70-
XmlText::class.java,
71-
HtmlTag::class.java,
72-
)
73-
74-
private fun getVarDeclarationsPrefix(element: PsiElement): String {
75-
val file = element.containingFile ?: return DEFAULT_PREFIX
76-
if (!file.name.endsWith(TempestFrameworkUtil.TEMPLATE_SUFFIX)) return DEFAULT_PREFIX
80+
private fun collectVariableDeclarations(element: PsiElement): String? {
81+
val file = element.containingFile ?: return null
7782

7883
val searchFile = file.viewProvider.getPsi(PhpLanguage.INSTANCE) ?: file
79-
val varDeclarations = PsiTreeUtil.findChildrenOfType(searchFile, PhpDocComment::class.java)
84+
val variableDeclarations = PsiTreeUtil.findChildrenOfType(searchFile, PhpDocComment::class.java)
8085
.filter { "@var" in it.text }
81-
.joinToString(" ") { it.text }
86+
.joinToString("\n") { it.text }
87+
.ifEmpty { return null }
8288

83-
return if (varDeclarations.isEmpty()) DEFAULT_PREFIX else "<?php $varDeclarations ?>$DEFAULT_PREFIX"
84-
}
85-
86-
companion object {
87-
private const val DEFAULT_PREFIX = "<?="
89+
return "<?php $variableDeclarations ?>"
8890
}
8991
}

0 commit comments

Comments
 (0)