Skip to content

Commit c7d410a

Browse files
authored
Merge pull request #937 from bohdan-harniuk/276-ui-component-registration-highlighting
276: Added uiComponent registration syntax highlighting as JSON
2 parents 3e44c6e + 8b8116c commit c7d410a

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

resources/META-INF/plugin.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,8 @@
564564

565565
<testSourcesFilter implementation="com.magento.idea.magento2plugin.lang.roots.MagentoTestSourceFilter"/>
566566
<searchScopesProvider implementation="com.magento.idea.magento2plugin.lang.psi.search.MagentoSearchScopesProvider"/>
567+
568+
<multiHostInjector implementation="com.magento.idea.magento2plugin.lang.injection.UiComponentSyntaxInjector"/>
567569
</extensions>
568570

569571
<extensions defaultExtensionNs="com.jetbrains.php">
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.lang.injection;
7+
8+
import com.intellij.json.JsonLanguage;
9+
import com.intellij.lang.injection.MultiHostInjector;
10+
import com.intellij.lang.injection.MultiHostRegistrar;
11+
import com.intellij.openapi.util.TextRange;
12+
import com.intellij.psi.PsiElement;
13+
import com.intellij.psi.PsiLanguageInjectionHost;
14+
import com.intellij.psi.html.HtmlTag;
15+
import com.intellij.psi.templateLanguages.OuterLanguageElement;
16+
import com.intellij.psi.xml.XmlText;
17+
import java.util.List;
18+
import org.jetbrains.annotations.NotNull;
19+
20+
public class UiComponentSyntaxInjector implements MultiHostInjector {
21+
22+
@SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops")
23+
@Override
24+
public void getLanguagesToInject(
25+
final @NotNull MultiHostRegistrar registrar,
26+
final @NotNull PsiElement host
27+
) {
28+
if (!isUiComponentTag(host)) {
29+
return;
30+
}
31+
PsiElement targetXmlText = null;
32+
33+
for (final PsiElement element : host.getChildren()) {
34+
if (element instanceof XmlText) {
35+
targetXmlText = element;
36+
break;
37+
}
38+
}
39+
40+
if (targetXmlText == null) {
41+
return;
42+
}
43+
registrar.startInjecting(JsonLanguage.INSTANCE);
44+
int startPosition = 0;
45+
46+
for (final PsiElement element : targetXmlText.getChildren()) {
47+
if (!(element instanceof OuterLanguageElement)) {
48+
final int endPosition = Math.min(
49+
startPosition + element.getTextLength(),
50+
targetXmlText.getTextLength()
51+
);
52+
53+
if (startPosition > element.getStartOffsetInParent()) {
54+
startPosition = element.getStartOffsetInParent();
55+
}
56+
registrar.addPlace(
57+
null,
58+
null,
59+
(PsiLanguageInjectionHost) targetXmlText,
60+
new TextRange(startPosition, endPosition)
61+
);
62+
}
63+
startPosition += element.getTextLength();
64+
}
65+
registrar.doneInjecting();
66+
}
67+
68+
@Override
69+
public @NotNull List<? extends Class<? extends PsiElement>> elementsToInjectIn() {
70+
return List.of(HtmlTag.class);
71+
}
72+
73+
private boolean isUiComponentTag(final @NotNull PsiElement host) {
74+
if (!(host instanceof HtmlTag)) {
75+
return false;
76+
}
77+
final HtmlTag tag = (HtmlTag) host;
78+
final String typeAttributeValue = tag.getAttributeValue("type");
79+
80+
return typeAttributeValue != null && typeAttributeValue.equals("text/x-magento-init");
81+
}
82+
}

0 commit comments

Comments
 (0)