Skip to content

Commit db7ef2d

Browse files
author
Vitaliy
authored
Merge pull request #1045 from bohdan-harniuk/614-references-for-file-path-js-string-literals
614: Provided file path references for JS:STRING_LITERAL psi elements in the js files
2 parents bb25894 + 229afbb commit db7ef2d

File tree

5 files changed

+121
-16
lines changed

5 files changed

+121
-16
lines changed

src/com/magento/idea/magento2plugin/reference/js/JsReferenceContributor.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,53 @@
1-
/**
1+
/*
22
* Copyright © Magento, Inc. All rights reserved.
33
* See COPYING.txt for license details.
44
*/
5+
56
package com.magento.idea.magento2plugin.reference.js;
67

8+
import static com.intellij.patterns.StandardPatterns.string;
9+
import static com.magento.idea.magento2plugin.util.RegExUtil.JsRegex;
10+
11+
import com.intellij.lang.javascript.JSTokenTypes;
12+
import com.intellij.lang.javascript.JavascriptLanguage;
713
import com.intellij.lang.javascript.patterns.JSPatterns;
8-
import com.intellij.psi.*;
14+
import com.intellij.patterns.PlatformPatterns;
15+
import com.intellij.psi.PsiReferenceContributor;
16+
import com.intellij.psi.PsiReferenceRegistrar;
917
import com.magento.idea.magento2plugin.reference.provider.FilePathReferenceProvider;
1018
import com.magento.idea.magento2plugin.reference.provider.ModuleNameReferenceProvider;
1119
import com.magento.idea.magento2plugin.reference.provider.RequireJsPreferenceReferenceProvider;
1220
import com.magento.idea.magento2plugin.util.RegExUtil;
1321
import org.jetbrains.annotations.NotNull;
1422

