@@ -9,37 +9,47 @@ import com.intellij.psi.PsiElement
99import com.intellij.psi.PsiLanguageInjectionHost
1010import com.intellij.psi.html.HtmlTag
1111import 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
1214import com.intellij.psi.util.PsiTreeUtil
1315import com.intellij.psi.xml.XmlAttribute
14- import com.intellij.psi.xml.XmlAttributeValue
15- import com.intellij.psi.xml.XmlText
1616import com.intellij.psi.xml.XmlToken
1717import com.jetbrains.php.lang.PhpLanguage
1818import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment
1919
2020class 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