Skip to content

Commit f2e28a5

Browse files
committed
Fixed LinemarkerFixtureTestCase.java
1 parent 417f554 commit f2e28a5

File tree

4 files changed

+124
-38
lines changed

4 files changed

+124
-38
lines changed

src/main/java/com/magento/idea/magento2plugin/indexes/FixtureIndex.java

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@
66
package com.magento.idea.magento2plugin.indexes;
77

88
import com.intellij.openapi.project.Project;
9+
import com.intellij.openapi.project.ProjectUtil;
10+
import com.intellij.openapi.vfs.VirtualFile;
11+
import com.intellij.psi.PsiFile;
912
import com.intellij.psi.PsiFileSystemItem;
13+
import com.intellij.psi.PsiManager;
1014
import com.intellij.psi.search.FilenameIndex;
1115
import com.intellij.psi.search.GlobalSearchScope;
12-
import com.jetbrains.php.lang.psi.PhpFile;
1316
import com.magento.idea.magento2plugin.magento.files.TestFixture;
1417
import com.magento.idea.magento2plugin.magento.packages.File;
1518
import java.util.ArrayList;
19+
import java.util.LinkedHashSet;
1620
import java.util.List;
21+
import java.util.Set;
1722
import org.jetbrains.annotations.NotNull;
1823