15-
import static com.intellij.patterns.StandardPatterns.string;
16-
1723
public class JsReferenceContributor extends PsiReferenceContributor {
24+
1825
@Override
19-
public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) {
26+
public void registerReferenceProviders(final @NotNull PsiReferenceRegistrar registrar) {
2027
registrar.registerReferenceProvider(
2128
JSPatterns.jsLiteralExpression()
2229
.withText(string().matches(".*" + RegExUtil.Magento.MODULE_NAME + ".*")),
2330
new ModuleNameReferenceProvider()
2431
);
2532

33+
// Targets property value -> {test: 'Sandbox_Test/js/test'}
2634
registrar.registerReferenceProvider(
27-
JSPatterns.jsLiteralExpression().withText(string().matches(".*\\W" + RegExUtil.FILE_PATH + ".*")),
35+
JSPatterns.jsLiteralExpression()
36+
.withText(string().matches(JsRegex.FILE_PATH)),
37+
new FilePathReferenceProvider()
38+
);
39+
40+
// Targets property key (JS:STRING_LITERAL) -> {'Sandbox_Test/js/test': true}
41+
registrar.registerReferenceProvider(
42+
PlatformPatterns.psiElement(JSTokenTypes.STRING_LITERAL)
43+
.withText(string().matches(JsRegex.FILE_PATH))
44+
.withLanguage(JavascriptLanguage.INSTANCE),
2845
new FilePathReferenceProvider()
2946
);
3047

3148
registrar.registerReferenceProvider(
32-
JSPatterns.jsLiteralExpression().withText(string().matches(".*\\W" + RegExUtil.FILE_PATH + ".*")),
49+
JSPatterns.jsLiteralExpression()
50+
.withText(string().matches(".*\\W" + RegExUtil.FILE_PATH + ".*")),
3351
new RequireJsPreferenceReferenceProvider()
3452
);
3553
}

src/com/magento/idea/magento2plugin/util/RegExUtil.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,13 @@ public static class XmlRegex {
103103
"\\\\?" + PhpRegex.FQN + "(" + CLASS_MEMBER_NAME + ")?.*";
104104
}
105105

106+
public static class JsRegex {
107+
108+
// Targets paths like `'Sandbox_Test/js/test'`
109+
public static final String FILE_PATH
110+
= "(\\W{1}[A-Z][a-zA-Z0-9]+_[A-Z][a-zA-Z0-9]+[\\/\\w*-]{1,}\\W{1})";
111+
}
112+
106113
public static class CustomTheme {
107114
public static final String MODULE_NAME =
108115
"app\\/design\\/(adminhtml|frontend)\\/\\w*\\/\\w*\\/\\w*";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
var config = {
2+
config: {
3+
mixins: {
4+
'Magento_Checkout/js/view/shipping': {
5+
'Foo_Bar/js/file<caret>': true
6+
}
7+
}
8+
}
9+
}

tests/com/magento/idea/magento2plugin/reference/BaseReferenceTestCase.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,24 @@
99
import com.intellij.psi.PsiElement;
1010
import com.intellij.psi.PsiFile;
1111
import com.intellij.psi.PsiReference;
12+
import com.intellij.psi.PsiReferenceProvider;
1213
import com.intellij.psi.ResolveResult;
1314
import com.intellij.psi.impl.file.PsiDirectoryImpl;
1415
import com.intellij.psi.xml.XmlAttributeValue;
1516
import com.intellij.psi.xml.XmlFile;
1617
import com.intellij.psi.xml.XmlTag;
18+
import com.intellij.util.ProcessingContext;
1719
import com.jetbrains.php.lang.psi.elements.Method;
1820
import com.jetbrains.php.lang.psi.elements.Parameter;
1921
import com.jetbrains.php.lang.psi.elements.ParameterList;
2022
import com.jetbrains.php.lang.psi.elements.PhpClass;
2123
import com.magento.idea.magento2plugin.inspections.BaseInspectionsTestCase;
2224
import com.magento.idea.magento2plugin.magento.packages.File;
2325
import com.magento.idea.magento2plugin.reference.xml.PolyVariantReferenceBase;
26+
import java.lang.reflect.InvocationTargetException;
27+
import java.util.ArrayList;
28+
import java.util.Arrays;
29+
import java.util.List;
2430
import org.jetbrains.annotations.Nullable;
2531

2632
@SuppressWarnings({
@@ -36,6 +42,7 @@ protected void setUp() throws Exception {
3642
myFixture.setTestDataPath(testDataFolderPath);
3743
}
3844

45+
@SuppressWarnings("PMD.CognitiveComplexity")
3946
protected void assertHasReferenceToXmlAttributeValue(final String reference) {
4047
final PsiElement element = getElementFromCaret();
4148
for (final PsiReference psiReference: element.getReferences()) {
@@ -70,6 +77,7 @@ protected void assertHasReferenceToXmlAttributeValue(final String reference) {
7077
fail(String.format(referenceNotFound, reference));
7178
}
7279

80+
@SuppressWarnings("PMD.CognitiveComplexity")
7381
protected void assertHasReferenceToXmlTag(final String tagName) {
7482
final PsiElement element = getElementFromCaret();
7583
for (final PsiReference psiReference: element.getReferences()) {
@@ -106,7 +114,40 @@ protected void assertHasReferenceToXmlTag(final String tagName) {
106114

107115
protected void assertHasReferenceToFile(final String reference) {
108116
final PsiElement element = getElementFromCaret();
109-
for (final PsiReference psiReference : element.getReferences()) {
117+
118+
assertHasReferenceToFile(reference, Arrays.asList(element.getReferences()));
119+
}
120+
121+
protected void assertHasReferenceToFile(
122+
final String reference,
123+
final Class<? extends PsiReferenceProvider> providerClass
124+
) {
125+
final PsiElement element = getLeafElementFromCaret();
126+
final List<PsiReference> references = new ArrayList<>();
127+
128+
try {
129+
final PsiReferenceProvider provider = providerClass.getConstructor().newInstance();
130+
references.addAll(
131+
Arrays.asList(
132+
provider.getReferencesByElement(element, new ProcessingContext())
133+
)
134+
);
135+
} catch (NoSuchMethodException
136+
| IllegalAccessException
137+
| InvocationTargetException
138+
| InstantiationException exception
139+
) {
140+
references.addAll(Arrays.asList(element.getReferences()));
141+
}
142+
143+
assertHasReferenceToFile(reference, references);
144+
}
145+
146+
protected void assertHasReferenceToFile(
147+
final String reference,
148+
final List<PsiReference> references
149+
) {
150+
for (final PsiReference psiReference : references) {
110151
final PsiElement resolved = psiReference.resolve();
111152
if (!(resolved instanceof PsiFile)) {
112153
continue;
@@ -250,4 +291,8 @@ protected void assertEmptyReference() {
250291
private PsiElement getElementFromCaret() {
251292
return myFixture.getFile().findElementAt(myFixture.getCaretOffset()).getParent();
252293
}
294+
295+
private PsiElement getLeafElementFromCaret() {
296+
return myFixture.getFile().findElementAt(myFixture.getCaretOffset());
297+
}
253298
}

tests/com/magento/idea/magento2plugin/reference/js/RequireJsReferenceRegistrarTest.java

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,61 @@
22
* Copyright © Magento, Inc. All rights reserved.
33
* See COPYING.txt for license details.
44
*/
5+
56
package com.magento.idea.magento2plugin.reference.js;
67

8+
import com.magento.idea.magento2plugin.reference.provider.FilePathReferenceProvider;
9+
710
public class RequireJsReferenceRegistrarTest extends ReferenceJsFixtureTestCase {
811

12+
private static final String FIXTURE_PATH = "test.js";
13+
private static final String MIXIN_FIXTURE_PATH = "requirejs-config.js";
14+
15+
/**
16+
* Mapped parameters should have reference to file.
17+
*/
918
public void testMappedInjectionParameterMustHaveReference() {
10-
String filePath = this.getFixturePath("test.js");
11-
myFixture.configureByFile(filePath);
19+
myFixture.configureByFile(getFixturePath(FIXTURE_PATH));
1220

1321
assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file.js");
1422
}
1523

24+
/**
25+
* Path parameters should have reference to file.
26+
*/
1627
public void testPathInjectionParameterMustHaveReference() {
17-
String filePath = this.getFixturePath("test.js");
18-
myFixture.configureByFile(filePath);
28+
myFixture.configureByFile(getFixturePath(FIXTURE_PATH));
1929

2030
assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file2.js");
2131
}
2232

33+
/**
34+
* The Magento resource file path parameters should have reference to file.
35+
*/
2336
public void testFileInjectionParameterMustHaveReference() {
24-
String filePath = this.getFixturePath("test.js");
25-
myFixture.configureByFile(filePath);
37+
myFixture.configureByFile(getFixturePath(FIXTURE_PATH));
2638

2739
assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file.js");
2840
}
2941

42+
/**
43+
* Lib resource parameters should have reference to file.
44+
*/
3045
public void testLibInjectionParameterMustHaveReference() {
31-
String filePath = this.getFixturePath("test.js");
32-
myFixture.configureByFile(filePath);
46+
myFixture.configureByFile(getFixturePath(FIXTURE_PATH));
3347

3448
assertHasReferenceToFile("/lib/web/testjs.js");
3549
}
50+
51+
/**
52+
* Mixin declaration parameters should have reference to file.
53+
*/
54+
public void testFilePathInMixinDeclarationMustHaveReference() {
55+
myFixture.configureByFile(getFixturePath(MIXIN_FIXTURE_PATH));
56+
57+
assertHasReferenceToFile(
58+
"app/code/Foo/Bar/view/frontend/web/js/file.js",
59+
FilePathReferenceProvider.class
60+
);
61+
}
3662
}

0 commit comments

Comments
 (0)