1924
public final class FixtureIndex {
@@ -26,12 +31,25 @@ public FixtureIndex(final Project project) {
2631
/**
2732
* Getter for data fixtures.
2833
*/
29-
public List<PhpFile> getDataFixtures(final String fixtureIdentifier) {
30-
final List<PhpFile> result = new ArrayList<>();
31-
32-
final String[] fixturePathParts = fixtureIdentifier.split(File.separator);
34+
public List<PsiFile> getDataFixtures(final String fixtureIdentifier) {
35+
final List<PsiFile> result = new ArrayList<>();
36+
final String normalizedFixtureIdentifier = fixtureIdentifier
37+
.trim()
38+
.replace('\\', '/')
39+
.replaceFirst("^/+", "");
40+
if (normalizedFixtureIdentifier.isEmpty()) {
41+
return result;
42+
}
43+
final String[] fixturePathParts = normalizedFixtureIdentifier.split(File.separator);
3344
final String fixtureName = fixturePathParts[fixturePathParts.length - 1];
34-
final String exactFilePath = TestFixture.FIXTURES_LOCATION.concat(fixtureIdentifier);
45+
final List<String> expectedFilePaths = List.of(
46+
TestFixture.FIXTURES_LOCATION.concat(normalizedFixtureIdentifier),
47+
TestFixture.FIXTURES_LOCATION_API.concat(normalizedFixtureIdentifier)
48+
);
49+
result.addAll(getFixturesByProjectPath(expectedFilePaths));
50+
if (!result.isEmpty()) {
51+
return result;
52+
}
3553

3654
@NotNull final PsiFileSystemItem[] psiFiles = FilenameIndex.getFilesByName(
3755
project,
@@ -41,16 +59,40 @@ public List<PhpFile> getDataFixtures(final String fixtureIdentifier) {
4159
);
4260

4361
for (final PsiFileSystemItem psiFile: psiFiles) {
44-
if (!(psiFile instanceof PhpFile)) {
62+
if (!(psiFile instanceof PsiFile)) {
4563
continue;
4664
}
47-
@NotNull final String filePath = psiFile.getVirtualFile().getPath();
65+
@NotNull final String filePath = psiFile.getVirtualFile().getPath().replace('\\', '/');
4866
if (!filePath.contains(TestFixture.FIXTURES_EXCLUDE_PATH)
49-
&& filePath.contains(exactFilePath)) {
50-
result.add((PhpFile) psiFile);
67+
&& expectedFilePaths.stream().anyMatch(filePath::endsWith)) {
68+
result.add((PsiFile) psiFile);
5169
}
5270
}
5371

5472
return result;
5573
}
74+
75+
private @NotNull List<PsiFile> getFixturesByProjectPath(
76+
final @NotNull List<String> expectedFilePaths
77+
) {
78+
final Set<PsiFile> result = new LinkedHashSet<>();
79+
final VirtualFile projectDir = ProjectUtil.guessProjectDir(project);
80+
if (projectDir == null) {
81+
return new ArrayList<>(result);
82+
}
83+
84+
final PsiManager psiManager = PsiManager.getInstance(project);
85+
for (final String expectedFilePath : expectedFilePaths) {
86+
final VirtualFile virtualFile = projectDir.findFileByRelativePath(expectedFilePath);
87+
if (virtualFile == null) {
88+
continue;
89+
}
90+
final PsiFile psiFile = psiManager.findFile(virtualFile);
91+
if (psiFile != null) {
92+
result.add(psiFile);
93+
}
94+
}
95+
96+
return new ArrayList<>(result);
97+
}
5698
}

src/main/java/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLineMarkerProvider.java

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
import com.intellij.codeInsight.daemon.LineMarkerProvider;
1010
import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
1111
import com.intellij.psi.PsiElement;
12+
import com.intellij.psi.PsiFile;
1213
import com.intellij.psi.util.PsiTreeUtil;
1314
import com.jetbrains.php.PhpIcons;
15+
import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment;
1416
import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag;
15-
import com.jetbrains.php.lang.psi.PhpFile;
17+
import com.jetbrains.php.lang.psi.elements.Method;
1618
import com.magento.idea.magento2plugin.indexes.FixtureIndex;
1719
import com.magento.idea.magento2plugin.magento.files.TestFixture;
1820
import com.magento.idea.magento2plugin.project.Settings;
@@ -39,35 +41,62 @@ public void collectSlowLineMarkers(
3941
return;
4042
}
4143
final FixtureIndex fixtureIndex = new FixtureIndex(elements.get(0).getProject());
42-
final List<PhpFile> results = new ArrayList();
4344
for (final PsiElement psiElement: elements) {
44-
if (psiElement instanceof PhpDocTag) {
45-
@NotNull final String tagName = ((PhpDocTag) psiElement).getName();
46-
if (!tagName.equals(TestFixture.PHP_DOC_TAG_NAME)
47-
&& !tagName.equals(TestFixture.PHP_DOC_TAG_NAME_API)) {
48-
continue;
49-
}
50-
@NotNull final String tagValue = ((PhpDocTag) psiElement).getTagValue();
51-
if (tagValue.isEmpty()) {
52-
continue;
53-
}
54-
55-
final List<PhpFile> dataFixtures = fixtureIndex.getDataFixtures(tagValue);
56-
57-
if (dataFixtures.isEmpty()) {
58-
continue;
59-
}
45+
if (!(psiElement instanceof Method)) {
46+
continue;
47+
}
48+
final PhpDocComment phpDocComment = ((Method) psiElement).getDocComment();
49+
if (phpDocComment == null) {
50+
continue;
51+
}
52+
final List<PsiFile> dataFixtures = collectDataFixtures(phpDocComment, fixtureIndex);
53+
if (dataFixtures.isEmpty()) {
54+
continue;
55+
}
6056

61-
results.addAll(dataFixtures);
57+
final String tooltipText = "Navigate to fixtures";
58+
final NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder
59+
.create(PhpIcons.PHP_FILE)
60+
.setTargets(dataFixtures)
61+
.setTooltipText(tooltipText);
6262

63-
final String tooltipText = "Navigate to fixtures";
64-
final NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder
65-
.create(PhpIcons.PHP_FILE)
66-
.setTargets(results)
67-
.setTooltipText(tooltipText);
63+
result.add(builder.createLineMarkerInfo(PsiTreeUtil.getDeepestFirst(psiElement)));
64+
}
65+
}
6866

69-
result.add(builder.createLineMarkerInfo(PsiTreeUtil.getDeepestFirst(psiElement)));
67+
private @NotNull List<PsiFile> collectDataFixtures(
68+
final @NotNull PhpDocComment phpDocComment,
69+
final @NotNull FixtureIndex fixtureIndex
70+
) {
71+
final List<PsiFile> dataFixtures = new ArrayList<>();
72+
for (final PhpDocTag phpDocTag : PsiTreeUtil.getChildrenOfTypeAsList(
73+
phpDocComment,
74+
PhpDocTag.class
75+
)) {
76+
@NotNull final String tagName = normalizeTagName(phpDocTag);
77+
if (!isFixtureTagName(tagName)) {
78+
continue;
7079
}
80+
@NotNull final String tagValue = phpDocTag.getTagValue().trim();
81+
if (tagValue.isEmpty()) {
82+
continue;
83+
}
84+
dataFixtures.addAll(fixtureIndex.getDataFixtures(tagValue));
7185
}
86+
87+
return dataFixtures;
88+
}
89+
90+
private boolean isFixtureTagName(final @NotNull String tagName) {
91+
return tagName.equals(stripTagPrefix(TestFixture.PHP_DOC_TAG_NAME))
92+
|| tagName.equals(stripTagPrefix(TestFixture.PHP_DOC_TAG_NAME_API));
93+
}
94+
95+
private @NotNull String normalizeTagName(final @NotNull PhpDocTag phpDocTag) {
96+
return stripTagPrefix(phpDocTag.getName().trim());
97+
}
98+
99+
private @NotNull String stripTagPrefix(final @NotNull String tagName) {
100+
return tagName.startsWith("@") ? tagName.substring(1) : tagName;
72101
}
73102
}

src/main/java/com/magento/idea/magento2plugin/magento/files/TestFixture.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ public class TestFixture {
1212
public static final String PHP_DOC_TAG_NAME = "@magentoDataFixture";
1313
public static final String PHP_DOC_TAG_NAME_API = "@magentoApiDataFixture";
1414
public static final String FIXTURES_LOCATION = "dev/tests/integration/testsuite/";
15+
public static final String FIXTURES_LOCATION_API = "dev/tests/api-functional/testsuite/";
1516
public static final String FIXTURES_EXCLUDE_PATH = "vendor";
1617
}

src/test/java/com/magento/idea/magento2plugin/linemarker/LinemarkerFixtureTestCase.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ protected void assertHasLinemarkerWithTooltipAndIcon(final String tooltip, final
3232
myFixture.doHighlighting();
3333

3434
final List<LineMarkerInfo<?>> lineMarkers = getDocumentLineMarkers();
35-
assertNotEmpty(lineMarkers);
35+
assertFalse("No line markers found in document", lineMarkers.isEmpty());
3636
for (final LineMarkerInfo lineMarkerInfo: lineMarkers) {
3737
final String lineMarkerTooltip = lineMarkerInfo.getLineMarkerTooltip();
3838
final Icon lineMarkerIcon = lineMarkerInfo.getIcon();
@@ -50,8 +50,8 @@ protected void assertHasLinemarkerWithTooltipAndIcon(final String tooltip, final
5050
}
5151

5252
final String lineMarkerNotFound
53-
= "Failed that documents contains linemarker with the tooltip `%s`";
54-
fail(String.format(lineMarkerNotFound, tooltip));
53+
= "Failed that documents contains linemarker with the tooltip `%s`. Found: %s";
54+
fail(String.format(lineMarkerNotFound, tooltip, describeLineMarkers(lineMarkers)));
5555
}
5656

5757
protected void assertHasNoLinemarkerWithTooltipAndIcon(
@@ -83,4 +83,18 @@ private List<LineMarkerInfo<?>> getDocumentLineMarkers() {
8383
getProject()
8484
);
8585
}
86+
87+
private String describeLineMarkers(final @NotNull List<LineMarkerInfo<?>> lineMarkers) {
88+
final StringBuilder description = new StringBuilder();
89+
for (final LineMarkerInfo<?> lineMarkerInfo : lineMarkers) {
90+
if (!description.isEmpty()) {
91+
description.append("; ");
92+
}
93+
description.append("tooltip=")
94+
.append(lineMarkerInfo.getLineMarkerTooltip())
95+
.append(", icon=")
96+
.append(lineMarkerInfo.getIcon());
97+
}
98+
return description.toString();
99+
}
86100
}

0 commit comments

Comments
 (0)